
Ergogen
- 2 installs
- 2 repo stars
- Updated August 3, 2026
- fandhe-ai/agent-reference-skills
Reference Ergogen for designing ergonomic mechanical keyboards from YAML/JSON config, generating SVG, DXF, JSCAD, and KiCad outputs for points, outlines, cases, and PCBs.
About
A structured reference for Ergogen, a tool that generates ergonomic keyboard designs from declarative YAML/JSON config into SVG/DXF/JSCAD/KiCad. A developer loads it when designing keyboard layouts, cases, or PCBs.
- Declarative points, outlines, cases, and pcbs sections
- Anchors, zones, adjustments, footprints, and traces
Ergogen by the numbers
- 2 all-time installs (skills.sh)
- Ranked #1,294 of 1,879 Documentation skills by installs in the Skillselion catalog
- Data as of Aug 3, 2026 (Skillselion catalog sync)
npx skills add https://github.com/fandhe-ai/agent-reference-skills --skill ergogenAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 2 |
|---|---|
| repo stars | ★ 2 |
| Last updated | August 3, 2026 |
| Repository | fandhe-ai/agent-reference-skills ↗ |
What it does
Reference Ergogen for designing ergonomic mechanical keyboards from YAML/JSON config, generating SVG, DXF, JSCAD, and KiCad outputs for points, outlines, cases, and PCBs.
Files
Ergogen リファレンス
Ergogen — エルゴノミックキーボードの設計を YAML/JSON 設定から自動生成するツール。 Points / Outlines / Cases / PCBs を宣言的に記述し、SVG / DXF / JSCAD / KiCad 形式で出力する。 公式ドキュメント (docs.ergogen.xyz) 全 12 ページを構造化。
ディレクトリ構造
.claude/skills/ergogen/
├── SKILL.md ← このファイル(エントリーポイント)
└── references/
├── guide/README.md ← 利用ワークフロー索引(3 ページ)
├── config/README.md ← 設定構造・前処理索引(2 ページ)
├── sections/README.md ← 6 トップレベルセクション索引(6 ページ)
└── formats/README.md ← 出力ファイル形式索引(1 ページ)探索手順
1. ユーザーのタスクに最も関連するカテゴリを特定する 2. そのカテゴリの README.md を読む 3. README.md 内の一覧から必要な個別ファイルを選んで読む 4. 必要に応じて関連ページのリンクを辿る
カテゴリ → README.md マッピング
| タスク例 | カテゴリ | README パス |
|---|---|---|
| Ergogen の概要・最初の設定例・推奨ワークフロー | guide | references/guide/README.md |
CLI (ergogen input.yaml -o out) / Web アプリでの実行 | guide | references/guide/README.md |
| 発展的トピック・コミュニティ(Discord, GitHub)導線 | guide | references/guide/README.md |
| 6 トップレベルセクション(meta/units/points/outlines/cases/pcbs)の責務 | config | references/config/README.md |
Preprocessing: $extends / $params / $args / $skip / $unset, 数式評価 | config | references/config/README.md |
meta セクション: name / version / author / engine | sections | references/sections/README.md |
units セクション: 組み込み単位(u, cx, cy)、数式記法、$default_* | sections | references/sections/README.md |
points セクション: Anchors / Zones / Adjustments、column-stagger、mirror | sections | references/sections/README.md |
outlines セクション: rectangle / circle / polygon / outline 参照、operations、exports | sections | references/sections/README.md |
cases セクション: extrude、shift / rotate、3D ブーリアン合成 | sections | references/sections/README.md |
pcbs セクション: footprints、nets、traces、KiCad 出力 | sections | references/sections/README.md |
| 出力ファイル形式(SVG / DXF / JSCAD / KiCad)と推奨ビューア | formats | references/formats/README.md |
Config Overview
The heart of Ergogen is a single config file (YAML, JSON, or JavaScript). It is divided into six top-level sections that each handle a distinct phase of keyboard generation. Only points is required; all other sections are optional.
Signature / Usage
meta:
# board metadata, author info, version requirements
units:
# custom variables usable throughout the config
points:
# key positions and layout coordinates (required)
outlines:
# plate, case, and PCB outline generation
cases:
# 3D-printable case objects via extrusion
pcbs:
# KiCAD PCB template configurationOptions / Props
| Name | Type | Description |
|---|---|---|
meta | object | Board metadata: author, version requirements, and other board-level info |
units | object | Custom unit variables that can be referenced anywhere in the config |
points | object | Required. Defines key positions, spacing, and layout coordinates |
outlines | object | Generates plate, case, and PCB outlines derived from points |
cases | object | Extrudes outlines into 3D-printable case objects |
pcbs | object | Configures KiCAD PCB templates for circuit board generation |
Notes
- YAML, JSON, and JavaScript config formats are all supported; the generator auto-detects the input type.
pointsis the only required section — minimal configs can omit all others.unitsvalues defined here are available for use in every other section.- For complex or repetitive configs, JavaScript-format configs allow branching, loops, and parametric functions.
Related
- Preprocessing
Preprocessing
Ergogen runs four sequential preprocessing steps on config files before interpreting them: unnesting, inheritance, parameterization, and skipping. String values that look like math expressions are also automatically evaluated.
Signature / Usage
# 1. Unnesting — dot-notation keys are expanded
nested.key.definition: value
# → { nested: { key: { definition: value } } }
# 2. Inheritance — $extends copies fields from another declaration
parent:
a: 1
b: 2
child:
$extends: parent
c: 3
# child → { a: 1, b: 2, c: 3 }
# 3. Parameterization — regex-based placeholder replacement
template:
value: placeholder
double_value: placeholder * 2
$params: [placeholder]
$args: [3]
# placeholder → 3, double_value → 6
# 4. Skipping — exclude intermediate declarations from output
abstract_base:
a: p1
b: p2
$params: [p1, p2]
concrete:
$extends: abstract_base
$args: [10, 20]
$skip: true # not emitted as a real sectionOptions / Props
| Name | Type | Description |
|---|---|---|
$extends | string | Dot-notation path to the parent declaration to inherit from |
$unset | sentinel | When used as a value, explicitly removes the inherited field |
$params | array | List of placeholder names for parameterized declarations |
$args | array | Argument values substituted for the corresponding $params placeholders |
$skip | boolean | When true, excludes the declaration from further processing/output |
Notes
- Unnesting happens first; any object key containing a
.is expanded into nested objects. - Inheritance rules: undefined fields take the parent value; defined fields override; type mismatches favor the new value; arrays and objects merge recursively.
$extendsvalue must be the full absolute dot-notation path of the target declaration.- Parameterization uses regex replacement, so placeholder names should be unique strings to avoid unintended substitutions.
$skip: trueis most useful for abstract intermediate declarations that are only meant to be inherited, not used directly.- String values that are valid mathematical expressions (e.g.,
3 * 2) are automatically evaluated to their numeric result. - Unit variables defined in the
unitssection are available as named variables inside math expressions throughout the config.
Related
- Config Overview
Config
| Name | Description | Path |
|---|---|---|
| Config Overview | Overall YAML/JSON config structure and the six top-level sections (meta, units, points, outlines, cases, pcbs) | ./overview.md |
| Preprocessing | YAML extensions: unnesting, inheritance ($extends), parameterization ($params/$args), skipping ($skip), and math expression evaluation | ./preprocessing.md |
File Formats
Ergogen accepts configuration input in multiple formats and produces output files for outlines, cases, PCBs, and visualization.
Input Formats
| Format | Description |
|---|---|
| JSON | Standard JSON configuration file |
| YAML | YAML configuration file |
| JavaScript | JS module that exports/produces an object |
| ZIP / EKB | Bundle format; can include custom footprints |
Output Formats
| Category | Format | File Extension | Tool / Viewer | Description |
|---|---|---|---|---|
| Points | YAML | — | any text editor | Canonical representation of all defined points |
| Points | Demo | — | browser / SVG viewer | Visual preview of the point layout |
| Outlines | DXF | .dxf | FreeCAD, KiCad, AutoCAD | 2D outline for laser cutting or import into PCB tools |
| Outlines | SVG | .svg | browser, Inkscape | Vector outline for visualization or editing |
| Cases | JSCAD | .jscad | OpenJSCAD, Cadhub | 3D case model; open in JSCAD-compatible viewer |
| PCBs | KiCad PCB | .kicad_pcb | KiCad | Unrouted PCB layout; requires manual routing in KiCad |
Notes
- PCB output is unrouted — no traces are placed. You must open the file in KiCad and route connections manually.
- PCB output does not include a KiCad schema (
.kicad_sch) or project file (.kicad_pro); these must be created separately in KiCad if needed. - Case output uses the JSCAD format, which can be opened and rendered at Cadhub or with a local OpenJSCAD installation.
- Input bundles (ZIP/EKB) allow packaging a config together with custom footprints for sharing or reuse.
Related
- PCBs
- Outlines
- Cases
Formats
| Name | Description | Path |
|---|---|---|
| File Formats | Input and output file formats supported by Ergogen (JSON/YAML/JS input; SVG/DXF/JSCAD/KiCad output) | ./file-formats.md |
Getting Started
Ergogen is a tool for designing ergonomic keyboards via YAML configuration files. It generates PCB layouts, case outlines, and related artifacts from a single config.
Recommended Workflow
1. Watch the introductory talk for a conceptual overview. 2. Read the documentation at ergogen.xyz. 3. Try the web-based interface (e.g., ergogen.cache.works) before installing the CLI. 4. Study real-world configs by searching the #ergogen topic on GitHub. 5. Ask questions on Discord if you get stuck.
Notes
- The CLI is optional — the web app is sufficient for initial exploration.
- Use the CLI only when you need unreleased features, custom modifications, or want to contribute code.
- Input files are written in YAML.
Related
- Usage
- Next Steps
Next Steps
After learning the basics, explore real-world configs and community resources to deepen your Ergogen knowledge.
Community Resources
| Resource | URL |
|---|---|
| Discord | http://discord.ergogen.xyz |
| GitHub topic | https://github.com/topics/ergogen |
Further Learning
- "Let's Design A Keyboard With Ergogen v4" — step-by-step tutorial series by FlatFootFox (flatfootfox.com)
- "The REAL Ergonomic Keyboard Endgame!" — video walkthrough by Ben Vallack (covers an earlier Ergogen iteration)
- Absolem blogpost — design case study at zealot.hu/absolem/
Notes
- Search the
#ergogenGitHub topic to find and reverse-engineer real-world config files. - Discord is the primary place for questions, contributions (examples, tests, features), and community discussion.
Related
- Getting Started
- Usage
Guide
| Name | Description | Path |
|---|---|---|
| Getting Started | Overview of Ergogen, recommended workflow, and first steps | ./getting-started.md |
| Usage | Web app and CLI usage, arguments, and flags | ./usage.md |
| Next Steps | Community resources (Discord, GitHub) and further learning materials | ./next-steps.md |
Usage
Ergogen can be run through the official web app or the CLI. Both accept a YAML config and produce output artifacts (outlines, PCBs, cases).
Signature / Usage
Web App
Open https://ergogen.cache.works in a browser, paste or upload your YAML config, and preview the generated output directly — no installation required.
CLI (global install)
# Install (requires Node v14.4.0+ / npm v6.14.5+)
npm i -g ergogen
# Run
ergogen input.yaml -o output_folderCLI (development build)
git clone https://github.com/ergogen/ergogen.git
cd ergogen
npm install
node src/cli.js input.yaml -o output_folderOptions / Props
| Flag / Argument | Description |
|---|---|
input.yaml | Path to the YAML configuration file |
-o <dir> | Output directory for generated files |
For the full list of options run ergogen --help.
Notes
- The development build gives access to unreleased features not yet on npm.
- Output artifacts include point previews, outlines, PCBs, and cases depending on what is defined in the config.
Related
- Getting Started
- Next Steps
Cases
The cases section extrudes 2D outlines and composes them in 3D space to produce JSCAD solid geometry (.jscad output).
Signature / Usage
cases:
top_plate:
- what: outline
name: board
extrude: 1.5
_wall:
- what: outline
name: board
extrude: 12
- what: outline
name: board
extrude: 11
operation: subtract
assembled:
- what: case
name: top_plate
- what: case
name: _wall
shift: [0, 0, 1.5]Options / Props
| Name | Type | Default | Description |
|---|---|---|---|
what | string | — | Component type: outline (import 2D outline onto XY plane) or case (reference a previously defined case). |
name | string | — | Name of the outline or case to use. |
extrude | number | 1 | Extrusion depth along the Z axis. Only applies when what: outline. |
shift | [x, y, z] | [0, 0, 0] | 3D translation of the part. |
rotate | [ax, ay, az] | [0, 0, 0] | Rotation angles around each axis. |
operation | string | add | Boolean operation: add (union), subtract (difference), intersect (intersection). |
Notes
- Parts accept both array and object formats.
- Prefix a case name with
_to make it private (available for reference but not exported). - Shorthand notation
[+, -, ~]followed by a name is also accepted; Ergogen searches cases first, then outlines. - Cases reference other cases by name, enabling layered 3D composition.
- Output is un-routed JSCAD solid geometry.
Related
- Outlines
Metadata
The meta top-level key stores keyboard documentation. Most fields are arbitrary strings, but Ergogen interprets three specific fields: engine, version, and author.
Signature / Usage
meta:
engine: 4.0.6
version: "1.0"
author: your-name
notes: any additional fields are ignored by ErgogenOptions / Props
| Name | Type | Description |
|---|---|---|
engine | semver string | Minimum Ergogen version required (e.g. 3.1.4 means >=3.1.4 <4.0.0). Ergogen validates and errors on mismatch. |
version | string | Embedded as version metadata in generated KiCad PCB files. |
author | string | Embedded as author metadata in generated KiCad PCB files. |
| (any) | any | Additional arbitrary fields are stored but not processed by Ergogen. |
Notes
engineuses semver range semantics:3.1.4means "at least 3.1.4, up to (but excluding) 4.0.0".versionandauthordiffer fromengine— they are plain strings passed through to KiCad output, not version constraints.- Any other fields (e-mail, GitHub links, etc.) are accepted without error but have no effect on generation.
Related
- PCBs
Outlines
The outlines section builds 2D shapes by combining geometric primitives placed at key points. Each outline is assembled from an ordered list of parts; parts are combined via boolean operations.
Signature / Usage
outlines:
_keycaps:
- what: rectangle
where: true
bound: false
size: [cx, cy]
board:
- what: rectangle
where: true
bound: true
size: [cx, cy]
expand: 2
fillet: 1
- what: circle
where:
ref: matrix_inner_top
radius: 5
operation: subtract---
Shape Primitives
rectangle
| Name | Type | Required | Description |
|---|---|---|---|
size | number / [x, y] | yes | Width and height. Single number = square. Introduces units sx (width) and sy (height). |
corner | number | no | Corner radius (default: 0). |
bevel | number | no | Bevel size (default: 0). Bevels and corners are subtracted from size, not added. |
circle
| Name | Type | Required | Description |
|---|---|---|---|
radius | number | yes | Circle radius. Introduces unit r. |
polygon
| Name | Type | Required | Description |
|---|---|---|---|
points | array of anchors | yes | Vertices. If ref is unspecified, previous point is assumed. First point defaults to [0, 0, 0°]. |
outline (reference)
| Name | Type | Required | Description |
|---|---|---|---|
name | string | yes | Name of an existing outline to embed. |
origin | anchor | no | Placement origin within the referenced outline (applied before positioning). |
---
Common Part Attributes
| Name | Type | Description |
|---|---|---|
what | string | Shape type: rectangle, circle, polygon, or outline. |
where | filter / anchor | Point(s) at which to place the shape. |
operation | string | Boolean mode (see Operations below). Default: add. |
bound | boolean | Activate key-binding (uses bind/autobind values from points). |
asym | string | Mirror treatment: source, clone, or both. |
adjust | anchor | Additional positional offset relative to each placement point. |
scale | number | Size multiplier (default: 1). |
expand | number | Expand (positive) or shrink (negative) outline in mm. |
joints | number / string | Joint style for expansion: 0/round, 1/pointy, 2/beveled. |
fillet | number | Corner rounding radius (default: 0). |
---
Operations
Parts are applied sequentially to build a cumulative shape:
| Operation | Description |
|---|---|
add | Union — merge shape into cumulative result (default). |
subtract | Difference — remove shape from cumulative result. |
intersect | Intersection — keep only overlap with cumulative result. |
stack | Overlay shape without merging geometry. |
---
Exports
- All named outlines are exported by default.
- Prefix a name with
_(e.g.,_keycaps) to mark it as private — it can be referenced by other outlines but is not included in final output.
Notes
bind/autobindvalues set on points control how far a rectangle extends to meet neighboring keys whenbound: true.- Parts accept both array and object formats.
Related
- Points
- Cases
- PCBs
PCBs
The pcbs section places footprints at key positions and assigns nets to produce un-routed KiCad PCB files (.kicad_pcb).
Signature / Usage
pcbs:
main:
outlines:
edge:
outline: board
layer: Edge.Cuts
footprints:
keys:
what: mx
where: true
params:
net: "{{colrow}}"
references: true
template: default---
Outlines
Defines PCB edge cuts and layer markings.
| Name | Type | Description |
|---|---|---|
outline | string | Reference to an existing outline. |
layer | string | KiCad layer to draw on (default: Edge.Cuts). |
---
Footprints
Places components at filtered point locations.
| Name | Type | Description |
|---|---|---|
what | string | Footprint definition name to instantiate. |
where | filter / anchor | Point(s) at which to place the footprint. |
asym | string | Mirror treatment: source, clone, or both (default). |
adjust | anchor | Additional positional offset relative to placement point. |
params | object | Component-specific parameters (see below). |
Footprint Parameters
Parameters support {{key}} template syntax to access point attributes (e.g., {{colrow}}, {{name}}).
| Type | Description |
|---|---|
| boolean / number / string / array / object | Passed through as-is to the footprint definition. |
| net string | Unique string identifying an electrical net; indexed internally. |
| anchor | Point coordinates with metadata. |
Provided parsed_params Fields (inside footprint body function)
| Name | Type | Description |
|---|---|---|
ref | string | Component designator + index (e.g., D4). |
ref_hide | boolean | Whether the silkscreen reference is hidden. |
x / y / r | number | Position and rotation. |
xy | string | "${x} ${y}" |
at | string | Full KiCad (at ${x} ${y} ${r}) clause. |
local_net(name) | function | Creates an instance-specific net prefixed by the footprint reference. |
Coordinate Helper Functions
| Function | Context | Behavior |
|---|---|---|
isxy(x, y) | Internal Symmetric | Inverts x for mirrored points. |
iaxy(x, y) | Internal Asymmetric | Ignores mirroring. |
esxy(x, y) | External Symmetric | Applies rotation context symmetrically. |
eaxy(x, y) | External Asymmetric | Applies rotation context asymmetrically. |
Each returns an object with x, y, and str fields.
---
Top-Level PCB Options
| Name | Type | Description |
|---|---|---|
outlines | object | Edge cut and layer outline definitions. |
footprints | object / array | Footprint placement configurations. |
references | boolean | Whether to include reference designators in output. |
template | string | KiCad output template name (default: default). |
params | object | Extra parameters passed to the template. |
---
Nets
Each unique net string is assigned a numeric index for KiCad.
| Field | Description |
|---|---|
name | Unique string identifier. |
index | Numeric KiCad index. |
str | Full representation: "(net ${index} \"${name}\")". |
Notes
- Generated
.kicad_pcbfiles are un-routed; all pads and nets are defined but traces are not drawn. - The template receives a
partsobject containing:names,version,author,nets,footprints,outlines, and customparams. versionandauthorin the output come from themetasection.
Related
- Metadata
- Outlines
- Points
Points
The points section defines the 2D key positions [x, y, r°] that form the keyboard layout. It is built from zones (column/row grids) with optional post-layout adjustments (rotation, mirroring).
Signature / Usage
points:
key: # global key defaults
padding: u
zones:
matrix:
anchor:
shift: [0, 0]
columns:
outer:
rows:
bottom:
top:
key:
stagger: 5
rows:
bottom:
top:
key:
spread: u
rotate: -10
mirror:
ref: matrix_outer_top
distance: 250---
Anchors
An anchor computes a 2D point [x, y, r°] relative to an existing point via translation and rotation.
Anchor Forms
| Form | Description |
|---|---|
| string | Reference an existing named point with no modification. |
| array | Multi-anchor: each item's result becomes the starting point for the next. |
| object | Full declaration (see attributes below). |
Anchor Attributes
| Name | Type | Description |
|---|---|---|
ref | string / anchor | Starting point; parsed recursively. |
aggregate | object | Combines multiple points. Contains parts (array of anchors) and method ("average" only). |
orient | number / anchor | Pre-rotation before shift. A number adds degrees; an anchor makes the point "turn towards" the reference. |
shift | [x, y] / number | Translation on the XY plane respecting current rotation. Single number becomes [n, n]. |
rotate | number / anchor | Post-rotation after shift. Same behavior as orient. |
affect | string / array | Restricts which fields are modified: any subset of "x", "y", "r". |
resist | boolean | Prevents special mirroring treatment for this point. |
Anchor Example
anchor:
aggregate.parts:
- left_key
- right_key
shift: [1, 0]
rotate: 180---
Zones
Zones organize keys into column-staggered grids. Columns are processed left-to-right; rows bottom-to-top.
Zone Structure
points:
zones:
zone_name:
anchor: <anchor> # optional; default [0, 0, 0°]
columns:
col_name:
rows:
row_name: <key_attrs>
key: <key_attrs> # column-level defaults
rows:
row_name: <key_attrs>
key: <key_attrs> # zone-level defaults
key: <key_attrs> # global defaultsInheritance Order (lowest → highest priority)
1. Built-in hardcoded defaults 2. Global points.key 3. Zone points.zones.<zone>.key 4. Column points.zones.<zone>.columns.<col>.key 5. Row points.zones.<zone>.rows.<row> 6. Key-specific points.zones.<zone>.columns.<col>.rows.<row>
Use the $unset directive to remove an inherited value.
Key-Level Attributes
| Name | Type | Default | Description |
|---|---|---|---|
stagger | number | 0 | Cumulative vertical offset per column. |
spread | unit | u | Horizontal distance between columns. |
splay | number | 0 | Column rotation (around origin). |
origin | [x, y] | [0, 0] | Pivot point for splay. |
padding | unit | u | Vertical distance between rows. |
orient | number | 0 | Cumulative pre-rotation within a column. |
shift | [x, y] | [0, 0] | Cumulative positional shift. |
rotate | number | 0 | Cumulative post-rotation. |
adjust | anchor | {} | Independent additional adjustment. |
bind | number / array | -1 | Directional reach for outline binding. |
autobind | number | 10 | Automatic binding reach. |
skip | boolean | false | Exclude this key from output. |
asym | string | "both" | Side assignment: "source", "clone", or "both". |
mirror | object | {} | Attribute overrides applied only to mirrored copy. |
colrow | string | auto | Auto-generated as {{col.name}}_{{row}}. |
name | string | auto | Auto-generated as {{zone.name}}_{{colrow}}. |
width / height | unit | 18 | Keycap size for visualization only. |
---
Adjustments
Post-layout rotation and mirroring applied at zone or global scope.
Options
| Name | Type | Scope | Description |
|---|---|---|---|
rotate | number | zone or global | Rotates all relevant points around [0, 0]. Simulates inter-half angle for one-piece boards. |
mirror | number / anchor | zone or global | Creates mirrored copies along an axis. Number = x-coordinate of axis; anchor form supports an extra distance field. |
Mirroring and asym
asym value | Effect |
|---|---|
"both" (default) | Key appears on both original and mirrored side. |
"source" | Key exists only on the original side. |
"clone" | Key exists only on the mirrored side. |
Aliases for asym: origin/image, base/derived, primary/secondary, left/right.
Adjustment Example
points:
zones:
matrix:
rotate: 10
mirror:
ref: matrix_inner_top
distance: 200
rotate: -5
mirror: 100Related
- Units
- Outlines
Sections
| Name | Description | Path |
|---|---|---|
| Metadata | meta top-level fields: engine version constraint, KiCad version/author embedding, and arbitrary documentation fields. | metadata.md |
| Units | Named numeric variables and built-in spacings (u, cx, cy) used as math formulas throughout the config. | units.md |
| Points | 2D key position system: anchors, column/row zones with inheritance, and post-layout rotation/mirroring adjustments. | points.md |
| Outlines | 2D shape assembly from rectangle/circle/polygon primitives placed at key points, combined via boolean operations. | outlines.md |
| Cases | 3D solid generation by extruding outlines and composing them in space; produces JSCAD output. | cases.md |
| PCBs | Footprint placement, net assignment, and KiCad PCB file generation. | pcbs.md |
Units
The units section defines named numeric variables (usable as math formulas) throughout the rest of the config. Built-in units cover standard MX and Choc key spacings.
Signature / Usage
units:
# override or extend built-in units
a: cy - 7
b: a * 1.5Built-in Units
| Name | Value (mm) | Description |
|---|---|---|
U | 19.05 | MX spacing (exact) |
u | 19 | MX spacing (rounded) |
cx | 18 | Choc X spacing |
cy | 17 | Choc Y spacing |
Internal Default Variables
These variables set default values for key-level attributes and can be overridden in units:
| Name | Default | Description |
|---|---|---|
$default_stagger | 0 | Default column stagger |
$default_spread | u | Default column spread |
$default_splay | 0 | Default column splay angle |
$default_height | u-1 | Default key height |
$default_width | u-1 | Default key width |
$default_padding | u | Default row padding |
$default_autobind | 10 | Default autobind reach |
Notes
- Any string that is a valid math formula can be used as a unit value.
- Units can reference other units defined earlier in the same block.
U(uppercase) andu(lowercase) are distinct: 19.05 vs 19.
Related
- Points