In detail
Project snapshot
Client: KFUT 89.5 FM Community Radio, serving Twain Harte, Sonora, and the surrounding Tuolumne County region
Role: Full-stack design engineer
Live site: kfut.org
Stack: Next.js App Router, React, TypeScript, PocketBase, Tailwind CSS, shadcn/ui, RadioJar, ACRCloud, RadioDJ/MariaDB, Resend, OpenAI API, Google Maps, OpenWeather, Coolify.
Problem
KFUT needed a coherent platform for listening, programming, events, news, artist submissions, fundraising, and participation—not only an audio-stream website. Volunteers needed operational tools without code changes. Schedule data came from RadioDJ, submissions required moderation, uploads needed reliable persistence, and newsletter contacts needed synchronization.
Approach
I designed and built the information architecture, responsive components, application, content models, auth, integrations, and workflows. Listener intent, explicit trust boundaries, human editorial control, and volunteer maintainability guided the implementation.
Implementation
- Built a persistent RadioJar player with playback/buffering states, volume/mute, adaptive layouts, retry-aware polling, visibility-aware updates, and failure handling. ACRCloud enriches tracks; stale recognition falls back to RadioJar.
- Imported enabled RadioDJ events from MariaDB into PocketBase, interpreting program commands and excluding rotations/filler. Handled category/track programs, streams, day codes, adjacent events, and midnight crossings.
- Stable source keys distinguish synchronized and manual records, preserving editorial descriptions and images. Public schedules use a desktop seven-day grid and mobile day tabs.
- Verified members submit pending events; admins review/publish. Only published, upcoming events appear publicly.
- AI-assisted poster/URL intake validates structured extraction, normalizes dates, and exposes uncertain required fields for human review—not automatic publication.
- Added verified-account MP3 uploads with size/count rules, metadata, radio-edit disclosure, copyright confirmation, and shared validation. Server checks persisted files against attempted uploads and explicitly reports incomplete persistence. Confirmation emails list accepted tracks; audit scripts diagnose malformed submissions.
- Added Zod-validated server actions, cookie sessions, middleware access boundaries, publishing revalidation, and rate-limit-aware PocketBase-to-Resend sync preserving unsubscribe state.
- Integrated contact, donations, underwriting, volunteering, and weather workflows.
Outcomes and limitations
Delivered a production platform linking broadcasting, publishing, participation, and station operations. Routine publishing requires no deployment. Partial failures remain explicit: playback may outlive fresh metadata, uploads can partially persist, schedule records may be unsuitable for public display, and schema-valid AI output may still lack editorial information. Human publication control and manual ownership are preserved.
Adapted from portfolio text; images and navigation omitted.

