How we draft every document with agents
The exact loop behind every SOW, report and slide deck at Elnora: a markdown knowledge base, a terminal agent, a paragraph-by-paragraph read, six legal reviewers, and a PDF rendered in the same browser that designed it.
Carmen Kivisild
Founder and CEO
The number one thing everyone wants AI for, scientist or not, is everything around documents. Statements of work, slides, reports, graphs, videos, the whole pile. This is exactly how I draft mine, and the same loop works for almost every format.
The foundation is a knowledge base
Ours is under a year old and already holds more than 2000 documents. Every blog post worth keeping, YouTube transcripts, every call transcript, previous applications, internal notes, all of it. The structure is just folders inside folders of markdown and CSV files. We use Obsidian on top to make it readable as a human, and the whole vault is synced and backed up through shared drives. The agents we run on top are Claude Code, in the terminal, and they can reach our email, our calendar and our Slack through a small set of command-line tools we wrote for the purpose.
When I need to draft something, I give the agent the most accurate description of what I want and exactly where to look. For a statement of work the prompt sounds like this: go to the CRM (which is also part of the knowledge base, just markdown and CSV), pull the client details, read the call transcript from yesterday, walk through the email thread, read the file they sent, and draft me an SOW based on all of that. Save it as a new markdown file in the vault. If anything is missing, search the web for it, or ask me.
We already have templates and scripts inside our design plugin, so the agent knows the exact SOW structure, which sections need to be there, and what data populates each field. It is basically a fill-in-the-blanks job. The agent builds a task list, searches the vault, the inbox and the web, and drops the first draft as markdown.
Reading it paragraph by paragraph
My next move is to ask the agent to walk me through the draft paragraph by paragraph in the terminal. I read each paragraph out loud, suggest edits, and the agent applies them straight into the markdown file. Once we have walked through the whole thing together I open it in Obsidian and read it once more. The terminal pass is for the words. The Obsidian pass is for how the tables, the headers and the whole document feel as one piece.
Then I run it past our legal agents. We have six of them, specialised in contracts, IP, employment, corporate, compliance and risk, and they almost always have something to say about IP, success criteria and payment terms. I am not a lawyer, but I do have a sense of taste and critical thinking, so I sit with each suggestion and decide whether it is real or noise.
Rendering in the browser
Once the words are locked I ask the agent to render the document in the browser. Agents are extremely good at writing code, so building a clean, professional HTML version of any document is easy for them. The agent drives my Chrome through a developer-tools connection, which means it can actually see its own work. Our design plugin has a design.md file with our logo, brand colours and typography (we call it the Elnora Brand system), and agents love that file. The first render is usually pretty good already.
This is where my workflow flips. I have taste in writing, legal, accounting, building agents. I have zero taste in design. So I almost never tell the agent what I want. I tell it what I do not like. Logo too small, layout too cramped, spacing feels off. And it iterates until I actually say this looks good.
When the design is locked I ask the agent to save the HTML as a PDF. We render through headless Chrome via a small Python script, so the same browser that designed the page also prints it. There are always small conversion issues. The agent can see the HTML through the browser, but it cannot see the PDF, so I take screenshots and feed them back until the PDF matches what we built in the browser.
The same loop works for almost everything. A graph is a markdown spec describing colours and structure, then HTML, then exported as PNG. A graph that depends on data is a CSV plus Python (pandas, numpy, scipy) for the stats. Videos are the same idea, just with Remotion rendering the frames.
Sending it, by hand
Once the PDF is ready I have the agent draft the customer email with the PDF attached, which writes the email straight into my drafts folder. Then I open the mail client, verify the draft looks exactly as I want, and press send myself. The agent could send for me, but pressing send by hand gives me a sense of control. One time the agent attached the markdown version of the SOW instead of the PDF and the client emailed back asking what on earth the file was and how to open it. Never again.
And the most important part comes after. I save every script, every design decision and every template back into the knowledge base and the design plugin. So the next time I draft an SOW, the design comes out exactly the same as the last one, and the agent starts from what already worked instead of from zero.
If you run a lab or a small company and want to see this loop on your own documents, the fastest way is to bring one real document to an intro call and watch it go through the whole thing.

Carmen Kivisild
Founder and CEO, Elnora
PhD in molecular biology, ran a wet lab before founding Elnora. Writes about running a company with agents and about what scientists actually need from them.