All projects

Web app2026

Cape Coast Logbook

A one-page site and a small self-service admin that turn a 16-week study program abroad into a shared logbook for a 32-student West African cohort.

Solo project: concept, design, development, deployment

Homepage hero of the Cape Coast Logbook: large title 'Le carnet de notre séjour à Cape Coast' over a photo of Cape Coast Castle, counters for 32 students, 8 countries, 16 weeks, 1 festival, and an animated ribbon of West African flags.
Homepage hero of the Cape Coast Logbook: large title 'Le carnet de notre séjour à Cape Coast' over a photo of Cape Coast Castle, counters for 32 students, 8 countries, 16 weeks, 1 festival, and an animated ribbon of West African flags.

WASCAL Cape Coast brings together 32 French-speaking students from 8 West African countries for a 16-week English immersion program at Cape Coast, Ghana. The site is the cohort's single reference point: a one-page story of the program (why it exists, the English Club, the activities, the eight country nights) and a running logbook of what the group actually lived, week by week. A short survey collected everyone's housing, English level, activity preferences and talents so organizers could form activity groups and plan the country-night rotation. A password-protected admin lets the English Club keep the logbook, the photo galleries and the survey up to date without touching code. It runs in production on plain shared hosting, with no build step and no server to maintain.

The problem

A new cohort arrives in Cape Coast every year with nothing to hold the experience together: no shared calendar, no place to see who is in the group, no record of what happened. Information lives in scattered chat messages and gets lost as the weeks pass. Organizers also had no structured picture of the group to build activities and the country nights around.

The approach

I built a single-page site that tells the program's story and doubles as a living logbook, backed by a small admin the English Club runs themselves. The hosting was fixed in advance to basic shared hosting with no Node and no VPS, so I rewrote an earlier Node prototype as a Laravel app and kept the frontend as plain HTML, CSS and JavaScript with no build step. The survey, the galleries and the timeline are all editable from the admin, so the site stays current without a developer.

The result

  • The cohort has one address for the whole program instead of scattered messages.
  • All 32 students answered the survey, giving organizers a complete picture to form activity groups and schedule the eight country nights.
  • The English Club updates the logbook, galleries and survey themselves, with no developer in the loop.
  • Runs in production on shared hosting, with no build pipeline and no recurring server cost.

Key features

  • One-page story of the program: the English Club, the four activity families, the eight country nights, the closing festival.
  • Running logbook: the stay told stage by stage, in the order it happened, written by the English Club.
  • Photo galleries by theme, each with a link to the activity's full-resolution Drive album.
  • Group survey: housing, English level, activity preferences and talents, in a four-step form, with a switch to open or close it.
  • Self-service admin: the English Club edits the logbook, the galleries and the survey, and exports responses as CSV, all behind one password.
  • Works on any basic hosting: no build, no Node, no server to maintain.
  • West African visual identity: kente-inspired palette, animated flag ribbon, motion that respects reduced-motion settings.
Engineering — Architecture, decisions and trade-offs

Architecture

The frontend is three static HTML pages served as files by Laravel, sharing one CSS file and one ES-module JavaScript file at the web root, with no bundler anywhere. The Laravel backend exposes a small JSON API (survey, galleries, journey stages, admin) and a single session-based super-admin role guarded by one password. Content editable by the English Club lives in the database (journey_stages, gallery_albums, gallery_photos, key-value settings); server-side reference data and validation rules live in one config file mirrored by the frontend's shared module. MySQL in production, SQLite in development, with SQL kept portable between the two. A root .htaccess rewrites every request into Laravel's public/ directory while blocking source and secrets, so the whole repository can be uploaded to a shared host where the web root is the repo root.

Engineering challenges

  • Imposed hosting with no Node. The target was basic shared hosting: no VPS, no Node process, no build server. I rewrote the original Node/Fastify prototype as Laravel and froze the API URLs to match the old ones exactly, so the existing vanilla frontend kept working without a single change.
  • No build step, on purpose. Pages carry inline JavaScript, which collides with Blade's {{ }} syntax, so they are served as raw files rather than compiled templates. Shared assets are plain files at fixed paths.
  • The program reorganized mid-project. An earlier version had a full committee system (per-committee access codes, manual balancing, a printable rotation PDF). When the program dropped committees, I removed that whole layer through migrations and replaced it with a simpler chronological logbook.

Technical decisions

  • Laravel over keeping Node. The hosting could not run Node, so a PHP framework on shared hosting with MySQL was the only path that fit the constraint without renting a server.
  • API-contract parity as the migration strategy. Rewriting the server while keeping the exact same API URLs and validation messages meant the frontend never had to be re-tested or re-shipped.
  • Database-backed content over redeploys. The logbook, galleries and survey switch are all editable from the admin, because the people who keep the site current are the English Club, not a developer.
  • SQLite in dev, MySQL in prod. Same schema through Eloquent migrations, no engine-specific SQL, so local work needs zero setup and production stays on the host's MySQL.

Stack

  • Laravel 13
  • PHP 8.3
  • MySQL
  • SQLite
  • JavaScript (vanilla)
  • HTML/CSS
  • Apache / .htaccess

Solo project: concept, design, development, deployment — Personal project, built for the WASCAL Cape Coast 2026 cohort (which I was part of) (2026)

Next projectOrgaAfrica back-office