Your portal,
any device

One account. Your strands, braids, and workspaces — always in sync, always yours.

.rcal is an open file format for encoding recurring real-world events. It is designed to be simple to publish, simple to parse, and expressive enough to describe how venues, people, and communities actually operate — including weekly rhythms, monthly patterns, seasonal windows, exceptions, and one-off events.

The format is maintained by EventStrand but is not owned by it. Anyone can read, write, parse, or build tools around .rcal files without permission, license, or fee.

The open platform for recurring real-world life

Your world,
when you need it

Your Friday night just opened up. Your gym has a class in 40 minutes. There's a jazz residency two blocks away. You already knew both — you just forgot to look. EventStrand remembers for you.

Open
Format standard
1 scan
To load a venue's world
Possibility types
Thursday Evening
6 possibilities
All
Mellow
Social
Restless
Spontaneous
Tonight 9pm
Friday Jazz Residency
The Rusty Nail • 0.4 mi
Mellow Music Free
Now open
Open Swim Hours
Logan Square YMCA • 1.1 mi
Restless Solo
Last Thursday
Open Mic Night
Hideout Chicago • 0.8 mi
Curious Social
The Idea

Your world has more worth showing up for
than any calendar can hold.

Subscribe to the venues, artists, and communities that matter to you. EventStrand builds you a living calendar — plan the month ahead, or open it when tonight suddenly opens up.

🧵

Build your strand library

Your gym's schedule. The jazz residency three blocks away. Your sister's birthday. The farmers market that only runs May through October. Strands from different venues, different organisers — all in one place, filtered to right now.

🌀

Your portal, your timeframe

It's Tuesday and you're mapping out the weekend. Or it's 7pm and plans just fell through. Open EventStrand — day, week, month, or year — filtered by vibe and distance. Everything your strands have for that window, right there.

📡

Scan the world

Scan a QR code on a bar door. That venue's strand — every recurring night, one-off show, and seasonal special they've added — loads into your portal permanently. They update it once. You always see what's current.

One platform, three roles

Whether you're looking for something to do tonight, a venue trying to reach your regulars, or a developer building on the open format.

1

Download the app

iOS, Android, or straight in the browser at eventstrand.com/app. No account required to start.

2

Add your first strands

Think about your recurring world — your gym, the weekly show at that bar, the monthly dinner. Type them in. Or scan a QR code on any venue that's already published their strand.

3

Load pre-built strands

Don't start from scratch. Install US holidays, your team's season schedule, the local farmers market — all pre-built and ready. Your world fills up fast.

4

Open your portal

Your plans fell through. You've got two hours. Open the app, say how you're feeling — mellow, restless, spontaneous — and see what your world is offering right now.

5

Act or save

Go — directions, tickets, whatever you need. Or pass and come back next week when it rolls around again. The strand never expires. Friday always comes.

eventstrand.com/app
Tonight
This Week
This Month
Mellow
Social
Restless
Friday Jazz Night
The Rusty Nail · Starts 9pm · Free
Outdoor Film Screening
Wicker Park · Starts 8:30pm · Free
1

Visit the strand builder

Sign into your EventStrand publisher portal. Create your first strand — give it a name, a theme, and a color. Takes under ten minutes. This becomes your permanent presence on EventStrand.

2

Add events to your strand

Recurring nights, one-off shows, date-list events with no fixed pattern. Mix and match — everything lives in the same strand. Your regulars see all of it in one place.

3

Get your QR code and embed

Your strand gets a permanent QR code, a hosted link, and a website embed widget — automatically. Print the QR, paste the embed. You're live.

4

Put it in the world

Front door QR loads everything. Table card QR loads just Friday nights. Flyer QR loads the one-off you're promoting. You control which strand each code points to.

5

Add strands as you grow

Start with one strand for everything. Split into Jazz Nights and Comedy Nights when the audiences diverge. Your publisher profile shows all of them — subscribers can install one or all.

eventstrand.com/dashboard
Your strand is ready
🍺
The Rusty Nail
3 events • Live strand
⬇ Download .rcal
⬛ QR Code
📋 Copy Link
✓ Strand hosted at eventstrand.com/s/rusty-nail
1

Read the spec

Fully documented, openly licensed, free to implement forever. eventstrand.com/spec. It's about 15 minutes of reading.

2

Parse it in whatever you write

It's JSON with a clear schema. Reference parsers exist for JS, Python, and Swift. If yours isn't on the list, open a PR — we'll ship it.

3

Add .rcal export to your platform

Run venue software, a booking system, a ticketing tool? Drop in .rcal export and your users can publish their schedule to any EventStrand reader — including ones we haven't built yet.

4

Use the API for live data

Pull strand data, validate files, search the public library, push updates. REST, documented, rate-limited-reasonably. The kind of API you won't hate using.

