--- title: "hosti: a self-hosted home for my AI agents' HTML reports" description: 'My agents explain their work as HTML pages. Then they moved to Discord and I moved to my phone, and a file on my PC stopped being enough.' pubDate: 'October 4, 2026' tags: ['AI', 'Side Projects'] draft: false --- [hosti](https://hosti.kubaszwajka.com) is a small self-hosted catalog for the HTML pages my agents make. It's MIT and it's [on GitHub](https://github.com/JakubSzwajka/hosti). ## Why I made it When an agent plans a change, digs into a bug or compares two ways to build something, I ask it for an HTML page. Diagrams, a table, a short "why", the risky parts marked. I read that way faster than a wall of text in a terminal. The agents from [the box and the loop](/blog/how-i-build-small-products-autonomously-hetzner-swarm-and-agent-loops) pick up specced items, open PRs and report to me on Discord. The agent writes `report.html` on my PC and posts "done, see report.html". Great, thanks. I'm not at my desk, and the Discord message is just a path. ## How it works The agent pushes a bundle, a folder with an `index.html`. One command: ```bash $ hosti push ./report --slug flaky-tests --title "Flaky tests" pushed revision 1 private nothing answers at the share URL admin https://hosti.example.com/b/flaky-tests ``` The last line is the owner link. The agent drops it in Discord, I tap it, and the page opens because I'm logged in to hosti. Wherever I am. Toilet included. For anyone without my login that link is a dead end. If the agent pushes the same slug again, it's a new revision behind the same link, so I just reload.
agent done with a task wrote index.html hosti private /b/flaky-tests Discord "done, here:" the owner link me logged in reading push link tap agent done with a task, wrote index.html hosti private /b/flaky-tests Discord "done, here:" the owner link me logged in reading push link tap
The trip a page takes now.
## Goodies - **Sharing, only when I ask.** I hate it when a teammate drops a copy-pasted thread from their Claude chat into Slack. I don't want to be that guy. Still, sometimes an idea I worked out with an agent is worth showing someone, so I share the page. A link or a PIN, and `hosti rotate` if a link went further than I meant. - **Live cards.** Every bundle in the catalog is a card, and the card is the real page in a sandboxed iframe, not a screenshot. I find "that thing from last week" by how it looks. - **The agent never gets my password.** It runs `hosti login`, I check the code it prints and approve. It can delete only if I tick that box myself. - **A skill.** `npx skills add JakubSzwajka/hosti` and the agent knows how to push, when to share, and to hand me the link exactly as printed. ![The hosti catalog: every bundle is a card with its live page inside, marked pin, link or private.](/blog-images/self-hosted-html-reports-for-ai-agents/catalog-grid.webp) Everything else is in [the README](https://github.com/JakubSzwajka/hosti#readme). One rough edge. My agents sometimes make a new slug when they should push a new revision, so I get a second link for the same report. I haven't taught them to prefer a revision yet. Anyway. The landing page is [hosti.kubaszwajka.com](https://hosti.kubaszwajka.com) and the code is [on GitHub](https://github.com/JakubSzwajka/hosti). Ping me if you try it, or if your agents also keep sending you paths to files on a machine you're not sitting at.