Generate Config.h, compile online, and flash over USB
| Platform | SQUARE min | PULSE min | Status |
|---|---|---|---|
| Mega2560 | 48 | 30 | |
| ESP32 | 40 | 25 | |
| STM32 F103 | 34 | 21.25 | |
| STM32 F303/F401/F411 | 20 | 12.5 | |
| STM32 F446 / Teensy3.2 | 14 | 8.75 | |
| Teensy3.5 | 12 | 7.5 | |
| Teensy3.6 | 2.6 | 1.625 | |
| Teensy4.0 / 4.1 | 1.5 | N/A |
MaxPCB4 pinmap — the difference is on-PCB wiring, not the firmware constant.
Same goes for MaxESP4i: pick MaxESP4 here and set NV_DRIVER=NV_MB85RC64
below for the FRAM variant. Teensy 3.2 / 4.1 boards flash one-click via WebHID; ESP32 boards
(MaxESP3/4, FYSETC_E4, CNC3) flash via WebSerial; BTT_SKR_PRO flashes via WebUSB DFU
(BOOT0 jumper + reset). CNC3 is deprecated — see the OnStep wiki for alternatives.
The SHC needs to talk to your OnStep/OnStepX mount controller. Pick whichever cabling matches your hardware. SERIAL_ST4 is the simplest (single short cable to OnStep's ST4 port). Standard async serial (Serial / Serial1) works if you wire UART. Radio is cleanest for ESP32 builds.
raw.githubusercontent.com/..., not
github.com/.../blob/...). Leave empty to pull the FYSETC E4 reference config.
THERMISTOR1_*, DISPLAY_WEATHER
stay put. To start totally fresh, click ↻ Reset to Defaults in the page header.
The Config.h you've generated will be sent to a GitHub Actions runner that clones the latest hjd1964/OnStepX source, replaces Config.h with your version, compiles with PlatformIO, and returns the firmware. Builds typically take 1-3 minutes.
main for latest.
src/plugins/, and wire up Plugins.config.h
automatically. Leave all unchecked for a stock build.
Connect your board via USB and put it into programming mode:
What this site does: you answer a handful of questions about your telescope mount (motors, gearing, drivers, board), click a button, and get firmware ready to flash onto your OnStepX controller — without installing Arduino IDE, PlatformIO, or any C++ toolchain on your computer.
Everything happens either inside your browser tab or on free cloud services (GitHub Pages, GitHub Actions, Cloudflare Workers). The project source is always the latest hjd1964/OnStepX — we never bundle a stale copy.
A normal OnStepX workflow looks like: install Arduino IDE or PlatformIO → clone the source → edit Config.h → wait for the toolchain to download → build → flash. That's a lot of setup just to try the firmware once. This site replaces every step with a click.
Here's what actually happens when you click Compile Firmware:
+--------------------------------------+
| 1. YOUR BROWSER |
| You pick mount/motor/driver |
| settings. Your browser builds |
| a Config.h file locally. No |
| data is sent until you click |
| Compile. |
+-----------------+--------------------+
| POST /compile
| { config.h, board, onstepx_ref }
v
+--------------------------------------+
| 2. CLOUDFLARE WORKER (a "bridge") |
| Tiny serverless endpoint at |
| onstepx-build-bridge.*.workers.dev
| Validates your inputs, adds a |
| GitHub token (which your browser |
| shouldn't see), and asks GitHub |
| Actions to start a build. |
+-----------------+--------------------+
| workflow_dispatch
v
+--------------------------------------+
| 3. GITHUB ACTIONS (the build farm) |
| In christm45/onstepx-build- |
| service, a fresh Ubuntu VM:
| a) clones hjd1964/OnStepX at |
| your chosen branch/tag/SHA |
| b) overwrites its Config.h |
| with the one you sent |
| c) runs PlatformIO to compile |
| for your chosen MCU |
| d) packages firmware as a zip |
| and publishes it as a |
| "workflow artifact" |
+-----------------+--------------------+
| firmware.zip
| (bootloader, partitions, firmware.bin, merged.bin…)
v
+--------------------------------------+
| 4. WORKER FETCHES THE ARTIFACT |
| and streams it back to your |
| browser. |
+-----------------+--------------------+
|
v
+--------------------------------------+
| 5. YOUR BROWSER |
| Unzips the archive in memory, |
| talks to your board over USB |
| (Web Serial / WebUSB), and |
| writes the firmware. The board |
| reboots into OnStepX. |
+--------------------------------------+
Piece by piece:
Runs entirely in your browser. The HTML/CSS/JavaScript was served by GitHub Pages when you loaded the tab, and from then on everything is local — even the Config.h generation and the browser-based flasher. The page never phones home just for you being here.
A few UI niceties worth knowing:
? icons next to field names open a one-sentence explanation for
that specific setting, plus (for most fields) a "Learn more →" link that jumps to the
relevant help section. Hover to preview, click to pin, Esc to dismiss.MaxPCB4 in the Controller
section and the Compile & Flash tab's Target MCU switches to teensy41 for
you. Changing it manually to something incompatible fires a preflight warning before you spend a
build minute.A ~200-line JavaScript function that Cloudflare runs on-demand when your browser pings it. Its only
job is to accept your /compile request, attach a private GitHub API token (which, critically,
your browser shouldn't see), and tell GitHub Actions to start a build. It also proxies the resulting
firmware zip back to you. The Worker doesn't store anything — each request is independent.
Why it's needed: GitHub Pages is static-only (it serves files, it can't call protected APIs). A tiny serverless function is the simplest way to bridge a static site to an authenticated API without standing up a server you have to maintain.
The repo christm45/onstepx-build-service
holds a platformio.ini (build recipe) and a workflow file
(.github/workflows/build.yml). When the Worker triggers the workflow, GitHub spins up a
fresh Ubuntu virtual machine, runs the steps, then throws the VM away. The steps are:
git clone https://github.com/hjd1964/OnStepX.git, then git checkout at the
branch/tag/commit you typed in the OnStepX source field (default: latest main)Config.h over OnStepX's defaultpio run -e esp32 (or one of teensy32 / teensy40 /
teensy41 / blackpill_f411 / f446_fysetc_s6 /
skr_pro_f407, plus the SHC and SWS variants). PlatformIO downloads the MCU
toolchain and any external libraries OnStepX needs, then compiles.firmware-<uuid>.zip, published as a 1-day-retention workflow
artifactOnce your browser has the firmware zip, it unzips in memory and uses one of the Web APIs modern Chromium browsers expose to talk to USB devices:
esptool.py, using the
esptool-js library loaded from a
CDN on first use.dfu-util.teensy_loader_cli: 1024-byte blocks, 64-byte header with a
little-endian flash offset, final 0xFFFFFF report to reboot into the app). You still
have to press the white program button to put the Teensy into bootloader mode — HalfKay is only
reachable after that. On browsers without WebHID we fall back to downloading firmware.hex
for the PJRC Teensy Loader app.Of the three browser flashers, the Teensy one is the most custom. PJRC's official tool is
teensy_loader_cli,
a small C program that talks to the Teensy's HalfKay bootloader over USB HID using libusb/hidapi. The
Teensy has no serial bootloader and no DFU interface — HalfKay is the only path in. To do the same
thing from a browser we need an API that can send HID output reports to an arbitrary vendor device, and
that's exactly what WebHID gives us (Chrome/Edge only; no Firefox or Safari support yet).
Every Teensy 3.2 / 4.0 / 4.1 sits in ROM as HalfKay whenever you press the white program button.
In that mode it appears as a USB HID device with vendor/product IDs 0x16C0 /
0x0478 — same VID:PID across models. The browser's device picker filters on
those IDs, so only a Teensy in bootloader mode shows up in the dialog; the running OnStepX sketch,
with its own USB identity, is ignored. That also means the dialog is empty until you press the
program button — Chrome polls for new devices, so the Teensy pops in as soon as HalfKay
activates.
Once the device is open, flashing is a loop of 1088-byte HID output reports with this layout:
byte 0 1 2 3 ............. 63 64 ........................ 1087
+---+---+---+------ zeros ------+------ 1024 bytes of data -------+
| flash offset | padding | .hex payload for this page |
| little-endian | (61 bytes) | |
| 3 bytes | | |
+---+---+---+-----+-------------+---------------------------------+
Block 0 is always sent, even if blank, because that's the trigger that erases the whole chip;
subsequent all-0xFF pages are skipped to speed things up. The first five blocks get a
long 45-second timeout because the chip erase takes a few seconds before the first write is
acknowledged; later blocks complete in milliseconds. After the last data block we send one more
1088-byte report with the offset bytes set to 0xFF 0xFF 0xFF — HalfKay reads that
as "reboot into the app." The bootloader often resets mid-ACK, so a missing reply on that final
packet is expected, not an error.
Parsing the firmware is its own step. On Teensy 4.x, PlatformIO emits an Intel HEX file whose data
records carry absolute addresses starting at 0x60000000 (the IMXRT1062 flash base); on
Teensy 3.2 the addresses start at 0. The parser auto-detects which by looking at the first data
record, handles extended-linear-address prefixes (record type 0x04), verifies each
line's checksum, and collapses everything into a flat Uint8Array indexed from offset 0.
Unused gaps are filled with 0xFF so they look like erased flash. The code_size
picked from the env name (2 MB for 4.0, 8 MB for 4.1, 256 KB for 3.2) bounds the write and catches
"wrong firmware for this board" early.
Everything above lives in flash/teensy.js — roughly 300 lines, no external
dependencies beyond the ES-module imports this page uses everywhere. If the browser doesn't expose
WebHID, or you dismiss the device picker, or any step throws mid-flash, we fall back to the original
path: save firmware.hex and show the Teensy Loader instructions. HalfKay is in ROM and
cannot be overwritten, so a partial flash never bricks the board — worst case you click Flash
again and retry.
SETUP-COMPILE-SERVICE.md in the configurator repo.
The big toggle at the top of the page picks which firmware you're building:
The three firmwares run on separate MCUs — you don't combine them onto one chip. A typical full setup is: one board (ESP32 / Teensy / STM32) running OnStepX inside the mount, plus one ESP32 running SWS for the web UI, plus (optionally) one ESP32 running SHC inside a hand pendant. They all talk to each other at runtime over the links you configure (ST4 cable, serial, WiFi, BLE).
When you flip the mode switch:
PINMAP to whatever board you have —
MaxPCB4 (covers MaxPCB4w/MaxPCB4e variants), MaxESP3/MaxESP4
(covers MaxESP4i + FRAM), MaxSTM3/MaxSTM3I, FYSETC_E4,
FYSETC_S6 (V1.2 / V2.0 — STM32F446, 6-axis), CNC3
(WeMos R32 — deprecated), MiniPCB (v1 embed-in-mount or v2 stand-alone case),
or BTT_SKR_PRO.
Click Apply board defaults right below the PINMAP dropdown to autofill driver model,
microsteps, and run current for that board.AXIS_DRIVER_MODEL to whatever you're using
(TMC2209, TMC5160, DRV8825, …) and pick the microstepping.
Review the pre-filled steps/deg values.MOUNT_TYPE (GEM, FORK, or
ALTAZM).#define PINMAP, driver, and mount lines should look right.PINMAP, serial/WiFi, weather/IMU
sensors, GPS, display.Config.h. Copy, download, or load an existing one
to back-fill the form. The ↻ Reset to Defaults button in the header clears every tab's
saved state and reloads.Most defaults are fine. These are the ones you almost always have to set:
PINMAP, click the Apply board defaults
button right under the dropdown. For MaxESP3/4, MaxPCB4, MaxSTM3, BTT SKR PRO, MiniPCB, CNC3,
and FYSETC_E4, that fills in the driver model, microsteps, run current, and mount type with
known-good values — so you only need to touch the steps/deg (from the Calculator) and the
values specific to your scope.
PINMAP (Controller) — pick the board you have. Wrong value = firmware drives
wrong pins.MOUNT_TYPE (Mount) — GEM, FORK, or ALTAZM.AXIS1_STEPS_PER_DEGREE and AXIS2_STEPS_PER_DEGREE (Axis1/Axis2) — from
the Calculator.AXIS1_DRIVER_MODEL / AXIS2_DRIVER_MODEL —
TMC2209, TMC5160, DRV8825, A4988,
LV8729, etc.AXIS1_DRIVER_MICROSTEPS / AXIS2_DRIVER_MICROSTEPS — 16, 32, 64, 128,
256. Higher = smoother tracking but more step rate on slews.AXIS*_DRIVER_REVERSE — flip if the axis moves the wrong way.AXIS*_LIMIT_MIN / _MAX — soft limits in degrees.AXIS*_DRIVER_IRUN / _IHOLD — motor current (mA) for TMC drivers.
Start low, raise only as needed. Too high = hot driver, skipped steps, burned stepper.TRACK_REFRACTION (Mount) — refraction-compensated tracking. Fine to leave OFF for
visual use.WIFI (Controller, ESP32 only) — enable if you want SkySafari over WiFi.SERIAL_A matches SkySafari defaults.On the Compile & Flash tab, the OnStepX source field controls which version of the firmware
gets compiled. The default is main — the latest commit on
hjd1964/OnStepX's main branch.
You can type any of:
main, develop, or any feature branch that
exists upstreamv10.24 to pin to a released version for reproducibility1a2b3c4 for exact reproducibility or to try a specific
in-progress changeJust below the field you'll see a live preview that resolves your input against GitHub and shows the commit hash, author, date, and the first line of the commit message, so you know exactly what's about to be compiled:
Will build: hjd1964/OnStepX @ main · 1a2b3c4 · Howard Dutton · 3 days ago
Add X-axis soft-limit check to mount park routine
If the ref doesn't exist (typo, or tag hasn't been published yet), you'll see a red "could not resolve" message.
Before any Compile actually goes to the cloud, a local validator scans your form for common mistakes so you don't waste a 2-minute build on an obvious oversight:
esp32; MaxPCB4 →
teensy41; CNC3 (WeMos D1 R32) → esp32; MiniPCB (v1 / v2) →
teensy32 by default — switch the Compile-tab MCU to teensy40 if you
have a Teensy 4.0 mounted; MaxSTM3 / MaxSTM3I → blackpill_f411;
FYSETC_S6 (V1.2 / V2.0) → f446_fysetc_s6; BTT_SKR_PRO →
skr_pro_f407. Mismatches are caught before they hit the runner.PINMAP, MOUNT_TYPE, axis driver model, and
steps/deg must all be set.teensy40/teensy41 the OnStepX
source requires STEP_WAVE_FORM=SQUARE. The form auto-corrects this when you switch
envs, and the preflight catches it if you override.PASSWORD, KEY, SECRET, or TOKEN, you're warned
because it would appear in the public GitHub Actions log.You see each issue listed with a red ✗ (error) or yellow ⚠ (warning) icon. The Compile button stays disabled until you either resolve the issues or tick the "I understand the issues above — build anyway" override. This is intentional: the checklist is a safety net for beginners, not a straightjacket for power users who know what they're doing.
Plugins live in their own repo —
hjd1964/OnStepX-Plugins
— and the OnStepX main branch deliberately doesn't ship them. When you tick a plugin
checkbox in the Compile tab's OnStepX plugins box, the build service does this for you:
GitHub Actions runner:
1. git clone hjd1964/OnStepX (the version you picked in Source ref)
2. git clone hjd1964/OnStepX-Plugins
3. For each ticked plugin (e.g. "website"):
cp -r plugins-src/website → OnStepX/src/plugins/website/
4. Generate OnStepX/src/plugins/Plugins.config.h:
#define PLUGIN1 website
#include "website/Website.h"
#define PLUGIN1_COMMAND_PROCESSING OFF
(slots 2-8 → OFF)
5. Drop your Config.h on top of OnStepX/Config.h
6. pio run -e <your env>
→ compiles src/plugins/website/*.cpp into the firmware binary
7. Bundle firmware.bin (+ manifest.json + Plugins.config.h) into the
artifact zip you download.
Concrete example: FYSETC E4 + Website plugin (ESP32). Click Apply FYSETC E4 defaults and
the configurator auto-ticks the Website checkbox. Click Compile and the workflow ends up with
OnStepX/Config.h from the E4 branch + OnStepX/src/plugins/website/ from
OnStepX-Plugins + Plugins.config.h wiring Website to slot 1. After flashing, the ESP32
boots OnStepX, exposes its WiFi (SSID and password live in
src/plugins/website/Config.h — the plugin's own config, not yours), and the web UI
is reachable at the IP it prints on the serial console.
Four places, in increasing order of "you really want to be sure":
> POST .../compile { project: onstepx, board: esp32, ref: main, plugins: [website] }
plugins: website — workflow will copy each into src/plugins/<name>/ and wire up Plugins.config.h
request_id = …
and after success:
✓ Plugins compiled into this firmware: website --- Plugins.config.h (from artifact) --- #define PLUGIN1 website #include "website/Website.h" #define PLUGIN1_COMMAND_PROCESSING OFF … --- end Plugins.config.h ---That's the source of truth — the Plugins.config.h block is the actual file the workflow used to build your firmware, copied straight out of your downloaded artifact.
Plugins.config.h next to firmware.bin / merged-firmware.bin
(and a manifest.json with a "plugins": ["website", …] field). If those are
missing, your build server is running an older workflow that didn't include them — the firmware is
still correctly built, you just have to fall back to method (4) to confirm.run URL: https://github.com/…/runs/<id> after the build queues. Open it,
expand the step "Bundle OnStepX plugins", and search for
=== Generated Plugins.config.h ===. The next ~10 lines are the exact file the workflow
wrote into the source tree before compiling.src/plugins/website/ in any repo on diskThe bundling happens on a fresh ephemeral GitHub-hosted runner that's torn down the moment the workflow
finishes. Nothing is committed back to a repo — not to the build-service repo, not to OnStepX, not
to anywhere. The only persistent output is the firmware artifact, and (with the workflow change shipped
alongside this help section) the Plugins.config.h dropped next to it.
If you want to inspect the plugin source before a build, browse it directly at
github.com/hjd1964/OnStepX-Plugins/website
— it's a normal folder of .h / .cpp files plus the plugin's own Config.h.
SERIAL_RADIO
on the Controller tab is WIFI_ACCESS_POINT or WIFI_STATION, otherwise the
plugin will compile but the radio won't come up. Configure SSID / password in the plugin's own
src/plugins/website/Config.h (we don't expose those fields in this configurator yet
— you can edit the generated config after compile, or fork OnStepX-Plugins)./metrics endpoint;
you need a scraper running somewhere.Reference wikis: MaxESP v3 · MaxESP build notes.
firmware.bin written at 0x0 — much simpler than
ESP32's four-partition layout. Takes 20–60 s.0483 / PID DF11).BigTreeTech's 3D-printer board repurposed for OnStep. Same ST DFU protocol as the BlackPill, just a different entry procedure:
0483 /
PID DF11) instead of running the old firmware.Reference wiki: BTT SKR PRO on OnStep wiki. Same Windows WinUSB / Zadig note as the BlackPill applies.
FYSETC's 6-axis 3D-printer board. Same ST DFU protocol as the SKR PRO, but the BOOT0 control on newer S6 revisions is a 3-pin header instead of a jumper (centre + right pin = boot to DFU).
0483 /
PID DF11).⚠ Driver compatibility: per the OnStep wiki, FYSETC S6 only supports
TMC2130 / TMC5160 (SPI), LV8729 or S109. The
UART steppers (TMC2208 / TMC2209 / TMC2226) will not
work on this board even though they're in the dropdown — picking one fires a preflight error.
Reference wiki: FYSETC S6 on OnStep wiki. Same Windows WinUSB / Zadig note as the BlackPill applies.
Two iterations on the OnStep wiki:
Both run on Teensy 3.2 (moderately fast) or Teensy 4.0 (very fast). Both work with most StepStick drivers (DRV8825 / A4988 / LV8729) plus TMC2130 and TMC5160. Teensy 3.2 uses the HalfKay bootloader in the same "block_size ≥ 512" branch as 4.0/4.1 — the WebHID flasher covers all of them:
If you have a Teensy 4.0 mounted instead of 3.2, switch the Target MCU on the Compile
& Flash tab from teensy32 to teensy40 before clicking Compile.
Fallback (Firefox / Safari / WebHID unavailable): we save firmware.hex; drop it
into Teensy Loader and press the white program button. CLI alternative:
teensy_loader_cli --mcu=mk20dx256 -w -v firmware.hex (Teensy 3.2) or
teensy_loader_cli --mcu=imxrt1062 -w -v firmware.hex (Teensy 4.0).
Reference wikis: MiniPCB overview · MiniPCB v2.
One-click browser flash (Chrome / Edge):
If the browser dialog is empty, the Teensy isn't in HalfKay bootloader mode yet — just press the white program button and it'll pop in.
Fallback (Firefox / Safari / WebHID unavailable): we save firmware.hex to your
Downloads folder. Then:
firmware.hex onto the window.CLI alternative if you have Teensyduino installed:
teensy_loader_cli --mcu=TEENSY41 -w -v firmware.hex # 4.1 / MaxPCB4 teensy_loader_cli --mcu=TEENSY40 -w -v firmware.hex # 4.0
| Browser | Configurator & Compile | ESP32 / ESP8266 flash | STM32 DFU flash | Teensy 3.2 / 4.0 / 4.1 flash |
|---|---|---|---|---|
| Chrome, Edge, Opera, Brave (Chromium) | yes | yes (Web Serial) | yes (WebUSB) | yes (WebHID) |
| Firefox | yes | no | no | no (download .hex) |
| Safari | yes | no | no | no (download .hex) |
Firefox / Safari can generate a config, trigger a compile, and download the firmware —
they just can't flash via the browser. If you're on one of those, download the firmware and use
esptool.py (ESP32), dfu-util (STM32), or Teensy Loader (Teensy) locally.
Here's exactly what leaves your browser and where it ends up:
| Data | Where it goes | How long it stays |
|---|---|---|
| Your Config.h (base64-encoded) | Cloudflare Worker → GitHub Actions as a workflow input | Logged in the Actions run metadata indefinitely (public repo) |
| Board selection & OnStepX ref | Same as above | Same |
| Your IP address (for rate limiting only) | Cloudflare Worker KV (if rate limit is enabled) | 1 hour |
| The compiled firmware | GitHub Actions artifact storage | 24 hours, then deleted automatically |
| Form state (all your settings) | Your browser's localStorage | Until you click Reset to Defaults or clear site data |
OFF / empty and configure them over the
OnStepX web UI after flashing, where they only live on your board.
The configurator itself sends no analytics, no telemetry, no trackers. Nothing leaves your browser until you click Compile.
The site owner hasn't deployed the Cloudflare Worker, or WORKER_URL in
compile.js still has the placeholder. For the owner: follow
SETUP-COMPILE-SERVICE.md.
Click the run URL printed in the compile log. That opens the GitHub Actions page for
your build. The "PlatformIO build" step contains the compiler error. Common causes:
OFF — scroll up in the log for #error
lines from Validate.h.git checkout.The firmware artifact couldn't be downloaded. Reload the page, re-compile, and watch for a
firmware download failed line in the compile log. Usually means the artifact already
expired (24 h retention) or the Worker URL is wrong.
You edited the form after compiling. The firmware on disk is stale. Click Compile Firmware again, or click Cancel to flash the outdated firmware anyway (rarely what you want).
lsusb should change.0483:DF11 is present.The Teensy isn't in HalfKay bootloader mode yet. Leave the browser dialog open and press the white program button on the Teensy — Chrome polls for new devices and it'll appear. This applies to 3.2, 4.0, 4.1, and MaxPCB4. If the picker still won't show it after the button press, the USB cable may be charge-only (try another).
WebHID is Chromium-only. On Firefox/Safari the flasher silently falls back to saving
firmware.hex which you then drop into the PJRC Teensy Loader app. Same result, one more
step.
Drag the file onto the Teensy Loader window, or File → Open HEX File. If it opens but doesn't flash, press the white program button on the Teensy — it flashes on button press, not on file open.
Normal. Block 0 on a Teensy triggers a full chip erase; the ACK for that first write arrives only after the erase finishes (a few seconds on 3.2, a bit longer on 4.1's 8 MB flash). The flasher allows up to 45 s per block for the first five blocks. If it actually times out, unplug / replug the Teensy and retry — HalfKay is ROM-resident, nothing can be bricked.
That's config, not firmware. Toggle AXIS1_DRIVER_REVERSE / AXIS2_DRIVER_REVERSE,
re-generate, re-compile, re-flash. If nothing moves at all, check the wiring — if step/dir pins
aren't connected, the firmware is fine but the stepper won't move.
If the service enforces rate limits (default: 10 builds/hour/IP), wait an hour. If you're iterating
heavily, set up a local PlatformIO checkout: clone
hjd1964/OnStepX, drop your
Config.h in, pio run -e <env>.
Whatever you type in the OnStepX source field on the Compile & Flash tab — defaults
to main (latest). The live preview under the field shows the exact commit. See
Picking an OnStepX version.
Yes — each compile request base64-encodes your Config.h and sends it as a GitHub Actions workflow input. Public-repo Actions logs are visible to anyone, so treat Config.h as public. See Privacy.
Depends on the flow:
src/plugins/website/Config.h (the plugin's own config, bundled automatically by the
workflow when you tick the plugin).#define OPERATIONAL_MODE ETHERNET_TEENSY41
before #include "Extended.config.h", and optionally
#define SERIAL_IP_MODE ETHERNET_W5500 for W5x00 shields. The textarea is editable
and Compile sends it as-is.Everything in the PINMAP dropdown is wired to a matching PlatformIO env on the build
side. Today that covers:
To add a board that's not listed, the build service needs a new PlatformIO env — edit
build-service/platformio.ini (plus the whitelist in build.yml and the
Worker's ALLOWED_BOARDS set), then update the PINMAP dropdown and
PINMAP_TO_ENV / PINMAP_MCU mappings here.
You can generate Config.h offline — this page works fully offline once loaded. Compiling needs
the online service. For a fully offline toolchain, install
PlatformIO, clone
hjd1964/OnStepX, and run pio run -e esp32 (or whatever env).
In OnStepX mode, after a successful flash the form auto-resets to the selected board's starter
defaults, so the next build starts from a clean baseline for that board. This only happens for boards
where a starter config is shipped (see the hint next to the "Apply board defaults" button on the
Controller tab). Your pre-flash state is stashed in localStorage under
onstepx-configurator-v2-preflash — to restore it, open DevTools → Console and run:
localStorage.setItem('onstepx-configurator-v2', localStorage.getItem('onstepx-configurator-v2-preflash'));
location.reload();
The simpler alternative: before flashing, click Download Config.h on the Output tab to save a copy; re-load it later with Load Existing Config.h.
SHC / SWS modes do not auto-reset — their configs are small enough that overwriting would be annoying rather than helpful.
Zero at the scale of a hobby project. GitHub Pages, GitHub Actions (on public repos), and Cloudflare Workers all have free tiers that comfortably fit hundreds of builds per day.
Yes. Everything is open-source. Fork christm45/OnStepX-Configurator, follow
SETUP-COMPILE-SERVICE.md, redeploy. The whole pipeline takes under an hour end-to-end.
File an issue at the configurator repo. If the issue is with OnStepX itself (firmware behavior, missing features), use the OnStep group or the upstream repo.