PinPoint is an issue tracker built for the Austin Pinball Collective. It helps keep games playable by making it easy to report problems, see what’s broken, and coordinate repairs. It is in active production use by the collective’s members.
- See whether a machine is operational, needs service, or unplayable before you drop a quarter.
- Report issues in seconds from your phone:
- Pick a machine
- Describe the problem
- Choose a severity:
cosmetic,minor,major, orunplayable - Indicate consistency:
intermittent,frequent, orconstant - (Optional) Provide contact info for updates
- See every open issue across the collection at a glance, with the worst-off machines surfaced first.
- Filter and triage by severity, status, or machine.
- Pick up issues, work through them, and record what was done so there’s a history per machine.
- Spot recurring problems and plan repair sessions around them.
- Machine – a specific physical game in the collection.
- Issue – a problem on a machine, always tied to exactly one machine.
- Severity – how bad it is from a player’s perspective:
cosmetic– very minor / nice-to-fix (e.g. dirty playfield, minor bulb out)minor– small issues that do not change how the game playsmajor– the game plays, but something significant is wrong (shots not registering, features disabled)unplayable– game is effectively down (ball stuck, flippers dead)
- Players scan a code or visit the report page to log an issue while they’re standing at the machine.
- Members log in to:
- See their assigned issues
- Filter and triage by severity, status, or machine
- Work through issues and record what was done
- Operators use the dashboard to:
- Spot unplayable machines quickly
- Plan repair sessions
- Keep a record of recurring problems
- Framework: Next.js 16 (App Router, React Server Components)
- Language: TypeScript (strictest settings)
- Runtime: React 19
- UI: shadcn/ui + Tailwind CSS v4
- Database: PostgreSQL via Supabase
- ORM: Drizzle ORM (schema + migrations)
- Auth: Supabase SSR
- Testing: Vitest, Playwright, PGlite
If you’re changing code, start here:
AGENTS.md– project rules, constraints, and expectationsdocs/NON_NEGOTIABLES.md– things you must not break.agents/skills/– how we structure code (and why);pinpoint-ui,pinpoint-typescript,pinpoint-security,pinpoint-testingare the ones you'll reach for mostdocs/feature-specs/– approved requirements for individual features
- mise 2026.8.11+
- A Docker-compatible container runtime for the local Supabase stack
- GNU parallel for the host-wide
pnpm run preflightconcurrency cap - A Supabase account only for preview or production administration
mise install --locked supplies the project Node, Python, Ruff, Supabase CLI,
and pnpm executables. Do not install separate project copies with Corepack, npm,
Homebrew, or another version manager.
| Surface | Authority |
|---|---|
| Project Node, Python, Ruff, and Supabase CLI | Exact pins in mise.toml; resolved artifacts in mise.lock |
| pnpm executable | Exact version and sha512 integrity in package.json#packageManager, installed by mise |
| Project commands | package.json#scripts; mise resolves tools but does not duplicate the task namespace |
Local/Bazzite bd and Dolt |
User-global mise declarations checked against scripts/beads-compatibility.json |
Cloud-routine bd and Dolt |
scripts/beads-cloud-setup.sh plus scripts/beads-cloud-init.sh; this path remains separate because cloud routines cannot reach the tailnet |
Vercel does not install or invoke mise. package.json#engines is its Node
compatibility contract, vercel-build retains the production migration/build
ordering, and the preview Vercel CLI remains pinned behind the repository-owned
wrapper. The Supabase pin in mise.toml owns only the CLI executable: container
images, generated worktree configuration, database lifecycle, and deployment
migrations remain with their existing owners.
git clone https://github.com/timothyfroehlich/PinPoint.git
cd PinPoint
mise install --locked # installs pinned Node, Python, Ruff, Supabase CLI, and pnpm
mise exec -- python3 -m pip install -r scripts/requirements.txt
mise exec -- pnpm install # plain `pnpm` also works after mise shell activation
cp .env.example .env.local # then fill in Supabase + DB vars
mise exec -- pnpm run dev # automatically ensures Supabase is runningOpen http://localhost:<PORT> (see .env.local) to use the app.
Schema lives in src/server/db/schema.ts and is managed through Drizzle migrations:
# After editing schema.ts
pnpm run db:generate -- --name <change-name> # create migration
pnpm run db:migrate # apply migrations locally
pnpm run test:_generate-schema # refresh PGlite schemaFor a full local reset (destructive – wipes app data):
pnpm run db:resetThis restarts Supabase, drops app tables, reapplies all migrations, regenerates the test schema, and seeds users/data.
To browse or edit the data directly, pnpm run db:studio opens Drizzle Studio.
pnpm run dev # start dev server
pnpm run check # static gate: typecheck + lint + format (no tests, no Python)
pnpm run test # unit tests (PGlite)
pnpm run test:integration # PGlite integration tests
pnpm run test:integration:supabase # Supabase-backed integration tests (needs supabase start)
pnpm run check:python # ruff + pytest over scripts/ and the hooks
pnpm run smoke # Playwright smoke E2E tests
pnpm run preflight # full local CI gate before pushingFor the command reference and the rules behind it, see AGENTS.md §5; for which
tests to write where, the pinpoint-testing skill at
.agents/skills/pinpoint-testing/SKILL.md.
Dependency updates are intentionally split: Dependabot owns npm and GitHub Actions,
while hosted Renovate may propose mise tool updates only. See
docs/runbooks/renovate-mise.md for cooldowns, compatibility checks, hosted-app
permissions, installation, and rollback.
PinPoint is designed to run on Vercel + Supabase:
- Push your code to GitHub.
- Import the repo into Vercel.
- Configure environment variables in Vercel to match your
.env.local. - Point the app at the production Supabase project. Preview database branches are
created only on demand through the
/previewPR command.
CI is configured via .github/workflows/ci.yml and mirrors the pnpm run preflight pipeline.
Production remains pnpm run migrate:production followed by next build; a
failed build can therefore follow a successful production migration.
Short‑term focus:
- Hardening and onboarding polish for the Austin Pinball Collective’s active users
- More refined dashboards for operators
- Expanding the machine registry with OPDB integration
Future ideas:
- More advanced dashboards and views (e.g., Kanban-style)
- Parts and inventory tracking
- Additional locations and multi‑venue support
Individual feature requirements live in docs/feature-specs/.