Shift Scheduling
Business & SaaS · React + Node (Express) · 12 @molecule/* packages
When I Work-like shift scheduling with weekly rosters, availability windows, swap/drop approvals, open-shift claiming, and timesheet export — with built-in Stripe-backed subscription tiers
Try it
Opens instantly. Runs on sample data, so changes reset on reload.
What is inside
Screens (14)
- Login
/login - Signup
/signup - ForgotPassword
/forgot-password - ResetPassword
/reset-password - Landing
/ - Dashboard
/dashboard(signed in) - Schedule
/schedule(signed in) - ShiftDetail
/shifts/:id(signed in) - OpenShifts
/open-shifts(signed in) - SwapRequests
/swap-requests(signed in) - Availability
/availability(signed in) - Staff
/staff(signed in) - Timesheets
/timesheets(signed in) - Settings
/settings(signed in)
Data model (10 tables)
- activities — id, actorId, action, resourceType, resourceId, metadata, createdAt
- activity_seen_status — userId, lastSeenActivityId, updatedAt
- audit_events — id, user_id, actor_id, table_name, record_id, action, before, after, …
- availabilities — id, user_id, staff_id, weekday, start_time, end_time, created_at, updated_at, …
- blackout_dates — id, user_id, staff_id, date, reason, created_at, updated_at, updatedAt
- claims — id, user_id, shift_id, staff_id, status, reviewed_by, reviewed_at, created_at, …
- devices — id, createdAt, updatedAt, userId, name, pushPlatform, pushSubscription, hasPushSubscription
- shifts — id, user_id, staff_id, role, starts_at, ends_at, published, notes, …
- staff — id, user_id, first_name, last_name, email, phone, role, max_weekly_hours, …
- swap_requests — id, user_id, kind, from_shift, requester_staff_id, target_staff_id, status, note, …
API (13 handlers)
- \_decorate
api/src/handlers/_decorate.ts - \_seed
api/src/handlers/_seed.ts - audit
api/src/handlers/audit.ts - availabilities
api/src/handlers/availabilities.ts - claims
api/src/handlers/claims.ts - dashboard
api/src/handlers/dashboard.ts - open-shifts
api/src/handlers/open-shifts.ts - profile
api/src/handlers/profile.ts - reset-password
api/src/handlers/reset-password.ts - shifts
api/src/handlers/shifts.ts - staff
api/src/handlers/staff.ts - swap-requests
api/src/handlers/swap-requests.ts - timesheets
api/src/handlers/timesheets.ts
Subscription tiers
free / pro / team — gated by: maxStaff, maxWeeklyShifts, advancedFeatures, canExport, retentionDays
Built from 12 @molecule/* packages
@molecule/api-audit-database@molecule/api-database-postgresql@molecule/api-email-templates@molecule/api-emails-mailgun@molecule/api-entitlements@molecule/api-payments-stripe@molecule/api-permissions-custom@molecule/api-resource-payment@molecule/api-resource-user@molecule/app-billing-react@molecule/app-command-palette@molecule/app-kpi-card-react
Required secrets
DATABASE_URLPostgreSQL connection stringMAILGUN_API_KEYMailgun API keyMAILGUN_DOMAINMailgun sending domainSTRIPE_SECRET_KEYStripe secret API key (sk_test_... in test mode)STRIPE_WEBHOOK_SECRETStripe webhook signing secret (whsec_...)
The @molecule/* packages are Apache-2.0. The app you build from this template is yours to export and self-host. Licensing