{"id":50716880,"url":"https://github.com/tools00/glosspilot","last_synced_at":"2026-06-09T19:01:33.446Z","repository":{"id":357672483,"uuid":"1238000030","full_name":"Tools00/glosspilot","owner":"Tools00","description":"Open-source field-ops dashboard template (admin dispatch + worker app) — Node/Fastify/TypeScript/Postgres/React","archived":false,"fork":false,"pushed_at":"2026-05-13T19:52:15.000Z","size":115,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-13T21:18:09.432Z","etag":null,"topics":["dashboard","drizzle-orm","fastify","field-ops","open-source","postgres","react","template","typescript"],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Tools00.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-13T18:02:08.000Z","updated_at":"2026-05-13T19:52:20.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Tools00/glosspilot","commit_stats":null,"previous_names":["tools00/glosspilot"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/Tools00/glosspilot","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tools00%2Fglosspilot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tools00%2Fglosspilot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tools00%2Fglosspilot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tools00%2Fglosspilot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Tools00","download_url":"https://codeload.github.com/Tools00/glosspilot/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tools00%2Fglosspilot/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34121022,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-09T02:00:06.510Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dashboard","drizzle-orm","fastify","field-ops","open-source","postgres","react","template","typescript"],"created_at":"2026-06-09T19:01:31.857Z","updated_at":"2026-06-09T19:01:33.441Z","avatar_url":"https://github.com/Tools00.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# GlossPilot\n\n\u003e Field-ops dashboard for mobile car-detailing crews — dispatch jobs, track materials, log daily work.\n\n**Status:** v0.1.0 — bootstrap phase. No backend yet, no DB yet.\n**License:** MIT\n**Stack:** Node 22 · Fastify · TypeScript · Postgres 16 · Drizzle ORM · React 18 · Vite · Tailwind · better-auth\n\n---\n\n## Why this exists\n\nA real, runnable starter kit for the pattern \"field-services dispatch + worker app\":\n**admin** plans the schedule, assigns workers, tracks material stock; **workers** see their day, mark progress, log usage. Same shape powers cleaning crews, HVAC service, property maintenance, and yes — car detailing.\n\nOpen-source so others can fork it for their own niche instead of vibe-coding the same wheel a hundredth time.\n\n---\n\n## Architecture\n\n```mermaid\nflowchart LR\n  subgraph Browser\n    SPA[React + Vite SPA\u003cbr/\u003eTanStack Query\u003cbr/\u003eTailwind UI]\n  end\n\n  subgraph Server[Node 22 / Fastify]\n    API[REST API\u003cbr/\u003eZod validation]\n    Auth[better-auth\u003cbr/\u003esession cookies]\n    RBAC[RBAC middleware\u003cbr/\u003eADMIN / WORKER]\n  end\n\n  subgraph Data\n    PG[(Postgres 16)]\n    Drizzle[Drizzle ORM\u003cbr/\u003e+ migrations]\n  end\n\n  Files[/Object photos\u003cbr/\u003eS3-compatible/]\n\n  SPA -- fetch + cookies --\u003e API\n  API --\u003e Auth\n  API --\u003e RBAC\n  RBAC --\u003e Drizzle\n  Drizzle --\u003e PG\n  API --\u003e Files\n```\n\n## Domain model\n\n```mermaid\nerDiagram\n  USERS ||--o{ SITES : \"created_by\"\n  USERS ||--o{ REPORTS : \"filed\"\n  USERS ||--o{ AUDIT_LOG : \"did\"\n  SITES ||--o{ TASKS : \"has\"\n  SITES ||--o{ MATERIALS : \"consumes\"\n  SITES ||--o{ EVENTS : \"scheduled_as\"\n  SITES ||--o{ REPORTS : \"covers\"\n  EVENTS }o--o{ USERS : \"assigned via event_workers\"\n  TOOL_CATALOG ||--o{ TOOL_CATEGORIES : \"groups\"\n\n  USERS {\n    int id PK\n    string email UK\n    string password_hash\n    string name\n    string initials\n    enum role \"ADMIN | WORKER\"\n    timestamp created_at\n  }\n  SITES {\n    int id PK\n    string client_name\n    string address\n    float lat\n    float lng\n    string color\n    enum status \"planned | active | completed | archived\"\n    int total_units\n    int done_units\n    date start_date\n    date end_date\n    int created_by FK\n  }\n  TASKS {\n    int id PK\n    int site_id FK\n    string name\n    string unit\n    int total\n    int done\n    int position\n  }\n  MATERIALS {\n    int id PK\n    int site_id FK\n    string name\n    string variant\n    float needed_qty\n    float taken_qty\n    float per_unit\n  }\n  EVENTS {\n    int id PK\n    int site_id FK\n    string title\n    string note\n    date start_date\n    date end_date\n    string color\n  }\n  REPORTS {\n    int id PK\n    int site_id FK\n    int user_id FK\n    text summary\n    timestamp reported_at\n  }\n  AUDIT_LOG {\n    int id PK\n    int user_id FK\n    string action\n    string entity\n    int entity_id\n    jsonb payload\n    timestamp ts\n  }\n```\n\n## User flow (admin vs. worker)\n\n```mermaid\nsequenceDiagram\n  participant Admin\n  participant API\n  participant DB\n  participant Worker\n\n  Admin-\u003e\u003eAPI: POST /sites (new job)\n  API-\u003e\u003eDB: insert site + tasks + materials\n  API--\u003e\u003eAdmin: 201 Created\n\n  Admin-\u003e\u003eAPI: POST /events (assign workers)\n  API-\u003e\u003eDB: insert event + event_workers\n  API--\u003e\u003eAdmin: 201 Created\n\n  Note over Worker: morning login\n  Worker-\u003e\u003eAPI: GET /me/today\n  API-\u003e\u003eDB: events where worker_id = me AND date = today\n  API--\u003e\u003eWorker: list of jobs\n\n  Worker-\u003e\u003eAPI: POST /reports {site_id, summary}\n  API-\u003e\u003eDB: insert report + audit_log\n  API--\u003e\u003eWorker: 201 Created\n\n  Admin-\u003e\u003eAPI: GET /dashboard\n  API-\u003e\u003eDB: aggregate active sites, today's reports, material burn\n  API--\u003e\u003eAdmin: dashboard payload\n```\n\n---\n\n## Quickstart\n\n```bash\n# requires: node 22, pnpm, postgres 16, docker (optional)\ngit clone \u003crepo\u003e\ncd glosspilot\ncp .env.example .env          # fill in DATABASE_URL + AUTH_SECRET\npnpm install\npnpm db:migrate\npnpm db:seed                  # demo: 6 users, 5 sites, 8 events\npnpm dev                      # api + web in parallel\n```\n\nDemo logins after seed:\n- Admin: `dispatch@glosspilot.dev` / `demo`\n- Worker: `crew1@glosspilot.dev` / `demo`\n\n---\n\n## Project layout\n\n```\nglosspilot/\n├── apps/\n│   ├── api/                  # Fastify + Drizzle\n│   └── web/                  # React + Vite\n├── packages/\n│   └── shared/               # zod schemas, types\n├── docs/\n│   ├── adr/                  # architecture decisions\n│   ├── architecture.html     # local mermaid preview\n│   └── HOW-IT-WORKS.md       # user guide (TODO)\n├── docker-compose.yml        # postgres + adminer\n├── .env.example\n└── CHANGELOG.md\n```\n\n---\n\n## Non-goals (intentionally NOT in scope)\n\n- Multi-tenancy (one company per deployment — fork for SaaS)\n- Real-time push (polling is fine for ≤50 users)\n- Mobile-native app (responsive web works for the field)\n- Invoicing / payments (out of scope, integrate Stripe externally)\n- AI features (this is a clean reference impl — add agents in your fork)\n\n---\n\n## Roadmap\n\n- [x] v0.1.0 — bootstrap, docs, ADRs\n- [ ] v0.2.0 — auth + RBAC + users CRUD\n- [ ] v0.3.0 — sites + tasks + materials CRUD\n- [ ] v0.4.0 — calendar + event assignment\n- [ ] v0.5.0 — reports + dashboard\n- [ ] v0.6.0 — file uploads (object photos)\n- [ ] v0.7.0 — audit log viewer\n- [ ] v1.0.0 — Dockerized, deployed demo, docs complete\n\n---\n\n## License\n\nMIT — see `LICENSE`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftools00%2Fglosspilot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftools00%2Fglosspilot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftools00%2Fglosspilot/lists"}