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

LayerBest forWins onLoses 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.

  1. Who reads the ADR? Engineers only / Engineers + product / Cross-functional including non-technical execs.
  2. Who writes the ADR? Engineers only / Engineers + PMs / Mixed with non-technical contributors.
  3. Where does code review live? GitHub/GitLab/Bitbucket PRs / no formal code review / Jira tickets coupled with Atlassian.
  4. What's the regulated-environment requirement? None / SOC 2 or ISO / HIPAA or higher / Microsoft-mandated tooling.
Team shapeRecommended layerWhy
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

Where this layer breaks

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

Where this layer breaks

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

Where this layer breaks

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:

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

LayerFailure modeHow 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.

Get early access

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