Almasix

Ship Python web apps with a shape you already trust.

Routing, Articulate, Prism, auth, queues, and Smith — async end to end, without bolting a framework onto FastAPI by hand.

$ pipx install almasix

installing almasix from PyPI…

✓ almasix is on your PATH

$ almasix new myapp

kit Web · stack Tailwind · db SQLite

✓ app · routes · config · resources

✓ database · storage · smith

$ python smith make:model Post -m

✓ app/models/post.py

✓ database/migrations/*_create_posts_table.py

$ python smith make:controller PostController --resource

✓ app/http/controllers/post_controller.py

# create_posts_table.py

from almasix.orm import Blueprint, Migration, Schema

class CreatePostsTable(Migration):
    async def up(self) -> None:
        def define(table: Blueprint) -> None:
            table.id()
            table.string("title")
            table.foreign_id("user_id")
            table.timestamps()
        await Schema.create("posts", define)

# app/models/post.py

from almasix.orm import Model, relation

class Post(Model):
    fillable = ("title", "user_id")

    @relation
    def author(self):
        from app.models.user import User
        return self.belongs_to(User)

    @relation
    def comments(self):
        return self.has_many(Comment)

# post_controller.py

from almasix.http import Controller, Request, Response
from almasix.prism import view
from app.models.post import Post

class PostController(Controller):
    async def index(self, request: Request) -> Response:
        posts = await Post.query().with_("author").latest().get()
        return view("posts.index", posts=posts)

# posts/index.prism.html

@extends("layouts.app")

@section("content")
  <x-card>
    <x-slot:title>Posts</x-slot>
    @foreach(posts as post)
      <p>{{ post.title }} — {{ post.author.name }}</p>
    @endforeach
  </x-card>
@endsection

# routes/web.py

from almasix.routing import Route
from app.http.controllers.post_controller import PostController

with Route.group(middleware=["web"]):
    Route.get("/", [WelcomeController, "index"])
    Route.resource("posts", PostController)
    Route.get(
        "/posts/{post}",
        [PostController, "show"],
    ).name("posts.show")

# send_digest.py

from almasix.console import Command

class SendDigest(Command):
    signature = "mail:digest {user?} {--queue=default}"
    description = "Send the daily digest"

    def handle(self) -> int:
        user = self.argument("user") or "everyone"
        self.info(f"Queue={self.option('queue')} → {user}")
        return 0

# routes/console.py

from almasix.console import schedule

schedule.command("mail:digest").daily()
schedule.command("cache:prune").hourly()
schedule.call(clear_recent_users).daily_at("01:00")

# cron: * * * * * cd /app && smith schedule:run

$ python smith migrate && python smith db:seed

✔ Migrated · seeded

$ python smith serve

http://127.0.0.1:3000

Hover to pause · pin a step to study it · ← → to move

An application, not a bag of libraries.

Almasix gives you the directories, conventions, and CLI of a grown-up web framework — controllers, providers, migrations, views — while FastAPI and Starlette stay under the hood where they belong.

myapp/
├── app/
│   ├── http/controllers/
│   ├── models/
│   └── providers/
├── routes/
│   ├── web.py
│   └── api.py
├── resources/views/
├── database/migrations/
├── config/
└── smith

Named tools. Clear jobs.

Every surface has a name you can say out loud — so the docs, the CLI, and your codebase agree.

  • Articulate Async Active Record ORM, query builder, relationships, and migrations. ORM docs
  • Prism Blade-familiar templates compiled to fast Python callables. View engine
  • Smith In-app CLI — generate, migrate, serve, schedule, and open Loupe. Console docs
  • Chrono & Loupe Dates that behave, and a REPL that knows your application. Dates

From install to first response.

One global tool scaffolds the app; Smith runs everything inside it.

  1. Install the installer pipx install almasix
  2. Create a project almasix new myapp
  3. Serve cd myapp && python smith serve
pipx install almasix && almasix new myapp Full installation guide

The Almasix ecosystem

The hub for the framework, first-party packages, editor support, and docs — without assuming you’ve used Laravel.

Framework & docs

Core Almasix on PyPI, with the full beginner journey at docs.almasix.com.

Open documentation →

First-party packages

Conduit for reactive components, Inertia for SPA shells, Orbit for admin panels, and more packages as the line grows.

Browse packages →

Editor support

Prism language tooling for VS Code / Cursor and JetBrains, plus smith ide:install.

Editor setup →

Starter kits

Opinionated app skeletons — Tailwind, Bootstrap, or plain — so auth and settings aren’t a weekend project.

Starter kits →

Build the next Python app like you mean it.

Read the prologue, install once, and keep shipping with Smith.