Changelog¶
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]¶
Changed¶
aiohttpandasyncpgare extras:myxoalone runs on SQLite,myxo[postgresql]adds PostgreSQL, andmyxo[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 onmyxo[postgresql].
Added¶
- Migrations of the framework's tables:
myxo migraterecords inmyxo_versionsthe 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 migratewarns about stored jobs that no service handles.- Types: the package ships
py.typed, so type checkers read its annotations.runtime.clientaccepts aProtocolunder 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 anllms.txt. myxo checkwarns about a listener beyond loopback: a process whosebindlets 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 nourl, 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, andmyxo checkreports it, where both gave a traceback. - Push answers 400 to a
Last-Event-IDthat 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 exportrefuses 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
msgspecmessages, 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,checkandexport. - 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.