Busabase
Busabase is an open-source (MIT) database and workspace for AI agents — data, docs, skills, and apps in one place. Run it locally, self-host it inside your network, or use Busabase Cloud, and turn age
The fast, easy GTFS editor and service planner. Build, validate, and publish GTFS & GTFS-Flex feeds in your browser. No account required.
DataTypeScript · HTMLGitHub @GTFS-XOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
web based tool for creating / editing GTFS feeds
Translation pending
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
A web-based editor for creating, editing, analyzing, and publishing GTFS (General Transit Feed Specification) transit feeds. Draw routes on a map, place stops, build timetables, run demographic and equity analysis, and publish a validated feed with rider-facing embeds — all in the browser.Read the full README ↗A web-based editor for creating, editing, analyzing, and publishing GTFS (General Transit Feed Specification) transit feeds. Draw routes on a map, place stops, build timetables, run demographic and equity analysis, and publish a validated feed with rider-facing embeds — all in the browser.
Live site: www.gtfsx.com
locations.geojson polygon zones with on-map editing handles, booking_rules.txt, extended stop_times with pickup/drop-off windows, location groups. Round-trip preserved.shape_dist_traveled auto-calculated and feed_info.txt always emitted.docs/Title VI Transit Service Analysis - Calculation Procedures Memo.md.Cmd/Ctrl + / toggles it.owner / admin / editor / viewer roles, invitations, ownership transfer, per-org logo + brand color.feeds.gtfsx.com/<slug>/gtfs.zip with ETag / Last-Modified / 304 support, validation gate, atomic R2→D1 pointer flip.X-Robots-Tag: noindex.feeds.*/<slug>//embed/route/<route_id>/embed/stop/<stop_id>/embed/system-map/admin for staff users (dashboard counters, paginated users / orgs, audit-log viewer with CSV export).Status: Backend is live on production at www.gtfsx.com (re-enabled 2026-05-15 alongside live billing). Auth, projects, snapshots, draft links, publication, embeds, and Stripe checkout all available. Anonymous IndexedDB editing also still works for users who don't sign in.
react-map-gl + @mapbox/mapbox-gl-drawimmer middlewareBackend: Single Cloudflare Worker (Hono router) + D1 (metadata) + R2 (working states, version snapshots, GTFS zips, org logos, demand-dot PMTiles) + KV (rate-limit counters) + Resend (transactional email) + Cloudflare Turnstile (signup bot mitigation).
pk.*)git clone https://github.com/GTFS-X/gtfsx.git
cd gtfsx
npm install
cp .env.example .env
# Edit .env: add VITE_MAPBOX_TOKEN
# Optionally also: VITE_BACKEND_ENABLED=true, VITE_TURNSTILE_SITE_KEY=...
# Editor only:
npm run dev # http://localhost:5173
# With backend (in a second terminal):
npx wrangler dev --port 8787 --local
npx wrangler d1 migrations apply gtfs-builder --local # once, and after pulling new migrations
.env carries VITE_* flags. .dev.vars carries RESEND_API_KEY and overridden APP_ORIGIN / FEEDS_ORIGIN. Both are gitignored.
A plain npm run dev has no session, so every signed-in-only and plan-gated
surface — the Routes-panel "Import from another feed" button, paywall overlays,
org/workspace UI, /admin — is invisible and therefore unverifiable. The dev
auth switch gives the dev server an identity. It is opt-in and
development-only: import.meta.env.DEV gates every entry point, so a
production build has no trace of it (enforced by npm run check:prod-bundle,
which fails the build if any of it survives).
Enable it in .env.local (gitignored via *.local; .env is shared, so
don't put it there). Two modes:
1. Client-only — fastest, no worker needed. Injects a synthetic
currentUser into the store and skips /api/me entirely.
# .env.local
VITE_DEV_AUTH=agency # free | agency | enterprise, optionally +staff
2. Server-backed — a real session against your local D1. Seeds a real
user + session row into the miniflare D1 under .wrangler/state and prints
the cookie token. No auth code is bypassed: the local worker authenticates you
through the ordinary resolveSession path, so /api/*, saving, and publishing
all work.
npm run dev:auth -- --plan agency --staff # prints the two lines below
# .env.local
VITE_DEV_AUTH=server
VITE_DEV_SESSION_TOKEN=<token printed by dev:auth>
Restart npm run dev after editing .env.local (Vite reads env at startup). A
persistent badge in the bottom-left states which mode is live — amber for the
client-only fake, green with the real email once the local worker has accepted
the session, red if it hasn't — so fake auth is never mistaken for real auth.
What each mode does NOT cover:
client-only (=agency) | server-backed (=server) | |
|---|---|---|
Client-side gating (currentUser, planHasFeature) | ✅ | ✅ |
/api/*, project save/load, publish | ❌ 401 — there is no session | ✅ against local D1/R2 |
| Org list, members, invitations | ❌ empty (/api/orgs 401) | ✅ (create the org through the UI) |
| Real login/signup/2FA/magic-link flows | ❌ bypassed, not exercised | ❌ bypassed, not exercised |
| Stripe checkout, webhooks, real plan changes | ❌ | ❌ — plan is set directly in D1 |
| Email delivery (verify, invite, digest) | ❌ | ❌ unless .dev.vars has a real RESEND_API_KEY |
In client-only mode the 401s in the network tab are the point: nothing fakes a server response, so anything server-backed still visibly fails. Reach for server-backed mode as soon as the thing you're testing touches the worker. Neither mode exercises the authentication code paths themselves — test those against staging.
# Editor integration tests (round-trip a real Pittsburgh PRT feed through every entity type)
npx tsx run-tests.ts
# Worker integration tests
npx vitest run --fileParallelism=false
# Typecheck
npx tsc -p tsconfig.app.json --noEmit # frontend
npx tsc -p tsconfig.worker.json --noEmit # worker
--fileParallelism=false is required for worker tests because of a workerd WebSocket-disconnect quirk under parallel runs.
gtfsx.com / www.gtfsx.com / feeds.gtfsx.com — auto-deployed by Cloudflare Workers Builds on every push to main (no separate promotion step).staging.gtfsx.com + staging-feeds.gtfsx.com — parked, manual rehearsal env. Deploy via npx wrangler deploy --env staging.Full day-to-day cadence, the first-time Cloudflare provisioning runbook (D1, KV, R2, Resend, Turnstile), and the live operational state (kill-switch positions, deploy gotchas) all live in docs/ARCHITECTURE.md (§5 live state, §6 provisioning, §7 workflow).
public/census/docs/ARCHITECTURE.md Appendix A| Doc | Scope |
|---|---|
REQUIREMENTS.md | Capability inventory across editor, analysis, accounts, billing, publication, and forum. Shipped / partial / planned / deferred. |
ARCHITECTURE.md | The single engineering reference — system architecture, data model, full API surface, security/privacy NFRs (BE-*/NF-* anchors), live environment state, git + deploy workflow, provisioning + operator runbooks, demand-dot regen + Google Ads OCI appendices. |
brand-kit/ | Brand assets — logos, palette, fonts, guidelines. |
The 🔲 planned-feature backlog lives in GitHub issues. Superseded/historical specs are preserved under docs/archive/ (gitignored; local reference only).
src/
├── components/
│ ├── layout/ # AppShell, TopBar, LeftRail (responsive nav rail),
│ │ # RightRail (configuration panel host), BottomPanel,
│ │ # AppBrand, UserMenu, FloatingHelp, WelcomeBanner
│ ├── map/ # MapView, RouteLayer, StopLayer, DrawControl, popups,
│ │ # MapLayerControls, CoverageLayer, DemandDotsLayer
│ ├── agency/ # Agency + Feed Info editor
│ ├── calendar/ # Service-pattern editor with month preview
│ ├── routes/ # RouteList, RouteEditor, RouteDetailPanel (tabbed),
│ │ # RouteStopsTab, RouteTripsTab, RouteFrequenciesTab,
│ │ # RouteDeleteDialog (shared confirmation)
│ ├── stops/ # Route-scoped stops + bulk CSV import
│ ├── timetable/ # TimetableGrid, StopDepartures, ServiceSummary
│ ├── fares/ # Fare attributes + route rules editor
│ ├── flex/ # GTFS-Flex zone editor + booking rules
│ ├── costs/ # Cost estimation summary
│ ├── coverage/ # Demographic coverage analysis
│ ├── titlevi/ # Title VI equity analysis
│ ├── validation/ # Validation panel
│ ├── import-export/ # Import / export dialogs
│ ├── versions/ # Version history (backend)
│ ├── distribution/ # Publish + catalog submission (backend)
│ ├── embed/ # Embed snippet copier (backend)
│ ├── audit/ # Project activity log (backend)
│ ├── feeds/ # My Feeds page (backend)
│ ├── orgs/ # Org settings + invitations (backend)
│ ├── admin/ # Admin console (backend, staff-only)
│ ├── auth/ # Login / signup / magic-link / account / password reset
│ ├── help/ # Help dialog
│ └── ui/ # Shared (FormField, Badge, EmptyState, RailHeadings)
├── store/ # Zustand slices, one per entity type + ui slice
├── services/ # GTFS import/export, validation, snap-to-road,
│ # coverage analysis, cost estimation, Title VI,
│ # auth API, projects API, orgs API
├── db/ # Dexie (IndexedDB) auto-save + server persistence
├── types/ # GTFS + UI TypeScript interfaces
└── utils/ # Time parsing, colors, constants, feature flags
worker/ # Cloudflare Worker (Hono): auth, projects, orgs,
# admin, publication, embeds, email, util, cron
worker/migrations/ # D1 SQL migrations
GNU Affero General Public License v3.0 (AGPL-3.0).
Copyright (C) 2026 Mark Egge.