People
Member accounts, profiles, friend requests, follows, direct messaging, notifications, and personal show histories.
Every file below is either a running thing you can open right now or a written account of one. No mockups, no comps, no logo walls — if it isn’t live or shipped, it isn’t here.
What we actually built
Still On Tour was designed and built as a real community product for people who follow live music — where the archive gives every interaction a meaningful place, date, band, and shared story.
Member accounts, profiles, friend requests, follows, direct messaging, notifications, and personal show histories.
Crews, show walls, conversations, member-made context, and a social graph that belongs to the community instead of an algorithm.
Trips, rides, crash-space coordination, local connection, event planning, and bands managing dates, members, booking, EPKs, and fan notes.
Blocks, reports, moderation queues, appeals, consent checks, visibility boundaries, CSRF protection, write throttles, export, and erasure.



A full social platform for a live-music community — member accounts, profiles, friend requests, direct messages, crews, show walls, trips, ride and crash-space coordination, band workspaces, and a living concert archive giving every connection a shared place and time.
Still On Tour is not a themed database or a brochure with a login. It is a custom social product built around the way music people actually move: mark the shows you attended, find friends, message directly, form a crew, plan a run, arrange a ride or crash space, talk on a show wall, and follow a band. The archive is the shared map beneath all of that. A decoupled Drupal 11 and Next.js application carries that public experience, authenticated social graph, private member activity, band portal, review workflow, and staff tools as one coherent system rather than a pile of plugins.
Accounts have profiles, friends, private messages, crews, notifications, and show-level conversation. The product makes real connection possible around a shared music life rather than chasing generic engagement metrics.
Blocks, reports, moderation queues, appeals, consent checks, write throttles, and carefully scoped visibility rules are designed into the social surfaces. Private member activity is not accidentally exposed through a public archive page.
Shows distinguish an incomplete record from no surviving tape, missing documentation, or conflicting sources. That is product design in service of historical honesty — not a blank state dressed up as certainty.
Members can propose corrections and add context; review flows keep public claims source-tracked, rate-limited, and accountable. Verified bands get a workspace for dates, an EPK, member access, booking requests, and fan notes.
The architecture separates the Next.js public experience from Drupal’s authenticated API and staff surface, applies CSRF protection and write throttles, keeps a consent gate ahead of member actions, and supports data export and erasure instead of treating privacy as a footer link.
A fleet-monitoring platform watching 327 production sites — statistical anomaly detection against each site’s own history, an archive of what the host discards, and one rule everywhere: an unchecked site must never look healthy.
Most monitoring answers "is it up?" This answers "is it behaving like itself?" — each site is measured against its own history rather than a shared threshold, so a site that has always been slow does not cry wolf and a site that just got slow cannot hide. The hard rule underneath is that silence is never treated as health: a check that did not run reports as unknown, loudly, because a dashboard that goes quiet when the collector dies is worse than no dashboard.
A monolithic Drupal 7 application with millions of nodes, rebuilt as Drupal 10 while the site kept publishing — custom migration paths, counts reconciled every run, zero records lost.
The site could not stop publishing, so the migration ran incrementally against a moving target for months. Every run reconciled its own counts and refused to advance on a mismatch, which is the only reason "zero records lost" is a statement rather than a hope. Cutover was measured in minutes.
A replacement for Drupal core’s taxonomy UI, built for vocabularies from a dozen terms to 100,000 — drag-and-drop, undo history, bulk merge and clone. Running on 90+ production sites by drupal.org’s own count.
Core’s taxonomy screen was written for a short list and falls over on a long one. This handles vocabularies three orders of magnitude larger with drag-and-drop reordering, an undo history, and bulk merge and clone — and the install count is drupal.org’s own, not ours.
Every file above started as a conversation about something that had to keep working. If you have one of those, the station takes requests — or start with a $950 site health check and find out what you actually have.