Every bet on this table β skill executor, tool worker, cron scheduler, memory store β is an OTP GenServer. That means every process has a parent who watches, a lifecycle you can track, and a crash that doesn't fold the whole game:
:sys.get_state/1 β no guessworkWhen a skill executor craps out β it buys back in, doesn't stiff you. When a tool times out β the pit boss handles it, not you. OTP is the felt on the table.
In most agent frameworks, "skills" are files scattered in a directory β like cash stuffed in random pockets. Glasscraps stacks every chip on the felt as an Ecto schema row in PostgreSQL:
Version.match?/2The croupier is queryable. Repo.all(Skill) shows every chip in play. Repo.get_by(Skill, version: "~> 1.2") finds the exact stack you need. The skill is on the table β not in a pocket you hope you didn't lose.
Every other agent framework keeps the action behind a curtain β React app, Vue dashboard, terminal window. Glasscraps puts the game on a glass table. The same OTP application dealing the rolls also shows you every bounce:
mix phx.server and the game is livePop open the cron board and you're watching the same GenServer that's running the bets. Open the skill registry and you're querying the same Ecto schema the dealer uses. No cache. No sync. No "results in 15 minutes." What you see is exactly what the dice show.
Every other framework schedules jobs like a back-alley bookie β a line in /etc/crontab, a YAML file you hope someone reads. Glasscraps puts every bet on the table as an Ecto record:
Bets that crap out don't vanish into the house's pocket. They land in the dead letter queue β an Ecto table with the full error, the full output, and the original bet slip. Reroll from the browser. Edit from the browser. Walk away from the browser. No terminal required.
Most agents have "memory" like a drunk at the slots β one push of "clear context" and the whole session disappears. Glasscraps runs two banks:
Both are visible and editable through the glass. See every chip on the warm table. See what's stacked in the cold vault. Edit entries from the UI β add chips, remove chips, count the take. See exactly what the dealer will read on the next roll. No "what did the house see?"
OpenAI dealer on one table, Anthropic dealer on another, llama.cpp in a smoke-filled back room β all different rules, all different house takes. Glasscraps runs one pit with interchangeable dealers:
The dealer roster is on the glass. See who's dealing, what their limits are, what they cost per hand. Swap from the UI. The table picks up the new dealer on the next roll.
.env files, ~/.bashrc exports, sticky notes on the monitor β that's how most agents store their API keys. Glasscraps uses AWS Secrets Manager with a local strongbox for the road:
mix task, not a prayerEvery secret has provenance. No more "I think the API key is under the keyboard." The vault is visible, editable, and auditable β all through the glass.
When the dealer makes a weird call β and it will β you need to watch the replay. Not just the last throw, but the whole session at the table:
When someone says "the dealer got weird," you don't shrug. You search the logs. You find the exact roll where the game went sideways. You see what the dealer saw.
Every casino knows exactly how much every table makes. Most agents run blind β you curl localhost:8000/metrics | grep ... and hope. Glasscraps ships with the counting room built in:
/metrics out of the boxProduction visibility isn't an afterthought to bolt on when the feds show up. It's in the mix.exs since opening night.
Glasscraps doesn't "wrap" another agent framework like a third-party card dealer. It IS the casino β a Phoenix umbrella with two wings:
Same mix.exs. Same config/. Same security team. One building. One dealer. One game you can see.
The web UI is the game, not a spectator screen. Same OTP application. Same GenServers. Same Ecto pool. Every panel is a window into the felt β inspect the dealer, watch the rolls, see the chips land.
Skills aren't files β they're schema rows with version, dependencies, and lifecycle. The Repo.all(Skill) query shows every chip the croupier can call. No "where did I put that thing?"
Every tool call has duration, result, and error. Every model call has prompt, output, tokens. Every cron run has timestamp, outcome, state. The log is the table's security camera β you can rewatch any play.
Failed cron jobs don't drift into the house's pocket. They hit the DLQ β an Ecto table with the full error, full output, and the bet slip. Reroll from the browser. Edit from the browser. Cash out from the browser.
Warm ETS and cold Ecto are both visible through the browser. See the hot table β in-process, live, what the dealer's holding this very roll. See the cold vault β what survives the reset, what the house keeps. Edit, delete, inspect β all on the glass.
| π² Roll | LangChain | AutoGPT | Haystack | Glasscraps |
|---|---|---|---|---|
| Can you see the dealer? | Terminal only | CLI only | UI | LiveView β same process |
| Can you see the chips? | Files | Files | Pipelines | Ecto rows β queryable |
| Can you see the rolls? | LangChain call | Agent loop | Pipeline step | Poolboy + GenServer |
| Can you see the bets? | β | β | β | Cron + DLQ in browser |
| Can you see the vault? | β | Context window | β | Warm + cold, editable |
| Can you swap dealers? | Env var swap | Env var swap | β | Runtime, no restart |
| Can you find the records? | β | β | β | FTS5 over every hand |
| Can you audit the vault? | β | β | β | AWS + local, visible |
| Can you count the house? | β | β | β | Prometheus / OTel |
| What's the house language? | Python | Python | Python | Elixir Β· OTP Β· Phoenix |
| Is the house open? | MIT | MIT | Apache | MIT β you can own it |
We'll ping you when the dealer's ready. No spam β the house is discrete.