Live cards for your own objects, in every agent reply.
Codecast already draws its own objects as live references: a task, a pull request, a decision. A mod adds yours, like incidents, customers, deploys or rows in your own product. An agent writes a short id, and you see the object with its current state, a card on hover and a page one click away.
- 16
- kinds built in
- 9
- field types for yours
- 0
- deploys to change a mod
The errors start with #3263Batch webhook retries per endpoint, which went out in the 2:10 deploy. I opened ct-4102Revert the retry storm in the webhook worker to revert it and put the previous build on a canary:
```rollout
{ "service": "payments-api", "build": "v412", "canary": 25 }
```Hit hardest: cus-3f9a21bcAcme Logistics and cus-77d0e412Northwind Bakery. Promote the canary once errors hold under 0.5%. Tracking it as inc-7Checkout 502s after the 2:10 deploy.
What the agent wrote, next to what you see
The errors start with #3263, which went out in the 2:10 deploy. I opened ct-4102 to revert it and put the previous build on a canary:
```rollout { "service": "payments-api", "build": "v412", "canary": 25 } ```
Hit hardest: cus-3f9a21bc and cus-77d0e412. Promote the canary once errors hold under 0.5%. Tracking it as inc-7.
The errors start with Batch webhook retries per endpoint, which went out in the 2:10 deploy. I opened Revert the retry storm in the webhook worker to revert it and put the previous build on a canary:
Hit hardest: Acme Logistics and Northwind Bakery. Promote the canary once errors hold under 0.5%. Tracking it as Checkout 502s after the 2:10 deploy.
References keep updating after the message is sent
- severity
- sev-2
- service
- payments-api
- commander
- Dana
- started
- Oct 16, 2:14pm
Error rate jumped from 0.1% to 6% when v413 went out. Canary on v412 is holding.
- plan
- Team · 8 seats
- MRR
- $640
- failed charges
- 5 since 2:14pm
Sixteen kinds built in
@[Title id] to keep the title in full on every mention. A bare id shows its title the first time and stays short after that, so a paragraph that names one task five times still reads cleanly.See Retry webhook deliveries for the details.
- agent
- claude · opus
- project
- api
- files
- 6 changed
Swapped the fixed 30s retry for exponential backoff with jitter; replaying the outage fixture now.
Open a reference as a pill, a card or a page
Its title and state, inline with the text.
A card with a real snippet, which expands to the full width of the reply.
Error rate jumped from 0.1% to 6% when v413 went out. Canary on v412 is holding.
Every field, editable. The mod can draw its own view above them.
Error rate jumped from 0.1% to 6% when v413 went out. Canary on v412 is holding.
Add your own object kinds
covid-19 in a sentence stays prose. A kind stays recognised while its mod is switched off."objects": [{"prefix": "inc","title": "Incident","plural": "Incidents","icon": "flame","statuses": ["triage", "mitigating", "monitoring", "resolved"],"fields": {"severity": { "type": "enum", "options": ["sev-1", "sev-2", "sev-3"] },"service": { "type": "text" },"commander": { "type": "person" },"started": { "type": "date" },"session": { "type": "ref" }}}]
Messages, docs, comments, chat, published pages. inc-6 is resolved, so it dims.
One column per status, drag to move. A New incident field on top.
A severity picker, a person picker, a date, a link to the session it came from. All editable.
$ cast obj create inc "Refund webhooks retry with no cap" --set severity=sev-3 created inc-8 $ cast obj set inc-7 status=monitoring
Show objects that live in another system
// "external": true in the manifest: nothing is stored in codecast.on("object.resolve", { object: "cus" }, async ($, e) => {const r = await $.http.fetch(`https://api.acme.dev/customers/${e.id}`,{ secret: "acme_admin" });if (!r.ok) return null;const c = r.json;return {title: c.name,status: c.health,fields: { plan: c.plan, mrr: c.mrr, owner: c.owner },};});
The API key stays on codecast's server. A request that names a secret is sent from there, only to the origins that secret allows, and no browser ever holds the key. A connected product can be read through $.connector.read instead, as the person who is looking.
- plan
- Team · 8 seats
- MRR
- $640
- failed charges
- 5 since 2:14pm
Blocks that draw live data and buttons
Canary is out on the previous build:
Built in. A one-off drawing the agent writes as HTML for one reply. Static once sent.
Code that draws from live data, for everyone with the mod, every time the block appears.
on("ui.render", { fence: "rollout" }, async ($, e) => {const { service, build } = JSON.parse(e.props.code);const url = `https://deploy.acme.dev/${service}/${build}`;const r = await $.http.fetch(url, { secret: "deploy" });const d = r.json;return (<Card title={service}><Grid columns={3}><Stat label="traffic" value={`${d.canary}%`} /><Stat label="errors" value={d.errors.canary} tone="green" /><Stat label="errors" value={d.errors.current} tone="red" /></Grid><Sparkline values={d.errors.series} tone="red" /><Row gap={2}><Button variant="primary" onPress={() => promote($, d, 50)}>Promote to 50%</Button><Button onPress={() => rollback($, d)}>Roll back</Button></Row></Card>);});
Agents learn your kinds when the mod is installed
inc-8 instead of being mentioned once and forgotten.Incidents (inc-N): mention one by its short id and it reads as a live reference. When you find a problem you are not fixing in this session, file it with cast obj create inc "<title>", or write a finding block and let the person file it with one click.
The payments worker now backs off with jitter and caps at five tries. While tracing it I found the same pattern somewhere I am not touching:
Same pattern as the payments worker: a provider outage multiplies into a retry storm. Not fixing it in this session.
Panes, commands, sidebar sections and themes
- 1Sidebar sections under the app's nav
A titled section the mod draws, like the open incidents with their live state.
- 2Panes a tab, or one cell of a split
A whole screen, drawn from your store, filled the instant it opens.
- 3Palette commands a Mods group in the command palette
Open a pane, or run in place. A failure shows as a toast.
- 4Themes Settings, Appearance
A palette for light and dark that recolors the whole app.

