Jira for AI Agents & Humans
First things first: don't worry, I didn't re-invent Moltbook here. Every startup I know runs on 3 tools too many. A board here, a Notion doc there, a Slack thread that became the de facto spec. At fluado , where we build AI agents for entreprise, a new layer crept in over the past weeks: agents writing markdown into our docs repo. Sprint tickets, completion reports. Dozens of files. The filesystem became the source of truth. The project board didn't. Arbo and I talk every day. Multiple times. But conversations don't leave a trace you can point at. Jira was supposed to be that trace. When we opened it this morning, it still showed the state from 4 weeks ago. Nobody had touched it. I wrote previously that AI is a productivity multiplier if you already have your house in order. Turns out, tha
First things first: don't worry, I didn't re-invent Moltbook here.
Every startup I know runs on 3 tools too many. A board here, a Notion doc there, a Slack thread that became the de facto spec. At fluado, where we build AI agents for entreprise, a new layer crept in over the past weeks: agents writing markdown into our docs repo. Sprint tickets, completion reports. Dozens of files. The filesystem became the source of truth. The project board didn't.
Arbo and I talk every day. Multiple times. But conversations don't leave a trace you can point at. Jira was supposed to be that trace. When we opened it this morning, it still showed the state from 4 weeks ago. Nobody had touched it.
I wrote previously that AI is a productivity multiplier if you already have your house in order. Turns out, that includes your project board.
So I pitched Arbo: what if we build a tiny board that just reads the markdown files that already exist? A window on top of reality.
He was skeptical. I wasn't sure it would survive the afternoon either. But the alternative was spending the morning updating our Jira board again, potentially going stale within the week.
By late afternoon, Jira was gone. All tickets migrated. Both of us and our agents working in the same board.
The board
Our agents already work in markdown. They create files with YAML frontmatter and write reports. So why funnel that through a SaaS board designed for humans clicking buttons?
Every task lives in a folder inside backlog/. The folder name encodes date and category. Inside, a constellation of markdown files:
backlog/ ├── 2026-03-26-CHAT-UX/ │ ├── chat-ux-milestones.md # the plan │ ├── chat-ux-tickets.md # broken into tasks │ ├── CUX0-report.md # agent completion report │ └── CUX1-report.md ├── 2026-03-27-AGENT-I18N/ │ ├── agent-i18n-milestones.md │ ├── agent-i18n-tickets.md │ ├── I0-report.md │ ├── I1-report.md │ └── i18n-audit-report.md └── 2026-04-01-OPS-DEPLOY-STAGING/ └── CARD.md # simple card, no sub-tasksbacklog/ ├── 2026-03-26-CHAT-UX/ │ ├── chat-ux-milestones.md # the plan │ ├── chat-ux-tickets.md # broken into tasks │ ├── CUX0-report.md # agent completion report │ └── CUX1-report.md ├── 2026-03-27-AGENT-I18N/ │ ├── agent-i18n-milestones.md │ ├── agent-i18n-tickets.md │ ├── I0-report.md │ ├── I1-report.md │ └── i18n-audit-report.md └── 2026-04-01-OPS-DEPLOY-STAGING/ └── CARD.md # simple card, no sub-tasksEnter fullscreen mode
Exit fullscreen mode
The milestones file is the plan. Tickets break it down. Reports are what the agent produces when it finishes a milestone. CARD.md is for simple tasks with nothing to break down. Each folder's canonical markdown file carries the YAML frontmatter the board reads:
--- title: "Chat UX Improvements" type: product status: wip assigned: yves created: 2026-03-26 edited: 2026-04-01 ------ title: "Chat UX Improvements" type: product status: wip assigned: yves created: 2026-03-26 edited: 2026-04-01 ---Enter fullscreen mode
Exit fullscreen mode
An agent creating a task does mkdir and writes a markdown file with the right frontmatter. The schema is simple enough that the agent infers it from existing files in the folder. When it gets the frontmatter wrong, the board just skips the file. I notice in the git log and fix the YAML in 10 seconds.
I scroll through the folder tree in my IDE. The board renders the exact same structure in the browser. Three columns: todo, wip, done. Drag a card to change its status, or click a title to rename it inline. Every card has an "Open in Editor" button that pops the file.
If someone edits a backlog file in the IDE, the board server notices immediately. A file watcher monitors backlog/, debounces for 5 seconds, auto-commits to git. You save, git syncs.
The sync
What's the simplest thing that could keep 2 people and a handful of agents looking at the same state? Git.
Every board action triggers an immediate commit and push:
[15:42:06] 📝 committed: move CHAT-UX to done [15:42:07] ⬆ pushed [15:43:12] 📝 committed: create OPS-DEPLOY-STAGING as todo [15:43:13] ⬆ pushed [15:44:30] 📝 committed: rename AGENT-I18N [15:44:31] ⬆ pushed[15:42:06] 📝 committed: move CHAT-UX to done [15:42:07] ⬆ pushed [15:43:12] 📝 committed: create OPS-DEPLOY-STAGING as todo [15:43:13] ⬆ pushed [15:44:30] 📝 committed: rename AGENT-I18N [15:44:31] ⬆ pushedEnter fullscreen mode
Exit fullscreen mode
For incoming changes, the server polls git ls-remote every 5 seconds. One SSH roundtrip, one SHA comparison. When the remote has new commits, it pulls and logs what came in:
[15:45:10] ⬇ synced from remote: abc1234 board: move AGENT-I18N to wip def5678 board: update 2026-04-01-SURFACE[15:45:10] ⬇ synced from remote: abc1234 board: move AGENT-I18N to wip def5678 board: update 2026-04-01-SURFACEEnter fullscreen mode
Exit fullscreen mode
The browser updates via Server-Sent Events. The board re-renders silently, so if you're mid-way through editing a card or filling in a form, nothing gets nuked. I learned that one the hard way. First version did location.reload(). :D
The same flow works in reverse. When an agent finishes a milestone, it commits a report to the backlog folder, pushes to git. 5 seconds later, the board picks it up and the new file appears in the card's detail view. I don't have to ask the agent if it's done. I see it on the board.
The board code itself lives in the same repo. It runs through nodemon, so when one of us pushes a fix to the server, the remote poll pulls it in, nodemon restarts, and the new frontend arrives via SSE. I changed the CSS at 15h00. By the time I switched to my browser tab, the new styles were there. Arbo saw them too.
Cards are sorted by modification time, descending. Most recently touched card floats to the top. I tried implementing manual drag ordering with fractional indexing. Used it for 5 minutes. Threw it away. The filesystem already knows what I'm working on.
What actually changed
We kept working the way we already worked. Arbo & I in our IDEs and board, agents committing to backlog/. Git ties it all together. The whole stack is vanilla HTML/CSS/JS, zero build step, zero npm dependencies. http.createServer, some YAML parsing, and fs.watch.
A note on scale
I keep seeing "SaaS is dead, AI can build anything" takes in my feed. This works for a team of 2 humans and a handful of agents. I have no idea if it can or should replace Jira in a team of 10. Will this board survive 6 months? I don't know.
What I do know is that we spent a morning building it and an afternoon using it. By evening, the board had 14 cards across 3 columns. Arbo dragged one to WIP while I was writing this. I saw it move.
We didn't replace Jira because we were unhappy with it. We replaced it because the real board already existed in our filesystem. Jira was a copy of it that nobody maintained. So we deleted the copy and put a window on the original.
The tool fits how we work because we built it around how we work. That's not a universal lesson. It's ours.
If you want to see what we build next, subscribe to the newsletter or follow us on LinkedIn, Mastodon, or Bluesky.
Got a process that needs an agent? Let's talk.
Sign in to highlight and annotate this article

