Skip to content

Commit 1f81441

Browse files
Fix documentation gaps that confused AI and developers.
Add AGENTS.md, ai-context page, expanded skills, Triki calibration/menu guide, terminology in SDK overview, and track the Cursor project skill so GitHub Pages and assistants share the same ground truth as the Swift sources. Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent 0254b4d commit 1f81441

14 files changed

Lines changed: 475 additions & 31 deletions

File tree

.cursor/skills/veltokit/SKILL.md

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
---
2+
name: veltokit
3+
description: VeltoKit BLE motion SDK and gametriki sample app. Use when editing Swift in VeltoKit/, app/, or website/docs/, or when answering questions about GameInput, MotionSDK, MotionMode, Triki UI, or BLE integration.
4+
---
5+
6+
# VeltoKit (gametriki repo)
7+
8+
## Before any edit
9+
10+
1. Read repo root **`AGENTS.md`** for paths, `GameInput` contract, and anti-patterns.
11+
2. Read **`VeltoKit/MotionSDK.swift`** and **`VeltoKit/GameInput.swift`** for API truth.
12+
3. For game behavior, read the matching **`app/Games/*Game.swift`** and **`website/docs/examples/*.md`**.
13+
14+
## Identity
15+
16+
- **VeltoKit** = Swift SDK in `VeltoKit/`. **gametriki** = sample app in `app/`.
17+
- Games use **`GameInput` only** — never raw BLE `Data` in `app/Games/`.
18+
- **Triki UI** = `app/UI/TrikiUI/` (menus, focus, hold). Not shipped as VeltoKit API.
19+
20+
## Frame pipeline
21+
22+
`BLE → MotionSDK.enqueueBLE / connect() → MotionEngine.updateFrame → GameInput → game.update(input:)`
23+
24+
```swift
25+
let input = motion.pollInput(deltaTime: dt) // after connect()
26+
```
27+
28+
## MotionMode → games
29+
30+
| Mode | Games | Main fields |
31+
|------|-------|-------------|
32+
| `.paddle` | Pong, Quiz | `posX`, `primaryAction` |
33+
| `.pointer` | Dart | `posX`, `posY`, `shotTriggered` |
34+
| `.gesture` | Bowling | `shotTriggered`, `throwPower` |
35+
36+
## Editing rules
37+
38+
- Minimal diffs; do not rename public API without request.
39+
- Update `///` on touched Swift APIs; sync `website/docs/` if behavior changes.
40+
- Docs source: `website/docs/` (English). Site search: navbar `⌘K` / `Ctrl+K`.
41+
42+
## Docs index (repo paths)
43+
44+
- Overview: `website/docs/sdk/overview.md`
45+
- GameInput: `website/docs/sdk/game-input.md`
46+
- AI context: `website/docs/ai-context.mdx`, `AGENTS.md`

.gitignore

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,10 @@ Package.resolved
2727
Icon?
2828
._*
2929

