# CLAUDE.md ## Style - Keep everything short: replies, explanations, comments, docs. - Use simple English: short sentences, common words. - Avoid em dashes (—). Do not just swap them for "-" either. Rewrite the sentence instead, for example with a comma, a colon, brackets or two sentences. ## Commits - English only. - Conventional Commits prefix: `feat:`, `fix:`, `chore:`, `docs:`, `refactor:`, `ci:`, `build:`, `test:`. - Subject as short as possible. Imperative, lowercase, no trailing period. - Body only when something genuinely cannot be inferred from the diff. - Never add `Co-Authored-By`, "Generated with" or any other AI attribution to commits or PR descriptions. - Do not commit or push before I have checked the changes locally and said they are fine. Then commit and push. Several attempts at the same thing make one commit, and attempts that did not work make none. Different things done in one session get a commit each. This also goes for releases and tags. ## Project - The plugin is plain JavaScript (ES modules) for Node.js 22+, without dependencies. Keep it that way: OpenDeck runs it with the system Node, and there is no build step. - Plugin ID is `de.felitendo.obs-tools` (folder `de.felitendo.obs-tools.sdPlugin`), like the Feishin plugin. Do not change it again: OpenDeck keys profiles and settings by it. - `manifest.json` and the icons in `images/` are generated. Change `scripts/manifest.mjs` or the glyphs in `plugin/lib/icons.js`, then run `make manifest` or `make icons`. `make icons` first measures every glyph (`scripts/fit-glyphs.mjs`, needs ImageMagick), so all icons end up the same optical size and optically centered (halfway between the middle of the box and the center of mass, so a play triangle does not look too far left). The action order in `scripts/manifest.mjs` is the order in OpenDeck: most used first. - Settings pages come from `pi/schemas.js`. A new setting needs a default in the action class and a field in the schema. The status line is on top. Its "Change" button opens the connection settings right below it, and they open by themselves while OBS cannot be reached. The settings of the key follow in sections (`section` in `pi/schemas.js`): what the key is about, Controls, On the key, and closed sections for the rest. Use the own `dropdown()`, `checkbox()` and number stepper in `pi/pi.js`, never native `