
CodePersona
Developer persona reports · built solo · 2025–26A GitHub profile is a wall of green squares. CodePersona turns it into a story people can read: what you build, how you work, and what you're best at. Share a link or export a PDF.
- Each report: persona title, dev timeline, skill radar, career projection.
- Compare mode: two developers side by side, no extra API calls.
- Per-repo AI analysis: maturity, complexity and suggestions, on demand.

# numbers
users
5,000+
zero paid traffic
countries
95
via shared links
page load
<1s
served from cache
export
3 formats
PDF · image · Markdown
# how it works
React appenter a username
edgeEdge Functionreads the cache first
Supabase cachehit: served as is
GitHub APIfetch profile data
2nd cacheHash checkrepos, last update, languages
Geminionly if it changed, then cached
First visit: 1 API call. Repeat visits and shared links: 0.14-day TTL · regenerate once per 72h
# decisions
Cache processed dataStoring the finished profile, not raw API responses, removed recomputation and made pages load in under a second.
TTL, not invalidationGitHub data changes slowly, so a 14-day time-based expiry keeps it fresh enough without extra calls.
Built for sharingEvery profile has its own URL and a PDF export. That's how it reached 95 countries without ads.
Rate-limited regenerationUsers can force a refresh only once every 72 hours, which protects the GitHub and Gemini quotas.
Closed a public write holeThe original Supabase RLS insert and update policies applied to the public role, so anyone with the anon key could rewrite any persona page. I dropped them. service_role bypasses RLS anyway, so nothing broke.
# stack
TypeScriptReactSupabaseEdge FunctionsGemini APIGitHub APIVercelTailwind CSSshadcn/ui (Radix)Framer MotionTanStack QueryDeno (Edge Functions)GitHub GraphQL API