Conversation starters
Daily AI Digest
Get the top 5 AI stories delivered to your inbox every morning.
More about
versionupdateproduct
Seedance 2.0 API: A Technical Guide to AI Video Generation with Pricing and Integration Examples
This post covers the Seedance 2.0 API — a unified AI video generation interface from EvoLink.ai that exposes text-to-video, image-to-video, and reference-to-video capabilities through a single consistent API. The focus here is on technical integration patterns, model selection logic, and cost modeling — the parts that matter when you’re building a real system around this. API Design: Unified Async Task Model The central design of Seedance 2.0 is a unified async task pattern across all generation modes. Rather than separate endpoints with different request and response schemas, every generation request follows the same lifecycle: POST /v1/videos/generations — submit task, receive ID immediately GET /v1/tasks/{id} — poll for status and progress Download video from result URL once status == "
Knowledge Map
Connected Articles — Knowledge Graph
This article is connected to other articles through shared AI topics and tags.
More in Products

Seedance 2.0 API: A Technical Guide to AI Video Generation with Pricing and Integration Examples
This post covers the Seedance 2.0 API — a unified AI video generation interface from EvoLink.ai that exposes text-to-video, image-to-video, and reference-to-video capabilities through a single consistent API. The focus here is on technical integration patterns, model selection logic, and cost modeling — the parts that matter when you’re building a real system around this. API Design: Unified Async Task Model The central design of Seedance 2.0 is a unified async task pattern across all generation modes. Rather than separate endpoints with different request and response schemas, every generation request follows the same lifecycle: POST /v1/videos/generations — submit task, receive ID immediately GET /v1/tasks/{id} — poll for status and progress Download video from result URL once status == "

Tied Designing a 8 bytes PDAP BINARY based on JSON 404 and TOON 171, T-TOON 130 and A TOKENIZED T-TOON 112 not sure if it works in Real World Applications?
TOTAL: 8 bytes, zero parsing overhead ``` **What we eliminated:** Field names (`“disk”`, `“byte”`, `“value”`) Length prefixes Token tables / dictionaries Schema metadata Repetition & redundancy **What we kept:** Fixed positional meaning (byte 0 = disk0, byte 1 = disk1, etc.) Pre-agreed protocol between sender/receiver Direct memory mapping → CPU can load in 1–2 instructions -– ## Working Code: PDAP Binary Encoder/Decoder (JavaScript) ```javascript // PDAP Binary: 8-byte ultra-compact format class PDAPBinary { // Encode: 32-bit value + 4 disk bytes → 8-byte Buffer static encode(value32, diskBytes) { if (diskBytes.length !== 4) throw new Error(‘Exactly 4 disk bytes required’); const buffer = Buffer.alloc(8); // Bytes 0-3: 32-bit value (big-endian) buffer.writeUInt32BE(value32 >>> 0, 0); // B



Discussion
Sign in to join the discussion
No comments yet — be the first to share your thoughts!