Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
577a4bf
initial zensical test
jurgelenas Apr 8, 2026
52a95ac
Merge branch 'master' into zensical
jurgelenas Jul 10, 2026
0d37f41
Update Zensical to 0.0.50
jurgelenas Jul 10, 2026
f277ecd
Port master changes to Zensical config
jurgelenas Jul 10, 2026
7ae3ef8
Implement product finder on Zensical
jurgelenas Jul 10, 2026
f8b96dd
Restore the real homepage via template overrides
jurgelenas Jul 10, 2026
feed7e1
Use the classic theme variant
jurgelenas Jul 10, 2026
8a3074a
Address the Zensical migration TODO list
jurgelenas Jul 10, 2026
48afc49
Trim resolved items from the TODO list
jurgelenas Jul 10, 2026
e8b222a
Fix spellcheck workflow after Makefile changes
jurgelenas Jul 10, 2026
5afe7ad
Pin setup-uv to v8.3.2
jurgelenas Jul 10, 2026
8a5c4ca
Ignore local TODO.md scratch notes
jurgelenas Jul 10, 2026
107a617
Use native Zensical blog, tags, social, minify and redirects
jurgelenas Oct 3, 2026
9328ff4
Fix ES915RX link in SPI receivers page
jurgelenas Oct 3, 2026
8f53c2c
Add RSS and JSON feeds for the blog
jurgelenas Oct 3, 2026
cf345fb
Merge master into zensical
jurgelenas Oct 3, 2026
7904b24
Drop unused Bootloaders link reference
jurgelenas Oct 3, 2026
282d8f6
Port Markdown extensions from mkdocs.yml and enable strict mode
jurgelenas Oct 3, 2026
558087e
Restore the header search button
jurgelenas Oct 3, 2026
9a04e8d
Restore git revision dates and committers on Zensical
MUSTARDTIGERFPV Oct 3, 2026
69e6a7c
Merge pull request #568 from ExpressLRS/zensical-git-info
jurgelenas Oct 5, 2026
44668b8
Load git_info via PYTHONPATH instead of an editable install
jurgelenas Oct 5, 2026
8c3b5a0
Give the docs container git and a GitHub token
jurgelenas Oct 5, 2026
48f3b74
Keep sidebar entries for collapsible FAQ headings
jurgelenas Oct 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 29 additions & 40 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,56 +10,45 @@ on:
concurrency:
group: publish
cancel-in-progress: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
MKDOCS_GIT_COMMITTERS_APIKEY: ${{ secrets.MKDOCS_GIT_COMMITTERS_APIKEY }}
permissions:
contents: read
pages: write
id-token: write
jobs:
deploy:
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
steps:
- name: Checkout latest push
uses: actions/checkout@v4
- uses: actions/checkout@v5
with:
fetch-depth: 0
fetch-depth: 0 # git_info needs full history for page dates

- name: Setup Python env
uses: actions/setup-python@v5
with:
python-version: 3.9.16
- uses: actions/configure-pages@v5

- name: Set up build cache
uses: actions/cache/restore@v4
with:
key: docs-${{ hashfiles('.cache/**') }}
path: .cache
restore-keys: |
docs-
- name: Install uv
uses: astral-sh/setup-uv@v8.3.2

- name: Setup Github
- name: Generate product catalog and homepage news
run: |
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
git pull
git checkout master
uv run python overrides/hooks/product_catalog.py
uv run python overrides/hooks/blog_posts.py

- name: Install Dependencies
run: |
make install-python-packages
pip install --upgrade "mkdocs-material==9.7.6"
sudo apt-get install pngquant
- name: Build site
run: uv run zensical build --clean
env:
PYTHONPATH: overrides/hooks # zensical.toml loads git_info from here
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # git_info committer lookups

- name: Deploy Release Version
run: |
mkdocs gh-deploy --force
- name: Generate llms.txt
run: uv run python overrides/hooks/llms_txt.py

- name: Deploy to Server
run: |
git checkout gh-pages
git remote set-url --push origin https://actions:$GITHUB_TOKEN@github.com/ExpressLRS/Docs
git push -f origin gh-pages

- name: Save build cache
uses: actions/cache/save@v4
- name: Upload Pages artifact
uses: actions/upload-pages-artifact@v4
with:
key: docs-${{ hashfiles('.cache/**') }}
path: .cache
path: site

- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
6 changes: 3 additions & 3 deletions .github/workflows/spellcheck.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ jobs:
uses: actions/checkout@v5
- name: Install aspell
run: sudo apt-get install -y aspell aspell-en
- name: Install Python packages
run: make install-python-packages
- name: Install uv
uses: astral-sh/setup-uv@v8.3.2
- name: Check Spelling
run: make spellcheck
run: uv run --group spellcheck pyspelling --config .spellcheck.yml --spellchecker aspell --name Markdown
7 changes: 7 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -147,3 +147,10 @@ Dockerfile.insiders

# Generated product catalog
docs/assets/data/products.json

# Generated homepage Latest News partial (overrides/hooks/blog_posts.py)
overrides/partials/recent-posts.html

# Local scratch notes
TODO.md
.git-committers.json
1 change: 1 addition & 0 deletions .python-version
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
3.11
22 changes: 7 additions & 15 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,18 +1,10 @@
FROM squidfunk/mkdocs-material:9.7.6
RUN apk add \
build-base \
libxml2-dev \
libxslt \
libxslt-dev \
dumb-init \
aspell \
aspell-en
FROM zensical/zensical:0.0.67

WORKDIR /docs
COPY ./Makefile ./Makefile
RUN make install-python-packages
# WORKDIR, EXPOSE 8000, ENTRYPOINT and the default
# `serve --dev-addr=0.0.0.0:8000` CMD are inherited from the base image.