30-
# Cursor / IDE
31-
.cursor/
30+
# Cursor / IDE (keep shared project skills in repo)
31+
.cursor/*
32+
!.cursor/skills/
33+
!.cursor/skills/**
3234

3335
# Env / secrets
3436
.env

AGENTS.md

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
# VeltoKit / gametriki — context for AI assistants
2+
3+
Read this file **before** changing code or answering questions about this repository. Human docs: https://koderhack.github.io/veltokit/docs/intro — source in `website/docs/`.
4+
5+
## What this project is
6+
7+
- **VeltoKit** (`VeltoKit/`) — Swift package: BLE motion bytes → **`GameInput`** every frame. Public API: **`MotionSDK`**.
8+
- **gametriki** (`app/`) — sample iOS app (Xcode: `app/gametriki.xcodeproj`) that uses VeltoKit. Not a second SDK.
9+
- **Triki** — informal name for the BLE cap UI layer in the app (`app/UI/TrikiUI/`, `TrikiInputAdapter`). Games still consume **`GameInput`**, not raw BLE.
10+
11+
Unofficial / educational. Do not invent hardware brands or packet layouts not in `VeltoKit/BLE/` and `website/docs/sdk/ble-integration.md`.
12+
13+
## Terminology (do not confuse)
14+
15+
| Term | Meaning |
16+
|------|---------|
17+
| `MotionSDK` | Main SDK facade: `connect()`, `pollInput()`, `enqueueBLE`, `input` |
18+
| `MotionEngine` | Internal frame processor (modes, gestures) |
19+
| `GameInput` | **Only** struct games should use in `update(input:deltaTime:)` |
20+
| `MotionMode` | `.paddle` \| `.pointer` \| `.gesture` |
21+
| `TrikiInputAdapter` | App-only wrapper with calibration UI; forwards to `MotionSDK` |
22+
| `trikiUIScreen` | SwiftUI modifier for focus/hold navigation in menus |
23+
| `MotionInputProvider` | Typealias / protocol used by Triki UI for live `GameInput` |
24+
25+
## Repository map (read these paths)
26+
27+
```text
28+
VeltoKit/
29+
MotionSDK.swift # Public API — start here for SDK questions
30+
MotionEngine.swift # Per-frame processing, modes, calibration
31+
GameInput.swift # Output contract — start here for game logic
32+
MotionConfig.swift # Presets per MotionMode
33+
BLE/BLEManager.swift # Scan, connect, notify
34+
BLEGyroParser.swift # Packet parsing
35+
app/
36+
gametriki.xcodeproj
37+
Platform/TrikiInputAdapter.swift # Optional adapter (sample app)
38+
Engine/GameManager.swift # Applies MotionMode per game
39+
Engine/GameEngine.swift
40+
Games/PongGame.swift # .paddle
41+
Games/DartGame.swift # .pointer + throw
42+
Games/BowlingGame.swift # .gesture
43+
Games/QuizGame.swift # .paddle
44+
UI/TrikiUI/ # Navigation chrome (not in VeltoKit target)
45+
website/docs/ # Docusaurus source (English)
46+
website/static/skills/ # Downloadable Cursor/Claude prompts
47+
```
48+
49+
## Data flow (ground truth)
50+
51+
```text
52+
BLE notify bytes
53+
→ MotionSDK.enqueueBLE (or BLEManager inside connect())
54+
→ BLEGyroParser / ButtonDetector
55+
→ MotionEngine.updateFrame(deltaTime:)
56+
→ MotionSDK copies into GameInput
57+
→ Game.update(input:deltaTime:) OR Triki UI reads live GameInput
58+
```
59+
60+
Preferred integration after `connect()`:
61+
62+
```swift
63+
let input = motion.pollInput(deltaTime: dt)
64+
```
65+
66+
Manual BLE ownership:
67+
68+
```swift
69+
motion.enqueueBLE(bytes)
70+
motion.updateFrame(deltaTime: dt)
71+
let input = motion.input
72+
```
73+
74+
## GameInput — fields games actually use
75+
76+
| Field | Type | When it matters |
77+
|-------|------|-----------------|
78+
| `posX`, `posY` | `Double` | Aim / paddle position (~0…1, center ≈ 0.5) |
79+
| `primaryAction` | `Bool` | Button click this frame |
80+
| `shotTriggered` | `Bool` | Gesture throw edge (Dart, Bowling) |
81+
| `throwPower` | `Double` | 0…1 when `shotTriggered` |
82+
| `gesturePrimed` | `Bool` | Pull-back before throw (UI) |
83+
| `pointerDirection` | enum | Pointer mode sectors |
84+
| `didShoot` | computed | `primaryAction \|\| shotTriggered` |
85+
| `tiltX`, `tiltY`, `deltaX`, `deltaY` | `Double` | Debug / HUD |
86+
| `sensors` | `TrikiSensors` | Filled mainly by app `MotionParser`, not core SDK |
87+
88+
Full reference: `website/docs/sdk/game-input.md` and `VeltoKit/GameInput.swift`.
89+
90+
## MotionMode → sample games
91+
92+
| Mode | Games | Main inputs |
93+
|------|-------|-------------|
94+
| `.paddle` | Pong, Quiz | `posX`, `primaryAction` / `didShoot` |
95+
| `.pointer` | Dart | `posX`, `posY`, `shotTriggered`, `sensors` |
96+
| `.gesture` | Bowling | `posX`, `shotTriggered`, `throwPower` |
97+
98+
Mode setup in app: `app/Engine/GameManager.swift`. Per-game docs: `website/docs/examples/*.md`.
99+
100+
## Which docs to open (in repo)
101+
102+
| Task | Read first |
103+
|------|------------|
104+
| Integrate SDK in a new app | `website/docs/quick-start.md`, `sdk/motion-sdk.md`, `sdk/game-input.md` |
105+
| BLE packets / debugging | `sdk/ble-integration.md`, `VeltoKit/BLE/` |
106+
| Change gesture / throw | `sdk/gestures.md`, `VeltoKit/GestureDetector.swift` |
107+
| Triki menus / focus | `sdk/triki-ui.md`, `app/UI/TrikiUI/` |
108+
| Calibrate cap + simple menu (Quiz-style) | `sdk/triki-ui.md` (§ calibration), `app/UI/Quiz/QuizFlowView.swift`, `TrikiCalibrationView.swift` |
109+
| Copy a game pattern | `website/docs/examples/pong.md` (etc.) + matching `app/Games/*.swift` |
110+
| AI workflow / skills | `website/docs/ai-context.mdx`, `website/docs/for-cursor-claude.mdx` |
111+
112+
Website paths map 1:1: `website/docs/sdk/overview.md``/docs/sdk/overview` on the site.
113+
114+
## Rules when editing
115+
116+
1. **Scope**: SDK changes → `VeltoKit/` only unless app integration is requested. Do not move BLE into games.
117+
2. **Stable API**: Do not rename public symbols unless asked. Prefer minimal diffs.
118+
3. **Single output type**: Games must not depend on raw `Data` BLE in game files.
119+
4. **Docs**: Behavior change → update `website/docs/` and Swift `///` on touched APIs.
120+
5. **Swift comments**: Existing Polish `///` in VeltoKit is OK; new public API docs can be English or Polish — stay consistent within the file you touch.
121+
6. **No fake APIs**: If unsure, read `MotionSDK.swift` and call sites in `app/Games/`.
122+
123+
## Common AI mistakes in this repo
124+
125+
- Treating **gametriki** as a separate framework from **VeltoKit**.
126+
- Using marketing names for hardware instead of “generic BLE cap” / packet docs.
127+
- Editing `posX` mapping in games without checking `MotionMode` and `MotionConfig.preset`.
128+
- Confusing **Triki UI** (SwiftUI navigation) with **GameInput** (per-frame state).
129+
- Linking to `/skills/...` as Docusaurus routes — they are static files under `website/static/skills/`.
130+
- Assuming Algolia search — docs use **local search** (navbar, `⌘K` / `Ctrl+K`).
131+
132+
## Validation
133+
134+
- SDK-only logic: build **VeltoKit** scheme in Xcode or SwiftPM.
135+
- App + BLE: scheme **gametriki** on a physical iPhone.
136+
- Docs site: `cd website && npm run build`.

README.md

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,14 +67,29 @@ func tick(dt: TimeInterval) {
6767

6868
Presets and per-game tuning: [`app/Engine/GameManager.swift`](./app/Engine/GameManager.swift).
6969

70+
## For AI assistants (Cursor, Claude, …)
71+
72+
If the model confuses **VeltoKit** vs **gametriki** or invents APIs, point it at:
73+
74+
| Resource | Location |
75+
|----------|----------|
76+
| **AGENTS.md** | Repo root — read this first |
77+
| **Context for AI** | [website/docs/ai-context.mdx](./website/docs/ai-context.mdx) |
78+
| **Cursor skill** | [.cursor/skills/veltokit/SKILL.md](./.cursor/skills/veltokit/SKILL.md) (tracked in repo) |
79+
| **Triki menu + calibration** | [Triki UI docs](website/docs/sdk/triki-ui.md#calibration-and-simple-menu) · Quiz: `app/UI/Quiz/QuizFlowView.swift` |
80+
| **Download prompts** | [For Cursor Claude](https://koderhack.github.io/veltokit/docs/for-cursor-claude) |
81+
82+
Ground truth for game code: [`VeltoKit/GameInput.swift`](./VeltoKit/GameInput.swift) and [`VeltoKit/MotionSDK.swift`](./VeltoKit/MotionSDK.swift).
83+
7084
## Documentation
7185

7286
| | |
7387
|---|---|
7488
| **Site** | https://koderhack.github.io/veltokit/ |
7589
| **Docs** | https://koderhack.github.io/veltokit/docs/intro |
90+
| **AI context** | https://koderhack.github.io/veltokit/docs/ai-context |
7691

77-
English source docs; use **Translate** in the navbar for other languages (Google Translate).
92+
English source docs; use **Translate** in the navbar for other languages (Google Translate). **Search** in the docs navbar: `⌘K` / `Ctrl+K`.
7893

7994
[intro](website/docs/intro.mdx) · [SDK](website/docs/sdk/overview.md) · [Pong](website/docs/examples/pong.md)
8095

website/docs/ai-context.mdx

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
---
2+
title: Context for AI
3+
description: Ground truth for Cursor, Claude, and other assistants — repo map, GameInput contract, doc index
4+
---
5+
6+
import SkillDownloads from '@site/src/components/SkillDownloads';
7+
8+
# Context for AI
9+
10+
If an assistant **misunderstands** this project, give it this page or the repo root file **`AGENTS.md`** (same facts, optimized for tools that auto-read the repository).
11+
12+
:::tip Szybko po polsku
13+
**VeltoKit** = biblioteka Swift (`VeltoKit/`). **gametriki** = przykładowa aplikacja iOS (`app/`). Gry czytają tylko **`GameInput`**, nie surowe BLE. Szukaj w docs: **Search** (`⌘K` / `Ctrl+K`). Skill do Cursor/Claude: [For Cursor Claude](./for-cursor-claude#download-ai-skills).
14+
:::
15+
16+
## Copy-paste prompt for any AI
17+
18+
```text
19+
You are working on the VeltoKit repository (gametriki monorepo).
20+
Read AGENTS.md at the repo root before answering or editing.
21+
VeltoKit/ is the Swift SDK (MotionSDK → GameInput). app/ is the sample iOS app.
22+
Games must use GameInput only. Triki UI is app-only navigation, not part of the SDK target.
23+
When unsure, open VeltoKit/MotionSDK.swift, VeltoKit/GameInput.swift, and the matching file in app/Games/.
24+
Human documentation source lives in website/docs/ (English).
25+
```
26+
27+
## One-sentence summary
28+
29+
**VeltoKit** converts BLE cap IMU + button packets into **`GameInput`** each frame; **gametriki** is the reference app that demonstrates Pong, Dart, Bowling, and Quiz.
30+
31+
## Architecture (read in this order)
32+
33+
1. [Architecture](./sdk/architecture) — layers and frame pipeline
34+
2. [GameInput](./sdk/game-input) — field contract (what games use)
35+
3. [MotionSDK API](./sdk/motion-sdk)`connect`, `pollInput`, `enqueueBLE`
36+
4. [Module map](./sdk/modules) — file-level map
37+
38+
```mermaid
39+
flowchart LR
40+
BLE[BLE bytes]
41+
SDK[MotionSDK]
42+
GI[GameInput]
43+
G[app/Games]
44+
45+
BLE --> SDK --> GI --> G
46+
```
47+
48+
## Repo paths (not website URLs)
49+
50+
| Path | Role |
51+
|------|------|
52+
| `VeltoKit/MotionSDK.swift` | Public SDK entry |
53+
| `VeltoKit/GameInput.swift` | Output struct — **ground truth for game code** |
54+
| `app/Platform/TrikiInputAdapter.swift` | Sample adapter + calibration |
55+
| `app/Engine/GameManager.swift` | Sets `MotionMode` per game |
56+
| `app/Games/*.swift` | Integration examples |
57+
| `website/docs/` | Documentation you are reading now |
58+
| `AGENTS.md` (repo root) | Machine-oriented duplicate of this page |
59+
60+
## MotionMode cheat sheet
61+
62+
| Mode | Sample game | Key `GameInput` fields |
63+
|------|---------------|-------------------------|
64+
| `.paddle` | Pong, Quiz | `posX`, `primaryAction` |
65+
| `.pointer` | Dart | `posX`, `posY`, `shotTriggered` |
66+
| `.gesture` | Bowling | `shotTriggered`, `throwPower` |
67+
68+
Details: [examples](./examples/pong) · [configuration](./sdk/configuration).
69+
70+
## Task → which doc / file
71+
72+
| You want to… | Open |
73+
|--------------|------|
74+
| Add VeltoKit to a new app | [Quick Start](./quick-start), [installation](./installation) |
75+
| Understand BLE bytes | [BLE integration](./sdk/ble-integration), `VeltoKit/BLE/` |
76+
| Fix throw / gesture | [Gestures](./sdk/gestures), `VeltoKit/GestureDetector.swift` |
77+
| Fix cap menus (focus, hold) | [Triki UI](./sdk/triki-ui), `app/UI/TrikiUI/` |
78+
| Calibrate + simple Triki menu | [Triki UI — calibration & simple menu](./sdk/triki-ui#calibration-and-simple-menu), `QuizFlowView.swift` |
79+
| Match Pong/Dart/Bowling/Quiz | `website/docs/examples/*` + `app/Games/` |
80+
81+
## Mistakes assistants often make
82+
83+
- Calling the sample app framework “gametriki SDK” — the SDK name is **VeltoKit** only.
84+
- Inventing `GameInput` fields that do not exist in `VeltoKit/GameInput.swift`.
85+
- Putting CoreBluetooth code inside `app/Games/` (belongs in SDK or Platform).
86+
- Ignoring `MotionMode` when changing `posX` / throw behavior.
87+
88+
## Downloadable skills {#download-ai-skills}
89+
90+
<SkillDownloads showHeading={false} />
91+
92+
Also install from clone: `.cursor/skills/veltokit/SKILL.md` (Cursor) or paste into Claude Project instructions.
93+
94+
[For Cursor Claude hub](./for-cursor-claude) · [Skill for Cursor](./for-cursor) · [Skill for Claude](./for-claude)

website/docs/for-cursor-claude.mdx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,12 @@ import SkillDownloads from '@site/src/components/SkillDownloads';
1111
This page is a practical hub for AI-assisted development in this repository.
1212
Use it as a fast checklist before implementing, debugging, or documenting.
1313

14+
:::warning Jeśli AI „nie rozumie” dokumentacji
15+
1. Wklej do czatu treść z **[Context for AI](./ai-context)** lub wskaż plik **`AGENTS.md`** w katalogu głównym repozytorium.
16+
2. Zainstaluj skill: `.cursor/skills/veltokit/SKILL.md` (już w repo) albo pobierz plik `.md` poniżej.
17+
3. Proś AI o czytanie **`VeltoKit/GameInput.swift`** i **`VeltoKit/MotionSDK.swift`** — to jest kontrakt API, nie tylko strony www.
18+
:::
19+
1420
:::info Po polsku — gdzie co jest
1521
**Wyszukiwarka dokumentacji:** pole **Search** w prawym górnym rogu paska (`⌘K` / `Ctrl+K`).
1622
**Pobranie skilli Cursor / Claude:** sekcja [Download AI skills](#download-ai-skills) poniżej (przyciski **Download**), albo menu **AI Skills** w navbarze → **↓ Download Cursor (.md)** / **↓ Download Claude (.md)**.
@@ -27,6 +33,7 @@ Use the **Search** field in the top navbar (keyboard: `⌘K` on macOS, `Ctrl+K`
2733

2834
## Fast orientation
2935

36+
- **AI ground truth:** [Context for AI](./ai-context) · repo root `AGENTS.md`
3037
- SDK core: `VeltoKit/`
3138
- Sample app: `app/`
3239
- Website docs: `website/docs/`
@@ -103,5 +110,7 @@ Prioritize developer-facing clarity and actionable examples.
103110
- [Module map](./sdk/modules)
104111
- [Configuration](./sdk/configuration)
105112
- [Gestures](./sdk/gestures)
113+
- [Context for AI](./ai-context)
114+
- [Triki UI — calibration & menu](./sdk/triki-ui#calibration-and-simple-menu)
106115
- [Skill for Cursor](./for-cursor)
107116
- [Skill for Claude](./for-claude)

website/docs/intro.mdx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import SkillDownloads from '@site/src/components/SkillDownloads';
1212

1313
Experimental Swift layer: **reverse-engineered BLE cap controller → `GameInput`**. Learn how tilt, throw gestures, and button edges become game-ready fields every frame.
1414

15-
Use **Search** in the navbar (`⌘K` / `Ctrl+K`) to find topics. AI skill downloads are below and on [For Cursor Claude](./for-cursor-claude).
15+
Use **Search** in the navbar (`⌘K` / `Ctrl+K`) to find topics. **AI assistants:** start with [Context for AI](./ai-context) or repo root `AGENTS.md` — then download skills below or on [For Cursor Claude](./for-cursor-claude).
1616

1717
:::info Po polsku — wyszukiwarka i skille
1818
**Wyszukiwarka:** pole **Search** w prawym górnym rogu nawigacji — skrót `⌘K` (Mac) lub `Ctrl+K` (Windows/Linux).
@@ -59,7 +59,9 @@ Each demo documents **VeltoKit mode**, **GameInput** fields, and **source files*
5959
| Connect controller in one call | [Quick start](quick-start) (`connect()` + `pollInput()`) |
6060
| Wire my own BLE stack | [BLE integration](sdk/ble-integration) |
6161
| Help — app, controller, TV | [Help](faq) |
62-
| Search all docs | Use the **Search** box in the top bar (`Ctrl/Cmd + K` on many browsers) |
62+
| Search all docs | Use the **Search** box in the top bar (`⌘K` / `Ctrl+K`) |
63+
| AI assistant confused by docs | [Context for AI](ai-context) · `AGENTS.md` in repo root |
64+
| Calibrate cap + Triki menu (like Quiz) | [Triki UI — calibration & simple menu](sdk/triki-ui#calibration-and-simple-menu) |
6365
| Download Cursor / Claude skills | [Download AI skills](#download-ai-skills) on this page |
6466

6567
## Download AI skills {#download-ai-skills}

website/docs/sdk/overview.md

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,18 @@ description: VeltoKit — MotionSDK and GameInput
88

99
**VeltoKit** maps BLE motion bytes → **`GameInput`** each frame. No UI, no CoreBluetooth in the core target.
1010

11+
:::info Names (do not confuse)
12+
| Name | What it is |
13+
|------|------------|
14+
| **VeltoKit** | Swift SDK in `VeltoKit/` — link this in your app |
15+
| **gametriki** | Sample iOS app in `app/` — not a second framework |
16+
| **Triki** | Informal name for the BLE cap + app UI layer (`TrikiInputAdapter`, `TrikiUI`) |
17+
18+
**API source of truth:** `VeltoKit/GameInput.swift` and `VeltoKit/MotionSDK.swift` — not marketing text on the website. If docs and code disagree, trust the Swift files.
19+
:::
20+
1121
:::tip Docs search & AI skills
22+
Use **Search** (`⌘K` / `Ctrl+K`). Assistants: [Context for AI](../ai-context) · repo root `AGENTS.md`.
1223
Use **Search** in the top navbar (`⌘K` / `Ctrl+K`) to find any topic.
1324
Download Cursor / Claude prompt files on [For Cursor Claude](../for-cursor-claude#download-ai-skills) (footer: **AI skills (download)**).
1425
:::
@@ -35,7 +46,7 @@ motion.updateFrame(deltaTime: dt)
3546
let input = motion.input
3647
```
3748

38-
Optional: **`TrikiInputAdapter`** in the sample app adds calibration UI on top of `MotionSDK` — see [BLE integration](./ble-integration).
49+
Optional: **`TrikiInputAdapter`** in the sample app adds calibration UI on top of `MotionSDK` — see [BLE integration](./ble-integration). For cap calibration + a motion-driven menu (Quiz-style), see [Triki UI — calibration & simple menu](./triki-ui#calibration-and-simple-menu).
3950

4051
## Modes
4152

0 commit comments

Comments
 (0)