Back to Portfolio

Legion Post Platform

Multi-tenant SaaS — public Hugo website + SMS CRM for American Legion posts, provisioned from a single YAML spec

Live Platform — first tenant in production
Visit legionpostwebsites.com
legionpostwebsites.com
Legion Post Websites sales site homepage screenshot

Overview

Legion Post Platform is a multi-tenant SaaS that gives American Legion posts a fast, accessible public website and a built-in SMS reminder CRM — provisioned from a single YAML spec. Each post gets its own isolated environment: a Hugo static site on a custom domain, a containerized Go CRM backed by SQLite, and a dedicated Twilio number for member communications. The platform targets the ~12,000 U.S. Legion posts currently underserved by dated, expensive site vendors.

The CRM and website are tightly integrated: officers, event schedules, photo galleries, roster, and prose pages are all authored in the CRM and served to the public site through JSON APIs consumed at build time. Posts manage their entire web presence through the CRM's self-service dashboard — no technical knowledge required.

Live
First Tenant In Production
~12k
U.S. Posts Targeted
~38 MB
Single-Binary CRM
Go + Hugo
Core Stack

Tech Stack

A lean, single-binary CRM paired with Hugo static sites — every tenant isolated at the process boundary, not behind a shared database flag.

Go 1.23
CRM backend — stdlib net/http, 1.22 routing
Hugo
Per-post static public site
SQLite
modernc.org/sqlite — no CGO, per-tenant volume
Docker + Caddy
Process-level isolation; automatic TLS per domain
Twilio
Per-tenant subaccount — SMS CRM + TCPA opt-in
Square
Annual subscription billing + hosted checkout
GitHub Actions + GHCR
CI/CD — image tagged latest + sha; rsync deploy
osh-vps
Self-hosted on HTS VPS
Architecture Highlight

Multi-tenancy is enforced at the process boundary, not with a tenant_id column. Each post runs its own Docker container drawn from a shared GHCR image, with its own named-volume SQLite database, secrets file, Caddy block, and Twilio subaccount. A one-call provision CLI reads a client YAML spec and emits the full per-tenant environment — Hugo config, CRM container compose, Caddy routes, and an admin password — leaving a CHECKLIST.md for the remaining manual steps.

Key Features

A complete platform: provisioning tooling, a self-service CRM, TCPA-regulated messaging, and subscription billing.

Turnkey Provisioning

  • One provision CLI call from a client YAML spec
  • Emits Hugo config, CRM compose, Caddy routes, and admin password
  • CHECKLIST.md for remaining manual steps
  • Scales to many tenants with no per-client code changes
🌐

Hugo Public Website

  • Shared theme with per-post branding (colors, hero, meeting info)
  • schema.org markup and calendar feeds generated per post
  • Builds cleanly from CRM-served JSON API feeds
  • Content changes go live without any deployment step
📱

SMS CRM with TCPA Opt-In

  • Double opt-in SMS enrollment flow
  • STOP / UNSUBSCRIBE and all standard opt-out keywords honored immediately
  • Every inbound and outbound message audit-logged
  • Per-tenant Twilio subaccount — no number sharing between posts
🔔

