mush. / architecture

The same build, every time.

Every tool on the projects page links here for the same reason: none of them started from a blank sheet. Whatever stage a tool is at — idea, prototype, in progress, beta or live — it was built to the standard below, not to whatever seemed fastest that week. This page is that standard, not a claim specific to any one tool.

The stack

One stack, not a different framework per idea.

A tool I’ve never opened in six months should still make sense the day I do.

Backend

  • PHP 8.3+
  • Symfony 7 (LTS)
  • Doctrine ORM
  • MySQL

Frontend

  • Twig
  • Bootstrap 5.3
  • Stimulus & Turbo
  • AssetMapper — no Node build step

Hosting & delivery

  • Apache on Linux
  • Symlink-swapped atomic releases
  • Cron-driven background work
  • CI gate on the full QA suite

Quality gates

  • PHPStan, level 8
  • WCAG 2.2 AA, checked at three widths
  • Automated tests before merge
  • Accessibility & security review before release

What doesn’t change between them

A short list, held to on every one of these, not just the ones someone happens to be watching.

  • Tenancy and ownership scoping live in the database query, never trusted from a controller, a request parameter, or a hidden form field.
  • Every privileged or financial action writes an audit entry with a before and an after, not just who, what and when.
  • Admin and platform-operator accounts need a second factor. Offered isn’t the same as required.
  • Money is a decimal, never a float.
  • WCAG 2.2 AA is the floor, checked with a keyboard and a screen reader, not read off a Lighthouse score.
  • Every layout is checked at phone, tablet and desktop width. Tablet is the one that usually breaks.
  • Fonts are self-hosted. Nothing calls out to a third party while someone’s using the tool.
  • First admin accounts are created from the command line. No web route ever creates one.
  • A release is a symlink swap onto a fresh directory, never a git pull against the live one.
  • The full test suite passes before anything merges. A red pipeline doesn’t ship.

One shell, every tool

Different colours. Same four rooms.

Every application shares the same four screens, restyled in that tool’s own accent rather than rebuilt from scratch: a sign-in screen with the pitch on one side and only the form on the other, an app shell with permanent navigation and an account menu that’s always in the same place, a plain-language error page, and a notice screen for everything in between. Open two of these tools side by side and the second one should feel familiar within a few seconds — styled differently, built the same.

Status, always current

The badge on the card and the banner inside the tool say the same thing.

Every tool carries a small banner naming its own build stage, in the same five words used on the projects page — nobody has to take a card’s word for it once they’re inside. The banner comes down on its own the day a tool genuinely reaches Live; until then, it stays, even if that means admitting a tool linked here is still Beta.

  • Idea
  • Prototype
  • In progress
  • Beta
  • Live

Back to everything I’m building, or the full site for who I am and how to get in touch.