A keyboard-driven, green-screen LiveView console — reminiscent of AS/400-style terminal screens — generated by introspection from your Ash resources. Zero UI code.
Prerequisites
An existing Phoenix + Ash project. Starting from scratch:
mix archive.install hex igniter_new
mix archive.install hex phx_new
mix igniter.new my_app --with phx.new --yes
cd my_app
mix igniter.install ash,ash_phoenix,ash_postgres --yes
(Two separate steps rather than one combined command: more reliable in practice.) See Ash's own Getting Started guide for details.
Installation
With Igniter (recommended — a single command):
mix igniter.install green_ash
This adds the dependency and patches your router. Nothing else to write.
If you'd rather run
mix green_ash.installdirectly (skippingmix igniter.install), your project must already have{:igniter, "~> 0.5", only: [:dev, :test]}in its own dependencies — Mix doesn't propagate a library'sonly:dependencies to its consumers.mix igniter.install green_ashtakes care of that for you.
Manually
If you'd rather not use Igniter, or want to see exactly what the installer does:
Add the dependency in
mix.exs:{:green_ash, "~> 0.1"}Mount the console in your router, inside a scope going through the
:browserpipeline (session required):import GreenAsh.Router scope "/" do pipe_through :browser green_ash "/cli" end
That's it. /cli lists your Ash resources, and for each one: create,
list (filter + sort + pagination), business-action update/destroy (with
confirmation), record inspection, and a session-based "actor" for exercising
your policies — all derived by introspecting your actions.
Exposed domains are read dynamically, on every request, from
Application.get_env(:my_app, :ash_domains, []) — the same config key
mix ash.setup/mix ash.codegen already rely on. Add a new Ash domain later
(including via Ash's own generators, which maintain that config) and it shows
up immediately — no need to touch the router or re-run the installer.
Need to expose only a subset, or domains not registered under the standard
key? Pass domains: explicitly to override the default:
green_ash "/cli", domains: [MyApp.Bank, MyApp.Sales]Recommended: keep the route dev-only (as the installer does), guarding it
with if Application.compile_env(:my_app, :dev_routes) do ... end — the
console lets you create/update/destroy records without your app's own
authentication, so it isn't a production admin panel.
Using the console
- Navigation: digits + Enter on menus,
j/k/Enter/Escin lists. - Vim-style
:command line::list <resource>,:new <resource>,:actor <resource> <id>/:actor none(to exercise your policies),:whoami,:debug(raw inspection),:menu,:help.
Adding a resource
Any Ash resource declared in an exposed domain shows up on its own in /cli,
with no UI code. A few descriptions on the resource and its actions improve
the labels shown (optional).
Developing the library
mix test # no Postgres required: Ash.DataLayer.Ets harness
See examples/bank/ and examples/library/ (in the monorepo) for full
Postgres-backed examples.