Repository navigation
Improvement: the Octatrack Modwerk base and USB loading for everyone - #1428
Merged
Merged
Conversation
The Octatrack base path (module sets, the Your Octatrack hub, the USB link and sync dialog, the base install and its prompt) now has its own gate, hasOctatrackBase, released by one switch, OCTATRACK_BASE_RELEASED in src/config/octatrack-base.ts, which the Worker's base install prompt reads too (memberOctatrackBase). Beta modules, the beta-only Zoom pedal pages (hasBetaUi), the tester flag and invitations stay on the beta gate. The switch stays off, so nothing changes for anyone; USB_LINK now only marks a dev build. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
FUNC held at power-on opens Elektron's Startup Menu, so the FUNC skip needed a press after the startup animation began. The restore now also skips when PROJ (key 0x1c: row 3, bit 4 of the panel's held-key rows at 0x46100b18, the code status.c and scripts/device.mjs use) is held; FUNC keeps working. Same result and message (SKIPPED, MODULES SKIPPED). An MKI has no PROJ key. The host tests now model the key rows: FUNC and PROJ skip, PART (PROJ's neighbour in its row) does not, and a PROJ boot keeps the card's newest generation as a FUNC boot does. Docs, the overview's card line and the diagnostics label say PROJ or FUNC; the PROJ gesture is not yet run on hardware. The committed base is regenerated in the next commit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Units showed DSP stalls and failed self-tests with 14 to 20 modules, so an Octatrack set takes at most SET_MODULE_LIMIT (20) modules for now, from one constant in src/catalog/set-limit.ts. Every module counts, machine group members one by one; USB Audio (a base variant), stock-effect removals and the base do not. Other machines are not limited. Adding past the limit is refused in the workspace (toggleModule), and the library's add notes, the module page, the comparison and the set's tiles show it as unavailable with the reason. A saved, shared or imported set or a unit's inventory over the limit still loads whole; it cannot be synced (site review and sync in module-set.ts, the sync dialog), built as card firmware (cardBuildError, so the page, the build worker and the MCP alike) or pass the Worker's build-access check until trimmed, and each says its count. A smaller set still syncs to a unit that holds more. The sync dialog now checks paused modules with the member's real beta access, so Air Chorus no longer passes for a member who is not a beta tester, and the card build's refusal no longer says the base is in the beta. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Two hunks in shared files, kept apart for a hand merge: App wraps the
library's add notes with withSetLimit, and a library card shows a module the
full set cannot take as unavailable ("Full") like a USB-only one.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…amily and pre-link failures in diagnostics Server and contract for the Octatrack base release to everyone: identifier-free daily counts of the base install guide's steps and the diagnostics invitation's answers by placement (migration 0089, octatrack_count_daily, 30 days like the sync-action counts), a client field (browser and OS family) and link_failed in opted-in reports, and consent version 2026-11-11.1 so existing consents are asked again rather than widened. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… question after a failure DiagnosticsInvitation without onLeave offers Not now and Share diagnostics with equal weight; DiagnosticsGuideStep for the base install guide's last step; the gate asks once more after a failed sync or self-test or a fallback start (offerDiagnostics for other places), never while the unit is busy, and not for 30 days after a Not now to it. The collector adds the browser family to reports and records pre-link failures. The admin diagnostics show the install funnel and the share rate. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… and the new counts The privacy page names the browser and OS family and the pre-link failure reasons in opted-in reports, the 30-day Not now after a failure, and the identifier-free counts of USB sync actions, install-guide steps and invitation answers. APP_DEVELOPMENT.md names the new version, the re-ask and the guide step without growing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…unts and new report fields Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…stic The collector routes a link_failed link diagnostic through the same once-in-ten-minutes rule as reportLinkFailure, so octatrack-link.ts can report one without importing the community code. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
npm run octatrack:base -- --stock OS --beta --write with the reviewed GCC 16.2 (the same toolchain first reproduced the committed 500cdb6f base unchanged), then octatrack:module-packages --base-only: the five base-bound packages rebuild byte-identical and only their requiredBase follows the new identity. The lease entries did not move, so the controller trust rows and Analog BD's reviewed recipe are unchanged. Base 500cdb6f... -> 4854b76c2c340e52a6f629853d9292bf40c545c6f2aa6220d137d69f32f4c9f5 (package a749a8ef..., browser .bin 4a775e67...). Not yet run on hardware. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…about USB The Octatrack base install guide drops its beta framing and says how USB really works: the original OS has no Modwerk USB link, so the first install is the card file, copied in USB DISK MODE or with a card reader and installed with OS UPGRADE; every later update goes over USB, with the card as the fallback. The FAQ says the same, for the MKI and MKII. Problems go to the site's report forms (REPORT_PROBLEMS); beta modules and beta pages keep #beta-testers. The guide opens on a clear first view without a countdown, resumes at the card step it left after a reload, closes by itself when the unit already runs the current base, leads a visitor to sign in without holding up the install, and takes two integration props for the diagnostics stream: diagnosticsStep, its last view once the unit first connects on the new base, and onStage, told each stage (and one failure category) at most once per run. The recovery notice keeps its advice as BASE_RECOVERY_NOTICE; MODULE_SKIP_HINT holds the one sentence about starting without modules. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…les marked On Your Octatrack the whole-image card build becomes "Card firmware without the base", labelled Fallback and folded away where the browser can use USB: it is for browsers without WebUSB and for the modules with no USB package yet, named from the package list. A browser with USB is no longer pointed at it to sync a set. In the library, those modules say "Card only" on their cards, marked like "USB only", which loses its "in the beta". Setup keeps the way back to the install guide before a unit connects, and the Status line for skipped modules no longer names a key. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The install guide now opens on the Your Octatrack page, not anywhere on the site. The connected unit decides: the original OS opens it whatever the account says, a current base never does, and an older base still gets the one-step USB update wherever the member is. With no unit connected, the account's record is the hint for a member and this browser's for a visitor; a browser without WebUSB gets no guide. A signed-out visitor on Your Octatrack is led to sign in, and the page loses its Beta badge. App passes the guide's diagnosticsStep and onStage from one commented place, as placeholders. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The beta join prompt, the beta invitation and the testers' note now describe what stays in the beta (new modules first, the beta-only pages, #beta-testers) instead of USB loading, which is everyone's. Diagnostics after the note are offered with Not now instead of Leave beta, once per visit, and the confirmation for leaving says the Octatrack page, the base and USB sync stay once the base path is released. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…'s fallback Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…dio off
Owner, 11 November 2026: every member's base starts as USB MIDI alone. The
firmware worker builds MEMBER_LAYOUT ('off', the published variant patch)
when no module set asks for a layout; a set with the USB Audio module still
asks for its layout and the site switches the base over USB as before.
The committed package stays the twenty-channel layout: as the package,
'off' would patch four stock audio sites fewer than every other layout, and
octatrack-base.mjs refuses a variant that patches a site its default
leaves alone. No base bytes or identities change here.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…k-base-for-everyone
…sons it can report Each run of the guide now reaches countBaseInstall. The anonymous count takes exactly the guide's failure reasons (BaseGuideFailure is derived from BASE_INSTALL_FAILURES), and anything else is stored as other; link-timeout, which the guide never reports, is no longer one of them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A member who doesn't share diagnostics gets DiagnosticsGuideStep (still lazy) as the guide's last view once the unit connects on the new base. Once offered it stays until the guide closes, so the answer and Continue stay in view after sharing turns on. Not now in the guide is stored as the answer to the first-connection invitation as well, so that one doesn't follow, on this visit or the next. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e or stopped audio The guide's USB update failure path and the hub's DSP_STOPPED line now offer the one question after a failure (offerDiagnostics), the stall once for each base and running set, as the privacy page already says. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
octatrack-link.ts sends link_failed through its own diagnostic channel: no-device when the device picker closes without an Octatrack, permission-denied when opening is refused (standing in for that attempt's open-failed), and no-webusb when the member connects or opens the install guide in a browser without WebUSB. Nothing before a link exists has a timeout, so link-timeout leaves the contract, the invitation's "What gets shared" and the privacy page. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…to set" says when it can't Filling an empty set from the Octatrack adds every module at once, as an import does (workspace.addModules), so a unit with more than 20 gives a set that shows the over-limit message instead of one cut off at 20. The project's missing modules are added all or none: past the limit the note says how many are too many instead of adding some of them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ad the base With the base path released, a visitor or member who never had the Modwerk base (the guide's own authority: a connected unit, the account's record or this browser's) is greeted once on the Octatrack's pages: what is new, the way there in three steps, what it needs and the way back. "Set up my Octatrack" opens the install guide on Your Octatrack; "Build card firmware instead" opens the card fallback in Setup, and is the main button in a browser without WebUSB. Every build and sync button leads to Your Octatrack, so it is met there first; once answered it stays away in this browser (there is no per-member record without a new table) and can be read again from Setup. The guide and the beta invitation keep away while it is due and on the visit it opened. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A member who goes straight into the guide (the sidebar's or Setup's Install the base) is past the welcome: it doesn't follow once the guide closes, nor on the next visit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…esters, asked once Nothing passes onLeave any more, so the invitation's beta-requirement branch, its "Needed for the beta" line and its test go. A tester whose consent predates the current version gets the ordinary dismissible invitation once: a Not now to it, or to the invitation anywhere else, is remembered in this browser like the first connection's (invitationAnswered in diagnostics-sharing.ts), instead of it coming back on every visit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
BetaReportReminder now shows only in a report about a beta module (a module's own form, or a set holding one), and says that the base, a sync and released modules belong in the site's forms. The Digitakt and Digitone form drops it: none of their mods is a beta module. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A base that started its previous one asks for a report through Your Octatrack instead of #beta-testers; a base without live load asks for the current base, not a "beta base"; Samples is a work in progress, not beta. Comments that said who reaches the hub, the sidebar card or the module set words name the base path, and the card record's key is no longer named FUNC. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t and welcome in APP_DEVELOPMENT The changelog entry says what members get, what is newly counted or shared and the known limits. APP_DEVELOPMENT names the 20-module limit and the welcome, says the sync keeps at once (no self-test or undo in it), that the link reports link_failed and that testers get the ordinary invitation once; stale lines make room so the file doesn't grow. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With the switch off, a member outside the base path who picks a module that needs the base is told that loading modules over USB isn't open to everyone yet, instead of only "take it out": the frontend MCP's catalogue test expects the refusal to name USB, and it was red since the gate commit. With the switch on, everyone gets the sync advice. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
OCTATRACK_BASE_RELEASED is on: the Modwerk base, Your Octatrack, USB sync, module sets and the guided base install reach every visitor and member, on the site and in the Worker. The server test of the prompt before the release now pins the switch off itself; the released behaviour has its own test. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…the buttons Co-Authored-By: Claude <noreply@anthropic.com>
… every machine's pages Co-Authored-By: Claude <noreply@anthropic.com>
…r-everyone # Conflicts: # src/components/OctatrackOverview.tsx
…et asks for The base dialog takes the layout of the set being synced or edited when no other layout is asked for: a set with the USB Audio module gets its layout in one update (or one first install from the card), instead of USB Audio off and a second update. Without the module the base installs with USB Audio off, and an update from a base that had USB Audio, or one the site can't tell, says so before it runs. The previous base's seven identities (500cdb6f…) are known for this one transition only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…le here again workspace.addModules, which fills a set from the unit since the module limit, skipped the availability check toggleModule has: paused modules, and beta modules on a former tester's unit, entered the set. They stay out again and show as leaving, as before. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…unit Since the base path opened to everyone, the library offered USB-only modules and the card build pointed to USB sync in Firefox, Safari and on phones too. Both now follow whether this browser can use the USB link here (WebUSB on a computer, browserHasUsb, the check the welcome already made): without it the module is marked USB only and refused at the add, and the card build's refusal says to open Modwerk in Chrome or Edge on a computer. Nothing changes in a browser with USB. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The hub and the install guide said signing in keeps the Octatrack's setup with the account. Module sets live in this browser; an account lets a member report problems, share diagnostics if they choose, and lets the site remember that their Octatrack has the base. The guide now says signing in is optional. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… a busy unit After the consent version bump every earlier consent lapsed, and the same visit can bring the base update prompt: the offer could open over the update window mid-update. It now waits, as the welcome and the re-ask do, until no other dialog is open and nothing runs on the unit (unitBusy, shared with the re-ask). The owner's note itself still opens over anything. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…han 20 can't all go back A unit that held more than 20 modules starts empty on the new base, and the put-back sync was refused with only the generic over-limit message. It now says how many the Octatrack had before the update, that 20 is the limit for now, and to choose which to put back. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…xactly as seen Edge case 15 records the owner's MKII results: MODULES SKIPPED with PROJ held through a RAM boot of the new base's development twin (513be133…), PROJ at power-on on the previously flashed base starting normally, and the off layout (d891acb3…) RAM-booted and answering status. Not done: the new base flashed, PROJ from a cold power-on on it, any MKI, the off layout's audio and MIDI on a host. The layouts' evidence file gets a dated line for the off layout. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…confirmed Hold PROJ while you switch it on, and on an MKI, which has no PROJ key, press and hold FUNC as soon as the startup animation begins (case 15, done on hardware 12 October). The comment names what was seen on hardware and what wasn't. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
For a visitor the install guide opens by itself on each visit until this browser reads a unit with a base, and every opening sent base_guide_opened, so the count measured visits. An automatic opening now counts once per browser and published base (a small localStorage flag); one the member opens always counts. The admin read-out says these are openings, not people. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…other fixes The PROJ base's entry states plainly that USB Audio is off by default, that a set with the USB Audio module keeps its layout through an install or update, and what an existing tester streaming audio should do before updating; the MKI's FUNC gesture is given as the hint gives it. The release entry adds the USB-only refusal in browsers without USB, the put-back limit note, that signing in is optional and module sets stay in the browser, and how automatic guide openings are counted. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ly that The check that Setup names no FUNC key predates the hint's MKI wording. FUNC held from power-on opens Elektron's Startup Menu, so the check stays for everything but the hint, and the hint may name FUNC only as pressed once the startup animation begins. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…agnostics needs an account Co-Authored-By: Claude <noreply@anthropic.com>
…rolling Tighter type on a first view; in a short window the features keep only their headlines and the picture shrinks, then goes. Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
… the firmware build gate The same rule and prompt as the card build (MemberGate): a verified member with a username passes; anyone else meets "Sign in to build firmware", which a guest may skip after five seconds, once for the page. Signing in from the guide sets it aside and opens it again at its steps on the page it was left from. No server call was added: /api/auth/build-access checks module ids only, and the base has none. Not yet in this commit: tests for the gate, the APP_DEVELOPMENT sentence, pr:ready. Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
…welcome picture - Diagnostics without an account: consent and reports under the hash of a random ID the browser makes only on Share (migration 0090), with limits per ID and address; stopping deletes both. Privacy page, consent texts and docs updated. - The install guide's last step leads with why a report helps; Share diagnostics is the main button (owner, 11 November 2026) and Continue waits for an answer. - The welcome and the guide's first view are wider with a larger picture. - Setup: the Modwerk base section stands out; What's new reopens the welcome with a base installed; the unfinished Samples page is off the list. Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Claude <noreply@anthropic.com>
repeat98
marked this pull request as ready for review
November 11, 2026 16:51
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What this does
Releases the Octatrack Modwerk base and loading modules over USB to every member and visitor, and ships the base that goes with it. Merging this deploys the release.
Site
hasOctatrackBase, switchOCTATRACK_BASE_RELEASED, now on). Beta modules and the Zoom beta pages stay behind the beta gate.SET_MODULE_LIMIT); a longer set opens but cannot be synced or built until trimmed. Also checked in/api/auth/build-access.0090) under the SHA-256 of a random ID the browser makes only on Share and keeps inlocalStorage. Same validation, retention and limits as a member's, plus limits per address. Stop sharing under Setup deletes the reports, the consent and the ID. The owner's view lists them asguest:and eight characters.0089. New consented fields: browser and OS family, and why a connection failed. Consent version2026-11-11.1; privacy page updated in English and German.Base
4854b76c…: holding PROJ, or FUNC, when the module restore runs skips it.MEMBER_LAYOUT). A set that contains the USB Audio module gets its layout in the same install or update. The update dialog says so when USB Audio is about to go off.Checks
npm run pr:readyon the final state: Check passed (3128 tests passed, 6 skipped,sdk:checkpassed), "Ready". New tests: a visitor's consent, report, listing and deletion on the server with the CORS preflight, and the guide's last step for a visitor. Visitor consent was also tried withcurlagainst the local Worker.An independent review of both halves was run; its findings are fixed in this branch (layout kept on update, paused modules kept out of "Start from what's on it", USB-only modules refused in browsers without USB, account wording, stacked dialogs, the put-back limit message, guide counts).
Guides: they still described the Octatrack base path, USB loading and diagnostics as beta-only, and did not say which layout a base install without one gets. Fixed in
docs/APP_DEVELOPMENT.md(thehasOctatrackBasegate, consent version, daily counts),docs/module-guides/midi-usb.md(theoffdefault),docs/OCTATRACK_MODULE_EDGE_CASES.mdandsdk/machines/octatrack/elekloader/README.md.On hardware (owner's MKII, 11 November 2026)
offlayout of the new base, built through the site's path and RAM-booted: started and answered over the USB link.Not tested
offlayout's MIDI and audio behaviour on a host.Before merging
PREVIOUS_IDENTITIESinsrc/engine/elekloader/base-variants.tscovers only the step from500cdb6f…and should come out with the next base.src/components/OctatrackHub.test.tsnow allows FUNC in Setup only inside the skip hint's MKI wording.0090to production.🤖 Generated with Claude Code