Skip to content

Patternflow v3.4.0 — a board that arrives empty has somewhere to get patterns

Latest

Choose a tag to compare

@engmung engmung released this 12 Aug 02:28
7074902

Patterns leave the firmware and live on the filesystem, so a board ships nearly empty — and a pack ships with it. Hardware unchanged — v3.0 board and case carry over as-is.

⚠️ Updating from v3.3.0 or earlier

Your board had 34 built-in patterns. After this update it has one. The other 33 moved out of the program and onto the filesystem, which is what freed the internal memory everything else in this release needed.

They are one click away, not gone: the Basics pack at the top of the decks shelf. No account, no build queue. Patterns you installed yourself as .pfm modules are untouched — they were already on their own partition.

Added

  • A pattern set ships with Patternflow. The Basics pack — 33 patterns — is built from the repo's own preset sources by the new firmware/toolchain/make_pack.py and committed as a plain file, so it works with no account, no build queue, and against a database that has never been seeded. The person who just got their board lit has none of those things.

    Built from our own sources rather than a ready-made set, because provenance cannot be added back later: every module carries an author its source actually declares, and the tool fails rather than publish one that does not. Patternflow names the pack as publisher; the per-pattern author stays in each .json, where the licence expects to find it.

  • A pack installs from a link. /patterns?src= already ferried a build's file listing; it now also takes a plain .zip. Your browser fetches it, unpacks it and posts the modules to the board — the device never needs TLS, having nowhere near the heap for a handshake. This closes the deck loop for free: a deck's download URL was a file you fetched and dragged, and is now one click.

  • MQTT, both directions (/mqtt), from @SimonePDA (Simone Majocchi) — his protocol design, role model and topic layout. Knob turns and the pattern name publish as retained topics; a panel set to Subscriber follows them, so two boards on the same broker stay in sync and Home Assistant sees plain values on plain topics. The zip unpacking above is his too.

  • Firmware updates have their own page (patternflow.work/update), reached from a banner on the device console when a newer release exists. Building a whole firmware image with a pattern baked into it is gone — a .pfm module does that job in 6 KB without a reflash.

  • A deck has a downloadable pack at a stable URL, built once per running order and cached against a fingerprint of it, so a deck nobody edits is compiled once ever. No sign-in; the compile is charged to the deck's owner rather than to whoever pastes the link.

  • Play a pattern from the list by clicking its name, arrange the running order by dragging, and Select all beside the bulk delete.

Changed

  • Origin is the only pattern compiled into the firmware. Every preset costs internal DRAM, and with 34 of them a 128×64 board had roughly 1 KB of headroom — /patterns returned a truncated page as soon as anything else wanted RAM, which is what made MQTT look impossible to fit. Dropping them frees ~6 KB of DRAM and 49 KB of flash: internal heap goes 11,052 → 16,648 and /patterns 1.98 s → 0.03 s.

  • The device console is dark, and reorganised around what each page is for. The home page leads with a device card over grouped rows, two columns on a desktop screen, and tells you when a newer firmware exists — the check runs in your browser against the public manifest, so the device still never talks to the internet.

  • Clearing a library is one request instead of one per pattern. Each delete used to make the device rescan the filesystem and reload the resident module, so emptying fifty was a minute of watching rows vanish one at a time. The endpoint takes the whole list — or * for everything, which also catches modules the loader rejected at boot and that therefore never appear in the list.

  • A deck holds twenty patterns instead of ten.

  • Pattern names on the panel wrap instead of running off the edge. The SELECT screen is about ten characters wide in portrait, so "Retro Digital Tapestry" was clipped at both ends.

Fixed

  • An unreachable MQTT broker no longer looks like a dead device. Resolving the host and opening the socket ran synchronously in the render loop every 5 s, so a broker that stopped answering held the loop for seconds at a time — the panel still pinged and still accepted TCP, but served nothing.
  • A subscriber no longer jumps when it joins. A retained knob value was added to the local count rather than differenced against it, so a panel whose knob was not at zero landed at local + remote instead of matching the publisher.
  • Windows-made zips install correctly. Entry names were split on / only; .NET's archiver writes \, so the junk filter and duplicate check silently stopped matching, files uploaded under their full path, and the device accepted them, listed them, and lost them on reboot.
  • A five-second delete looks like it is working — rows dim on the click, a bar sweeps, and the seconds are counted. The bar is deliberately indeterminate: the device reports nothing from inside the pass, so a percentage would be invented.
  • Release images are scanned before publishing. net_config.h bakes in whatever patternflow_secrets.h defines, and v2.1.0 and v3.0.0 shipped with the maintainer's home Wi-Fi credentials in plaintext because of it. Images are now built from a sketch copy with that file removed and scanned for every value it defines, with a build that still has the secrets used as a control — if the control passes, the scan is broken rather than the build clean.

Install: flash from patternflow.work over USB the first time, or open patternflow.work/update to send it to a board already on your Wi-Fi.