Tim Seferagic

Tief im Detail

Drei Case Studies.

Konkrete Implementations-Geschichten. Trade-offs. Was funktioniert hat. Was nicht.

MYBDY Nutrition · 2026-05-07

V3-Architektur in 2 Sessions ausgeliefert.

Problem: V2 hatte 4 Sub-Types (Termin/Paket/Kurs/Material) die User verwirrten. Conceptual overload.

Lösung: Konsolidiert auf 3 Bausteine (🗓️ Termin · 📦 Programm · 📚 Lektion). 8 neue Tabellen, 6 gedropped. 5 V3-RPCs. 2 AI-Endpoints (gpt-4o + JSON-Schema).

Trick: 3 Compat-Views als Cutover-Safety-Net. Phase B konnte aggressive DROPs machen während Phase C+D parallel Code auf canonical Names umstellte.

Lesson: Phase-E DROP-Audit braucht Component-Tree-Walk für conditional/lazy queries — ContentLinkPicker drill-down hätte beim ersten Tab-Click gecrasht.

Output: ~10.5h, 26 commits, Portal 1.5.488, Web 1.2.102, Cron 1.1.22. Production-clean, kein Compat-Layer mehr.

Hof · 2026-05-03

Editorial-Magazine-Design für eine Hofladen-App.

Brief: Hof = Discovery-App für österreichische Hofläden. Brand-Personality: Nahbar, Frisch, Echt, Genussvoll, Verlässlich. Aber generic-SaaS-Design hat nicht funktioniert.

Direction: Editorial Austrian-magazine — Fraunces variable serif (Display) + DM Sans (body). Hand-drawn flourishes: Swoosh-Underline auf emphasized Words via SVG, Section-Marks, Drop-Cap-Utility.

Motion: Warm cubic-bezier(0.22, 0.8, 0.32, 1) shared zwischen web (CSS) und mobile (Easing.bezierFn). Identische Curve, cross-platform consistency.

DSGVO: Fonts via fonts.bunny.net (EU-CDN, kein IP-Logging). Pattern reusable für andere DACH-Projekte.

Gotcha: PhoneMockup mit w-full max-w-[…] collapsed zu 0×0 in Flex-Containern ohne explicit width. Fix: explicit Pixel-Widths.

Output: 142 tests passing, 0 lint, 0 svelte-check. Pattern reusable, cross-project documented.

MYBDY Studio · 2026-04-28

HMAC-signed Cross-Domain Recovery-Flow.

Setup: 2 Domains, 2 Repos. app.mybdy.io (Customer-App) und mybdy.io (Marketing + Webhook-Master). Beide auf Cloudflare Workers/Pages.

Challenge: User verliert Trainer (Orphan-State). Wie lockst du ihn zurück OHNE shared Session-Cookie zwischen Domains?

Lösung: Stateless HMAC-signed Recovery-URL. mybdy-app signt mit crypto.subtle.sign HMAC-SHA256 (Web-Crypto), landing-page verifiziert mit node:crypto.timingSafeEqual. Beide produzieren identisches Hex-Output. Selber HMAC_SECRET in CF-ENV beider Repos.

Trainer-Schutz: 5-State CTA-Gating — manage / hidden / renew / orphan / upgrade. Aktive Trainer-Kunden sehen kein Recovery-CTA. „We only catch customers you yourself let go."

Adapter-Gotcha: mybdy-app läuft auf adapter-cloudflare@3.x → kein node:-Import-Support. Fallback: Web-Crypto-API auf beiden Seiten. Cross-kompatibel.

Output: 14d-Cancel-Refund · Bulk-User First-Login-Fragebogen · SubscriptionBanner · Hard-Delete-Detection via localStorage-Marker. Phase 1-7 fertig in einer Session.