reqmd is a different kind of requirements tool. Instead of a database and a web UI, it puts your spec in plain Markdown files inside a Git repository. That choice changes everything that follows — how fast it is, how it integrates with code, how branching works, how CI validates it, and how developers actually interact with it.
This page compares reqmd against the other tools teams reach for. Three groups: git-native static tools (sphinx-needs, OpenFastTrace), database-backed RM suites (DOORS, Jama, Polarion, Siemens Teamcenter, codeBeamer), and issue-tracker-shaped ALM tools (Azure DevOps Boards).
Quick decision#
| If you need… | Use |
|---|---|
| Plain Markdown in git, no Python, no database, AI-agent-friendly | reqmd |
Sphinx-rendered docs with .. req:: directives and Python tooling | sphinx-needs |
| XML-based spec coverage analysis, Java ecosystem | OpenFastTrace |
| Full RM suite: workflows, audit trails, role-based approvals, baselines | Jama / Polarion / Siemens Teamcenter |
| DOORS-class requirement management with deep links to engineering artifacts | IBM DOORS Next |
| Issue-tracker-shaped requirements with ALM features built in | codeBeamer, Azure DevOps |
reqmd vs sphinx-needs#
Both are git-native, text-first, no-database tools for spec authoring with trace checks. The right pick depends on whether your spec lives inside a Sphinx docs site or a standalone repo.
| reqmd | sphinx-needs | |
|---|---|---|
| Format | Plain Markdown + YAML attr block | reStructuredText with .. req:: directives |
| Schema | JSON Schema 2020-12 in YAML | Sphinx-config-driven type system, per-type schema |
| Storage | Files on disk | Sphinx doctree pickle (.doctree/) + JSON |
| Runtime | Single Go binary, no dependencies | Python 3 + Sphinx + a dozen plugins |
| Parse time | 16 ms / 249 reqs (16 cores) | Seconds at 8k reqs (single-threaded, includes Sphinx’s full pipeline) |
| Web UI | Static HTML export + reqmd serve for live preview | needsbuild built-in (read-only viewer) |
| Trace graph | Built in memory on every check; ephemeral | Stored in doctree; queryable via needflow and needtable directives |
| Verification results | check --results reads CTRF + manual-results markdown; 13 graph checks | test_impact reads junit XML; older, less coverage of CTRF |
| CI loop | reqmd check exits 0/1/2; 16 ms | sphinx-build -W exits non-zero on broken ref; seconds |
| Type system | JSON Schema enums (e.g. status: [draft, approved]) | Sphinx type plugins (req, spec, test, story, …) — extensible in Python |
| Custom types | Edit schema.yaml, add an enum | Write a Python Sphinx extension, register a directive |
| AI agent readability | One cat, plain text | Sphinx doctree pickle is opaque; cat shows the RST but tracing requires a build |
| Lock-in | None | Sphinx version, plugin set |
| Learning curve | One attr block syntax; 30 seconds to first check | Sphinx + RST + the needs directive set; half a day |
| Best fit | Spec is a standalone repo, lives next to code, agent-driven | Spec is a docs site (Sphinx-based) that needs rendering, search, theming |
Pick reqmd when the spec is a standalone repo next to the code, you want the agent to read/write/validate specs in the same tool call budget as code, and you don’t want a Python runtime in the loop. Pick sphinx-needs when the spec is part of a larger Sphinx docs site (the same source tree renders the user manual, the API reference, and the requirements), you need Sphinx’s theming and search, or you already have a Sphinx build pipeline and the cost of adding a third tool is higher than the cost of working inside Sphinx.
The two are not mutually exclusive. A team can use sphinx-needs for the rendered, cross-linked docs site and use reqmd to validate trace changes in a pre-commit hook that runs in milliseconds, not seconds. The two formats don’t interop (RST vs Markdown) but you can have the source tree of the docs site live in a separate git submodule that doesn’t run through reqmd at all.
reqmd vs OpenFastTrace#
OpenFastTrace (OFT) is the closest analog. Both tools are designed for “spec coverage analysis” — does every requirement have a trace to the implementing test, and vice versa? The differentiator is the format.
| reqmd | OpenFastTrace | |
|---|---|---|
| Format | Plain Markdown + YAML | Custom XML (.xml) for spec items, plain text for code links |
| Schema | JSON Schema 2020-12 | Implicit (covered-by/from link types only) |
| Storage | Files on disk | Files on disk (XML) |
| Runtime | Single Go binary, no dependencies | Java (Maven) or standalone JAR |
| Type system | Full JSON Schema | Just “covered-by” and “covers” link types |
| Trace direction | Bidirectional, enforced via requires-trace-from | Forward (covered-by) + reverse (covers), same idea |
| Coverage report | reqmd check shows missing coverage as a WARNING | oft report produces a coverage matrix; CI-friendly exit code |
| Version pin / staleness | Yes, ~N syntax, with --relaxed-versions | Yes, via the revision attribute on each spec item |
| Verification results | CTRF + manual-results markdown | junit XML |
| Spec coverage | Inline within .md files (heading + attr + prose) | Separate XML files per spec item |
| Lock-in | None (Markdown is universal) | Low (XML is parseable, but you need the OFT convention) |
| AI agent | Same loop, 16 ms | XML spec items; no prose context in the spec file |
| Best fit | Spec is documentation, the prose matters | Spec is structured data, coverage matrix matters |
Pick reqmd when the spec is documentation — the prose is part of the deliverable, and reviewers read the requirements as paragraphs. Pick OFT when the spec is structured data — you want a coverage matrix output, and the prose lives in a separate doc that OFT links to.
reqmd vs database-backed RM suites (DOORS, Jama, Polarion, Teamcenter, codeBeamer)#
These tools have been the default in regulated industries for 20 years. They solve a real problem — managed workflows, audit trails, role-based access — but they come with a set of structural problems that get worse as your team gets more agile and your code moves faster:
Slow. Every interaction is a web UI round-trip. Opening a requirement, editing a field, checking a trace link, running a coverage report — each is a click, a page load, and a wait. A spec review that takes 10 minutes in a Git diff takes an hour in a web UI. reqmd check validates 249 requirements in 16 ms; a DOORS coverage report on the same tree takes minutes.
Disconnected from the code. The spec lives in a database. The code lives in Git. There is no native connection. “Traceability to code” means a link field that someone manually maintains, or a third-party integration that syncs on a schedule. When a developer renames a function, the spec doesn’t know. With reqmd, the spec and the code live in the same Git repo (or linked submodules), and the companion reqmd-import tool extracts code symbols into the same ID space — so a rename becomes a broken trace link that CI catches.
No real branching. DOORS and Jama have “baselines” — snapshots of the spec at a point in time. But you can’t branch a spec, try a change, and merge it the way you branch code. There’s no git checkout -b feature/new-requirement, no git merge, no git rebase, no pull request with a diff. If two teams need to work on the spec simultaneously, the workflow is lock-then-edit or a parallel branch that someone manually reconciles later.
No developer-friendly configuration management. In DOORS and Jama, a multi-team spec is one big database with no native way to split it into per-team repos and compose them. The baseline concept is a server-side snapshot, not a Git tag. With reqmd, configuration management is built on Git submodules: each team owns their spec repo, a top-level repo assembles them, and baseline diff compares the assembled tree across tags. The submodule pins are the baseline. A configuration change is a PR that bumps a pin. This is git submodule add — developer-friendly, reviewable, and CI-gated.
Not CI-native. Running “does the spec validate?” in a CI pipeline requires a REST API call, authentication, and a custom script. With reqmd, it’s reqmd check spec/ — one binary, one command, 16 ms, exit code 0/1/2. No API, no auth, no network.
Not developer-friendly. Developers don’t open DOORS. They open their editor. If the spec is in a database, the developer never reads it, never edits it, and the spec drifts from the code. If the spec is in Markdown next to the code, the developer sees it in every pull request, reviews the diff, and keeps it honest.
Vendor lock-in. Your spec is in a proprietary database schema. Exporting it means a vendor-provided tool, a custom script, or a CSV dump that loses the trace links. With reqmd, your data is plain text — openable in any editor, diffable with git diff, portable to any tool that reads Markdown.
| reqmd | DOORS / Jama / Polarion / Teamcenter / codeBeamer | |
|---|---|---|
| Where the spec lives | Git repo, plain files | Proprietary database |
| Speed | 16 ms for 249 reqs | Seconds to minutes per operation |
| Branching | Native Git branches, merges, rebase | Baselines (snapshots, no merge) |
| Configuration management | Git submodules — per-team repos composed at top level; submodule pins are the baseline | One monolithic database; baselines are server-side snapshots |
| Connection to code | Same repo or submodules; reqmd-import links to code symbols | Manual link fields or scheduled sync |
| CI integration | reqmd check — one binary, 16 ms | REST API + auth + custom script |
| Developer workflow | Edit in any editor, review in PR, merge in Git | Log into web UI, click, wait |
| Review | Git diff in a pull request | Web UI review threads |
| Audit trail | Git log (who changed what, when, why) | First-class audit log in the database |
| Access control | Git permissions (repo-level) | Per-object ACLs, role-based |
| Named approvers / sign-off | Via Git review (approve PR) | Built-in workflow engine |
| Cost | Free, GPL-3.0 | Per-seat licensing, often 6-figure annual cost |
| Setup time | 30 seconds (go install) | Days to weeks (install, integrate, configure, train) |
| Lock-in | None — plain text | Vendor-specific DB schema; export is a project |
| AI agent fit | cat files, reqmd check --json — designed for the loop | REST API, OAuth, hundreds of endpoints — the prose is hidden behind the API |
Pick reqmd when you want the spec to live where the developers work — in Git, next to the code, with branching, submodules, CI, and pull-request review as the natural workflow. This is the right choice for agile teams, spec-first development, and any project where the spec and the code should move together.
Pick a database-backed RM suite when you specifically need a process compliance surface — named approvers with electronic signatures, a regulated audit trail that an auditor reads from the tool, and role-based access at the per-object level. These are real requirements in some regulated environments, and reqmd doesn’t provide them.
The complement pattern. Some teams in regulated environments use both: reqmd for the engineering spec (the one developers see, the one in the PR, the one that traces to code), and the RM suite as the system of record for the compliance version (the one that goes to the auditor). A one-way export from reqmd to the RM suite keeps them reconciled. This gives you developer agility and compliance documentation.
reqmd vs issue-tracker-shaped ALM (Azure DevOps, Jira)#
A third category: tools that look like an issue tracker (Jira, Azure DevOps Boards) but add requirements-specific features on top. They share the same structural problems as the database-backed RM suites — the spec is in a database, not in Git, and the same limitations apply:
| reqmd | Azure DevOps / Jira | |
|---|---|---|
| Spec format | Markdown + YAML | Work item (DB row) with a custom field schema |
| Where it lives | Git repo | The ALM platform’s DB |
| Branching | Native Git branches | Not supported — work items live in one project |
| Configuration management | Git submodules — per-team repos composed at top level | Not possible — work items live in one project |
| Connection to code | Same repo or submodules; reqmd-import | Manual link fields or git-branch references |
| Speed | 16 ms / 249 reqs | Web UI round-trips; API calls |
| CI integration | reqmd check exits 0/1/2 | Native to the ALM platform, but requires the platform |
| Review | Git PR diff | Built-in review workflow with state transitions |
| Lock-in | None — plain text | Vendor work-item schema |
| Best fit | Spec is documentation, developer-driven, CI-gated | Spec is project-management-shaped, lives in the same tool as the tasks |
The trade-off is the same: if the spec is in a database, developers don’t touch it. If it’s in Git, they do.
The full decision matrix#
A more compact version of the above, ordered by what you’ll feel first.
| If you need… | Use reqmd? | Use sphinx-needs? | Use OFT? | Use DOORS / Jama / Polarion? |
|---|---|---|---|---|
| Spec lives in a git repo | ✅ designed for this | ⚠ works, friction | ⚠ works, friction | ❌ wrong shape |
| Branching, merging, pull-request review | ✅ native Git | ❌ no branching | ❌ no branching | ❌ baselines only, no merge |
| Configuration management via git submodules | ✅ git submodules | ❌ | ❌ | ❌ monolithic database |
| Spec connected to code | ✅ same repo or submodules + reqmd-import | ⚠ separate repo | ⚠ separate | ❌ manual links |
| Validation in CI, fast (16 ms) | ✅ | ❌ seconds | ⚠ seconds | ❌ server round-trip |
| Developer-friendly (editor, not web UI) | ✅ Markdown in any editor | ⚠ RST in editor | ⚠ XML in editor | ❌ web UI only |
| AI agent reads, edits, validates specs | ✅ designed for this | ❌ RST + opaque doctree | ⚠ XML is verbose | ❌ API is the only path |
| Plain text, no vendor lock-in | ✅ Markdown | ⚠ RST, plugin-dependent | ⚠ XML | ❌ vendor schema |
| Spec is a Sphinx docs site | ❌ wrong shape | ✅ designed for this | ❌ wrong shape | ❌ wrong shape |
| Audit-ready, named approvers, sign-off records | ❌ not its job | ❌ not its job | ❌ not its job | ✅ |
| Built-in compliance process workflows | ❌ not its job | ❌ not its job | ❌ not its job | ✅ |
| Per-seat licensing is fine | – | – | – | ✅ |
| Free, GPL-3.0, self-hosted | ✅ | ✅ | ✅ | ❌ |
What reqmd is not#
Two things reqmd is intentionally not, and a few that it could become:
- Not a process tool. reqmd doesn’t have a workflow engine, named approvers, or audit trails. If your auditor needs a sign-off record per requirement, you need a different tool (or a wrapper that produces one from the Git log).
- Not a UI tool. The HTML export is a view, not an editor. For authoring, you use a text editor. For review, you use GitHub. For presentation, you host the HTML. There’s no web-based “edit a requirement” experience in v1.
- Not a coverage matrix exporter. It emits the missing-coverage findings inline in the
checkoutput, not as a separate matrix artefact. (OFT does this; reqmd doesn’t yet.) - Not a requirements database. The trace graph is built in memory on every
check. If you want a persistent graph you can query, you need theexport graphoutput to LadybugDB, or you use a commercial RM suite.
See also#
- FAQ — has the older “vs OpenFastTrace” entry with more detail.
- Use cases — what reqmd is designed for, in detail.
- Benchmarks — the performance numbers behind the claims in this page.
- AI & agents — why reqmd is the right shape for agent-driven workflows, in detail.