ConCrew

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.

Today Saturday
482Hours logged
61Confirmed
4Pending
Registration 9:00 – 1:00 Confirmed
Setup Crew 7:00 – 11:00 Pending
Info Booth 1:00 – 5:00 Confirmed

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 the source on GitHub →

— 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