Polyglot software developer and technology consultant. Co-organiser of Elixir Sydney and GraphQL Sydney meetups. Working on GraphQL and Elixir at Alembic.
Everyone is creating agentic interfaces for their applications (or agents are just calling your APIs).
#AshFramework for #ElixirLang has always made it easy to safely expose behavior over external interfaces, and MCP is no different. But agents can also do clever things! And we use them to do more than just "POST /some/thing" at this point.
We want agents to have powerful tools, but they need to also be safe and consistent.
AshLua (https://t.co/b2vgZqMaHT) gives you exactly that. You can provide the agent with a lua sandbox to call the actions defined in your application, but the actor is injected into every call ensuring they have no way of escaping their privileges.
The next release of AshLua takes this even one step further, and gives agents the ability to use transactions 😎. Why have an agent make 14 API calls in a sequence just to try and clean it up later, or leave things in a dangling state?
There is a better way!
AshTypescript gives you a fully typed TypeScript client generated from your Ash resources. RPC functions, type-safe filters, sorted queries, typed controllers, typed channels, Zod schemas, all derived directly from your app. 🧵
#AshFramework#ElixirLang#Typescript#React
In igniter v0.7.8, installers/tasks should now be wildly faster during code generation, especially on top of existing projects. ~7 minutes -> 15 seconds for running `mix https://t.co/BmsxOY2cwX` on a project w/ 1200 files.
#ElixirLang#AshFramework
Details in thread 🧵
AshAI lets you turn your existing #AshFramework actions into LLM tools. Policies and validations still apply, so the LLM can only do what an authorized user could do. You can expose them as an MCP server too, so Claude Desktop can call your application directly. #ElixirLang
Thanks to @leonqadirie we now have Credo checks for #AshFramework! Lots of great stuff in there, already using it for one of my own projects. Take a look!
https://t.co/Ke3Y8CPiUr
#ElixirLang
Thanks to @k3n_k0st, #AshFramework now supports relating "through" a path. This can dramatically simplify loading patterns and reduce cases where you'd have had to define a manual relationship or calculation. Super useful and all the benefits of relationships apply! #ElixirLang
Woot! https://t.co/3q87OK38TD will now serve llms.txt for Elixir/Erlang packages if the accept header is text/markdown. If you have a package and you use ExDoc, update to the latest version (which generates .md files by default) and republish your docs.
ghostty_ex v0.3.0 — now with a full-featured terminal component for Phoenix LiveView.
Like xterm.js, but server-rendered through LiveView — no JS terminal state, no React/Vue wrapper. Cursor, selection, copy/paste, fit-to-container. Powered by Ghostty's VT parser via NIFs.
https://t.co/llb91rYekb
Warning to open source maintainers: the Axios supply chain attack started with some
very sophisticated social engineering targeted at one of their developers https://t.co/ykpjVUFmUu
Meet LiveStash - our new library solving @elixirphoenix LiveView state loss during WebSocket reconnects.
Stash your assigns & recover them automatically via ETS (server-side) or Browser Memory (survives redeploys).
Demo, GitHub, and blogpost linked below! 👇
In the latest release of #AshFramework, you can encapsulate sets of changes/preparations/validations as "pipelines". More related features coming, but its already a great way to clean up duplicate actions. You can even use `where` to make the whole set conditional! 😎 #ElixirLang
#ElixirLang 🤝 #Typescript like never before 😎 AshTypescript just launched `TypedChannel`, completing the circle on end-to-end type safety between your TS frontend and Elixir backend, fully generated from your #AshFramework resources. This is *huge* 🤯. I cannot overstate it.
Calculations in #AshFramework are extremely powerful, but something that often happens is you end up adding a whole lot of them, each one taking up a field on the struct. Now you can pass `field? false` to get all the features with no struct field taken! 🎉 #ElixirLang