Skip to content
Back to work

Project

Building the Digital Home for KFUT Community Radio

A responsive community-radio platform connecting live broadcast, weekly programming, local events, music submissions, station publishing, fundraising, and audience participation.

KFUT community radio desktop interface
Live capture

Desktop capture of KFUT community radio.

In detail

Portfolio source

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.

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 the Digital Home for KFUT Community Radio — Matt Biehl | biehlux.com