Skip to content
Back to work

Project

Building a Shared Civic Platform for Tuolumne Together and Sierra Mutual Aid

Two distinct community platforms on a shared full-stack foundation, connecting membership, events, publishing, participation, and operations while preserving each community’s public identity.

Tuolumne Together desktop interface
Live capture

Desktop capture of Tuolumne Together.

In detail

Portfolio source

Project snapshot

Role: Full-stack design engineer

Live sites: Tuolumne Together and Sierra Mutual Aid

Stack: Next.js, React, TypeScript, Tailwind CSS, shadcn/ui, PocketBase, Appwrite, OpenAI, Pol.is, Turnstile, pnpm workspaces.

Problem

Tuolumne Together supports civic dialogue, local news, and grassroots digital democracy. Sierra Mutual Aid supports neighbor-to-neighbor help, volunteers, and resilience. They needed distinct identities with shared accounts, cross-platform events, public/member content, protected locations, delegated publishing, and independent deployments.

Approach

I designed and built both platforms on shared infrastructure and domain logic without forcing one public interface on both organizations.

Implementation

  • A pnpm monorepo contains apps/tuto-frontend and apps/sierra-frontend, independently deployable Next.js apps.
  • Shared packages include @repo/ui, @repo/shared-utils, @repo/core-auth, and @repo/core-events, with shared TypeScript/ESLint configuration. Shared changes validate both applications.
  • Shared auth covers registration, verification, login, password reset, session refresh, and settings. Capabilities resolve platform access, membership, platform-specific roles, and permitted actions.
  • A unified event model supports organizational ownership, public/member visibility, draft/published/cancelled states, slugs, rich descriptions, time zones, guest counts, cross-platform discovery, soft deletion, and audit-friendly ownership.
  • Sensitive addresses remain hidden until an active member RSVP; managers retain coordination access. Rules live in shared domain logic.
  • Writers maintain their own drafts but cannot publish or modify others’/cross-platform events. Managers review, publish, and coordinate RSVPs. Newsroom workflows distinguish writer, approver, and publisher with approval/rejection states and audit metadata.
  • Authorized contributors can use AI flyer intake to suggest event details. File validation, uncertainty flags, and protection for edited fields keep humans in control of publication.
  • Adapters, setup/migration scripts, and bridge code move auth, memberships, events, RSVPs, and news toward PocketBase while retaining necessary Appwrite media and legacy compatibility.
  • Added server-side session refresh, safe capability fallbacks, consistent API errors, and Pol.is/Signal participation pathways.

Outcomes and limitations

Delivered two responsive sites with shared membership, cross-platform events, RSVP privacy, delegated publishing, reusable packages, and independent deployment boundaries. Backend consolidation remains a migration path with some Appwrite dependencies retained. AI remains assistive and subject to human review. The reported outcome is structural, not quantified adoption or participation growth.

Adapted from portfolio text; images and navigation omitted.

What’s getting in
your product’s way?

Tell me what you’re building, where it gets difficult, and what you’d like to change.

Email your projectmatt@biehl.io
Building a Shared Civic Platform for Tuolumne Together and Sierra Mutual Aid — Matt Biehl | biehlux.com