Build up strands of everything you could be doing — local venues, artists, recurring events, life milestones — and open your portal whenever a free moment appears.
Every other calendar answers "what am I doing?" Eventstrand answers the question you ask when your night opens up.
Load in your local gym's hours, the weekly jazz night at your favorite bar, your friend's birthday, the library's monthly workshop. Each becomes a living thread in your personal world.
Open the app when you're bored, restless, or your evening suddenly cleared. Your portal surfaces everything relevant to right now — filtered by mood, time, and distance.
Venues publish .rcal strand files. Scan a QR code on a bar door. Tap a link on a venue website. One action loads their entire schedule into your portal forever.
Whether you're a person looking for something to do, a venue trying to reach your audience, or a developer building on the format.
Available on iOS and Android. On desktop, use the web portal at eventstrand.com/app.
Manually add recurring things you know about — a gym schedule, a weekly show, a monthly dinner tradition. Or scan a QR code on any venue that publishes an Eventstrand file.
Install holiday strands, cultural calendars, sports season strands, or any community-published strand from the library.
Whenever you have a free moment, open Eventstrand. Select your current vibe. See everything that could be happening right now or tonight.
Tap to go — get directions, buy tickets, or add to your real calendar. Pass with one swipe. The strand template stays alive forever.
Go to publish.eventstrand.com. No app required. Takes under 10 minutes to set up a full venue strand.
Every weekly night, monthly special event, recurring happy hour, seasonal schedule. Use the plain-language recurrence builder — no technical knowledge needed.
Get your strand file, a print-ready QR code, a hosted URL, and an embed widget for your website. All in one click.
On your front door, table cards, flyers, menus, window. Anyone who scans it instantly loads your events into their portal.
With a free account, your strand stays live. Edit it and all subscribers get the update automatically. No reprinting, no emailing.
The .rcal format is fully documented and free to implement. No license, no fees. Read the spec at eventstrand.com/spec.
JSON-based format with a clear schema. Reference parsers available in JavaScript, Python, and Swift. Contribute your own to the GitHub repo.
If you run event management software, a venue booking system, or any platform with recurring events — add .rcal export to let users publish their schedule.
Pull strand data programmatically, validate .rcal files, or integrate strand discovery into your own app via the Eventstrand API.
// Minimal valid .rcal file { "rcal": "0.1", "meta": { "title": "The Rusty Nail", "type": "venue", "timezone": "America/Chicago", "live": true }, "strands": [ { "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 file format is free to use, implement, and build on. Anyone can create, publish, or read .rcal files.
Daily, weekly, bi-weekly, monthly by date or weekday, annual, seasonal windows, custom intervals. Layer multiple rules per event — because real life isn't one clean pattern.
A static .rcal file downloads once and lives locally. A live strand points to a hosted URL — when the venue updates it, all subscribers get the refresh automatically.
Every event carries emotional context — mellow, social, restless, spontaneous, celebratory, curious. The app uses these to filter the portal by how you're feeling right now.
Skip dates, modify specific instances, cancel date ranges. The file handles the real-world messiness of how venues actually operate.
A single bar with three recurring nights. A city-wide event calendar. A global cultural strand for Ramadan or Pride Month. Same format, same file structure.
// 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" }, "strands": [ { "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", "month_week": "second", "days": ["thursday"], "time_start": "20:00" }, { "pattern": "monthly", "month_week": "last", "days": ["saturday"], "time_start": "21:00" } ] } ] }
No code required. Fill in plain-language fields and get a ready-to-use .rcal file, QR code, and shareable link.
Add one or more time rules. Rules layer together to generate the full schedule.
Add exceptions — specific skips, modified instances, or closed periods. Optional — most people skip this on first build.
Download your .rcal file, grab your QR code, or get a shareable link.
Community-published strands covering holidays, cultural events, sports seasons, and local life rhythms.
Open specification, reference parsers, and an API for live strand integration. The format is yours to use.
The complete specification for the .rcal file format. Covers all fields, recurrence patterns, exception types, and versioning rules.
Parse and validate .rcal files in your platform. Reference implementations available — contribute your language to the repo.
Fetch strand data, validate .rcal files, search the public strand library, and manage live strand subscriptions programmatically.
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
Build your world once. Open it whenever a free moment appears — and see everything you could be doing, filtered by how you feel right now.
Add venues, artists, life milestones, and recurring events manually or by scanning QR codes in the wild.
Open the app feeling mellow, restless, or spontaneous. The portal surfaces only what matches your current mood.
Point the camera at any event flyer or sign. The app reads it and creates a recurring strand template automatically.
Scan a QR code on a bar door. Tap a link on a venue website. Their entire schedule loads into your portal instantly.
Birthdays, anniversaries, holidays, home maintenance — all encoded as strands that surface at the right moment.
Export your local knowledge as a strand bundle and share it with a friend who just moved to your neighborhood.
A free account syncs your strands, preferences, and portal across phone, tablet, and desktop.
By creating an account you agree to our Terms of Service and Privacy Policy.
Access your full portal at eventstrand.com/app from any browser. Your strands, your vibes, your world — on any screen.
Your strand gets a permanent URL at eventstrand.com/s/yourname. Edit anytime — all subscribers auto-update. No reprinting QR codes.
Install a strand on your phone, see it on your laptop instantly. Preferences and portal state follow you everywhere.
See how many people installed your strand, which events get the most attention, and where your audience is.
The full desktop portal. Browse your possibility space, manage strands, and open your portal from any computer — no app install needed.
Open Desktop Portal →