All projects

Platform2025

Community Platform

A single platform where a residential religious community manages its shared daily life: booking the community cars, signing up for the Sunday meal, publishing the weekly bulletin, and sending maintenance requests.

Freelance - conception, developpement full-stack et deploiement

Member dashboard showing the next Sunday meal, today's menu, community stats, the weekly bulletin summary and upcoming activities.
Member dashboard showing the next Sunday meal, today's menu, community stats, the weekly bulletin summary and upcoming activities.

The community runs on shared resources: a handful of vehicles, a Sunday meal, a weekly bulletin, common areas that need upkeep. All of it used to be coordinated by email and a paper logbook, which meant double bookings, missed sign-ups, and information that reached some members and not others. Community Platform brings these flows into one web application, accessible to every member, with a role system that separates ordinary members from the people who administer vehicles, meals, and communication. It has been in production since December 2025.

The problem

Reserving a community car meant sending an email or writing in a notebook, with no shared view of who had which vehicle when, so two people would regularly show up for the same car. Sunday meal sign-ups were collected by hand and easy to lose. The weekly bulletin was assembled and circulated manually, and maintenance issues in the common areas were reported verbally and forgotten.

The approach

I mapped the four recurring flows (vehicles, meals, bulletin, maintenance) and built them as modules on a single Laravel application with one login and one role model. The vehicle planner is the core: a shared grid showing every car by hour, refreshed on its own, where booking a slot takes one click and the system refuses a slot that is already taken. Recurring chores, such as opening the next four Sunday meals and closing sign-ups on Saturday evening, run on their own on a schedule so no one has to remember them.

The result

  • The community has been running its vehicles, meals, bulletin, and maintenance requests through the platform since December 2025.
  • Car bookings now sit in one shared planner that everyone sees instead of scattered emails, and the system blocks a double booking at the moment it happens.
  • Sunday meal sign-ups and the weekly bulletin are handled in the app, so the information is the same for everyone and nothing is retyped.
  • Maintenance requests are tracked from submission to resolution, with a status and an assignee, instead of being reported verbally.

Key features

  • Shared vehicle planner: hour-by-hour grid of every community car that refreshes on its own, one click to book or cancel a slot, with a clear view of what is free, taken by someone else, or yours.
  • No double bookings: the system refuses a slot that has just been taken by another member, even when two people try at the same time.
  • Access by role: each member profile (for example health, formation, driver) can only book the vehicle categories it is allowed to use.
  • Sunday meals: the next four Sundays open automatically, members register themselves and their guests, and sign-ups close on Saturday evening on their own.
  • Weekly bulletin: editable edition with weekly duties, activities, spiritual reflections, and the week's birthdays computed automatically; publish in one action, read by every member.
  • Week menu: lunch and dinner for each day of the week, editable in place, with today's menu shown on the home screen.
  • Maintenance and purchase requests: a short form for any repair or purchase, then an admin queue with status, notes, and an assignee; the requester is emailed when the status changes.
  • Membership requests: people outside the platform ask for an account through a public form; an administrator approves it and the account is created.
  • Email that never blocks the app: if a notification fails to send, the action still goes through and the failure is logged for an administrator to review.
Engineering — Architecture, decisions and trade-offs

Architecture

Community Platform is a single Laravel 10 application (PHP 8, MySQL) serving server-rendered Blade pages, deployed as one unit. Authentication is session based; authorization uses a custom role model stored as a JSON column on the user, checked by middleware, with four platform roles (admin, communication, member, other) kept separate from the member's functional profile, which is what governs vehicle access. Business logic that does not belong in controllers lives in dedicated services (Sunday meals, birthdays, notifications, QR codes). The vehicle planner keeps its grid current through a small self-hosted polling API, which is what production runs on; a Laravel Echo and Pusher broadcasting layer is wired in for instant push and can be enabled without touching the pages, and every broadcast call is wrapped so a real-time failure never breaks the underlying reservation. Recurring work runs through the Laravel scheduler: three maintenance commands (generate upcoming meals, close sign-ups, purge old notifications) plus a database-backed queue worker that the scheduler restarts every minute, which removes the need for a long-running worker process on the server. Outgoing email goes through a wrapper that catches every send failure, records it in a dedicated table, and lets the request complete.

Engineering challenges

  • Two members booking the same car at the same second. Checking availability and then inserting a reservation is a race. I wrapped the booking in a transaction with a row lock on the vehicle and added a unique database index on the active slot, so the second write is rejected by the database itself and the user gets a clear "just taken" message instead of a silent overlap.
  • The planner flashed on every refresh. The grid was re-fetched and re-rendered on a timer, which made it blink. I centralised data fetching into one source of truth that updates the grid in place, so a new booking appears without the whole table redrawing.
  • Keeping the grid current without depending on a real-time service. Pusher adds an external dependency that is not guaranteed on site, so production runs the planner on a self-hosted polling API; the Echo/Pusher layer stays in the codebase as an opt-in, and every broadcast call is wrapped so a real-time failure never breaks the underlying reservation.
  • Chores that depend on a person remembering them. Opening the next meals and closing sign-ups were manual. Moving them into scheduled artisan commands, plus running the queue from the scheduler, made the recurring side of the app self-sufficient.

Technical decisions

  • Custom JSON role column over a full permissions package. The community has a small, stable set of roles. A JSON roles column on the user with a middleware check covers it without the schema and query overhead of a general permissions library, and keeps platform roles cleanly separate from the functional profile that drives vehicle access.
  • Server-rendered Blade over a separate front-end. One developer, one deploy target, an audience that mostly needs forms and lists. Blade with a light sprinkle of JavaScript on the planner ships faster and is far simpler to host and hand over than an API plus a single-page app.
  • Polling in production over a hosted real-time service. The planner needs to reflect other people's bookings within a few seconds, not within milliseconds. A self-hosted polling endpoint delivers that with no third-party account, no extra cost, and nothing to break; the Echo/Pusher path is kept ready for the day sub-second updates are worth the dependency.
  • Database queue and scheduler-driven worker over a dedicated queue service. Email is sent asynchronously so a slow SMTP server never blocks a member, but running the worker from the scheduler avoids adding a supervised process (or a Redis dependency) to a modest server.

Stack

  • Laravel 10
  • PHP 8
  • MySQL
  • Blade
  • JavaScript
  • Laravel Sanctum
  • DomPDF
  • Taches planifiees (cron)
  • File d'attente base de donnees
  • Laravel Echo + Pusher (temps reel, optionnel)

Freelance - conception, developpement full-stack et deploiement — Une communaute religieuse residentielle (anonymise) (2025)

Next projectAlouwato