defmodule AshHqWeb.Pages.Home do @moduledoc "The home page" use Surface.LiveComponent alias AshHqWeb.Components.{CalloutText, CodeExample, SearchBar} alias Surface.Components.Form alias Surface.Components.Form.{Field, ErrorTag, TextInput, Submit} import AshHqWeb.Components.CodeExample, only: [to_code: 1] data(signed_up, :boolean, default: false) data(email_form, :any) def render(assigns) do ~F"""
Why do we keep reinventing the wheel?
Every time you start a new app, are you rebuilding features that you've already built many times? Wouldn't it be great if you could just focus on the important parts of an app without reinventing ways to authenticate, add permissions, etc. Ash allows you to not only use patterns in existing extensions, it lets you extract your own patterns into custom extensions. So when you need to do it again in a new application, it's already done just wire it up.
Build large applications without making a mess
Over time and over larger teams of different experience levels, patterns can change and drift away from each in different parts of a large application. Some parts of the app are done one way, other parts are done another way, there are also the scary parts of any app that dragons lay in wait for the unwary adventurer.
Spaghetti belongs in the kitchen, not in your codebase. Ash provides the ability to keep all similar parts of your application consistent, making it easy to share an architectural vision while allowing escape hatches to do something different if needed.
Ash is more than it appears
Ash is more than just auto-generated API or an Admin UI. It’s a fully extensible DSL to model your domain, which creates a declarative, highly introspectable representation. This in turn can be used to derive anything you want.
Ash has built in extensions that allow you to generate Admin UIs or Phoenix LiveView Form helpers, saving a ton of boilerplate. Hopefully you never need to swap data layers, but Ash lets you do something really hard, quite easily.
"Through its declarative extensibility, Ash delivers more than you'd expect: Powerful APIs with filtering/sorting/pagination/calculations/aggregations, pub/sub, authorization, rich introspection, GraphQL... It's what empowers this solo developer to build an ambitious ERP!"
"What stood out to me was how incredibly easy Ash made it for me to go from a proof of concept, to a working prototype using ETS, to a live app using Postgres."
"Ash is such powerful idea and it gives Alembic such a massive competitive advantage that I’d be really stupid to tell anyone about it."
"Through its declarative extensibility, Ash delivers more than you'd expect: Powerful APIs with filtering/sorting/pagination/calculations/aggregations, pub/sub, authorization, rich introspection, GraphQL... It's what empowers this solo developer to build an ambitious ERP!"
Join our mailing list for (tastefully paced) updates!
{/if}A taste of how to configure Ash
Below is some examples of the way you can model your resources with actions, attributes and relationships. You can easily swap data layers between Postgres or ETS for example, or add your own data layer extension. Once you've modelled your resources, you can derive GraphQL or JSON API external APIs from them.
Join our mailing list for (tastefully paced) updates!
{/if}