Event Reminder Broadcasts

  • Admin selects an event from the site's events feed
  • SMS reminder to all opted-in members in one click
  • Quiet-hours guard (9 AM–9 PM in the post's timezone)
  • Send log with delivery timestamps

Full Self-Service Content Editing

  • Events, roster, photo gallery (albums + WebP), post identity/contact
  • CRM-authored prose pages rendered on the public site
  • No deployment step required — content publishes automatically
  • Designed for non-technical post officers
💳

Square Billing Integration

  • Annual subscription plans (website + SMS CRM add-on)
  • billing CLI manages plans and generates Square-hosted checkout links
  • Ready to send to a new post in one command
  • Scoped to Legion plans within the shared HTS Square account

Screenshots

Public-facing screens captured from the live platform. Admin dashboard screenshots pending Darrell's login credentials.

legionpostwebsites.com/get-started.html
Legion Post Websites onboarding / get-started page

Public onboarding wizard — intake form for a new post

legion-preview.howarth.tech
Legion Post public website staging preview

Staging preview of Post 5's public Hugo-built website

Technical Highlights

The engineering decisions that make this a maintainable, scalable multi-tenant platform rather than a collection of one-off deployments.

📦

Single-Binary CRM with Embedded Assets

The Go CRM compiles to a single ~38 MB binary with all templates, database migrations, and static assets embedded at compile time using Go's embed package. The runtime artifact is one binary plus one SQLite file — no CGO, using modernc.org/sqlite. Deployments are a container pull and restart.

🔒

Process-Level Tenant Isolation

There is no tenant_id column and no shared database. Each post runs its own Docker container from a shared GHCR image, with a dedicated named-volume SQLite DB, secrets file, Caddy block, and Twilio subaccount. A misconfigured row cannot leak data between posts because their processes never share memory or disk.

🔑

HMAC-Signed Session Cookies

No session table and no Redis. Session state is carried in an HMAC-signed cookie validated on every request — the CRM stays stateless-friendly while remaining secure, with no external cache dependency to operate or scale.

📄

CRM → Site Wiring via JSON APIs

The CRM exposes public endpoints (/api/gallery.json, /events/events.json, etc.) that Hugo consumes at build time. An officer edits content in the CRM; the CI/CD pipeline (push-to-main → rsync) rebuilds and deploys the static site without any further manual step.

📡

TCPA-Compliant SMS with Audit Log

Members enroll through a double opt-in SMS flow. All standard opt-out keywords (STOP, UNSUBSCRIBE, CANCEL, END, QUIT) are honored immediately via Twilio webhook. Every inbound and outbound message — including opt-out confirmations — is audit-logged, giving each post a complete, time-stamped message record.

🚀

CI/CD Live on First Tenant

GitHub Actions publishes the CRM image to GHCR on every push to main — tagged latest plus sha-<short> and semver on git tags. The static Hugo site deploys via rsync on push. The full pipeline was operational from the first tenant deployment, not retrofitted later.

What This Project Demonstrates

Scoping, architecting, and shipping a multi-tenant SaaS from the ground up — not just a website, but a complete platform.

📦
Disciplined Go Backend
Embedded assets, no-CGO SQLite, stdlib routing — a maintainable single-binary service
🔒
Process-Level Multi-Tenancy
Isolation at the container boundary — no tenant_id columns, no shared-data risk
📡
TCPA-Regulated SMS
Double opt-in, immediate opt-out handling, and a full audit log — production-grade compliance
Provisioning Tooling
One CLI call stands up a fully configured tenant environment from a YAML spec
💳
Subscription Billing
Square annual plans and hosted checkout links managed by a dedicated billing CLI
🚀
Automated CI/CD
Container image publishing to GHCR + rsync site deploy, live from the first tenant

Want a platform like this built?

Legion Post Platform shows what it looks like when we scope and ship a multi-tenant SaaS end to end — provisioning tooling, a production Go backend, TCPA-regulated messaging, and a billing integration. If you have a product idea that needs the same treatment, let's talk.

Get In Touch Visit the Platform

Frequently asked questions

What is Legion Post Platform built with?

Go 1.23 (single binary, embedded assets, stdlib net/http), Hugo for per-post static public sites, SQLite via modernc.org/sqlite (no CGO), Docker, Caddy, Twilio, and Square — self-hosted on an HTS VPS.

How does Legion Post Platform handle multi-tenant isolation?

Each Legion post runs its own Docker container from a shared GHCR image, with a dedicated named-volume SQLite database, secrets file, Caddy block, and Twilio subaccount. There is no shared database and no tenant_id column — isolation is enforced at the process boundary.

Can you build a multi-tenant SaaS or provisioning platform for my business?

Yes — multi-tenant architecture, provisioning tooling, and Go backends are within our scope. See our software development service to start a project.

Related services & work

Want something like this built?

Tell us what you have in mind and we'll come back with an approach and a flat quote — no obligation.

Get a free quote See more work