← cd ../work
Designer and engineer · 2026

InstaStylr

A caption editor for Instagram that turns bold, italic, fonts, lists and dividers into plain Unicode text that keeps its look when pasted.

TypeScriptReactLexicalViteVitestPlaywrightnginx
The editor on the left with a styled caption, and its plain-text output on the right
Editor and output: what you write, and the plain text that gets copied

$ cat architecture.svgAt a glance

WriterEditorLexical: text, lists,dividersDocumentsource of truthProjectionone direction onlyPlain Unicodeoutput, clipboardFont tables8 fonts as datalocalStoragesaved posts, settingsCountervs. platform limiton change

$ cat the-problem.mdThe problem

Instagram, YouTube, TikTok and most social platforms strip formatting when you paste. The usual workaround is a “fancy text generator” that converts one line at a time. I write captions for my flower photography and wanted a real editor: style part of a sentence, keep a list of camera settings under it, save the caption and come back to it.

$ cat how-it-works.mdHow it works

Every styling feature reduces to one operation: replace ASCII characters with Unicode characters that look bold, italic or decorative. Those are ordinary text, so they survive a paste.

$ cat the-details-that-bite.mdThe details that bite

$ cat security.mdSecurity

There is no backend. The app is static files, saved posts stay in the browser’s own storage, and the Content-Security-Policy allows only the site’s own scripts and styles and no outside connections.

$ cat testing.mdTesting

About 5,100 lines of TypeScript with 103 unit tests and 10 Playwright browser tests. The unit tests cover the font transform (48 cases), the projection to plain text, lists, dividers, the counter and saved posts. The browser tests drive the real app: typing, styling, copying, saving and the discard guards.

$ cat limits-and-whats-next.mdLimits and what’s next

Styled Unicode has a cost: screen readers read these characters badly, and search does not match them, so it suits a heading or an accent more than a whole caption. Next is a quote library: search a collection of quotes by theme or mood and insert one into a caption.

$ ls screenshots/On screen

From the live app, with a sample caption.

The divider builder with character, length, mode and wrapper controls and a preview
Divider builder: a line built from a recipe, with a live preview
The bullet picker with categories of markers and a custom field
Bullet picker: 290 markers, or any character of your own
Settings with theme, layout and the platform whose character limit is counted
Settings: theme, layout and which platform to count against
The same caption in the dark theme, saved under a name
Dark theme, with the caption saved under a name