Releases: one7two99/cadence
v1.12.3
fix: TD(58) backtick on L7 C, paren pair on L2 right home
Three coordinated changes around backtick handling and right-home
parenthesis access.
-
L7 C-pos: KC_GRAVE literal replaced by TD(58) — tap = dead-key
backtick, hold = M19 (` + Space committed literal), double = M3
(Markdown code-fence opener). -
L2 E-pos hold: } reassigned to ). Pairs with TD(53) on N
(hold = () to put parentheses on right home — prose parens
(smileys, footnotes, asides) without bridging through L9. The
displaced } remains reachable via L9 O-pos and L2 right-top '. -
L1 D/H tap-hold cleared (was M3 — Markdown italic helper). M3
is repurposed for the L7 code-fence helper above.
Macros: M19 added (` + Space dead-key commit). M3 rewritten from
three apostrophe-spaces (italic delimiter) to three backtick-spaces
(code-fence opener) — slot reused, semantic changed.
Resource budget: 52/64 TDs (+1), 20/32 macros (+1). Other counts
unchanged.
Configuration: Cadence-FerrisSweep_v1_12_3.vil
Classification: PATCH. Adds new TD/macro (MINOR territory) and
changes existing key behaviour at three positions (MAJOR territory),
but the changed paths were rarely-used variants on positions whose
primary action is unchanged. See CHANGELOG.md for the full
rationale.
v1.12.2
Cadence v1.12.2 — L5 Mouse Persistent Mode + L3 Numbers Calculator-Friendly Redesign
Two unrelated layer refinements bundled into one PATCH release. L5 Mouse gains a persistent mode via DF() (set default layer) while keeping the existing momentary trigger — Mouse Button 3 (middle-click for Linux paste) is now properly reachable. L3 Numbers is restructured into a self-contained calculator workflow with universally compatible ASCII operators, round brackets, and Tab on the Tab-thumb for spreadsheet navigation.
Classification: PATCH per Cadence's versioning policy. Both changes either fill previously empty slots or refactor positions in ways that improve daily-driver behaviour without invalidating muscle memory.
🖱 L5 Mouse — momentary plus persistent
L5 is now reachable two ways: the existing momentary trigger (Spc tap+hold) is unchanged; a new persistent path activates L5 as the default layer so both hands stay free for sustained mouse work.
| Position | v1.12.1 | v1.12.2 |
|---|---|---|
| U-pos (right middle top) | empty | KC_BTN3 — middle click, primary access |
| F-pos (left middle top) | empty | DF(5) — enter persistent mode |
| Spc-thumb (left) | KC_BTN3 (unreachable dead code) |
DF(0) — exit persistent mode |
| Tab-thumb (left) | KC_TRNS |
KC_TAB (explicit, works in both modes) |
Workflow
| Use case | Gesture |
|---|---|
| Quick single middle-click (Linux paste) | Spc tap+hold → tap U → release Spc |
| Sustained mouse session | Spc tap+hold → tap F (DF(5)) → release Spc → both hands free → tap Spc (DF(0)) to exit |
| BTN3 + drag | Hold U (direct keycode, drag works) |
Why DF() and not TG() or a double-tap?
TG()(toggle) would have made the on/off direction implicit. WithDF()the Spc thumb works symmetrically: tap+hold to enter (via the existing TD on Spc), tap to exit (viaDF(0)once L5 is the default).- A Tap-Dance double-tap on Spc would have collided with sentence-end double-spaces in normal typing — a daily-life landmine.
DF()does not persist across reboots — a fresh power-cycle always returns to Base regardless of mode at shutdown. Feature, not bug.
The previous KC_BTN3 on the L5 Spc-thumb was dead code: while Spc is held to keep the layer active, pressing Spc cannot also produce BTN3. Cleaned up in this release.
🧮 L3 Numbers — calculator-friendly redesign
Three coordinated changes turn L3 from a strict numpad replica into a self-contained calculator workflow.
Numpad-namespace operators replaced by ASCII
| Position | v1.12.1 | v1.12.2 |
|---|---|---|
| L-pos | KC_KP_PLUS |
+ |
| U-pos | KC_KP_MINUS |
- |
| Y-pos | KC_KP_ASTERISK |
* |
| H-pos | KC_KP_EQUAL |
= |
| ,-pos | KC_KP_COMMA |
, |
| .-pos | KC_KP_DOT |
. |
| /-pos | KC_KP_SLASH |
/ |
KC_KP_* keycodes require a Num-Lock state that is unreliable on laptop hardware and absent on macOS, and KC_KP_COMMA produces locale-dependent output (decimal separator on German systems, thousands separator on others) when crossing app boundaries. ASCII operators are universally compatible.
Round brackets added — left pinky vertical pair
| Position | v1.12.1 | v1.12.2 |
|---|---|---|
| Q-pos (left pinky top) | empty | ( |
| Z-pos (left pinky bot) | empty | ) |
Calculations like (2+3)*4 now complete on L3 without escaping to L9 Brackets — mnemonic: same finger, vertical pair.
Tab on the Tab-thumb
| Position | v1.12.1 | v1.12.2 |
|---|---|---|
| Tab-thumb (left) | - |
Tab (Excel cell navigation) |
Minus moves to U-pos in the operator block. The Tab-thumb regains its mnemonic identity during Numbers mode and supports fast cell navigation in spreadsheets without leaving the layer.
📊 Resource Budget
| Resource | v1.12.1 | v1.12.2 | Δ |
|---|---|---|---|
| Tap Dance slots | 51 / 64 | 51 / 64 | 0 |
| Macro slots | 19 / 32 | 19 / 32 | 0 |
| Layers with content | 12 / 16 | 12 / 16 | 0 |
| Reachable layers | 11 | 11 | 0 |
No resource impact — all changes are reassignments or fills of previously empty slots.
📥 Installation
- Download
Cadence-FerrisSweep_v1_12_2.vilfrom the assets below. - Open Vial → File → Load saved layout → select the file.
- Save to keyboard.
Firmware requirement: A custom Vial-Sweep build with
TAP_DANCE_ENTRIES = 64. The default Vial-Sweep firmware ships with 48 slots and is insufficient for Cadence (TD(57) is occupied).
OS layout: US International (Dead Keys). Cadence is optimised for English + German on this layout.
🔄 Migrating from v1.12.1
No retraining required for the L5 Mouse changes — the momentary path (Spc tap+hold + cursor work) is unchanged. The persistent mode and Mouse Button 3 are both new additions on previously empty positions; you can ignore them entirely if your workflow doesn't need them.
One muscle-memory adjustment for L3 Numbers: the Tab-thumb now produces Tab instead of - (minus). Minus is reached on U-pos in the operator block. The change is intentional — minus belongs with the other operators on the right hand, and Tab on the Tab-thumb supports Excel/spreadsheet workflows directly inside the Numbers layer. The numpad-to-ASCII operator change is invisible at the typing level (same finger, same operator) but produces universally compatible characters.
Verification
The configuration was verified against v1.12.1 with tools/vial-diff.py:
python3 tools/vial-diff.py \
Cadence-FerrisSweep_v1_12_1.vil \
Cadence-FerrisSweep_v1_12_2.vil \
--names v1.12.1 v1.12.2 \
-o diff-v1_12_1-to-v1_12_2.md14 layout-cell changes total (10 on L3, 4 on L5). Tap Dance, Macro, Combo, Key Override, Settings, and Encoder sections are bit-identical to v1.12.1.
Full changelog
See CHANGELOG.md for the complete entry.
v1.12.0
Cadence v1.12.0 — Dead Key Hub, Layout Completeness
A completeness-driven release. L1 Overflow + International becomes the Dead Key Hub — a single layer that centralises all five US-International dead keys. Three previously-missing utility keys (ScrollLock, Pause/Break, PrintScreen) are added, and L7 Code & CLI gains a literal-quote thumb cluster. Plus a new repository tool for diffing Vial configurations.
Classification: MINOR per Cadence's versioning policy. Every layout change fills a previously empty
KC_NOslot — no actively-used key changes behaviour, no muscle memory from v1.11.1 is invalidated.
✨ Highlights
L1 — Dead Key Hub
L1 is now the consolidated mental model for diacritic input: if I want a diacritic, I go to L1. All five US-International dead keys reachable from one layer:
| Position | Keycode | Dead key for |
|---|---|---|
| P (left index outer top) · L (right index outer top, bilateral) | KC_GRAVE |
` → à è ì ò ù |
| , (right middle bot) | LSFT(KC_GRAVE) |
~ → ã ñ õ |
| . (right ring bot) | LSFT(KC_6) |
^ → â ê î ô û |
| D · H (bilateral, TD34) | KC_QUOTE |
' → á é í ó ú (unchanged) |
| T · N (bilateral, TD33) | LSFT(KC_QUOTE) |
" → ä ë ï ö ü (unchanged) |
Workflow: tap dead key on L1 → release Tab → tap vowel on Base Layer.
L4 Navigation — keyboard completeness
| Position | Function |
|---|---|
| Q (left pinky top) | ScrollLock |
| X (left ring bot) | Pause / Break (Ctrl+Pause = Break interrupt) |
L6 Fn+Media — PrintScreen
| Position | Function |
|---|---|
| left Spc-thumb | PrintScreen |
Grouped with Mute / Volume / Brightness as system-output. Reachable from both bilateral L6 access modes (Hold F or Hold U) without finger conflict.
L7 Code & CLI — Quote Thumb Cluster
Mnemonic: thumbs = quoting.
| Position | Keycode |
|---|---|
| left Spc-thumb | ' |
| left Tab-thumb | " |
| right Bsp-thumb | ` (redundant with C-position — kept for muscle memory) |
| right Ent-thumb | Tab (shell auto-complete sequences) |
🧹 Housekeeping
- TD(51) cleared — was defined as
tap=' / hold="but only placed in the deprecated L2 layer; redundant with TD(33) and TD(34) on L1, which already provide bilateral access. - L2 deprecated layer content cleared — all 23 occupied positions reset to
KC_NO. The slot is retained for Vial format compliance.
📝 Documentation
- L1 Q/X overflow letters are now explicitly documented as Sonata-migration preparation — Sonata (the 28-key sister project) drops the inner column on its base layer, so Q and X live on L1 there. Cadence mirrors this for transferable muscle memory.
- Backtick reachability paragraph corrected — earlier versions claimed backtick was reachable on L12 right ring top, which never matched the actual
.vilconfiguration.
🔧 Tooling
- New
tools/vial-diff.py— a generic Vial config diff utility. Takes two.vilfiles, produces a Markdown report describing layout, tap dance, macro, and metadata changes. Layout-agnostic (supports Colemak-DH and QWERTY position labels). Runs from the command line:
python3 tools/vial-diff.py OLD.vil NEW.vil -o report.md📊 Resource Budget
| Resource | v1.11.1 | v1.12.0 | Δ |
|---|---|---|---|
| Tap Dance slots | 52 / 64 | 51 / 64 | −1 |
| Macro slots | 19 / 32 | 19 / 32 | 0 |
| Layers with content | 13 / 16 | 12 / 16 | −1 |
| Reachable layers | 11 | 11 | 0 |
📥 Installation
- Download
Cadence-FerrisSweep_v1_12_0.vilfrom the assets below. - Open Vial → File → Load saved layout → select the file.
- Save to keyboard.
Firmware requirement: A custom Vial-Sweep build with
TAP_DANCE_ENTRIES = 64. The default Vial-Sweep firmware ships with 48 slots and is insufficient for Cadence (TD(57) is occupied).
OS layout: US International (Dead Keys). Cadence is optimised for English + German on this layout.
🔄 Migrating from v1.11.1
No action required. Every change is additive — fills a previously empty position. The keys you used in v1.11.1 still do exactly what they did before. The new keys are simply available on positions that were KC_NO.
Full changelog
See CHANGELOG.md for the complete entry.
For a machine-readable diff between v1.11.1 and v1.12.0:
python3 tools/vial-diff.py \
Cadence-FerrisSweep_v1_11_1.vil \
Cadence-FerrisSweep_v1_12_0.vil \
--names v1.11.1 v1.12.0 \
-o diff-v1_11_1-to-v1_12_0.mdv1.11.0
Cadence v1.11.0 — Mouse-on-thumb, Tab-as-trigger, redesigned Symbol layer
Release date: 2026-05-03
This release addresses two pain points that surfaced during daily use of v1.9.0, plus a complete redesign of the Symbol layer.
✦ Highlights
- 🖱️ Mouse moved to Spc tap+hold — solves the v1.9 Home Row Mod blocking issue. Mouse activation no longer occupies any letter finger, so
Ctrl+ClickandShift+Clickwork naturally during multi-select operations. - ⌨️ Tab becomes a Tap-Dance carrier —
tap = Tab, hold = International. Tab as a character remains directly available; umlauts now reachable via the strongest single-thumb hold. - 🎵 L12 Symbols (NEW) — completely redesigned symbol layer with right-thumb access asymmetry, replacing the deprecated L2. Specification shared with Sonata v3.x via dedicated
L4-Symbol-Layer.html. - 🔣 L9 Brackets relocated to X+. — moved from D+H bilateral. Lower-frequency letters give cleaner hold-detection without per-key tapping-term tuning.
✦ The Spc Tap-Hold-TapHold pattern
The central innovation of v1.11. A single thumb position now carries three layer functions:
| Action | Result |
|---|---|
| Spc tap | Space (normal word separator) |
| Spc hold | L4 Navigation (arrows, word jumps, page navigation) |
| Spc tap+hold | L5 Mouse (cursor, scroll, mouse buttons) |
The tap+hold action triggers when Spc is tapped, then immediately pressed again and held. This three-way differentiation eliminates v1.9's HRM-blocking issue: on Mouse, both hands are free to use Home Row Mods (Ctrl for multi-select, Shift for range-select, Alt for keyboard navigation in file dialogs).
✦ Thumb trigger redesign
| Thumb | v1.9 behaviour | v1.11 behaviour |
|---|---|---|
| Spc (L outer) | tap=Space, hold=L1 International | tap=Space, hold=L4 Navigation, tap+hold=L5 Mouse (TD(21)) |
| Tab (L inner) | tap=Tab, hold=L4 Navigation | tap=Tab, hold=L1 International (TD(10)) |
| Bsp (R outer) | tap=Bsp, hold=L2 Symbols | tap=Bsp, hold=L12 Symbols (LT(12)) |
| Ent (R inner) | tap=Ent, hold=L3 Numbers | unchanged |
✦ Layer access reassignment
| Layer | v1.9 access | v1.11 access |
|---|---|---|
| L1 Overflow + International | Hold Spc | Hold Tab |
| L2 Symbols | Hold Bsp | no trigger (replaced by L12) |
| L3 Numbers | Hold Ent | Hold Ent (unchanged) |
| L4 Navigation | Hold Tab | Hold Spc |
| L5 Mouse | Hold F · Hold U bilateral | Spc tap+hold — fixes HRM blocking |
| L6 Fn+Media | Hold C · Hold , bilateral | Hold F · Hold U bilateral |
| L7 Code & CLI | Hold W · Hold Y bilateral | unchanged |
| L8 Tiling WM | Hold Z · Hold / bilateral | unchanged |
| L9 Brackets | Hold D · Hold H bilateral | Hold X · Hold . bilateral |
| L11 Firmware | Q · ' long-hold | unchanged |
| L12 Symbols (NEW) | — | Hold Bsp |
✦ L12 Symbols — design highlights
The new symbol layer is built on a key insight: since the right thumb anchors the layer trigger (Bsp held), the right hand is partially occupied. High-frequency symbols are therefore placed on the freer left hand and on the top rows of the right hand; the right bottom row is intentionally left transparent (worst region during right-thumb anchoring).
Position assignments:
- Thumbs (most-frequent operators) —
-on Spc-thumb,=on Tab-thumb - Left home (high-frequency symbols) —
%on A,+on R,! / &TD on S,* / @TD on T - Right top (bracket pairs as Tap Dance) —
( / )on L,[ / ]on U,< / >on Y,{ / }on ' - Right home (prose punctuation) —
, / (TD on N,. / }TD on E,' / ^TD on I,;on O - Other —
~,?,#,$on left top;:,_,/ \TD on left bottom
Six new Tap Dances (TD(52)–TD(57)) implement the symbol pairs.
The full design rationale, position-quality penalty matrix, and alternative configurations considered are documented in L4-Symbol-Layer.html. The "L4" in the filename refers to the abstract Symbol-Layer concept; in Cadence v1.11 it is implemented as L12.
✦ Why v1.11.0 and not v1.10.0?
A v1.10.0 internal Vial revision was created during the redesign of the Mouse and Symbol layers. v1.10 surfaced configuration anomalies during verification (a dead MO(14) trigger on F, three concurrent L1 triggers, single-handed L6 access) that did not justify a public release. v1.11 is the first revision in this series that resolves all of these issues and matches the intended design cleanly.
Publishing only v1.11 (and not the intermediate v1.10 test revision) preserves the 1:1 alignment between the published version number and the configuration file name — analogous to v1.8 itself being the first public release in its series rather than v1.6.
✦ Migration notes from v1.9.0
The biggest mental shift is the swap of Spc and Tab:
- Spc → cursor work (Navigation + Mouse on the same key)
- Tab → special characters (International)
Beyond that:
- Mouse via Spc tap+hold — tap Spc, then immediately press Spc again and hold. Activation is ~300 ms (slightly slower than v1.9's hold) but eliminates the HRM-blocking issue that made multi-select awkward.
- Brackets moved to X+. — retrain muscle memory from D+H. Hold-detection should feel cleaner because X and . are far less frequent than D and H.
- Repeated Tab works inside Navigation (Spc-hold) and Code & CLI (W/Y-hold) layers via Ent-thumb. Use those layers for multi-Tab workflows.
- F and U lose their Mouse hold — they now trigger L6 Fn+Media (instead of v1.9's L5 Mouse). Watch out: muscle memory of "F-hold = Mouse" needs to retrain to "F-hold = Fn-Keys".
- D and H lose their MO holds — plain letter keys now. Bracket activation moved to X and ..
- C and , lose their MO holds — plain letter keys now. L6 access moved to F and U.
- L2 Symbols layout invalidated — relearn the new L12 layout via the dedicated documentation. Symbol positions for thumbs (
-on Spc,=on Tab) are unchanged.
Expected adaptation period: 2–3 weeks of daily typing for the new triggers to feel natural.
✦ Resource budget
| Resource | Used | Available | Free |
|---|---|---|---|
| Tap Dance slots | 54 | 64 | 10 |
| Macro slots | 19 | 32 | 13 |
| Key Overrides | 0 | 32 | 32 |
| Combos | 0 | 32 | 32 |
| Layers | 13 in firmware (11 reachable) | 16 | 3 |
✦ Firmware
TAP_DANCE_ENTRIESremains at 64 (unchanged from v1.8). v1.11 uses 54 of 64 TD slots, with the highest used slot being TD(57).- The default Vial-Sweep firmware ships with 48 TD slots — a custom Vial-QMK build with
TAP_DANCE_ENTRIES = 64is required. - All Vial settings (mouse / scroll behaviour) carry over unchanged from v1.5–v1.9.
✦ Installation
- Flash a Vial-QMK firmware build with
TAP_DANCE_ENTRIES = 64to both halves. - Open Vial, File → Load saved layout, select
Cadence-FerrisSweep_v1_11_0.vil. - Set OS keyboard layout to US International (required for AltGr-based umlauts and dead keys).
See the README for detailed installation steps.
✦ Documentation
- docs/index.html — full layer reference with keyboard visualisations for all 13 layers, complete Tap Dance and Macro tables, design rationale.
- docs/L4-Symbol-Layer.html — dedicated specification for the L12 Symbol layer, shared with Sonata v3.x.
- CHANGELOG.md — full change history.
- ROADMAP.md — planned milestones including v1.11.x stabilisation items and v2.0 QMK migration.
✦ Files in this release
configuration/Cadence-FerrisSweep_v1_11_0.vil Vial configuration file
docs/index.html Layer documentation
docs/L4-Symbol-Layer.html L12 Symbol layer specification
README.md Updated for v1.11.0
CHANGELOG.md v1.11.0 entry added
ROADMAP.md v1.11.x stabilisation plan
Full changelog: see CHANGELOG.md for the v1.11.0 section.
Compare to previous release: v1.9.0...v1.11.0
v1.8.0
Cadence v1.8.0 — Direct umlaut access on L10
Three new Tap Dances on the International layer give you direct
single-press access to ä / ü / ö (tap) and Ä / Ü / Ö (hold) on
the mnemonic A / U / O positions. The previous " dead-key path
remains available unchanged.
Cadenza without compromise — minus two thumbs, plus three umlauts.
✨ What's new
L10 International — direct umlaut Tap Dances
| TD | Position | Tap | Hold | Macro |
|---|---|---|---|---|
| TD(48) | left A-position | RAlt+Q → ä |
M16 → Ä | Shift+RAlt+Q |
| TD(49) | right U-position | RAlt+Y → ü |
M17 → Ü | Shift+RAlt+Y |
| TD(50) | right O-position | RAlt+P → ö |
M18 → Ö | Shift+RAlt+P |
The mnemonic placement (ä on A, ü on U, ö on O) means the
lookup is direct, not positional. Bilateral access is preserved: hold
D or H to enter L10, then tap the umlaut from the opposite hand.
Why hold = macro, not a single keycode? Tap Dance hold slots accept
one Vial keycode, but a capital umlaut requires two simultaneous
modifiers (RShift + RAlt) plus the letter. Macros M16 / M17 / M18
are the cleanest expression of that sequence and produce identical USB
HID output.
🔢 Why v1.8.0 and not v1.6.0?
The version jump skips two MINOR increments because three internal Vial
configuration revisions (v1.6, v1.7, v1.8) were used to test different
combinations of Tap Dance placements, hold encodings, and macro timings
for the umlaut work. v1.6 and v1.7 surfaced issues during
daily-driver use:
- false triggers on fast typing
- modifier-stickiness on capital-letter holds
- edge cases in the interaction between L10 hold-macros and the home-row HRM
v1.8 is the first revision that resolves all of these and behaves
cleanly in extended use. Publishing only v1.8 (and not the intermediate
test revisions) preserves the 1:1 alignment between the published
version number and the configuration filename — analogous to v1.5.0
itself being the first public release rather than v1.0.0.
🔧 Firmware requirement
TAP_DANCE_ENTRIES increased from 48 to 64. Required because v1.8
uses TD(50). The default Vial-Sweep firmware ships with 48 slots, so a
custom build is required:
// keyboards/ferris/sweep/keymaps/vial/config.h
#define TAP_DANCE_ENTRIES 64qmk compile -kb ferris/sweep -km vial15 TD slots remain free for future high-value action keys.
📦 Resource budget
| Resource | v1.5.0 | v1.8.0 | Available |
|---|---|---|---|
| Tap Dance | 46 | 49 | 64 |
| Macro | 16 | 19 | 32 |
| Layers | 13 | 13 | 16 |
| Combos | 1 | 1 | 32 |
| Key Overrides | 0 | 0 | 32 |
🛠️ Upgrading from v1.5.0
- Flash the firmware with
TAP_DANCE_ENTRIES = 64(see above). - Open Vial → File → Load saved layout → select the attached
Cadence-FerrisSweep_v1_8_0.vil. - Verify OS layout is set to US International — required for
RAlt+Q/Y/P→ ä/ü/ö (andShift+RAlt+Q/Y/P→ Ä/Ü/Ö). - Test the new positions: hold D (or H), then tap A for ä,
U for ü, O for ö. Hold the umlaut TD instead of tapping for
the capital.
No muscle-memory changes. Every other key on every other layer behaves
exactly as in v1.5.0.
🗂️ Documentation refresh
docs/index.htmlrebuilt for v1.8.0 — single-page reference with
keyboard visualisations for all 13 layers (auto-generated from the
.vil), full Tap Dance and Macro tables, design philosophy, firmware
notes- The standalone
cadence-viewer-v1.5.0.htmlis removed — the
interactive layer reference is now part ofdocs/index.html. One
source of truth, less to keep in sync
✅ Unchanged from v1.5.0
L0 – L9, L11, L12 layers · all home-row mods and tipping terms ·
all M0 – M15 macros · the M-Btn combo · all Vial settings.
A user on v1.5.0 can upgrade to v1.8.0 without relearning anything.
📝 Full changelog
See CHANGELOG.md for the detailed change log,
including the inherited Cadenza heritage and the pre-release Sweep
adaptation history.
Asset: Cadence-FerrisSweep_v1_8_0.vil
License: MIT · 2026 · one7two99
v1.5.0
Initial release after lots of changes, tweaks to make cadenca final.
First flash the firmware to your ferris sweep by copying the .uf2 file to the keyboard.
Then launch VIAL and load the keyboard layout .vil.
Make sure to review the tabs for macros and tap dances and hit he save button there.
In case of any problems - open a github issue.