Topic: adr storage format comparison
ADR Storage Format Comparison — Markdown vs AsciiDoc vs Notion vs Confluence vs SharePoint
Every published ADR template tells you how to write the body; almost none of them tell you where the body should live. The choice between repo Markdown, AsciiDoc, Notion, Confluence, and SharePoint shapes who reads ADRs, who writes them, what review process applies, and what migration costs you'll pay 18 months later. This page is the head-to-head — with the decision matrix, the migration paths, and the failure modes each storage layer ships.
TL;DR
For teams that ship code and write ADRs primarily for engineers, default to Markdown in /doc/decisions/ in the primary code repo — it's the only storage layer where the ADR versions with the code it describes, PR review is the natural review surface, and migration off is cheap. Switch to Notion when most ADR readers are non-engineers (PMs, execs, security) and the wiki UX matters more than git integration; switch to Confluence when you're already on Atlassian and the SOC 2 / page-permission story is required. AsciiDoc is the right answer only if you're already on it for arc42 or similar; SharePoint is the right answer only if your enterprise mandates it. The migration paths between layers are real but cost-bounded — none of these is a one-way door.
Why storage choice is its own decision
Pick the wrong template (Nygard vs MADR vs arc42) and the cost is rewriting the section headers in N existing files — a half-day for any reasonable directory size, well-documented across the per-template pages on this site (Nygard, MADR, arc42). Pick the wrong storage layer and the cost is two orders of magnitude higher: a partial migration leaves half your ADRs in the old layer indefinitely, the cross-link graph between ADRs breaks, and the cultural muscle for reading ADRs in the original location atrophies. Storage is the more durable choice and deserves the more careful pick.
The five storage layers in this comparison are the ones that show up in real teams. The honest framing: each one is correct for a specific team shape, and each one fails predictably when used outside that shape. The decision matrix later on this page sorts the layers by team-shape fit; the per-layer sections below explain the trade-offs in detail.
The five layers, side by side
| Layer | Best for | Wins on | Loses on |
|---|---|---|---|
Markdown in /doc/decisions/ |
Engineering teams (any size), ADRs read primarily by people with git access | Versions with code, PR review is review surface, git blame is the audit log, cheap to migrate off, every CI tool integrates, every text editor edits | Discoverability for non-engineers (have to know the repo and the path), no built-in permissions beyond repo ACL, no rich-content embedding (diagrams need separate files) |
AsciiDoc in /docs/architecture/ |
Teams already on arc42 or DocBook-style multi-file architecture documentation | Transclusion (include:: directives compose ADRs into a larger architecture document), cross-references survive renames, tables are richer than Markdown's, footnotes are first-class |
Smaller ecosystem (fewer engineers fluent, fewer SSGs render it well), GitHub's AsciiDoc rendering is less polished than Markdown's, Asciidoctor toolchain is a heavier dependency |
| Notion database | Cross-functional teams (PMs + engineers + execs), startup-stage workspaces, teams that already live in Notion daily | Database properties give you filters/sorts/dashboards for free, embedded media (Figma, Loom, screenshots) is one-click, mobile reading is excellent, real-time multi-author editing | No git/PR integration, version history is page-level not line-level, search is good-not-great at 200+ ADRs, vendor lock-in (export-to-Markdown is good but property re-encoding is manual), API rate limits bite at scale |
| Confluence pages | Atlassian-native teams (Jira, Bitbucket), regulated environments (SOC 2 / ISO 27001 / HIPAA), teams with non-engineer ADR readers | Page permissions / hierarchy / templates / macros are mature, audit log integrates with the rest of Atlassian, page history with diffs covers most of git's audit value, integrates with Jira tickets and Bitbucket PRs | No branching (drafts are linear, no PR-style review), reading UX is heavy (slow page load, dated visual design), Marketplace plugins are the path to most quality-of-life features and add license cost, Server vs Cloud version differences are a real maintenance tax |
| SharePoint document library | Microsoft 365-mandated enterprises, regulated environments where Microsoft is the only allowed vendor | Already-licensed at most Microsoft enterprises (zero incremental cost), integrates with Teams + Outlook + Power Automate, version control + check-in/check-out is familiar to non-engineers, retention / DLP / e-discovery built in | Document-library UX is built around .docx files, not .md or web pages — Markdown rendering is poor, search is shallow, link graphs between documents are fragile, the "ADR as a document" framing fights the "ADR as a versioned text file" practice that actually works |
The decision matrix — pick by team shape
If you can answer the four questions below, the matrix picks the layer for you.
- Who reads the ADR? Engineers only / Engineers + product / Cross-functional including non-technical execs.
- Who writes the ADR? Engineers only / Engineers + PMs / Mixed with non-technical contributors.
- Where does code review live? GitHub/GitLab/Bitbucket PRs / no formal code review / Jira tickets coupled with Atlassian.
- What's the regulated-environment requirement? None / SOC 2 or ISO / HIPAA or higher / Microsoft-mandated tooling.
| Team shape | Recommended layer | Why |
|---|---|---|
| Engineering-only readers + writers, GitHub/GitLab/Bitbucket PRs, SOC 2 or less | Markdown in /doc/decisions/ |
The default; PR-review-as-ADR-review is the highest-leverage workflow this layer enables |
| Engineering + product readers, engineering writers, GitHub/GitLab/Bitbucket PRs, SOC 2 or less | Markdown in /doc/decisions/ + a Notion mirror page or a static-site generator publishing to a wiki URL |
Keep the source of truth in the repo; render the readable view at arch.example.com/decisions/ for non-engineering readers |
| Cross-functional readers + writers, no formal code review, no Atlassian | Notion database | The wiki UX outweighs the lost git integration when most contributors don't have a code-review habit anyway |
| Atlassian-native team (Jira + Bitbucket + Confluence), engineering or mixed readers, SOC 2 / ISO required | Confluence pages | The Atlassian audit-log + page-permissions + Jira-ticket integration is what justifies the loss of branching/PR review |
| Microsoft-mandated enterprise (M365 only allowed), regulated environment | SharePoint document library | The mandate makes the choice; mitigate the .docx framing by keeping ADRs as .md files with a SharePoint preview pane and accepting that engineers will read them via the raw download |
| Already on arc42 or DocBook for the main architecture document | AsciiDoc in /docs/architecture/ |
The transclusion benefit is real when ADRs are sub-sections of a larger document; not worth picking AsciiDoc just for ADRs otherwise |
Markdown in a repo — the default, in detail
The canonical layout is /doc/decisions/NNNN-short-slug.md with one ADR per file, IDs allocated per the merge-base allocator, body shape per Nygard or MADR, frontmatter per the status template, and CI per the GitHub Action workflow. The whole sub-cluster of pages on this site assumes Markdown-in-repo as the default; the rest of this section explains why.
What this layer wins on
- Versioning is free. Every ADR change is a git commit. Status transitions, body edits, supersession links — all in git history with attribution and timestamps. No separate audit trail needed.
- PR review is the review surface. A PR that changes architecture comes with a PR that adds an ADR. Reviewers comment line-by-line on the ADR body, the same surface they comment on code. The ADR review is part of the engineering process, not a separate workflow that gets skipped under deadline pressure.
- Migration off is cheap. Every wiki and document tool has a Markdown importer. If you outgrow this layer (rare; mostly happens when the team grows past 100 engineers and centralized doc tooling becomes a coordination requirement), the migration is a script that runs in an afternoon.
- Tooling is universal. Every static site generator, every CI tool, every editor renders Markdown. The doc-tool dependency surface is exactly zero.
Where this layer breaks
- Non-engineer readers can't find it. A PM who needs to know "why did we pick Postgres" has to know which repo, which branch, which path, and how to render Markdown. The mitigation is a static-site published view (
arch.example.com/decisions/served via Mkdocs / Docusaurus / Hugo / Nextra) so non-engineers read at a URL while engineers edit in the repo. - No granular permissions. Repo ACL is the only access control. Restricting some ADRs to a sub-team requires a separate repo. For most teams this is fine; for large enterprises with mixed-sensitivity decisions in the same directory, it's a real limitation.
- No rich embeds. Diagrams, video walkthroughs, interactive tables all need to be separate files referenced by URL.
mermaiddiagrams in fenced code blocks render inline on GitHub but not in every Markdown processor; PlantUML needs a build step. Plan the embed strategy upfront.
AsciiDoc — when it earns its place
AsciiDoc beats Markdown on three axes: include:: directives compose ADRs into a larger architecture document; cross-references survive renames (Markdown links break when files move); tables and footnotes are first-class. For teams already using arc42 (which ships in AsciiDoc by default) or DocBook-derived workflows, ADRs as sub-sections of the main architecture document is genuinely better in AsciiDoc than the equivalent Markdown setup.
Outside that case, AsciiDoc fights an uphill battle. The toolchain is heavier (Asciidoctor + Ruby vs the markdown-it / remark / mdast tooling that ships in every Node project). GitHub renders AsciiDoc but not as well as Markdown — fenced code blocks are less polished, anchor links are less reliable, and pull-request diffs are noisier because AsciiDoc's whitespace sensitivity is different from Markdown's. Most engineers know Markdown fluently and not AsciiDoc fluently — the contributor barrier is real.
Pick rule: AsciiDoc only if you're already on it. Don't pick AsciiDoc just for ADRs.
Notion database — the cross-functional answer
Notion's database view turns ADRs into rows with typed properties (Status, Date, Decision-by, Tags, Project link). The properties enable filters, sorts, and grouped views ("show me all Accepted decisions tagged billing from the last quarter") that Markdown directories require ad-hoc tooling for. Embedded media is one-click — Figma frames, Loom recordings, screenshots, Slack threads. Real-time multi-author editing during a decision meeting is genuinely useful when the decision is being co-written by a PM, an engineer, and a designer.
What this layer wins on
- Cross-functional contribution. A PM can co-write an ADR without learning Markdown or git. The "ADR as a Notion page" framing matches how non-engineers already work in Notion.
- Database queries for free. Status dashboards, per-team filtered views, pending-Trial-Period reminder boards — all configured in Notion's UI without writing code.
- Mobile reading is excellent. Notion's mobile app is the best of the five layers for reading on-the-go (the Wifi-on-flight reading session that Confluence loses to slow page loads and SharePoint loses to .docx download).
Where this layer breaks
- No git integration. ADR changes don't appear in PR diffs; reviewers reading the code change have to context-switch to Notion to see the ADR change. The cultural muscle "every architecture-significant PR carries an ADR" is harder to build when the ADR isn't in the PR.
- Page-level version history. Notion's version history shows page snapshots, not line-level diffs. For most ADR edits this is fine; for legal/compliance audits where "exactly which words changed when" matters, it's insufficient.
- Vendor lock-in is real. Notion's Markdown export is good for prose but doesn't preserve database properties cleanly — exporting 200 ADRs with their typed metadata requires the migration script described in the next section. The lock-in isn't catastrophic (the script works), but it's a tax.
- API rate limits at scale. Above ~500 ADRs in one database, Notion's API rate limits start biting on bulk operations. The product is built for <1000-page workspaces; very large ADR directories outgrow it.
Confluence pages — the Atlassian-native answer
If your team already runs on Jira and Bitbucket, Confluence is the path of least resistance for ADRs that need to be readable by non-engineers. Page permissions are mature (per-space, per-page, per-property restrictions), the Page Properties macro gives you the equivalent of database properties for filtering and dashboards, and the Atlassian audit log integrates ADR changes with the rest of your governance trail.
What this layer wins on
- Mature permissions. Per-page permission scoping is the strongest of the five layers. For regulated environments where some decisions need to be visible only to a security team or only to executives, Confluence handles it natively without separate tooling.
- Atlassian integration. Linking an ADR to a Jira epic, embedding a Bitbucket PR, surfacing ADR changes in the Atlassian audit log — all native, no plugins required.
- Templates and macros. The
{status}macro renders colored pills, the Page Properties macro turns properties into queryable database, the{table-of-contents}macro auto-builds nav. Mature template ecosystem.
Where this layer breaks
- No branching. Confluence drafts are linear — you can't propose an ADR in a branch and merge it via PR. Reviewers see the live page (or a draft you've shared with them) but can't make comments on a parallel proposed version. The PR-review-as-ADR-review workflow doesn't translate.
- Slow reading UX. Confluence Cloud's page-load times are noticeably slow at the directory-of-50-ADRs scale. The Server / Data Center versions are faster but operationally heavier.
- Marketplace tax. Most quality-of-life features (better search, better diff view, better dashboards) are paid Marketplace plugins. License sprawl is a real cost above ~50 users.
SharePoint document library — when the enterprise mandates it
SharePoint is the storage layer mandated by some Microsoft 365-bound enterprises. The good news: it's already licensed, it integrates with Teams and Outlook, version control is familiar, and retention / DLP / e-discovery are built in. The bad news: SharePoint's UX is built around .docx files, not Markdown or web pages, and the "ADR as a document" framing fights the "ADR as a versioned text file" practice that actually works in real teams.
Mitigation: keep ADRs as .md files in the document library, accept that the SharePoint preview is poor, and publish a static-site rendered view at an internal URL for actual reading. Engineers will tolerate the SharePoint upload step if reading happens elsewhere; cultural buy-in on "ADRs in SharePoint" is fragile and often quietly drifts to a parallel repo within a quarter.
Pick rule: SharePoint only if mandated. The mandate carries the choice; don't fight it, but document the dual-surface (SharePoint as system-of-record, internal wiki for reading) explicitly so the practice survives.
Migration paths between layers
None of these is a one-way door. The migration costs are bounded; the work is mostly mechanical. Times below assume a 50-ADR directory.
Markdown → Notion (4–6 hours)
Notion's Markdown import creates pages but doesn't populate database properties. The script: parse each .md file's YAML frontmatter, create a database row via Notion's API with the typed properties, then upload the body as the page content. The Notion API has a 2000-character block limit so long ADRs need to be split into multiple paragraph blocks. @notionhq/client handles the bulk; budget extra time for property type mapping (Status as Select, Date as Date, Tags as Multi-select).
Notion → Markdown (6–8 hours)
Notion's per-page Export → Markdown gets you 80% of the way; the remaining 20% is database properties which need to be re-encoded as YAML frontmatter at the top of each file. Use Notion's API to fetch each row's properties as a JSON object, transform to YAML frontmatter, prepend to the exported Markdown body. The markdownify library plus a property-mapping table covers most cases; budget extra time for embedded media (Notion attachments need to be downloaded separately and the URLs rewritten to local paths).
Markdown → Confluence (8–12 hours)
Confluence's Markdown plugin renders .md directly but doesn't create the structured Page Properties for filtering. Use the Confluence REST API to create pages with the body as the rendered Markdown, then use a separate API call to add Page Properties from the YAML frontmatter. Linkrot is the biggest risk — Markdown internal links (./0042-foo.md) need to be rewritten to Confluence URLs, which requires a two-pass migration (first pass creates pages and captures the new URLs; second pass rewrites links).
Confluence → Markdown (12–16 hours, possibly more)
The hardest direction. Confluence's storage format is XHTML (the "Confluence storage format") with custom macros — not Markdown, despite the rendered view. Tools like confluence-to-markdown handle the basic prose; Page Properties macros, status macros, and Jira-ticket macros all need custom transformation. Budget significantly more time if the Confluence space uses a lot of macros. The page history is unrecoverable in the migration — only the current version makes the trip.
Any → AsciiDoc (1.5x the equivalent Markdown migration)
The conversion mechanics are similar to Markdown but the syntax differences (= headings vs #, [source,bash] vs ` ```bash `, * vs - ) and the include::-vs-link mismatch require a per-file pass. Tools like pandoc handle most of it; the failure surface is custom macros and embedded media.
Any → SharePoint (depends entirely on the rendering strategy)
If ADRs become .docx files in SharePoint, budget significant time per ADR (Markdown → .docx is fragile, code blocks lose formatting, links sometimes drop). If ADRs stay .md files in SharePoint, budget ~minutes per ADR (just the upload step, which Power Automate can script). Almost always do the latter.
The dual-surface pattern — when you can't pick just one
Many teams end up with a dual-surface pattern: ADRs live as Markdown in the repo (system of record), and a published view is rendered to a separate location for non-engineer readers. The system of record stays small, version-controlled, and PR-reviewed; the published view is generated automatically and never edited directly.
Common publish targets:
- Mkdocs / Docusaurus / Hugo / Nextra served at
arch.example.com/decisions/— the standard pattern, low maintenance, looks great. Suitable for any team. - Confluence sync via a CI job that renders Markdown to Confluence storage format and updates pages on every merge. Requires Confluence already in use; the dual-surface pattern then bridges the engineering-only Markdown layer to the cross-functional Confluence layer.
- Notion sync via a CI job that uses the Notion API to update database rows on every merge. Same pattern as Confluence; Notion's API is friendlier for this than Confluence's.
The dual-surface pattern is more work than picking one layer, and the failure mode is drift between the two surfaces (the published view falls behind the source of truth). Mitigate with a CI job on every merge that fails the build if the published view didn't update successfully — drift is the failure mode that kills the pattern.
The failure modes specific to each layer
| Layer | Failure mode | How to spot it |
|---|---|---|
| Markdown in repo | Non-engineer readers stop checking; the repo path is forgotten outside engineering | Survey: ask 5 PMs and 5 execs to pull up a recent ADR. If >2 fail, you need a published view |
| AsciiDoc | Contributor friction — engineers write ADRs in Markdown anyway and someone converts them later | Look at git blame on AsciiDoc files: if one engineer wrote 80% of them, the team isn't on the format |
| Notion | Drift between database properties and body content — Status flipped to Superseded in the property but the body still says "we picked X" | CI script that compares property Status to body text; flag mismatches for manual review |
| Confluence | The PR-review-as-ADR-review workflow never gets built; ADRs land via direct Confluence edits with no review | Audit-log query: how many ADRs landed without a draft-review step? >30% means the practice has drifted |
| SharePoint | Quiet drift to a parallel repo — engineers create a Markdown directory in their main repo and ADRs accumulate there in addition to (or instead of) SharePoint | Look for doc/decisions/ or docs/adr/ directories in your repos; if they exist alongside the SharePoint library, you have parallel sources of truth |
How WhyChose fits in
Storage choice doesn't change the upstream problem: most architecture decisions are made in chat conversations that never become ADRs at all, regardless of whether the team would have stored them in Markdown or Notion or Confluence. The WhyChose extractor reads your AI chat exports (ChatGPT, Claude, Gemini), surfaces decision-shaped exchanges with the trade-offs considered at the time, and outputs structured records ready to drop into any of the storage layers on this page. The extractor's output is YAML-frontmattered Markdown by default — drop it into doc/decisions/ and run the merge-base allocator, or use the migration paths above to land it in your Notion / Confluence / SharePoint layer of choice. The Pro tier ships dedicated exporters for Notion and Linear; the Team tier ships a Confluence sync. Whichever storage layer you picked, the extractor pre-fills the input.
Related questions
Where should our ADRs live — repo Markdown, Notion, or Confluence?
Default to Markdown in /doc/decisions/ for engineering teams. Switch to Notion when readers are cross-functional (PMs/execs/security) and you're already on Notion. Switch to Confluence when you're already on Atlassian and need the per-page permissions / Jira integration. SharePoint only if mandated.
Is AsciiDoc actually better than Markdown for ADRs?
For arc42-style multi-file architecture documentation where ADRs are sub-sections, yes — transclusion is genuinely useful. Standalone ADR directories on teams not already on AsciiDoc don't get enough benefit to outweigh the smaller ecosystem and contributor friction. Pick AsciiDoc only if you're already on it.
Can I have ADRs in Confluence and still get version control?
Confluence has page history with diffs, which covers most of git's audit value. What you lose: branching (no PR-style review on a draft), line-level inline review (Confluence comments are page-level), and code-review-as-process integration (the ADR doesn't live next to the code). Acceptable for most teams; a real loss for teams whose ADR practice is tightly coupled to PR review.
What's the migration path from Notion to Markdown?
Notion → Markdown is the easier direction. Per-page Export → Markdown gets 80% of the way; the remaining 20% is database properties (Status, Date, Decision-by, Tags) which need to be re-encoded as YAML frontmatter at the top of each .md file. Budget 6–8 hours for a 50-ADR directory. Markdown → Notion is harder (8–12 hours) because Notion's Markdown import doesn't populate database properties.
Should we publish ADRs to a wiki view even if we store them in repo Markdown?
Yes if any non-engineer reads them. The dual-surface pattern (Markdown in repo as source of truth, Mkdocs/Docusaurus/Hugo published view at arch.example.com/decisions/) is the standard answer. Drift between source and published view is the failure mode — mitigate with a CI job that fails on publish errors.
Further reading
- Architecture decision record template — the three-template comparison (Nygard / MADR / arc42); pick the body shape, then return here for the storage layer.
- ADR template in Markdown — the Markdown-in-repo body template; the default storage layer's recommended template.
- The Nygard ADR template — the original 5-section template; works in any storage layer but pairs naturally with Markdown.
- MADR (Markdown ADR) template — the Markdown-frontmatter standard; the closest fit to this page's recommendations for the Markdown layer.
- arc42 ADR template — the section-9 integration; the natural fit for AsciiDoc-stored architecture documentation.
- ADR template for Notion — the database schema for the Notion layer; pair with the migration paths on this page.
- ADR template for Confluence — the Confluence page template with macros; pair with the dual-surface pattern if you also keep a Markdown source of truth.
- ADR template for GitHub — the
/doc/decisions/folder layout + PR template + GitHub Action for the Markdown-in-repo layer. - ADR status template — the Status field's format; the placement (frontmatter vs heading vs property) varies by storage layer.
- ADR numbering scheme — the directory-level discipline; applies to Markdown / AsciiDoc layers, less so to Notion / Confluence (which auto-allocate).
- How to update an ADR — the supersession protocol; the workflow varies by storage layer (PR for Markdown, draft-then-publish for Confluence, edit-then-status-flip for Notion).
- The ADR GitHub Action workflow — the CI for the Markdown-in-repo layer; the dual-surface publish job goes here too.
- How to document architecture decisions — the cultural complement; storage choice and culture interact (PR-review culture pairs with Markdown; wiki culture pairs with Notion or Confluence).
- The open-source extractor — emits YAML-frontmattered Markdown; drop into any storage layer using the migration paths above.