diff --git a/.gitignore b/.gitignore
index eb5d27557d..b7e84d344e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,6 @@
-# MkDocs
+# Zensical
_build
+docs/_build.*.toml
comment.md
# IDEs and oather build artefacts
diff --git a/README.md b/README.md
index 8e25b1ad18..ebcfb2009c 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
This is the homepage for the [BeeWare project](http://beeware.org).
-It is a [MkDocs](https://mkdocs.org)-based site. The site is hosted on GitHub Pages, with PR builds being provided by ReadTheDocs.
+It is a [Zensical](https://zensical.org)-based site. The site is hosted on GitHub Pages, with PR builds being provided by ReadTheDocs.
## Getting started
diff --git a/docs-redirect/.readthedocs.yaml b/docs-redirect/.readthedocs.yaml
index 0b5d84d349..515887c709 100644
--- a/docs-redirect/.readthedocs.yaml
+++ b/docs-redirect/.readthedocs.yaml
@@ -1,13 +1,15 @@
- version: 2
+version: 2
- build:
- os: "ubuntu-24.04"
- tools:
- python: "3.12"
- jobs:
- pre_install:
- - python -m pip install --upgrade pip
- - python -m pip install --group redirects
-
- mkdocs:
- configuration: docs-redirect/mkdocs.yml
+build:
+ os: "ubuntu-24.04"
+ tools:
+ python: "3.13"
+ jobs:
+ pre_install:
+ - python -m pip install --upgrade pip
+ - python -m pip install --group docs-redirect
+ build:
+ html:
+ - python -m zensical build --clean --strict --config-file docs-redirect/zensical.toml
+ - mkdir -p $READTHEDOCS_OUTPUT
+ - cp -r docs-redirect/_build/html $READTHEDOCS_OUTPUT/html
diff --git a/docs-redirect/mkdocs.yml b/docs-redirect/mkdocs.yml
deleted file mode 100644
index 11e37a6ba0..0000000000
--- a/docs-redirect/mkdocs.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-site_name: BeeWare
-site_url: https://docs.beeware.org/
-docs_dir: en
-
-plugins:
- redirects:
- redirect_maps:
- "index.md": "https://beeware.org/docs"
-
-theme:
- name: mkdocs
- locale: en
- custom_dir: overrides/
- static_templates:
- - 404.html
diff --git a/docs-redirect/zensical.toml b/docs-redirect/zensical.toml
new file mode 100644
index 0000000000..67ac948108
--- /dev/null
+++ b/docs-redirect/zensical.toml
@@ -0,0 +1,18 @@
+[project]
+site_name = "BeeWare"
+site_url = "https://docs.beeware.org/"
+docs_dir = "en"
+site_dir = "_build/html"
+# README.md only exists so that the `en` directory exists. Excluding it leaves
+# the index page free for the redirect.
+exclude_docs = """
+README.md
+"""
+
+[project.theme]
+language = "en"
+# Provides the 404 page, which redirects any other URL on the site.
+custom_dir = "overrides"
+
+[project.plugins.redirects.redirect_maps]
+"index.md" = "https://beeware.org/docs"
diff --git a/docs/config.yml b/docs/config.yml
deleted file mode 100644
index afe7750e97..0000000000
--- a/docs/config.yml
+++ /dev/null
@@ -1,326 +0,0 @@
-# yaml-language-server: $schema=https://squidfunk.github.io/mkdocs-material/schema.json
-copyright: © Russell Keith-Magee
-
-nav:
- - About:
- - about/index.md
- - What is BeeWare?: about/overview.md
- - The Bee Team: about/team.md
- - History and Philosophy: about/history.md
- - Success stories: about/success.md
- - Contact: about/contact.md
- - Branding guidelines: about/branding.md
- - Documentation:
- - docs/index.md
- - Community:
- - community/index.md
- - BeeWare Community Code of Conduct: community/code-of-conduct.md
- - Governance: community/governance.md
- - Available for Hire: community/for-hire.md
- - Contributing:
- - contributing/index.md
- - First-time contributors: contributing/first-time-contributors.md
- - Contribution guide:
- - contributing/guide/index.md
- - Fix an issue: contributing/guide/what/fix-issue.md
- - Implement a new feature: contributing/guide/what/implement-feature.md
- - Write documentation: contributing/guide/what/write-docs.md
- - Triage an issue: contributing/guide/what/triage.md
- - Review a pull request: contributing/guide/what/review-pr.md
- - Propose a new feature: contributing/guide/what/propose-feature.md
- - Translate content: contributing/guide/what/translate.md
- - Use the tools: contributing/guide/what/use-tools.md
- - Setting up a development environment: contributing/guide/how/dev-environment.md
- - Reproducing an issue: contributing/guide/how/reproduce-issue.md
- - Working from a branch: contributing/guide/how/branches.md
- - Avoiding scope creep: contributing/guide/how/scope-creep.md
- - Writing, running, and testing code: contributing/guide/how/write-code.md
- - Building documentation: contributing/guide/how/build-docs.md
- - Writing documentation: contributing/guide/how/write-docs.md
- - Adding a change note: contributing/guide/how/change-note.md
- - Submitting a pull request: contributing/guide/how/submit-pr.md
- - Providing a review: contributing/guide/how/review-pr.md
- - Submitting a new issue: contributing/guide/how/new-issue.md
- - Proposing a new feature: contributing/guide/how/propose-feature.md
- - Translating content: contributing/guide/how/translate.md
- - Pull request review process: contributing/guide/next/pr-review.md
- - Release process: contributing/guide/next/release.md
- - AI Policy: contributing/guide/policies/ai-policy.md
- - Code style guide: contributing/guide/style/code-style-guide.md
- - Documentation style guide: contributing/guide/style/docs-style-guide.md
- - Sprint guide: contributing/sprint-guide.md
- - Challenge coins: contributing/challenge-coins.md
- - News:
- - news/index.md
- - Sponsor:
- - membership/index.md
-
-not_in_nav: |
- /index.md
- /titles.md
- /project/README.md
-
-exclude_docs:
- | # This is the only way to keep the build from parsing the team bio files.
- !.*
- /about/team/
-
-validation:
- omitted_files: warn
- absolute_links: relative_to_docs
- anchors: warn
- unrecognized_links: warn
-
-extra:
- project_name: beeware
- formal_name: BeeWare
- hide_dev_links: true
- website: true
- translated: true
- min_python_version: "3.10" # The oldest supported Python version
- min_python_version_tag: "310" # The tag version of the minimum python version
- recent_python_version: "3.13" # The newest Python version known to work on all platforms
- docs_python_version: "3.13" # The version of Python required to build the documentation
- contribution_guide_root: contributing/guide/
- social:
- - icon: fontawesome/brands/github
- link: https://github.com/beeware
- name: BeeWare on GitHub
- - icon: fontawesome/brands/mastodon
- link: https://fosstodon.org/@beeware
- name: BeeWare on Mastodon
- - icon: fontawesome/brands/discord
- link: https://beeware.org/bee/chat/
- name: BeeWare on Discord
- - icon: fontawesome/solid/square-rss
- name: BeeWare blog RSS feed
- link: https://beeware.org/news/buzz/atom.xml
- generator: false
- alternate:
- - name: English
- link: /en/
- lang: en
- - name: العَرَبِيَّة
- link: /ar/
- lang: ar
- - name: Čeština
- link: /cs/
- lang: cs
- - name: Dansk
- link: /da/
- lang: da
- - name: Deutsch
- link: /de/
- lang: de
- - name: Español
- link: /es/
- lang: es
- - name: فارسی
- link: /fa/
- lang: fa
- - name: Français
- link: /fr/
- lang: fr
- - name: Italiano
- link: /it/
- lang: it
- - name: 日本語
- link: /ja/
- lang: ja
- - name: 한국어
- link: /ko/
- lang: ko
- - name: Polski
- link: /pl/
- lang: pl
- - name: Português
- link: /pt/
- lang: pt
- - name: Русский
- link: /ru/
- lang: ru
- - name: தமிழ்
- link: /ta/
- lang: ta
- - name: Türkçe
- link: /tr/
- lang: tr
- - name: Yкраїнська
- link: /uk/
- lang: uk
- - name: Tiếng Việt
- link: /vi/
- lang: vi
- - name: 中文(简体)
- link: /zh_CN/
- lang: zh-Hant
- - name: 中文(繁體)
- link: /zh_TW/
- lang: zh-TW
-
-extra_css:
- - stylesheets/beeware.css
-
-theme:
- name: material
- language: en
- logo: assets/images/brutus-256.png
- favicon: assets/images/brutus-256.png
- features:
- - content.tabs.link
- - toc.follow
- - navigation.tabs
- - navigation.tabs.sticky
- - navigation.indexes
- - navigation.sections
- - navigation.path
- - navigation.expand
- - search.suggest
- - search.highlight
- - search.share
- custom_dir: overrides
- 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
-
-markdown_extensions:
- # PyMdown Extensions
- pymdownx.highlight: {}
- pymdownx.superfences: {}
- pymdownx.blocks.caption: {}
- pymdownx.blocks.admonition:
- types:
- - note
- - abstract
- - info
- - tip
- - success
- - question
- - warning
- - failure
- - danger
- - bug
- - example
- - quote
- pymdownx.blocks.details:
- types:
- - { name: details-note, class: note }
- - { name: details-abstract, class: abstract }
- - { name: details-info, class: info }
- - { name: details-tip, class: tip }
- - { name: details-success, class: success }
- - { name: details-question, class: question }
- - { name: details-warning, class: warning }
- - { name: details-failure, class: failure }
- - { name: details-danger, class: danger }
- - { name: details-bug, class: bug }
- - { name: details-example, class: example }
- - { name: details-quote, class: quote }
- pymdownx.blocks.tab:
- alternate_style: true
- pymdownx.snippets:
- base_path: ["docs"]
- url_download: true
- check_paths: true
- # Python Markdown extensions
- toc:
- permalink: true
- title: On this page
- attr_list: {}
- md_in_html: {}
- smarty:
- smart_quotes: false
-
-plugins:
- search: {}
- blog:
- blog_dir: news
- post_url_date_format: yyyy
- post_url_format: "{categories}/{date}/{slug}"
- post_url_max_categories: 1
- categories_url_format: "{slug}"
- categories_allowed:
- - Buzz
- - Events
- - Resources
- autorefs:
- resolve_closest: true # autorefs warns of the Usage headings begin duplicates without this - we will have to assign unique ids to all of them otherwise
- macros:
- module_name: macros
- include_yaml:
- - team: en/news/.authors.yml
- meta: {}
- rss:
- feed_title: "BeeWare: The Buzz"
- feed_description: News and events for the BeeWare project.
- match_path: "news/posts/.*"
- use_git: false # Forces it to read the dates from the frontmatter.
- date_from_meta:
- as_creation: "date"
- datetime_format: "%Y-%m-%d"
- categories:
- - categories
- feeds_filenames:
- rss_created: news/buzz/atom.xml
- # image: images/brutus.png # Update to a Brutus URL
- abstract_chars_count: -1
- redirects:
- redirect_maps:
- # Toga project references
- "toga.md": "https://toga.beeware.org/"
- "project/toga.md": "https://toga.beeware.org/"
- "project/projects/libraries/toga.md": "https://toga.beeware.org/"
- # Briefcase project references
- "briefcase.md": "https://briefcase.beeware.org/"
- "project/briefcase.md": "https://briefcase.beeware.org/"
- "project/projects/tools/briefcase.md": "https://briefcase.beeware.org/"
- # Rubicon-ObjC project references
- "rubicon.md": "https://rubicon-objc.beeware.org/"
- "project/utilities/rubicon.md": "https://rubicon-objc.beeware.org/"
- "project/projects/bridges/rubicon.md": "https://rubicon-objc.beeware.org/"
- # Podium project references
- "project/applications/podium.md": "https://github.com/beeware/podium"
- "project/projects/applications/podium.md": "https://github.com/beeware/podium"
- # shortlinks
- "bee/briefcase-bootstraps.md": "https://briefcase.beeware.org/en/latest/reference/commands/new.html#third-party-bootstraps"
- "bee/chat.md": "https://discord.gg/AjYYm8cyQM"
- "bee/coc.md": "community/code-of-conduct.md"
- "bee/join.md": "membership/index.md"
- "bee/podium.md": "https://github.com/beeware/podium"
- "bee/ready.md": "https://github.com/orgs/beeware/projects/1/views/7"
- "bee/review.md": "https://github.com/search?o=desc&q=org%3Abeeware+is%3Apr+is%3Aopen+draft%3Afalse+-author%3A%40me+archived%3Afalse&s=created&type=pullrequests"
- "bee/review-guide.md": "https://beeware.org/contributing/guide/what/review-pr/"
- "bee/signup.md": "about/contact.md"
- "bee/sprint.md": "contributing/sprint-guide.md"
- "bee/sprints.md": "contributing/sprint-guide.md"
- # Short shortlinks
- "b/ready.md": "https://github.com/orgs/beeware/projects/1/views/7"
- "b/review.md": "https://github.com/search?o=desc&q=org%3Abeeware+is%3Apr+is%3Aopen+draft%3Afalse+-author%3A%40me+archived%3Afalse&s=created&type=pullrequests"
- "b/review-guide.md": "https://beeware.org/contributing/guide/what/review-pr/"
- "b/sprints.md": "contributing/sprint-guide.md"
- "b/sprint.md": "contributing/sprint-guide.md"
- # Historical links of significance
- "community/behavior/code-of-conduct.md": "community/code-of-conduct.md"
- "community/behavior.md": "community/code-of-conduct.md"
- "community/members.md": "membership/index.md"
- "contributing/membership.md": "membership/index.md"
- # Tutorial shortlinks
- "t/linux-deps.md": "https://gist.github.com/freakboy3742/2e3a524bf6f1cd4486bb9e7fa2a2d3fb"
- "t/preparation.md": "https://gist.github.com/freakboy3742/8ad8a4a74f6933a71035c1795d944610"
diff --git a/docs/en/about/team.md b/docs/en/about/team.md
index 4fca70a412..b34872b1cf 100644
--- a/docs/en/about/team.md
+++ b/docs/en/about/team.md
@@ -4,8 +4,8 @@ So who are the people behind BeeWare? Well, there's a huge group of contributors
## Current team members
-{{ generate_team_members(team, page, current=True) }}
+{{ generate_team_members(team, current=True) }}
## Emeritus team members
-{{ generate_team_members(team, page, current=False) }}
+{{ generate_team_members(team, current=False) }}
diff --git a/docs/en/index.md b/docs/en/index.md
index bc1905c8f7..9fada20441 100644
--- a/docs/en/index.md
+++ b/docs/en/index.md
@@ -118,11 +118,11 @@ BeeWare is supported by users like you! Every little bit helps: [click here to c
### Latest news
-{{ latest_news(files) }}
+{{ latest_news() }}
### Upcoming events
-{% set events = upcoming_events(files) %}
+{% set events = upcoming_events() %}
{% if events %}
{{ events }}
{% else %}
diff --git a/docs/en/news/.authors.yml b/docs/en/news/.authors.yml
index 6899d8a49d..3f0f3e6ca2 100644
--- a/docs/en/news/.authors.yml
+++ b/docs/en/news/.authors.yml
@@ -1,245 +1,146 @@
authors:
freakboy3742:
name: Russell Keith-Magee
- short_name: Russell
- pronoun: he
description: Founding Apiarist
avatar: about/images/freakboy3742.png
url: about/team/#freakboy3742
- join_date: 2013-09-05
- mastodon: "@freakboy3742@cloudisland.nz"
- email: russell@beeware.org
kattni:
name: Kattni
- short_name: Kattni
- pronoun: she
description: Apiarist
avatar: about/images/kattni.png
url: about/team/#kattni
- join_date: 2025-10-05
- mastodon: "@kattni@kattstodon.com"
- email: kattni@beeware.org
mhsmith:
name: Malcolm Smith
- short_name: Malcolm
- pronoun: he
description: Apiarist
avatar: about/images/mhsmith.png
url: about/team/#mhsmith
- join_date: 2022-08-31
- email: smith@chaquo.com
glasnt:
name: Katie McLaughlin
- short_name: Katie
- pronoun: they
description: Senior Apiarist
avatar: about/images/glasnt.png
url: about/team/#glasnt
- join_date: 2016-04-02
- mastodon: "@glasnt@cloudisland.nz"
- email: katie@beeware.org
phildini:
name: Philip James
- short_name: Philip
- pronoun: he
description: Senior Apiarist
avatar: about/images/phildini.png
url: about/team/#phildini
- join_date: 2016-06-03
- mastodon: "@phildini@wandering.shop"
- email: philip@beeware.org
hawkowl:
name: Amber Brown
- short_name: Amber
- pronoun: she
description: Team Member Emeritus
avatar: about/images/hawkowl.png
url: about/team/#hawkowl
- join_date: 2016-10-13
- emeritus_date: 2025-12-15
- email: hawkowl@atleastfornow.net
danyeaw:
name: Dan Yeaw
- short_name: Dan
- pronoun: he
description: Team Member Emeritus
avatar: about/images/danyeaw.png
url: about/team/#danyeaw
- join_date: 2018-02-28
- emeritus_date: 2021-05-01
- mastodon: "@danyeaw@fosstodon.org"
- email: dan@yeaw.me
rmartin16:
name: Russell Martin
- short_name: Russell M
- pronoun: he
description: Apiarist
avatar: about/images/rmartin16.png
url: about/team/#rmartin16
- join_date: 2022-08-31
- email: rmartin16@gmail.com
swenson:
name: Christopher Swenson
- short_name: Swenson
- pronoun: they
description: Team Member Emeritus
avatar: about/images/swenson.png
url: about/team/#swenson
- join_date: 2016-09-07
- emeritus_date: 2021-05-01
- mastodon: "@chris_swenson@tweets.icu"
- email: swenson@beeware.org
halfwhitt:
name: Charles Whittington
- short_name: Charles
- pronoun: they
description: Apiarist
avatar: about/images/halfwhitt.png
url: about/team/#halfwhitt
- join_date: 2024-03-24
- email: charleswhitt@gmail.com
corranwebster:
name: Corran Webster
- short_name: Corran
- pronoun: he
description: Apiarist
avatar: about/images/corranwebster.png
url: about/team/#corranwebster
- join_date: 2026-02-23
- email: cwebster@unital.dev
Oliver-Leigh:
name: Oliver Leigh
- short_name: Oliver
- pronoun: he
description: Apiarist
avatar: about/images/Oliver-Leigh.png
url: about/team/#Oliver-Leigh
- join_date: 2026-07-27
cflee:
name: Chiang Fong Lee
- short_name: Chiang Fong
- pronoun: he
description: Team Member Emeritus
avatar: about/images/cflee.png
url: about/team/#cflee
- join_date: 2017-03-11
- emeritus_date: 2020-06-01
- mastodon: "@cflee@hachyderm.io"
- email: myself@cflee.net
eliasdorneles:
name: Elias Dorneles
- short_name: Elias
- pronoun: he
description: Team Member Emeritus
avatar: about/images/elias.png
url: about/team/#eliasdorneles
- join_date: 2017-03-01
- emeritus_date: 2020-06-03
- email: eliasdorneles@gmail.com
obulat:
name: Olga Bulat
- short_name: Olga
- pronoun: she
description: Team Member Emeritus
avatar: about/images/obulat.png
url: about/team/#obulat
- email: obulat@gmail.com
- join_date: 2018-03-05
- emeritus_date: 2025-12-05
samschott:
name: Sam Schott
- short_name: Sam
- pronoun: he
description: Team Member Emeritus
avatar: about/images/samschott.png
url: about/team/#samschott
- email: sam.schott@outlook.com
- join_date: 2021-07-29
- emeritus_date: 2025-12-12
flowerncsu:
name: Charlotte Mays
- short_name: Charlotte
- pronoun: she
description: Team Member Emeritus
avatar: about/images/flowerncsu.png
url: about/team/#flowerncsu
- mastodon: "@charlotte@hachyderm.io"
- email: charlotte@charlottemays.me
- join_date: 2017-08-17
- emeritus_date: 2025-12-15
saroad2:
name: Sagi Shadur
- short_name: Sagi
- pronoun: he
description: Team Member Emeritus
avatar: about/images/saroad2.png
url: about/team/#saroad2
- email: saroad2@gmail.com
- join_date: 2020-05-31
- emeritus_date: 2025-12-15
BPYap:
name: Yap Boon Peng
- short_name: Boon Peng
description: 2018 Google Summer of Code Student
avatar: https://avatars.githubusercontent.com/u/32807097
url: https://github.com/BPYap
abonie:
name: Adam Boniecki
- short_name: Adam
description: 2017 Google Summer of Code Student
avatar: https://avatars.githubusercontent.com/u/20281641
url: https://github.com/abonie
Dayof:
name: Dayanne Fernandes
- short_name: Dayanne
description: 2017 Google Summer of Code Student
avatar: https://avatars.githubusercontent.com/u/8198348
url: https://github.com/Dayof
ocupe:
name: Jonas Schell
- short_name: Jonas
description: 2017 Google Summer of Code Student
avatar: https://avatars.githubusercontent.com/u/11357413
url: https://github.com/ocupe
kavi2du:
name: Kavidu Abeykoon Mudiyanselagedara
- short_name: Kavidu
description: Curtin Capstone Team
avatar: https://avatars.githubusercontent.com/u/132393780
url: https://github.com/kavi2du
Stringer90:
name: Callum Horton
- short_name: Callum
description: Curtin Capstone Team
avatar: https://avatars.githubusercontent.com/u/109891554
url: https://github.com/Stringer90
cadynn:
name: Caydn Lee
- short_name: Cadyn
description: Curtin Capstone Team
avatar: https://avatars.githubusercontent.com/u/104604345
url: https://github.com/caydnn
JMah007:
name: Jaeden Mah
- short_name: Jaeden
description: Curtin Capstone Team
avatar: https://avatars.githubusercontent.com/u/107184317
url: https://github.com/JMah007
mEp3ii2:
name: Mitchell Pontague
- short_name: Mitchell
description: Curtin Capstone Team
avatar: https://avatars.githubusercontent.com/u/74845700
url: https://github.com/mEp3ii2
vt37:
name: Veronica Taniputra
- short_name: Veronica
description: Curtin Capstone Team
avatar: https://avatars.githubusercontent.com/u/110211722
url: https://github.com/vt37
patiences:
name: Patience Shyu
- short_name: Patience
description: 2018 Google Summer of Code Student
avatar: https://avatars.githubusercontent.com/u/14033272
url: https://github.com/patiences
diff --git a/docs/en/news/.team.yml b/docs/en/news/.team.yml
new file mode 100644
index 0000000000..ce79051232
--- /dev/null
+++ b/docs/en/news/.team.yml
@@ -0,0 +1,134 @@
+# Team details for blog authors, keyed by GitHub ID.
+#
+# The blog (in `.authors.yml`) only accepts `name`, `description`, `avatar`,
+# and `url` for each author. Any other details about an author, used to
+# generate the team page and event posts, live here. `docs/macros.py`
+# merges the two files.
+freakboy3742:
+ short_name: Russell
+ pronoun: he
+ join_date: 2013-09-05
+ mastodon: "@freakboy3742@cloudisland.nz"
+ email: russell@beeware.org
+kattni:
+ short_name: Kattni
+ pronoun: she
+ join_date: 2025-10-05
+ mastodon: "@kattni@kattstodon.com"
+ email: kattni@beeware.org
+mhsmith:
+ short_name: Malcolm
+ pronoun: he
+ join_date: 2022-08-31
+ email: smith@chaquo.com
+glasnt:
+ short_name: Katie
+ pronoun: they
+ join_date: 2016-04-02
+ mastodon: "@glasnt@cloudisland.nz"
+ email: katie@beeware.org
+phildini:
+ short_name: Philip
+ pronoun: he
+ join_date: 2016-06-03
+ mastodon: "@phildini@wandering.shop"
+ email: philip@beeware.org
+hawkowl:
+ short_name: Amber
+ pronoun: she
+ join_date: 2016-10-13
+ emeritus_date: 2025-12-15
+ email: hawkowl@atleastfornow.net
+danyeaw:
+ short_name: Dan
+ pronoun: he
+ join_date: 2018-02-28
+ emeritus_date: 2021-05-01
+ mastodon: "@danyeaw@fosstodon.org"
+ email: dan@yeaw.me
+rmartin16:
+ short_name: Russell M
+ pronoun: he
+ join_date: 2022-08-31
+ email: rmartin16@gmail.com
+swenson:
+ short_name: Swenson
+ pronoun: they
+ join_date: 2016-09-07
+ emeritus_date: 2021-05-01
+ mastodon: "@chris_swenson@tweets.icu"
+ email: swenson@beeware.org
+halfwhitt:
+ short_name: Charles
+ pronoun: they
+ join_date: 2024-03-24
+ email: charleswhitt@gmail.com
+corranwebster:
+ short_name: Corran
+ pronoun: he
+ join_date: 2026-02-23
+ email: cwebster@unital.dev
+Oliver-Leigh:
+ short_name: Oliver
+ pronoun: he
+ join_date: 2026-07-27
+cflee:
+ short_name: Chiang Fong
+ pronoun: he
+ join_date: 2017-03-11
+ emeritus_date: 2020-06-01
+ mastodon: "@cflee@hachyderm.io"
+ email: myself@cflee.net
+eliasdorneles:
+ short_name: Elias
+ pronoun: he
+ join_date: 2017-03-01
+ emeritus_date: 2020-06-03
+ email: eliasdorneles@gmail.com
+obulat:
+ short_name: Olga
+ pronoun: she
+ email: obulat@gmail.com
+ join_date: 2018-03-05
+ emeritus_date: 2025-12-05
+samschott:
+ short_name: Sam
+ pronoun: he
+ email: sam.schott@outlook.com
+ join_date: 2021-07-29
+ emeritus_date: 2025-12-12
+flowerncsu:
+ short_name: Charlotte
+ pronoun: she
+ mastodon: "@charlotte@hachyderm.io"
+ email: charlotte@charlottemays.me
+ join_date: 2017-08-17
+ emeritus_date: 2025-12-15
+saroad2:
+ short_name: Sagi
+ pronoun: he
+ email: saroad2@gmail.com
+ join_date: 2020-05-31
+ emeritus_date: 2025-12-15
+BPYap:
+ short_name: Boon Peng
+abonie:
+ short_name: Adam
+Dayof:
+ short_name: Dayanne
+ocupe:
+ short_name: Jonas
+kavi2du:
+ short_name: Kavidu
+Stringer90:
+ short_name: Callum
+cadynn:
+ short_name: Cadyn
+JMah007:
+ short_name: Jaeden
+mEp3ii2:
+ short_name: Mitchell
+vt37:
+ short_name: Veronica
+patiences:
+ short_name: Patience
diff --git a/docs/en/news/posts/2020/buzz/release-the-android-bees.md b/docs/en/news/posts/2020/buzz/release-the-android-bees.md
index a8620c8ce1..646fe9d99a 100644
--- a/docs/en/news/posts/2020/buzz/release-the-android-bees.md
+++ b/docs/en/news/posts/2020/buzz/release-the-android-bees.md
@@ -21,4 +21,4 @@ There's still plenty of work to be done, though. There are still a lot of widget
All of those are significant projects in themselves, and will require effort comparable to that required to add Android as a supported platform. And so, we're looking for the financial support to make that happen. We're applying for new grants as opportunities arise, but the most helpful source of funds are the ongoing funds that come from memberships. Ongoing funding means we can focus on improving BeeWare, rather than chasing grants. It means being able to hire *permanent* staff, rather than offering short term contracts. And it means being able to make long term plans and promises to the community.
-If this project proves anything, it's that money makes things happen. If you're excited by the prospects of Python on mobile platforms, please consider [joining the BeeWare Project as a financial member][we-need-your-help]. Or, if you've got experience with commercialization of Open Source projects, or any other ideas for how we could [please get in touch](mailto:contact@beeware.org).
+If this project proves anything, it's that money makes things happen. If you're excited by the prospects of Python on mobile platforms, please consider [joining the BeeWare Project as a financial member](/membership/index.md#we-need-your-help). Or, if you've got experience with commercialization of Open Source projects, or any other ideas for how we could [please get in touch](mailto:contact@beeware.org).
diff --git a/docs/en/news/posts/2024/events/pycon-us-2023.md b/docs/en/news/posts/2024/events/pycon-us-2023.md
deleted file mode 100644
index 9618f157a1..0000000000
--- a/docs/en/news/posts/2024/events/pycon-us-2023.md
+++ /dev/null
@@ -1,77 +0,0 @@
----
-title: We'll be at PyCon US 2023!
-date: 2023-04-21
-authors:
-- freakboy3742
-- mhsmith
-categories:
-- Events
-event:
- name: PyCon US 2023
- url: https://us.pycon.org/2024/
- date: 2023-04-21
- end_date: 2023-04-24
- description: ''
-involvement:
-- type: talk
- team_members:
- - freakboy3742
- title: 'You *can* take it with you: Packaging your Python code with Briefcase'
- url: https://us.pycon.org/2024/
- date: 2023-04-21
- end_date: 2023-04-21
- description: |-
- Once you're written your amazing new application using Python, the next
- problem you'll face is how to get that application into the hands of
- users. If your users are familiar with `pip` and and `venv`, you can put pip
- install instructions into a README, and leave it at that. But what if
- your audience aren't Python programmers? What if your app needs to be
- used by people who don't write Python at all? How do you distribute your
- code so that others can use it?
-
- In this talk, you'll learn about Briefcase, a tool that can convert a
- Python project into platform-native apps on macOS, Windows, Linux - and
- can also target iOS, Android, and the web. You'll learn how to use
- Briefcase to start a new project, or convert an existing project for
- distribution. You'll learn about the features of Briefcase that can
- support you while you develop your application. Finally, you'l learn how
- to generate installers and standalone applications for multiple
- platforms from a single Python codebase.
-- type: booth
- team_members:
- - freakboy3742
- - mhsmith
- url: https://us.pycon.org/2024/
- date: 2023-04-21
- end_date: 2023-04-21
-- type: talk
- team_members:
- - mhsmith
- title: Python on Android
- url: https://us.pycon.org/2024/
- date: 2023-04-23
- end_date: 2023-04-23
- description: |-
- By many measures, Android is the most widely-used operating system in
- the world. But Python development on the platform remains quite rare.
-
- Fortunately there are several active projects working to improve this.
- In this talk, you'll learn about:
-
- - Why Android support is important for the future of Python.
- - How Android compares to other platforms, and the unique challenges it
- presents.
- - What's needed to make mobile Python development practical, including
- build tools, GUI libraries, and binary package support.
- - The available options for running Python on Android, and how to choose
- which one is best for you.
-- type: sprint
- team_members:
- - freakboy3742
- - mhsmith
- url: https://us.pycon.org/2023
- date: 2023-04-24
- end_date: 2023-04-24
----
-
-{{ generate_event_post(authors, event, involvement, team) }}
diff --git a/docs/en/news/posts/2026/buzz/february-2026-status-update.md b/docs/en/news/posts/2026/buzz/february-2026-status-update.md
index 3d52202327..dbdf97bee8 100644
--- a/docs/en/news/posts/2026/buzz/february-2026-status-update.md
+++ b/docs/en/news/posts/2026/buzz/february-2026-status-update.md
@@ -13,8 +13,8 @@ February has seen a collection of improvements across the BeeWare ecosystem - in
## What we've done
-- We've launched a new version of our [website](https://beeware.org)! This primarily an infrastructure change - we've moved off Lektor, and onto a MkDocs-based site, matching the tooling that we're now using for the rest of BeeWare's documentation. This gives us much faster builds, better translation tooling, search... and dark mode! A huge shout out to [Kattni][kattni] for all her work getting this done.
-- We welcomed a new member of the BeeWare core team - [Corran Webster][corranwebster]. Over the last few months, Corran has taken Toga’s Qt backend from a bare stub to a widget-complete implementation. He’s also done some major internal design work around Toga's Table and Tree implementations, and added the long-requested ability to add bitmap images to a Canvas. That's a lot of work for a couple of months - we're excited to see what comes next!
+- We've launched a new version of our [website](https://beeware.org)! This primarily an infrastructure change - we've moved off Lektor, and onto a MkDocs-based site, matching the tooling that we're now using for the rest of BeeWare's documentation. This gives us much faster builds, better translation tooling, search... and dark mode! A huge shout out to [Kattni](/about/team.md#kattni) for all her work getting this done.
+- We welcomed a new member of the BeeWare core team - [Corran Webster](/about/team.md#corranwebster). Over the last few months, Corran has taken Toga’s Qt backend from a bare stub to a widget-complete implementation. He’s also done some major internal design work around Toga's Table and Tree implementations, and added the long-requested ability to add bitmap images to a Canvas. That's a lot of work for a couple of months - we're excited to see what comes next!
- We published new [support packages for iOS and macOS](https://github.com/beeware/Python-Apple-support/releases), backporting some recent changes in CPython to our patches for Python 3.10-3.12.
- We made significant progress on adding [FastAPI and PyScript backends for Positron](https://github.com/beeware/toga/pull/4156). The PyScript part of this backend has revealed some issues with the feature set of Android and iOS `WebView` widgets; we're working with the PyScript team to find a workaround for these problems.
- We [fixed several issues with the testbed application that is used to test Python on Android](https://github.com/python/cpython/pull/142912).
diff --git a/docs/en/stylesheets/beeware.css b/docs/en/stylesheets/beeware.css
index fed57efaec..e930db9cc8 100644
--- a/docs/en/stylesheets/beeware.css
+++ b/docs/en/stylesheets/beeware.css
@@ -397,6 +397,20 @@ h2#sidebar {
display: none;
}
+/* The emoji extension wraps each Font Awesome icon in a `twemoji` span, which
+ the theme sizes at 1.125em. Keep icons the size of the surrounding text. */
+.md-typeset .fa-icon .twemoji {
+ display: inline;
+ height: auto;
+ vertical-align: baseline;
+}
+
+.md-typeset .fa-icon .twemoji svg {
+ width: 1em;
+ height: 1em;
+ max-height: none;
+}
+
/* Documentation page CSS */
/* Workaround for not having H1 on page */
h1.documentation {
diff --git a/docs/macros.py b/docs/macros.py
index f73054978e..7c86a1f20a 100644
--- a/docs/macros.py
+++ b/docs/macros.py
@@ -1,22 +1,33 @@
import datetime
-from functools import cache
from pathlib import Path
from textwrap import dedent
-import material
import yaml
-# The Font Awesome icon set bundled with mkdocs-material
-# This avoids the need for the Font Awesome kit/CDN).
-FONTAWESOME_ICONS_DIR = (
- Path(material.__file__).parent / "templates" / ".icons" / "fontawesome"
-)
+def as_date(value):
+ """Return a date, whether YAML parsed the value as a date or a string."""
+ if isinstance(value, datetime.date):
+ return value
+ return datetime.date.fromisoformat(str(value))
-@cache
-def _fontawesome_svg(style, name):
- """Load (and cache) the raw SVG markup for a bundled Font Awesome icon."""
- return (FONTAWESOME_ICONS_DIR / style / f"{name}.svg").read_text()
+
+def merge_team_details(team, team_details):
+ """Merge the blog author details with the team details for each author.
+
+ The blog only accepts a limited set of fields for each author, so the
+ remaining team details are stored separately, keyed by the same GitHub ID.
+ """
+ return {
+ "authors": {
+ github_id: {**author_details, **team_details.get(github_id, {})}
+ for github_id, author_details in team["authors"].items()
+ }
+ }
+
+
+def get_metadata(contents):
+ return next(yaml.load_all(contents, Loader=yaml.SafeLoader))
def attendees(authors, team):
@@ -53,12 +64,25 @@ def talk_title_punctuation(talk_title):
def define_env(env):
+ # The docs directory being built; for translations, this is the directory
+ # containing the translated content.
+ docs_dir = Path(env.project_dir) / env.conf["docs_dir"]
+
+ def full_team(team):
+ """Merge the team details into the blog author details."""
+ team_details = yaml.load(
+ (docs_dir / "news/.team.yml").read_text(encoding="utf-8"),
+ Loader=yaml.SafeLoader,
+ )
+ return merge_team_details(team, team_details)
+
@env.macro
def fa(style, name):
- """Generates an inline Font Awesome icon, using the SVG bundled with
- mkdocs-material, rather than depending on the Font Awesome kit/CDN.
+ """Generates an inline Font Awesome icon, using the icon shortcodes
+ provided by the emoji extension, rather than depending on the Font
+ Awesome kit/CDN.
"""
- return f'{_fontawesome_svg(style, name)}'
+ return f':fontawesome-{style}-{name}:'
@env.macro
def generate_resource_post(resource):
@@ -115,13 +139,16 @@ def generate_resource_post(resource):
@env.macro
def generate_event_post(authors, event, involvement, team):
"""Generate an event post from event template."""
+ team = full_team(team)
content = []
- if event.date == event.end_date:
- event_timeframe = f"on {event.date.strftime('%B %d, %Y')}"
- elif event.date != event.end_date:
+ start_date = as_date(event["date"])
+ end_date = as_date(event["end_date"])
+ if start_date == end_date:
+ event_timeframe = f"on {start_date.strftime('%B %d, %Y')}"
+ else:
event_timeframe = (
- f"from {event.date.strftime('%B %d')} "
- f"- {event.end_date.strftime('%B %d, %Y')}"
+ f"from {start_date.strftime('%B %d')} "
+ f"- {end_date.strftime('%B %d, %Y')}"
)
highlight_authors = set()
@@ -131,14 +158,14 @@ def generate_event_post(authors, event, involvement, team):
highlight_authors.update(set(inv["team_members"]))
content.append(
dedent(f"""\
- {attendees(inv["team_members"], team)} will be organizing [{event.name}]({event.url}), which will happen {event_timeframe}!\n\n
+ {attendees(inv["team_members"], team)} will be organizing [{event["name"]}]({event["url"]}), which will happen {event_timeframe}!\n\n
""") # noqa: E501
)
elif inv["type"] == "keynote":
highlight_authors.update(set(inv["team_members"]))
content.append(
dedent(f"""
- {attendees(inv["team_members"], team)} will be keynoting {event.name}, giving a presentation entitled [{talk_title_punctuation(inv["title"])}]({inv["url"]})
+ {attendees(inv["team_members"], team)} will be keynoting {event["name"]}, giving a presentation entitled [{talk_title_punctuation(inv["title"])}]({inv["url"]})
\n\n
""") # noqa: E501
@@ -163,13 +190,13 @@ def generate_event_post(authors, event, involvement, team):
else:
content.append(
dedent(f"""\
- {attendees(authors, team)} will be attending [{event.name}]({event.url}) {event_timeframe}!
+ {attendees(authors, team)} will be attending [{event["name"]}]({event["url"]}) {event_timeframe}!
\n\n
""") # noqa: E501
)
- content.append(f"{event.description}\n\n")
+ content.append(f"{event['description']}\n\n")
_, first_pronoun, second_pronoun = pronouns(
team["authors"][authors[-1]]["pronoun"]
@@ -252,8 +279,11 @@ def generate_event_post(authors, event, involvement, team):
return "".join(content)
@env.macro
- def generate_team_members(team, page, current):
- """Generate the team page from the .authors.yml file metadata."""
+ def generate_team_members(team, current):
+ """Generate the team page from the .authors.yml and .team.yml file
+ metadata.
+ """
+ team = full_team(team)
team_member_content = []
for github_id, member_details in team["authors"].items():
@@ -298,9 +328,9 @@ def generate_team_members(team, page, current):
""" # noqa: E501
)
- member_bio = (
- Path(page.file.src_dir) / f"about/team/{github_id}.md"
- ).read_text()
+ member_bio = (docs_dir / f"about/team/{github_id}.md").read_text(
+ encoding="utf-8"
+ )
team_member = (
member_title
@@ -322,47 +352,51 @@ def generate_team_members(team, page, current):
return "".join(tmc[1] for tmc in sorted(team_member_content))
- def get_metadata(contents):
- return next(yaml.load_all(contents, Loader=yaml.SafeLoader))
+ def posts(*paths):
+ """Yield the docs-relative path and metadata of every post in the given
+ docs-relative directories.
+ """
+ for path in paths:
+ for post in sorted((docs_dir / path).glob("*.md")):
+ yield (
+ post.relative_to(docs_dir).as_posix(),
+ get_metadata(post.read_text(encoding="utf-8")),
+ )
@env.macro
- def upcoming_events(files):
+ def upcoming_events():
"""Generate upcoming events list for beeware.org homepage sidebar."""
this_year = datetime.datetime.now().year
next_year = this_year + 1
events = []
- for filename, file_data in files.src_uris.items():
- if filename.startswith(
- tuple(f"news/posts/{year}/events/" for year in [this_year, next_year])
- ):
- metadata = get_metadata(file_data.content_string)
-
- if metadata["event"]["date"] > datetime.date.today():
- if metadata["event"]["date"] == metadata["event"]["end_date"]:
- event_date = metadata["event"]["date"].strftime("%B %d, %Y")
- else:
- event_date = (
- f"{metadata['event']['date'].strftime('%B %d')}"
- f"-{metadata['event']['end_date'].strftime('%d, %Y')}"
- )
+ for src_path, metadata in posts(
+ *(f"news/posts/{year}/events" for year in [this_year, next_year])
+ ):
+ start_date = as_date(metadata["event"]["date"])
+ end_date = as_date(metadata["event"]["end_date"])
+
+ if start_date > datetime.date.today():
+ if start_date == end_date:
+ event_date = start_date.strftime("%B %d, %Y")
+ else:
+ event_date = (
+ f"{start_date.strftime('%B %d')}-{end_date.strftime('%d, %Y')}"
+ )
- events.append(
- (
- metadata["event"]["date"],
- (
- f"- [{metadata['event']['name']}"
- f": {event_date}]({file_data.src_path})"
- ),
- )
+ events.append(
+ (
+ start_date,
+ f"- [{metadata['event']['name']}: {event_date}]({src_path})",
)
+ )
if events:
return "\n".join(item[1] for item in sorted(events)[:5])
return None
@env.macro
- def latest_news(files):
+ def latest_news():
"""Generate "Latest news" latest blog post link for beeware.org homepage
sidebar.
"""
@@ -371,16 +405,12 @@ def latest_news(files):
latest_post = None
- for filename, file_data in files.src_uris.items():
- if filename.startswith(
- tuple(f"news/posts/{year}/buzz/" for year in [last_year, this_year])
- ):
- metadata = get_metadata(file_data.content_string)
-
- if latest_post is None or latest_post[0]["date"] < metadata["date"]:
- latest_post = (metadata, file_data)
+ for src_path, metadata in posts(
+ *(f"news/posts/{year}/buzz" for year in [last_year, this_year])
+ ):
+ post_date = as_date(metadata["date"])
+ if latest_post is None or latest_post[0] < post_date:
+ latest_post = (post_date, metadata["title"], src_path)
- return (
- f"{latest_post[0]['date'].strftime('%B %d')}"
- f": [{latest_post[0]['title']}]({latest_post[1].src_path})"
- )
+ post_date, title, src_path = latest_post
+ return f"{post_date.strftime('%B %d')}: [{title}]({src_path})"
diff --git a/docs/mkdocs.ar.yml b/docs/mkdocs.ar.yml
deleted file mode 100644
index e45f2be7f7..0000000000
--- a/docs/mkdocs.ar.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-INHERIT: config.yml
-site_name: BeeWare
-site_url: https://beeware.org/
-docs_dir: ar
-
-theme:
- language: ar
-
-extra:
- translation_type: machine
diff --git a/docs/mkdocs.cs.yml b/docs/mkdocs.cs.yml
deleted file mode 100644
index a76bc2bf11..0000000000
--- a/docs/mkdocs.cs.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-INHERIT: config.yml
-site_name: BeeWare
-site_url: https://beeware.org/
-docs_dir: cs
-
-theme:
- language: cs
-
-extra:
- translation_type: machine
diff --git a/docs/mkdocs.da.yml b/docs/mkdocs.da.yml
deleted file mode 100644
index c280df9f1b..0000000000
--- a/docs/mkdocs.da.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-INHERIT: config.yml
-site_name: BeeWare
-site_url: https://beeware.org/
-docs_dir: da
-
-theme:
- language: da
-
-extra:
- translation_type: machine
diff --git a/docs/mkdocs.de.yml b/docs/mkdocs.de.yml
deleted file mode 100644
index 56fb6bbaa0..0000000000
--- a/docs/mkdocs.de.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-INHERIT: config.yml
-site_name: BeeWare
-site_url: https://beeware.org/
-docs_dir: de
-
-theme:
- language: de
-
-extra:
- translation_type: machine
diff --git a/docs/mkdocs.en.yml b/docs/mkdocs.en.yml
deleted file mode 100644
index 82db60930d..0000000000
--- a/docs/mkdocs.en.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-INHERIT: config.yml
-site_name: BeeWare
-site_url: https://beeware.org/
-docs_dir: en
-
-extra:
- translation_type: original
diff --git a/docs/mkdocs.es.yml b/docs/mkdocs.es.yml
deleted file mode 100644
index 617b87b33c..0000000000
--- a/docs/mkdocs.es.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-INHERIT: config.yml
-site_name: BeeWare
-site_url: https://beeware.org/
-docs_dir: es
-
-theme:
- language: es
-
-extra:
- translation_type: machine
diff --git a/docs/mkdocs.fa.yml b/docs/mkdocs.fa.yml
deleted file mode 100644
index 46bd2c1d7c..0000000000
--- a/docs/mkdocs.fa.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-INHERIT: config.yml
-site_name: BeeWare
-site_url: https://beeware.org/
-docs_dir: fa
-
-theme:
- language: fa
-
-extra:
- translation_type: machine
diff --git a/docs/mkdocs.fr.yml b/docs/mkdocs.fr.yml
deleted file mode 100644
index c4de093c0d..0000000000
--- a/docs/mkdocs.fr.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-INHERIT: config.yml
-site_name: BeeWare
-site_url: https://beeware.org/
-docs_dir: fr
-
-theme:
- language: fr
-
-extra:
- translation_type: original
diff --git a/docs/mkdocs.it.yml b/docs/mkdocs.it.yml
deleted file mode 100644
index b3edca6f2e..0000000000
--- a/docs/mkdocs.it.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-INHERIT: config.yml
-site_name: BeeWare
-site_url: https://beeware.org/
-docs_dir: it
-
-theme:
- language: it
-
-extra:
- translation_type: machine
diff --git a/docs/mkdocs.ja.yml b/docs/mkdocs.ja.yml
deleted file mode 100644
index 3ba89e8f55..0000000000
--- a/docs/mkdocs.ja.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-INHERIT: config.yml
-site_name: BeeWare
-site_url: https://beeware.org/
-docs_dir: ja
-
-theme:
- language: ja
-
-extra:
- translation_type: machine
diff --git a/docs/mkdocs.ko.yml b/docs/mkdocs.ko.yml
deleted file mode 100644
index 42f1c46932..0000000000
--- a/docs/mkdocs.ko.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-INHERIT: config.yml
-site_name: BeeWare
-site_url: https://beeware.org/
-docs_dir: ko
-
-theme:
- language: ko
-
-extra:
- translation_type: machine
diff --git a/docs/mkdocs.pl.yml b/docs/mkdocs.pl.yml
deleted file mode 100644
index f17520e69f..0000000000
--- a/docs/mkdocs.pl.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-INHERIT: config.yml
-site_name: BeeWare
-site_url: https://beeware.org/
-docs_dir: pl
-
-theme:
- language: pl
-
-extra:
- translation_type: machine
diff --git a/docs/mkdocs.pt.yml b/docs/mkdocs.pt.yml
deleted file mode 100644
index b03ecf48bd..0000000000
--- a/docs/mkdocs.pt.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-INHERIT: config.yml
-site_name: BeeWare
-site_url: https://beeware.org/
-docs_dir: pt
-
-theme:
- language: pt
-
-extra:
- translation_type: machine
diff --git a/docs/mkdocs.ru.yml b/docs/mkdocs.ru.yml
deleted file mode 100644
index 88039346d3..0000000000
--- a/docs/mkdocs.ru.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-INHERIT: config.yml
-site_name: BeeWare
-site_url: https://beeware.org/
-docs_dir: ru
-
-theme:
- language: ru
-
-extra:
- translation_type: machine
diff --git a/docs/mkdocs.ta.yml b/docs/mkdocs.ta.yml
deleted file mode 100644
index 71d1f5e0b1..0000000000
--- a/docs/mkdocs.ta.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-INHERIT: config.yml
-site_name: BeeWare
-site_url: https://beeware.org/
-docs_dir: ta
-
-theme:
- language: ta
-
-extra:
- translation_type: machine
diff --git a/docs/mkdocs.tr.yml b/docs/mkdocs.tr.yml
deleted file mode 100644
index d2c3772c39..0000000000
--- a/docs/mkdocs.tr.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-INHERIT: config.yml
-site_name: BeeWare
-site_url: https://beeware.org/
-docs_dir: tr
-
-theme:
- language: tr
-
-extra:
- translation_type: machine
diff --git a/docs/mkdocs.uk.yml b/docs/mkdocs.uk.yml
deleted file mode 100644
index f6b404d267..0000000000
--- a/docs/mkdocs.uk.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-INHERIT: config.yml
-site_name: BeeWare
-site_url: https://beeware.org/
-docs_dir: uk
-
-theme:
- language: uk
-
-extra:
- translation_type: machine
diff --git a/docs/mkdocs.vi.yml b/docs/mkdocs.vi.yml
deleted file mode 100644
index af224510b4..0000000000
--- a/docs/mkdocs.vi.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-INHERIT: config.yml
-site_name: BeeWare
-site_url: https://beeware.org/
-docs_dir: vi
-
-theme:
- language: vi
-
-extra:
- translation_type: machine
diff --git a/docs/mkdocs.zh_CN.yml b/docs/mkdocs.zh_CN.yml
deleted file mode 100644
index 88ae0e5c90..0000000000
--- a/docs/mkdocs.zh_CN.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-INHERIT: config.yml
-site_name: BeeWare
-site_url: https://beeware.org/
-docs_dir: zh_CN
-
-theme:
- language: zh
-
-extra:
- translation_type: machine
diff --git a/docs/mkdocs.zh_TW.yml b/docs/mkdocs.zh_TW.yml
deleted file mode 100644
index 45035713e1..0000000000
--- a/docs/mkdocs.zh_TW.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-INHERIT: config.yml
-site_name: BeeWare
-site_url: https://beeware.org/
-docs_dir: zh_TW
-
-theme:
- language: zh-TW
-
-extra:
- translation_type: machine
diff --git a/docs/spelling_wordlist b/docs/spelling_wordlist
index a08b6b2503..51cbad4f7a 100644
--- a/docs/spelling_wordlist
+++ b/docs/spelling_wordlist
@@ -337,6 +337,7 @@ Xcode
Xcode's
Xero
xgboost
+Zensical
abonie
akaptur
diff --git a/docs/zensical.ar.toml b/docs/zensical.ar.toml
new file mode 100644
index 0000000000..f8bb98c2cd
--- /dev/null
+++ b/docs/zensical.ar.toml
@@ -0,0 +1,9 @@
+[project]
+site_name = "BeeWare"
+docs_dir = "ar"
+
+[project.theme]
+language = "ar"
+
+[project.extra]
+translation_type = "machine"
diff --git a/docs/zensical.cs.toml b/docs/zensical.cs.toml
new file mode 100644
index 0000000000..2b1668c428
--- /dev/null
+++ b/docs/zensical.cs.toml
@@ -0,0 +1,9 @@
+[project]
+site_name = "BeeWare"
+docs_dir = "cs"
+
+[project.theme]
+language = "cs"
+
+[project.extra]
+translation_type = "machine"
diff --git a/docs/zensical.da.toml b/docs/zensical.da.toml
new file mode 100644
index 0000000000..56c85c30cf
--- /dev/null
+++ b/docs/zensical.da.toml
@@ -0,0 +1,9 @@
+[project]
+site_name = "BeeWare"
+docs_dir = "da"
+
+[project.theme]
+language = "da"
+
+[project.extra]
+translation_type = "machine"
diff --git a/docs/zensical.de.toml b/docs/zensical.de.toml
new file mode 100644
index 0000000000..8679a08362
--- /dev/null
+++ b/docs/zensical.de.toml
@@ -0,0 +1,9 @@
+[project]
+site_name = "BeeWare"
+docs_dir = "de"
+
+[project.theme]
+language = "de"
+
+[project.extra]
+translation_type = "machine"
diff --git a/docs/zensical.en.toml b/docs/zensical.en.toml
new file mode 100644
index 0000000000..6d967459d1
--- /dev/null
+++ b/docs/zensical.en.toml
@@ -0,0 +1,6 @@
+[project]
+site_name = "BeeWare"
+docs_dir = "en"
+
+[project.extra]
+translation_type = "original"
diff --git a/docs/zensical.es.toml b/docs/zensical.es.toml
new file mode 100644
index 0000000000..353548439e
--- /dev/null
+++ b/docs/zensical.es.toml
@@ -0,0 +1,9 @@
+[project]
+site_name = "BeeWare"
+docs_dir = "es"
+
+[project.theme]
+language = "es"
+
+[project.extra]
+translation_type = "machine"
diff --git a/docs/zensical.fa.toml b/docs/zensical.fa.toml
new file mode 100644
index 0000000000..65b492b920
--- /dev/null
+++ b/docs/zensical.fa.toml
@@ -0,0 +1,9 @@
+[project]
+site_name = "BeeWare"
+docs_dir = "fa"
+
+[project.theme]
+language = "fa"
+
+[project.extra]
+translation_type = "machine"
diff --git a/docs/zensical.fr.toml b/docs/zensical.fr.toml
new file mode 100644
index 0000000000..cd21eb5bd9
--- /dev/null
+++ b/docs/zensical.fr.toml
@@ -0,0 +1,9 @@
+[project]
+site_name = "BeeWare"
+docs_dir = "fr"
+
+[project.theme]
+language = "fr"
+
+[project.extra]
+translation_type = "original"
diff --git a/docs/zensical.it.toml b/docs/zensical.it.toml
new file mode 100644
index 0000000000..ae3264b3ff
--- /dev/null
+++ b/docs/zensical.it.toml
@@ -0,0 +1,9 @@
+[project]
+site_name = "BeeWare"
+docs_dir = "it"
+
+[project.theme]
+language = "it"
+
+[project.extra]
+translation_type = "machine"
diff --git a/docs/zensical.ja.toml b/docs/zensical.ja.toml
new file mode 100644
index 0000000000..57c4b2e312
--- /dev/null
+++ b/docs/zensical.ja.toml
@@ -0,0 +1,9 @@
+[project]
+site_name = "BeeWare"
+docs_dir = "ja"
+
+[project.theme]
+language = "ja"
+
+[project.extra]
+translation_type = "machine"
diff --git a/docs/zensical.ko.toml b/docs/zensical.ko.toml
new file mode 100644
index 0000000000..9dca818e73
--- /dev/null
+++ b/docs/zensical.ko.toml
@@ -0,0 +1,9 @@
+[project]
+site_name = "BeeWare"
+docs_dir = "ko"
+
+[project.theme]
+language = "ko"
+
+[project.extra]
+translation_type = "machine"
diff --git a/docs/zensical.pl.toml b/docs/zensical.pl.toml
new file mode 100644
index 0000000000..f6aeebdc6c
--- /dev/null
+++ b/docs/zensical.pl.toml
@@ -0,0 +1,9 @@
+[project]
+site_name = "BeeWare"
+docs_dir = "pl"
+
+[project.theme]
+language = "pl"
+
+[project.extra]
+translation_type = "machine"
diff --git a/docs/zensical.pt.toml b/docs/zensical.pt.toml
new file mode 100644
index 0000000000..b658dda4bf
--- /dev/null
+++ b/docs/zensical.pt.toml
@@ -0,0 +1,9 @@
+[project]
+site_name = "BeeWare"
+docs_dir = "pt"
+
+[project.theme]
+language = "pt"
+
+[project.extra]
+translation_type = "machine"
diff --git a/docs/zensical.ru.toml b/docs/zensical.ru.toml
new file mode 100644
index 0000000000..4e9ecd0fb1
--- /dev/null
+++ b/docs/zensical.ru.toml
@@ -0,0 +1,9 @@
+[project]
+site_name = "BeeWare"
+docs_dir = "ru"
+
+[project.theme]
+language = "ru"
+
+[project.extra]
+translation_type = "machine"
diff --git a/docs/zensical.ta.toml b/docs/zensical.ta.toml
new file mode 100644
index 0000000000..3816d4b3cd
--- /dev/null
+++ b/docs/zensical.ta.toml
@@ -0,0 +1,9 @@
+[project]
+site_name = "BeeWare"
+docs_dir = "ta"
+
+[project.theme]
+language = "ta"
+
+[project.extra]
+translation_type = "machine"
diff --git a/docs/zensical.toml b/docs/zensical.toml
new file mode 100644
index 0000000000..2b02d30168
--- /dev/null
+++ b/docs/zensical.toml
@@ -0,0 +1,288 @@
+[project]
+copyright = "© Russell Keith-Magee"
+nav = [
+ { "About" = [
+ "about/index.md",
+ { "What is BeeWare?" = "about/overview.md" },
+ { "The Bee Team" = "about/team.md" },
+ { "History and Philosophy" = "about/history.md" },
+ { "Success stories" = "about/success.md" },
+ { "Contact" = "about/contact.md" },
+ { "Branding guidelines" = "about/branding.md" },
+ ] },
+ { "Documentation" = [
+ "docs/index.md",
+ ] },
+ { "Community" = [
+ "community/index.md",
+ { "BeeWare Community Code of Conduct" = "community/code-of-conduct.md" },
+ { "Governance" = "community/governance.md" },
+ { "Available for Hire" = "community/for-hire.md" },
+ ] },
+ { "Contributing" = [
+ "contributing/index.md",
+ { "First-time contributors" = "contributing/first-time-contributors.md" },
+ { "Contribution guide" = [
+ "contributing/guide/index.md",
+ { "Fix an issue" = "contributing/guide/what/fix-issue.md" },
+ { "Implement a new feature" = "contributing/guide/what/implement-feature.md" },
+ { "Write documentation" = "contributing/guide/what/write-docs.md" },
+ { "Triage an issue" = "contributing/guide/what/triage.md" },
+ { "Review a pull request" = "contributing/guide/what/review-pr.md" },
+ { "Propose a new feature" = "contributing/guide/what/propose-feature.md" },
+ { "Translate content" = "contributing/guide/what/translate.md" },
+ { "Use the tools" = "contributing/guide/what/use-tools.md" },
+ { "Setting up a development environment" = "contributing/guide/how/dev-environment.md" },
+ { "Reproducing an issue" = "contributing/guide/how/reproduce-issue.md" },
+ { "Working from a branch" = "contributing/guide/how/branches.md" },
+ { "Avoiding scope creep" = "contributing/guide/how/scope-creep.md" },
+ { "Writing, running, and testing code" = "contributing/guide/how/write-code.md" },
+ { "Building documentation" = "contributing/guide/how/build-docs.md" },
+ { "Writing documentation" = "contributing/guide/how/write-docs.md" },
+ { "Adding a change note" = "contributing/guide/how/change-note.md" },
+ { "Submitting a pull request" = "contributing/guide/how/submit-pr.md" },
+ { "Providing a review" = "contributing/guide/how/review-pr.md" },
+ { "Submitting a new issue" = "contributing/guide/how/new-issue.md" },
+ { "Proposing a new feature" = "contributing/guide/how/propose-feature.md" },
+ { "Translating content" = "contributing/guide/how/translate.md" },
+ { "Pull request review process" = "contributing/guide/next/pr-review.md" },
+ { "Release process" = "contributing/guide/next/release.md" },
+ { "AI Policy" = "contributing/guide/policies/ai-policy.md" },
+ { "Code style guide" = "contributing/guide/style/code-style-guide.md" },
+ { "Documentation style guide" = "contributing/guide/style/docs-style-guide.md" },
+ ] },
+ { "Sprint guide" = "contributing/sprint-guide.md" },
+ { "Challenge coins" = "contributing/challenge-coins.md" },
+ ] },
+ { "News" = [
+ "news/index.md",
+ ] },
+ { "Sponsor" = [
+ "membership/index.md",
+ ] },
+]
+not_in_nav = """
+/index.md
+/titles.md
+/project/README.md
+"""
+# This is the only way to keep the build from parsing the team bio files.
+exclude_docs = """
+!.*
+/about/team/
+"""
+extra_css = ["stylesheets/beeware.css"]
+site_url = "https://beeware.org/"
+
+[project.validation]
+omitted_files = "warn"
+absolute_links = "relative_to_docs"
+anchors = "warn"
+unrecognized_links = "warn"
+
+[project.extra]
+project_name = "beeware"
+formal_name = "BeeWare"
+hide_dev_links = true
+website = true
+translated = true
+min_python_version = "3.10" # The oldest supported Python version
+min_python_version_tag = "310" # The tag version of the minimum python version
+recent_python_version = "3.13" # The newest Python version known to work on all platforms
+docs_python_version = "3.13" # The version of Python required to build the documentation
+contribution_guide_root = "contributing/guide/"
+social = [
+ { icon = "fontawesome/brands/github", link = "https://github.com/beeware", name = "BeeWare on GitHub" },
+ { icon = "fontawesome/brands/mastodon", link = "https://fosstodon.org/@beeware", name = "BeeWare on Mastodon" },
+ { icon = "fontawesome/brands/discord", link = "https://beeware.org/bee/chat/", name = "BeeWare on Discord" },
+ { icon = "fontawesome/solid/square-rss", name = "BeeWare blog RSS feed", link = "https://beeware.org/news/buzz/atom.xml" },
+]
+generator = false
+alternate = [
+ { name = "English", link = "/en/", lang = "en" },
+ { name = "العَرَبِيَّة", link = "/ar/", lang = "ar" },
+ { name = "Čeština", link = "/cs/", lang = "cs" },
+ { name = "Dansk", link = "/da/", lang = "da" },
+ { name = "Deutsch", link = "/de/", lang = "de" },
+ { name = "Español", link = "/es/", lang = "es" },
+ { name = "فارسی", link = "/fa/", lang = "fa" },
+ { name = "Français", link = "/fr/", lang = "fr" },
+ { name = "Italiano", link = "/it/", lang = "it" },
+ { name = "日本語", link = "/ja/", lang = "ja" },
+ { name = "한국어", link = "/ko/", lang = "ko" },
+ { name = "Polski", link = "/pl/", lang = "pl" },
+ { name = "Português", link = "/pt/", lang = "pt" },
+ { name = "Русский", link = "/ru/", lang = "ru" },
+ { name = "தமிழ்", link = "/ta/", lang = "ta" },
+ { name = "Türkçe", link = "/tr/", lang = "tr" },
+ { name = "Yкраїнська", link = "/uk/", lang = "uk" },
+ { name = "Tiếng Việt", link = "/vi/", lang = "vi" },
+ { name = "中文(简体)", link = "/zh_CN/", lang = "zh-Hant" },
+ { name = "中文(繁體)", link = "/zh_TW/", lang = "zh-TW" },
+]
+
+[project.theme]
+name = "material"
+language = "en"
+logo = "assets/images/brutus-256.png"
+favicon = "assets/images/brutus-256.png"
+features = [
+ "content.tabs.link",
+ "toc.follow",
+ "navigation.tabs",
+ "navigation.tabs.sticky",
+ "navigation.indexes",
+ "navigation.sections",
+ "navigation.path",
+ "navigation.expand",
+ "search.suggest",
+ "search.highlight",
+ "search.share",
+]
+custom_dir = "overrides"
+
+# Palette toggle for automatic mode
+[[project.theme.palette]]
+media = "(prefers-color-scheme)"
+toggle.icon = "material/brightness-auto"
+toggle.name = "Switch to light mode"
+
+# Palette toggle for light mode
+[[project.theme.palette]]
+media = "(prefers-color-scheme: light)"
+scheme = "default"
+toggle.icon = "material/brightness-7"
+toggle.name = "Switch to dark mode"
+
+# Palette toggle for dark mode
+[[project.theme.palette]]
+media = "(prefers-color-scheme: dark)"
+scheme = "slate"
+toggle.icon = "material/brightness-4"
+toggle.name = "Switch to system preference"
+
+[project.markdown_extensions]
+# Python Markdown extensions
+toc.permalink = true
+toc.title = "On this page"
+attr_list = {}
+md_in_html = {}
+smarty.smart_quotes = false
+# PyMdown Extensions
+pymdownx.highlight = {}
+pymdownx.superfences = {}
+pymdownx.blocks.caption = {}
+pymdownx.blocks.admonition.types = [
+ "note",
+ "abstract",
+ "info",
+ "tip",
+ "success",
+ "question",
+ "warning",
+ "failure",
+ "danger",
+ "bug",
+ "example",
+ "quote",
+]
+pymdownx.blocks.details.types = [
+ { name = "details-note", class = "note" },
+ { name = "details-abstract", class = "abstract" },
+ { name = "details-info", class = "info" },
+ { name = "details-tip", class = "tip" },
+ { name = "details-success", class = "success" },
+ { name = "details-question", class = "question" },
+ { name = "details-warning", class = "warning" },
+ { name = "details-failure", class = "failure" },
+ { name = "details-danger", class = "danger" },
+ { name = "details-bug", class = "bug" },
+ { name = "details-example", class = "example" },
+ { name = "details-quote", class = "quote" },
+]
+pymdownx.blocks.tab.alternate_style = true
+pymdownx.emoji.emoji_index = "zensical.extensions.emoji.twemoji"
+pymdownx.emoji.emoji_generator = "zensical.extensions.emoji.to_svg"
+pymdownx.snippets.base_path = ["docs"]
+pymdownx.snippets.url_download = true
+pymdownx.snippets.check_paths = true
+
+[project.plugins.search]
+
+[project.plugins.blog]
+blog_dir = "news"
+post_url_date_format = "yyyy"
+post_url_format = "{categories}/{date}/{slug}"
+post_url_max_categories = 1
+categories_url_format = "{slug}"
+categories_allowed = ["Buzz", "Events", "Resources"]
+
+[project.plugins.autorefs]
+resolve_closest = true # autorefs warns of the Usage headings begin duplicates without this - we will have to assign unique ids to all of them otherwise
+
+[project.plugins.macros]
+module_name = "macros"
+
+[project.plugins.macros.include_yaml]
+team = "en/news/.authors.yml"
+
+[project.plugins.meta]
+
+[project.plugins.rss]
+feed_title = "BeeWare: The Buzz"
+feed_description = "News and events for the BeeWare project."
+match_path = "news/posts/.*"
+use_git = false # Forces it to read the dates from the frontmatter.
+categories = ["categories"]
+# image = "images/brutus.png" # Update to a Brutus URL
+abstract_chars_count = -1
+
+[project.plugins.rss.date_from_meta]
+as_creation = "date"
+datetime_format = "%Y-%m-%d"
+
+[project.plugins.rss.feeds_filenames]
+rss_created = "news/buzz/atom.xml"
+
+[project.plugins.redirects.redirect_maps]
+# Toga project references
+"toga.md" = "https://toga.beeware.org/"
+"project/toga.md" = "https://toga.beeware.org/"
+"project/projects/libraries/toga.md" = "https://toga.beeware.org/"
+# Briefcase project references
+"briefcase.md" = "https://briefcase.beeware.org/"
+"project/briefcase.md" = "https://briefcase.beeware.org/"
+"project/projects/tools/briefcase.md" = "https://briefcase.beeware.org/"
+# Rubicon-ObjC project references
+"rubicon.md" = "https://rubicon-objc.beeware.org/"
+"project/utilities/rubicon.md" = "https://rubicon-objc.beeware.org/"
+"project/projects/bridges/rubicon.md" = "https://rubicon-objc.beeware.org/"
+# Podium project references
+"project/applications/podium.md" = "https://github.com/beeware/podium"
+"project/projects/applications/podium.md" = "https://github.com/beeware/podium"
+# shortlinks
+"bee/briefcase-bootstraps.md" = "https://briefcase.beeware.org/en/latest/reference/commands/new.html#third-party-bootstraps"
+"bee/chat.md" = "https://discord.gg/AjYYm8cyQM"
+"bee/coc.md" = "community/code-of-conduct.md"
+"bee/join.md" = "membership/index.md"
+"bee/podium.md" = "https://github.com/beeware/podium"
+"bee/ready.md" = "https://github.com/orgs/beeware/projects/1/views/7"
+"bee/review.md" = "https://github.com/search?o=desc&q=org%3Abeeware+is%3Apr+is%3Aopen+draft%3Afalse+-author%3A%40me+archived%3Afalse&s=created&type=pullrequests"
+"bee/review-guide.md" = "https://beeware.org/contributing/guide/what/review-pr/"
+"bee/signup.md" = "about/contact.md"
+"bee/sprint.md" = "contributing/sprint-guide.md"
+"bee/sprints.md" = "contributing/sprint-guide.md"
+# Short shortlinks
+"b/ready.md" = "https://github.com/orgs/beeware/projects/1/views/7"
+"b/review.md" = "https://github.com/search?o=desc&q=org%3Abeeware+is%3Apr+is%3Aopen+draft%3Afalse+-author%3A%40me+archived%3Afalse&s=created&type=pullrequests"
+"b/review-guide.md" = "https://beeware.org/contributing/guide/what/review-pr/"
+"b/sprints.md" = "contributing/sprint-guide.md"
+"b/sprint.md" = "contributing/sprint-guide.md"
+# Historical links of significance
+"community/behavior/code-of-conduct.md" = "community/code-of-conduct.md"
+"community/behavior.md" = "community/code-of-conduct.md"
+"community/members.md" = "membership/index.md"
+"contributing/membership.md" = "membership/index.md"
+# Tutorial shortlinks
+"t/linux-deps.md" = "https://gist.github.com/freakboy3742/2e3a524bf6f1cd4486bb9e7fa2a2d3fb"
+"t/preparation.md" = "https://gist.github.com/freakboy3742/8ad8a4a74f6933a71035c1795d944610"
diff --git a/docs/zensical.tr.toml b/docs/zensical.tr.toml
new file mode 100644
index 0000000000..b0e8592f74
--- /dev/null
+++ b/docs/zensical.tr.toml
@@ -0,0 +1,9 @@
+[project]
+site_name = "BeeWare"
+docs_dir = "tr"
+
+[project.theme]
+language = "tr"
+
+[project.extra]
+translation_type = "machine"
diff --git a/docs/zensical.uk.toml b/docs/zensical.uk.toml
new file mode 100644
index 0000000000..1ef948e13f
--- /dev/null
+++ b/docs/zensical.uk.toml
@@ -0,0 +1,9 @@
+[project]
+site_name = "BeeWare"
+docs_dir = "uk"
+
+[project.theme]
+language = "uk"
+
+[project.extra]
+translation_type = "machine"
diff --git a/docs/zensical.vi.toml b/docs/zensical.vi.toml
new file mode 100644
index 0000000000..90eb88c697
--- /dev/null
+++ b/docs/zensical.vi.toml
@@ -0,0 +1,9 @@
+[project]
+site_name = "BeeWare"
+docs_dir = "vi"
+
+[project.theme]
+language = "vi"
+
+[project.extra]
+translation_type = "machine"
diff --git a/docs/zensical.zh_CN.toml b/docs/zensical.zh_CN.toml
new file mode 100644
index 0000000000..695a4eb2bf
--- /dev/null
+++ b/docs/zensical.zh_CN.toml
@@ -0,0 +1,9 @@
+[project]
+site_name = "BeeWare"
+docs_dir = "zh_CN"
+
+[project.theme]
+language = "zh"
+
+[project.extra]
+translation_type = "machine"
diff --git a/docs/zensical.zh_TW.toml b/docs/zensical.zh_TW.toml
new file mode 100644
index 0000000000..79028d2275
--- /dev/null
+++ b/docs/zensical.zh_TW.toml
@@ -0,0 +1,9 @@
+[project]
+site_name = "BeeWare"
+docs_dir = "zh_TW"
+
+[project.theme]
+language = "zh-TW"
+
+[project.extra]
+translation_type = "machine"
diff --git a/pyproject.toml b/pyproject.toml
index c7c0f0a0b7..b75fb0278e 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -3,8 +3,10 @@ pre-commit = [
"pre-commit == 4.7.0",
]
-redirects = [
- "mkdocs-redirects == 1.2.3",
+# The docs.beeware.org redirect site (in `docs-redirect`), which is built on
+# its own ReadTheDocs project.
+docs-redirect = [
+ "zensical == 0.1.0",
]
tox-uv = [
@@ -21,9 +23,9 @@ dev = [
]
docs = [
- "beeware-docs-tools @ git+https://github.com/beeware/beeware-docs-tools",
+ # TEMPORARY: pinned to the docs-tools Zensical migration branch. Revert to beeware/main once that docs-tools PR is merged.
+ "beeware-docs-tools @ git+https://github.com/kattni/beeware-docs-tools@tooling/zensical-migration",
# "beeware-docs-tools @ file://../beeware-docs-tools",
- {include-group = "redirects"},
]
translate = [
diff --git a/tox.ini b/tox.ini
index 4e16947f8f..7eff8a508d 100644
--- a/tox.ini
+++ b/tox.ini
@@ -13,9 +13,6 @@ commands = pre-commit run --all-files --show-diff-on-failure --color=always
# Docs are always built on Python 3.13. See also the RTD config.
base_python = py313
skip_install = true
-setenv =
- DISABLE_MKDOCS_2_WARNING = true
- NO_MKDOCS_2_WARNING = 1
passenv =
DEEPL_API_KEY
dependency_groups = docs