CodePersona

Developer persona reports · built solo · 2025–26
live · 5K+ users

A 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.
CodePersona screenshot

# 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