jogpad 0.14.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. jogpad-0.14.1/.gitattributes +2 -0
  2. jogpad-0.14.1/.github/CODEOWNERS +1 -0
  3. jogpad-0.14.1/.github/ISSUE_TEMPLATE/bug_report.yml +41 -0
  4. jogpad-0.14.1/.github/ISSUE_TEMPLATE/config.yml +8 -0
  5. jogpad-0.14.1/.github/ISSUE_TEMPLATE/feature_request.yml +21 -0
  6. jogpad-0.14.1/.github/ISSUE_TEMPLATE/pad_report.yml +43 -0
  7. jogpad-0.14.1/.github/dependabot.yml +16 -0
  8. jogpad-0.14.1/.github/pull_request_template.md +11 -0
  9. jogpad-0.14.1/.github/workflows/ci.yml +74 -0
  10. jogpad-0.14.1/.github/workflows/codeql.yml +24 -0
  11. jogpad-0.14.1/.github/workflows/docs.yml +37 -0
  12. jogpad-0.14.1/.github/workflows/pr.yml +35 -0
  13. jogpad-0.14.1/.github/workflows/release.yml +44 -0
  14. jogpad-0.14.1/.gitignore +14 -0
  15. jogpad-0.14.1/.release-please-manifest.json +3 -0
  16. jogpad-0.14.1/AGENTS.md +43 -0
  17. jogpad-0.14.1/CHANGELOG.md +210 -0
  18. jogpad-0.14.1/CODE_OF_CONDUCT.md +11 -0
  19. jogpad-0.14.1/CONTRIBUTING.md +86 -0
  20. jogpad-0.14.1/LICENSE +21 -0
  21. jogpad-0.14.1/PKG-INFO +240 -0
  22. jogpad-0.14.1/README.md +207 -0
  23. jogpad-0.14.1/SECURITY.md +17 -0
  24. jogpad-0.14.1/docs/assets/demo.svg +199 -0
  25. jogpad-0.14.1/docs/assets/icon.svg +1 -0
  26. jogpad-0.14.1/docs/assets/logo-dark.svg +1 -0
  27. jogpad-0.14.1/docs/assets/logo.svg +1 -0
  28. jogpad-0.14.1/docs/assets/screenshots/check-direction.png +0 -0
  29. jogpad-0.14.1/docs/assets/screenshots/learn-key.png +0 -0
  30. jogpad-0.14.1/docs/assets/screenshots/mainsail-panel.png +0 -0
  31. jogpad-0.14.1/docs/assets/screenshots/web-page-dark.png +0 -0
  32. jogpad-0.14.1/docs/assets/screenshots/web-page-light.png +0 -0
  33. jogpad-0.14.1/docs/contributing.md +8 -0
  34. jogpad-0.14.1/docs/index.md +71 -0
  35. jogpad-0.14.1/docs/installation.md +83 -0
  36. jogpad-0.14.1/docs/reference/api.md +25 -0
  37. jogpad-0.14.1/docs/reference/cli.md +89 -0
  38. jogpad-0.14.1/docs/reference/config.md +69 -0
  39. jogpad-0.14.1/docs/safety.md +57 -0
  40. jogpad-0.14.1/docs/usage.md +328 -0
  41. jogpad-0.14.1/docs/use-cases.md +80 -0
  42. jogpad-0.14.1/pyproject.toml +94 -0
  43. jogpad-0.14.1/release-please-config.json +12 -0
  44. jogpad-0.14.1/scripts/check_docs_impact.py +47 -0
  45. jogpad-0.14.1/scripts/check_i18n.py +57 -0
  46. jogpad-0.14.1/scripts/gen_reference.py +117 -0
  47. jogpad-0.14.1/scripts/install.sh +145 -0
  48. jogpad-0.14.1/scripts/screenshots.py +143 -0
  49. jogpad-0.14.1/src/jogpad/__init__.py +8 -0
  50. jogpad-0.14.1/src/jogpad/__main__.py +5 -0
  51. jogpad-0.14.1/src/jogpad/api.py +426 -0
  52. jogpad-0.14.1/src/jogpad/ch57x.py +194 -0
  53. jogpad-0.14.1/src/jogpad/cli.py +226 -0
  54. jogpad-0.14.1/src/jogpad/config.py +267 -0
  55. jogpad-0.14.1/src/jogpad/config_store.py +73 -0
  56. jogpad-0.14.1/src/jogpad/core.py +397 -0
  57. jogpad-0.14.1/src/jogpad/events.py +45 -0
  58. jogpad-0.14.1/src/jogpad/i18n.py +38 -0
  59. jogpad-0.14.1/src/jogpad/keys.py +77 -0
  60. jogpad-0.14.1/src/jogpad/klipper/jogpad.cfg +17 -0
  61. jogpad-0.14.1/src/jogpad/klipper_setup.py +53 -0
  62. jogpad-0.14.1/src/jogpad/layouts/ch57x-9k3.json +20 -0
  63. jogpad-0.14.1/src/jogpad/layouts/numpad.json +24 -0
  64. jogpad-0.14.1/src/jogpad/layouts.py +103 -0
  65. jogpad-0.14.1/src/jogpad/linux_input.py +75 -0
  66. jogpad-0.14.1/src/jogpad/locales/de.json +114 -0
  67. jogpad-0.14.1/src/jogpad/locales/en.json +114 -0
  68. jogpad-0.14.1/src/jogpad/moonraker.py +172 -0
  69. jogpad-0.14.1/src/jogpad/service.py +130 -0
  70. jogpad-0.14.1/src/jogpad/web/app.js +672 -0
  71. jogpad-0.14.1/src/jogpad/web/favicon.svg +1 -0
  72. jogpad-0.14.1/src/jogpad/web/icons.svg +44 -0
  73. jogpad-0.14.1/src/jogpad/web/index.html +77 -0
  74. jogpad-0.14.1/src/jogpad/web/style.css +278 -0
  75. jogpad-0.14.1/src/jogpad/web/tokens.css +83 -0
  76. jogpad-0.14.1/tests/test_api.py +311 -0
  77. jogpad-0.14.1/tests/test_ch57x.py +170 -0
  78. jogpad-0.14.1/tests/test_cli.py +130 -0
  79. jogpad-0.14.1/tests/test_config.py +150 -0
  80. jogpad-0.14.1/tests/test_config_store.py +63 -0
  81. jogpad-0.14.1/tests/test_core.py +554 -0
  82. jogpad-0.14.1/tests/test_events.py +38 -0
  83. jogpad-0.14.1/tests/test_i18n.py +15 -0
  84. jogpad-0.14.1/tests/test_keys.py +37 -0
  85. jogpad-0.14.1/tests/test_klipper_setup.py +85 -0
  86. jogpad-0.14.1/tests/test_layouts.py +49 -0
  87. jogpad-0.14.1/tests/test_linux_input.py +45 -0
  88. jogpad-0.14.1/tests/test_moonraker.py +206 -0
  89. jogpad-0.14.1/tests/test_service.py +212 -0
  90. jogpad-0.14.1/zensical.toml +64 -0
