Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
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
Binary file not shown.
Binary file not shown.

Large diffs are not rendered by default.

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
1,587 changes: 1,587 additions & 0 deletions firmware/firmware.json

Large diffs are not rendered by default.

107 changes: 107 additions & 0 deletions firmware/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>PyDevices - firmware downloads</title>
<meta name="description" content="Flashable OmniPython firmware for the boards we have run: MicroPython and CircuitPython-compatible images, an Install button for Chrome and Edge, and the esptool steps for everything else.">
<meta name="robots" content="noindex">
<script>try{if(localStorage.getItem('pydevices-theme')==='light'){document.documentElement.setAttribute('data-theme','light');}}catch(e){}</script>
<link rel="icon" type="image/svg+xml" href="/assets/img/logo.svg">
<link rel="stylesheet" href="/assets/chrome/site.css">
<link rel="stylesheet" href="page.css">
</head>
<body>
<div id="pydevices-site-header"></div>

<main class="wrap fw" style="padding-bottom: 60px;">
<div class="section-head" style="margin-top: 36px;">
<h1 style="margin: 0;">Firmware downloads</h1>
<span class="hint">OmniPython MP and CP, for the boards we have run</span>
</div>
<p class="prose">Pick your board, then press Install in Chrome or Edge, or follow the esptool steps in any browser. Everything here is built by public CI from one pinned commit and attested, so you can check a file came from it.</p>

<noscript><p class="fw-warn">This page builds its steps from <code>firmware.json</code> with a little script, so it needs JavaScript. The files are listed in <a href="firmware.json">firmware.json</a>.</p></noscript>
<div id="fw-set" class="fw-set" hidden></div>

<div class="spec-block">
<label for="fw-board" class="fw-label">Your board</label>
<select id="fw-board" class="fw-select" disabled><option>Loading...</option></select>
<p id="fw-build-note" class="fw-muted"></p>
</div>

<div id="fw-out" hidden>
<div class="fw-warn" role="note">
<strong>Copy your files off the board first, <code>secrets.py</code> above all.</strong>
A build can move the filesystem, and flashing across a layout change leaves it empty.
Coming from another firmware (MicroPython to CircuitPython, or back), erase the flash first.
</div>

<div id="fw-install" class="spec-block" hidden>
<h2>Install from the browser</h2>
<p class="prose" id="fw-install-text"></p>
<div id="fw-install-button"></div>
<p class="fw-muted" id="fw-install-hint"></p>
</div>

<div class="spec-block">
<h2 id="fw-steps-title">Steps</h2>
<ol id="fw-steps" class="fw-steps"></ol>
</div>

<div class="spec-block">
<h2>Files</h2>
<div class="fw-scroll"><table id="fw-files" class="fw-table"></table></div>
<p class="fw-muted" id="fw-files-note"></p>
<p class="prose">Check a download came from our CI: <code id="fw-verify"></code></p>
</div>
</div>

<div class="section-head" style="margin-top: 36px;">
<h2 id="fw-file-title">Install from a file</h2>
<span class="hint">A .bin or .uf2 you built yourself</span>
</div>
<div id="fw-file" class="spec-block">
<p class="prose">Built your own firmware? Pick the file and this page writes it to your board, the same way as the builds above. The file stays on your computer.</p>
<label for="fw-file-input" class="fw-label">Firmware file</label>
<input type="file" id="fw-file-input" class="fw-file-input" accept=".bin,.uf2">
<div id="fw-file-chip-row" class="fw-file-row" hidden>
<label for="fw-file-chip" class="fw-label">Chip</label>
<select id="fw-file-chip" class="fw-select"></select>
</div>
<p id="fw-file-note" class="fw-muted" hidden></p>

<div id="fw-file-out" hidden>
<p class="fw-muted"><strong>Copy your files off the board first, <code>secrets.py</code> above all.</strong>
A build with a different layout leaves the filesystem empty.</p>
<div id="fw-file-install" hidden>
<h3>Install from the browser</h3>
<p class="prose" id="fw-file-install-text"></p>
<div id="fw-file-install-button"></div>
<p class="fw-muted" id="fw-file-install-hint"></p>
</div>
<h3 id="fw-file-steps-title">Steps</h3>
<ol id="fw-file-steps" class="fw-steps"></ol>
<h3>Or with mpftp</h3>
<div id="fw-file-mpftp" class="fw-cli prose"></div>
</div>
</div>

<div class="section-head" style="margin-top: 36px;">
<h2>Desktop interpreters</h2>
<span class="hint">Linux, Windows and the browser, with every PyDevices module</span>
</div>
<div id="fw-interp" class="spec-block"><p class="fw-muted">Loading...</p></div>

<details class="fw-pins">
<summary>What is in this set</summary>
<div id="fw-pins"></div>
</details>
</main>

