Redesigning HepYeniβs Media Flow
The past few days have been a massive sprint on HepYeni (the shared media circles app). We tackled everything from the core frontend aesthetics down to server-side privacy invariants and LLM integration.
1. Dual Typography & Hybrid Tokens
We completely redesigned the frontend using hybrid architectural tokens. The biggest visual shift? Adopting EB Garamond for our dual-typography approach, giving the reading and media interface an editorial, tactile feel. We stripped away the generic SaaS look and leaned heavily into high-contrast aesthetics.
2. Circle Media Lifecycle
We introduced a strict 3-section lifecycle for circle media:
- Up Next (Voting & Proposals)
- In Progress (Currently reading/watching)
- Finished (Archived and reviewed)
This structure immediately solved the cognitive overhead of managing shared backlog items. We backed it up with robust database schema updates and over 487 passing TDD tests to ensure rock-solid state transitions.
3. LLM βExtract from Textβ Importer
Importing data is always a chore. We built an environment-gated LLM importer that allows users to simply paste an unstructured text dump.
// The workflow:
// 1. LLM extracts raw titles
// 2. We reconcile them against canonical providers (Google Books, TMDB, etc.)
// 3. User verifies and adds them directly to a shelf or group.
Because LLMs outputs are fundamentally untrusted, we built a strict validation pipeline. After an intensive parallel review cycle using multiple worktrees, we hardened the importer with durable LLM quotas, canonical provider validation, and strict privacy acknowledgments.
Hardening Invariants
Features are great, but invariants keep the ship afloat. We applied several βround-2β code, performance, and security fixes:
- Enforced server-side gating for review text visibility.
- Hoisted session and access checks to prevent redundant database lookups.
- Migrated hardcoded English/Turkish UI strings into a strictly-typed
Translationsdictionary, maintaining 100% i18n parity.
We proved all changes by verifying our Next.js Turbopack "use server" boundaries with bun test && bun x tsc --noEmit && bun next build.
Exit 0. Clean deployment.