From ab328e02123fa86d4c405f738138c8189bf6f974 Mon Sep 17 00:00:00 2001
From: shamoon <4887959+shamoon@users.noreply.github.com>
Date: Fri, 6 Feb 2026 08:34:15 -0800
Subject: [PATCH] Chore: move to Zensical for docs (#12011)
(cherry picked from commit 3c51b3f9cd7df6af25ba4726b0d57d7d7d686706)
---
.devcontainer/vscode/tasks.json | 4 +-
.github/dependabot.yml | 2 +-
.github/workflows/ci-docs.yml | 56 ++++++--------
.gitignore | 2 +-
docs/api.md | 2 +-
docs/assets/extra.css | 47 ++++++------
docs/development.md | 6 +-
docs/faq.md | 4 +
docs/index.md | 4 +
docs/setup.md | 6 +-
docs/usage.md | 6 +-
mkdocs.yml | 87 ---------------------
pyproject.toml | 3 +-
uv.lock | 130 +++++++++++---------------------
zensical.toml | 128 +++++++++++++++++++++++++++++++
15 files changed, 245 insertions(+), 242 deletions(-)
delete mode 100644 mkdocs.yml
create mode 100644 zensical.toml
diff --git a/.devcontainer/vscode/tasks.json b/.devcontainer/vscode/tasks.json
index f7cd18d48..bbc1684ce 100644
--- a/.devcontainer/vscode/tasks.json
+++ b/.devcontainer/vscode/tasks.json
@@ -116,9 +116,9 @@
},
{
"label": "Maintenance: Build Documentation",
- "description": "Build the documentation with MkDocs",
+ "description": "Build the documentation with Zensical",
"type": "shell",
- "command": "uv run mkdocs build --config-file mkdocs.yml && uv run mkdocs serve",
+ "command": "uv run zensical build && uv run zensical serve",
"group": "none",
"presentation": {
"echo": true,
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 641126309..0cd9a445e 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -46,7 +46,7 @@ updates:
patterns:
- "*pytest*"
- "ruff"
- - "mkdocs-material"
+ - "zensical"
- "prek*"
# Django & DRF Ecosystem
django-ecosystem:
diff --git a/.github/workflows/ci-docs.yml b/.github/workflows/ci-docs.yml
index 4c7cf453c..213f6e409 100644
--- a/.github/workflows/ci-docs.yml
+++ b/.github/workflows/ci-docs.yml
@@ -6,17 +6,25 @@ on:
- dev
paths:
- 'docs/**'
- - 'mkdocs.yml'
+ - 'zensical.toml'
+ - 'pyproject.toml'
+ - 'uv.lock'
- '.github/workflows/ci-docs.yml'
pull_request:
paths:
- 'docs/**'
- - 'mkdocs.yml'
+ - 'zensical.toml'
+ - 'pyproject.toml'
+ - 'uv.lock'
- '.github/workflows/ci-docs.yml'
workflow_dispatch:
concurrency:
group: docs-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
+permissions:
+ contents: read
+ pages: write
+ id-token: write
env:
DEFAULT_UV_VERSION: "0.9.x"
DEFAULT_PYTHON_VERSION: "3.11"
@@ -25,6 +33,7 @@ jobs:
name: Build Documentation
runs-on: ubuntu-24.04
steps:
+ - uses: actions/configure-pages@v5
- name: Checkout
uses: actions/checkout@v6
- name: Set up Python
@@ -47,42 +56,23 @@ jobs:
--python ${{ steps.setup-python.outputs.python-version }} \
--dev \
--frozen \
- mkdocs build --config-file ./mkdocs.yml
- - name: Upload artifact
- uses: actions/upload-artifact@v6
+ zensical build --clean
+ - name: Upload GitHub Pages artifact
+ uses: actions/upload-pages-artifact@v4
with:
- name: documentation
- path: site/
- retention-days: 7
+ path: site
+ name: github-pages-${{ github.run_id }}-${{ github.run_attempt }}
deploy:
name: Deploy Documentation
needs: build
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
runs-on: ubuntu-24.04
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
steps:
- - name: Checkout
- uses: actions/checkout@v6
- - name: Set up Python
- id: setup-python
- uses: actions/setup-python@v6
+ - name: Deploy GitHub Pages
+ uses: actions/deploy-pages@v4
+ id: deployment
with:
- python-version: ${{ env.DEFAULT_PYTHON_VERSION }}
- - name: Install uv
- uses: astral-sh/setup-uv@v7
- with:
- version: ${{ env.DEFAULT_UV_VERSION }}
- enable-cache: true
- python-version: ${{ env.DEFAULT_PYTHON_VERSION }}
- - name: Install Python dependencies
- run: |
- uv sync --python ${{ steps.setup-python.outputs.python-version }} --dev --frozen
- - name: Deploy documentation
- run: |
- echo "docs.paperless-ngx.com" > "${{ github.workspace }}/docs/CNAME"
- git config --global user.name "${{ github.actor }}"
- git config --global user.email "${{ github.actor }}@users.noreply.github.com"
- uv run \
- --python ${{ steps.setup-python.outputs.python-version }} \
- --dev \
- --frozen \
- mkdocs gh-deploy --force --no-history
+ artifact_name: github-pages-${{ github.run_id }}-${{ github.run_attempt }}
diff --git a/.gitignore b/.gitignore
index 715760b29..c607f922d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -54,7 +54,7 @@ junit.xml
# Django stuff:
*.log
-# MkDocs documentation
+# Zensical documentation
site/
# PyBuilder
diff --git a/docs/api.md b/docs/api.md
index ced8eb5b3..7db6bbc7e 100644
--- a/docs/api.md
+++ b/docs/api.md
@@ -1,4 +1,4 @@
-# The REST API
+# REST API
Paperless-ngx now ships with a fully-documented REST API and a browsable
web interface to explore it. The API browsable interface is available at
diff --git a/docs/assets/extra.css b/docs/assets/extra.css
index 270c1a219..c93e467fd 100644
--- a/docs/assets/extra.css
+++ b/docs/assets/extra.css
@@ -1,13 +1,31 @@
-:root > * {
- --md-primary-fg-color: #17541f;
- --md-primary-fg-color--dark: #17541f;
- --md-primary-fg-color--light: #17541f;
- --md-accent-fg-color: #2b8a38;
+:root>* {
+ --paperless-green: #17541f;
+ --paperless-green-accent: #2b8a38;
+ --md-primary-fg-color: var(--paperless-green);
+ --md-primary-fg-color--dark: var(--paperless-green);
+ --md-primary-fg-color--light: var(--paperless-green-accent);
+ --md-accent-fg-color: var(--paperless-green-accent);
--md-typeset-a-color: #21652a;
}
+.md-header,
+.md-tabs {
+ background-color: var(--paperless-green);
+ color: #fff;
+}
+
+.md-tabs__link {
+ color: rgba(255, 255, 255, 0.82);
+}
+
+.md-tabs__link:hover,
+.md-tabs__link--active {
+ color: #fff;
+}
+
[data-md-color-scheme="slate"] {
--md-hue: 222;
+ --md-default-bg-color: hsla(var(--md-hue), 15%, 10%, 1);
}
@media (min-width: 768px) {
@@ -69,8 +87,8 @@ h4 code {
}
/* Hide config vars from sidebar, toc and move the border on mobile case their hidden */
-.md-nav.md-nav--secondary .md-nav__item .md-nav__link[href*="PAPERLESS_"],
-.md-nav.md-nav--secondary .md-nav__item .md-nav__link[href*="USERMAP_"] {
+.md-nav.md-nav--secondary .md-nav__item:has(> .md-nav__link[href*="PAPERLESS_"]),
+.md-nav.md-nav--secondary .md-nav__item:has(> .md-nav__link[href*="USERMAP_"]) {
display: none;
}
@@ -83,18 +101,3 @@ h4 code {
border-top: .05rem solid var(--md-default-fg-color--lightest);
}
}
-
-/* Show search shortcut key */
-[data-md-toggle="search"]:not(:checked) ~ .md-header .md-search__form::after {
- position: absolute;
- top: .3rem;
- right: .3rem;
- display: block;
- padding: .1rem .4rem;
- color: var(--md-default-fg-color--lighter);
- font-weight: bold;
- font-size: .8rem;
- border: .05rem solid var(--md-default-fg-color--lighter);
- border-radius: .1rem;
- content: "/";
- }
diff --git a/docs/development.md b/docs/development.md
index f17d02d02..9f14f1d9e 100644
--- a/docs/development.md
+++ b/docs/development.md
@@ -338,13 +338,13 @@ LANGUAGES = [
## Building the documentation
-The documentation is built using material-mkdocs, see their [documentation](https://squidfunk.github.io/mkdocs-material/reference/).
+The documentation is built using Zensical, see their [documentation](https://zensical.org/docs/).
If you want to build the documentation locally, this is how you do it:
1. Build the documentation
```bash
- $ uv run mkdocs build --config-file mkdocs.yml
+ $ uv run zensical build
```
_alternatively..._
@@ -355,7 +355,7 @@ If you want to build the documentation locally, this is how you do it:
something.
```bash
- $ uv run mkdocs serve
+ $ uv run zensical serve
```
## Building the Docker image
diff --git a/docs/faq.md b/docs/faq.md
index 7db8d9dd7..2f6c0ea57 100644
--- a/docs/faq.md
+++ b/docs/faq.md
@@ -1,3 +1,7 @@
+---
+title: FAQs
+---
+
# Frequently Asked Questions
## _What's the general plan for Paperless-ngx?_
diff --git a/docs/index.md b/docs/index.md
index 1d72f8f6c..2e3a311df 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -1,3 +1,7 @@
+---
+title: Home
+---
+
{.index-logo}
{.index-logo}
diff --git a/docs/setup.md b/docs/setup.md
index f0381f076..13cf6a63d 100644
--- a/docs/setup.md
+++ b/docs/setup.md
@@ -1,4 +1,8 @@
-## Installation
+---
+title: Setup
+---
+
+# Installation
You can go multiple routes to setup and run Paperless:
diff --git a/docs/usage.md b/docs/usage.md
index 1e339b61e..ca57e9018 100644
--- a/docs/usage.md
+++ b/docs/usage.md
@@ -1,4 +1,8 @@
-# Usage Overview
+---
+title: Basic Usage
+---
+
+# Usage
Paperless-ngx is an application that manages your personal documents. With
the (optional) help of a document scanner (see [the scanners wiki](https://github.com/paperless-ngx/paperless-ngx/wiki/Scanner-&-Software-Recommendations)), Paperless-ngx transforms your unwieldy
diff --git a/mkdocs.yml b/mkdocs.yml
deleted file mode 100644
index 69a15193a..000000000
--- a/mkdocs.yml
+++ /dev/null
@@ -1,87 +0,0 @@
-site_name: Paperless-ngx
-theme:
- name: material
- logo: assets/logo.svg
- font:
- text: Roboto
- code: Roboto Mono
- palette:
- # Palette toggle for automatic mode
- - media: "(prefers-color-scheme)"
- toggle:
- icon: material/brightness-auto
- name: Switch to light mode
- # Palette toggle for light mode
- - media: "(prefers-color-scheme: light)"
- scheme: default
- toggle:
- icon: material/brightness-7
- name: Switch to dark mode
- # Palette toggle for dark mode
- - media: "(prefers-color-scheme: dark)"
- scheme: slate
- toggle:
- icon: material/brightness-4
- name: Switch to system preference
- features:
- - navigation.tabs
- - navigation.top
- - toc.integrate
- - content.code.annotate
- icon:
- repo: fontawesome/brands/github
- favicon: assets/favicon.png
-repo_url: https://github.com/paperless-ngx/paperless-ngx
-repo_name: paperless-ngx/paperless-ngx
-edit_uri: blob/main/docs/
-extra_css:
- - assets/extra.css
-markdown_extensions:
- - attr_list
- - md_in_html
- - def_list
- - admonition
- - tables
- - pymdownx.highlight:
- anchor_linenums: true
- - pymdownx.superfences
- - pymdownx.inlinehilite
- - pymdownx.snippets
- - pymdownx.tilde
- - footnotes
- - pymdownx.superfences:
- custom_fences:
- - name: mermaid
- class: mermaid
- format: !!python/name:pymdownx.superfences.fence_code_format
- - pymdownx.emoji:
- emoji_index: !!python/name:material.extensions.emoji.twemoji
- emoji_generator: !!python/name:material.extensions.emoji.to_svg
-strict: true
-nav:
- - index.md
- - setup.md
- - 'Basic Usage': usage.md
- - configuration.md
- - administration.md
- - advanced_usage.md
- - 'REST API': api.md
- - development.md
- - 'FAQs': faq.md
- - troubleshooting.md
- - 'Migration to v3': migration.md
- - changelog.md
-copyright: Copyright © 2016 - 2026 Daniel Quinn, Jonas Winkler, and the Paperless-ngx team
-extra:
- social:
- - icon: fontawesome/brands/github
- link: https://github.com/paperless-ngx/paperless-ngx
- - icon: fontawesome/brands/docker
- link: https://hub.docker.com/r/paperlessngx/paperless-ngx
- - icon: material/chat
- link: https://matrix.to/#/#paperless:matrix.org
-plugins:
- - search
- - glightbox:
- skip_classes:
- - no-lightbox
diff --git a/pyproject.toml b/pyproject.toml
index cc5750e9b..eaa917a6f 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -106,8 +106,7 @@ dev = [
]
docs = [
- "mkdocs-glightbox~=0.5.1",
- "mkdocs-material~=9.7.0",
+ "zensical>=0.0.21",
]
testing = [
diff --git a/uv.lock b/uv.lock
index 18b784b8e..d18953832 100644
--- a/uv.lock
+++ b/uv.lock
@@ -935,6 +935,16 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/9a/c7/95349670e193b2891176e1b8e5f43e12b31bff6d9994f70e74ab385047f6/dateparser-1.3.0-py3-none-any.whl", hash = "sha256:8dc678b0a526e103379f02ae44337d424bd366aac727d3c6cf52ce1b01efbb5a", size = 318688, upload-time = "2026-02-04T16:00:04.652Z" },
]
+[[package]]
+name = "deepmerge"
+version = "2.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/a8/3a/b0ba594708f1ad0bc735884b3ad854d3ca3bdc1d741e56e40bbda6263499/deepmerge-2.0.tar.gz", hash = "sha256:5c3d86081fbebd04dd5de03626a0607b809a98fb6ccba5770b62466fe940ff20", size = 19890, upload-time = "2024-08-30T05:31:50.308Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/2d/82/e5d2c1c67d19841e9edc74954c827444ae826978499bde3dfc1d007c8c11/deepmerge-2.0-py3-none-any.whl", hash = "sha256:6de9ce507115cff0bed95ff0ce9ecc31088ef50cbdf09bc90a09349a318b3d00", size = 13475, upload-time = "2024-08-30T05:31:48.659Z" },
+]
+
+
[[package]]
name = "deprecated"
version = "1.3.1"
@@ -2562,86 +2572,6 @@ name = "microsoft-python-type-stubs"
version = "0"
source = { git = "https://github.com/microsoft/python-type-stubs.git#692c37c3969d22612b295ddf7e7af5907204a386" }
-[[package]]
-name = "mkdocs"
-version = "1.6.1"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "click", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
- { name = "ghp-import", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
- { name = "jinja2", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
- { name = "markdown", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
- { name = "markupsafe", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
- { name = "mergedeep", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
- { name = "mkdocs-get-deps", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
- { name = "packaging", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
- { name = "pathspec", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
- { name = "pyyaml", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
- { name = "pyyaml-env-tag", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
- { name = "watchdog", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/bc/c6/bbd4f061bd16b378247f12953ffcb04786a618ce5e904b8c5a01a0309061/mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2", size = 3889159, upload-time = "2024-08-30T12:24:06.899Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e", size = 3864451, upload-time = "2024-08-30T12:24:05.054Z" },
-]
-
-[[package]]
-name = "mkdocs-get-deps"
-version = "0.2.0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "mergedeep", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
- { name = "platformdirs", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
- { name = "pyyaml", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/98/f5/ed29cd50067784976f25ed0ed6fcd3c2ce9eb90650aa3b2796ddf7b6870b/mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c", size = 10239, upload-time = "2023-11-20T17:51:09.981Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134", size = 9521, upload-time = "2023-11-20T17:51:08.587Z" },
-]
-
-[[package]]
-name = "mkdocs-glightbox"
-version = "0.5.2"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "selectolax", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/8d/26/c793459622da8e31f954c6f5fb51e8f098143fdfc147b1e3c25bf686f4aa/mkdocs_glightbox-0.5.2.tar.gz", hash = "sha256:c7622799347c32310878e01ccf14f70648445561010911c80590cec0353370ac", size = 510586, upload-time = "2025-10-23T14:55:18.909Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/4e/ca/03624e017e5ee2d7ce8a08d89f81c1e535eb3c30d7b2dc4a435ea3fbbeae/mkdocs_glightbox-0.5.2-py3-none-any.whl", hash = "sha256:23a431ea802b60b1030c73323db2eed6ba859df1a0822ce575afa43e0ea3f47e", size = 26458, upload-time = "2025-10-23T14:55:17.43Z" },
-]
-
-[[package]]
-name = "mkdocs-material"
-version = "9.7.1"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "babel", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
- { name = "backrefs", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
- { name = "colorama", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
- { name = "jinja2", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
- { name = "markdown", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
- { name = "mkdocs", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
- { name = "mkdocs-material-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
- { name = "paginate", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
- { name = "pygments", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
- { name = "pymdown-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
- { name = "requests", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/27/e2/2ffc356cd72f1473d07c7719d82a8f2cbd261666828614ecb95b12169f41/mkdocs_material-9.7.1.tar.gz", hash = "sha256:89601b8f2c3e6c6ee0a918cc3566cb201d40bf37c3cd3c2067e26fadb8cce2b8", size = 4094392, upload-time = "2025-12-18T09:49:00.308Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/3e/32/ed071cb721aca8c227718cffcf7bd539620e9799bbf2619e90c757bfd030/mkdocs_material-9.7.1-py3-none-any.whl", hash = "sha256:3f6100937d7d731f87f1e3e3b021c97f7239666b9ba1151ab476cabb96c60d5c", size = 9297166, upload-time = "2025-12-18T09:48:56.664Z" },
-]
-
-[[package]]
-name = "mkdocs-material-extensions"
-version = "1.3.1"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/79/9b/9b4c96d6593b2a541e1cb8b34899a6d021d208bb357042823d4d2cabdbe7/mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443", size = 11847, upload-time = "2023-11-22T19:09:45.208Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31", size = 8728, upload-time = "2023-11-22T19:09:43.465Z" },
-]
-
[[package]]
name = "mpmath"
version = "1.3.0"
@@ -3227,8 +3157,6 @@ dev = [
{ name = "daphne", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
{ name = "factory-boy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
{ name = "imagehash", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
- { name = "mkdocs-glightbox", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
- { name = "mkdocs-material", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
{ name = "prek", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
{ name = "pytest", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
{ name = "pytest-cov", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
@@ -3240,10 +3168,10 @@ dev = [
{ name = "pytest-sugar", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
{ name = "pytest-xdist", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
{ name = "ruff", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
+ { name = "zensical", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
]
docs = [
- { name = "mkdocs-glightbox", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
- { name = "mkdocs-material", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
+ { name = "zensical", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
]
lint = [
{ name = "prek", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
@@ -3369,8 +3297,6 @@ dev = [
{ name = "daphne" },
{ name = "factory-boy", specifier = "~=3.3.1" },
{ name = "imagehash" },
- { name = "mkdocs-glightbox", specifier = "~=0.5.1" },
- { name = "mkdocs-material", specifier = "~=9.7.0" },
{ name = "prek", specifier = "~=0.3.0" },
{ name = "pytest", specifier = "~=9.0.0" },
{ name = "pytest-cov", specifier = "~=7.0.0" },
@@ -3382,10 +3308,10 @@ dev = [
{ name = "pytest-sugar" },
{ name = "pytest-xdist", specifier = "~=3.8.0" },
{ name = "ruff", specifier = "~=0.15.0" },
+ { name = "zensical", specifier = ">=0.0.21" },
]
docs = [
- { name = "mkdocs-glightbox", specifier = "~=0.5.1" },
- { name = "mkdocs-material", specifier = "~=9.7.0" },
+ { name = "zensical", specifier = ">=0.0.21" },
]
lint = [
{ name = "prek", specifier = "~=0.3.0" },
@@ -6342,6 +6268,34 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/ab/fb/5f5e7b40a2f4efd873fe173624795ca47eaa22e29051270c981361b45209/zope_interface-8.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:05a0e42d6d830f547e114de2e7cd15750dc6c0c78f8138e6c5035e51ddfff37c", size = 264390, upload-time = "2026-01-09T08:05:42.936Z" },
]
+[[package]]
+name = "zensical"
+version = "0.0.21"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "click", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
+ { name = "deepmerge", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
+ { name = "markdown", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
+ { name = "pygments", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
+ { name = "pymdown-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
+ { name = "pyyaml", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
+ { name = "tomli", marker = "(python_full_version < '3.11' and sys_platform == 'darwin') or (python_full_version < '3.11' and sys_platform == 'linux')" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/8a/50/2655b5f72d0c72f4366be580f5e2354ff05280d047ea986fe89570e44589/zensical-0.0.21.tar.gz", hash = "sha256:c13563836fa63a3cabeffd83fe3a770ca740cfa5ae7b85df85d89837e31b3b4a", size = 3819731, upload-time = "2026-02-04T17:47:59.396Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/1d/98/90710d232cb35b633815fa7b493da542391b89283b6103a5bb4ae9fc0dd9/zensical-0.0.21-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:67404cc70c330246dfb7269bcdb60a25be0bb60a212a09c9c50229a1341b1f84", size = 12237120, upload-time = "2026-02-04T17:47:28.615Z" },
+ { url = "https://files.pythonhosted.org/packages/97/fb/4280b3781157e8f051711732192f949bf29beeafd0df3e33c1c8bf9b7a1a/zensical-0.0.21-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:d4fd253ccfbf5af56434124f13bac01344e456c020148369b18d8836b6537c3c", size = 12118047, upload-time = "2026-02-04T17:47:31.369Z" },
+ { url = "https://files.pythonhosted.org/packages/74/b3/b7f85ae9cf920cf9f17bf157ae6c274919477148feb7716bf735636caa0e/zensical-0.0.21-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:440e40cdc30a29bf7466bcd6f43ed7bd1c54ea3f1a0fefca65619358b481a5bc", size = 12473440, upload-time = "2026-02-04T17:47:33.577Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/ac/1dc6e98f79ed19b9f103c88a0bd271f9140565d7d26b64bc1542b3ef6d91/zensical-0.0.21-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:368e832fc8068e75dc45cab59379db4cefcd81eb116f48d058db8fb7b7aa8d14", size = 12412588, upload-time = "2026-02-04T17:47:36.491Z" },
+ { url = "https://files.pythonhosted.org/packages/bd/76/16a580f6dd32b387caa4a41615451e7dddd1917a2ff2e5b08744f41b4e11/zensical-0.0.21-cp310-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4ab962d47f9dd73510eed168469326c7a452554dfbfdb9cdf85efc7140244df", size = 12749438, upload-time = "2026-02-04T17:47:38.969Z" },
+ { url = "https://files.pythonhosted.org/packages/95/30/4baaa1c910eee61db5f49d0d45f2e550a0027218c618f3dd7f8da966a019/zensical-0.0.21-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b846d53dfce007f056ff31848f87f3f2a388228e24d4851c0cafdce0fa204c9b", size = 12514504, upload-time = "2026-02-04T17:47:41.31Z" },
+ { url = "https://files.pythonhosted.org/packages/76/77/931fccae5580b94409a0448a26106f922dcfa7822e7b93cacd2876dd63a8/zensical-0.0.21-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:daac1075552d230d52d621d2e4754ba24d5afcaa201a7a991f1a8d57e320c9de", size = 12647832, upload-time = "2026-02-04T17:47:44.073Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/82/3cf75de64340829d55c87c36704f4d1d8c952bd2cdc8a7bc48cbfb8ab333/zensical-0.0.21-cp310-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:7b380f545adb6d40896f9bd698eb0e1540ed4258d35b83f55f91658d0fdae312", size = 12678537, upload-time = "2026-02-04T17:47:46.899Z" },
+ { url = "https://files.pythonhosted.org/packages/77/91/6f4938dceeaa241f78bbfaf58a94acef10ba18be3468795173e3087abeb6/zensical-0.0.21-cp310-abi3-musllinux_1_2_i686.whl", hash = "sha256:5c2227fdab64616bea94b40b8340bafe00e2e23631cc58eeea1e7267167e6ac5", size = 12822164, upload-time = "2026-02-04T17:47:49.231Z" },
+ { url = "https://files.pythonhosted.org/packages/a2/4e/a9c9d25ef0766f767db7b4f09da68da9b3d8a28c3d68cfae01f8e3f9e297/zensical-0.0.21-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2e0f5154d236ed0f98662ee68785b67e8cd2138ea9d5e26070649e93c22eeee0", size = 12785632, upload-time = "2026-02-04T17:47:52.613Z" },
+]
+
+
[[package]]
name = "zstandard"
version = "0.25.0"
diff --git a/zensical.toml b/zensical.toml
new file mode 100644
index 000000000..4dbd2bf2e
--- /dev/null
+++ b/zensical.toml
@@ -0,0 +1,128 @@
+[project]
+
+site_name = "Paperless-ngx"
+site_description = "Documentation for the Paperless-ngx document management system software."
+site_author = "the Paperless-ngx team"
+
+site_url = "https://docs.paperless-ngx.com/"
+
+copyright = """
+Copyright © 2016 - 2026 Daniel Quinn, Jonas Winkler, and the Paperless-ngx team
+"""
+
+repo_url = "https://github.com/paperless-ngx/paperless-ngx"
+repo_name = "paperless-ngx/paperless-ngx"
+
+nav = [
+ "index.md",
+ "setup.md",
+ "usage.md",
+ "configuration.md",
+ "administration.md",
+ "advanced_usage.md",
+ "api.md",
+ "development.md",
+ "faq.md",
+ "troubleshooting.md",
+ "changelog.md",
+]
+
+edit_uri = "blob/main/docs/"
+
+extra_css = ["assets/extra.css"]
+
+[project.theme]
+
+logo = "assets/logo.svg"
+favicon = "assets/favicon.png"
+
+language = "en"
+
+features = [
+ "announce.dismiss",
+ "content.code.annotate",
+ "content.code.copy",
+ "content.code.select",
+ "content.footnote.tooltips",
+ "navigation.footer",
+ "navigation.instant",
+ "navigation.instant.prefetch",
+ "navigation.path",
+ "navigation.sections",
+ "navigation.tabs",
+ "navigation.top",
+ "navigation.tracking",
+ "search.highlight",
+ "toc.integrate",
+]
+
+# Palette toggle for automatic mode
+[[project.theme.palette]]
+media = "(prefers-color-scheme)"
+primary = "green"
+accent = "green"
+toggle.icon = "lucide/sun-moon"
+toggle.name = "Switch to light mode"
+
+# Palette toggle for light mode
+[[project.theme.palette]]
+media = "(prefers-color-scheme: light)"
+scheme = "default"
+primary = "green"
+accent = "green"
+toggle.icon = "lucide/sun"
+toggle.name = "Switch to dark mode"
+
+# Palette toggle for dark mode
+[[project.theme.palette]]
+media = "(prefers-color-scheme: dark)"
+scheme = "slate"
+primary = "green"
+accent = "green"
+toggle.icon = "lucide/moon"
+toggle.name = "Switch to system preference"
+
+[project.theme.font]
+text = "Roboto"
+code = "Roboto Mono"
+
+# Extras
+[[project.extra.social]]
+icon = "fontawesome/brands/github"
+link = "https://github.com/paperless-ngx/paperless-ngx"
+
+[[project.extra.social]]
+icon = "fontawesome/brands/docker"
+link = "https://hub.docker.com/r/paperlessngx/paperless-ngx"
+
+[[project.extra.social]]
+icon = "material/chat"
+link = "https://matrix.to/#/#paperless:matrix.org"
+
+# Extensions
+[project.markdown_extensions.attr_list]
+[project.markdown_extensions.md_in_html]
+[project.markdown_extensions.pymdownx.blocks.caption]
+[project.markdown_extensions.def_list]
+
+[project.markdown_extensions.pymdownx.highlight]
+anchor_linenums = true
+
+[project.markdown_extensions.pymdownx.inlinehilite]
+
+[project.markdown_extensions.pymdownx.tilde]
+
+[project.markdown_extensions.pymdownx.snippets]
+
+[project.markdown_extensions.admonition]
+
+[project.markdown_extensions.pymdownx.details]
+
+[project.markdown_extensions.pymdownx.superfences]
+custom_fences = [
+ { name = "mermaid", class = "mermaid", format = "pymdownx.superfences.fence_code_format" }
+]
+
+[project.markdown_extensions.pymdownx.emoji]
+emoji_index = "zensical.extensions.emoji.twemoji"
+emoji_generator = "zensical.extensions.emoji.to_svg"