Caleb World
Music artist platform — dark, mobile-first, single-binary, ready to grow into a player + uploads.
Caleb World is the artist site for an electronic producer — dark-themed public pages, contact + lead capture, admin panel for replying through Postmark, and the bones for music uploads and an in-page player when the catalog goes live. Built on the same single-Go-binary pattern as the rest of the small-operator fleet: SQLite, systemd, Let's Encrypt, no frameworks, deploys in seconds.
- Go
- SQLite
- Postmark
- systemd
- Apache
- Let's Encrypt
Caleb World is the artist site for an electronic producer working out of St. Petersburg, Florida — dark theming, mobile-first layout, gear-and-skyline imagery, and the small-operator admin pattern underneath. The shape on the public side is "music. vibes. world."; the shape on the back side is one Go binary, SQLite, and a Postmark inbox that lets the artist actually reply to people.
What's there now
- Releases page — singles, EPs, albums laid out for both fans and label / sync-licensing scouts.
- About + contact — bio plus a contact form that lands in the admin panel, not in someone's inbox to get lost.
- Visual identity — Maschine hardware shots, live-performance imagery, Sunshine Skyway hero. The art carries the brand; the copy stays out of the way.
- SEO surface — structured data, sitemap, Open Graph tags so a shared link on socials renders the cover art instead of a generic preview.
What's wired but waiting
The bones for music uploads and an in-page player are in the repo — schema slots for tracks and releases, admin upload flow, and a player UI behind a feature flag. Catalog publishing flips on when the artist is ready; the infrastructure doesn't need a rewrite to get there.
Why a single Go binary
Artist sites don't need a CMS, and a CMS would just become something that breaks the night before a release. One binary, one database file, one systemd unit, deploys are pull-rebuild-restart. Fast on phones at venues, cheap to host, survives whatever the public internet throws at a sub-200kb page.
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.
Caleb World
Music artist platform for caleb-world.com. Built with Go, featuring a dark-themed public website, admin panel for managing contacts and email, and infrastructure for future music upload and player features.
Features
Public Website
- Dark, music-focused design with custom theme
- Responsive, mobile-first layout
- Music/releases page, about page, contact form
- SEO optimized with structured data, sitemap, Open Graph tags
Admin Panel
- Lead/contact management with status tracking
- Inbound/outbound email via Postmark
- Settings management
- Trash and restore
Infrastructure
- Single Go binary (~2MB), no external dependencies
- SQLite database with WAL mode
- systemd service with auto-restart
- SSL via Let's Encrypt
- Rate limiting and spam protection
Quick Start
# Build
make build
# Run locally
make run
# Deploy (after editing .env)
make restart
Configuration
Copy .env.example to .env and customize. All branding, colors, and content are environment-driven.
Postmark Email
Outbound and inbound email are handled via Postmark. Configure in .env:
POSTMARK_TOKEN— Postmark server API tokenPOSTMARK_FROM— verified Sender Signature (e.g.[email protected])
Inbound webhook URL (paste into Postmark → Servers → your server → Inbound Stream → Webhook URL):
- With Basic Auth (recommended, and what prod is configured with):
https://<POSTMARK_WEBHOOK_USER>:<POSTMARK_WEBHOOK_PASS>@caleb-world.com/webhook/inbound - Without Basic Auth (only if
POSTMARK_WEBHOOK_USER/POSTMARK_WEBHOOK_PASSare empty):https://caleb-world.com/webhook/inbound
The /webhook/inbound path is hardcoded in the Go binary (cmd/main.go routing → webhook.InboundHandler) and will not change unless explicitly edited and redeployed. When POSTMARK_WEBHOOK_USER and POSTMARK_WEBHOOK_PASS are both set in .env, the handler rejects any request without matching Authorization: Basic credentials (constant-time comparison). Inbound emails are stored in the inbound_emails table and optionally forwarded to addresses configured in the admin Settings page.
Rotating webhook credentials: update POSTMARK_WEBHOOK_USER/POSTMARK_WEBHOOK_PASS in .env, run make restart, AND update the URL configured in the Postmark dashboard. All three must stay in sync or inbound email will 401.
Tech Stack
- Backend: Go 1.24 (stdlib only) + SQLite
- Frontend: HTML templates, vanilla CSS/JS, Lucide icons
- Email: Postmark API
- Server: systemd + Apache reverse proxy + Let's Encrypt SSL
Planned
- Music upload and management system
- Audio player/playlist (Winamp-inspired UI)
- Song streaming and downloads
- Social media integrations
- Event/show listings
License
MIT
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.