Case study · 2026
Howie Helper
A phone-first scheduling app I built and host for the pizza store where I'm an assistant manager. My GM uses it to build and publish the weekly schedule.
- One store
- a handful of people, invite only
- Offline
- local copy on the phone, writes queued until reconnect
- ~2,500
- unit and component tests
01 · Overview
- Role
- Solo build, AI-assisted with Claude Code: design, architecture, hosting
- Status
- In use at my store · schedule only
- Privacy
- Private system
From real constraint
to working system.
The challenge
Our weekly schedule lived in a shared spreadsheet that's hard to read and edit on a phone, and crew availability and time-off requests came in through texts. I wanted one place on my phone where the schedule gets built, checked against availability, and published.
The response
I built an installable web app, starting with a static HTML prototype in June 2026 and moving to React, TypeScript and a self-hosted Supabase backend in July. Today the store uses only the schedule. I also built other tools (inventory, nightly numbers, dough planning, drawer cash), but they're hidden or unused at the store.

02 · Build
What the system needed.
Howie Helper features and engineering decisions
Schedule
Draft, check, publish
Managers edit a private draft of the week while the crew only see the published version. Availability and time-off requests show on the draft grid, so conflicts are visible before anything goes out.
- Weekly grid editor with a draft/publish gate
- Crew availability and time-off requests overlaid on the draft
- Copy-out to the owners' spreadsheet, plus PNG/PDF export
Offline first
Works when the store Wi-Fi doesn't
Each phone keeps a local SQLite copy of its store's data through PowerSync. Writes queue while offline and sync when the connection returns, so IDs and write rules have to survive retries. For example, the cash log is append-only.
- Local SQLite replica with a queued write path
- Separate upload queue for photo attachments
- Prompt-to-update banner, because installed copies kept running old versions after deploys
Access control
Rules in the database, not just the UI
Every table has Postgres row-level security scoped to a store, with platform admins and a 7-rank member ladder on top. I checked the rules by impersonating real accounts before a second store's GM was given access.
- Per-store row-level security on every table
- Invite-code signup and role-based tool visibility per store
- API rate limits tuned per endpoint, because a rate-limit error on sign-in would end the session and clear the offline queue
Running it
Self-hosted on my homelab
The backend (Postgres, auth, REST API, storage, sync) runs in Docker on my homelab and is exposed through a Cloudflare Tunnel. Deploys are a script I run by hand, and GitHub Actions type-checks and tests every PR.
- Self-hosted Supabase and PowerSync in Docker
- 32 SQL migrations and SQL scripts that check the access rules
- CI for type-checking and tests; deploys are manual
03 · System
Boundaries before boxes.
Sanitized system architecture
- 01Installable React PWA
- 02PowerSync local replica
- 03Supabase auth & API
- 04PostgreSQL with RLS
- 05Homelab via Cloudflare Tunnel
04 · Views
Designed representations.
Sanitized visual gallery





05 · Outcomes
A stronger operating baseline.
- 01
The store's weekly schedule is built and published in the app.
- 02
I've worked through real offline sync, access control, and self-hosting problems for a small group of real users.
- 03
Other tools exist but aren't in use, and I'm keeping the app focused on scheduling for now.