Articles

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.