Before I built anything in this space, I worked in a café for two summers in college. The manager ran the schedule out of a laminated print-out taped to the office wall and a group text with 14 people in it. When someone needed to drop a shift, the text chain lit up like Times Square. When coverage couldn't be found, the manager just worked the shift herself. She had a fifth-grader. She worked six of those a month.

shiftfill is the app I should have built for her twelve years ago.

The Problem

Every hourly-staffed operation runs into the same three problems:

  1. Building next week's schedule is a puzzle, but the tools are the same spreadsheets or paper they've been for twenty years.
  2. When the schedule is published, shifts need to move around. Someone gets sick, someone's kid is sick, someone has a final. The swap-coordination problem lives in a group chat and eats the manager's evenings.
  3. Time-off requests, accrued PTO, blackout dates — it's all in someone's head or a shared Google Doc nobody updates.

Commercial solutions exist. They cost $4-8/employee/month and they bundle in HRIS and onboarding and payroll sync. If you're a 5-person café, that's not a value proposition — that's a $40/month commitment to software that does 30 things when you need it to do three.

What shiftfill Does

Three things. No more:

There's also a labor cost view that rolls up projected $$ based on the schedule + hourly rates. And a staff-facing page with a tokenized bookmarkable URL — no app install, no account creation. The staffer's phone does it.

Why Single-Password Auth Makes Sense Here

Every Dangercorn app uses single-password session auth (see: the template walkthrough). For a multi-user app like this, that sounds wrong — shouldn't each staffer log in?

No. The manager gets the password. The manager logs in. The staff get bookmarkable links with tokens embedded. Each staffer's page is read-only (schedule, swap offers they can accept, time-off status). This matches how these teams actually work — the manager is the one who owns the operation; staff just need to see and claim.

When you try to build per-user login for 14 hourly employees, you spend three weeks on password reset flows and you still get calls from a staffer who can't find their password. This approach works better because it removes the wrong abstraction.

The Build

Flask + SQLite, deterministic port 8452, Jinja templates, one 1,800-line Python file for the routes + model, HTMX for the swap board interactions (no React, no Alpine, no build step).

git clone https://github.com/Dangercorn-Enterprises/shiftfill.git
cd shiftfill
pip install -r requirements.txt
python app.py
# → http://localhost:8452

SMS notifications (Hosted Pro tier) go through Twilio. CSV export for payroll. PDF printable schedule for the break-room wall, because physical break rooms still exist.

Pricing

If you're a single café with 10 staff, the self-host tier is probably the right answer. If you're running 3 locations and need cross-site shift coverage, the top tier pays for itself in about a week of not-running-the-schedule-at-9-PM-on-Sundays.

The best software for hourly ops gives the manager their evenings back. Nothing else matters if that doesn't happen.

Related

shiftfill pairs with cateringpro (shift scheduling in catering), coachboard (different audience, same solo-operator philosophy), and breweryops (the taproom staff schedule still needs solving).

Repo is public at github.com/Dangercorn-Enterprises/shiftfill. If you're a restaurant manager, a café owner, or a small retail operator and you clone this and use it for a week, I'd love the feedback email.

What's On the Roadmap

Three things I'm actively working on for shiftfill, in order of priority:

Tip-pool tracking. For restaurants doing pooled tips, the math at end-of-shift is a pain. shiftfill could compute it from clock-in / clock-out times and credit-card tips entered. This is the #1 ask from beta restaurants.

Schedule template library. Right now every shop builds their own templates. A library of shared templates ("typical brunch service," "dinner-only with one closer," "retail Saturday lineup") would help new shops get started faster.

Forecasting from history. Look at last year's same week, suggest staffing levels. Most managers do this in their head; the data exists in the system, may as well surface it.

None of these change the core product. They make the existing core slightly more useful for specific shops.