venue.rcal v0.1
// Minimal valid .rcal file
{
  "rcal": "0.1",
  "meta": {
    "title": "The Rusty Nail",
    "type": "venue",
    "timezone": "America/Chicago",
    "live": true
  },
  "events": [
    {
      "id": "friday-jazz",
      "name": "Friday Jazz Night",
      "location": "inherits meta.location",
      // Override per-strand if event is at a different address
      "vibe_tags": [
        "mellow", "social"
      ],
      "recurrence": [
        {
          "pattern": "weekly",
          "every": 1,
          "days": ["friday"],
          "time_start": "21:00"
        }
      ]
    }
  ]
}
The .rcal Format

Powered by an
open format

Every EventStrand strand is backed by a .rcal file — an open JSON format anyone can read, implement, or build on. No license, no fees. The platform is EventStrand. The format is yours.

📅

Every recurrence pattern

Daily, weekly, bi-weekly, monthly by date or weekday, annual, seasonal windows, custom intervals. Stack multiple rules per event — because your favorite bar's happy hour runs weekdays and has extended Saturday hours, and those are two different rules.

🔁

Always up to date

Live strands are hosted on EventStrand and update automatically. When a publisher edits their strand — adds a show, cancels a night, changes a time — every subscriber's portal reflects it immediately. No rescanning, no re-downloading.

🎭

Vibe tagging built in

Mellow. Restless. Curious. Celebratory. Every event carries an emotional fingerprint. When you open the portal in a specific headspace, the filter already knows what to show you.

Exceptions and modifications

Closed for Christmas. Moving locations in March. Cancelled last month but back next week. Real venues are messy — .rcal handles all of it without breaking the thread.

🌍

Works at any scale

A dive bar with three weekly nights. A city arts council with 200 events. A global strand for Ramadan, synchronized across timezones. Same format. Same fifteen fields.

Read Full Spec →
example.rcal Open Format
// Multi-rule recurrence example
{
  "rcal": "0.1",
  "meta": {
    "title": "The Rusty Nail",
    "type": "venue",
    "location": {
      "address": "1234 N Milwaukee Ave",
      "city": "Chicago",
      "state": "IL",
      "country": "US",
      "lat": 41.9214,
      "lng": -87.7078
    },
    "timezone": "America/Chicago",
    "live": true,
    "color": "#C0392B"
  },
  "events": [
    {
      "id": "happy-hour",
      "name": "Happy Hour",
      "vibe_tags": [
        "spontaneous", "social"
      ],
      "price": "free_entry",
      "lead_time_days": 0,
      "recurrence": [
        {
          // Weekday happy hour
          "pattern": "weekly",
          "days": ["weekday"],
          "time_start": "16:00",
          "time_end": "19:00"
        },
        {
          // Weekend extended hours
          "pattern": "weekly",
          "days": ["saturday"],
          "time_start": "14:00",
          "time_end": "18:00"
        }
      ],
      "exceptions": [
        {
          "type": "skip",
          "date": "2026-12-25",
          "note": "Closed Christmas"
        }
      ]
    },
    {
      "id": "open-mic",
      "name": "Open Mic Night",
      "vibe_tags": [
        "curious", "social"
      ],
      "recurrence": [
        {
          // Second Thursday + Last Saturday
          "pattern": "monthly_week",
          "month_week": "second",
          "days": ["thursday"],
          "time_start": "20:00"
        },
        {
          "pattern": "monthly_week",
          "month_week": "last",
          "days": ["saturday"],
          "time_start": "21:00"
        }
      ]
    }
  ]
}

Create your .rcal file

Build your strand — give it a name, add recurring nights, one-off shows, or manually-maintained date lists. Download the .rcal file or host it live on EventStrand.

① Publisher
② Details
③ Events
④ Export
🏢
A Venue
🎵
An Artist
🏘
A Community
📋
Personal
🛍
A Business
🎉
An Event
This can be a venue, an event, a person, a tradition — anything.
Used as accent in the app
0 events
🧵
No events yet.
Hit + Add Event to start building your strand.
Fill in publisher details and add events to generate your strand.
strand.rcal
v0.1
// Your .rcal file will appear here
Visibility
Host this strand live
Create a free account to get a permanent URL. Edit anytime — all subscribers auto-update.
Step 1 of 4
Live Preview
Your Strand
VENUE
Add events to preview
Step 3 → Events
+ Add to EventStrand
Strand Library

Ready-made strands
to install in seconds

Holidays, sports seasons, cultural calendars, local rhythms. Pre-built and ready to install — your world fills up before you've scanned a single QR code.

