-
v0.1.0
Stablereleased this
2026-10-14 14:34:11 +00:00 | 63 commits to main since this releaseFeatures
*: Add Rust HID transport, protocol codec, session and read-only CLIctl: Show preset grid positions from list ordercatalog: Add empty cortex-catalog cratecatalog: Decode the model repository into a catalogcatalog: Resolve cloned models in the catalog*: Hand the model repository from the handshake to the callerctl: Name preset blocks from the model catalogctl: Name preset params and show step labelsctl: Show Neural Capture names and drop string keysctl: Leave out empty slots and hidden params in preset outputctl: Use the model catalog in cortexctl presetctl: Name IR loader blocks after their IRcatalog: Add the ModelRepo symbol table to the catalogcatalog: Keep units and display attributes per catalog paramcatalog: Convert normalized param values to real values and textctl: Show preset params in real unitsctl: Warn about catalog symbols the table doesn't knowcatalog: Label the EQ filter type paramscatalog: Give catalog params their steps and value textctl: Use the catalog's value text in preset outputsession: Tell whether the device firmware is verifiedstate: Add cortex-state with a preset grid view*: Map catalog categories to UI categoriesctl: Print presets from the shared preset viewstate: Keep a device state current from device messagesstate: Merge partial grid updates into the device state*: Turn session events into traffic recordsstate: Dump a capture's preset view as JSONstate: Merge port changes from partial grid updatesapp: Add the cortex-app crate with an empty windowsession: Let a session be closed through a shared referenceapp: Add the device managerapp: Play a recorded capture as a mock deviceapp: Connect the device manager to the frontendapp: Add the Svelte frontend projectapp: Add design tokens and category iconsapp: Add the frontend's device and traffic storesapp: Show the live device state in the windowapp: Add the UI store and a shortcut registryapp: Add the Knob and numeric entryapp: Add the remaining UI primitivesapp: Tell the frontend which firmware is verifiedapp: Draw the Gridapp: Add the read-only parameter editorapp: Add the app shellapp: Make blocks square and split Grid and editor for good*: Draw the split where the device shows itapp: Retry permission errors instead of waiting for the userstate: Name the input and output portsstate: Give rows' inputs and outputs their port namesctl: Print port names in cortexctl presetapp: Show port names on the Gridstate: Carry each param's real value in the viewapp: Pick the editor view by EQ model idapp: Compute the EQ response curveapp: Add the EQ band cardapp: Add the parametric EQ viewapp: Add the graphic EQ viewapp: Show EQs in their own view in the editorstate: Carry the shown scene in the preset viewstate: Let the state preview a sceneapp: Add the view_scene commandapp: Pass viewScene from the store to the sourceapp: Add the scene panelapp: Show the scene panel on the right of the editor dockapp: Show a preview hint over the Gridapp: Remove the scene dropdown from the top barapp: Name the scene panel without an idstate: Merge the bypass scene modestate: Build edit messages in the statestate: Apply edits to the state locallysession: Let the session send allowed writes*: Add write commands to cortexctlapp: Give the manager's link a write call*: Send the user's edits from the managerapp: Drop stale echoes of the app's writes*: Add the edit command to the app's IPCapp: Pass edits from the store to the sourceapp: Make param controls editableapp: Edit the open block from the editorapp: Add a Follow scenes menu to params and bypassapp: Switch the device to the previewed scene*: Let the session send undo, redo and preset savesstate: Follow the preset location, undo history and loadsstate: Keep the user's preset list in the statestate: Build undo, redo, save, save as and load in the state*: Add cortexctl presetsctl: Add undo, redo, save and save-as to cortexctlapp: Read the location, preset list and undo history on connectapp: Send undo, redo, save, save as and load from the managerapp: Add the action command to the app's IPCapp: Pass actions from the store to the sourceapp: Add undo, redo and save shortcutsapp: Add Undo, Redo, Save and Save As to the top barapp: Add a slot list for the preset folderapp: Open the preset list from the preset nameapp: Add the Save as dialogapp: Clear the selection when the device loads a presetapp: Show a dash for a preset without a namecatalog: Read hidden, internal and plugin flags from the catalogcatalog: List the models the browser offers, with their tagssession: Let the session add and remove blocksstate: Apply removed blocks and whole blocks to the statestate: Keep the IR and capture libraries and the favoritesstate: Build add, remove, set IR and set capture in the state*: Add cortexctl models, irs and capturesctl: Add cortexctl add-block, remove-block, set-ir and set-captureapp: Read the favorite models and captures on connectapp: Send block actions and say when the device does not take oneapp: Give the browser's model list from the manager*: Add the browser_models command and the new types to the bindingsapp: Fetch the browser's model list once per connection*: Add the model browserapp: Add blocks from the "+" of an empty slotapp: Replace a block with "Change model"app: Remove blocks with Delete and a block context menuapp: Pick IRs and captures in the editor*: Load empty slots from the preset list*: Name the capture blocks like the official appcatalog: Convert a real value back to a normalized onecatalog: Turn typed text into a param value*: Give each param view its stepstate: Turn typed text into a value for a preset paramtui: Add the cortex-tui cratetui: Run the terminal app's event looptui: Add the key table, the help overlay and the hint linetui: Lay out the screen with the top bar and the banner linetui: Say which size the terminal app needstui: Draw the Grid with power icons and markerstui: Show connection states, the firmware line and noticestui: Move the Grid cursor with hjkl, arrows, 0 and $tui: Jump between the parts with F-keys and g keystui: Draw the editor for the item at the Grid cursortui: Say in one place why an edit or action can't happentui: Step values in the editortui: Add the fuzzy pickertui: Type values and pick options in the editortui: Follow scenes with s and bypass from the Grid with Spacetui: Draw the scene panel in two columnstui: Preview and switch scenes from the scene paneltui: Add the model browsertui: Add, change and remove blocks from the Gridtui: Pick IRs and captures in the editortui: Load presets from a pickertui: Undo with u and redo with Ctrl-Rtui: Save and save as from the command linetui: Pick a device with F12tui: Scroll the help and describe saving and mock modetui: Fit the screen at 90 by 26tui: Draw 3-column gaps and let names grow with the terminaltui: Draw the routing lines of splits and mixestui: Stop the Grid cursor on splitters and mixerstui: Show splitters and mixers read-only in the editortui: Show the scenes in one columntui: List only the captures of the block's version in the pickercatalog: Name replaced models legacy like the official appsession: Allow the Neural Capture writes in the sessionstate: Keep the capture mode state from the devicestate: Name the capture states and IO params and check capture actionsctl: Add the capture commands and capture watch to cortexctlstate: Show capture IO values in real unitsstate: Keep the name of the last saved capturemanager: Send capture actions from the device managertui: Add the capture screen to the terminal apptui: Show the closed face and the connection pagestui: Edit the capture IO page in real unitstui: Show the running, ready and error facestui: Close capture mode with x, asking once a capture startedtui: Save a capture from the ready facetui: Switch A/B by itself every 10 secondstui: Show A/B as two boxes and save on the same pagestate: Keep the monitoring cab in the capture statestate: Show the capture cab like a Grid blockstate: Turn cab actions into the official app's messagessession: Let the session send the capture cab's writesstate: Read typed values for the capture cab's paramstui: Show the monitoring cab in a tab of the IO pagetui: Edit the capture cab's params like the editor does*: Pick the capture cab's model in the model browsertui: Pick the capture cab's IR from the IR librarytui: Turn the capture cab on and off with capp: Ship Instrument Sans and JetBrains Mono with the appapp: Use the redesign's palette, text sizes and category huesapp: Restyle the primitives after the redesignapp: Rebuild the top bar and drop the utility barapp: Draw the Grid as lanes with wide blocksapp: Restyle the model browser and the file pickersapp: Add or change a block from a picker under its slotapp: Rebuild the editor header and param layoutapp: Show one parametric EQ band at a timeapp: Restyle the graphic EQapp: Show the scenes as a card and restyle the shell's extras
Fixes
transport: Treat EPIPE on HID write as delivered*: Send ModelRepo READ as the last handshake stepctl: Exit quietly when stdout is a closed pipe*: Let monitor subscribe before the handshakectl: Close the monitor session cleanly when stdout closes*: Give monitor an event receiver that starts after the handshakectl: Notice a closed stdout in monitor while the device is quietsession: Drop the handshake's event subscription once it is usedsession: Report a disconnect to subscribers added after itsession: Assert the read-only allow-list before every writesession: Check the read-only allow-list where messages are queued*: Close the session cleanly when the handshake or preset read failsctl: Pick step labels by label count*: Take the CPU total as the percentage it isapp: Keep the traffic panel's columns from shrinking*: Draw the split as the device does, with rounded cornersstate: Merge a moved split from partial grid updatesapp: Fit the parametric EQ into a low dockapp: Keep the Grid's layers inside the Gridstate: Drop removed stomps and the names of cleared IRsapp: Wait for a Grid answer before a block action counts as taken*: Load captures only into blocks of their versiontui: Keep the hint line whole at 101 columnssession: Allow toggle_ab_model as the A/B write, not the cab sim bypassstate: Take capture messages as an open dialog and clear errors on a new statectl: Read the pushed capture state and keep capture watch connectedmanager: Reconnect a device that sends nothing for 2 seconds
Refactoring
ctl: Rename a shadowed variable in the param renderer*: Move the scripted mock device into cortex-sessionapp: Split EQ params into bands and the rest*: Move the device manager into its own crate*: Put the manager's specta derives behind a featuretui: Share the editor's bar, toggle and options widgetstui: Share a block's editor rows
Tests
session: Test that the handshake hands over the model repositorystate: Test the preset view's paramsstate: Test scenes and bypass in the preset viewstate: Test markers, splitter, mixer and IO in the preset viewstate: Test the preset view without a catalogapp: Test Grid selection by click and keyboardapp: Test the traffic panelstate: Test that Grid updates skip the previewed scenesession: Add the scrubbed edit capturestate: Replay the edit capture against local editsapp: Test that edits stay local in mock modesession: Shorten the lines of the block write teststui: Build test states from the committed capturesapp: Show the legacy names in the browser fixturesession: Echo capture writes from the scripted devicectl: Add a mock device that plays the recorded capture runsession: Let the test device keep talking or go quietstate: Test the checks of the cab actions
Documentation
- Verify end to end on hardware, fix usbmon capture command
- Record that Quad Cortex mini support is untested
openspec: Verify HID access with and without the udev rule- Verify the Linux setup guide, mark WSL2 part untested
openspec: Add review fixes as tasks 10.1-10.3openspec: Add second review fixes as tasks 11.1-11.3openspec: Add review round 1 fixes as tasks 12.1-12.3openspec: Add review round 3 fixes as tasks 14.1-14.2openspec: Name the real read-only entry point in design D7openspec: Add review round 4 fix as task 15.1openspec: Describe the real keepalive order in design D6openspec: Plan show-model-names change- Document the model repository in the protocol notes
- Describe the named preset output in the README
openspec: Plan IR loader names in preset outputopenspec: Plan real units in preset outputcatalog: Document real values and the symbol table- Document how to update the symbol table
- Mention real units in the README
openspec: Plan EQ filter type labels- Document the step label rule and the EQ filter types
- Note a second BYPASS check on the device
openspec: Plan desktop GUI scaffoldopenspec: Plan Rust 1.99 as the minimum version- Document the device state messages
app: Describe building and running the desktop appopenspec: Plan square blocks and a permanent Grid / editor splitopenspec: Plan retrying permission errors after a replug- Explain the udev delay after plugging in
openspec: Plan naming the IO ports- Record the port numbering in the protocol notes
openspec: Plan the EQ editorsopenspec: Plan the scene preview- Mention the scene preview in the README
- Document how the official app writes to the device
openspec: Plan editing the loaded preset- Document the edit capture
state: Point the scene rule to protocol §10.3ctl: Document the CLI's write commands- Record the cortexctl write probe
- Describe the app as an editor in the README
openspec: Plan undo, save and the preset list- Document save, undo and the preset list
openspec: Say in the specs that the app and CLI can write- Document the new cortexctl commands in the README
- Record the undo and save probe on the device
- Describe undo, save and the preset list in the README
- Check undo, save and the preset list with the device
- Record that the bank labels match the device
openspec: Plan adding, replacing and removing blocks- Document block adds, removes, libraries and favorites
- Describe the block and listing commands in the README
- Describe adding, replacing and removing blocks in the README
- Record the block probe on the device
- Plan loading empty slots from the preset list
- Confirm the version 2 string of captures
openspec: Plan the terminal app- Describe the terminal app in the README
openspec: Plan the split lines and selectable splitters and mixersopenspec: Plan the scene panel in one columnopenspec: Plan the capture picker by versionopenspec: Plan the legacy label for replaced models- Document replaces on a model
openspec: Plan the Neural Capture commandsopenspec: Plan the capture commands with the names from the official app- Describe capture mode in the README
- Document the Neural Capture messages, states and IO params
- Record the Neural Capture hardware probe
- Document what the capture wizard shows on the device
openspec: Plan the capture screen in the terminal apptui: Describe the capture screen in the READMEopenspec: Plan auto A/B on the capture screenopenspec: Plan the A/B boxes and the save form on the ready face- Record the capture screen's device run
openspec: Plan the monitoring cab on the capture screen- Describe the capture dialog's monitoring cab sim
openspec: Plan the session gate for the capture cabtui: Describe the capture cab in the README and the helpopenspec: Plan the desktop redesign after Main Grid v2- Add screenshots of the desktop and terminal app
- Rework the README around the desktop and terminal app
openspec: Plan CI and releases on Forgejoopenspec: Scope commits by crate folder, not by spec- Describe the commit convention
- Say where to download releases and what they need
Build
*: Require Rust 1.99- License the project under Apache 2.0 only
app: Take the app version from Cargo.tomlapp: Move the frontend to Node 26
CI
- Check pushes and pull requests in Woodpecker
- Check the tag against the version and build release binaries
- Pack the release binaries with the udev rule
- Generate release notes from the conventional commits
- Publish tagged releases on Forgejo with notes and checksums
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads