Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
101 commits
Select commit Hold shift + click to select a range
a22659d
Add horizontal desktop printed enclosure and assembly instructions. S…
mbchars Oct 10, 2026
5c8e0be
tools: case-models builds mbchars' horizontal desktop case
claude Oct 10, 2026
646331c
web: /build's case switch and 3D preview get a fourth case, mbchars' …
claude Oct 10, 2026
dd528bc
docs: changelog for mbchars' horizontal desktop case and the fourth p…
claude Oct 10, 2026
9b64efd
Merge pull request #489 from Patternflow-lab/upstream/horizontal-desktop
engmung Oct 10, 2026
5ffe66e
Merge pull request #490 from engmung/dev
engmung Oct 10, 2026
06066c0
web: ZuperZuche's build joins the map - the first print, from Moscow
engmung Oct 10, 2026
a3bb6fa
web: the 3D preview names whose case it is, in the build map's label
engmung Oct 10, 2026
511e776
Merge pull request #491 from engmung/dev
engmung Oct 10, 2026
04062dc
web, docs: the first flash starts in download mode, /flash goes to th…
claude Oct 12, 2026
9a68428
docs: the README opens with the fixed lines and three ways in, and Fi…
claude Oct 12, 2026
c894a5f
docs: BUILD_GUIDE flashes in the Play guide's order, and the README's…
claude Oct 12, 2026
a5cbba9
Merge pull request #492 from Patternflow-lab/claude/patternflow-upstr…
engmung Oct 12, 2026
8955feb
## What changed
engmung Oct 13, 2026
94153d3
Merge pull request #493 from engmung/dev
engmung Oct 13, 2026
ffde537
docs: the cleanup has a baseline
patternflow-bot Oct 14, 2026
387487d
docs: cleanup step 1 is planned
patternflow-bot Oct 14, 2026
b55d59a
docs: the v2 build guide moved to `docs/legacy/BUILD_GUIDE_v2.md`
patternflow-bot Oct 14, 2026
e8519b4
docs: the doc map lists the Korean/English pairs
patternflow-bot Oct 14, 2026
6479937
docs: the doc map reads the YAML under `.github/`
patternflow-bot Oct 14, 2026
067b400
docs: `CHANGELOG.md` is split by release into `docs/releases/`
patternflow-bot Oct 14, 2026
d610762
docs: the community files moved to `.github/` and the audio guide to
patternflow-bot Oct 14, 2026
fb502f7
docs: cleanup step 2 is planned
patternflow-bot Oct 14, 2026
e877cf5
docs: cleanup step 3 is planned
patternflow-bot Oct 14, 2026
2d1029d
docs: the project's writing voice is written down
patternflow-bot Oct 14, 2026
d91857d
docs: cleanup step 4 is planned
patternflow-bot Oct 15, 2026
338bd35
docs: the docs index and the repository map catch up with step 1 of the
patternflow-bot Oct 15, 2026
58827ff
docs: cleanup step 5 is planned
patternflow-bot Oct 15, 2026
c46ffb1
web: `check:features` fails when /features and the feature folders
patternflow-bot Oct 15, 2026
e521f54
web: `check:links-absolute` fails on a GitHub link into the repository
patternflow-bot Oct 15, 2026
008fb81
hardware: `check:bom` and `check:bom-schematic` hold the BOM to the
patternflow-bot Oct 15, 2026
2848040
web: `check:editions` fails when the shelf and the bundles disagree
patternflow-bot Oct 15, 2026
383ab39
web: `check:presets` fails when a web preset cannot reach a panel
patternflow-bot Oct 15, 2026
2b2c084
web: `check:human-lock` fails a pull request that changes a word of the
patternflow-bot Oct 15, 2026
c10db85
web: `check:changelog` fails when `CHANGELOG.md` and `docs/releases/`
patternflow-bot Oct 15, 2026
4a5599b
web: every pull request runs the drift checks and the text lock
patternflow-bot Oct 15, 2026
85d261b
web: `check:roadmap` fails when a /roadmap node and its issues disagree
patternflow-bot Oct 15, 2026
01b2621
docs: the contributor docs say what CI runs on every pull request
patternflow-bot Oct 15, 2026
d81870c
web: `check:voice` points at the habits of generated prose, line by line
patternflow-bot Oct 15, 2026
d2d6e54
docs: `AGENTS.md` carries the writing-voice rule and the step 2 check
patternflow-bot Oct 15, 2026
f7d005b
docs: the doc map is regenerated at the close of step 2 of the cleanup
patternflow-bot Oct 15, 2026
9aa6921
web: five of the site's twelve lint warnings are gone
patternflow-bot Oct 15, 2026
5e8a223
web: the seven `<img>` lint warnings carry a named exception
patternflow-bot Oct 15, 2026
de7f61f
docs: where the panel size lives, line by line
patternflow-bot Oct 15, 2026
3f4903d
web: pattern Lab's July storage keys say who wrote them and when
patternflow-bot Oct 15, 2026
85989c1
web: the site's redirects and old routes say what links them
patternflow-bot Oct 15, 2026
e009c14
web: web CI fails on a lint warning
patternflow-bot Oct 15, 2026
e3ee779
firmware: the MIDI page counts 24 detents a turn, as the encoder has
patternflow-bot Oct 15, 2026
04aa6bb
web: the community's old formats say what wrote them and when
patternflow-bot Oct 15, 2026
2f301a2
firmware: the vendored HUB75 driver names the upstream commit it came
patternflow-bot Oct 15, 2026
d67355a
firmware: the vendored HUB75 driver takes upstream's fix for its config
patternflow-bot Oct 15, 2026
a9b8d3d
web: a new TODO or FIXME turns the drift checks red
patternflow-bot Oct 15, 2026
1dc3f5f
web: one file holds the values the firmware and the site both carry
patternflow-bot Oct 15, 2026
bdd7caa
docs: the any-resolution RFC has a draft
patternflow-bot Oct 15, 2026
3f6e659
docs: the Linux player has a draft RFC
patternflow-bot Oct 15, 2026
c24639e
firmware: the firmware reads the values it shares with the site from
patternflow-bot Oct 15, 2026
4e3ed53
web: the site's lint and test tooling is on its latest releases inside
patternflow-bot Oct 15, 2026
9b9d584
docs: `AGENTS.md` names `shared/`, the HUB75 driver's `UPSTREAM.md` and
patternflow-bot Oct 15, 2026
c204efe
docs: the two step 5 drafts are listed in `docs/README.md`
patternflow-bot Oct 15, 2026
b571af4
web: the site reads the panel size and the knob numbers from
patternflow-bot Oct 15, 2026
d6e6afd
web: drizzle is on its latest patch releases
patternflow-bot Oct 15, 2026
e39bf7e
docs: the repository maps catch up with step 3
patternflow-bot Oct 15, 2026
0606528
web: tailwind is on its latest 4.x release
patternflow-bot Oct 15, 2026
35eb866
web: react Three is on its latest releases inside the current majors
patternflow-bot Oct 15, 2026
dafbdf9
web: zustand is on its latest release inside the current major
patternflow-bot Oct 15, 2026
0224ca2
web: mediabunny is on its latest release inside the current major
patternflow-bot Oct 15, 2026
709326a
web: changes from Patternflow-lab/Patternflow#63
patternflow-bot Oct 15, 2026
0cb5974
web: posthog-js is on its latest release inside the current major
patternflow-bot Oct 15, 2026
b462bf8
web: better-auth is on its latest release inside the current major
patternflow-bot Oct 15, 2026
215f80b
web: react is on its latest release inside the current major
patternflow-bot Oct 15, 2026
9f53268
web: next is on its latest release inside the current major
patternflow-bot Oct 15, 2026
79a6285
docs: the doc map is regenerated at the close of step 3 of the cleanup
patternflow-bot Oct 15, 2026
275b13b
web: the guide's simulated board takes input that no hand made
patternflow-bot Oct 15, 2026
e03912e
tools: a virtual panel for the contract vectors
patternflow-bot Oct 15, 2026
30f06c9
tools: the virtual panel answers device state over REST
patternflow-bot Oct 15, 2026
ad5a775
tools: the virtual panel answers the pattern routes
patternflow-bot Oct 15, 2026
f89b763
tools: contract vectors have a format and a replay
patternflow-bot Oct 15, 2026
43b196f
web: `check:virtual-panel` runs every preset on the virtual panel
patternflow-bot Oct 15, 2026
d0e0644
tools: the virtual panel speaks MQTT
patternflow-bot Oct 15, 2026
b532c6f
tools: the virtual panel answers `/api/mqtt`
patternflow-bot Oct 15, 2026
1d9f519
tools: the virtual panel speaks OSC
patternflow-bot Oct 15, 2026
72152a3
docs: the REST contract has its first vectors
patternflow-bot Oct 15, 2026
4621694
docs: the MQTT contract has its first vectors
patternflow-bot Oct 15, 2026
59f575b
tools: oSC has contract vectors
patternflow-bot Oct 15, 2026
5605d26
docs: the REST vectors reach the rest of the core
patternflow-bot Oct 15, 2026
0c3c654
docs: the MQTT vectors reach the channels and the snapshot, and
patternflow-bot Oct 15, 2026
d4ed6bc
tools: the virtual panel takes the audio WebSocket
patternflow-bot Oct 15, 2026
e904385
tools: the virtual panel speaks RTP-MIDI
patternflow-bot Oct 15, 2026
0114653
tools: the audio WebSocket has contract vectors
patternflow-bot Oct 15, 2026
dbf408f
tools: the virtual panel sends MIDI back
patternflow-bot Oct 15, 2026
c976b7a
tools: mIDI has contract vectors
patternflow-bot Oct 15, 2026
543cb17
tools: mIDI out and `/api/midi` have contract vectors
patternflow-bot Oct 15, 2026
d349429
docs: the maps of the tree name the virtual panel and the contract
patternflow-bot Oct 15, 2026
d66684c
docs: the REST and MIDI specs say one thing where they said two
patternflow-bot Oct 15, 2026
483cd63
docs: `AGENTS.md` names the virtual panel, the contract vectors and
patternflow-bot Oct 15, 2026
7d06487
docs: the doc map is regenerated at the close of step 4 of the cleanup
patternflow-bot Oct 15, 2026
b6c1fae
docs: changelog for 81 workshop fork PRs
Oct 15, 2026
3b6e014
big cleanup
engmung Oct 15, 2026
216cac7
시작 — 정리 마지막 기록을 원래 레포 dev 위에 다시 짠다
claude Oct 16, 2026
fad02d5
docs: the doc map lists the six links the cleanup's closing entry adds
claude Oct 16, 2026
8566dc6
fork main 을 merge 한다 — 충돌 12곳은 원래 레포 dev 쪽을 둔다
claude Oct 16, 2026
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
2 changes: 1 addition & 1 deletion CODE_OF_CONDUCT.md → .github/CODE_OF_CONDUCT.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ This applies everywhere Patternflow people meet: this repository (issues, pull r

## How we treat each other

The rule was written before there was anything to build, as a short poem, and it is the sixth section of the [manifesto](docs/manifesto.md#6-how-we-treat-each-other). In full:
The rule was written before there was anything to build, as a short poem, and it is the sixth section of the [manifesto](../docs/manifesto.md#6-how-we-treat-each-other). In full:

> 아무것도 몰라도, 하고자 한다면 만들 수 있습니다.
> 도와주는 게 당연합니다. 고마운 게 당연합니다.
Expand Down
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ contact_links:
url: https://discord.gg/Vr9QtsxeTk
about: New here? Join the server, then jump into the channels above.
- name: Getting help — every venue in one table
url: https://github.com/engmung/Patternflow/blob/main/SUPPORT.md
url: https://github.com/engmung/Patternflow/blob/main/.github/SUPPORT.md
about: Where to ask what, including the venue that works where Discord is blocked.
- name: Contributing guide
url: https://github.com/engmung/Patternflow/blob/main/CONTRIBUTING.md
Expand Down
2 changes: 1 addition & 1 deletion SECURITY.md → .github/SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ Please report privately through [GitHub's report form](https://github.com/engmun

## What is a documented trust model, not a vulnerability

The device's HTTP server on the LAN has **no authentication**: anyone on the same network can call any `/api/*` route, including `POST /update`. The same holds on the panel's own hotspot (`patternflow-xxxx`, raised when it finds no network it knows), whose password is the documented default `patternflow` until it is changed on the Wi-Fi page. This is deliberate and documented in [docs/rest-api.md](docs/rest-api.md#transport) — the panel is an instrument on a home or venue network, with the same posture as ArduinoOTA's default. `PF_WEBUPDATE_ALWAYS_ARMED 0` is the one lever that narrows `/update`; the hotspot takes its own password, or is switched off, on the Wi-Fi page. Reports that amount to "the LAN API is open" will be closed with a pointer here; reports of a way to reach that API from *outside* the LAN, or from a web page on another origin, are in scope.
The device's HTTP server on the LAN has **no authentication**: anyone on the same network can call any `/api/*` route, including `POST /update`. The same holds on the panel's own hotspot (`patternflow-xxxx`, raised when it finds no network it knows), whose password is the documented default `patternflow` until it is changed on the Wi-Fi page. This is deliberate and documented in [docs/rest-api.md](../docs/rest-api.md#transport) — the panel is an instrument on a home or venue network, with the same posture as ArduinoOTA's default. `PF_WEBUPDATE_ALWAYS_ARMED 0` is the one lever that narrows `/update`; the hotspot takes its own password, or is switched off, on the Wi-Fi page. Reports that amount to "the LAN API is open" will be closed with a pointer here; reports of a way to reach that API from *outside* the LAN, or from a web page on another origin, are in scope.

## Supported versions

Expand Down
4 changes: 2 additions & 2 deletions SUPPORT.md → .github/SUPPORT.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@ One table for "where do I ask". Issues are for things that change this repositor
| :--- | :--- |
| Learn to build, play, make patterns for one or give it sound and MIDI | [The guide](https://patternflow.work/guide) — each step on a 3D Patternflow in the browser. A step that didn't get you through has a **Stuck here?** link, which opens an issue with that step filled in |
| Get unstuck building, soldering or flashing | [Discord → hardware-help](https://discord.com/channels/1497757947827327067/1499907910707187833) — photos and quick back-and-forth |
| Flash the DevKit for the first time, or get the panel onto Wi-Fi | [The Play guide's Flash chapter](https://patternflow.work/guide/play#flash), or [`BUILD_GUIDE.md` §8](BUILD_GUIDE.md#8-firmware) in writing. The short version is below the table |
| Flash the DevKit for the first time, or get the panel onto Wi-Fi | [The Play guide's Flash chapter](https://patternflow.work/guide/play#flash), or [`BUILD_GUIDE.md` §8](../BUILD_GUIDE.md#8-firmware) in writing. The short version is below the table |
| Show a pattern I made, or get feedback on one | Publish it from the [Pattern Lab](https://patternflow.work/pattern-lab) to the [Community](https://community.patternflow.work/community), then [Discord → patterns](https://discord.com/channels/1497757947827327067/1499908302962819236) |
| Put my finished build on the [build map](https://patternflow.work/inside) | [Share your build](https://github.com/engmung/Patternflow/issues/new?template=share_build.yml) — or post it in Discord |
| Talk about where the project should go, or find people working on the same direction | [Discord](https://discord.gg/Vr9QtsxeTk) — the dev-log and the project channels |
| Report a bug, a wrong or missing doc, or propose a feature | [New issue](https://github.com/engmung/Patternflow/issues/new/choose) — pick the template |
| Report a security problem | [SECURITY.md](SECURITY.md) — privately, not as an issue |
| Contribute code, hardware files or docs | [CONTRIBUTING.md](CONTRIBUTING.md) |
| Contribute code, hardware files or docs | [CONTRIBUTING.md](../CONTRIBUTING.md) |

**The first flash, in short.**

Expand Down
70 changes: 70 additions & 0 deletions .github/workflows/drift.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
name: Drift checks

# The tree keeps some facts in two places by hand: the BOM and the build
# guide's parts table, a card on /editions and a folder under
# firmware/bundles/. Each check in web/scripts/drift/ compares one such pair
# and prints both sides when they part (docs/rfc-cleanup.md §2.4). check:ci
# runs them too, but Web CI starts only on web/ and hardware/case/. A pull
# request that edits only the BOM, a bundle or the changelog runs no web job,
# and that is the pull request a drift check is for. So this one runs on every
# pull request.
#
# PF_DRIFT_STRICT=1 turns a skip into a failure. At a desk a check skips a side
# it cannot read: a tag the clone lacks, no pdftotext, no gh login. Here every
# side can be read, so a skip means this file is missing something.
# fetch-depth: 0 brings the tags the absolute links point at, and the base
# commit check:human-lock compares with.
on:
pull_request:
push:
branches: [main]

concurrency:
group: drift-${{ github.ref }}
cancel-in-progress: true

permissions:
contents: read
issues: read

jobs:
check:
runs-on: ubuntu-latest
defaults:
run:
working-directory: web
env:
PF_DRIFT_STRICT: "1"
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0

- uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
cache-dependency-path: web/package-lock.json

- name: Install dependencies
id: deps
run: npm ci

# check:bom-schematic reads the schematic's text layer with pdftotext,
# which the runner image does not carry.
- name: Install pdftotext
run: command -v pdftotext || { sudo apt-get update -q && sudo apt-get install -y -q poppler-utils; }

# check:roadmap asks gh for the state of each issue a roadmap node names.
- name: Drift checks
run: npm run check:drift
env:
GH_TOKEN: ${{ github.token }}

# Not a word of the maintainer's own writing changes (§2.9). It runs
# after a red drift step too, so one push shows both.
- name: Locked text
if: ${{ !cancelled() && steps.deps.outcome == 'success' && github.event_name == 'pull_request' && hashFiles('web/scripts/human-lock.ts') != '' }}
run: npm run check:human-lock
env:
PF_LOCK_BASE: ${{ github.event.pull_request.base.sha }}
5 changes: 3 additions & 2 deletions .github/workflows/web-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,10 @@ jobs:
- name: Install dependencies
run: npm ci

# Lint is a hard gate: lint errors can't reach main (warnings still pass).
# Lint is a hard gate, and a warning fails it like an error. The cleanup's
# step 3 took the site from twelve warnings to none; one more fails here.
- name: Lint
run: npm run lint
run: npm run lint -- --max-warnings=0

# `next build` type-checks only what it bundles; scripts/ and the smoke
# suites are outside that, and a type error there used to surface as a
Expand Down
Loading
Loading