One account. Your strands, braids, and workspaces — always in sync, always yours.
Every strand you follow, every event coming up — in one place. Open it when your evening clears.
Your strand lives at eventstrand.com/s/yourhandle/strand-name. Update once — every subscriber gets it silently.
Weekend, Work, Kids — separate strand libraries for each context. Switch between them instantly.
Subscriber counts, view trends, scan origins. There when you want them — not in your face when you don't.
.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.
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.
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.
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.
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 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.
Whether you're looking for something to do tonight, a venue trying to reach your regulars, or a developer building on the open format.
iOS, Android, or straight in the browser at eventstrand.com/app. No account required to start.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Fully documented, openly licensed, free to implement forever. eventstrand.com/spec. It's about 15 minutes of reading.
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.
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.
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.
// 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" } ] } ] }
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.
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.
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.
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.
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.
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.
// 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" } ] } ] }
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.
// Your .rcal file will appear here
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.
Discover verified event spaces with a strand — browsable, filterable, always current.
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.
EventStrand's strands are .rcal files. The spec is open, the parsers are free. Build integrations, exporters, or your own EventStrand-compatible tools.
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 implementations you can drop in and ship. Covered languages are tested against the spec. Uncovered languages are an open invitation.
Fetch strands, validate files, search the library, manage subscriptions. REST. Documented properly. The kind of API that doesn't make you angry.
The core fields in every .rcal file. All fields are optional unless marked required.
| Field | Description | Type |
|---|---|---|
| rcal | Spec version (required) | "0.1" |
| meta.title | Publisher name | string |
| meta.type | venue / artist / personal… | string |
| meta.live | Auto-update from URL | boolean |
| meta.timezone | IANA timezone string | string |
| meta.location | Venue/publisher location object | object |
| meta.location.address | Street address | string |
| meta.location.city | City | string |
| meta.location.state | State / province code | string |
| meta.location.country | ISO 3166-1 alpha-2 | string |
| meta.location.lat | Latitude decimal degrees | number |
| meta.location.lng | Longitude decimal degrees | number |
| strands[].id | Unique identifier | string |
| strands[].location | Per-strand location override | object |
| strands[].recurrence | Array of rule objects | array |
| recurrence[].pattern | daily/weekly/monthly… | string |
| recurrence[].days | Day array or shorthand | array |
| recurrence[].month_week | first/second/last… | string |
// 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
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.
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.
Not "what kind of event?" — "how do I feel?" Pick mellow, restless, or spontaneous. The portal does the sorting.
See a paper flyer stapled to a telephone pole. Scan it. The app reads the schedule, builds the pattern, threads it into your world.
Scan a QR code on a bar door. Tap a link on a venue website. Their entire schedule loads into your portal instantly.
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.
Know your neighborhood cold? Package it up. Your friend just moved to your block — hand them your world in one tap.
eventstrand.com/p/yourhandle. You can change it later without breaking existing links.Each workspace holds its own set of strand and braid subscriptions. Switch to see a different slice of your world.
—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.