PlainPage, a self-hosted app that embodies simplicity, ease of use, and privacy. PlainPage offers a plain and simplistic user experience while providing essential wiki-like functionality. It adheres to the 😘 KISS principle, focusing on delivering a straightforward and efficient user experience without unnecessary complexities.
Powered by Go, Vue/Nuxt. Made with 💖
-
Markdown Syntax ✨ Create and edit your content using Markdown syntax, a lightweight and intuitive markup language that makes writing and formatting a breeze.
-
Plain File Storage 🤩 PlainPage utilizes a plain file storage system, your content is stored in a simple and accessible format.
-
Snappy User Interface 🚀 PlainPage offers a snappy and responsive user interface, allowing you to focus on your content and enhancing your productivity.
-
Privacy-First 🛑 PlainPage does not track your usage, collect statistics, or employ any analytics tools. Your data remains private and under your control.
-
Access Rights 🔐 PlainPage provides robust access control with powerful yet user-friendly ACLs. You can easily manage and assign permissions to your content, ensuring that the right people have access to the right information.
- Localization: English, German, Spanish
- Supports light/dark mode
- Embedded full text search
- Not optimized for access by machines, e.g., search engines
- Concurrent/conflicting edits are not prevented
To start using PlainPage, self-host the app in your preferred environment. The process is quick and hassle-free, allowing you to jump right into creating, organizing, and managing your content.
Trying it out is as simple as it can be:
- Download the latest release,
- Run the PlainPage executable, and
- Browse to http://localhost:8080/.
Or just run the docker image 🔋:
docker run --rm -p 8080:8080 ghcr.io/tfabritius/plainpage
Make sure to persist your data by mounting a volume or local folder to the container's /data
directory:
docker run -p 8080:8080 -v /path/on/host:/data ghcr.io/tfabritius/plainpage
As usual: Backup your data!
When running in production you typically want to run a reverse proxy in front of PlainPage that provides encryption via TLS/SSL. Popular choices are: Caddy, Traeffic, Nginx, Apache, ...
PlainPage executable has very few configration settings with sensible default values that can be configured by environment variables (or a .env
file):
# Directory to store data, defaults to `data` directory next to executable
DATA_DIR=./data
# Port to listen on, defaults to 8080
PORT=8080
All other settings can be done via the UI or by editing the config.yml
file in the data directory:
-
appTitle
is the title of the app. Use it to customize your installation of PlainPage. -
acl
contains the access rules that apply independent from access rules of individual pages and folders. -
jwtSecret
is a the secret that is used to sign and verify JWT tokens. It is generated automatically. Keep it safe! For security reasons it's neither exposed nor can be changed via UI. -
setupMode
enables anonymous user registration and user will be granted admin rights. Will be disabled after first registration.
PlainPage stores your information on pages. Pages are organized into folders, that can be nested.
Pages are written in Markdown syntax.
Access rights can be modified by administrators.
PlainPage's permission system is powerful and yet easy to use. If you don't adjust it, all registered users will be able to access and edit all content.
Permissions can be defined for both pages and folders. By default, permissions for pages and folders are inherited from parent folder.
- A page
/folder/page
will inherit its access rigts from the folder/folder
, unless explicit permissions are defined for this page. - The folder
/folder
will itself inherit its permissions from the parent folder/
, unless permissions are defined for/folder
. - The home folder
/
cannot inherit permissions.
Permissions can be granted to individual users, but also to all registered users and users, that are not logged in ("anonymous" users).
Permissions are controlled finegrained for different operations:
- Read allows users to access pages and folder
- Write allows users to change pages and folders (e.g. create new pages or folders within a folder)
- Delete allows users to delete pages and folders completely (e.g. deleting a page instead of just editing it)
That allows you to restrict certain content of PlainPage to some users and/or expose certain content.
Besides pages and folders PlainPage allows you to grant additional permissions:
-
The Register privilege allows to create new users in PlainPage. This way you can control whether new users (so far anonymous users without an account) can create their own account and whether existing users can create additional user accounts. By default, only administrator can register new users.
-
The Admin privilege grants a user special rights, e.g. to change the permissions. Users with this privilege are automatically granted all other possible permissions on all content.
e
: Edit pageCtrl+s
: Save page (when editing)Esc
: Cancel edit (when editing), close full screen modeCtrl+Backsapce
: Delete current page/folder
🤩 You're welcome to contribute to PlainPage.
During development, there are two processes running:
-
Nuxt frontend
cd frontend pnpm run dev
-
Go backend
cd backend go run .
Browse to http://localhost:3000. Nuxt will proxy requests to the backend.
In production the static frontend files are served together with the backend:
-
Generate static frontend files
cd frontend pnpm run generate
-
Serve frontend from Go backend process
cd backend go generate ./... go build .
Browse to http://localhost:8080.