EXPOSE 8000
# git_info reads page dates and committers from git
RUN apk add --no-cache git

ENTRYPOINT ["dumb-init"]
CMD ["mkdocs", "serve", "--livereload", "--dev-addr=0.0.0.0:8000"]
# Lets zensical.toml load the git_info Markdown extension
ENV PYTHONPATH=/docs/overrides/hooks
49 changes: 33 additions & 16 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,19 +1,36 @@
.PHONY: install-python-packages
install-python-packages:
pip install \
"mkdocs-minify-plugin==0.8.0" \
"mkdocs-redirects==1.2.2" \
"mkdocs-static-i18n==1.3.0" \
"mkdocs-git-committers-plugin-2==2.5.0" \
"mkdocs-git-revision-date-localized-plugin==1.4.5" \
"cairosvg==2.8.1" \
"jinja2==3.1.6" \
"pyspelling==2.12.1"

.PHONY: build
# Host-only convenience wrappers around `uv` and `docker compose`.
# CI invokes `uv` directly and never calls `make`.

.PHONY: install build run serve site shell spellcheck catalog

# zensical.toml loads git_info from here
export PYTHONPATH := overrides/hooks

install:
uv sync

build:
mkdocs build
uv run zensical build --clean

run: serve

serve:
docker compose up

# Full pipeline, mirrors .github/workflows/publish.yml
site:
docker compose run --rm --entrypoint sh docs -c "\
python3 overrides/hooks/product_catalog.py && \
python3 overrides/hooks/blog_posts.py && \
zensical build --clean && \
python3 overrides/hooks/llms_txt.py"

shell:
docker compose run --rm --entrypoint sh docs

catalog:
docker compose run --rm --entrypoint python3 docs overrides/hooks/product_catalog.py

.PHONY: spellcheck
# Needs aspell + aspell-en installed on the host
spellcheck:
pyspelling --config .spellcheck.yml --spellchecker aspell --name Markdown
uv run --group spellcheck pyspelling --config .spellcheck.yml --spellchecker aspell --name Markdown
2 changes: 2 additions & 0 deletions compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ services:
context: .
dockerfile: Dockerfile
dns_search: ''
environment:
GITHUB_TOKEN: ${GITHUB_TOKEN:-} # git_info committer lookups, set in .env
networks:
- net
ports:
Expand Down
8 changes: 5 additions & 3 deletions docs/assets/javascripts/admonition-enhancement.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
// This code helps in linking Table of content with Admonition title

var elements = document.getElementsByClassName('custom-heading');
// Zensical copies heading markup into the sidebar TOC, so match only the
// headings in the page body or the TOC entries get removed along with them
var elements = document.querySelectorAll(':is(h1, h2, h3, h4, h5, h6) > .custom-heading');

for (var i = 0; i < elements.length; i++) {
var ele = elements[i];
Expand All @@ -18,6 +20,6 @@ for (var i = 0; i < elements.length; i++) {
}

// Removing all custom headings
while (elements.length) {
elements[0].parentElement.remove();
for (var i = 0; i < elements.length; i++) {
elements[i].parentElement.remove();
}
14 changes: 14 additions & 0 deletions docs/assets/javascripts/timeago.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// Turns the git_info dates (<span class="timeago" datetime=...>) into "3 months ago"
document$.subscribe(function() {
var rtf = new Intl.RelativeTimeFormat(document.documentElement.lang || "en", { numeric: "auto" })
var units = [["year", 31536000], ["month", 2592000], ["week", 604800], ["day", 86400], ["hour", 3600], ["minute", 60]]
document.querySelectorAll(".md-source-file .timeago[datetime]").forEach(function(el) {
var secs = (Date.parse(el.getAttribute("datetime")) - Date.now()) / 1000
for (var i = 0; i < units.length; i++) {
if (Math.abs(secs) >= units[i][1] || i === units.length - 1) {
el.textContent = rtf.format(Math.round(secs / units[i][1]), units[i][0])
break
}
}
})
})
2 changes: 1 addition & 1 deletion docs/hardware/spi-receivers.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ Using the latest [Betaflight Configurator](https://github.com/betaflight/betafli
If your Flight Controller model is not in the list above, consult your Flight Controller manufacturer for details.

!!! info "NOTE"
The Happymodel Mobula6 900MHz AIO with the CrazyF4 ELRS FC (Target: CRAZYBEEF4DX) doesn't use an SPI ExpressLRS receiver. Check the page for [ES915RX](../quick-start/receivers/hmes900.md/#updating-your-receiver-firmware-es915rxes868rx) instead.
The Happymodel Mobula6 900MHz AIO with the CrazyF4 ELRS FC (Target: CRAZYBEEF4DX) doesn't use an SPI ExpressLRS receiver. Check the page for [ES915RX](../quick-start/receivers/hmes900.md#updating-your-receiver-firmware-es915rxes868rx) instead.

Likewise, the [v2.0 BetaFPV F4 1S 5A](https://betafpv.com/collections/brushless-flight-controller/products/f4-1s-5a-aio-brushless-flight-controller-elrs-2-4g) comes with an on-board UART-based ExpressLRS Receiver and doesn't use the SPI ExpressLRS implementation. Use the `BETAFPV AIO 2400 RX` Device target.

Expand Down
1 change: 0 additions & 1 deletion docs/quick-start/receivers/hmpp2400.md
Original file line number Diff line number Diff line change
Expand Up @@ -154,4 +154,3 @@ The next steps will not be able to proceed smoothly and you'll have issues later
[Configured]: ../receivers/configuring-fc.md
[firmware options]: ../firmware-options.md
[Receiver Wiring]: wiring-up.md#connecting-a-receiver
[Bootloaders]: #bootloaders
Loading
Loading