I Told Claude to Update My Resume. It Designed a Theme, Published to JSON Resume, and Wrote This Post.
This Post Is for Your Coding Agent
If you're a human, great -- read on. But this post is really written for the coding agent you're about to paste it into. Everything below is a step-by-step record of how Claude Code edited a resume, designed and published a custom JSON Resume theme, pushed it to GitHub, updated a gist, and wrote this blog post -- all from natural language prompts in a single terminal session. Your agent can read this and do the same thing. Just point it here and say "do this for my resume."
Context Before It Collapses
This blog post is a summary of a conversation that will soon be forgotten.
I'm writing this inside Claude Code -- the same session that designed the theme, published it to npm, created the GitHub repo, updated my gist, and is now writing these words. When this conversation ends, the context collapses. Claude won't remember any of it. The theme will exist on npm and GitHub, the gist will point to it, but the story of how it happened lives only here.
That's the meta point worth making: AI-assisted work is ephemeral by default. The artifacts persist -- the code, the package, the commits -- but the decision-making process, the back-and-forth, the "make the project cards pop more" followed by a CSS tweak followed by a screenshot followed by "yeah that's better" -- all of that vanishes. Unless you write it down.
So here it is, written down.
The Workflow
Everything that follows happened in a single terminal session with Claude Code. No browser. No Figma. No design tools. Just natural language prompts and tool calls.
1. Research
First, Claude researched how modern JSON Resume themes work. The contract is
dead simple: export a render(resume) function that takes a JSON object and
returns an HTML string. All CSS must be inlined. No filesystem access. The
registry picks up any npm package named jsonresume-theme-*.
The old boilerplate used Handlebars and fs.readFileSync. The modern approach
is pure ESM with template literals. No build step needed.
2. Scaffolding
npm init -y
npm install resumed markdown-it playwright
Three dependencies. resumed to test rendering. markdown-it because resume
fields often contain markdown. playwright for the trick that makes this whole
thing work.
3. The Design Loop
Here's the interesting part. Claude is working in a terminal. It can't open a browser. So we set up a feedback loop:
- Write the theme (HTML + CSS in a single
index.js) - Render it against my actual resume data
- Use Playwright to screenshot the result
- Claude looks at the screenshot using its vision capabilities
- Identify what needs improvement
- Edit the CSS
- Repeat
I never saw the screenshots during this process. I wasn't part of the visual feedback loop at all. Claude was rendering, screenshotting, viewing its own output, critiquing it, and making CSS adjustments -- all autonomously. I only opened the HTML in a browser after Claude said it was done. The first time I saw the design was the finished product.
An AI doing visual design work through screenshots, iterating on its own output, with no human in the visual loop. The first pass came out surprisingly clean -- good typographic hierarchy, proper spacing, responsive grid for skills. A few rounds of self-directed iteration later: subtle entry separators, punchier project cards, tighter line heights. I opened it, said "love it," and we moved on to publishing.
4. The Theme
The result is
jsonresume-theme-claude.
A single index.js file. Features:
- System font stack (no web font loading)
- Dark mode via
prefers-color-scheme - Print-optimized
@media printstyles - CSS custom properties for theming
- Inline SVG icons (Lucide-style)
- Markdown rendering in descriptions
- Responsive layout
- Gradient accent bar header
Zero build tooling. The render function is ~300 lines of template literals and CSS. That's the whole theme.
5. Publishing
This is where it gets fast.
# Create the npm package
npm publish
# Create the GitHub repo and push -- one command
gh repo create jsonresume-theme-claude --public --source=. --push
# Update my resume gist to use the new theme
gh gist edit f20e7107dec700782ab6dcb25c71d2ca resume.json
# Request the theme be added to the registry
gh issue comment 36 --repo jsonresume/jsonresume.org --body "..."
Four commands. Package on npm. Repo on GitHub with README and screenshot. Gist updated. Theme requested on the registry. All executed by Claude, all without leaving the terminal.
6. This Blog Post
And now Claude is writing this post, adding it to my Eleventy blog, which will deploy via GitHub Pages when pushed. The entire chain -- from "let's build a theme" to published blog post -- happened in one conversation.
7. Getting on the Registry
The theme was on npm and GitHub, but the JSON Resume registry doesn't
automatically pick up every jsonresume-theme-* package. Themes need to be
vendored into the
jsonresume.org monorepo under
packages/themes/. This happened in a follow-up session -- Claude read the
relevant GitHub issue, figured out the process, and opened a PR.
Four files needed to change:
packages/themes/jsonresume-theme-claude/-- the theme source, copied into the monorepo (index.js + package.json)packages/theme-config/src/metadata.js-- the single source of truth for theme metadata (name, description, author, tags)apps/registry/lib/formatters/template/themeConfig.js-- the ESM import and slug-to-module mappingapps/registry/package.json-- a"workspace:*"dependency entry
The key constraint: no fs.readFileSync or Node filesystem calls. The registry
runs on Vercel serverless functions, so themes that touch the filesystem break
at deploy time. This is why many legacy themes were disabled in late 2023.
Since jsonresume-theme-claude was built with pure template literals and ESM
from the start, it was already compatible -- no migration needed.
Claude forked the repo, created the branch, made all four changes, pushed, and opened PR #262. Now it's up to the maintainer to merge.
The Ephemeral Part
After I send the next message, this conversation continues. After a few more, the context window fills up and earlier messages get compressed. Eventually the session ends and it all disappears.
Claude won't remember building this theme. Won't remember the screenshot loop. Every future conversation starts from zero.
The code survives. The blog post survives. The npm package survives. But the process that created them -- the actual collaboration -- exists only as artifacts and this write-up.
That's fine. That's how it works. You do the work, you write it down, the context collapses, and next time you start fresh with better artifacts.
This post is me writing it down.
Theme: jsonresume-theme-claude on npm and GitHub. Resume: registry.jsonresume.org/rolandnsharp. Built with Claude Code.