---
title: "Developer-Tools"
url: https://www.grahambrooks.com/tags/developer-tools/
---

# Developer-Tools

- [Open source update: six new tools and what changed, September to October 2026](https://www.grahambrooks.com/post/open-source-update-october-2026/index.md) (2026-10-25): A roundup of my public GitHub projects from 1 September to 25 October 2026: 92 releases across 27 repositories, six tools released for the first time or never introduced here, the releases that changed behaviour, and the work sitting on main that hasn't shipped yet.
- [Reading a change as two aligned files, in a terminal (increment)](https://www.grahambrooks.com/post/increment-aligned-diffs-in-the-terminal/index.md) (2026-10-25): increment (the command is inc) is a terminal diff viewer built around the aligned side-by-side view: corresponding lines level with each other, word-level highlighting, folding you can undo, moved blocks shown as moves, and a commit-by-commit branch review. An introduction, and an honest comparison with delta and difftastic.
- [Mermaid to SVG without a browser, and with the labels still there (mmd)](https://www.grahambrooks.com/post/mmd-mermaid-to-svg-without-a-browser/index.md) (2026-10-25): mmd renders Mermaid flowcharts, gitGraph and C4 context diagrams to SVG in pure Rust, with real <text> labels so the output survives conversion to PDF. An introduction to what it does, what it deliberately doesn't, and why it's 3,250 lines rather than 40,000.
- [teleplot 2026.10.0: Kibana dashboards without Kibana, in one binary](https://www.grahambrooks.com/post/teleplot-first-release/index.md) (2026-10-25): teleplot v2026.10.0 is the first release of a single-binary, view-only dashboard server that renders Kibana exports and its own YAML dashboards straight from Elasticsearch 8.x and 9.x.
- [infographic v2026.10.1: the first release, with animated SVG explainers from a one-line request](https://www.grahambrooks.com/post/infographic-first-release/index.md) (2026-10-25): infographic v2026.10.1 is the first release of a Claude Code skill and Rust CLI that turn a one-line request into an animated, checked SVG explaining a technical pattern, with prebuilt binaries for macOS and Linux.
- [backstage-catalog-graph v2026.10.24: the first public release, with a graph you can navigate](https://www.grahambrooks.com/post/backstage-catalog-graph-first-release/index.md) (2026-10-25): backstage-catalog-graph v2026.10.24 is the first public release of editor plugins for VS Code and JetBrains IDEs that draw a Backstage catalog-info.yaml as a graph, with dashed placeholders for everything the file references but doesn't declare.
- [symgraph v2026.10.18: a vendored minified file stops topping your dependency graph, and an export for analytics](https://www.grahambrooks.com/post/symgraph-2026-10-18-export/index.md) (2026-10-19): symgraph v2026.10.18 keeps generated and minified code out of the dependency graph and adds `symgraph export`, which writes coupling and per-commit change-impact records as JSON Lines.
- [puml 2026.10.2: diagrams as diagram-scene scenes, and lost messages parse](https://www.grahambrooks.com/post/puml-2026-10-2-scenes/index.md) (2026-10-14): puml 2026.10.2 can hand sequence, class, activity and state diagrams to a host application as diagram-scene scenes, and parses PlantUML's lost-message arrow. The rest is dependency updates.
- [forge 2026.10.2: forge as a library, with views as diagram-scene scenes](https://www.grahambrooks.com/post/forge-2026-10-2-library/index.md) (2026-10-14): forge v2026.10.2 can be used as a Rust library that parses a .forge model and lays its views out as diagram-scene scenes, so a host application can draw them natively. The rest of the release is dependency updates.
- [diagram-scene v2026.10.0: a laid-out diagram as plain data](https://www.grahambrooks.com/post/diagram-scene-first-release/index.md) (2026-10-14): diagram-scene v2026.10.0 is the first release of a Rust library that describes a laid-out software diagram as data, so layout engines and painters stop being coupled to each other.
- [When an agent can already write the file, what is an MCP server for?](https://www.grahambrooks.com/post/what-is-an-mcp-server-for/index.md) (2026-10-04): If an agent can already write your tool's file format, an MCP server has to give it something the file can't: live discovery, validation against the real system, a preview of the result, and a save with rules. Teleplot's endpoint was built only because it passed that gate, and it passed more narrowly than I first thought. Most MCP servers should fail it and be a file format plus a linter.
- [The release pipeline four tools kept reinventing (release-kit)](https://www.grahambrooks.com/post/release-pipeline-as-a-tool/index.md) (2026-09-27): Once you have more than a few single-user tools, the release process is a tool too. Its one user is you, and copying it into every repo is the per-repo config layer all over again. release-kit v2 moved four Rust tools onto one tag-driven pipeline, and a fix to it became a copy rather than four separate repairs.
- [Stop declaring what you can already read (myspec)](https://www.grahambrooks.com/post/stop-declaring-what-you-can-read/index.md) (2026-09-27): Once an agent's toolchain has enough moving parts (plugins, skills, MCP servers, modes, hooks), convention and hope stop being enough, and it needs the discipline of a real system: versioned migrations, deterministic gates, and one source of truth per fact. In myspec, the clearest example was a mode flag the developer had to set by hand. It drifted, and the proposed fix is to read the mode from where it already lives.
- [forge 2026.9.8: a JetBrains preview and models on stdin](https://www.grahambrooks.com/post/forge-2026-9-8-jetbrains-preview/index.md) (2026-09-26): forge 2026.9.8 adds a live diagram preview plugin for JetBrains IDEs and lets build, check and export read a model from stdin, so unsaved editor buffers can be rendered.
- [Letting an agent read your mail: split the reader from the network](https://www.grahambrooks.com/post/letting-an-agent-read-your-mail/index.md) (2026-09-26): An agent that reads your inbox is reading text written by strangers, so whether the model behaves is the wrong question. The useful question is what the process holding that text can do. In the twin's mail reader, the answer is enforced by the OS rather than asked for in a prompt: the one process that can see Mail can't touch the network, and the model that ranks the mail has no tools. Some things still get through, and they're worth naming.
- [Cadence is a budget line: what scheduled automation cost a private repo](https://www.grahambrooks.com/post/cadence-is-a-budget-line/index.md) (2026-09-26): My GitHub Actions budget ran out, and development CI wasn't what used it up. Automation that mostly found nothing to do spent it. In a private repository, how often a scheduled workflow wakes up is a cost decision rather than a latency decision, and automation should be designed around what each wake-up costs.
- [Making a Code Graph Admit What It Doesn't Know (symgraph)](https://www.grahambrooks.com/post/symgraph-admitting-what-it-does-not-know/index.md) (2026-09-22): A code-intelligence index answered every question it was asked. Sixteen percent of its call edges pointed at things that cannot be called, its truncated lists said nothing about being truncated, and one of its tools had never worked at all. The month's work was almost entirely about replacing confident answers with calibrated ones.
- [Building Your Own Tools](https://www.grahambrooks.com/post/building-your-own-tools/index.md) (2026-09-07): Agents made it cheap to build software. The interesting consequence isn't that you can build more of it — it's that you can build software for exactly one known user, and software with one known user gets to delete its entire configuration layer.
- [Giving the Consumer a Representative in the Working Tree (brake)](https://www.grahambrooks.com/post/brake-exit-criteria-for-the-consumer/index.md) (2026-08-24): Every signal an agent uses to decide it is finished — compiler, tests, linter — is a question about the repository it is standing in. The consumers of the API it just changed are somewhere else entirely. brake makes 'who does this break?' answerable from files already in the tree, with no network, no broker, and no running service.
- [Architecture the Agentic Loop Can Actually Check (tropism)](https://www.grahambrooks.com/post/tropism-architecture-in-the-agentic-loop/index.md) (2026-08-08): Coding agents get fast feedback from compilers, tests, and linters — all of which are local. None of them knows the shape of the system. Tropism is an attempt to close that gap: one architecture ruleset, ten languages, no build, no network, sound enough to block a commit.
- [Porting Midje's Arrow to Rust (facts)](https://www.grahambrooks.com/post/facts-rust-testing-library/index.md) (2026-05-25): Why Clojure's `actual => expected` reads better than the testing toolbox Rust ships with, and what survives the port.
- [Running Local MCP Servers Without a Node or Python Runtime (bx)](https://www.grahambrooks.com/post/bx-lighter-mcp-servers/index.md) (2026-05-23): MCP server configs across the ecosystem default to npx . That quietly forces a Node runtime onto every machine that wants to run a native binary tool. bx is the missing primitive for the other case. I spent the weekend…
- [Team Code Review Without the Server: a CLI (casual-review)](https://www.grahambrooks.com/post/casual-review-cli-team-code-review/index.md) (2026-04-30): Most code review tools want to be a service. The interesting question is what falls out when you refuse to run one — and use git itself as the sync layer instead. I’ve spent the last few weeks building casual-review…
- [A Rust-Native Architecture Toolchain: forge, puml, and adoc](https://www.grahambrooks.com/post/rust-native-architecture-toolchain/index.md) (2026-04-26): A Rust-Native Architecture Toolchain: forge, puml, and adoc Replacing the JVM and Ruby pieces of the architecture documentation stack with single static binaries Most of the tools I reach for when documenting architecture were built in another era. PlantUML wants…
- [Sandboxing AI Coding Agents: Why Isolation Matters](https://www.grahambrooks.com/post/ai-coding-isolation/index.md) (2026-03-22): The more context and tools an AI coding agent has access to, the better it performs. But more power means more risk. How do we harness the full capability of AI coding assistants while keeping our systems safe? The Problem:…
- [Exploring Your Backstage Catalog Without Backstage](https://www.grahambrooks.com/post/exploring-your-backstage-catalog-without-backstage/index.md) (2026-02-21): Exploring Your Backstage Catalog Without Backstage How bsv gives you instant visibility into your software catalog from the terminal Backstage has become the de facto standard for software catalogs. Thousands of organizations use it to track their services, APIs, teams,…
- [Seeing Your Codebase as a City](https://www.grahambrooks.com/post/seeing-your-codebase-as-a-city/index.md) (2026-02-21): Seeing Your Codebase as a City Why we need better ways to understand code at scale – and how 3D visualization can help Software teams accumulate code the way cities accumulate buildings. One project at a time, one service at…
- [Visualizing Project Structure with rv](https://www.grahambrooks.com/post/visualizing-project-structure-with-rv/index.md) (2026-02-21): Visualizing Project Structure with rv A fast, interactive way to see what’s actually in your project Every developer has had the experience of opening an unfamiliar codebase and trying to figure out what’s where. You run tree , get a…
- [Building a Code Knowledge Graph for AI Agents](https://www.grahambrooks.com/post/building-a-code-knowledge-graph-for-ai-agents/index.md) (2026-02-15): Building a Code Knowledge Graph for AI Agents How I rebuilt codegraph in Rust to give AI coding assistants a semantic map of your codebase There’s a fundamental tension at the heart of agentic coding today. AI models are remarkably…
- [Vibe Coding](https://www.grahambrooks.com/post/vibe-coding/index.md) (2026-01-25): Vibe Coding is an innovative approach to software development that emphasizes creativity, flow, and emotional engagement in the coding process. It encourages developers to tap into their intuition and passion for coding, fostering a more enjoyable and productive work environment.…
- [Text fingerprints](https://www.grahambrooks.com/post/2021-06-06-text-fingerprinting/index.md) (2021-06-06)
- [](https://www.grahambrooks.com/post/2018-12-09-of-languages-and-containers/index.md) (2018-12-09): At the start of my career I worked with fairly dumb terminals and mainframes. Programs were natively compiled but resources were limited and shared with the other users of the system. Shared computing power meant that we favored languages that…
- [Emacs es-mode - REPL experiences for ElasticSearch development](https://www.grahambrooks.com/post/2016-08-09-elasticsearch-emacs-mode/index.md) (2016-08-09): I don’t usually write reviews but I was so deleted by es-mode for emacs that I felt compelled to share. If you have worked with REST APIs and ElasticSearch in particular you probably have had similar experiences of using something…
- [lazybuilder v0.3](https://www.grahambrooks.com/post/2014-02-23-lazybuilder-v0-3/index.md) (2014-02-23): The idea for lazybuilder came up during a recent coding dojo doing code kata. We were using Vim and a separate terminal to run the tests. Switching back and forth between two windows when trying to move quickly seemed like…
- [Cling A C++ REPL?!](https://www.grahambrooks.com/post/2013-12-19-cling-a-c-repl/index.md) (2013-12-19): Browsing some blogs recently I came across some interesting C++11 lambda code and thought it would be cool to try it out for myself. The idea of spinning up a project or even putting a new test in an existing…
- [ci console 0.0.2 released](https://www.grahambrooks.com/post/2013-10-12-ci-console-0-0-2-released/index.md) (2013-10-12): I like to commit code frequently when working on a project. I also like to use the command line for building, testing and committing code. So I thought it would be nice to have a way to check the build…
- [Emacs Sharing](https://www.grahambrooks.com/post/2013-07-25-emacs-sharing/index.md) (2013-07-25): I like Emacs. Some people like VI(M) but emacs has been in my toolbox for a long time and I feel very at home working with it. Updating the editor has become easier over the years and installing an update…
- [Campaign for better IO](https://www.grahambrooks.com/post/2013-03-03-campaign-for-better-io/index.md) (2013-03-03): Over the last 30 years I have used a lot of computers ranging from teletypes to laptops. I have also visited a lot of offices and seen the standard keyboards that people are using on a daily basis. In my…
- [DRYing out code](https://www.grahambrooks.com/post/2012-12-31-drying-out-code/index.md) (2012-12-31): Removing duplicate code is a great way to improve the internal quality of your application code. Duplications mean that you have more code than you should and are often the source of more subtle bugs of the “I’ve already fixed…
- [Automated refactoring for library updates](https://www.grahambrooks.com/post/2012-07-23-autmated-refactoring-for-library-updates/index.md) (2012-07-23): After watching Clang MapReduce – Automatic C++ Refactoring at Google Scale I was struck with the idea that this could help with the upgrade problem. Almost every application uses libraries. Those libraries need to be updated from time but each…
- [Oh My ZSH shell productivity](https://www.grahambrooks.com/post/2011-12-27-oh-my-zsh/index.md) (2011-12-27): oh-my-zsh is framework for managing zsh configuration. The default configuration adds some interesting enhancements. The following shows all the Java files in the current and sub directories. ls **/*.java Ryan Bates has a nice Railscast episode covering oh-my-zsh I have…
- [asciidoc experiments](https://www.grahambrooks.com/post/2011-06-26-asciidoc-experiments/index.md) (2011-06-26): I have always been interested in text processing systems. This is probably rooted in the time that I discovered computing and programming. At that time the state of the art was ROFF (T)ROFF and a whole family of plain text…
- [Emacs Package manager](https://www.grahambrooks.com/post/2010-12-24-emacs-package-manager/index.md) (2010-12-24): I have a long history with text editors and I have always been facinated with the different flavours of interfaces and capabilities. After working my way through ED and then VI Emacs was a bit of a revalation. I found…
- [Using a local Wiki for personal knowledge management](https://www.grahambrooks.com/post/2010-08-03-using-a-local-wiki-for-personal-knowledge-management/index.md) (2010-08-03): For sometime I have been wondering how best to manage all the information that collects in my laptop. I don’t even have to try to collect data it just arrives in an irregular stream of emails, instant messenger and other…
- [Blogging from emacs](https://www.grahambrooks.com/post/2010-05-05-blogging-from-emacs/index.md) (2010-05-05): After installing WebloggerMode some time ago I had not gotten around to trying it out so I thought I would take it for a spin with this entry. Nothing earth shattering but the interface is clean and I have a…
- [Look after your tools](https://www.grahambrooks.com/post/2010-02-18-look-after-your-tools/index.md) (2010-02-18): Look after your tools and they will look after you! I was very lucky to grow up in the country with a father who enjoyed teaching me practical skills like carpentry, motor mechanics and just about every other skill needed…
- [Wordpress theme update failure](https://www.grahambrooks.com/post/2010-01-30-wordpress-theme-update-failure/index.md) (2010-01-30): If like me you installed WordPress and added some themes before understanding that WordPress has a great way of adding themes through the UI then make sure that you have changed the ownership of the folders containing those themes. Otherwise…
