Busabase
Busabase는 AI 에이전트를 위한 오픈소스(MIT) 데이터베이스 및 작업 공간입니다
브라우저에서 계정 없이 GTFS·GTFS‑Flex 피드를 만들고, 검증하고, 게시할 수 있는 빠르고 쉬운 편집·계획 도구
The fast, easy GTFS editor and service planner. Build, validate, and publish GTFS & GTFS-Flex feeds in your browser. No account required.
데이터TypeScript · HTMLGitHub @GTFS-X온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기web based tool for creating / editing GTFS feeds
저장소 README에서 가져옴
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.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.