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

Open in Molecule

Try it

Opens instantly. Runs on sample data, so changes reset on reload.

Open preview in a new tab ↗View workspace ↗

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

Browse all @molecule/* packages →

Required secrets

  • DATABASE_URL PostgreSQL connection string
  • MAILGUN_API_KEY Mailgun API key
  • MAILGUN_DOMAIN Mailgun sending domain
  • STRIPE_SECRET_KEY Stripe secret API key (sk_test_... in test mode)
  • STRIPE_WEBHOOK_SECRET Stripe 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