Skip to content

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.

Python 3.12+ · FastAPI · SQLAlchemy
gl.py — core-api
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.

SQLAlchemy · Alembic · uv tool
sh — alembic-push

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.

sh — releaser

▪ shipping deterministic orchestration

Take the podium.