Make a link page or a documentation website in your browser.
Download it as a zip and put it online anywhere. No coding, no account, no server.
Try it · Page editor · Docs builder · Documentation
Plinth has two tools. Pick the one that fits, build in the browser, and download a zip.
![]() A finished link page on a phone |
![]() An exported docs site, light mode ![]() The same site in dark mode. It follows the visitor's device setting. |
- Open the page editor or the docs builder.
- Change the text, pick a color, add blocks or pages. The preview updates as you type.
- Click Export site (.zip), unzip the file and upload the folder to any web host.
That is the whole process. The documentation has step-by-step hosting instructions.

The project documentation, built with Nextra, with full-text search.
Requires Node 20 or later and pnpm.
pnpm install
pnpm dev # http://localhost:3000
pnpm build:zip # static site in out/, plus plinth-site.zip
pnpm lintThe first pnpm dev runs a production build once to create the export template that the page editor's export button needs. It takes about a minute.
| Page editor | Docs builder | |
|---|---|---|
| Output | <name>.zip |
<title>-site.zip |
| Contents | index.html, _next/ assets |
One .html per page, assets/, 404.html |
| Runtime | React, rendered in the browser | None. HTML, CSS and one small script |
| Subpaths | Set Hosting path before export | Works as is, all links are relative |
| Reopen later | No | Open .zip restores the project |
Both zips contain .nojekyll. No server configuration is needed.
Page editor. pnpm build:zip packs the built _next/ assets and the HTML of the /export-template/ route into export-template.zip. In the browser, the editor downloads that template, writes the page config into a JSON script tag, rewrites asset URLs for the chosen hosting path and zips the result. The exported page renders the config with the same component the editor preview uses.
Docs builder. src/lib/docsSite turns a tree of Markdown pages into standalone HTML. Markdown is parsed with marked. Links written as /folder/page become relative file links. Search is a generated index that runs in the visitor's browser. The live preview uses the same generator as the export.
Subpath deploys. Next.js reads NEXT_PUBLIC_BASE_PATH at build time. The GitHub Pages workflow sets it to the repository name, which is how this project runs at /plinth/.
| Path | Contents |
|---|---|
src/app |
Routes: landing, editors, docs, brand pages, page files |
src/screens |
Editor and landing screens |
src/components |
Blocks, layouts, page renderer |
src/lib/docsSite |
Docs builder: model, Markdown, theme, generator |
src/lib/exportSite.js |
Page editor export |
src/clients |
Page files, one .mdx per page, rendered at build time |
content |
The project docs, as Nextra pages |
readme, screenshots |
Artwork and screenshots used in this file |
scripts/build-zip.mjs |
Build, docs search index, export template, project zip |
Notes for adding a block or a layout are in the contributing guide.
The workflow in .github/workflows/pages.yml builds on every push to main. Set Settings → Pages → Source to GitHub Actions once. For a user or organization site served from the domain root, remove the NEXT_PUBLIC_BASE_PATH line from the workflow.
Everything is on its latest release except three packages:
typescriptstays on 6.x becausetypescript-eslintdoes not support 7 yet.lucide-reactstays on 0.577 because 1.x removed the brand icons the editor offers.zodis pinned to 4.1.12 inpnpm-workspace.yamlbecause Nextra 4.6.1 fails to render the last page of a section with newer versions.
- Page editor exports need JavaScript in the visitor's browser.
- The page editor's hosting path is fixed at export time.
- Editor state lives in the browser's local storage. Export a zip to keep a copy.
- Fonts chosen in the page editor load from Google Fonts at view time.
The page editor no longer exports JSON or MDX. Use Export site (.zip). Existing .mdx files in src/clients still render.
MIT © 2025-2026 Amineos





