Releases: engmung/Patternflow
Release list
Patternflow v3.4.0 — a board that arrives empty has somewhere to get patterns
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 earlierYour 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
.pfmmodules 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.pyand 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.
Patternflownames 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
.pfmmodule 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 —
/patternsreturned 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/patterns1.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.hbakes in whateverpatternflow_secrets.hdefines, 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.
Patternflow v3.3.0 — a panel you can actually calibrate
Color, end to end: perceptual ramps in the editor and a panel you can actually calibrate. Hardware unchanged — v3.0 board and case carry over as-is.
Backfilled tag. This shipped as the stock image on 2026-08-09 but was never tagged, which left the README pointing at a release page that did not exist.
Added
- Runtime display calibration (#287). White balance, gamma and saturation were compile-time constants, so finding a number cost a reflash per guess. They are runtime state now, tunable live over
GET /api/displaywhile looking at the panel. Values are session-only; the converged ones go back intoconfig.has the shipped defaults. - Calibration test card, as an overlay rather than a pattern — knob browsing stays a curated list.
?screen=0..3draws it over the running pattern (which freezes underneath) and?screen=-1resumes; a long-press on K4 or any pattern switch also dismisses it, so a closed browser tab can never strand the panel on a test screen. Four screens: white field, a 16-step staircase over a smooth gradient, color bars at full and half drive, and sRGB-versus-OKLab ramp pairs on the actual LEDs. - Panel tuner — sliders driving
/api/displaybeside a canvas rendering the same test frames in raw sRGB. The reference is the point: you cannot judge a color against a memory, only against another color. Generates aconfig.hblock once the values settle. - Perceptual color ramps in Pattern Lab and the community sandbox —
oklab,oklch shortandoklch long. Blending complementary stops in sRGB collapses the middle into grey and sweeping hue in HSV makes lightness pulse; interpolating in OKLab does neither. Because ramps bake to a 256-entry lookup table web-side, the new modes reached the firmware and.pfmbuilds with no device-side change. - LED panel compatibility guide (#258, #259). A panel matching our spec line for line can still stay completely black, because HUB75E is a connector and not a protocol — the driver ICs decide. The driver IC is essentially never in the listing (we audited our own: it appears zero times in the title, spec table, marketplace summary and PDF manual), so the guide leads with what actually works — reading buyer reviews from people running it off an ESP32 — then asking the seller. Opened up by @SimonePDA, who hit the failure and researched it properly.
PANEL_PROFILEcovers all six library drivers instead of two.- Remote pattern selection —
GET /api/patterns/select?name=|index=.
Changed
- Shipped color defaults are one panel's measured numbers, not plausible ones:
LED_WB0.930/1.000/0.975 andLED_SAT_BOOST1.62. The saturation direction reversed the theory that predicted it — narrow-band LED primaries cover more than sRGB, which argues for cutting saturation, but beside a monitor showing the same frame the panel reads washed out. Existing devices will look different after this update — more saturated, less warm. Panels vary; tune your own with/api/display. - Encoder acceleration removed — one detent, one step (#262). A fast spin used to multiply each detent ×2 to ×5. Compared against a linear build with four curves live at once, linear won outright: the multiplier was worst on the parameter that most needs landing on a value, since Origin's Mode knob picks a discrete preset and a quick turn skipped five at a time.
- Knob travel derives from the parameter's range. It was a fixed per-knob constant that never looked at min/max, so a 0..1 knob crossed in one turn while a 0..100 knob needed a hundred. Travel is now
(max - min)per two turns. Existing presets keep their compiled-in constants.
Fixed
- Calibration tables no longer sit in internal DRAM (#288). The test card's ramp tables shipped as a 1.5 KB namespace static — the exact mistake
core_mem.hexists to prevent. With them resident every console page truncated at ~5.6 KB and module uploads failed. They allocate from PSRAM now, and/patternsdelivers its full 16 KB in 0.4 s. - Encoder decoder resynced onto bounced states (#262). The quadrature ISR updated its reference on transitions that cannot physically happen, so a bounced jump moved the decoder to the wrong phase. Illegal transitions are discarded now, plus a time filter — the A/B lines have no RC filter and only weak internal pull-ups.
ENCODER_CLICKS_PER_TURNwas 20; the reference encoder has 24. It sat next to a comment promising one web rotation equals one physical turn, so the preview it claimed to mirror was 20% out of step. Sourcing a different encoder? Generic EC11s ship as 20, 24 or 30, and this constant has to match what is in the build.- Panel-profile guidance was backwards —
config.hsent anyone holding the reference panel to change a setting they don't need. The rule is now empirical: stay on the default unless the panel comes up completely dark. - Assorted documentation corrections: brightness is K1 long-press not K2, the removed Pattern/Video content mode, the
presets/layout, v2 build-guide flashing ports, panel mounting screws, and the v2 BOM's power-cable note.
Superseded by v3.4.0.
Patternflow v3.2.0 — patterns install over Wi-Fi
Hardware unchanged — the v3.0 board and case carry over exactly as they are. This release is about one thing: a pattern no longer needs a firmware build to reach your board.
Building one? Start here → BUILD_GUIDE.md — about 30 minutes of (deliberately easy, all through-hole) soldering, 30 minutes of assembly, ~10 hours of printer time, around US$100 in parts.
⚠️ Safety unchanged: power through the screw terminal only
The v3.0 board's USB-C power input remains withdrawn from service (#221). Power through J4, the 2-pin screw terminal, and leave USB1, R1 and R2 unpopulated. The failure is delayed — "it seems to work" proves nothing.
Patterns install over Wi-Fi now
Until now, adding a pattern meant compiling a whole firmware image — about a minute, a 1.2 MB download, and a flash over the top of the running device, all to deliver a few kilobytes of pattern.
A pattern is now a loadable module: a relocatable ELF of about 6 KB. Pick patterns in the community, send them to the board, and they appear in the list immediately — no reflash, no reboot, no USB. Switching to one takes 6–11 ms. Up to 128 can be installed, and having them installed costs nothing while they sit there; only the one you are looking at uses any memory.
The design and the working proof of concept came from Simone Majocchi (@SimonePDA), who built the whole idea as a fork and shared it: a frozen C ABI between host and module, a linker script that collapses each module to four sections, and an on-device relocator. That is the hard part, and it arrived working.
Collecting them
Every hardware-ready pattern in the community has an add-to-cart button on its card. Fill the cart, press build, and Send over Wi-Fi points your device's pattern manager at the result — it fetches and installs every file itself. Nothing to download, nothing to unzip.
The device grew a pattern manager to match: install, multi-select delete, format, with a per-file queue showing real progress and per-file results, and navigation across every console page.
Pattern Lab: from idea to board in one path
To hardware replaces Build firmware and follows the order the work actually happens in. Everything needs the pattern as a C++ header first, so that is step one — one prompt for a single layer, a deterministic scaffold with a prompt per layer for a stack. Once you have a header, the three things it makes possible are offered together: install it as a module, build a full image, or publish it to the community with the header attached, so it arrives already marked hardware-ready and you only write a title.
Opening someone else's pattern no longer stacks their layers on top of yours — the canvas is replaced, and what you were working on is parked in Recent, which keeps the last three.
Also fixed
- The browser flasher was shipping firmware without the module loader. Anyone who flashed from the site got a board that could not receive a single pattern. The stock image is now built from the release source and version-stamped per release.
- Patterns with accents work. "Dynamic Moiré" broke three layers at once — the build scripts, a loader guard that treated any non-ASCII name as a corrupt pointer, and the panel font. Names are UTF-8 everywhere; only the panel folds them.
- A pattern that fails to load says why, on the panel and in
/api/status, instead of showing a torn frame. - "Uploaded" means "verified" — the device reopens each
.pfmand checks it is structurally a module, which is what catches a truncated transfer. - A never-used board can start. The pattern partition ships unformatted, and
/patternsoffers an explicit Format button exactly when the volume will not mount.
Known rough edges
Written down honestly rather than left for you to discover:
- Installing many modules in a row can wedge the device; a power cycle recovers it. Undiagnosed.
- A firmware upload from the browser occasionally aborts partway and succeeds on a retry.
- Opening a console page pauses the running pattern for as long as you are browsing. A loaded module and a 16 KB page cannot both have the RAM; three fixes were tried and are documented.
- A module runs about 20 % slower than the same pattern compiled into the firmware. That is the cost of relocatable code, not something a compiler flag reaches.
Updating
Already have a board? Open http://patternflow.local → Firmware update and drop patternflow.ino.bin from the firmware bundle below. First time, or coming from a much older image? Use the browser flasher at patternflow.work — and read README.txt in the bundle if you flash manually, because boot_app0.bin matters.
Patternflow v3.1.0 — the browser does everything now
Hardware unchanged — the v3.0 board and case carry over exactly as they are. This release is the software half of the instrument catching up: a pattern community, firmware builds that run on a server and flash from the browser, wireless updates, and one important piece of safety guidance.
Building one? Start here → BUILD_GUIDE.md — about 30 minutes of (deliberately easy, all through-hole) soldering, 30 minutes of assembly, ~10 hours of printer time, around US$100 in parts.
⚠️ Safety first: power through the screw terminal only
The v3.0 board's USB-C power input is withdrawn from service (#221): a USB-C-powered board ran fine for 20–30+ minutes, then smoked at a connector pin. The failure is delayed — "it seems to work" proves nothing. Until the redesign passes:
- Power the board through
J4, the 2-pin screw terminal (strip a USB cable, screw the wires in). - Leave
USB1,R1, andR2unpopulated.
BUILD_GUIDE §2 has the full story and photos.
Highlights
The Community
Patterns now have a home: community.patternflow.work. A live feed you can play — hover any card and the pattern runs, scroll-wheel turns its knobs — with detail pages where you edit the code in place. Publish from Pattern Lab, and remixes record their fork lineage so you can see what grew out of what. Patterns that ship a hardware-verified .h are flagged and filterable for when you want something to flash right now. No account needed to browse or edit; username + password only to publish.
Firmware builds, from the browser
The toolchain is gone (#230): a build server compiles a complete firmware image containing your pattern — about 30 seconds — and the browser writes it to the board over USB (desktop Chrome/Edge). No IDE, no board package, no registry editing. And after the first flash sets up Wi-Fi, Send over Wi-Fi (#232) pushes the next builds to the device with no cable at all. The Arduino IDE is now only for firmware feature development or targeting a different matrix resolution.
Pattern Lab, the studio
Pattern Lab grew into the professional editing tool: batch AI generation in-app (bring your own free Gemini key), color ramps, custom frames carried end to end (// @matrix travels from the lab through the community sandbox into the firmware conversion), session autosave, and a mobile-first Copy prompt / Paste response flow. Unused features were cut so the tool stays sharp.
The website
The pattern section was rebuilt around how Patternflow actually works now — try 42 presets one tap away, make your own with AI, then Pattern Lab and the Community carry it to hardware. The build section answers the two questions every builder asks first (~US$100, ~1 hour of hands-on work) and routes ordering straight through the PCBWay shared project and the MakerWorld case listing. A new interactive project roadmap shows the whole plan on one map.
Hardware note
No new board, no new case. patternflow_v3.0_gerber.zip remains the board to order, and the v3 case files are unchanged — grab either from the v3.0.0 release or the attachments below. On v2.x hardware? Everything stays bundled at v2.1.0.
Assets
patternflow_v3_firmware.zip— prebuilt ESP32-S3 binaries (the browser-flasher image: 34 presets + 3 custom slots) with esptool offsets in the included READMEpatternflow_v3.0_gerber.zip— the verified board (unchanged from v3.0.0)patternflow_v3_case_stl_pack.zip— all v3 case STLs (unchanged from v3.0.0)patternflow_v3.3mf— Bambu Studio project (4 pre-arranged plates; same as the MakerWorld listing)patternflow_case.blend— Blender source for every printed part (Git LFS; attached so Download ZIP users get the real file)
Full details in the CHANGELOG.
Firmware & web: MIT · Hardware & designs: CC-BY-SA 4.0
Patternflow v3.0.0 — the hybrid-power generation
Patternflow v3.0.0 — the hybrid-power generation
The biggest hardware revision since launch. The v3.0 board and enclosure were rebuilt around one goal: anyone should be able to solder and assemble this.
Building one? Start here → BUILD_GUIDE.md — the PCB soldering is covered by a full video walkthrough.
Highlights
The board: two power inputs, zero SMD
- Screw-terminal power — strip a USB cable, clamp two wires into the 2-pin terminal on the back of the board. No soldering iron needed for the power input.
⏸️ Update (2026-07): the board also carries a USB-C footprint (
USB1), but that input is on hold — a USB-C-powered board ran fine for 20–30+ minutes and then smoked at a connector pin, destroying the receptacle and power path (#221). LeaveUSB1/R1/R2unpopulated and power the board throughJ4for now. See BUILD_GUIDE §2. - No SMD passives at all — every part you solder is through-hole. The whole board is beginner-solderable.
- Fabricated, assembled, and verified on the screw-terminal input.
The enclosure: snap-fit, printable on a 256 mm bed
- Folders named by printer bed size:
bed_256mm/encloser.stl(one STL, ~10 h on a P1S) orbed_330mm/one-piece for large-format printers. Knobs print separately in black — white body, black knobs. - Bambu printers: one click — the case is on MakerWorld with tuned print profiles; the same 4-plate project is attached below as
patternflow_v3.3mf. - Snap-fit back panel, two wall-mount holes, and recesses for the LED panel's alignment bumps — the nipper-trimming step that's been with us since v1.0 is gone (#19).
- Using a different LED panel than the recommended one?
bed_256mm/for_other_panels/has an adjustable-mount variant (#169).
The BOM: every part by part number
hardware/bom/bom_v3.0.csv— machine-readable, every part specified by MPN, sourcing notes included. Order from Mouser/DigiKey/LCSC or find the same parts anywhere.
The guide: watch, don't decipher
- BUILD_GUIDE.md rewritten for v3.0 — two full video walkthroughs (PCB soldering and assembly to first power-on), photo-documented printing/bonding steps, a collapsible netlist-derived pin reference, and a dedicated OSC/Ableton build path.
- PCB ordering routed through the PCBWay shared project (no Gerber upload needed) — any fab works with the attached zip too.
Firmware
- One image for every board generation — v2.x and v3.0 share an identical pin map, so the browser flasher just works on both. No board selection to get wrong.
- Bigger preset library, sturdier engine — thirteen new presets from the June–July daily batch, three fresh custom-slot patterns, and a new PSRAM-first allocator (
PFMem) so a fully loaded pattern image can't starve the Wi-Fi/DMA DRAM budget.
Breaking changes
- v2.x boards and v3.0 cases are not interchangeable (and vice versa) — different board size, different port positions.
- Already own a v2.x build? Everything you need stays bundled at the v2.1.0 release, and the v2 guide lives on as
BUILD_GUIDE_v2.md. Bonus for v2 owners:hardware/case/legacy_v2/encloser_v2.1.stlis a newly verified snap-fit case for the v2.1 board — no gluing, no trimming.
Assets
patternflow_v3_case_stl_pack.zip— all v3 case STLs (256 mm kit, 330 mm one-piece, adjustable-mount variant, knob plates)patternflow_v3.3mf— Bambu Studio project (4 pre-arranged plates with print settings; same as the MakerWorld listing)patternflow_v3.0_gerber.zip— the verified boardpatternflow_v3_firmware.zip— prebuilt ESP32-S3 binaries (the browser-flasher image) with esptool offsets in the included READMEpatternflow_case.blend— Blender source for every printed part (stored in Git LFS; attached here so Download ZIP users get the real file)
Full details in the CHANGELOG.
Firmware & web: MIT · Hardware & designs: CC-BY-SA 4.0
Patternflow v2.1.0 — the v2.x consolidation release
This is the final consolidation release of the v2.x line before v3.0. If you're building a Patternflow today, this release is your baseline: grab it and everything — board, case, firmware, docs — is pinned to a known-good state.
Building one? Start here → BUILD_GUIDE.md
What to order / print
| Part | Use this | Notes |
|---|---|---|
| PCB | hardware/pcb/gerber/patternflow_v2.1_gerber.zip |
The recommended board. Reworked HUB75 routing + silkscreen fixes over v2.0. |
| Case (256 mm bed, P1S-class) | hardware/case/print-ready/ standard plates |
~10 h total on default P1S settings |
| Case (330 mm+ bed, H2S-class) | print-ready/variants/oneshot_v2_1/2.stl |
One-piece snap-fit body — no gluing. New in this release. |
| Firmware | Browser flasher at patternflow.work or firmware/patternflow/ |
experiment/ folder (v3.0 test Gerbers, divided-bed case STLs) or oneshot_v3-wip/ is unverified — do not order or print from those.
patternflow_v2.1_gerber.zip (attached below) and upload it to your fab yourself.
Highlights since v2.0.0
Hardware
- PCB v2.1 is now the pinned board revision: ESP32↔HUB75 routing reworked, silkscreen cleaned up.
- One-piece snap-fit enclosure for large-format printers (#113) — prints as a single body plus a snap-fit closing part, wall-mount hanger hole included.
- A divided version of the snap-fit design for 256 mm beds is modeled and staged in
experiment/(including the newv2.1_divided.stl) — print-testing is next.
Firmware
- Foundation refactor: patterns now render through
PFCanvaswith sharedcore_math/core_color/core_noiselibraries — custom patterns are cleaner to write and port. - Looks better on camera: gamma LUT, per-channel white balance, saturation boost, and ~240 Hz panel refresh (kills phone-camera flicker bands).
- Better knobs: encoder acceleration, K1 long-press brightness mode, K3 knob-map screen, fixed K1/K2 mapping and Bourns PEC11R direction.
- Two-way OSC with a versioned wire spec: knob/pattern/content control, ping/announce, auto-learned remote host.
- Wireless workflows: ArduinoOTA flashing and Improv-Serial Wi-Fi provisioning from the browser.
Ableton Live integration (new)
A Max for Live bridge device (integrations/ableton/) maps the four hardware knobs to any Live parameters over OSC — relative encoder deltas, per-slot sweep sensitivity, mappings saved with your Live set.
Web — patternflow.work
- Pattern Lab: in-app AI pattern generation (bring your own Gemini key), color ramp + v-field mode, and an Experiment tab that compiles a layer-stack patch straight to pattern code.
- Live Editor: much stronger C++ conversion prompt, preset library, pattern sharing links.
- Build globe: community builds from around the world, shown inside the 3D viewer.
Docs
- Build guide moved to the repo root with an all-through-hole BOM.
- Breadboard-only build path documented — you can try Patternflow with no PCB at all.
Full details in the CHANGELOG.
Known issues
easyfitmain plate STL is missing the LED-matrix divider slot — don't print it as-is (#154).- Divided (256 mm bed) snap-fit enclosure is not print-tested yet.
- LED matrix alignment bumps still need manual trimming (#4).
What's next: v3.0
v3.0 is in active development: a new snap-fit enclosure designed around a revised board with USB-C power (plus a beginner-friendly screw-terminal bypass), a rebuilt build guide, and a proper BOM. Early previews already live in this repo (gerber/experiment/, oneshot_v3-wip/) — follow #114 for the board.
Assets
Everything a v2.x builder needs, independent of repo state (the repo has since pivoted toward v3.0 — see #177):
patternflow_v2_case_stl_pack.zip— all known-good case STLs: standard plates, both knob sets, and the one-pieceoneshot_v2body. (Excludes the defectiveeasyfitvariant — #154 — and the untested divided prototypes.)patternflow_v2.1_gerber.zip— the last validated v2.x board.patternflow_v2_firmware.zip— prebuilt ESP32-S3 binaries (the browser-flasher image) with esptool offsets in the included README.patternflow_v1.blend— Blender source for the case (stored in Git LFS; attached here so Download ZIP users get the real file).
Firmware & web: MIT · Hardware & designs: CC-BY-SA 4.0
# Patternflow v2.0.0
Patternflow v2.0.0
The first release where everything lines up. Hardware, firmware, web, and docs all share one version line now. v1.x was firmware-on-v1-PCB with rough edges; v2.0.0 is the build the project was trying to be.
What's new
PCB v2 fixes the cold-boot issue. ESP32-S3's GPIO0 is a strapping pin, and on v1 it was left floating. After extended power-off the pin could leak into an indeterminate state and boot the module into serial download mode instead of firmware — the exact "boot failure" symptom that v1 builders kept reporting. v2 adds R13, a 10kΩ pullup, and fixes it at the PCB level. Silkscreen also cleaned up: R/C designators are now clearly distinguishable, and the encoder solder side is marked correctly.
Custom pattern workflow. A new doc — firmware/CUSTOM_PATTERNS.md — turns pattern creation into a five-step loop: describe a visual idea in plain language, paste it into an AI assistant, drop the JavaScript into the Live Editor at patternflow.work, tune the knobs, convert to C++, flash. No shader knowledge required. This is the bigger story of v2 — Patternflow becoming a pattern-making instrument, not just a hardware object.
Web platform is substantially complete. Browser flasher (Chrome/Edge), Live Editor with 3D preview, journal, build map. Site sections moved onto a new editorial design system — cream paper background, hairline rules, Inter + JetBrains Mono, no gradients.
Built-in patterns canonicalized as Origin and Wave Saw. Long-press encoder 4 to switch. Firmware v2 stays backward compatible with v1 hardware.
Docs rewritten. README leads with the AI-assisted pattern workflow and the build-from-files / wait-for-the-kit framing. BUILD guide updated to v2 PCB with R13, the cold-boot fix story, and reorganized known issues / design notes. PCB assembly photos added.
Compatibility
Firmware v2 runs on v1 hardware without changes. The only PCB-side change in v2 is R13. If your v1 unit boots reliably — especially likely with a genuine Espressif module — you don't need to upgrade the hardware. If your v1 unit needs a RESET press on cold boot, you can bodge R13 onto the v1 board; see Issue #16 for the procedure.
Credit
@idranoutof1d (Doyun) carried this release as much as I did. He identified the GPIO0 strapping-pin mechanism early in Issue #16, referencing Espressif's boot-mode documentation, and was right while I was chasing the wrong hypothesis. The Reddit comment from u/Infrated on r/AskElectronics is what finally closed the case, but Doyun had pointed at the same answer in the issue thread before that — and then went on to redesign PCB v2 itself, including the R13 placement, the silkscreen cleanup, and the rest of the layout fixes. Patternflow v2 carries his hands as well as mine.
Thanks also to the broader r/AskElectronics community for additional pointers on USB inrush spec and debugging methodology.
Still open
- The LED matrix rear has two small alignment bumps that still require manual trimming during assembly. A future case revision, planned alongside the LED diffuser variant, will add the geometry to accommodate them.
Links
- README — start here
- BUILD.md — full assembly guide
- CUSTOM_PATTERNS.md — make your own patterns
- patternflow.work — browser flasher, Live Editor, journal, build map
- Issue #16 — full GPIO0 debugging story
- Discord
v1.1.0 — Multi-pattern Update
This update consolidates multiple patterns into a single firmware and introduces a runtime pattern selection mode.
Firmware
- Refactored Modular Architecture: Patterns are now modularized (
pattern_*.h) and registered in a central registry. - Unified Input Handling: Introduced
InputFrameto share normalized encoder and button states across patterns. - Pattern Selection Mode: Long-press Encoder 4 (1 second) to enter/exit the pattern selection UI.
- New Pattern: Added
Wave1_Saw(rotated sawtooth waves with fractal noise distortion). - Improved Performance: Replaced macros with namespace-scoped constants and optimized LUT usage.
Web
- Consolidated Flasher: The web flasher now provides a single "PatternFlow OS v1.1.0" image containing all patterns.
- Simplified UI: Removed individual pattern buttons in favor of the all-in-one OS build.
What's Changed
- Dev by @engmung in #15
- Dev by @engmung in #21
- style: make mobile 3d viewer opaque to prevent text overlap by @engmung in #25
- docs: finalize v1.0 release info in README and update firmware upload… by @engmung in #26
- Dev by @engmung in #27
- docs: Add release process documentation by @engmung in #28
- build: Trigger Vercel deployment for v1.1.0 by @engmung in #29
- Dev by @engmung in #30
- fix: Add TypeScript declarations for ESP web tools custom element by @engmung in #31
- fix: Final TS build fix using constant bypass for Web Component by @engmung in #32
Full Changelog: v1.0.0...v1.1.0
v1.0.0 — Patternflow LED Synthesizer
The first publicly buildable version of Patternflow.
This is the result of about a month of work — from the first sine-wave patterns on a web simulator, to the LED matrix prototype shot in a park at midnight, to ten hours of soldering chasing what turned out to be a broken potentiometer, to a Reddit thread that got 1.6k upvotes, to a sponsored PCB run with PCBway, to this release.
Patternflow is an open-source LED synthesizer: four rotary encoders controlling generative light patterns on a 128×64 LED matrix, powered by ESP32-S3. It reinterprets Nam June Paik's Participation TV (1963) as an object you can keep at home — hang on the wall, set on a desk, play with your hands.
What's in this release
Hardware
- 128×64 px HUB75 LED matrix (P2.5)
- ESP32-S3-N16R8 (16MB Flash, 8MB PSRAM)
- 4× EC11 rotary encoders with push-switches
- Custom PCB (KiCad source + Gerber zip + schematic PDF)
- 3D-printed PLA case (Blender source + print-ready STLs)
- Powered by user-supplied USB power bank
Firmware
- Arduino-based firmware for ESP32-S3
- HUB75 DMA driver
- Default pattern set
- OTA support (wired upload recommended for v1.0)
Documentation
- Build Guide — full BOM and assembly walkthrough
- Roadmap — what's next
- AI agent harness (
.agents/) — the development methodology, also open-sourced
Known issues
This release ships with five known rough edges, all documented in BUILD.md §8. The most notable: the ESP32-S3 needs a reset button press once after power-up. Will be fixed in v1.1 with an EN-GND cap. PRs welcome.
What's next
- Web-based pattern editor and flasher (in development)
- v1.1 PCB revision with EN-GND fix and silkscreen cleanup
- Wall-mount case variant
- More patterns
License
- Firmware & web: MIT
- Hardware & designs: CC-BY-SA 4.0
- "Patternflow" is a trademark of SeungHun Lee
Acknowledgments
- PCBway — for sponsoring v1.0 PCB fabrication
- r/arduino community — the 1.6k-upvote thread that pushed this from a personal project toward open source
- Doyoon — for the suggestion that started the LED matrix direction
If you build one, I'd love to see it. Open an issue with photos, or just star the repo if it interests you.
— SeungHun

