Community Services Directory
A review-gated community services directory delivered to web, iOS, and Android from one codebase.

The platform helps social workers and residents in Illinois find community services, food assistance, housing, health care, crisis support, and gives the operating nonprofit a controlled editorial pipeline for keeping that directory accurate. The system spans an internal admin application for curating resources and a public-facing app delivered as a responsive website and as native iOS and Android apps built from the same codebase with Capacitor.
Community-resource information decays fast: programs close, phone numbers change, eligibility rules shift. The platform solves both sides of that problem at once. A small editorial team maintains hundreds of records through a review-gated workflow in which unfinished edits are structurally incapable of reaching the public, while searchers get forgiving keyword matching, category browsing, and distance-aware results that still surface statewide hotlines alongside physical locations.
Because much of the audience works in the field, the public app is built for real casework: printable PDF handouts and QR codes a social worker can hand to a client, device-local favorites with no account required, and a mobile shell that ships to the App Store and Google Play through automated pipelines.
A directory people rely on, maintained by a small team
A directory that social workers depend on has to solve two problems simultaneously: let a small editorial team maintain hundreds of records with confidence, and let the public find the right service quickly even with imprecise search terms, "food help" rather than "SNAP enrollment assistance."
Editors needed drafts, review steps, and a guarantee that half-finished edits never reach the public. Searchers needed typo-tolerant keyword matching, category browsing, and answers to the practical question of what is actually nearby, including services that are statewide hotlines rather than physical locations. And because the audience works in the field, the public app had to function as a phone app with sharing tools that fit real casework.

Three architectural decisions
We adopted a two-schema publishing model: editorial data lives in one PostgreSQL schema, published data in a separate read-only schema that public clients query. Publishing is a privileged database function that snapshots a resource and everything it needs, organization, address, category links, images, into the public schema, so unfinished work cannot leak and editing published content automatically pulls it back to draft.
We built search inside the database rather than bolting on an external service. Relevance ranking is implemented in PostgreSQL itself: trigram and fuzzy word similarity weighted per field, an admin-managed synonym table baked into the search index, bonuses for category and demographic matches, and a distance signal that decays with a 10-mile half-life. Admin and public search share the same engine, and every result carries a score breakdown the admin UI can reveal for tuning.
Finally, one codebase serves four surfaces. A shared MUI component library documented in Storybook and a shared data-access package feed the admin app, the consumer website, and the Capacitor-wrapped iOS and Android apps, with the consumer app adapting between a mobile shell and a desktop layout.

An editorial pipeline feeding a field-ready public app
Resources move through a defined lifecycle, draft, pending review, changes requested, approved, published, archived, with role-gated transitions. Editors maintain records and submit them for review; approvers and admins publish. Publication records who published, when, and which editorial version the public copy represents, and permanent deletion is a separate admin-only operation with referential safety checks.
The public app opens on a search screen combining free text, a location field, and category and demographic pickers backed by hierarchical taxonomies, with results as a ranked list or a Google Maps view. Search tolerates typos and vocabulary mismatches through trigram matching and directional synonyms, while coverage types keep statewide and nationwide services visible alongside physical locations without pretending they have a distance.
Every published resource can be shared as a QR code, an OS-level share, or a text-focused PDF handout generated on the device from the published snapshot, so a handout can never contain unreviewed edits. Admins manage taxonomies as editable trees, maintain the synonym dictionary that tunes search, run previewed mass-tag operations, and administer users through passwordless invitations with account blocking enforced at the database level.
Review-gated publishing
A draft-to-published lifecycle with role-gated transitions and a snapshot-mirrored public schema, so nothing unapproved can ever reach the public directory.
Typo-tolerant weighted search
PostgreSQL-native relevance ranking with trigram similarity, admin-managed synonyms, category and demographic bonuses, and distance-decay scoring shared by the admin and public apps.
Coverage-aware proximity discovery
Physical, statewide, and nationwide services behave correctly in radius filters, map display, and ranking, modeling how social services actually work instead of forcing everything onto a map pin.
Field-ready sharing
QR codes, OS-level shares, and on-device PDF handouts generated from the published snapshot, including Markdown-formatted eligibility and registration details.
Anonymous-by-design public app
Favorites live on the device in named groups, no consumer accounts exist, and forms accept submissions without login, a deliberate privacy posture for people seeking crisis, housing, or health services.
Taxonomy and search administration
Editable taxonomy trees with icons, a synonym dictionary that tunes the search index, mass-tag operations with preview counts, and a score-breakdown overlay for calibrating ranking weights.






- 01
Business rules in PostgreSQL
No custom application server: 96 versioned Supabase migrations implement RPC functions for every workflow transition, triggers that reset edited content to draft, per-role row-level security, and the two-schema publish mirror.
- 02
Four surfaces from one monorepo
An npm monorepo of admin app, consumer app, shared data-access core, and a Storybook-documented MUI component library, React 19, TypeScript, TanStack Router typed routes, and TanStack Query throughout.
- 03
Native mobile via Capacitor 8
The consumer app ships to iOS and Android with native geolocation, share, filesystem-backed PDF export, deep links, and platform back-navigation handling.
- 04
Dual-enforced authorization
Passwordless email OTP auth with invitation-only accounts; roles are enforced in the application and again in database policies, so hiding a button is never the security boundary.
- 05
Quality and delivery infrastructure
31 Playwright end-to-end spec files across admin, consumer, and API projects; GitHub Actions deployments to Azure Static Web Apps; Codemagic App Store builds; and a Docusaurus docs site whose pages record the commit they were verified against.
- A complete self-service publishing operation for community-resource data, with a review-gated pipeline in which nothing unapproved can reach the public.
- A search experience that tolerates the vocabulary gap between agency terminology and how people actually ask for help, with distance-aware discovery that still surfaces statewide services.
- Printable, QR-coded handouts for in-person casework, generated on the device from the published snapshot.
- One codebase delivering the public experience to browsers, iPhones, and Android devices, with automated build and deployment pipelines for all three surfaces.