open-doc: Letting Antigravity and Other Coding Agents Fully Own Document Layout and Generation Developer Simon Liu released open-doc, a framework that lets coding agents like Antigravity fully own document layout and generation. Inspired by the open-slide project by 1weiho, open-doc embeds agent instructions and skills directly into the project repository, ensuring versioned, project-scoped, and reviewable guidance. The framework locks down layout constraints while letting agents focus on content generation. GitHub — open-doc https://github.com/simonliu-ai-product/open-doc https://github.com/simonliu-ai-product/open-doc Over the past year, I think most of us have handed more and more work over to coding agents — writing code, looking things up, running tests. They do all of that pretty well. But there is one thing I never got right: asking an agent to produce a report I could hand off as-is. Agents are actually good writers. Ask one for a quarterly review, a technical evaluation, or a project proposal and the content quality is fine. The problem starts right after the words — the layout. Every approach I tried got stuck in the same place: After thinking about it long enough, you realize the problem isn't that the agent isn't smart enough — it's that the division of labor is wrong. What agents are genuinely good at is content, and layout happens to be the half that isn't allowed to be wrong. A report's page size, margins, break positions, and consecutive page numbers leave no room for creativity: they're either right or wrong. Handing those to an agent that has to guess afresh every time was never a reasonable idea. So the sensible arrangement is to let the framework lock down the parts that can't be wrong, and let the agent handle only what it's actually good at. The project that made me see this clearly was somebody else's. To be clear up front: open-slide https://github.com/1weiho/open-slide is @1weiho https://github.com/1weiho 's work, not mine. I'm a user. GitHub - 1weiho/open-slide: A slide framework built for agents. https://github.com/1weiho/open-slide It bills itself as "a slide framework built for agents". Every slide is a fixed 1920 × 1080 canvas written as a React component, and the framework takes care of scaling, navigation, hot reload, presenter mode, and speaker view. You don't have to learn a restrictive DSL, because the page is a component — want a chart, drop in a chart; want an animation, write an animation. npx @open-slide/cli init my-slide I heard about the project at COSCUP and went home to try it. In practice, the feeling is: as long as you can describe the slide you want in plain language, the agent writes React and the result shows up in your browser immediately. But what actually made me stop and dig in wasn't "writing slides in React" — that isn't new. What I found interesting was how it handles the question of how the agent is supposed to know how to use this tool . When you init an open-slide project, the folder contains more than code: there's an AGENTS.md , plus a handful of skill documents under .agents/skills/ . When your coding agent opens the project, it already knows what the file contract looks like, how much content safely fits on one slide, and what it shouldn't touch. In other words, the manual travels with the project, not with the conversation. That design became the starting point for all of open-doc. I put open-slide through its paces and read the source. This section is about what it taught me regarding the difference between tools built for agents and tools built for people . This is the most counterintuitive point and the one with the biggest impact. We're used to writing "how to use this tool" as a prompt pasted at the top of a conversation. The problem is that prompts go stale, get truncated, and never get updated — and a different person or a different agent means pasting it all over again. open-slide's approach is to turn that knowledge into files in the repo. A skill is just a Markdown file that says "when you write this kind of file, here's what you must follow", and the scaffolder generates it into the user's project. Three benefits fall out of this: it's versioned the framework changes, the skill changes with it , it's project-scoped anyone who opens the repo can see it , and it's reviewable a skill is part of the source, so it goes through PRs . open-slide's canvas is always 1920 × 1080. That isn't a limitation — that is the product. Because the canvas is fixed, the agent never has to guess how big the slide is, how large the text should be, or whether the content will fit. It just writes content, and "does it fit" gets answered by the framework through measurement, which is vastly more reliable than an agent guessing. I'd put it even more bluntly: every choice you take away from the agent is one class of error you no longer have to verify. Layout is right-or-wrong with no creative latitude — it was never something to leave to guesswork. This one I only appreciated after using it for real. You're looking at slide 7 in your browser, you turn to the agent and say "the spacing on this page is too tight" — which page is "this page"? The agent doesn't know. It can only ask you back, or guess, and a wrong guess means it edits something else entirely. open-slide's fix is direct: on every navigation, the dev server writes "where the user is right now" into a file, paired with a skill that tells the agent to read it. Deictic references like "this page" or "this element" then resolve into a concrete file path and line number. It looks like a small thing, but it's the bridge between the screen the human is looking at and the file the agent is editing . Those three lessons came straight from open-slide. But once I actually built a system of my own, I hit two more problems it hadn't shown me — humans and agents editing the same file at the same time, and the same operation having more than one entry point. I'll cover both in the next section. Carrying those three lessons, I spent the last few days building open-doc — and the two problems I just teased are exactly what I ran into along the way. If open-slide is Google Slides for agents, then open-doc is Google Docs. Same concept, different medium: a deck is a 1920 × 1080 canvas, while a document is a stack of A4 sheets that has to survive contact with a printer. npx @open-document/cli init my-docs cd my-docs pnpm dev Side note: the @open-doc scope on npm was already taken, so the packages are @open-document/ — but the CLI command and the project name are still open-doc. open-doc's document viewer — page thumbnails on the left, a real A4 sheet in the middle, footer and page number filled in by the framework Every page component renders as an actual sheet of paper. A4 794 × 1123 px @96dpi , Letter, A5, and Legal are all supported, in portrait or landscape. What you see on screen is what's in the PDF, because the @page size matches — nothing gets re-scaled at print time. This is something I called out explicitly when writing the skills: authors write CSS px, but paper is measured in mm. 1pt is roughly 1.333px, so 14px body text prints at about 10.5pt — while 11px, which looks okay on screen, prints at 8pt and is unreadable. A document is a folder plus an index.tsx : python // docs/q3-review/index.tsx import type { DocMeta, DocPage } from '@open-document/core'; const Cover: DocPage = =