metroGHOST
One dark animated page that links every platform an artist is on — with a full funnel and analytics stack behind it.
metroGHOST.com is an artist landing page: a single forced-dark, heavily animated page — canvas smoke, film grain, a kinetic wordmark, artwork-backed platform badges — that collects every streaming and social destination in one place. Behind it sits a complete business back end: contact/booking/sales funnels wired to Postmark, first-party cookie-less analytics with click attribution per badge, and an admin panel for leads and email. Single Go binary, SQLite, html/template, vanilla CSS/JS. Built so it can flip from unofficial fan site to official artist site by editing config, not code.
- Go 1.25
- SQLite
- html/template
- Vanilla JS
- Canvas API
- Postmark
- Apache
- systemd
- just
metroGHOST.com is a link-in-bio page that refuses to look like one. It is a single forced-dark page built as a piece of atmosphere first — an animated wordmark, a canvas smoke layer, film grain, scroll-triggered text reveals, and artwork-backed badges for every platform the artist releases on — with an inverse light mode for anyone who wants the glare.
A landing page with a business behind it
- Platform links are data. Every destination
lives in a
platforms.jsonconfig and is human-verified before it ships — no scraped or guessed URLs pointing fans at the wrong account. - Funnels behind feature flags. Contact is
live; booking and sales are fully built and wired to
Postmark, sitting dormant behind a
funnels.jsonswitch until the artist wants them. - First-party analytics. Cookie-less page views and per-badge click tracking, stored locally and surfaced in the admin dashboard. No third-party tag, no consent banner, no data leaving the box.
- Email both directions. Postmark for outbound notifications and replies, plus a secured inbound webhook that drops responses straight into the admin inbox.
How it's built
One Go binary and one SQLite
file. Rendering is html/template; the front end is
vanilla CSS and JavaScript with the smoke effect on a raw canvas.
No framework, no bundler, no node_modules, no build
pipeline — just ship runs the tests, builds, restarts
the systemd unit and health-checks it. Deployment is Apache in
front of a systemd service on a single host.
The site is a hard-diverged fork of an in-house white-label template, which is what makes the config-over-code posture possible: artist identity, genre, platform list and funnel toggles are all JSON. Flipping this from an unofficial fan site to the artist's official site is a config edit and a DNS change, not a rewrite.
Disclosure
metroGHOST.com is an unofficial fan project. It is not affiliated with or endorsed by the artist, and all trademarks, music and likenesses belong to their respective owners. It is listed here for the engineering — the animation work, the analytics and funnel stack, and the config-driven architecture — not as a client engagement.
Straight from the source
The project's own README.
Rendered in place — every link, image, and code block carried over from the repo. The page below is what a contributor would see opening the project for the first time.
metroGHOST.com
Unofficial fan site for the artist metroGHOST — a single dark, animated landing page linking every platform the artist is on, with a full admin panel (leads, email, analytics) behind it. Built so it can flip from fan site to official artist site by changing config, not code.
Single Go binary, SQLite, html/template, vanilla CSS/JS. No frameworks, no build pipeline. Derived from an in-house white-label template and heavily diverged.
Live: https://metroghost.com
Highlights
- Landing page — forced-dark artistic single page: animated wordmark, canvas smoke, film grain, scroll/text animations, artwork-backed platform badges, inverse light-mode toggle.
- Platform links — data-driven from
config/platforms.json; human-verified links only. - Funnels — contact modal live; booking + sales built and wired to
Postmark, hidden behind
config/funnels.jsonflags. - Analytics — first-party, cookie-less page views + badge click tracking, dashboard in the admin panel.
- Email — Postmark outbound (notifications, replies) and secured inbound webhook into the admin inbox.
Docs
Start at docs/quick-start.md. Per-feature docs in docs/feature/. Fork history, research, and platform verification in docs/metroghost/.
Commands
just # list all recipes
just dev # run locally with race detector
just ship # test + build + restart service + health check
just check # tests + lint + brand scrub gate
Disclosure
Unofficial fan project. Not affiliated with or endorsed by the artist. All trademarks, music, and likenesses belong to their respective owners.
Build something like this
Want a tool like this for your shop?
We've shipped this kind of thing before. Twenty-minute intro call, no slides.