Welcome to the 14th edition of the Charm Tech Pulse Report of 2025!
Dima and James are on secondment to Platform Engineering and Telco, respectively. Dima is involved in the planning of the future architecture of the GitHub runner charm, and James is learning more about managing multiple charms in a monorepo with the Telco and TLS teams.
In this pulse, we’ve implemented some fixes in ops to increase stability and experimented with type-checking improvements. On the charming front, we’ve introduced tracing in the apt lib, explored backports for Jubilant, made progress in security automation and monorepo management, and continued working on specs for low-level Juju access and Charmhub review processes. We also improved service logs management in Pebble and started in-memory state experiments. The docs saw some improvements to tutorials and consistency. Read on for the details, and as always, reach out if you’d like to know more!
Ops
- Fixed an issue introduced in the latest release where Ops could crash if the name of the remote app was not available (#1897).
- Improved the behaviour of ops.testing (Scenario) when using the new config and action param “errors=blocked” and “errors=fail” functionality (#1887).
- Experimented with using ty as a type checker (rather than pyright) and fixed a few type annotations that ty found (#1903).
Charming
- Added tracing in the
apt
charm lib and wrote a post about it. - Wrote a jubilant-backports package that’s a drop-in replacement for Jubilant, but supports Juju 2.9 (as well as 3.x and 4.0). This works, within the limited testing we’ve done so far, but we’re still discussing where it could live and how it would be maintained.
- Wrote a spec (OP069) for exposing low-level access to the Juju context and hook commands in Ops.
- Continued work on the spec (OP072) and proof-of-concept for a new Charmhub public listing review process.
- Continued SSDLC work: adding a vulnerability response document, security documentation (#1904), security event logging (#1905), and automating the SBOM generation and secscan validation (#1906).
- Hosted an AMA session with the Kubernetes (actually last pulse, but we missed mentioning it) and Observability (Traefik, Istio, Tempo) teams.
- Opened a PR to add multiple controller support to Jubilant (#165).
- Migrated the vault-k8s-operator monorepo’s shared code to a standard Python package. To avoid wrapping charmcraft pack, the package is vendored into the charm subdirectories automatically and committed to version control. We’re currently investigating other approaches to managing multiple charms + shared code in a monorepo. Get in touch with James Garner if this is something you or your team are interested in.
Pebble
- Added a new feature where the service log buffers are pruned, keeping only 100 maximum inactive services’ logs (#539, #653).Working on a new feature to not to persist the state to disk and keep the state in memory only (#658, WIP).
- Working on a new feature to not to persist the state to disk and keep the state in memory only (#658, WIP).
- Proof of concept for adding a second log-target “type” to Pebble (currently, the only supported type is Loki) to forward logs in OpenTelemetry format.
Documentation
- Fixed consistency issues in the Kubernetes charm tutorial and linked to the corresponding example charms in the Ops repo (#1898).
- Added links to the Charmcraft 12-factor tutorials from the Ops tutorial index page (#1902).
- Updated the “Zero to Hero” Kubernetes charm tutorial to use the new config and action param classes feature (#1891).