Why we ported Ash Framework to 14 languages
Ash Framework is Elixir's declarative application framework: define a resource once and you get actions, filtering, authorization, multitenancy, JSON:API and GraphQL for free. We've used Ash for years at Anndream, and it changed how we think about the data layer.
The natural question was: if Ash is this good, why shouldn't other languages benefit the same way? Our answer was — try porting it. What emerged is theAshlar family: 14 programming languages and counting.
Why port instead of rewrite
The alternative was writing our own framework from scratch — but that means answering all the same questions again: validation, changesets, authorization, the data layer. Ash spent years distilling those answers. Porting lets usinherit a proven design and focus on the real challenge: making a declarative model work well in each target language.
- Module structure mapped 1:1 to Elixir's
lib/ash - Spec documentation in a dedicated folder in every repo
- Real example apps (blog, todo) showing usage
Languages covered
Ashlar now spans mainstream languages and growing ones alike: Rust, Go, Python, TypeScript, Kotlin, C#, PHP (Laravel), Clojure, Crystal, Swift, Nim, Zig, Gleam and F#.
Each repo has its own ecosystem — Cargo workspaces for Rust, Gradle multi-modules for Kotlin, composer packages for Laravel, pnpm monorepos for TypeScript — but the core design is the same.
Lessons learned
The most interesting part is how each language forces a different kind of thinking. Rust teaches ownership and error handling, Go teaches simplicity, and Clojure teaches data-first design. Porting fourteen times made it clear which ideas in Ash are the real core — and which are just Elixir artifacts.
A declarative resource model isn't a language feature — it's a way of thinking that belongs in every language.
Every repo is open source, and each language's spec docs live in its*-docs folder. See the Open Sourcepage for details.