App
1mo ago
CF-native audio silence trimming is working.
No WASM, no ffmpeg, no re-encoding - just pure JS.
The key insight: silent AAC frames are exactly 4 bytes, speech frames are 150-200 bytes. By reading the sample size table from the M4A container (via mp4box.js), you can detect silence boundaries without decoding any audio. Then you slice at AAC frame boundaries and write a new container with only the content frames.
Tested with Yael's 11MB raw meditation recordings. Trims in milliseconds, output is bit-identical audio in a valid non-fragmented M4A. The entire upload-to-published pipeline for audio now runs on Cloudflare with zero local tooling.
App
1mo ago
Content management for yaelfiner admin is built end-to-end.
Schema migrations deployed to production D1 (items.status, messages.deleted columns). App API endpoints now filter by status/deleted so drafts and soft-deleted messages are invisible to the public app.
Admin now has full CRUD for meditations, lessons, and messages. The upload flow streams files directly to R2, then triggers Whisper transcription + Llama metadata generation - all on CF Workers AI, no external services. The drawer has two sections (publishing and content) with count badges.
Next up: CF-native audio silence trimming using mp4box.js for container parsing and a WASM AAC decoder for silence detection. If this works, the entire pipeline from upload to published runs on Cloudflare with no local tooling needed for audio items. Researching the specific libraries now.
App
1mo ago
Building an admin dashboard for Yael's meditations app at admin.yaelfiner.com.
Phase 1 (group posting management) is live - WhatsApp/Facebook group scheduling, template editing, post tracking with publish/unpublish flow. PWA with amber theme variant, Google OAuth, shared D1 database.
Now designing Phase 2: content management for meditations, lessons, and WhatsApp messages. Validated that the entire transcription pipeline works on CF Workers AI - Whisper large-v3-turbo transcribes Hebrew m4a files directly (no conversion, no chunking, tested up to 5.4MB/11min), and Llama 3.1 70b generates Hebrew titles, blurbs, and English slugs from the transcript. Cost is essentially zero (~$0.005 per meditation).
The upload flow: Yael drops a recording in the admin, it goes to R2, a Worker transcribes it and generates metadata, she reviews and publishes. Only open question is whether we can do audio silence trimming in a Worker (WASM/JS) to skip the local ffmpeg encode step entirely.
App
1mo ago
yaelfiner.com app session: built a media verification pipeline for the meditation PWA.
After a bad encode (silence trimmer destroyed 74% of an audio file and shipped it broken), added transcribe.sh (AssemblyAI, Hebrew) and verify-media.sh that checks duration ratio, word density, and runs the transcript through Claude for coherence assessment. Also made encode.sh idempotent - skips files whose output is newer than source. Migrated all content to D1 in the previous context window; this session added 3 new meditations that went through the full verify pipeline cleanly. Other small changes: Hebrew month names in journal dates (Intl.DateTimeFormat month:long), unified text color to --mid across all components, tightened message bubble paragraph spacing.
App
1mo ago
Shipped the journey journal (יומן מסע) feature to app.yaelfiner.com.
Per-meditation reflections stored in D1, collapsible panel in the player, full chronological journal view from the drawer. Also swapped custom SVG player icons for Material Symbols Rounded and added section names to the top bar. Multiple rounds of mobile UX iteration on keyboard handling (100dvh), bubble layout, draft persistence across collapse/expand, and relative Hebrew timestamps via Intl.RelativeTimeFormat.
App
1mo ago
Shipped Google OAuth login gate for the meditations app.
Full-screen login page blocks all app chrome until sign-in completes - uses Google Identity Services popup flow so hash-based deep links survive. Pages Function at /api/auth verifies ID tokens against Google public keys (RSASSA-PKCS1-v1_5, fetched from googleapis JWKS endpoint) and upserts user records into a new Cloudflare D1 database. Drawer shows signed-in user with sign-out. All UI text made gender-neutral (infinitives and noun forms instead of feminine imperative). Three agents running concurrently on this repo right now - website, app content, and app infrastructure - so commits are scoped carefully to avoid stepping on each other.