Meet ODIN, the Allfather of Your Undocumented Mess
There's a particular kind of optimism that exists in software development. It's the belief that we'll eventually get around to documenting our projects. We tell ourselves we'll do it after the next release, after we fix that annoying bug, or once everything is stable. Of course, everything is never stable, there's always another bug, and before you know it, you've got 40,000 lines of code held together by dependency injection, obscure configuration settings, and the vague recollection that someone named Dave knew how the authentication worked. Dave left two years ago.
I've been guilty of this myself, which is part of the reason I built ODIN. I wanted something that could walk into an existing codebase, investigate everything it could get its hands on, and explain what was actually happening without requiring me to spend three days writing documentation that would probably be outdated by Friday.
ODIN is one of the skills I've been building as part of my FKNRTD development toolkit. While Butcher focuses on cutting unnecessary token usage, Inquisitor questions everything, and Conspirator brings additional AI coding assistants into the mix, ODIN has a different responsibility. He's the investigator, the historian, and occasionally the unfortunate bastard tasked with explaining why a supposedly simple application has nine layers of abstraction and a configuration file that appears to have been written during a hostage situation.
Documentation Based on Evidence, Not Wishful Thinking
One of my biggest complaints about AI-generated documentation is how confidently it can describe things that don't actually exist. Give a model a repository with three unfinished features and a README containing ambitious plans, and there's a decent chance it'll describe the whole thing as a fully operational enterprise platform. Apparently, optimism is now a software dependency.
ODIN takes a different approach. He's designed to investigate the repository itself, inspecting the files, project structure, dependencies, configuration, code relationships, and available history. More importantly, he distinguishes between things he can actually verify and things he's inferring from the evidence. If something isn't clear, the documentation should say so rather than invent an explanation that sounds convincing enough to survive a management meeting.
That distinction matters more than people might think. Documentation isn't particularly useful if it confidently tells the next developer to configure a service that was removed six months ago. I'd rather have a document that says "I couldn't determine why this exists" than one that invents a brilliant architectural justification for something I probably wrote at two in the morning.
ODIN also operates without needing to modify the project under investigation. He can examine a repository without turning the investigation into an unsolicited refactoring exercise. Secrets and sensitive configuration values are treated as things to protect, not interesting discoveries to publish in the resulting documentation. The goal is to understand the crime scene, not contaminate the evidence.
One Investigation, Several Useful Deliverables
I didn't want ODIN to produce another gigantic Markdown file that would immediately join the other gigantic Markdown files nobody reads. Different people need different information about a project, and forcing everybody to dig through the same technical encyclopedia isn't exactly helpful.
ODIN builds a documentation package called findings.zip, which can contain several different ways of understanding the project. There's a GitHub-friendly README for developers who want a practical introduction, an interactive documentation website for browsing the findings, a technical handoff document I call The Rundown, and change-history information to help explain how the project evolved.
The Rundown is particularly important to me because it combines the kinds of information that normally get scattered across business analysis documents, technical specifications, architecture diagrams, and whatever somebody happened to mention during a meeting three months ago. It should explain what the application does, how the important pieces fit together, what it depends on, and where the next developer should start looking.
I've also given the generated website the familiar black-and-green terminal aesthetic used throughout my Nullcromancer projects. It's a small detail, but if I'm going to spend time investigating old code, I might as well make it look like I'm hacking into a government mainframe instead of reading an insurance policy.
Written for Humans, Not a Documentation Committee
The other problem I wanted to solve was the writing itself. Most generated technical documentation has the personality of a malfunctioning corporate training video. Everything is described as robust, seamless, scalable, and thoughtfully designed, even when the application barely starts without sacrificing a small animal to the configuration gods.
ODIN's writing guidelines are intentionally different. The documentation should sound like an experienced developer explaining a project to another experienced developer. Be direct, use contractions, explain the technical details properly, and don't turn every paragraph into a sales pitch. A little dry humor is perfectly acceptable, provided it doesn't get in the way of accuracy.
That doesn't mean ODIN should spend half the document insulting the original developer. There's a difference between having a personality and being an obnoxious git. If a system has genuine architectural problems, document them clearly. If something is well designed, give it credit. If a questionable decision has a reasonable explanation, include that context rather than pretending every unfamiliar design choice is a disaster.
I want documentation that people can understand, trust, and occasionally enjoy reading. I realize that last part is a fairly ambitious goal when we're talking about software documentation, but stranger things have happened.
Built to Be Useful Without Becoming Another Project
ODIN is implemented in Python, uses the standard library, and doesn't require a collection of third-party packages just to inspect a directory. It works offline and can be installed for use with coding assistants such as Claude Code and Codex. The implementation includes multiple CLI commands for investigating and managing documentation workflows, with testing around the core behavior and repeatability of the generated output.
Repeatability is important because the whole point is to make documentation something I can regenerate as a project changes. I don't want to treat documentation as a special event requiring a ceremonial gathering of developers and a three-week planning process. Ideally, I should be able to run ODIN against a repository, review the findings, and produce an updated package whenever the code changes enough to justify it.
There's also an important boundary here: ODIN is an investigator, not a magical code repair service. He's not supposed to quietly rewrite your architecture because he thinks he knows better. Other tools can handle implementation, review, and refactoring. ODIN's job is to figure out what exists and communicate it properly, including the parts that might need attention.
The Goal Is Simple: Stop Losing Knowledge
I build a lot of software, and I use several different AI models and coding environments to do it. One of the recurring headaches with that approach is transferring knowledge between sessions, developers, and tools. Even when the source code is available, understanding the intent behind a project can take considerably longer than understanding the syntax.
That's where I see ODIN becoming particularly useful. A well-documented repository is easier to hand over to another developer, another AI model, or even my future self when I've completely forgotten why I made a particular architectural decision. Having a consistent documentation package also means I'm not starting from zero every time I switch tools or revisit an older project.
ODIN isn't going to make bad code good, and he certainly isn't going to retroactively give me the discipline to document every decision I've ever made. What he can do is investigate what's there, organize the evidence, identify the gaps, and turn an otherwise mysterious repository into something another person can reasonably understand.
And if he happens to uncover a particularly questionable piece of code along the way, that's fine too. I'd rather know where the bodies are buried before somebody asks me to explain why the database connection is being created inside a button click event.
After all, ODIN is named after the Allfather, a god associated with knowledge, wisdom, and an unhealthy willingness to go to extraordinary lengths to uncover the truth. Mine just has to rummage through source code instead of sacrificing an eye.
Although, given some of the repositories I've worked on, I'm not entirely convinced he got the worse
Find ODIN on GitHub: https://github.com/nullcromancer/FKNRTD.SKL/tree/main/odin
No comments yet.