How Cardinal.js lines up against the wikis you're probably weighing.
Built in means it ships in the box and is on by default or one setting away. Partly means a plugin, an extension, a higher plan, or a narrower version of the feature. Notion, MediaWiki and DokuWiki are a toggle away.
| Feature | Cardinal.js 0.1 · AGPLv3 | Wiki.js 2.5 stable · AGPL | Wiki.js 3.0 beta · AGPL | BookStack MIT | Outline BSL 1.1 | Confluence Atlassian |
|---|---|---|---|---|---|---|
| Foundations | ||||||
| Open source, self-hosted | Yes | Yes | Yes | Yes | Partlysource-available | NoData Center end of sale |
| Markdown as the stored format | Yes | Yes | Yes | Partlyeditor option | PartlyProseMirror JSON | Nostorage format |
| Several sites, one instance separate hostnames, content, settings | Yes | No | Yes | No | Partlyteams | Partlyspaces |
| Real-time co-editing several people in one page at once | Yes | No | Yes | No | Yes | Yes |
| Governance | ||||||
| SSO: OIDC, SAML, LDAP 18 providers in Cardinal.js | Yes | Yes | Yes | Yes | PartlySAML on Business, no LDAP | PartlyAtlassian Guard |
| Delegated per-site administration site settings without instance-wide admin | Yes | No | No | No | Partlyper team | Yes |
| Page classification levels limit what a group or token may read | Yes | No | No | No | No | PartlyGuard Premium |
| Audit log with retention | Yes | No | Yes | Yes | PartlyBusiness plan when self-hosted | Yes |
| Review before publish suggestions, approvals, inbox | Yes | No | Yes | No | No | Partlyapprovals on Premium |
| Knowledge | ||||||
| Backlinks on every page | Yes | No | Yes | Yes | Yes | Partly |
| Knowledge graph whole site, clustered | Yes | No | Partlytree and radial views | No | No | No |
| Runbooks and checklists ticked through on the page | Yes | No | No | No | Partlycheckboxes | Partlytasks |
| Glossary with canonical pages | Yes | No | Yes | No | No | Partlyapps |
| Export a page to PDF | Yes | No | No | Yes | Partlycloud and enterprise | Yes |
| Integration | ||||||
| MCP server, built in same permissions as the user | Yes | No | No | Nocommunity servers only | Yes | YesRovo MCP |
| Webhooks | Yes | No | Yes | Yes | Yes | Yes |
| Moving data | ||||||
| Imports a Wiki.js 2.5 site dry run, verify, cutover | Yes | Nois 2.5 | Partlyfrom a 2.5.316 export, no dry run | No | No | No |
| Whole-site Markdown export | Partlystorage targets mirror every page | Partlygit sync | Partly | Partlyper book | Yes | PartlyHTML/XML |
Wiki.js 2.5.x, 3.0 and Cardinal.js
Wiki.js 3.0 reached beta in September 2026 and has since caught up on comments, git sync, backlinks, the glossary, the audit log, review and co-editing. These are the rows where Cardinal.js is still different.
| Capability | Wiki.js 2.5.x stable · 2020 | Wiki.js 3.0 official beta · upstream | Cardinal.js 0.1 · today |
|---|---|---|---|
| AI & agent integration | |||
| MCP server search, read & write over content via Model Context Protocol | Gap | Gapdraft spec only | Shipped |
| User-scoped Personal Access Tokens per-user, act-on-behalf-of auth for agents & integrations | Basicinstance-level API keys only | Basicgroup-scoped API keys only | Shipped |
| Security & access | |||
| Content sensitivity classification inheritance on move, anti-declassification guardrails, admin visibility | Gap | Gap | Shipped |
| 2FA & passkeys TOTP, passkeys and recovery codes | BasicTOTP only, no passkeys | BasicTOTP and passkeys, no recovery codes | Shipped |
| Delegated per-site administration hand off one site's settings without granting instance-wide admin | Not applicable | Gapmulti-site with no delegation dimension | Shipped |
| Knowledge organization | |||
| Tag rename & merge fix or consolidate a tag everywhere it's used, without hand-editing every page | Gapbrowse by tag only | Gaplist only | Shipped |
| Knowledge graph force-directed view, clustering, drill-down filters | Gap | Basictree and radial views, no filters | Shipped |
| Operations | |||
| Runbook & checklist sign-off per-item run log — who checked it, and when — distinct from page edit history | Gapplain markdown task lists only | Gapplain markdown task lists only | Shipped |
| Bulk page management select many pages at once, delete / re-render / retag them together | Gapmarked planned, unshipped | Basicwhole-folder move, delete or duplicate | Shipped |
| Platform & migration | |||
| Pluggable search providers Elasticsearch, Algolia, Azure AI Search and the like, beyond built-in search | Shipped | GapPostgreSQL full-text only | Restoredplus semantic search; AWS CloudSearch dropped |
| 2.5.x → 3.x migration users, groups, permissions, content, history, tags, assets, comments | Not applicable | Basicimports a 2.5.316 export, no dry run or verifier | Shippedread-only from the 2.5 database, dry run and verifier |
| Release & supply chain | |||
| Signed, attested releases build provenance, SBOM, signatures & checksums on each release | Gapactions pinned by tag, not SHA; provenance off | Gapno signing or SBOM | In progressrelease pipeline built |
Upstream 3.0 now imports a 2.5 export. Cardinal.js reads your 2.5 database directly instead, read-only, with a dry run and a verifier before you cut over. Everything you know still applies; the new parts are classification, scoped tokens and the agent surface.
Build your migrate commandBoth are good. The Cardinal.js case is classification levels, the review inbox, the knowledge graph and runbooks, on an AGPL licence with every feature in the one edition.
And the way back, should you want itYou already have most of these features, on a plan. Cardinal.js is the self-hosted, per-seat-free version: your database, your storage, your audit log, your agents' tokens issued by you.
How access is controlled