Ryth Azhur e4091dfbe8 SSR docs declare the embedded-V8 architecture; surface re-chartered per appeal
docs/SSR_ARCHITECTURE.md now specifies the decided shape: Django template
backend rendering through the PyO3-bound SsrEngine (cores/mizan-rust-ssr,
deno_core + deno_web), bundles built by mizan-generate, props crossing as
parsed values, no external JS runtime serving requests, no_rsc guard.
docs/AFI_ARCHITECTURE.md follows (mizan-rust-ssr in the cores layout, Bun
worker delisted). OWED_SURFACE.md regenerated via appeal-surface: the
Bun→PyO3 cutover, the PyO3 binding surface, and the mizan-generate SSR
bundling step are now chartered owed mechanisms instead of an orphaned
engine crate.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-05 19:43:16 -04:00
2026-06-04 21:37:24 -04:00
2026-06-04 03:38:26 -04:00
2026-06-04 21:37:24 -04:00
2026-06-04 03:38:26 -04:00
2026-06-04 21:37:24 -04:00

Mizan

Mizan is an Application Framework Interface (AFI). A single @client decorator on a server function generates a typed frontend client; cache invalidation and caching are handled by the protocol.

from mizan import client, ReactContext

UserContext = ReactContext('user')

# Context function — bundled into GET /api/mizan/ctx/user/
@client(context=UserContext)
def user_profile(request, user_id: int) -> UserShape:
    return UserShape.query(lambda qs: qs.filter(pk=user_id))[0]

# Mutation — invalidation scoped automatically by matching param name
@client(affects=UserContext)
def update_profile(request, user_id: int, name: str) -> dict:
    ...

Adapters

Backends: Django (backends/mizan-django, the reference implementation), FastAPI (backends/mizan-fastapi), Rust/Axum (backends/mizan-rust-axum), Tauri (backends/mizan-tauri), and TypeScript (backends/mizan-ts). Frontends are generated from the KDL IR over the @mizan/base kernel; frontends/ holds the kernel, the per-framework adapters, and the transports.

Per-adapter transport shape:

  • Tauri's transport is Tauri IPC (a single #[tauri::command] envelope), not HTTP. Invalidation rides in the JSON response body; there is no header channel.
  • Rust/Axum and Tauri are the IR authority via the #[mizan::client] macro + linkme registry; the codegen links the crate directly (build_ir() / the export-ir bin) rather than fetching over HTTP.
  • "API shapes" is Django's django-readers queryset projection — ORM-coupled. Every adapter carries typed input/output through the KDL IR; the projection primitive itself is Django-only.
  • FastAPI and Rust/Axum expose GET /session/ returning a null CSRF token for wire parity; CSRF is Django-only.
  • TypeScript is an edge/protocol-reference adapter (HMAC cache, manifest, PSR), not a codegen source — it demonstrates the cache + invalidation protocol is language-agnostic.

Caveat: Rust/Axum and Tauri accept auth= on a function but their dispatch paths do not enforce it — do not rely on auth= for access control on those adapters.

Auth-provider integration (django-allauth) lives in its own repository, mizan-allauth — a dedicated Django system built on mizan-django's forms and context primitives.

Conformance

Per-adapter capability support is measured by the AFI conformance suite in tests/afi/, not maintained as prose — the suite asserts IR-shape parity: the same fixture through Django, FastAPI, and the Rust adapter emits byte-identical KDL (test_codegen_parity.py).

Documentation

License

Mizan is licensed under the Elastic License 2.0 (SPDX: Elastic-2.0). You may use, copy, modify, and distribute it freely, including in commercial products you build on top of it. You may not provide Mizan to third parties as a hosted or managed service that exposes a substantial set of its features.

Description
No description provided
Readme 4.8 MiB
Languages
Python 49.3%
Rust 26.7%
TypeScript 21.1%
Jinja 2.4%
JavaScript 0.3%
Other 0.2%