Release Notes v1.0.2
Released: 2026-04-05
This release modernizes the entire project foundation — Python 3.13+ with PEP 695 generics, a complete docs rebuild on VitePress, and a fully automated CI/CD pipeline with OIDC-trusted PyPI publishing. Runtime dependencies are trimmed to four packages, dead code is removed, and every developer workflow runs through a single justfile.
🌟 Highlights
⬆️ Python 3.13+ with PEP 695 Generics
The minimum Python version is now 3.13 (previously 3.11). Generic type parameters in signalrgb/client.py and signalrgb/cli.py use the new PEP 695 inline syntax (def _run_async[T](...), def handle_exceptions[F: Callable[..., Any]](...)), replacing module-level TypeVar declarations. Both clients adopt typing.Self for context manager return types and drop from __future__ import annotations.
🔮 VitePress Documentation Site
The MkDocs + Material doc site is replaced with a VitePress site using the SilkCircuit theme. Docs are restructured into guide/ (intro, installation, quick-start, development, contributing) and reference/ (CLI, library, async client, models). The homepage uses VitePress hero layout with feature cards. All MkDocs dependencies (mkdocs, mkdocs-material, mkdocstrings) are removed — docs deps now live in docs/package.json via pnpm.
👷 Automated Release Pipeline
A new release.yml workflow handles the full release lifecycle: version bump via uv version, lock file sync, commit, tag, and push. It generates AI-powered release notes using hyperb1iss/git-iris@v2 with Anthropic Claude, then dispatches publish.yml for PyPI publishing and docs.yml for site deployment. Trigger with just release [bump] or just release-version <version>.
🔥 Dead Code and Dependency Cleanup
Runtime dependencies are trimmed from nine packages to four: httpx, rich, typer, and mashumaro. The unused requests import and requests.Session instance in SignalRGBClient are removed — the sync client delegates entirely to the async httpx backend. The urllib3, wcwidth, ruff, and pre-commit packages are moved out of runtime deps.
🔧 Justfile Developer Interface
A 230-line justfile replaces scattered commands with 40+ recipes covering the full development loop: just install, just verify, just check (fast fix-and-test), just test, just lint-fix, just fmt, just typecheck, just docs-serve, just release, and more. Aliases i, t, l, f, c, v for quick access.
👷 CI/CD Overhaul
- Replaced monolithic
ci-cd.ymlwith four focused workflows:ci.yml,publish.yml,docs.yml,release.yml - CI delegates to
hyperb1iss/shared-workflowsreusable workflows for Python CI, publishing, and docs deployment - PyPI publishing uses OIDC trusted publishing — no stored API tokens;
pypa/gh-action-pypi-publishhandles attestation - Inlined build+publish steps in
publish.ymlto work around PyPI's reusable-workflow OIDC limitation - Fixed
GITHUB_TOKENpush not triggering downstream workflows —release.ymlnow explicitly dispatchespublish.ymlanddocs.ymlviagh workflow run - Fixed publish/release concurrency deadlock by giving
publish.ymlits own concurrency group docs.ymltriggers on push tomainwith path filtering (docs/**), plusworkflow_dispatchfor manual runs- AI-generated release notes artifact is uploaded and passed through the publish → github-release chain
🎨 Toolchain Modernization
- Type checker: mypy replaced with ty (Astral's Rust-based checker) — configured in
pyproject.tomlunder[tool.ty], targets Python 3.13 - Ruff: bumped from v0.5.4 to v0.15.8, line length tightened from 120 to 100, target version set to
py313 - Pre-commit: ruff hooks split into
ruff-checkandruff-format(new hook IDs); added localty checkhook viauv run - Prettier: new
.prettierrcand.prettierignorefor Markdown/YAML/JSON formatting (printWidth 100, proseWrap always);just proseandjust prose-checkrecipes added to the verify pipeline - Removed orphaned
[tool.pylint]and[tool.mypy]configuration blocks frompyproject.toml - Dropped
types-requestsstub package
📝 Documentation and Content
- README rewritten: cleaner feature list without emoji bullets,
uv addas the recommended install method,justcommands throughout the development section - CI badge updated from
ci-cd.ymltoci.yml; added Python version badge - Broken
docs/async_usage.mdlink in README replaced with the published docs URL (hyperb1iss.github.io/signalrgb-python/reference/async) examples/async_example.pynow prints actual output instead of no-oppassstubs- Status emoji in
signalrgb/cli.pychanged from✨to⚡for the "enabled" state __version__bumped to1.0.2insignalrgb/__init__.py;__version__added to__all__exports
💥 Breaking Changes
- Python 3.13+ required — Python 3.11 and 3.12 are no longer supported. Update your runtime before upgrading. The
requires-pythonfield, ruff target, ty config, and CI matrix all enforce>=3.13. requestsremoved from dependencies — Therequestslibrary is no longer a runtime dependency. If your code importedrequeststransitively throughsignalrgb, add it to your own dependencies.SignalRGBClient._sessionremoved — The internalrequests.Sessionattribute and itsclose()call in__exit__are gone. If you accessedclient._sessiondirectly (private API), remove that code. The sync client delegates all HTTP calls to the async httpx backend.
⬆️ Upgrade Notes
- Ensure your environment runs Python 3.13 or later before installing v1.0.2
- If you pinned
requestsas a transitive dependency ofsignalrgb, add it explicitly to your project if still needed - Update any CI matrices to use Python 3.13+ — 3.11 and 3.12 are no longer tested or supported
- The docs site URL remains
https://hyperb1iss.github.io/signalrgb-python/but is now powered by VitePress; update any deep links from the old MkDocs paths (e.g.,docs/async_usage.md→/reference/async)