@@ -0,0 +1,2 @@
1
+ * text=auto eol=lf
2
+ *.png binary
@@ -0,0 +1 @@
1
+ * @Aitch-ko
@@ -0,0 +1,41 @@
1
+ name: Bug report
2
+ description: Something does not work as documented.
3
+ labels: ["type: bug"]
4
+ body:
5
+ - type: textarea
6
+ id: what
7
+ attributes:
8
+ label: What happened
9
+ description: What did you do, what did you expect, what happened instead?
10
+ validations:
11
+ required: true
12
+ - type: input
13
+ id: version
14
+ attributes:
15
+ label: jogpad version
16
+ placeholder: "jogpad --version"
17
+ validations:
18
+ required: true
19
+ - type: input
20
+ id: firmware
21
+ attributes:
22
+ label: Firmware and host
23
+ placeholder: "Klipper v0.13 on Raspberry Pi 4, Raspberry Pi OS 12"
24
+ validations:
25
+ required: true
26
+ - type: input
27
+ id: pad
28
+ attributes:
29
+ label: Pad
30
+ placeholder: "CH57x 3x3 with 2 knobs, USB ID 1189:8890"
31
+ - type: textarea
32
+ id: config
33
+ attributes:
34
+ label: Configuration
35
+ description: Your jogpad.toml, without passwords or tokens.
36
+ render: toml
37
+ - type: textarea
38
+ id: log
39
+ attributes:
40
+ label: Log output
41
+ render: text
@@ -0,0 +1,8 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Question or idea
4
+ url: https://github.com/Aitch-ko/jogpad/discussions
5
+ about: Ask in Discussions; issues are for bugs, features and pad reports.
6
+ - name: Security issue
7
+ url: https://github.com/Aitch-ko/jogpad/security/advisories/new
8
+ about: Report vulnerabilities privately.
@@ -0,0 +1,21 @@
1
+ name: Feature request
2
+ description: Suggest something jogpad should do.
3
+ labels: ["type: feature"]
4
+ body:
5
+ - type: textarea
6
+ id: problem
7
+ attributes:
8
+ label: Problem
9
+ description: What are you trying to do, and what stops you today?
10
+ validations:
11
+ required: true
12
+ - type: textarea
13
+ id: proposal
14
+ attributes:
15
+ label: Proposal
16
+ description: How could jogpad solve it?
17
+ - type: input
18
+ id: firmware
19
+ attributes:
20
+ label: Firmware
21
+ placeholder: "Klipper, RepRapFirmware, FluidNC, ..."
@@ -0,0 +1,43 @@
1
+ name: Pad report
2
+ description: Tell us whether a macro pad works with jogpad.
3
+ labels: ["pad report"]
4
+ body:
5
+ - type: input
6
+ id: model
7
+ attributes:
8
+ label: Pad
9
+ description: Name or listing, number of keys and knobs.
10
+ placeholder: "9 keys + 3 knobs, wired"
11
+ validations:
12
+ required: true
13
+ - type: input
14
+ id: usb
15
+ attributes:
16
+ label: USB ID
17
+ description: From `lsusb` on Linux.
18
+ placeholder: "1189:8890"
19
+ validations:
20
+ required: true
21
+ - type: dropdown
22
+ id: works
23
+ attributes:
24
+ label: Does it work?
25
+ options:
26
+ - "Yes, fully"
27
+ - "Partly"
28
+ - "No"
29
+ validations:
30
+ required: true
31
+ - type: dropdown
32
+ id: detents
33
+ attributes:
34
+ label: Do the knobs have noticeable detents?
35
+ options:
36
+ - "Yes"
37
+ - "No"
38
+ - "No knobs"
39
+ - type: textarea
40
+ id: notes
41
+ attributes:
42
+ label: Notes
43
+ description: What works, what does not, how you programmed the pad.
@@ -0,0 +1,16 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: pip
4
+ directory: /
5
+ schedule:
6
+ interval: weekly
7
+ commit-message:
8
+ prefix: "chore(deps)"
9
+ labels: ["dependencies", "docs: not needed"]
10
+ - package-ecosystem: github-actions
11
+ directory: /
12
+ schedule:
13
+ interval: weekly
14
+ commit-message:
15
+ prefix: "ci"
16
+ labels: ["dependencies", "docs: not needed"]
@@ -0,0 +1,11 @@
1
+ <!--
2
+ This description becomes the commit message on main (squash merge), so write
3
+ it like one: why the change is needed, plain text, "Closes #123" if it fixes
4
+ an issue.
5
+
6
+ CI checks the rest: Conventional Commit title, tests, reference pages,
7
+ translations, and docs (or the label "docs: not needed").
8
+
9
+ For changes to jogging, locks or STOP, say on which machine and pad you tried
10
+ it, or that you did not.
11
+ -->
@@ -0,0 +1,74 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ concurrency:
12
+ group: ci-${{ github.ref }}
13
+ cancel-in-progress: true
14
+
15
+ jobs:
16
+ lint:
17
+ name: Lint and types
18
+ runs-on: ubuntu-latest
19
+ steps:
20
+ - uses: actions/checkout@v7
21
+ - uses: actions/setup-python@v7
22
+ with:
23
+ python-version: "3.12"
24
+ cache: pip
25
+ - run: pip install -e ".[dev]"
26
+ - run: ruff format --check .
27
+ - run: ruff check .
28
+ - run: mypy
29
+ - run: shellcheck scripts/*.sh
30
+
31
+ test:
32
+ name: Tests (${{ matrix.os }}, Python ${{ matrix.python }})
33
+ runs-on: ${{ matrix.os }}
34
+ strategy:
35
+ fail-fast: false
36
+ matrix:
37
+ os: [ubuntu-latest]
38
+ python: ["3.10", "3.11", "3.12", "3.13"]
39
+ include:
40
+ - os: windows-latest
41
+ python: "3.12"
42
+ steps:
43
+ - uses: actions/checkout@v7
44
+ - uses: actions/setup-python@v7
45
+ with:
46
+ python-version: ${{ matrix.python }}
47
+ cache: pip
48
+ - run: pip install -e ".[dev]"
49
+ - run: pytest
50
+
51
+ docs:
52
+ name: Docs and translations in sync
53
+ runs-on: ubuntu-latest
54
+ steps:
55
+ - uses: actions/checkout@v7
56
+ - uses: actions/setup-python@v7
57
+ with:
58
+ # One fixed version: argparse formats --help differently between versions,
59
+ # and the CLI reference is generated from it.
60
+ python-version: "3.12"
61
+ cache: pip
62
+ - run: pip install -e ".[dev,docs]"
63
+ - name: Reference pages match the code
64
+ run: python scripts/gen_reference.py --check
65
+ - name: Messages exist in English and German
66
+ run: python scripts/check_i18n.py
67
+ - name: Documentation builds without warnings
68
+ run: zensical build --strict
69
+ # Otherwise a broken package would only show when a release publishes it.
70
+ - name: Package builds, and PyPI can show its description
71
+ run: |
72
+ pip install build twine "readme-renderer[md]"
73
+ python -m build
74
+ twine check --strict dist/*
@@ -0,0 +1,24 @@
1
+ name: CodeQL
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ schedule:
8
+ - cron: "17 4 * * 1"
9
+
10
+ permissions:
11
+ contents: read
12
+ security-events: write
13
+
14
+ jobs:
15
+ analyze:
16
+ # Free for public repositories only.
17
+ if: ${{ !github.event.repository.private }}
18
+ runs-on: ubuntu-latest
19
+ steps:
20
+ - uses: actions/checkout@v7
21
+ - uses: github/codeql-action/init@v4
22
+ with:
23
+ languages: python
24
+ - uses: github/codeql-action/analyze@v4
@@ -0,0 +1,37 @@
1
+ name: Docs site
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ paths: ["docs/**", "zensical.toml", ".github/workflows/docs.yml"]
7
+ workflow_dispatch:
8
+
9
+ permissions:
10
+ contents: read
11
+ pages: write
12
+ id-token: write
13
+
14
+ concurrency:
15
+ group: pages
16
+ cancel-in-progress: false
17
+
18
+ jobs:
19
+ deploy:
20
+ # GitHub Pages needs a public repository on the free plan.
21
+ if: ${{ !github.event.repository.private }}
22
+ runs-on: ubuntu-latest
23
+ environment:
24
+ name: github-pages
25
+ url: ${{ steps.deployment.outputs.page_url }}
26
+ steps:
27
+ - uses: actions/checkout@v7
28
+ - uses: actions/setup-python@v7
29
+ with:
30
+ python-version: "3.12"
31
+ - run: pip install -e ".[docs]"
32
+ - run: zensical build --strict
33
+ - uses: actions/upload-pages-artifact@v5
34
+ with:
35
+ path: site
36
+ - id: deployment
37
+ uses: actions/deploy-pages@v5
@@ -0,0 +1,35 @@
1
+ name: Pull request
2
+
3
+ on:
4
+ pull_request:
5
+ types: [opened, edited, synchronize, reopened, labeled, unlabeled]
6
+
7
+ permissions:
8
+ contents: read
9
+ pull-requests: read
10
+
11
+ jobs:
12
+ title:
13
+ name: Title follows Conventional Commits
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - uses: amannn/action-semantic-pull-request@v6
17
+ env:
18
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
19
+
20
+ docs-impact:
21
+ name: Code change has docs or label
22
+ # Release PRs only bump the version; their documentation is the changelog.
23
+ if: ${{ !startsWith(github.head_ref, 'release-please--') }}
24
+ runs-on: ubuntu-latest
25
+ steps:
26
+ - uses: actions/checkout@v7
27
+ with:
28
+ fetch-depth: 0
29
+ - uses: actions/setup-python@v7
30
+ with:
31
+ python-version: "3.12"
32
+ - name: Check
33
+ env:
34
+ NOT_NEEDED: "${{ contains(github.event.pull_request.labels.*.name, 'docs: not needed') && '--not-needed' || '' }}"
35
+ run: python scripts/check_docs_impact.py "origin/${{ github.base_ref }}" $NOT_NEEDED
@@ -0,0 +1,44 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+
7
+ permissions:
8
+ contents: write
9
+ pull-requests: write
10
+
11
+ jobs:
12
+ release-please:
13
+ runs-on: ubuntu-latest
14
+ outputs:
15
+ release_created: ${{ steps.release.outputs.release_created }}
16
+ tag_name: ${{ steps.release.outputs.tag_name }}
17
+ steps:
18
+ - id: release
19
+ uses: googleapis/release-please-action@v5
20
+ with:
21
+ config-file: release-please-config.json
22
+ manifest-file: .release-please-manifest.json
23
+
24
+ publish:
25
+ name: Publish to PyPI
26
+ needs: release-please
27
+ # Off until a trusted publisher is set up on PyPI and the repository
28
+ # variable PYPI_PUBLISH is set to "true".
29
+ if: needs.release-please.outputs.release_created == 'true' && vars.PYPI_PUBLISH == 'true'
30
+ runs-on: ubuntu-latest
31
+ environment: pypi
32
+ permissions:
33
+ id-token: write
34
+ contents: read
35
+ steps:
36
+ - uses: actions/checkout@v7
37
+ with:
38
+ ref: ${{ needs.release-please.outputs.tag_name }}
39
+ - uses: actions/setup-python@v7
40
+ with:
41
+ python-version: "3.12"
42
+ - run: pip install build
43
+ - run: python -m build
44
+ - uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,14 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ .venv/
4
+ venv/
5
+ build/
6
+ dist/
7
+ *.egg-info/
8
+ .pytest_cache/
9
+ .ruff_cache/
10
+ .coverage
11
+ htmlcov/
12
+ site/
13
+ .cache/
14
+ .DS_Store
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.14.1"
3
+ }
@@ -0,0 +1,43 @@
1
+ # Notes for coding agents
2
+
3
+ Read [CONTRIBUTING.md](CONTRIBUTING.md) first; its rules apply to agents too.
4
+
5
+ ## Layout
6
+
7
+ | Path | What |
8
+ | --- | --- |
9
+ | `src/jogpad/core.py` | key events to moves: steps, merging, locks, HOME, knob axis |
10
+ | `src/jogpad/moonraker.py`, `linux_input.py`, `service.py` | firmware, input devices, threads |
11
+ | `src/jogpad/ch57x.py` | programming CH57x macro pads through hidraw |
12
+ | `src/jogpad/config.py` | configuration schema (pydantic); source of `docs/reference/config.md` |
13
+ | `src/jogpad/cli.py` | command line; source of `docs/reference/cli.md` |
14
+ | `src/jogpad/api.py` | FastAPI app; source of `docs/reference/api.md` |
15
+ | `src/jogpad/i18n.py`, `src/jogpad/locales/` | message catalogs |
16
+ | `scripts/` | reference generator and the checks CI runs |
17
+ | `docs/` | Zensical documentation |
18
+
19
+ ## Commands
20
+
21
+ ```bash
22
+ pip install -e ".[dev,docs]"
23
+ ruff format . && ruff check . && mypy && pytest
24
+ python scripts/gen_reference.py # after changing config, CLI or API
25
+ python scripts/check_i18n.py
26
+ zensical build --strict
27
+ ```
28
+
29
+ ## Rules
30
+
31
+ - English only in the repository.
32
+ - After changing configuration, CLI or API, regenerate `docs/reference/` and
33
+ commit it. Never edit those pages by hand.
34
+ - New user-facing text: `t("literal.key")`, plus the key in `en.json` and
35
+ `de.json`.
36
+ - Changed behaviour needs a change in `docs/` or the label `docs: not needed`.
37
+ - New features and newly tested hardware also update the Status section of
38
+ `README.md`; CI cannot tell when it is out of date.
39
+ - Visible changes to the web page: run `python scripts/screenshots.py` and
40
+ commit the new images under `docs/assets/screenshots/`.
41
+ - The HTTP API and the agent interface never move a machine.
42
+ - No `Assisted-by` or `Co-Authored-By` trailers; the README says once that
43
+ jogpad is developed with Claude Code.
@@ -0,0 +1,210 @@
1
+ # Changelog
2
+
3
+ ## [0.14.1](https://github.com/Aitch-ko/jogpad/compare/v0.14.0...v0.14.1) (2026-11-01)
4
+
5
+
6
+ ### Documentation
7
+
8
+ * the README links the documentation site ([#4](https://github.com/Aitch-ko/jogpad/issues/4)) ([a9d4598](https://github.com/Aitch-ko/jogpad/commit/a9d45981d55ee2d7beefa7a93c5646eb92abc4d0))
9
+
10
+ ## [0.14.0](https://github.com/Aitch-ko/jogpad/compare/v0.13.0...v0.14.0) (2026-11-01)
11
+
12
+
13
+ ### Features
14
+
15
+ * the footer is one quiet line with the version and short links ([8f9b448](https://github.com/Aitch-ko/jogpad/commit/8f9b448e09532e8755cacf23811ab4c564c8a751))
16
+
17
+
18
+ ### Documentation
19
+
20
+ * the README animation shows the macro pad as it is today ([8cf6714](https://github.com/Aitch-ko/jogpad/commit/8cf671417e04ce407de95d407dc371d170d57ead))
21
+
22
+ ## [0.13.0](https://github.com/Aitch-ko/jogpad/compare/v0.12.0...v0.13.0) (2026-11-01)
23
+
24
+
25
+ ### Features
26
+
27
+ * keys show arrows and signs in the colour of their axis ([d1c7b1c](https://github.com/Aitch-ko/jogpad/commit/d1c7b1cd1d74fe75917df2ea7146d1cb13f761ef))
28
+
29
+
30
+ ### Bug Fixes
31
+
32
+ * the HOME messages say that a second HOME starts homing ([8359057](https://github.com/Aitch-ko/jogpad/commit/8359057312fdf6c188d4987700589b6186c34840))
33
+ * the step size badge is only as tall as its text ([ea3b84b](https://github.com/Aitch-ko/jogpad/commit/ea3b84b2cc8793d229576af4ca425905b0217eae))
34
+
35
+
36
+ ### Documentation
37
+
38
+ * README and home page say which pad to take ([2be8915](https://github.com/Aitch-ko/jogpad/commit/2be891565d54374fe0fdb14c9c68ac984638b04a))
39
+
40
+ ## [0.12.0](https://github.com/Aitch-ko/jogpad/compare/v0.11.0...v0.12.0) (2026-11-01)
41
+
42
+
43
+ ### Features
44
+
45
+ * a held axis key keeps moving until it is released ([064a569](https://github.com/Aitch-ko/jogpad/commit/064a569b0d5079871af24d16a1d1e9bbf7a546f5))
46
+
47
+
48
+ ### Performance Improvements
49
+
50
+ * a key press asks Klipper once for the switch and the locks ([cd4de94](https://github.com/Aitch-ko/jogpad/commit/cd4de94e9b8cdcda2e0cb6ecce0e2a3ab7a86e97))
51
+
52
+ ## [0.11.0](https://github.com/Aitch-ko/jogpad/compare/v0.10.0...v0.11.0) (2026-10-31)
53
+
54
+
55
+ ### Features
56
+
57
+ * a CH57x pad lights up in the colour of the step size ([567a7a4](https://github.com/Aitch-ko/jogpad/commit/567a7a4e58701fcd1b246f1a8432ab0d06be13ad))
58
+ * an arrow over each knob shows the axis direction of each turn ([f390a91](https://github.com/Aitch-ko/jogpad/commit/f390a91b61aae68d1740872367dba83b953dc935))
59
+
60
+
61
+ ### Bug Fixes
62
+
63
+ * a refused move no longer leaves the printer in relative mode ([b2bb864](https://github.com/Aitch-ko/jogpad/commit/b2bb8645ffc5c6cfd1346a3192cbbd7a666b0c2e))
64
+
65
+ ## [0.10.0](https://github.com/Aitch-ko/jogpad/compare/v0.9.1...v0.10.0) (2026-10-31)
66
+
67
+
68
+ ### Features
69
+
70
+ * jogpad program-pad reads the bindings back and checks them ([78f7103](https://github.com/Aitch-ko/jogpad/commit/78f710386c0978c9b4ea17834e2751e0d4ad2010))
71
+ * the panel fits the pad, draws its outline and links to the full page ([ac7adb5](https://github.com/Aitch-ko/jogpad/commit/ac7adb526e049816839ba0cd4b4f8c6fe33d2d26))
72
+
73
+ ## [0.9.1](https://github.com/Aitch-ko/jogpad/compare/v0.9.0...v0.9.1) (2026-10-31)
74
+
75
+
76
+ ### Bug Fixes
77
+
78
+ * the web page loads its new files after an update ([79bbfcc](https://github.com/Aitch-ko/jogpad/commit/79bbfccc925b74975e107766c690fcd2237f6814))
79
+
80
+ ## [0.9.0](https://github.com/Aitch-ko/jogpad/compare/v0.8.0...v0.9.0) (2026-10-31)
81
+
82
+
83
+ ### Features
84
+
85
+ * a programmed CH57x pad works without key setup, a knob per axis ([9d2fd5e](https://github.com/Aitch-ko/jogpad/commit/9d2fd5e4c0223bbdf72438098e635241f999464a))
86
+ * the web page has a light/dark switch ([9bf6cab](https://github.com/Aitch-ko/jogpad/commit/9bf6cab97554705cfd5cc582d1f41472fb55e513))
87
+ * the web page shows axes, STOP and the step size in colour ([8919ecc](https://github.com/Aitch-ko/jogpad/commit/8919ecc97f7197b5325c1963185599b3502cbdd7))
88
+
89
+ ## [0.8.0](https://github.com/Aitch-ko/jogpad/compare/v0.7.1...v0.8.0) (2026-10-31)
90
+
91
+
92
+ ### Features
93
+
94
+ * jogpad program-pad writes the layout's key codes into a CH57x pad ([3053478](https://github.com/Aitch-ko/jogpad/commit/3053478eed2392d905a4b0414bd901981e8193d7))
95
+
96
+
97
+ ### Bug Fixes
98
+
99
+ * the CH57x drawing shows the knobs where the real pad has them ([e11022f](https://github.com/Aitch-ko/jogpad/commit/e11022f85a4b1aff71b031534b1b5baa6f1efcf1))
100
+
101
+ ## [0.7.1](https://github.com/Aitch-ko/jogpad/compare/v0.7.0...v0.7.1) (2026-10-25)
102
+
103
+
104
+ ### Bug Fixes
105
+
106
+ * a lock on an object the firmware does not know refuses moves ([6f9b6ed](https://github.com/Aitch-ko/jogpad/commit/6f9b6ede042d58c7adba62f694ada87cf5bb680a))
107
+
108
+ ## [0.7.0](https://github.com/Aitch-ko/jogpad/compare/v0.6.1...v0.7.0) (2026-10-25)
109
+
110
+
111
+ ### Features
112
+
113
+ * installer builds jogpad's venv from JOGPAD_PYTHON, with a way out of Python 3.9 ([d6bdb26](https://github.com/Aitch-ko/jogpad/commit/d6bdb26b4c7ab821b17b1240657a584d2048b4fe))
114
+
115
+
116
+ ### Documentation
117
+
118
+ * one note on Claude Code instead of a trailer in every commit ([692e411](https://github.com/Aitch-ko/jogpad/commit/692e411682e4f48eb4a2b7b930f85501b7a688c6))
119
+
120
+ ## [0.6.1](https://github.com/Aitch-ko/jogpad/compare/v0.6.0...v0.6.1) (2026-10-25)
121
+
122
+
123
+ ### Documentation
124
+
125
+ * installer names the web page, installation guide says what to do there ([2fd495d](https://github.com/Aitch-ko/jogpad/commit/2fd495dd4ff48766487ddc8e42c05eb6e9c6d0f7))
126
+
127
+ ## [0.6.0](https://github.com/Aitch-ko/jogpad/compare/v0.5.0...v0.6.0) (2026-10-25)
128
+
129
+
130
+ ### Features
131
+
132
+ * installer and jogpad setup-switch add the switch to Klipper and Moonraker ([b85a432](https://github.com/Aitch-ko/jogpad/commit/b85a4322810ce8e86dc67a1f0c8045bdb4b26fa6))
133
+
134
+ ## [0.5.0](https://github.com/Aitch-ko/jogpad/compare/v0.4.0...v0.5.0) (2026-10-25)
135
+
136
+
137
+ ### Features
138
+
139
+ * setup section of the web page starts folded away ([b839d83](https://github.com/Aitch-ko/jogpad/commit/b839d837088d87c7e4a83b453cad0373d58735fd))
140
+ * show the pad as a camera panel in Mainsail and Fluidd ([6b20dd2](https://github.com/Aitch-ko/jogpad/commit/6b20dd2e0c2afcf0a27a61d380efe98b3e93677e))
141
+ * switch jogpad on and off from its page and camera panel ([0f40cf4](https://github.com/Aitch-ko/jogpad/commit/0f40cf4eda1ff12092a4cccf3df347320510c1a0))
142
+ * switch jogpad on and off in Mainsail and Fluidd ([7057318](https://github.com/Aitch-ko/jogpad/commit/70573185bd4ea97466fa08875f58119755b11296))
143
+
144
+
145
+ ### Bug Fixes
146
+
147
+ * keep web page requests out of the journal ([e22e7c9](https://github.com/Aitch-ko/jogpad/commit/e22e7c936850ce3ba713919e3df5591974beedde))
148
+
149
+
150
+ ### Documentation
151
+
152
+ * usage.md switch section, API reference, panel screenshot. ([0f40cf4](https://github.com/Aitch-ko/jogpad/commit/0f40cf4eda1ff12092a4cccf3df347320510c1a0))
153
+
154
+ ## [0.4.0](https://github.com/Aitch-ko/jogpad/compare/v0.3.0...v0.4.0) (2026-10-25)
155
+
156
+
157
+ ### Features
158
+
159
+ * web page open in the network, changes only from computers Moonraker trusts ([d69ae16](https://github.com/Aitch-ko/jogpad/commit/d69ae16ff92ab32072668768959750ec68aa1eb3))
160
+
161
+
162
+ ### Bug Fixes
163
+
164
+ * start message reaches the journal right away ([1ac5127](https://github.com/Aitch-ko/jogpad/commit/1ac512728f2ed8ae47d588399bca2418810adaac))
165
+
166
+
167
+ ### Documentation
168
+
169
+ * getting started, documentation map and repository layout in the README ([4710be6](https://github.com/Aitch-ko/jogpad/commit/4710be6113e8882652210201efe92db11afff788))
170
+
171
+ ## [0.3.0](https://github.com/Aitch-ko/jogpad/compare/v0.2.0...v0.3.0) (2026-10-24)
172
+
173
+
174
+ ### Features
175
+
176
+ * page header and footer, language menu, design tokens with checked contrast ([d408779](https://github.com/Aitch-ko/jogpad/commit/d408779c43915c18d9f331ecac4e7b64d5693b40))
177
+ * planned key codes for the CH57x macro pad layout ([faedcbb](https://github.com/Aitch-ko/jogpad/commit/faedcbb349bcb1fbba921b4eed6d0218e23cc9ca))
178
+
179
+
180
+ ### Documentation
181
+
182
+ * an animation at the top of the README showing what jogpad does ([768a3d0](https://github.com/Aitch-ko/jogpad/commit/768a3d0b541539eafefe9a12be66d84921ca87f2))
183
+ * screenshots of the web page, made by a script ([dc5ea85](https://github.com/Aitch-ko/jogpad/commit/dc5ea8544494488100527222b763dee3302ef0d6))
184
+
185
+ ## [0.2.0](https://github.com/Aitch-ko/jogpad/compare/v0.1.0...v0.2.0) (2026-10-24)
186
+
187
+
188
+ ### Features
189
+
190
+ * add an installer that sets jogpad up as a service ([a80d329](https://github.com/Aitch-ko/jogpad/commit/a80d329c40145cb919356990190591821fc494b8))
191
+ * announce moves and homing in the console ([234273c](https://github.com/Aitch-ko/jogpad/commit/234273c03951965147cc018d4d37d0d912e53078))
192
+ * learn keys and check axis directions on the web page ([fae055d](https://github.com/Aitch-ko/jogpad/commit/fae055d1a183f6e4c421f0195aeea0c52ef389a2))
193
+ * web page with the pad drawn and live key presses ([3929d21](https://github.com/Aitch-ko/jogpad/commit/3929d21268c543c7613ee54fc81111792f89c8e8))
194
+
195
+
196
+ ### Bug Fixes
197
+
198
+ * show installer progress and ask for sudo up front ([758e622](https://github.com/Aitch-ko/jogpad/commit/758e622538b3a0588bced6588a0176b166e5d908))
199
+
200
+
201
+ ### Documentation
202
+
203
+ * tell why jogpad exists, add a logo and use cases ([1573410](https://github.com/Aitch-ko/jogpad/commit/157341020fe5bd1c8a6a4eb33720d544f87a680f))
204
+
205
+ ## 0.1.0 (2026-10-24)
206
+
207
+
208
+ ### Features
209
+
210
+ * jog Klipper from a keypad or macro pad ([5bf570b](https://github.com/Aitch-ko/jogpad/commit/5bf570bca55204b2e638f0a69d221967b6b1893e))
@@ -0,0 +1,11 @@
1
+ # Code of Conduct
2
+
3
+ This project follows the
4
+ [Contributor Covenant, version 2.1](https://www.contributor-covenant.org/version/2/1/code_of_conduct/).
5
+
6
+ In short: be respectful, assume good intent, criticise ideas rather than
7
+ people, and help newcomers.
8
+
9
+ Report unacceptable behaviour privately to the maintainer,
10
+ [@Aitch-ko](https://github.com/Aitch-ko), through GitHub. Reports are handled
11
+ confidentially.