Guide · tested with Wiki.js 2.5.316 on 23 October 2026
How to move from Confluence to Wiki.js
Wiki.js is a free, open source (AGPL-3.0) wiki that you host yourself. Version 2 has no Confluence importer, but it will import a folder of HTML or Markdown files from its server's disk. We tried that on two sample spaces, both exactly as exported and after a short conversion script. Here's what it takes and what comes across.
Facts about Wiki.js are from its own docs, its GitHub releases, its source code and our test. Confluence's menu paths, permissions and what its export leaves out are from Atlassian's docs; how each macro looked in an export is from our test exports. We checked them on 23 October 2026.
Thinking about leaving Confluence? Tablewide is a hosted wiki, built on Docmost, at one flat price per company with unlimited users, from $49 a month (Team, 25 GB). If your company is outside the EEA, UK and Switzerland, get a free preview of one Confluence space from a Confluence export; it's private and needs no card. Google Workspace teams there can start on their own; everyone else there uses the form and, if we can offer a preview, gets an emailed upload link. The preview and your upload are deleted 7 days after it's created (when you name the wiki, or when we send your upload link) unless you subscribe; backup copies roll off within 30 days after that. Our AI agents' working records keep copies of what they read about your preview, with no set deletion date; ask and we delete them within 30 days, and our AI provider removes its copies within a further 30 days (what we keep, and for how long). If your company is in the EEA, UK or Switzerland, use the form and don't upload an export.
Tablewide is an independent service. We are not affiliated with, sponsored by or endorsed by Docmost, Inc. or the Docmost project.
The short answer
- You can do this yourself, with no software fee. Export the space as HTML, put the files in a folder on the Wiki.js server, and run Import Everything from the Local File System storage settings. With no script at all, pages, images, most attachments and relative links between pages came across in our test (some attachments and full Confluence links didn't; see the tables). But every page landed one level under its space, titled with its file name (
Local-Setup_65541), with Confluence's breadcrumbs and footer inside it. - A short script makes it much cleaner. Ours (under 250 lines of Python, not published; Step 3 lists what it does) gave pages their real titles and paths that keep the page tree, moved the attachments in our test, including ones only listed in Confluence's attachments section, and turned panels, code, task lists and expand blocks into Wiki.js equivalents.
- Watch the editor. Imported HTML pages open in Wiki.js's Visual Editor. Saving pages from our macro-converting import there stripped callout colours, code languages, expand blocks and heading anchors. Switch those pages to the Raw HTML editor first, or import Markdown instead (pandoc's conversion lost heading anchors and expand blocks). The pages we tried in Raw HTML and Markdown kept the content as it was when we saved (we switched the Raw HTML pages through the API, not the button).
- Lock it down first. On our new test install of Wiki.js 2.5.316, visitors who weren't logged in could read every page, so restrict the Guests group before you import (Step 4).
- Plan for what's lost: Confluence's page order, and authors and dates. Status labels become plain text. Page restrictions don't come across either: the import reads only a page's title, description, tags and published flag (we didn't test restricted pages). Set access again in Wiki.js.
Still choosing a wiki? See our open source Confluence alternatives comparison.
How we tested
We ran Wiki.js 2.5.316, the latest 2.x release on 23 October 2026, from the official ghcr.io/requarks/wiki:2 Docker image with PostgreSQL 15. We used two made-up Confluence HTML space exports: one shaped like Data Center (10 pages, four levels deep) and one like Cloud (4 pages). Between them they have panels, code blocks, expand blocks, status labels, task lists, emoticons, a Jira link, a draw.io diagram, images, a PDF and links between pages. We imported them four ways: the export as it is, through a script that only fixes links and files, through a script that also converts macros, and as Markdown made with pandoc. We checked pages from each import in a browser and through Wiki.js's API, and opened and saved some in the Visual Editor, Raw HTML and Markdown editors. Try your own space before you rely on any of this.
What Wiki.js says about Confluence
Wiki.js's docs have no Confluence import. Its roadmap lists "Import Content … From Confluence" under 3.x, and says its items "are not set in stone". Wiki.js 3.0 is in beta: the project's release notes page says it is "not yet recommended for production use", and its GitHub releases mark the current 3.0 betas "Not for production use". The stable line is 2.x, whose releases are now published in a separate repository.
What 2.x does have is storage modules that back up or sync content. Local File System and Git both have an Import Everything action that brings files in. Wiki.js's docs have no page for the Local File System module, so the steps below come from its admin screens and our test. Files ending in .html become HTML pages, .md files become Markdown pages (and .adoc files AsciiDoc pages), and any other file becomes an uploaded file (an asset). A page's address is its file path with every dot removed, so the extension goes and Release-2.1-notes.html becomes Release-21-notes (from Wiki.js's source code; our test pages had no dots in their names). We tested Local File System. The Git module needs a Git repository used only by Wiki.js (Wiki.js's Git docs); we didn't test it.
Step 1: Export your Confluence space as HTML
On Confluence Cloud, a space admin selects More actions (•••) next to the space name in the sidebar, then Space settings, then General > Export space > HTML. On Data Center, go to Space tools > Content Tools > Export and choose HTML; you need the Export Space permission (Atlassian, Cloud; Atlassian, Data Center). Either way you get a zip with one HTML file per page, an index.html that lists the page tree, and folders of attachments and images (that's the layout of our test exports). Our export guide has more detail.
Step 2: Decide on paths, and HTML or Markdown
Wiki.js has no fixed levels. Each page has a path such as eng/getting-started/local-setup, and the folders in between are worked out from the paths, so a deep Confluence tree keeps its depth. In our script, the space home page became eng (under a test prefix such as conv/) and every child page a path segment under its parent. Page addresses can't contain spaces or dots (Wiki.js page naming rules), so the script turned titles into lower-case slugs and kept the real title in each file's header.
Don't use a two-letter name as the top folder. Wiki.js reads a first folder like hr/, it/ or en-us/ as a language code. Our first Markdown run used md/, and every page in it failed to import. If the folder matches a language your wiki has installed, such as en/, Wiki.js drops the folder from the page's path instead (from its source code). Single letters (such as a or e) and a few words such as login and register are reserved too (Wiki.js naming rules).
Then choose HTML or Markdown. HTML keeps more of the layout on import, but HTML pages open in the Visual Editor, which rewrites them on the first save (see Step 5). The Markdown page we edited stayed exactly as imported apart from our edit, but pandoc's conversion lost the heading anchors and expand blocks in our test.
Step 3: Convert the export (optional)
You can skip this step and import the export folder as it is. It worked better than we expected, because Wiki.js strips .html from addresses, so Confluence's relative links still find the right pages. You get file names as titles and Confluence's page frame inside every page, and the attachments list stays a list of links. Two catches on this route. In our test the space folders sat inside a test folder (raw/ENG), so the first one didn't come up: if you put the export's space folder directly in the import folder, its name is the first folder of every path, and a two-letter space key such as HR or IT would hit the language-code problem in Step 2 (from the source code; untested), so rename the folder first. And a page whose file name has a dot in it (a version number, say) gets a path without the dot, so links to it won't match (from the source code; untested).
Our script isn't published. The list below is what it does, so you or a developer can write your own.
For each page, our script:
- Read the page tree from the export's
index.htmland gave each page a path under its parent. - Took the content from the page's
main-contentblock, leaving out breadcrumbs and the footer, and wrote the title in a metadata comment at the top of the file. Wiki.js only reads it with<!--and-->on lines of their own, and it reads what's between them as YAML:
Put quotes around titles that YAML would misread, such as one that contains a colon and a space, starts with<!-- title: Local Setup description: isPublished: true tags: -->[or#, or is all digits, for exampletitle: "Runbook: Deploy". Unquoted, a colon and a space or a leading[is a YAML error and Wiki.js drops the whole header, so the page gets its file name as its title; a leading#gives the title no value and digits make it a number (from the 2.5.316 source code and a check with its own YAML library; not tried in an import). Our script didn't quote titles; our test spaces had no titles like these. The import readstitle,description,isPublished(true or false) andtags, written as one line separated by a comma and a space (tags: eng, setup); tags written as a YAML list make the import skip the page (from the source code). UseisPublished; Wiki.js ignorespublished:(our script wrote that, and pages still came out published because that's the default). - Copied images and attachments into a
files/folder under their real names, and pointed the page at them. That included files only listed in Confluence's attachments section and a file linked by its fullatlassian.netaddress, which our BookStack test missed. - Rewrote links to other pages, including full Confluence addresses that contain a page ID, to the new paths. Our script couldn't resolve short links (
/x/A4AB) or links to other spaces. - In a second run, converted info, note, tip and warning panels to Wiki.js's coloured callouts, code blocks to code with their language, expand blocks to collapsible sections, task lists to tick boxes, and emoticons to emoji.
For the Markdown run, we then put each page through pandoc and wrote it as a .md file with the title in its front matter.
Step 4: Import the folder
First, lock the wiki down. In Wiki.js 2.5.316, the setup code (server/setup.js) gives the Guests group (visitors who aren't logged in) read access to every page. On our test install, Administration Area > Groups > Guests > Page Rules showed a rule allowing read:pages, read:assets and read:comments on paths starting with /, and a page we created could be read without logging in. Remove or narrow that rule (we didn't test changing it), or keep the wiki off the network, before you import, then set access with groups and page rules (Wiki.js permissions docs). Confluence's export holds only the pages the person exporting could view (Atlassian), so an export by someone who could view restricted pages can include them. Check who ran the export.
- Put the folder where the Wiki.js server can read and write it. In Docker, mount it into the container. Wiki.js rewrites SVG files when it imports them; while our files were read-only, the SVGs failed with a permissions error.
- In the Administration Area, open Storage, tick Local File System, switch it to Active, enter the folder as Path and press APPLY.
- Scroll to Actions and press RUN on Import Everything.
- Open Utilities > Content and press PROCEED on Rerender All Pages. Until we did, links to pages imported later in the same run showed in red as missing pages, though they went to the right place.
The import took about 3 seconds a page in our test. We only tried runs of 14 to 16 pages, so time a test run of your own space. A 12 MB file imported from the folder although the browser upload limit (Administration Area > Security) was 5 MB.
Local File System only works in "Push to target" mode: after the import, Wiki.js wrote every page we edited back into that folder. That makes it a backup, which may be what you want. If not, switch it off once the import is done.
What you get
Two tables: first the pages, files and links, then the Confluence macros. "With our script" means our test script (Step 3); where the Markdown run differed, the cell says so. A cell that spans both columns means both routes gave the same result.
Pages, files and links
| In Confluence | Export as it is | With our script |
|---|---|---|
| Page titles | File names, such as Local-Setup. Confluence's own title, breadcrumbs and footer appear inside the page. | Real titles. |
| Page tree | Flat: every page sits one level under its space. The tree survives only as the list of links on the imported index page. | Kept at full depth as paths. The Browse menu in Wiki.js lists folders first, then pages by title, so the page order from Confluence is lost. |
| Text, headings, lists and tables | Kept. Table cell colours are lost, and side-by-side page columns become one column. | |
| Images | Uploaded as files and shown in place (PNG and SVG in our test). | |
| Attachments | Uploaded under Confluence's ID numbers as file names (65545.png). The page's attachments list links to them, with their real names as the link text. | Uploaded under their real names, including files only in the attachments list or linked by full Confluence address, because our script collected them. |
| .txt, .md and .html attachments | .txt files: uploaded, but not downloadable: Wiki.js treats an address ending in .txt as a page and shows "not found". The list of such endings is the Page Extensions setting (Administration Area > General > URL Handling; default md, html, txt); taking txt out should fix it, but we didn't try. Attached .md and .html files don't become files at all: the import turns them into pages (from the source code). | |
| Links between pages | Work, because Wiki.js drops the .html. Full Confluence addresses still go to your old site. | Point to the new pages, including full Confluence addresses with a page ID. Short links and links to other spaces still go to your old site. |
| Links to a heading | Work: Wiki.js keeps Confluence's heading IDs, until the page is saved in the Visual Editor (Step 5). | HTML: work the same way. Markdown: open the page at the top, because pandoc drops the heading IDs. |
| Authors and dates | Lost. Every page says it was last edited by whoever ran the import, at import time. Wiki.js ignored dates we put in the file header. (Our macro-converting run kept Confluence's "Created by … last modified by …" line as the first paragraph.) | |
| Comments and blog posts | Not in our test. Atlassian says Cloud's HTML export leaves out page comments and blog posts; Data Center's leaves out blog posts and includes comments only if you choose that option. | |
| Page restrictions | Not carried: the import reads only a page's title, description, tags and published flag from each file. We didn't test restricted pages. Wiki.js sets access with groups and page rules by path (Wiki.js permissions docs), so set them again, and restrict Guests first (Step 4). | |
Confluence macros
| In Confluence | Not converted (as exported, or links and files only) | Converted by our script |
|---|---|---|
| Info, note, tip and warning panels | Plain paragraphs. The panel title is a bold line. | Wiki.js callouts in blue, yellow, green or red. Markdown: one panel whose last item was a list came out as a plain grey quote. |
| Panels with a background colour | Kept the colour. | |
| Code blocks | Plain monospaced lines with no box. The language and highlighting are lost, and a code title becomes a bold line. | Code blocks with highlighting, line numbers and the language. |
| Expand blocks | Always open. The title becomes an ordinary line. | HTML: collapsible sections. Markdown: always open, because pandoc drops the collapsible section. |
| Status labels | Plain text. | |
| Task lists | Plain bullets. | Tick boxes, with done items ticked. |
| Confluence emoticons | Broken images, except where the icon file was in the export. | Emoji characters. |
| Children and table of contents macros | A fixed list of links, as it was on the day of the export. | |
| Page tree macro | Gone. In our test export it was an empty placeholder, so nothing came across. | |
| Jira issue macro | The issue key stays as a link to Jira with its summary, next to a broken icon. | The same, without the broken icon. |
| draw.io diagram | The export's PNG preview shows as a plain image, so you can't edit the diagram. The diagram's source file had no file extension and couldn't be opened from Wiki.js. | |
Step 5: Before anyone edits, pick the editor
Wiki.js opens imported HTML pages in its Visual Editor. We opened five pages from the macro-converting import there, typed a character and deleted it, and saved. On the Local Setup page, the callout lost its colour, code lost its language, heading IDs were renamed (so links to those headings would no longer match) and table cells in body rows turned into header cells. On two pages, collapsible sections became plain text. On another, page columns and status labels were flattened, and on the space home page the CSS of Confluence's table of contents macro showed as text. Task lists survived. Page history let us restore the imported version of a page; we did this for two of them.
From version 2.5.201, Wiki.js can change a page's editor with its Convert action, which its editor docs say needs no format conversion between the Visual Editor and Raw HTML. (Wiki.js's older page guide still says it's not possible to change editor once a page is created; the editor docs describe the newer Convert action.) We switched two pages to Raw HTML through Wiki.js's API (we didn't try the Convert button itself) and edited them: the content stayed exactly as imported apart from our edit. A Markdown page did the same in the Markdown editor. The catch: Raw HTML means editing HTML by hand.
Step 6: Tidy up
- Check the tree against the export's
index.html. Paths are the hierarchy, so a page in the wrong place needs a new path (Wiki.js's structure docs mention moving pages; we didn't try it). - Fix links. Search your import folder (with
grep, for example) for your old Confluence address to find pages whose links still point there. - Fix the macros your script didn't convert, such as status labels.
- Check permissions with Wiki.js groups and page rules, including what Guests can see.
- Keep the export zip. It's your snapshot of the old space.
When you don't need us
If someone on your team is happy to run a server and write or adapt a short script, Wiki.js and the steps above should move a Confluence space with no software fee; you still pay for the server and your team's time (we only tried runs of 14 to 16 pages). Even without a script, the export imported as it is gives you readable pages with mostly working links and files, though with file names as titles and no page tree (see the tables). With a script, a space of mostly text, headings, lists, tables and images comes across with its titles, tree and files. Page order, authors and dates are still lost, and you should pick the editor before anyone edits (Step 5). Wiki.js is a reasonable choice if you want Markdown pages, or pages synced to Git (we didn't test Git), and don't mind a wiki without a Confluence importer.
Other routes
- Git. Wiki.js's Git storage module also has Import Everything, and in the 2.5.316 source code it hands files to the same page import code as Local File System. Useful if your pages already live in Git or you want them to. We didn't test it.
- Wait for 3.0. A Confluence import is on the 3.x roadmap, which gives no date, and the project says its roadmap items "are not set in stone". 3.0 is in beta.
- Pay someone to do it. A consultant can build and run the conversion for you. We also run a paid, best-efforts Confluence migration service (from $29), but it moves spaces into your own Docmost or BookStack, not Wiki.js today. If you want Wiki.js, tell us on that page and we'll say plainly whether we can do it well before you send anything.
- Pick a wiki with an import. Docmost has a Confluence importer that its docs say keeps the page tree; its pricing lists it on the Business plan. We haven't tested it. Docmost's free Community edition imports a zip of HTML pages (Docmost's import docs), but in our test it put every page of a Confluence export at the top level (Confluence to Docmost guide). Our Confluence to BookStack guide covers a scripted move to BookStack, and Confluence to Markdown covers getting Markdown out of Confluence.
Or let Tablewide move you to Docmost
Tablewide doesn't sell hosted Wiki.js. If you'd rather not run a wiki yourself, we host Docmost, a different open source wiki, for you from $49 a month for your whole team, with unlimited users. If you subscribe, we move your Confluence spaces to Docmost at no extra charge, on a best-efforts basis. Our cost calculator compares that with your Confluence bill. In our tests, our own importer rebuilt the page tree in Confluence's order with the real page titles, and turned panels into callouts, status labels into status pills, task lists into to-dos and expand blocks into toggles. Code kept its language, and attachments, images and links between pages carried over in our tests. In our tests on 13 made-up test exports (2,120 pages), every page landed under the right parent. Your space may have quirks ours didn't, which is why you check the result first. You can click around a sample wiki to see Docmost before you decide.
Some things don't carry over even with us. Links to a heading open the page at the top. Labels don't carry over. Docmost lists the importer as each page's author, though where the export records it, each page opens with a line naming who created and last edited it in Confluence, and when. Page restrictions aren't carried; access is set per space. You check the result before anyone switches.
Founding offer. First 20 teams: 40% off your first year, and your price locked for as long as you stay. No payment now. A preview doesn't reserve a founding place.
If your company is in the EEA, UK or Switzerland, please use the form and don't upload an export. We'll email you an offer to build your preview from your public pages (our AI agents read those pages to write it, and what they read can stay in their working records with our AI provider; nothing is built on our servers until you say yes), or tell you if that isn't possible (preview terms).
Wiki.js is a trademark of its developers, Docmost is a trademark of its developers, and Confluence is a trademark of Atlassian. Tablewide is not affiliated with or endorsed by any of them.