{
  "markdown": "# Mota\n\nReact and NestJS application for checking the next Seoul bus or subway\narrivals.\n\n## Workspaces\n\n| Workspace | Purpose |\n|---|---|\n| `apps/web` | React 19, Vite, Leaflet, PWA |\n| `apps/api` | NestJS 11, Fastify, auth-gateway login proxy and JWKS verification |\n| `packages/contracts` | Shared Zod contracts |\n| `packages/db` | Drizzle ORM, PostgreSQL migration and settings repository |\n\n## Development\n\n```bash\npnpm install\npnpm dev:web\npnpm dev:api\n```\n\nThe API requires the `mota` database managed by\n`../home-server-infra`. Copy `.env.example` to `.env` and set the database\npassword used by the dedicated `mota` role.\n\n## Verification\n\n```bash\npnpm typecheck\npnpm check\npnpm test\npnpm test:integration\npnpm build\n```\n\n## Database\n\n```bash\npnpm db:generate\npnpm db:migrate\npnpm db:studio\n```\n\nMota stores only `user_settings`. User identity is the Supabase `sub` claim\nverified from mota's own login; there is no local user table.\n\n## Docker\n\nLoad the shared PostgreSQL password from home-server-infra:\n\n```bash\ndocker compose --env-file ../home-server-infra/.env up -d --build\n```\n\nThe production Seoul subway API key is stored in macOS Keychain under account\n`mota` and service `SEOUL_SUBWAY_API_KEY`. Login shells export it from\n`~/.zshrc`. For non-interactive deployment, inject it without writing the key\nto a file:\n\n```bash\nSEOUL_SUBWAY_API_KEY=\"$(security find-generic-password -a mota -s SEOUL_SUBWAY_API_KEY -w)\" \\\n  docker compose --env-file ../home-server-infra/.env up -d --build\n```\n\nThe service is published at `127.0.0.1:3100` and joins both the\n`cloudflare-tunnel` and `home-server` networks.\n",
  "bytes": 1621,
  "sha": "aef68b32250f97185e55b72e268df553cb2d1189f807db0bf8ab893704eb229e",
  "repo_slug": "m16khb-org/mota",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/okf_m16khb_org_mota_openwiki_index_md_69bc328f/readme"
}