Skip to content

Changelog

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[Unreleased]

Changed

  • aiohttp and asyncpg are extras: myxo alone runs on SQLite, myxo[postgresql] adds PostgreSQL, and myxo[aiohttp] adds that HTTP client. A layout that needs a missing extra is refused with the extra's name. To upgrade an installation on PostgreSQL, depend on myxo[postgresql].

Added

  • Migrations of the framework's tables: myxo migrate records in myxo_versions the changes each part has made to its tables, and runs only those a database lacks, once, in one transaction. On PostgreSQL, migrations that start together run one after the other.
  • @myxo.topic(name): an event or job type keeps the name it is stored under when its class moves or is renamed. myxo migrate warns about stored jobs that no service handles.
  • Types: the package ships py.typed, so type checkers read its annotations. runtime.client accepts a Protocol under mypy.
  • Upgrades one process at a time: the operations guide gives the procedure, for an upgrade whose migrations only add. E15 ran it three times on PostgreSQL under load, with jobs queued and events pending, and lost nothing.
  • A rule for evolving messages, in the operations guide: a message gains fields only with defaults, and keeps those its readers need. Tests run calls, events and jobs between two versions of a message.
  • Documentation: a site in docs/src/, built with Zensical (make docs), with quick start, concepts, guides, a split tutorial and reference, and an llms.txt.
  • myxo check warns about a listener beyond loopback: a process whose bind lets other machines call the services it runs, unauthenticated, gets a warning. The command still succeeds.
  • myxo check: it reports a client that no service implements, or whose process has no url, reading the clients from each service's source. A service that shares a package with another must now reach it through its interface too.

Fixed

  • A job that does not decode, such as one written by an older version of the type, counts the attempts and ends failed, with the error kept. The worker used to crash at each claim, without end.
  • A schedule whose every= names a missing setting, or one that holds no number, stops the process with a message naming it, and myxo check reports it, where both gave a traceback.
  • Push answers 400 to a Last-Event-ID that is not an event's id, where it failed with a traceback.
  • An answer that does not decode as the operation's result raises RemoteError, which names the operation, where the caller got a msgspec error.
  • A mistyped setting, a malformed layout or a missing layout file gives one line and status 1 from every command that loads the layout, where it gave a traceback. A setting's message names the section.
  • myxo export refuses an unknown key outside the services' sections, which it used to write into the target's files. It refuses an instance count that is no number, where it gave a traceback.

[0.1.0] - 2026-11-06

This first version is for internal use: it is distributed as wheels built locally, and goes to no package index. It needs Python 3.14 or later.

Added

  • Services: classes with typed interfaces and frozen msgspec messages, found through entry points. A process imports only the services it runs.
  • Layouts: a TOML file that places services in processes and reads the environment. The same code runs in one process or several, with one timeout and the same errors (Invalid, NotFound, Unavailable, RemoteError) on direct calls and over HTTP or Unix sockets.
  • Supervision: one-for-one restarts with a backoff, and readiness per process that covers each service's dependencies (/readyz).
  • Framework services, on SQLite and PostgreSQL: events (an outbox written in the caller's transaction, with consumer groups), jobs, schedules with one leader, push to browsers, and caches. Redis is not needed.
  • Commands: myxo serve, migrate, up, check and export.
  • Export targets: systemd, a Procfile, Hop3, Kubernetes (replicas, probes, a network policy per process, a restricted security context) and a Docker image.
  • Documentation: a tutorial that takes an application from one process to replicas, and a reference.

Known limits

  • Moving data: nothing moves an installation's data from SQLite to PostgreSQL. An installation that changes database starts empty.
  • SQLite: one host, and one writer at a time. A layout that asks for more is refused, with the next step named.
  • Sandboxing: privileges = "reduced" has not been checked in full on systemd, which needs root on a machine without a container layer. Hop3 cannot reduce privileges yet.
  • Tracing: no OpenTelemetry yet.
  • Versions: no rule yet for evolving interfaces and events across versions, so upgrade every process of an installation together.