Projects
Open source work, experiments, and tools — organised by what motivated them, not just what they do. Full history at github.com/mattjoyce.
Recent
A Go implementation of the LocalSend protocol — library, CLI, and headless daemon for homelab, automation, and AI agents; LAN-local, secure, and interoperable with the official LocalSend apps
I wanted my agents to move files across the LAN, and the Go LocalSend modules I found didn't meet the bar I needed for design, security, or headless use. So I set out to build one that did, starting from an audit of what the others got wrong. The result is three things over one core — an embeddable library, a machine-readable CLI, and a supervised daemon that pushes a typed 'received' event so a consumer never watches a folder or races a half-written file. I then red-teamed my own build: an adversarial pass produced 21 tracked findings, and every critical and high was fixed before I tagged v1.0. The remaining findings each carry a recorded accept-or-harden disposition — the security judgement is mine, not a scanner's.
Self-hosted, local-first deep-reading app for Markdown — Progressive Reveal Reading paces a document into chunks you pull in one at a time, trading speed for attention
I read a lot of long-form Markdown and kept skimming things I meant to actually read. Parsem is the reaction: instead of optimising for speed it paces a document into chunks you pull in deliberately, with a regenerating bucket that won't let you gulp the whole thing in one sitting. Revealed text stays above the cursor, so the document grows beneath your eye instead of falling away above it. Under the reading mechanic is the part I cared most about — an immutable atomic-chunking substrate where the same source always produces the same chunks, and a single-pass cursor engine driven by priority-ordered rules, so a 'chunking strategy' is just a hashable tuple of rules you can version and swap. It stays a pure receiver: I drop a PDF in and ductile runs it through docling to produce the markdown — getting an acceptable PDF-to-markdown conversion working took real effort to dial in — and the cleaned-up result lands in front of Parsem ready to read.
Autonomous agent orchestration service — runs a staged Frame/Plan/Act/Reflect loop with tool use, persistent workspace memory, and async execution
After building ductile, I wanted to experiment with agent workflow design by building a small agent I could trigger via API to pursue a goal. The Frame/Plan/Act/Reflect loop is deliberately explicit — I wanted to understand how agents decompose work before trusting them to automate anything real. AgenticLoop can query ductile for available plugins and compose them to solve tasks.
An automation runtime AI agents can run, debug, and build for — scoped capabilities, policy routing, reliable job execution, and auditable plugin operations. Reached v1.0 in June 2026.
Senechal taught me what I actually wanted: a personal service layer that an LLM could operate, not just call. Ductile is the redesign — Go instead of Python (simpler to deploy), with a plugin architecture so capabilities can be added without touching the core. The key design principle was treating the LLM as a first-class operator: commands like 'skills' return a plain-text narrative written for an LLM to read, so the agent can discover what's available and how to use it without any out-of-band documentation. --skills is the new --help. Built using Claude, Codex, and Gemini. Now at v1.0.
Discord bot companion for ductile
Started as a set of Discord slash commands to trigger ductile plugins directly. Building it revealed what I actually wanted: not a command interface, but a conversational one — message a bot, have it figure out which plugin to use. That's not a ductile problem, that's an agent problem. This will likely evolve into a Discord front-end for AgenticLoop.
AI skill to manage a markdown file based kanban workload
I needed a way to coordinate three LLMs while building ductile — shared task state they could all read and update without a database or a server. I'd had the idea for a text-based kanban for a while, so I used the opportunity to try it. What surprised me was how fluid it became in practice: any time a new idea or concern surfaced I could just say 'make a card for that', flick to another agent, ask it to critique a proposal, and have it append its comment to the card. The unanticipated flaw: you have to be disciplined about which git branch you're on when cards are created. A dedicated kanban branch is probably the right fix.
Matt Joyce's Claude Code plugin marketplace
A convenience repo for installing kanban-skill into Claude Code, with room to grow. The intent is to collect reusable skills as I build them — a personal marketplace that makes it easy to wire up new capabilities without reinventing the setup each time.
Also
- luminary-prompts ★ 8 — Paired-thinker prompts for software design review and code audit — eight stereo lenses drawn from sixteen luminaries, so a review is argued from complementary perspectives rather than one voice
- mcp-persona-sessions ★ 8 — MCP server for persona-driven AI sessions: interviews, guided reflection, role-play
- roundtable-consensus — Auditable consensus for AI/human teams - democratic decision-making with traceability
- change-of-mind — Intelligent LLM routing based on user persona and task characteristics
- mcp-construe ★ 9 — FastMCP server that loads personal context from Obsidian vaults using frontmatter filtering
- obsave ★ 20 — Go CLI to pipe content into Obsidian vault with frontmatter injection
- ifyoureallyknewme ★ 3 — Knowledge management system that accretes information about a person for LLM use
- senechal ★ 1 — Personal API - core service with MCP, Discord, and Google integrations
- gotok ★ 5 — Go CLI to count LLM tokens
- google-oauth-client — FastAPI-powered Google OAuth 2.0 client with automatic token refresh and SQLite storage
- unraid-rrdtool ★ 5 — Docker for rrdtools with configuration to produce graphs from data
- tree-signal — Lightweight treemap-based hierarchical message dashboard for Unraid/Docker