A white-label, multi-tenant member directory platform. One iOS app, one admin console, one branded experience per organization. Built end-to-end — iOS, web, backend, billing, ops.
MemberDex started from watching organizations — HOAs, faith groups, chambers of commerce, professional networks — struggle with simple "who's in the group?" problems that didn't justify enterprise software. The result is a single white-label SaaS: members get a branded native iOS app with their org's logo and color palette, admins get a web console for member lifecycle, custom fields, billing, and audit, and everything runs from one App Store binary that picks the right org at runtime.
It's a small, sharp full-stack project: native Swift 6 client, React 19 admin SPA, Go backend with embedded SQLite, Stripe billing, Caddy + Hetzner ops. Built solo, end-to-end, and deliberately portable.
Row-level org isolation. One App Store binary serves every community. Super-admin can browse cross-org for support without leaving the app.
Logo upload with live preview, accent palette, community page editing, category chips. The app feels native to each organization.
Standard fields out of the box, or per-org custom field sets — chambers track different things than HOAs. Drag-and-drop reorder, bulk apply.
CSV import with drag-and-drop preview before commit. Invite tracking, last-login visibility, soft deactivation, tombstone messaging for removed users.
Email + password with HIBP breach check on signup, per-account TOTP 2FA, JWT access + DB-backed refresh with atomic rotation, rate limiting, public-key cert pinning in release builds.
Login, invite, admin, backup, restore, and billing events recorded per-org. Searchable, exportable, retained.
One-click archive download, atomic restore upload. Org admins control their own data.
Tiered subscriptions, setup fees, invoice items, webhooks. Self-service plan selection. Billing-aware feature gating.
Member rosters cached on device. Tap-to-call, tap-to-email, tap-to-map work without a connection. No tracking, no third-party SDKs.
Single-box production shape: one Hetzner VPS running Caddy as the TLS-terminating reverse proxy, the Go API
(memberdexd) as a static binary, and SQLite (WAL mode) as the database. The admin SPA builds to
static assets and is served same-origin behind Caddy — no CORS, no auth split-brain. The marketing site lives
separately on Cloudflare Pages.
async/await, URLSession — no third-party HTTP libsAPIPinningDelegategolang-jwt, bcrypt, uuidstripe-go/v82verify_local.sh gatedeploy_production.sh with safety checksiOS appearance setting (Light/Dark/System), splash scheme polish, cert pinning verification, App Store rejection log management. Pre-1.0 launch maturity work.
Cloudflare Turnstile + tightened rate limits + suspicious-message heuristics on contact and registration endpoints. Inbound message filtering in admin.
Admin can drop a CSV, see a row-by-row preview, reorder/map fields, then commit. Same drag-and-drop pattern used for field reordering.
Effective-price detail, plan tier overrides, setup-fee management. Self-service plan selection from the org admin side.
Soft-delete pattern for org logos with restore/permanent-delete affordances. Live brand preview during upload.