<div id="pydevices-site-footer"></div>
<script src="/assets/chrome/site-chrome.js"></script>
<script type="module" src="vendor/esp-web-tools/install-button.js"></script>
<script src="page.js"></script>
</body>
</html>
36 changes: 36 additions & 0 deletions firmware/interpreters.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
{
"tag": "v0.5.5",
"provenance": "built by the workspace anchor's tools/build_interpreters.sh on the maintainer workstation",
"files": {
"micropython": {
"sha256": "5fccb83203a276716812f862b0c5d01648b99223405d0d781a4ea5510a46dee9",
"size": 3535848,
"platform": "linux-x86_64",
"version": "3.4.0; MicroPython v1.29.0-1.gb41df1ec1c on 2026-09-24"
},
"micropython.exe": {
"sha256": "7a14839857b45b863cdaeb95e0837a62b74098588f89202685d9f1c90b1a22c9",
"size": 4706304,
"platform": "windows-amd64",
"version": "3.4.0; MicroPython v1.29.0-1.gb41df1ec1c on 2026-09-24"
},
"circuitpython": {
"sha256": "97e9e8c0d22735c63f30c42f6b37ac225b46deb52329763301b3d9c2e9276f80",
"size": 27982504,
"platform": "linux-x86_64",
"version": "3.4.0; CircuitPython 10.3.0-dirty on 2026-09-24"
},
"micropython.mjs": {
"sha256": "6bdad3fc4892bc409c292d8b6605e0162d3420425af1e69e4c04a3168248d329",
"size": 270254,
"platform": "node/browser wasm32",
"version": "3.4.0; MicroPython v1.29.0-1.gb41df1ec1c on 2026-09-24"
},
"micropython.wasm": {
"sha256": "f0e6588b96ebf250ac37d01d28177b730c121da50bdc3161919b21bc8651acf0",
"size": 5878836,
"platform": "node/browser wasm32",
"version": "3.4.0; MicroPython v1.29.0-1.gb41df1ec1c on 2026-09-24"
}
}
}
17 changes: 17 additions & 0 deletions firmware/manifests/cp-p4-devkit.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"name": "OmniPython CircuitPython-compatible for the ESP32-P4-WIFI6-DEV-KIT",
"version": "staged-20261021b",
"new_install_prompt_erase": true,
"new_install_improv_wait_time": 0,
"builds": [
{
"chipFamily": "ESP32-P4",
"parts": [
{
"path": "../files/omnipython-cp-waveshare_esp32p4_wifi6_dev_kit-11.0.0-alpha.1-20261021.bin",
"offset": 0
}
]
}
]
}
17 changes: 17 additions & 0 deletions firmware/manifests/cp-s3-lcd7.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"name": "OmniPython CircuitPython-compatible for the ESP32-S3-Touch-LCD-7",
"version": "staged-20261021b",
"new_install_prompt_erase": true,
"new_install_improv_wait_time": 0,
"builds": [
{
"chipFamily": "ESP32-S3",
"parts": [
{
"path": "../files/omnipython-cp-waveshare_esp32s3_touch_lcd_7-11.0.0-alpha.1-20261021.bin",
"offset": 0
}
]
}
]
}
17 changes: 17 additions & 0 deletions firmware/manifests/cp-twatch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"name": "OmniPython CircuitPython-compatible for the LilyGO T-Watch S3",
"version": "staged-20261021b",
"new_install_prompt_erase": true,
"new_install_improv_wait_time": 0,
"builds": [
{
"chipFamily": "ESP32-S3",
"parts": [
{
"path": "../files/omnipython-cp-lilygo_twatch_s3_single_app-11.0.0-alpha.1-20261021.bin",
"offset": 0
}
]
}
]
}
17 changes: 17 additions & 0 deletions firmware/manifests/mp-p4-devkit.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"name": "OmniPython MicroPython for the ESP32-P4-WIFI6-DEV-KIT",
"version": "staged-20261021b",
"new_install_prompt_erase": true,
"new_install_improv_wait_time": 0,
"builds": [
{
"chipFamily": "ESP32-P4",
"parts": [
{
"path": "../files/omnipython-mp-esp32_generic_p4-wifi6_dev_kit_h2-staged-20261021b.bin",
"offset": 8192
}
]
}
]
}
17 changes: 17 additions & 0 deletions firmware/manifests/mp-p4-panel.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"name": "OmniPython MicroPython for the ESP32-P4-WIFI6-Touch-LCD-4B",
"version": "staged-20261021b",
"new_install_prompt_erase": true,
"new_install_improv_wait_time": 0,
"builds": [
{
"chipFamily": "ESP32-P4",
"parts": [
{
"path": "../files/omnipython-mp-esp32_generic_p4-pre_rev3_c6_wifi-staged-20261021b.bin",
"offset": 8192
}
]
}
]
}
17 changes: 17 additions & 0 deletions firmware/manifests/mp-s3-lcd43.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"name": "OmniPython MicroPython for the ESP32-S3-Touch-LCD-4.3",
"version": "staged-20261021b",
"new_install_prompt_erase": true,
"new_install_improv_wait_time": 0,
"builds": [
{
"chipFamily": "ESP32-S3",
"parts": [
{
"path": "../files/omnipython-mp-esp32_generic_s3-spiram_oct-staged-20261021b.bin",
"offset": 0
}
]
}
]
}
17 changes: 17 additions & 0 deletions firmware/manifests/mp-s3-lcd7.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"name": "OmniPython MicroPython for the ESP32-S3-Touch-LCD-7",
"version": "staged-20261021b",
"new_install_prompt_erase": true,
"new_install_improv_wait_time": 0,
"builds": [
{
"chipFamily": "ESP32-S3",
"parts": [
{
"path": "../files/omnipython-mp-esp32_generic_s3-lcd_7-staged-20261021b.bin",
"offset": 0
}
]
}
]
}
17 changes: 17 additions & 0 deletions firmware/manifests/mp-s3-tembed.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"name": "OmniPython MicroPython for the LilyGO T-Embed S3",
"version": "staged-20261021b",
"new_install_prompt_erase": true,
"new_install_improv_wait_time": 0,
"builds": [
{
"chipFamily": "ESP32-S3",
"parts": [
{
"path": "../files/omnipython-mp-esp32_generic_s3-t_embed-staged-20261021b.bin",
"offset": 0
}
]
}
]
}
42 changes: 42 additions & 0 deletions firmware/page.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
.fw h2 { margin: 0 0 12px; font-size: 1.1rem; }
.fw-label { display: block; font-weight: 600; margin-bottom: 8px; }
.fw-select {
width: 100%; max-width: 560px; padding: 11px 12px; font: inherit; color: var(--ink);
background: var(--bg-soft); border: 1px solid var(--border); border-radius: var(--radius-sm);
}
.fw-muted { color: var(--muted); font-size: 0.92rem; margin: 10px 0 0; }
.fw-warn {
margin: 20px 0; padding: 14px 18px; color: var(--ink);
border: 1px solid rgb(var(--warn-rgb) / 0.5); border-left: 4px solid var(--warn);
border-radius: var(--radius-sm); background: rgb(var(--warn-rgb) / 0.09);
}
.fw-set {
margin: 0 0 20px; padding: 14px 18px; border: 1px solid var(--border);
border-left: 3px solid var(--accent); border-radius: var(--radius-sm); background: var(--panel);
color: var(--ink-soft); font-size: 0.95rem;
}
.fw-set.staged { border-left-color: var(--warn); }
.fw-set p { margin: 0 0 6px; }
.fw-set p:last-child { margin-bottom: 0; }
.fw-steps { margin: 0; padding-left: 22px; color: var(--ink-soft); }
.fw-steps li { margin: 0 0 14px; }
.fw-steps li:last-child { margin-bottom: 0; }
.fw-steps pre, .fw-cli pre { margin: 8px 0 0; padding: 12px 14px; overflow-x: auto; border: 1px solid var(--border-soft);
border-radius: var(--radius-sm); background: var(--bg-soft); }
.fw-steps pre code, .fw-steps code, .fw-cli pre code { font-family: var(--mono); font-size: 0.88rem; }
.fw-scroll { overflow-x: auto; }
.fw-table { width: 100%; border-collapse: collapse; font-size: 0.92rem; }
.fw-table th, .fw-table td { text-align: left; padding: 8px 10px; border-bottom: 1px solid var(--border-soft); vertical-align: top; }
.fw-table th { color: var(--muted); font-weight: 600; white-space: nowrap; }
.fw-table td.num { text-align: right; white-space: nowrap; font-variant-numeric: tabular-nums; }
.fw-table td.hash { font-family: var(--mono); font-size: 0.8rem; color: var(--muted); word-break: break-all; }
.fw-table .soon { color: var(--muted); }
.fw-pins { margin-top: 28px; color: var(--ink-soft); }
.fw-pins summary { cursor: pointer; font-weight: 600; }
.fw-pins table { margin-top: 12px; }
#fw-install-button .btn { font: inherit; }
.fw h3 { margin: 22px 0 10px; font-size: 1rem; }
.fw-file-input { display: block; max-width: 100%; font: inherit; color: var(--ink); }
.fw-file-row { margin-top: 16px; }
#fw-file-install-button .btn { font: inherit; }
.fw-cli p { margin: 0; }
Loading