Back to work
Internal toolNext.jsTypeScript

Inline content editor

Type
Internal tool
Timeline
Jul 2026
Role
Design & build
Stack
Next.js · TypeScript

A dev-only editor built into the site itself: hover any piece of text, edit it in place, and the change writes straight back to the content files as a reviewable diff — turning this portfolio into its own lightweight CMS.

The problem

Changing a headline or fixing a typo meant hunting through TypeScript, editing the right string literal without breaking the build, then redeploying. Small edits carried real friction — and real risk of shipping a mistake.

Editing content in the codebase
Before — content lived as string literals, edited by hand.
Editing a block in place, saved straight to the content file.
Inline edit affordance
The edit affordance sits quietly until you hover a region.

What I built

The same page you're reading becomes editable in development. Each editable region shows an affordance on hover; saving PATCHes the underlying JSON and hot-reloads the change — no separate admin, no deploy, and the edit is a plain git diff you can review or discard.

Moving a section with the ↑↓ buttons — the change is immediately undoable.
Highlight changes toggle marking an edited paragraph with an accent outline
"Highlight changes" on — every edit made this session gets an accent outline.

Undo, redo, and reordering

Every save — a text edit, a reorder, an insert, a delete — now lands on a shared undo/redo history instead of being final the moment it's written. A small toolbar (⌘Z / ⌘Y) sits at the bottom of every page, and a "Highlight changes" toggle marks anything touched this session. Sections, prose blocks, and About page entries (experience, volunteering, skills) also picked up ↑↓ reorder buttons, plus +/✕ to add or delete a sibling — a new block matches the type of the one it's added next to, so the format carries over automatically.

Editing without a form

Paragraphs, headings, and leads — plus single-field entries like page and section titles — no longer swap out for a boxed form. Click straight into the text and it becomes the input, styled to match, with a dashed underline marking edit mode; saving happens on ⌘Enter or by clicking away.

No separate box — the text itself becomes editable.

Releases

  1. Jul 24, 2026

    Editing without a form

    Single-field text — paragraphs, headings, leads, page and section titles — is now edited by clicking directly into it, styled to match, with a dashed underline marking edit mode. No more swapping the whole block for a boxed form.

  2. Jul 24, 2026

    Reordering and add/delete for lists

    Added ↑↓ reorder buttons to project sections, prose blocks, About page entries, and Work page project cards, plus +/✕ to add or delete sections and text blocks — a new block matches the format of the one it's added next to.

  3. Jul 24, 2026

    Undo, redo, and highlight changes

    Every edit — including reorders, inserts, and deletes — can now be undone with ⌘Z and redone with ⌘Y from a toolbar on every page. A "Highlight changes" toggle marks whatever's been edited this session.

  4. Jul 24, 2026

    Editing reached every page

    Brought inline editing to the landing, work, about, and contact pages — project titles and summaries, focus pills, experience entries, and calls to action.

  5. Jul 23, 2026

    Writes locked to this machine

    Hardened the save endpoint — development-only, localhost-bound, and cross-origin requests refused — so an open write path can't be reached from anywhere else.

  6. Jul 23, 2026

    Content lifted into JSON

    Moved page and project copy out of TypeScript literals into JSON files, so every edit lands as a clean, reviewable git diff.

  7. Jul 23, 2026

    Section headings made editable

    Extended the editor beyond prose to section headings, which also move the anchors the sidebar table of contents links to.

  8. Jul 23, 2026

    First inline editor shipped

    A dev-only editor for prose blocks: hover any paragraph, click edit, and save straight to disk.

Interested in working together?

Let's talk about your project.

Get in touch
Coming soon
Inspired by Fara Yan