Beacon
A shared workspace for planning trips together. Started as an Expo app on Convex, now one Cloudflare Worker serving iOS, the web, and AI agents over MCP.
An Expo app on Convex. Trips sync live between everyone planning them, and the whole plan imports and exports as markdown.
what and why
trip planning is scattered across group chats, shared docs, screenshots of Google Maps, and half-finished spreadsheets. beacon pulls it all into one place, a real-time shared workspace for building trips together.
depending on the country, Apple Maps or Google Maps is better, so beacon lets you switch between them seamlessly.
your plans aren’t locked in. markdown import/export means you can plan with any tool, any LLM, or just a text editor. the app is the interface, not the cage.
features
- collaborative itineraries — build and edit trip plans together in real-time
- location management — save, organize, and share places
- markdown interop — import/export plans as markdown, bring your own tools
- live sync — everyone sees the same thing, always up to date
- map provider switching — seamlessly switch between Apple Maps and Google Maps
- Apple Sign-In — one tap to get started
tech stack
- Expo + React Native — native iOS app with file-based routing (Expo Router)
- Convex — real-time serverless backend, live-syncing data, no manual cache invalidation
- Better Auth — authentication with Apple Sign-In
- Jotai — minimal client-side state management
- NativeWind — Tailwind CSS for React Native
- Zod — shared validation schemas across client and server
- Turborepo + Bun — monorepo tooling
Off Convex and onto Cloudflare. One Effect Worker on D1 serves the iOS app, a new web app, and any AI agent you connect over MCP.
what changed
v1 ran on Convex. v2 moved every workflow onto a single Cloudflare Worker, one at a time: auth, trips, itineraries, places, tags, currency, weather, and invites. each one was cut over behind an acceptance gate before the Convex version was retired.
the rewrite also added two new clients: a web app, and agents.
features
- shared trips with roles: each trip has an Owner, Members who can edit the plan, and Viewers who can only read
- invites: an invite link opens a read-only preview of the trip before you even have an account, then joins you after you sign in
- itineraries and home bases: an ordered plan per trip, with date-ranged lodging so each day knows where you’re staying
- places: search through Apple Maps and Google, save places for yourself, or add them to a trip
- weather and currency: forecasts for each destination, and a searchable currency converter
- guide import: an agent reads a travel guide and pulls out the places, and you review them before anything is saved
- web app: a browser client with invite previews and Sign in with Apple
agent access
you can connect an agent like Claude or ChatGPT to Beacon over MCP. it signs in with OAuth and can only touch the trips you pick.
every tool has a policy: allow, require approval, or block. when an agent calls a tool that needs approval, Beacon sends you to an approval page and waits. every call is logged with what was decided and why, and you can revoke a connection at any time.
tech stack
- Expo + React Native: iOS app with Expo Router and Uniwind, shipped to TestFlight on every push to main
- TanStack Start: the web app
- Cloudflare Workers + D1: one API Worker with Drizzle over D1
- Effect v4: services, errors, and the D1 layer on the Worker
- Better Auth: Sign in with Apple, plus OAuth for agents
- Agents SDK + AI Gateway: guide import with Gemini
- TanStack Query + Jotai: client state
- Alchemy: defines the Cloudflare resources and runs local dev on Miniflare
- Turborepo + Bun + Ultracite: monorepo tooling