🎄
US Holidays 2026
All federal holidays plus popular cultural dates. Includes lead-time suggestions for gift shopping and travel planning.
🌈
Pride Month 2026
June events, parades, and celebrations. Connect your location to see local events auto-added to your portal.
🏈
NFL Season 2026
All game days, playoff schedule, Super Bowl window. Watch party possibilities auto-surfaced on game days.
🌱
Farmers Market Season
Weekly Saturday markets, seasonal produce windows, and local vendor schedules. Covers spring through fall.
🌙
Ramadan 2026
Iftar times, Eid celebrations, and community events. Includes local mosque schedules if you connect your location.
🏠
Home Maintenance
Seasonal tasks, filter changes, service intervals. A ready-made household upkeep strand you can customize to your home.
Browse All Strands →

The .rcal format belongs to everyone

EventStrand is the platform. .rcal is the open format it runs on. We publish the spec and maintain the reference implementation — but the format belongs to everyone. Build parsers, integrations, your own readers. No permission needed.

Verified Venues

Venue Directory

Discover verified event spaces with a strand — browsable, filterable, always current.

Loading venues…
For Venues & Creators

Posting your strand to your site

Once you've published a strand, post the QR code or link on your website so people can find it. Pick your platform below for step-by-step instructions.

Developer Docs

Build on the .rcal standard

EventStrand's strands are .rcal files. The spec is open, the parsers are free. Build integrations, exporters, or your own EventStrand-compatible tools.

📄 .rcal Specification

Everything the format can do, written down. Fields, recurrence patterns, exception types, versioning. If it's in a .rcal file, it's in here.

🔧 Reference Parsers

Reference implementations you can drop in and ship. Covered languages are tested against the spec. Uncovered languages are an open invitation.

🌐 REST API

Fetch strands, validate files, search the library, manage subscriptions. REST. Documented properly. The kind of API that doesn't make you angry.

📐 Schema Reference

The core fields in every .rcal file. All fields are optional unless marked required.

FieldDescriptionType
rcalSpec version (required)"0.1"
meta.titlePublisher namestring
meta.typevenue / artist / personal…string
meta.liveAuto-update from URLboolean
meta.timezoneIANA timezone stringstring
meta.locationVenue/publisher location objectobject
meta.location.addressStreet addressstring
meta.location.cityCitystring
meta.location.stateState / province codestring
meta.location.countryISO 3166-1 alpha-2string
meta.location.latLatitude decimal degreesnumber
meta.location.lngLongitude decimal degreesnumber
strands[].idUnique identifierstring
strands[].locationPer-strand location overrideobject
strands[].recurrenceArray of rule objectsarray
recurrence[].patterndaily/weekly/monthly…string
recurrence[].daysDay array or shorthandarray
recurrence[].month_weekfirst/second/last…string
parse-example.js JavaScript
// Fetch and parse a live .rcal strand
import { parseRcal, getUpcoming } from '@eventstrand/rcal-js';

const res = await fetch('https://eventstrand.com/s/rusty-nail');
const strand = await parseRcal(await res.text());

// Get all events in the next 7 days
const upcoming = getUpcoming(strand, {
  from: new Date(),
  days: 7,
  vibeFilter: ['mellow', 'social']
});

upcoming.forEach(event => {
  console.log(
    `${event.name}${event.date} at ${event.time_start}`
  );
});

// Output:
// Friday Jazz Night — 2026-03-14 at 21:00
// Happy Hour — 2026-03-16 at 16:00
// Open Mic Night — 2026-03-19 at 20:00

Your portal.
Always open.

You built your world once. Now it's there whenever you need it — filtered to right now, right here, and exactly how you're feeling.

🧵

Build your strands

Your gym, your bar, your sister's birthday, the jazz residency you stumbled into last fall. Add them once. They live in your portal forever.

🎭

Filter by vibe

Not "what kind of event?" — "how do I feel?" Pick mellow, restless, or spontaneous. The portal does the sorting.

📸

Snap a flyer

See a paper flyer stapled to a telephone pole. Scan it. The app reads the schedule, builds the pattern, threads it into your world.

🔗

One scan loads a world

Scan a QR code on a bar door. Tap a link on a venue website. Their entire schedule loads into your portal instantly.

📅

Life strands

Your sister's birthday. The car registration renewal. The home filter you forget every six months. Now woven into your portal, surfacing right when they matter.

🤝

Share your world

Know your neighborhood cold? Package it up. Your friend just moved to your block — hand them your world in one tap.

Done!

Your dashboard

This Week
📅
Nothing lined up yet
Subscribe to strands from venues you love. Their events will surface here when the time is right.
Quick note

Create a braid

Loading your strands…
Search public strands to add from other publishers:

Workspaces

Each workspace holds its own set of strand and braid subscriptions. Switch to see a different slice of your world.

Account

Profile
Handle
Display name
Data
Export your strands
Download all your published strands as .rcal files.
Account
Sign out
API Keys

Use API keys to give agents or external tools access to your EventStrand data. Keys are shown once at creation and cannot be retrieved again.

Notifications
All caught up.
📲
Add EventStrand to your home screen
Opens instantly, works offline.