Gorka Molero

Creative technologist / AI engineer

Remote, location-independent Email GitHub EngineeringAgentsDesign SystemsCreative WorkBefore AIMusic

Case · collaborative writing and publishing

Hotpress

Hotpress is a collaborative writing app, like Google Docs, that also publishes complex books. It's live at hotpress.app, and its source is public.

Own project · 2026 · Next.js, Lexical, Liveblocks, Yjs, Postgres, Playwright

Writing together

The editor is Lexical, kept in sync through Liveblocks and Yjs. Writers share a document with a link, and guests can join without an account. Everyone sees the others' pointers move and where they're typing, edits merge as they happen, and each comment is a pin beside its phrase that opens in place.

Two people in one manuscript. A guest joins through the share link, both write at once, they comment and reply in place, and while the guest is offline both keep writing, then everything merges when they reconnect. Recorded locally on a production build of the app.

How I tested it

To check the collaboration properly, I wrote a Playwright suite that runs against Liveblocks itself, with nothing mocked. Three people share a room, two signed in and one guest. They type in the same sentence at once, comment, reply and resolve, and the guest drops offline for nine seconds while the others keep writing. Then someone joins late, and the saved document and the exported PDF have to contain everyone's text.

Fast typing lost characters. The cause was in Liveblocks' own Lexical comments plugin, which set a fresh array of active threads on every editor update. React stopped that with a "Maximum update depth exceeded" error, and the error cut off Lexical's other listeners before the last edits reached the shared Yjs document. The same bug left a writer out of date after a long offline gap. I patched the plugin in Hotpress so it keeps the old array when the threads haven't changed, a one-line change. The bug is still in Liveblocks' latest release, 3.24.3, so I reported it and opened a pull request with the fix.

Comments also failed now and then with a 403. My auth route gave out two kinds of Liveblocks token, and the client sometimes sent a comment with the kind that carries no room permissions. I changed it to issue one kind for everything, with the same access as before.

With both fixes, the suite passed all 17 checks three runs in a row on a production build. In those runs an edit reached the other writer in a median of 0.2 seconds, and 0.45 seconds at the 95th percentile.

From manuscript to book

Hotpress also lays out the book. You pick one of 22 templates, set up chapters, scene breaks, front and back matter, headers and footers, page layout and typography, and export a PDF for the printer, with a PDF/X-4 output intent, CMYK colour, bleed and trim marks, or an EPUB. It uses GitHub for version control.

Open hotpress.app The source on GitHub