23 Commits

Author SHA1 Message Date
be83698259 chore(deps): update https://gitea.t000-n.de/t.behrendt/actions action to v0.2.2
Some checks failed
renovate/stability-days Updates have met minimum release age requirement
CI / build (amd64, usbmakroboard-amd64, linux_amd64) (pull_request) Has been cancelled
CI / build (arm64, usbmakroboard-arm64, linux_arm64) (pull_request) Has been cancelled
2026-03-25 11:00:29 +00:00
eddaee52a1 chore(deps): update https://gitea.t000-n.de/t.behrendt/actions action to v0.2.1 (#22)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [https://gitea.t000-n.de/t.behrendt/actions](https://gitea.t000-n.de/t.behrendt/actions) | action | minor | `0.1.4` → `0.2.1` |

---

### Release Notes

<details>
<summary>t.behrendt/actions (https://gitea.t000-n.de/t.behrendt/actions)</summary>

### [`v0.2.1`](https://gitea.t000-n.de/t.behrendt/actions/compare/0.2.0...0.2.1)

[Compare Source](https://gitea.t000-n.de/t.behrendt/actions/compare/0.2.0...0.2.1)

### [`v0.2.0`](https://gitea.t000-n.de/t.behrendt/actions/compare/0.1.7...0.2.0)

[Compare Source](https://gitea.t000-n.de/t.behrendt/actions/compare/0.1.7...0.2.0)

### [`v0.1.7`](https://gitea.t000-n.de/t.behrendt/actions/compare/0.1.6...0.1.7)

[Compare Source](https://gitea.t000-n.de/t.behrendt/actions/compare/0.1.6...0.1.7)

### [`v0.1.6`](https://gitea.t000-n.de/t.behrendt/actions/compare/0.1.5...0.1.6)

[Compare Source](https://gitea.t000-n.de/t.behrendt/actions/compare/0.1.5...0.1.6)

### [`v0.1.5`](https://gitea.t000-n.de/t.behrendt/actions/compare/0.1.4...0.1.5)

[Compare Source](https://gitea.t000-n.de/t.behrendt/actions/compare/0.1.4...0.1.5)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41LjQiLCJ1cGRhdGVkSW5WZXIiOiI0My41LjQiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbImFjdGlvbiIsImRlcHMiXX0=-->

Reviewed-on: #22
Reviewed-by: t.behrendt <t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-03-15 22:30:45 +01:00
c235b44f71 chore(deps): update https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment action to v0.1.29 (#23)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment) | action | patch | `0.1.28` → `0.1.29` |

---

### Release Notes

<details>
<summary>t.behrendt/conventional-semantic-git-tag-increment (https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment)</summary>

### [`v0.1.29`](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.28...0.1.29)

[Compare Source](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.28...0.1.29)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41LjQiLCJ1cGRhdGVkSW5WZXIiOiI0My41LjQiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbImFjdGlvbiIsImRlcHMiXX0=-->

Reviewed-on: #23
Reviewed-by: t.behrendt <t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-03-15 21:45:04 +01:00
d72b2f6d51 chore(deps): update https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment action to v0.1.28 (#21)
This PR contains the following updates:

| Package | Type | Update | Change | Pending |
|---|---|---|---|---|
| [https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment) | action | patch | `0.1.27` → `0.1.28` | `0.1.29` |

---

### Release Notes

<details>
<summary>t.behrendt/conventional-semantic-git-tag-increment (https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment)</summary>

### [`v0.1.28`](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.27...0.1.28)

[Compare Source](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.27...0.1.28)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41LjQiLCJ1cGRhdGVkSW5WZXIiOiI0My41LjQiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbImFjdGlvbiIsImRlcHMiXX0=-->

Reviewed-on: #21
Reviewed-by: t.behrendt <t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-02-24 19:51:21 +01:00
6ca5f5bd96 chore(deps): update https://gitea.t000-n.de/t.behrendt/actions action to v0.1.4 (#19)
This PR contains the following updates:

| Package | Type | Update | Change | Pending |
|---|---|---|---|---|
| [https://gitea.t000-n.de/t.behrendt/actions](https://gitea.t000-n.de/t.behrendt/actions) | action | patch | `0.1.3` → `0.1.4` | `0.1.6` (+1) |

---

### Release Notes

<details>
<summary>t.behrendt/actions (https://gitea.t000-n.de/t.behrendt/actions)</summary>

### [`v0.1.4`](https://gitea.t000-n.de/t.behrendt/actions/compare/0.1.3...0.1.4)

[Compare Source](https://gitea.t000-n.de/t.behrendt/actions/compare/0.1.3...0.1.4)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41LjQiLCJ1cGRhdGVkSW5WZXIiOiI0My41LjQiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbImFjdGlvbiIsImRlcHMiXX0=-->

Reviewed-on: #19
Reviewed-by: t.behrendt <t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-02-22 12:55:48 +01:00
07952b7071 chore(deps): update https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment action to v0.1.27 (#20)
This PR contains the following updates:

| Package | Type | Update | Change | Pending |
|---|---|---|---|---|
| [https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment) | action | patch | `0.1.26` → `0.1.27` | `0.1.29` (+1) |

---

### Release Notes

<details>
<summary>t.behrendt/conventional-semantic-git-tag-increment (https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment)</summary>

### [`v0.1.27`](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.26...0.1.27)

[Compare Source](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.26...0.1.27)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41LjQiLCJ1cGRhdGVkSW5WZXIiOiI0My41LjQiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbImFjdGlvbiIsImRlcHMiXX0=-->

Reviewed-on: #20
Reviewed-by: t.behrendt <t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-02-22 12:20:37 +01:00
19138aaf81 chore(deps): update https://gitea.t000-n.de/t.behrendt/actions action to v0.1.3 (#17)
This PR contains the following updates:

| Package | Type | Update | Change | Pending |
|---|---|---|---|---|
| [https://gitea.t000-n.de/t.behrendt/actions](https://gitea.t000-n.de/t.behrendt/actions) | action | patch | `0.1.1` → `0.1.3` | `0.1.4` |

---

### Release Notes

<details>
<summary>t.behrendt/actions (https://gitea.t000-n.de/t.behrendt/actions)</summary>

### [`v0.1.3`](https://gitea.t000-n.de/t.behrendt/actions/compare/0.1.2...0.1.3)

[Compare Source](https://gitea.t000-n.de/t.behrendt/actions/compare/0.1.2...0.1.3)

### [`v0.1.2`](https://gitea.t000-n.de/t.behrendt/actions/compare/0.1.1...0.1.2)

[Compare Source](https://gitea.t000-n.de/t.behrendt/actions/compare/0.1.1...0.1.2)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi45NS4yIiwidXBkYXRlZEluVmVyIjoiNDMuNS40IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJhY3Rpb24iLCJkZXBzIl19-->

Reviewed-on: #17
Reviewed-by: t.behrendt <t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-02-18 20:29:10 +01:00
33593fcf81 chore(deps): update https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment action to v0.1.26 (#16)
This PR contains the following updates:

| Package | Type | Update | Change | Pending |
|---|---|---|---|---|
| [https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment) | action | patch | `0.1.24` → `0.1.26` | `0.1.27` |

---

### Release Notes

<details>
<summary>t.behrendt/conventional-semantic-git-tag-increment (https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment)</summary>

### [`v0.1.26`](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.25...0.1.26)

[Compare Source](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.25...0.1.26)

### [`v0.1.25`](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.24...0.1.25)

[Compare Source](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.24...0.1.25)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi45NS4yIiwidXBkYXRlZEluVmVyIjoiNDMuNS40IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJhY3Rpb24iLCJkZXBzIl19-->

Reviewed-on: #16
Reviewed-by: t.behrendt <t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-02-18 19:47:48 +01:00
4854d8ef68 ci: pin various actions to a proper semver version (#18)
Reviewed-on: #18
Co-authored-by: Timo Behrendt <t.behrendt@t00n.de>
Co-committed-by: Timo Behrendt <t.behrendt@t00n.de>
2026-02-14 19:30:47 +01:00
13aac3a963 chore(deps): update https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment action to v0.1.24 (#15)
This PR contains the following updates:

| Package | Type | Update | Change | Pending |
|---|---|---|---|---|
| [https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment) | action | patch | `0.1.23` → `0.1.24` | `0.1.26` (+1) |

---

### Release Notes

<details>
<summary>t.behrendt/conventional-semantic-git-tag-increment (https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment)</summary>

### [`v0.1.24`](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.23...0.1.24)

[Compare Source](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.23...0.1.24)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi45NS4xIiwidXBkYXRlZEluVmVyIjoiNDIuOTUuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiYWN0aW9uIiwiZGVwcyJdfQ==-->

Reviewed-on: #15
Reviewed-by: t.behrendt <t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-02-07 18:30:47 +01:00
d1f1510d96 chore(deps): update https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment action to v0.1.23 (#13)
This PR contains the following updates:

| Package | Type | Update | Change | Pending |
|---|---|---|---|---|
| [https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment) | action | patch | `0.1.22` → `0.1.23` | `0.1.25` (+1) |

---

### Release Notes

<details>
<summary>t.behrendt/conventional-semantic-git-tag-increment (https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment)</summary>

### [`v0.1.23`](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.22...0.1.23)

[Compare Source](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.22...0.1.23)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi45Mi40IiwidXBkYXRlZEluVmVyIjoiNDIuOTIuNCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiYWN0aW9uIiwiZGVwcyJdfQ==-->

Reviewed-on: #13
Reviewed-by: t.behrendt <t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-02-03 16:15:50 +01:00
a21193d9fa chore(deps): update https://gitea.t000-n.de/t.behrendt/actions action to v0.1.1 (#12)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [https://gitea.t000-n.de/t.behrendt/actions](https://gitea.t000-n.de/t.behrendt/actions) | action | patch | `0.1.0` → `0.1.1` |

---

### Release Notes

<details>
<summary>t.behrendt/actions (https://gitea.t000-n.de/t.behrendt/actions)</summary>

### [`v0.1.1`](https://gitea.t000-n.de/t.behrendt/actions/compare/0.1.0...0.1.1)

[Compare Source](https://gitea.t000-n.de/t.behrendt/actions/compare/0.1.0...0.1.1)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi43NC41IiwidXBkYXRlZEluVmVyIjoiNDIuNzQuNSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiYWN0aW9uIiwiZGVwcyJdfQ==-->

Reviewed-on: #12
Reviewed-by: t.behrendt <t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-01-26 10:45:04 +01:00
583eeb5355 chore(deps): pin dependencies (#11)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [https://gitea.t000-n.de/t.behrendt/actions](https://gitea.t000-n.de/t.behrendt/actions) | action | pinDigest |  → `8a04fa9` |
| [https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment) | action | pinDigest |  → `9841c96` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://github.com/renovatebot/renovate/discussions) if that's undesired.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42OS4yIiwidXBkYXRlZEluVmVyIjoiNDIuNjkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiYWN0aW9uIiwiZGVwcyJdfQ==-->

Reviewed-on: #11
Reviewed-by: t.behrendt <t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-01-11 09:31:06 +01:00
fe59687b76 chore(deps): pin akkuman/gitea-release-action action to fe8e032 (#9)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [akkuman/gitea-release-action](https://github.com/akkuman/gitea-release-action) | action | pinDigest |  → `fe8e032` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42NC4xIiwidXBkYXRlZEluVmVyIjoiNDIuNjQuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiYWN0aW9uIiwiZGVwcyJdfQ==-->

Reviewed-on: #9
Reviewed-by: t.behrendt <t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2025-12-27 14:07:21 +01:00
ff8bc15bc5 feat: add default config path (#4)
All checks were successful
CD / build (amd64, usbmakroboard-amd64, linux_amd64) (push) Successful in 1m9s
CD / build (arm64, usbmakroboard-arm64, linux_arm64) (push) Successful in 4m0s
CD / release (push) Successful in 7s
Reviewed-on: #4
Co-authored-by: Timo Behrendt <t.behrendt@t00n.de>
Co-committed-by: Timo Behrendt <t.behrendt@t00n.de>
2025-12-27 13:29:53 +01:00
0d0509b8f1 ci(renovate): add renovate (#8)
Reviewed-on: #8
Co-authored-by: Timo Behrendt <t.behrendt@t00n.de>
Co-committed-by: Timo Behrendt <t.behrendt@t00n.de>
2025-12-27 13:05:35 +01:00
36e37c46ba ci: unify ci and cd build step (#6)
Reviewed-on: #6
Co-authored-by: Timo Behrendt <t.behrendt@t00n.de>
Co-committed-by: Timo Behrendt <t.behrendt@t00n.de>
2025-12-27 13:03:21 +01:00
83f4a683cd ci: add simple test pipeline (#5)
Reviewed-on: #5
Co-authored-by: Timo Behrendt <t.behrendt@t00n.de>
Co-committed-by: Timo Behrendt <t.behrendt@t00n.de>
2025-12-27 12:40:15 +01:00
c839c1ff49 feat: add install target 2024-05-09 11:51:53 +02:00
a13048665f chore: fix type 2024-05-06 20:39:48 +02:00
e522001182 chore: remove files from previous version 2024-05-06 20:39:21 +02:00
1902c111ef feat: mvp 2024-05-06 20:38:43 +02:00
tibeh
5501d05aa4 initial commit 2024-05-06 20:35:43 +02:00
12 changed files with 641 additions and 0 deletions

View File

@@ -0,0 +1,49 @@
name: Build
on:
workflow_call:
inputs:
runner:
type: string
default: "linux_amd64"
arch:
type: string
default: "amd64"
jobs:
build:
runs-on:
- ubuntu-latest
- ${{ inputs.runner }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
- run: |
sudo apt-get update
sudo apt-get install -y build-essential cmake zip
- name: Build
run: |
mkdir -p build
cd build
cmake ..
cmake --build .
- name: Verify binary
run: |
test -f build/usbmakroboard && echo "Binary built successfully" || exit 1
- name: Create zip archive
run: |
cd build
zip usbmakroboard-linux-${{ inputs.arch }}.zip usbmakroboard
- name: Generate checksum
run: |
cd build
sha256sum usbmakroboard-linux-${{ inputs.arch }}.zip > usbmakroboard-linux-${{ inputs.arch }}.zip.sha256
- name: Upload artifacts
uses: ChristopherHX/gitea-upload-artifact@v4
with:
name: usbmakroboard-${{ inputs.arch }}
path: |
build/usbmakroboard-linux-${{ inputs.arch }}.zip
build/usbmakroboard-linux-${{ inputs.arch }}.zip.sha256
retention-days: 1

58
.gitea/workflows/cd.yaml Normal file
View File

@@ -0,0 +1,58 @@
name: CD
on:
push:
branches:
- main
paths:
- "src/**"
- "CMakeLists.txt"
- "schemas/**"
workflow_dispatch:
jobs:
build:
strategy:
matrix:
include:
- runner: linux_amd64
arch: amd64
artifact_name: usbmakroboard-amd64
- runner: linux_arm64
arch: arm64
artifact_name: usbmakroboard-arm64
uses: ./.gitea/workflows/build.yaml
with:
runner: ${{ matrix.runner }}
arch: ${{ matrix.arch }}
release:
needs: build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
- uses: https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment@41b7e04221df8a033bec841d40a097b76e5f67ff # 0.1.29
id: tag
with:
token: ${{ secrets.GITEA_TOKEN }}
prerelease: ${{ github.event_name == 'workflow_dispatch' }}
- uses: https://gitea.t000-n.de/t.behrendt/actions/release-git-tag@f386e2570df6a796ba0a69865c89ea0c1a7109ab # 0.2.2
with:
tag: ${{ steps.tag.outputs.new-tag }}
- uses: ChristopherHX/gitea-download-artifact@v4
with:
path: artifacts
- name: Create release
uses: akkuman/gitea-release-action@fe8e0322804b48e34e3bddbbf6335bd2b1046eb7 # v1
with:
tag_name: ${{ steps.tag.outputs.new-tag }}
name: ${{ steps.tag.outputs.new-tag }}
files: |
artifacts/usbmakroboard-amd64/usbmakroboard-linux-amd64.zip
artifacts/usbmakroboard-amd64/usbmakroboard-linux-amd64.zip.sha256
artifacts/usbmakroboard-arm64/usbmakroboard-linux-arm64.zip
artifacts/usbmakroboard-arm64/usbmakroboard-linux-arm64.zip.sha256
prerelease: ${{ github.event_name == 'workflow_dispatch' }}
token: ${{ secrets.GITHUB_TOKEN }}

20
.gitea/workflows/ci.yaml Normal file
View File

@@ -0,0 +1,20 @@
name: CI
on:
pull_request:
jobs:
build:
strategy:
matrix:
include:
- runner: linux_amd64
arch: amd64
artifact_name: usbmakroboard-amd64
- runner: linux_arm64
arch: arm64
artifact_name: usbmakroboard-arm64
uses: ./.gitea/workflows/build.yaml
with:
runner: ${{ matrix.runner }}
arch: ${{ matrix.arch }}

1
.gitignore vendored
View File

@@ -45,3 +45,4 @@ _deps
*.out *.out
*.app *.app
build/

7
.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,7 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": []
}

77
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,77 @@
{
"C_Cpp.errorSquiggles": "Disabled",
"yaml.schemas": {
"schemas/config.schema.json": "config.yaml",
},
"files.associations": {
"array": "cpp",
"atomic": "cpp",
"bit": "cpp",
"*.tcc": "cpp",
"bitset": "cpp",
"cctype": "cpp",
"charconv": "cpp",
"chrono": "cpp",
"clocale": "cpp",
"cmath": "cpp",
"compare": "cpp",
"concepts": "cpp",
"cstdarg": "cpp",
"cstddef": "cpp",
"cstdint": "cpp",
"cstdio": "cpp",
"cstdlib": "cpp",
"cstring": "cpp",
"ctime": "cpp",
"cwchar": "cpp",
"cwctype": "cpp",
"list": "cpp",
"map": "cpp",
"set": "cpp",
"string": "cpp",
"unordered_map": "cpp",
"vector": "cpp",
"exception": "cpp",
"algorithm": "cpp",
"functional": "cpp",
"iterator": "cpp",
"memory": "cpp",
"memory_resource": "cpp",
"optional": "cpp",
"random": "cpp",
"ratio": "cpp",
"string_view": "cpp",
"system_error": "cpp",
"tuple": "cpp",
"type_traits": "cpp",
"utility": "cpp",
"format": "cpp",
"fstream": "cpp",
"initializer_list": "cpp",
"iomanip": "cpp",
"iosfwd": "cpp",
"istream": "cpp",
"limits": "cpp",
"new": "cpp",
"numbers": "cpp",
"ostream": "cpp",
"sstream": "cpp",
"stdexcept": "cpp",
"streambuf": "cpp",
"cinttypes": "cpp",
"typeinfo": "cpp",
"variant": "cpp",
"__bit_reference": "cpp",
"__config": "cpp",
"__hash_table": "cpp",
"__locale": "cpp",
"__node_handle": "cpp",
"__split_buffer": "cpp",
"__threading_support": "cpp",
"__tree": "cpp",
"__verbose_abort": "cpp",
"execution": "cpp",
"ios": "cpp",
"locale": "cpp"
}
}

48
CMakeLists.txt Normal file
View File

@@ -0,0 +1,48 @@
cmake_minimum_required(VERSION 3.10)
project(UsbMakroBoard VERSION 1.0)
# Add the executable target
add_executable(usbmakroboard
src/main.cpp # Add your source files here
)
# Include yaml-cpp as a dependency
include(FetchContent)
FetchContent_Declare(
yaml-cpp
GIT_REPOSITORY https://github.com/jbeder/yaml-cpp.git
GIT_TAG master
)
FetchContent_GetProperties(yaml-cpp)
if(NOT yaml-cpp_POPULATED)
message(STATUS "Fetching yaml-cpp...")
FetchContent_Populate(yaml-cpp)
add_subdirectory(${yaml-cpp_SOURCE_DIR} ${yaml-cpp_BINARY_DIR})
endif()
# Link yaml-cpp with your executable
target_link_libraries(usbmakroboard PUBLIC yaml-cpp::yaml-cpp)
# Include spdlog as a dependency
include(FetchContent)
FetchContent_Declare(
spdlog
GIT_REPOSITORY https://github.com/gabime/spdlog.git
GIT_TAG v1.14.1
)
FetchContent_GetProperties(spdlog)
if(NOT spdlog_POPULATED)
message(STATUS "Fetching spdlog...")
FetchContent_Populate(spdlog)
add_subdirectory(${spdlog_SOURCE_DIR} ${spdlog_BINARY_DIR})
endif()
# Link spdlog with your executable
target_link_libraries(usbmakroboard PRIVATE spdlog::spdlog)
install(TARGETS usbmakroboard DESTINATION "${CMAKE_INSTALL_PREFIX}/bin")

View File

@@ -1,2 +1,46 @@
# UsbMakroBoard # UsbMakroBoard
## Kudos
For info that with "EVIOCGRAB" the keyboard events can be consumed exclusively by one application: https://stackoverflow.com/questions/29942421/read-barcodes-from-input-event-linux-c/29956584#29956584
## Arguments
```
-c <path to config>
```
## Configuration
The configuration can be provided by either specifying a config file path via the `-c` parameter. If no parameter is provided, the default config path under `$HOME/.config/UsbMakroBoard.yaml` is used.
Find the config schema in [schemas/config.schema.json](./schemas/config.schema.json) as well as a default config in [config.yaml](./config.yaml).
## Allowing non-root access to the device
By default, accessing input devices requires root privileges. However, it's possible to allow a regular user to access a specific input device by creating a udev rule:
1. Identify the device's vendor and product IDs. You can do this by running `lsusb` in the terminal and looking for your device.
This may looke like this where `195d` is the `vendor_id` and `6008` is the `product_id`:
```bash
# lsusb
Bus 003 Device 005: ID 195d:6008 Itron Technology iONE Falcon 20 RGB
```
1. Create a new udev rule. Open a new file in the `/etc/udev/rules.d/` directory. The filename should end with `.rules`, for example `90-input.rules` (the number determins the order in which the rules are loaded. It is generally recommended to chose higher numbers for changes that are relevant for the user-space).
In the new file, write a rule that matches your device and sets the mode to `0666` (read and write permissions for everyone). Replace `vendor_id` and `product_id` with your device's IDs from the first step.
```bash
SUBSYSTEM=="input", ATTRS{idVendor}=="vendor_id", ATTRS{idProduct}=="product_id", MODE="0666"
```
3. Reload the udev rules with the command `sudo udevadm control --reload-rules && sudo udevadm trigger`.
Now, every time the device is connected, it will be accessible by all users. The rule can be made more specific to only make the device accessible to a certain user or user group. You can use the `OWNER`, `GROUP`, and `MODE` parameters in the udev rule. For example, to restrict access to the user `username` and the group `usergroup`, you can use:
```bash
SUBSYSTEM=="input", ATTRS{idVendor}=="vendor_id", ATTRS{idProduct}=="product_id", OWNER="username", GROUP="usergroup", MODE="0660"
```
This will give read and write permissions to the user and/or the group, and no permissions to others.

7
config.yaml Normal file
View File

@@ -0,0 +1,7 @@
logLevel: "trace"
devicePath: "/dev/input/by-id/usb-MAX_Falcon_20_RGB-if02-event-kbd"
keyboard_layout:
row0:
keys:
key0:
script: "/home/tbehrendt/.screenlayout/default.sh"

7
renovate.json Normal file
View File

@@ -0,0 +1,7 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"local>t.behrendt/renovate-configs:common",
"local>t.behrendt/renovate-configs:action"
]
}

View File

@@ -0,0 +1,43 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"devicePath": {
"type": "string"
},
"logLevel": {
"type": "string",
"enum": ["trace", "debug", "info", "warn", "error", "critical"],
"default": "info"
},
"keyboard_layout": {
"type": "object",
"patternProperties": {
"^row[0-4]+": {
"type": "object",
"properties": {
"keys": {
"type": "object",
"patternProperties": {
"^key[0-3]+$": {
"type": "object",
"properties": {
"script": {
"type": "string"
}
},
"required": ["script"],
"additionalProperties": false
}
}
}
},
"required": ["keys"],
"additionalProperties": false
}
}
}
},
"required": ["keyboard_layout", "devicePath"],
"additionalProperties": false
}

280
src/main.cpp Normal file
View File

@@ -0,0 +1,280 @@
// https://stackoverflow.com/questions/20943322/accessing-keys-from-linux-input-device
/**
* TODO: Handle the keyboard being unplugged/turned off and replugged/turned on again
*/
#include <unistd.h>
#include <fcntl.h>
#include <linux/input.h>
#include <iostream>
#include <cstdlib>
#include <spdlog/spdlog.h>
#include <spdlog/sinks/stdout_sinks.h>
#include <yaml-cpp/yaml.h>
struct KeyPosition
{
int row;
int col;
};
struct ConfigKey
{
std::string name;
std::string script;
};
struct ConfigRow
{
std::vector<ConfigKey> keys;
};
struct KeyboardConfig
{
std::string devicePath;
std::vector<ConfigRow> keyboardLayout;
std::string logLevel;
};
static const char *const eventValues[3] = {
"RELEASED",
"PRESSED ",
"REPEATED"};
std::shared_ptr<spdlog::logger> logger;
std::pair<int, int> mapKeyEventToRowColumn(int keyEventNumber, const std::unordered_map<int, KeyPosition> &keyMap)
{
auto it = keyMap.find(keyEventNumber);
if (it != keyMap.end())
{
return std::make_pair(it->second.row, it->second.col);
}
else
{
return std::make_pair(-1, -1);
}
}
std::string getConfigPathFromCliArguments(int argc, char *argv[])
{
std::string configPath;
int opt;
while ((opt = getopt(argc, argv, "c:")) != -1)
{
switch (opt)
{
case 'c':
configPath = optarg;
break;
default:
std::cerr << "Usage: " << argv[0] << " [-c config_file_path]\n";
exit(EXIT_FAILURE);
}
}
if (configPath.empty()) {
const char *home = std::getenv("HOME");
if (home != nullptr) {
configPath = std::string(home) + "/.config/usbMakroBoard.yaml";
}
else {
std::cerr << "HOME environment variable is not set. Exiting.\n";
exit(EXIT_FAILURE);
}
}
return configPath;
}
YAML::Node loadConfig(const std::string &configPath)
{
return YAML::LoadFile(configPath);
}
int openDevice(const std::string &devicePath)
{
int fdKeyboard = open(devicePath.c_str(), O_RDONLY);
if (fdKeyboard == -1)
{
logger->error("Cannot open {}: {}.\n", devicePath.c_str(), strerror(errno));
exit(EXIT_FAILURE);
}
return fdKeyboard;
}
KeyboardConfig parseConfigYAML(const std::string &filename)
{
KeyboardConfig config;
YAML::Node root = YAML::LoadFile(filename);
config.devicePath = root["devicePath"].as<std::string>();
config.logLevel = root["logLevel"].as<std::string>();
// Initialize keyboard layout
config.keyboardLayout.resize(5);
for (int i = 0; i < 5; ++i)
{
config.keyboardLayout[i].keys.resize(4);
}
YAML::Node keyboardLayout = root["keyboard_layout"];
for (const auto &row : keyboardLayout)
{
int rowIdx = std::stoi(row.first.as<std::string>().substr(3)); // Extract row index from key name
YAML::Node keys = row.second["keys"];
for (const auto &key : keys)
{
int keyIdx = std::stoi(key.first.as<std::string>().substr(3)); // Extract key index from key name
config.keyboardLayout[rowIdx].keys[keyIdx].script = key.second["script"].as<std::string>();
}
}
return config;
}
void initLogger(const spdlog::level::level_enum logLevel)
{
auto consoleSink = std::make_shared<spdlog::sinks::stdout_sink_mt>();
logger = std::make_shared<spdlog::logger>("logger", consoleSink);
logger->set_level(logLevel);
spdlog::set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%L] %v");
spdlog::register_logger(logger);
}
spdlog::level::level_enum convertLogLevelToSpdLog(const std::string logLevelStr)
{
if (logLevelStr == "trace")
{
return spdlog::level::trace;
}
else if (logLevelStr == "debug")
{
return spdlog::level::debug;
}
else if (logLevelStr == "info")
{
return spdlog::level::info;
}
else if (logLevelStr == "warn")
{
return spdlog::level::warn;
}
else if (logLevelStr == "error")
{
return spdlog::level::err;
}
else if (logLevelStr == "critical")
{
return spdlog::level::critical;
}
else
{
return spdlog::level::info;
}
}
void grabReleaseInputDevice(const int fdKeyboard)
{
const int ioControlResult = ioctl(fdKeyboard, EVIOCGRAB, 1);
if (ioControlResult == -1)
{
logger->error("Cannot grab input device: {}", strerror(errno));
close(fdKeyboard);
exit(EXIT_FAILURE);
}
}
int main(int argc, char *argv[])
{
/**
* +--+--+--+--+
* |30|48|46|32|
* +--+--+--+--+
* |18|33|34|35|
* +--+--+--+--+
* |23|36|37|38|
* +--+--+--+--+
* |50|49|24|25|
* +--+--+--+--+
* |16|19|31|20|
* +--+--+--+--+
* */
const std::unordered_map<int, KeyPosition> keyMap = {
{30, {0, 0}}, {48, {0, 1}}, {46, {0, 2}}, {32, {0, 3}}, {18, {1, 0}}, {33, {1, 1}}, {34, {1, 2}}, {35, {1, 3}}, {23, {2, 0}}, {36, {2, 1}}, {37, {2, 2}}, {38, {2, 3}}, {50, {3, 0}}, {49, {3, 1}}, {24, {3, 2}}, {25, {3, 3}}, {16, {4, 0}}, {19, {4, 1}}, {31, {4, 2}}, {20, {4, 3}}};
const KeyboardConfig config = parseConfigYAML(getConfigPathFromCliArguments(argc, argv));
initLogger(convertLogLevelToSpdLog(config.logLevel));
const int fdKeyboard = openDevice(config.devicePath);
grabReleaseInputDevice(fdKeyboard);
struct input_event inputEvent;
ssize_t eventLength;
while (1)
{
eventLength = read(fdKeyboard, &inputEvent, sizeof inputEvent);
if (eventLength == (ssize_t)-1)
{
if (errno == EINTR)
{
logger->warn("Interrupted system call");
continue;
}
else if (errno == ENODEV)
{
logger->error("Device disconnected. Exiting");
break;
}
else
{
printf("Error reading from device: %s (%d)\n", strerror(errno), errno);
break;
}
}
/**
* inputEvent.value can be
* 0: RELEASED
* 1: PRESSED
* 2: REPEATED
*/
if (inputEvent.type == EV_KEY && inputEvent.value == 0)
{
const std::pair<int, int> keyPosition = mapKeyEventToRowColumn(inputEvent.code, keyMap);
if (keyPosition.first == -1 || keyPosition.second == -1)
{
logger->error("Key {} not found in key map", inputEvent.code);
continue;
}
const std::string scriptToRun = config.keyboardLayout[keyPosition.first].keys[keyPosition.second].script;
logger->debug("Pressed key: {}x{}", keyPosition.first, keyPosition.second);
if (!scriptToRun.empty())
{
logger->info("Running script: {}", scriptToRun);
system(scriptToRun.c_str());
}
else
{
logger->warn("No script found for key: {}x{}", keyPosition.first, keyPosition.second);
}
}
}
close(fdKeyboard);
return EXIT_FAILURE;
}