
A pan-African creative-content streaming platform, film, music, poetry, writing and photography, built mobile-first for African connectivity realities, with Claude-powered discovery.
View the product pageThe problem
African creative content lacks its own distribution infrastructure; existing platforms are Western clones not built for the continent’s connectivity, languages and mobile-first majority.
.jpg&w=3840&q=75)
Architecture
A container-level view of the real system, the boundaries, the trust edges, and where intelligence and money actually flow.
Browse pages are server-rendered; media never proxies through the app server (direct-to-origin uploads to Cloudflare Stream + R2). Postgres triggers keep counters, feeds and badges live, and a scheduled function recomputes the trending score every six hours.
.jpg&w=3840&q=75)
By the numbers
26
tables · 50 RLS policies
7
AI routes · 2 models
7
custom players · 0 libraries
50K
AI tokens / user / day cap
Stack
Intelligence
Seven Claude route handlers across two models, Sonnet 4.6 for judgment-heavy work (afribrain, creative-dna, discover, taste-profile, creator-assistant) and Haiku 4.5 for cheap, high-volume labelling (enrich, card-description), behind three caching tiers and a 50,000-token-per-user-per-day budget, tuned for African cultural context.
Data model
26 tables · 26 indexes · RLS on all 26 · 50 policies · trigger-driven
Key decisions
Architecture Decision Records, the trade-offs made deliberately, in the open.
.jpg&w=3840&q=75)
The hard parts, solved
Claude prompt caching wraps static system prompts in an ephemeral block ("cache read = 10% of base cost"); a Redis response cache keys identical single-turn calls by sha256(model|system|message) with a 15-min TTL; and a Redis platform-context snapshot is cached 15 min, all under a per-user 50,000-token/day budget enforced via Redis INCRBY with a 24h TTL.
A scheduled function scores every work as weighted engagement (views×1 + hearts×5 + comments×10 + shares×8) multiplied by an exponential 7-day half-life decay, then ROW_NUMBER() OVER (PARTITION BY category) flags the top 10 per category as trending, recomputed by cron every six hours.
Seven fully custom media players, film, music, dance, poetry, waveform, writing-reader and a mini-player, built directly over the native HTML5 media element with no hls.js / react-player / video.js; the Zustand store persists only volume / mute / shuffle / repeat / queue, so playback survives navigation without remounting.
Sourced from AfriFlix (afriflix-v2), supabase/master.sql, lib/claude.ts, middleware.ts, components/players/*, vercel.json.
.jpg&w=3840&q=75)
Keep exploring