Build a mod by asking for it
Read data from your own machines
on("local.start", ($) => {$.every(10_000, async () => {const { stdout } = await $.sh("tail -n 2000 /var/log/payments/api.log");const lines = stdout.split("\n");const errors = lines.filter((l) => l.includes(" 502 ")).length;$.publish("payments.errors", errors);if (errors > 50) await $.objects.create({prefix: "inc", title: "payments-api 502s on " + $.device,fields: { severity: "sev-2", service: "payments-api" },});});});
Each mod reaches only what it was granted
- reads
- sessions, tasks, pull requests
- writes
- incidents (its own kind), tasks
- fetches
deploy.acme.dev- secrets
- deploy, kept on the server
- A teammate's mod runs for you only after you press Install, at the grants on its card.
- Keys never reach a browser. Requests that need one are sent from codecast's server.
- It writes only the kinds it owns, and sees your name, never your email.
- Every version keeps its source: readable, diffable, one step to roll back.
Mods are built by agents, so the build loop is a handful of commands. You can run them yourself too.
cast mod new <name>a working scaffold: a pane, a command and a blockcast mod buildbundle, typecheck, and check the code against its grantscast mod pushlive in the app within seconds; prints the pane's linkcast mod logs <name>what it printed and threw while drawingcast mod publish -m <note>a numbered version with its sourcecast mod rollback <name>back to an earlier versioncast mod guidewhat every running mod asks of agentscast obj kindsevery object kind in this workspacecast obj create <prefix> <title>file an object, with --set field=valuecast obj set <id> status=<s>move it alongRelated features
For a one-off report or dashboard at a link, publish a page instead of building a mod.
A decision is one of the built-in kinds: sd-N renders with its options and your answer.
Pull requests render inline with checks, reviews and the session that owns them.
Objects your agents file stay searchable, with the session that filed them.
Get started with mods
Install codecast, open Agent features from your account menu and switch on Mods. Then ask an agent for the first one: the incident desk, the customer lookup, the deploy panel your team keeps asking about.
curl -fsSL codecast.sh/install | shbrew install codecast-sh/tap/codecast or npm install -g @codecast-sh/cli