Moving your TODO.md into Hamloy: no upload, no format to learn
Your agent brings in work kept in a TODO file, a plan, issues or another tool's lists in one call, options and what waits on what intact.
10 October 2026 · Rahmakyan
Your work is already written down somewhere: a TODO.md, a plan in docs/, a checklist in the README, issues, FIXME comments, a Notion export. Moving it into Hamloy takes one sentence to your agent. It reads the work in whatever shape it's in and brings it all in with one call. There is no upload and no format to learn. A question keeps the option you'd pick, "blocked by #7" still means something, and bringing it in twice adds only what's new.
Below are four moves from Hamloy's own test runs on scratch projects, with the replies word for word.
Why there's no upload button
An upload wants one format: a CSV with the right columns, or one tool's export. Real projects keep their work in three formats, half of it in prose.
Your agent already reads all of that. So Hamloy leaves the reading to the agent and keeps one job for itself: checking that what comes in is one clean list. The import tool takes each list as a plain Markdown checklist, which the agent writes from whatever it found.
An empty project, and the agent finds the plan by itself
A new project, a repo with a PLAN.md of GitHub-numbered items, and a plain question to Codex: "What should I work on first? Just answer, don't change any files."
Hamloy's reply to the list call said the project was empty and to look for where the work was kept. Codex read the repo, answered from PLAN.md, and ended with:
The plan is in PLAN.md. Would you like to bring it into Hamloy?
After a yes, one call brought it all in. The issue numbers came along as ids, so the checkout task still waits on the Mollie account:
• Called hamloy.import({"project":"Plant shop 3","lists":{"task":"## Milestone 1: launch\n- [ ] Checkout with Mollie — blocked by #7 <!-- id:4 needs:7 -->\n…","request":"## For the owner\n- [ ] Create the Mollie account and send me the API key <!-- id:7 -->","question":"…"}})
└ brought in 5 tasks, 1 request, and 1 question (1 done)
[ ] B-wdj8@1 Checkout with Mollie — blocked by #7 (waits on R-uav2)
The Mollie account landed on Requests, the list of what only you can do.
Work in four places comes in as one list
A second repo kept its work in four places: a README checklist, an exported issues CSV, TODO and FIXME comments in the code, and a Notion export with a table. Asked "What's left to do on this site?", Haiku read all four. It noticed that the README's "Order form" was issue #12, and ended: "Should I bring it all into Hamloy with the import tool? I haven't changed anything."
After a yes, one call:
⏺ hamloy - Bring in work kept elsewhere (MCP)(lists: {"task": "## Site\n- [x] Pick fonts\n- [ ] Order form for cakes <!-- id:T2 needs:R1 prio:high -->\n…", "request": "- [ ] Get the cake price list from Hana <!-- id:R1 -->", "question": "- [ ] Do we take deliveries? …"})
⎿ brought in 10 tasks, 1 request, and 1 question (3 done)
Done items stayed done, the priority came along, and the order form waits on the price list.
The same task twice is refused before anything lands
On the same repo, Codex gave the order form twice, once from the README and once from the issues. Hamloy refused the whole call:
Nothing was brought in: “Order form for cakes” is given twice in backlog; give it once, in the list it belongs to.
Codex merged the two and the next call went through. An import comes in whole or not at all. That's why a refusal costs nothing: you never end up with half a list to clean up by hand. The same goes for a task that waits on one that isn't there, or tasks that wait on each other in a circle.
Bringing it in again adds only what's new
Back in the plant shop, someone added a line to PLAN.md and asked to "bring it in again". Only the new line came:
└ brought in 1 task
left out, already here: B-m35c "Product pages for the 40 plants (in progress, Sam)"; B-wdj8 "Checkout with Mollie — blocked by #7"; …
An item its list already has, by title, is left out, and the reply names each one. So a half-finished move, or a teammate who kept writing to the old file for a day, is easy to catch up.
Questions keep the option you'd pick
A plan's open questions are often the most useful part, and the easiest to lose. One repo wrote them in its own style: headings, each option on a line of its own with no dash, the pick marked inline:
**A (recommended):** Postmark: simple, good delivery, €15/month
Option 1 — Chart.js (recommended, smallest)
Codex moved the repo in with one call. Every question came across with its options and the recommended one marked:
questions
[ ] Q-4kxs@1 Which email provider for the weekly summary? options: 1) Postmark: simple, good delivery, €15/month (recommended) 2) Amazon SES: cheapest, more setup 3) Resend (1 note)
[ ] Q-pt1z@1 Which charting library? options: 1) Chart.js (recommended) 2) ECharts 3) D3 by hand (1 note)
When a question arrives with no recommended option, the reply says so. The agent can check the source rather than you finding out later:
brought in 2 questions
no recommended option, so the human picks with none marked: Q-82he; if the old place recommended one, mark it with edit
On the board, each question is a card: one tap on an option answers it, and the agent carries on.
Answering this lets Offline sync with a local SQLite cache go ahead.
• I asked you where synced habits should live (Q-sy2c). Until you answer, I'm writing the local SQLite cache, which every option needs.
What happens to the old file
After the import, the reply tells the agent that the work lives in Hamloy from now on. If it came from a file, the agent asks whether to delete the file or leave one line in it saying the work moved. The history on the board says who brought what in, as one entry.
History, claims and messages from the old place don't come. Neither does a log of past work, like test rounds or a changelog: that stays in its file, and only the open work moves.
To try it, connect your agent (Claude Code, Codex or any other app) and ask it to bring your TODO.md in. Everything that comes across is listed in the import docs.