React and NestJS application for checking the next Seoul bus arrivals. Save independent bus-stop selections for 출근 and 퇴근, watch up to four stops together, and see up to three arrival rows per stop.
| Workspace | Purpose |
|---|---|
apps/web |
React 19, Vite, Leaflet, PWA |
apps/api |
NestJS 11, Fastify, auth-gateway login proxy and JWKS verification |
packages/contracts |
Shared Zod contracts |
packages/db |
Drizzle ORM, PostgreSQL migration and settings repository |
pnpm install
pnpm dev:web
pnpm dev:apiThe API requires the mota database managed by
../home-server-infra. Copy .env.example to .env and set the database
password used by the dedicated mota role.
pnpm typecheck
pnpm check
pnpm test
pnpm test:integration
pnpm buildpnpm db:generate
pnpm db:migrate
pnpm db:studioMota actively reads and writes user_settings. User identity is the Supabase
sub claim verified from the auth-gateway session; there is no local user table.
Historical subway quota tables and migrations are retained but unused.
Legacy settings preserve bus stops and selected IDs while ignoring subway fields;
no bulk settings migration or table deletion is needed.
Load the shared PostgreSQL password from home-server-infra:
docker compose --env-file ../home-server-infra/.env up -d --buildNo subway API key is required. Subway APIs and the subway-only 3D preview
have been retired; old /3d-preview links open the bus home screen.
The public site is https://mota.m16khb.dev, with authentication through
https://auth.m16khb.dev. These match the published home-server-infra routes.
The service is published locally at 127.0.0.1:3100 and joins both the
cloudflare-tunnel and home-server networks.