Files
firmware/docs/upgrading.md
T
Oleksandr ShyshatskyiandClaude Opus 5 214a4e58b9 anvil-core owns firmwareExe and start.sh; kill the 3.8.2 myth
Three things, all downstream of klippy having moved to $MODDIR and our own
CPython 3.13.

SECTIONS 8 AND 9 ARE GONE. Both files install at $MODDIR/prog/ and
anvil-link-prog.sh points the stock paths at them -- from run-append.sh on a
flash and from anvil-core's postinst on `opkg upgrade anvil-core`. Nothing
execs either between run.sh distributing the component and link-prog running,
so the component copy bought no ordering. It cost, though: our firmwareExe
with no payload behind it logs "no anvil-env.sh", finds no s6-svscan and then
`while true; do sleep 3600; done` -- a printer that boots to a blank screen for
ever and never reaches app_startup.sh's own recovery. Absent, that recovery
restores a firmwareExe from a version directory. So patch.sh now REMOVES both
from the component: the stock component carries them, and deleting the two cp
lines alone would have shipped FlashForge's originals.

SECTION 5c IS GONE. It did no work -- two du prints and a comment whose first
line was the falsehood below.

THE FALSEHOOD. "klippy runs on the stock 3.8.2, started by
/usr/prog/klipper/start.sh" had spread well past patch.sh, and it had reached
things people follow:

  - docs/toolchange.md told owners to scp the ff_*.py extras to
    /usr/prog/klipper/klippy/extras/ -- the wrong partition -- and warned that
    an OTA would delete them there. Same wrong path in three ff-*.cfg headers
    and in ff_toolchange.py.
  - versions.env labelled our CPython 3.13 and its eighteen packages
    "SHIPPED BUT NOT USED".
  - docs/how-it-works.md said Moonraker runs on python3.8, contradicting line
    126 of the same file.

All corrected. Historical notes keep their history and get a [Superseded: ...]
marker instead -- including 80-s6-migration.md's "s6-rc-compile is not
shipped", which pkgs/3rdparty/s6-rc/build.sh contradicts deliberately.

Found while reviewing: every docs/ reference to the ff-*.cfg pointed at
pkgs/anvil-core/payload/config/, which does not exist -- they are
anvil-klipper-config's. 28 references across 9 files, several of them broken
markdown links on the published site. All 24 relative links under docs/ now
resolve.

Gates: verify.sh syntax-checks prog/start.sh and prog/firmwareExe out of the
payload (firmwareExe was never syntax-checked before) and fails if the
component carries either. A new replica test asserts both stock paths are
symlinks into $MODDIR/prog and do not dangle. One existing replica test stubbed
firmwareExe by redirecting into $FE, which now writes THROUGH the symlink into
the packaged wrapper; it moves the link aside instead.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01La5MaDKqTW675k5fsXsP6S
2026-08-30 00:37:28 +03:00

3.7 KiB

Upgrading, and your files

A newer release installs exactly like the first flash: stick in, power on. Nothing you have set is asked for again. This page is the line between the files that are yours and the files the mod overwrites without asking, because that line is what makes an update safe.


Your files and the mod's files

File Whose
/usr/data/config/printer.cfg Yours — never overwritten. Overrides go here, after the includes: restate only what you change, the last value wins.
moonraker-custom.conf Yours — created once, never rewritten, included last so your settings win. Do not delete it.
ff-*.cfg, printer.base.cfg, moonraker.conf The mod's — overwritten on every update; do not edit.
anvil/helixscreen/config/settings.json Yours — everything you set on the screen. Written by HelixScreen itself; carried across updates along with helixscreen.env and its spool map.

Upgrading

A newer release installs exactly like the first flash: stick in, power on. Your printer.cfg with its saved calibration, moonraker-custom.conf, your root password and everything you set on the screen survive; the ff-*.cfg family is replaced. If a release changes helixscreen.env, yours is kept and the new one is left beside it as helixscreen.env.mod-new.


The config files in detail

The .cfg includes are wired up for you: printer.base.cfg ends with the seven [include ff-*.cfg] lines, so a flash brings the mod up by itself. Your printer.cfg is not touched. The factory dock and nozzle numbers are pulled in for you too: on the first boot after the flash, [ff_legacy] imports firmwareExe's per-unit JSON and persists it with its own SAVE_CONFIG, so Klipper restarts once, right after coming up — before the screen is on its feet. TOOL_OFFSET_STATUS afterwards should show a nozzle triple for every tool and no NOT CALIBRATED.

The included files are the mod's, and every update overwrites them without asking — ff-*.cfg and printer.base.cfg alike. Do not edit them. Put changes at the end of printer.cfg, restating only the option or macro you are changing: Klipper merges same-named sections and the last value wins, so everything you leave out keeps the shipped value and your overrides survive every flash. Each of those files opens with a header saying as much.

moonraker.conf is mod-owned too — it is overwritten on every update, which is how the [webcam] block and the API lockdown reach the printer. Its seam is moonraker-custom.conf beside it: created once, never written again, and included at the end of moonraker.conf, so anything you set there wins. Do not delete it — Moonraker treats an include that matches no file as fatal and will refuse to start. An empty one is fine.

If you edit moonraker.conf itself anyway, the installer notices and keeps your copy, landing the new version beside it as .mod-new.


A FlashForge OTA update is a different thing

Everything the mod installs is under /usr/data/anvil on the data partition, the klippy tree and its extras included, so an OTA cannot delete them. What it does rewrite is the software component the mod boots from — so re-flash the mod after a firmware update. The #*# block in printer.cfg survives either way.


Going back to stock

Flashing the stock FlashForge package for your model is the uninstall — it installs the same way, and it restores every file the mod touches. The one thing it cannot bring back is FlashForge's Moonraker, which the stock package does not carry: the mod's build stays, it works, and Mainsail is happy with it. The details, and the ladder below it, are in Support.