Open source · self-hosted · MIT licensed
Volunteer scheduling that isn't a spreadsheet.
ConCrew tracks hours, staffs the shift calendar, and manages reward fulfillment for volunteer teams — one login, four permission levels, and a single source of truth for who worked what.
Runs on Flask + SQLite (or Postgres) — docker compose up and you're live.
Feature tour
Everything a shift lead actually needs
Not a generic scheduling suite with volunteers bolted on — every screen was built around a specific job someone does at check-in or the department huddle.
Calendar
Shift slots, not a shared doc
Admins and department leads post shifts by date, time, and capacity. Volunteers request the ones they're eligible for; staff approve or deny with one click, and the calendar shows who's confirmed at a glance.
Availability
Drag to say "I'm around"
Click-and-drag — or touch-and-drag on mobile — across a day/time grid to mark general availability. Informational for staff, no approval required.
Eligibility
No open-shift free-for-all
Volunteers only see shifts for departments they've been approved for — enforced server-side, not just hidden in the page.
Check-in
A QR code that logs hours
Every volunteer gets an auto-generated usercode and QR. Scanning it opens a pre-filled hour-log form — built for a check-in table, not a laptop.
Rewards
Search, don't scroll
Staff search a volunteer by name or usercode, see exactly what they're owed, and mark it fulfilled on the spot.
History
Every decision, on record
A searchable log of hour approvals, rejections, reward fulfillments, and shift decisions — filterable by staff name, detail, or action type.
Users
Kiosk logins, safe deletes
Shared check-in stations get auto-generated usernames with no email required. Accounts with real history get deactivated, never silently deleted — records stay intact.
Access levels
Four roles, scoped to what they need
Everyone signs in through the same login. What they can touch depends on the role they're given.
ADMIN
Everything: manage users, departments, and tiers; approve or reject any hours; fulfill or unfulfill any claim; export CSV; run the calendar.
ASSIGNER
Logs and approves hours for their own department(s), sees their roster, fulfills claims, manages calendar slots for what they run.
CONSTORE
Pulls up the claims matrix and marks items fulfilled at the reward table — no hour-logging access needed or granted.
VOLUNTEER
Sees their own hours, tier progress, reward checklist, profile, QR code, and the shift calendar they're eligible for.
Reward tiers
A tier system that's yours to define
ConCrew doesn't ship with fixed rewards or hour thresholds — your organization sets both. Here's what the system itself handles.
Unlimited tiers
Define as many hour thresholds as your program needs, each unlocking its own set of rewards.
Cascading unlocks
Every tier automatically includes everything below it — nobody re-earns what they already have.
Synced on approval
The moment hours are approved, newly-eligible rewards land on the volunteer's checklist — no batch job.
Search-first fulfillment
Staff pull up a volunteer by name or usercode, see exactly what's owed, and check it off at the table.
Hours ≠ claims
Logged time and reward eligibility are separate records, so approving hours and handing out a reward stay independently auditable.
Single signoff, admin-only undo
Any admin, assigner, or constore can mark a reward fulfilled. Only an admin can undo it — no accidental or malicious un-signing at the table.
Records don't silently vanish
Deletes are blocked for any account with hours, claims, or history attached. Deactivate instead — the trail stays intact.
Self-hosted, your data
Runs anywhere Docker does
Flask and SQLAlchemy underneath, SQLite out of the box. Point DATABASE_URL at Postgres later and nothing else has to change.
- First launch walks straight into a setup wizard — organization name, dates, and the first admin account, done once.
- No SaaS lock-in — the database lives in a local volume and survives rebuilds.
- MIT licensed — read it, fork it, run it behind your own reverse proxy.
— get running —
# clone it git clone https://github.com/FolfyDev/ConCrew.git cd ConCrew # first run cp .env.example .env docker compose up --build # migrate + seed, once docker compose exec web flask db upgrade