Trailside membership lookup — technical & privacy brief

Central Washington chapter · prepared for the statewide membership committee / IT review · June 2026

A volunteer-run trailhead booth tool that lets a rider check their Evergreen membership status and renew or join on the spot. This brief covers how it’s hosted, the privacy & security model, and what a production / statewide implementation would look like — including hosting, data refresh, and payment. The guiding principle: the member roster never leaves the database, and the public web page contains no member data whatsoever.

Architecture (current)

Serverless / edge. No servers to patch or maintain. All traffic over HTTPS/TLS.
Volunteer device
Any browser/iPad. Static page only — holds zero member data.
HTTPS
signed token
Cloudflare Pages
Static kiosk (HTML/JS) on global CDN. No database access.
function call
Supabase Edge Function
Deno. Runs as service role, does the fuzzy match, returns one record.
internal
Postgres · members
Row-Level Security ON, no read policy — unreadable to the public key.

A lookup never queries the table directly. The browser calls an edge function with a signed session token; the function (and only the function) reads the table using a privileged key and returns only the single matched person — or a short chooser list with no contact info. Bulk export through the app is structurally impossible.

Security & privacy controls

Where it lives today → recommended for production

LayerToday (prototype)Recommended for Central / statewide
HostingCloudflare Pages, free tier (built by the volunteer)Move to an Evergreen-owned Cloudflare account; IT holds credentials & billing
DatabaseSupabase (Postgres), us-west-1, free tier, in the builder’s orgRe-create in an Evergreen-owned Supabase org (1-time migration)
Domaincw-evergreen-booth.pages.devmembers.cwevergreenmtb.org (or statewide) via Cloudflare DNS, auto-TLS
Roster scopeCentral chapter onlyStatewide roster — same schema; chapter is just a column

Implementation recommendations

  • Ownership transfer — stand up the Cloudflare + Supabase projects under Evergreen-controlled accounts so IT owns access, billing, and rotation.
  • Automated data refresh — replace the manual CSV import with a scheduled weekly sync (CSV drop, or ideally a read-only CiviCRM API pull) so the roster stays current.
  • Auth tier — shared booth code today; can upgrade to per-volunteer logins (Supabase Auth) for accountability/revocation if desired.
  • Backups — low risk (the DB is a cache); Supabase managed backups on a paid tier, or simply re-import from CiviCRM.
  • Statewide rollout — one shared instance; each chapter’s booth filters by location/event. No per-chapter rebuild.

Payment recommendations

  • Enable digital wallets (Apple Pay / Google Pay) on the processor — if Stripe-backed, this is a configuration toggle (Payment Request Button), not custom development. Biggest friction win.
  • Express CiviCRM page — a standard CiviCRM contribution page with chapter preset, minimal fields, and no login; CiviCRM dedupes by email for renewals.
  • QR deep-link + UTM — the kiosk sends riders to that page on their own phone, tagged for attribution (already built). Confirm GA records the UTMs.
  • Card-present option — Stripe Tap to Pay / Square if a wallet isn’t available.
  • Scope note — all payment stays on Evergreen’s PCI-compliant processor; the booth tool is out of PCI scope entirely.

Stack & cost

Cloudflare Pages (static + CDN) Supabase Postgres + Row-Level Security Deno edge functions HMAC-signed JWT auth (Web Crypto) No backend servers ~$0/mo on free tiers

What we’d need from Central / statewide IT

Central Washington Evergreen · technical brief for IT review · not for public distribution cwevergreenmtb.org