Back to Blog
·2 min read

One Site, Four Audiences

How I built persona-aware copy on a personal platform — one resume, four views, without maintaining four separate sites.

When you work across engineering, research, consulting, and government-adjacent projects, a single static bio rarely fits every conversation. Recruiters want stack depth. Clients want outcomes. Agency partners want compliance language. A general visitor just wants to know who you are.

I built persona-aware copy into the platform rather than maintain four versions of the same site.

The constraint: no invented credentials

The platform has a hard rule: no fabricated metrics, no fictional case studies. Persona views cannot invent credentials — they can only reframe the same facts for different readers.

The single source of truth lives in profile.ts, kept in sync with my resume. Persona strings are derived from that object. Nothing is duplicated across pages or invented per audience.

typescript
export function getPersonaCopy<T>(map: PersonaCopyMap<T>, persona: Persona): T {
  return map[persona] ?? map.general;
}

If a section has nothing real to say to a particular audience, it shows nothing rather than filling space with something plausible.

Server-first persona state

The persona toggle (General / Engineer / Manager / Government) persists in a cookie and is read on the server during layout render. That avoids the hydration flash that's common when client-only state drives marketing copy — the initial HTML already matches what the user sees after JavaScript loads.

URL query params (?view=engineer) still work for shareable links. A manager I'm in conversation with can open /about?view=manager and see the right framing without having clicked the toggle themselves.

What actually varies per persona

Not every page needs four variants. I focused on where it matters:

  • Home — hero lede, proof framing, CTA emphasis
  • About / Contact — collaboration framing and intro tone
  • Projects — description overrides in MDX frontmatter

Blog posts and legal copy stay persona-neutral. A post about building the DRT simulation platform doesn't need a manager-friendly rewrite — the manager persona just sees a different introduction on the blog index.

What I'd do differently

Formalize copy review. Persona strings should be diffed against resume changes in CI, not checked manually. Right now I remember to update both — until I don't.

Analytics by persona. Knowing which view converts contact form submissions would tell me which audience is actually finding the site useful. I have no idea yet.

OG images per persona. Social previews still use default metadata. Someone sharing the engineer view gets the same card as someone sharing the government view. That's fixable and on the list.

---

Persona views are not about presenting as four different people. They're about respecting how different audiences scan for signal. One codebase, one deploy, one database — four honest lenses on the same career.

Stay Updated

Get the latest articles on software engineering, distributed systems, and local-first applications delivered straight to your inbox.