Open source
Built for our tree. Published for anyone.
A handful of tools came out of building ShareWell and stayed useful enough to publish. Releaser cuts every release in the tree; huracan and alembic-push run under the Python backends. All of them install straight from GitHub.
huracan
An async-first CRUD framework for FastAPI, SQLAlchemy and Pydantic.
Declare a SQLAlchemy model, and huracan generates the Pydantic schemas, the routes and the query support.
Every endpoint in core-api used to mean the same chore: write the model, then write the
create, update and public schemas by hand, then write the routes, then keep all four in
sync as the model changed. huracan collapses that to the model. A @route decorator on a SQLAlchemy class produces the
schemas, the CRUD routes and OData queries ($filter, $orderby, $top, $search).
What it changed at ShareWell: core-api and billing-api are both built on it, so every API
in the tree exposes the same shapes and the same query language. New endpoints take
minutes, and validation rules live on the model with @rule decorators instead of being scattered across handlers.
The uniformity pays twice over when a coding agent lands in a service it has never seen.
from huracan import Base, route, RouteConfig @route('/gl') class GL(Base): __tablename__ = "gl_entry" __route_config__ = RouteConfig(tags=["General Ledger"]) gl_entry_id: Mapped[int] = mapped_column(primary_key=True) # schemas, routes and OData queries are generated from here
alembic-push
drizzle-kit push, for Alembic.
File-less schema sync for the dev loop: it reads your SQLAlchemy metadata, diffs the live database, and applies the DDL directly.
During development, every schema tweak used to cost a throwaway migration file:
autogenerate it, read it, run it, delete it later. alembic-push removes the file. It
drives your existing alembic.ini and env.py, diffs your metadata against the live
database, and applies the change in one transaction.
It is careful where autogenerate is not. A rename prompts "created or renamed from X?" and
emits ALTER … RENAME instead of dropping the column.
Destructive changes are summarised with live row counts and need confirmation. Tables you don't
model are never touched. Production still uses versioned Alembic migrations; this is for the
loop before that.
Releaser
One command from working tree to release.
Releaser used to be part of the suite. Now it stands on its own, open source: version, changelog, tag, push and GitHub release for Python, Node and Rust — dry-runnable, CI-safe, and reversible.
Every repo in the tree cuts releases the same way, so shipping never needs judgement. Releaser reads the conventional-commit history, bumps the version, writes the changelog with git-cliff, tags, pushes and creates the GitHub release. One command, and the same behaviour for a human, a CI job or an agent.
When a release goes out wrong, releaser undo removes
the commit, the tag and the GitHub release in one step. Maestro itself is released this way.