/ home  ›  apps  ›  memberdex
MemberDex app icon

MemberDex

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.

One platform. Many communities.

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.

What it does.

🏛️

Multi-Tenant by Design

Row-level org isolation. One App Store binary serves every community. Super-admin can browse cross-org for support without leaving the app.

🎨

Per-Org Branding

Logo upload with live preview, accent palette, community page editing, category chips. The app feels native to each organization.

🧩

Custom Field Templates

Standard fields out of the box, or per-org custom field sets — chambers track different things than HOAs. Drag-and-drop reorder, bulk apply.

📥

Bulk Import & Invites

CSV import with drag-and-drop preview before commit. Invite tracking, last-login visibility, soft deactivation, tombstone messaging for removed users.

🔐

Security That Earns Trust

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.

📊

Audit Trail

Login, invite, admin, backup, restore, and billing events recorded per-org. Searchable, exportable, retained.

💾

Backup & Restore

One-click archive download, atomic restore upload. Org admins control their own data.

💳

Stripe Billing

Tiered subscriptions, setup fees, invoice items, webhooks. Self-service plan selection. Billing-aware feature gating.

📡

Offline-Ready

Member rosters cached on device. Tap-to-call, tap-to-email, tap-to-map work without a connection. No tracking, no third-party SDKs.

How it's built.

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.

┌─────────────────────────────────────────────────────────────┐ iOS app (Swift 6) Browser (React 19 SPA) └────────────────┬────────────────────────┬───────────────────┘ TLS + cert pin same-origin ┌────────────────────────────────────────┐ Caddy (ACME / Let's Encrypt) └──────────────────┬─────────────────────┘ ┌────────────────────────────────────────┐ memberdexd (Go 1.25 · chi · static binary) handlers → services → repos └──┬────────────┬─────────────┬──────────┘ ┌───────┐ ┌─────────┐ ┌─────────┐ SQLite Stripe Resend WAL billing email └───────┘ └─────────┘ └─────────┘

Tech.

iOS Client

  • Swift 6 with strict concurrency
  • SwiftUI, MVVM
  • Native async/await, URLSession — no third-party HTTP libs
  • iOS 17+ deployment
  • XcodeGen (project.yml)
  • Cert pinning via APIPinningDelegate
  • Demo mode + super-admin org switching

Admin SPA

  • React 19.2 + TypeScript 5.9
  • Vite 8 · Tailwind CSS 4
  • React Router 7 · React Query 5
  • Vitest 4 + Testing Library
  • Playwright end-to-end
  • Built static, served by Caddy (same-origin)

Backend

  • Go 1.25 + chi router
  • SQLite WAL, embedded migrations
  • golang-jwt, bcrypt, uuid
  • stripe-go/v82
  • HIBP k-anonymity password breach check
  • OpenAPI spec auto-generated
  • CGo-free single binary (~50MB)

Infra & Ops

  • Caddy 2 (auto-TLS via ACME)
  • Hetzner Cloud single-box VPS
  • Cloudflare DNS + Pages + Turnstile
  • Resend transactional email
  • systemd-managed daemon
  • Bash deploy + verify + backup scripts

CI / CD

  • GitHub Actions matrix:
  • — Go unit tests (Linux)
  • — Node verify + Playwright E2E
  • — iOS XCTest (macOS)
  • Local verify_local.sh gate
  • Production deploy_production.sh with safety checks

Security

  • Per-account TOTP 2FA
  • JWT access + refresh-token rotation
  • Public-key cert pinning (release iOS)
  • Rate limiting + abuse heuristics
  • Cloudflare Turnstile on public forms
  • HIBP breach check on signup

What's been shipping.

App Store 1.0 hardening

iOS appearance setting (Light/Dark/System), splash scheme polish, cert pinning verification, App Store rejection log management. Pre-1.0 launch maturity work.

Public-form abuse defense

Cloudflare Turnstile + tightened rate limits + suspicious-message heuristics on contact and registration endpoints. Inbound message filtering in admin.

Drag-and-drop CSV import

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.

Super-admin billing console

Effective-price detail, plan tier overrides, setup-fee management. Self-service plan selection from the org admin side.

Logo lifecycle & trash

Soft-delete pattern for org logos with restore/permanent-delete affordances. Live brand preview during upload.

Pre-1.0 hardening Security Admin UX Billing