AI Night · May 2026

Applied AI:

three learnings

from shipping.

Zack Proser Applied AI · WorkOS
10 minutes Three ideas, one bonus
What I'll cover

Three things I've learned shipping AI internally.

  1. 01 Interface beats stack. Where the model meets the user is the whole product.
  2. 02 Complete the loop. Capture → ticket → agent → ship. Wire it end-to-end.
  3. 03 Mind the imagination gap. The models are already further than how we're using them.
Applied AI LearningsZack Proser
PART · 01

Interface beats stack.

The most powerful model in the world doesn't matter if nobody opens the tab.

Case study

The same idea. Two interfaces. Eighteen months apart.

I had Bartleby doing most of what Blog Bot does today — a year and a half ago. Almost nobody used it.

2024 · Bartleby

A standalone web app.

Same model class. Same prompts. Same outputs. Different door.

Required: a separate login.
2026 · Blog Bot

A Slack bot in the channel you already live in.

Tag it in a thread. It writes the draft. You ship.

Required: zero new behavior.
01 · Interface beats stackZack Proser
Exhibit A · A moment of silence

"I can't believe nobody wanted to sign up for my app?!"

He was going to reply to every request with: "I prefer not to…"

2024 · Bartleby · the scrivener
← The door that killed it

Welcome to Bartleby

Blog Bot · in the wild

One @-mention. Five minutes to a 1,635-word draft.

NF
Noelle Festa 5/15, 6:50 PM
@Blog Bot Write a culture piece about an internal event we had called Claude Day. We were paired into 39 teams…
📄 Untitled document.pdf
B
Blog BotAPP 6:50 PM · 10s later
Classifying your input
Extracting facts from your sources
Building approved-fact pool
Generating draft with Claude Opus
… + 8 more steps
B
Blog BotAPP 6:55 PM · 5 min later
Draft ready — Claude Day: What happened when 39 teams let non-engineers drive (1,635 words)
✏️ Edit draft Stage in Webflow Generate OG Image
01 · Interface beats stackZack Proser
Under the hood

The interface is simple. The stack is anything but.

Every @-mention spins up a Cloudflare Workflow with 20+ durable steps. Four surface areas:

01 · Intake Read the room. Classify input intent Route to a conversation Pull Granola notes Fetch YouTube transcripts Match a format reference
02 · Research Reach outside. Firecrawl URL scrapes Firecrawl PDF parser GitHub code context Lift accurate snippets Concatenate N sources
03 · Write & verify Don't make it up. Extract facts → approved pool Draft with Claude Opus Validate citations Run voice & style scanner De-Claude · remove AI tells
04 · Deliver Ship on-brand. Replicate images — brand-seeded Ideogram + Nano-Banana Sensitivity guard Stage in Webflow Reply in Slack
One sentence in. A fully distributed system out. Cloudflare Workflows · durable steps · retries baked in.

The stack still matters. It just shouldn't be the user's problem.

01 · Interface beats stackZack Proser
The whole point

The asymmetry is the leverage.

Input
"Write a culture piece about Claude Day."
12 words · 56 characters · 1 PDF
What fires
1 Cloudflare Workflow
20+ durable steps
5 Claude Opus roles
N Firecrawl scrapes
1 Firecrawl PDF parse
1 GitHub code lift
Approved-fact pool
Voice + de-Claude
Sensitivity guard
Replicate · brand-seeded
D1 conversation buffer
Webflow stage

That asymmetry is why publications are scaling at WorkOS.

01 · Interface beats stackZack Proser
Blog Bot · all-time stats
0
hours
vs. writing every post by hand.

35 published × 8h = 280h  ·  27 staged × 6h = 162h  ·  195 drafts × 4h = 780h

The point isn't the magnitude. It's that the slope only moved once we changed the door.

01 · Interface beats stackZack Proser
The lesson

Meet users where they already live.

Slack. Linear. Granola. The terminal. If your AI feature requires a new tab, a new login, or a new habit — you've already lost most of your users before the first prompt.

Everyone can clone your SaaS with a prompt. Time-to-value is the moat now.

01 · Interface beats stackZack Proser
PART · 02

Complete the loop.

Capture, plan, execute, deliver — in one continuous motion. No human relay between steps.

My job
is to write loops.

Boris Cherny  ·  on what AI engineering actually is now

02 · Complete the loopZack Proser
Anatomy of a loop

Capture → plan → execute → ship.

One ticket per project. Subtasks for bugs and features. The agent /loops against the main ticket.

01 Granola Captures the meeting. Notes & decisions land here automatically.
02 Linear One ticket per project. Bugs & feature requests as subtasks underneath.
03 Agent Runs /loop against the parent ticket. Picks up subtasks. Pushes branches.
04 Slack PRs, status, and follow-ups land where the team is already reading.
02 · Complete the loopZack Proser
The kit · internal heuristic

Three integrations. Three minutes.

0 min
average bug report → live, deployed, verified.

Three integrations into Claude Code. That's the whole kit.

01 · Slack
Post & verify.
Agent posts status, links PRs, reads the channel back to confirm its own work shipped.
02 · Linear
One ticket. Many subtasks.
One parent ticket per project. Every bug & feature becomes a subtask the loop can pick up.
03 · CF + Doppler CLIs
Ship on rails.
Cloudflare + Doppler hand the agent a deploy lane — through CI/CD and GitHub rulesets. Hardened.
02 · Complete the loopZack Proser
The loop in motion · with guardrails

Speed requires safety.

A bug becomes a verified, deployed change — without ever touching main.

01 Bug surfaces. A teammate or user reports the issue in #feedback.
02 Tacked to ticket. I tell Claude Code "tack that on." It reads the report, adds a Linear subtask.
03 Agents burn it down. Either ship it now — or many tabs /loop every 15 min in parallel. PR opens.
04 Verify, then merge. Wrangler pre-deploys the PR to prod. I verify it live. Merge auto-deploys — no-op.
no push to main no auto-merge PRs only Wrangler = escape hatch

The merge that lands the code is a no-op — because it was already verified in prod.

02 · Complete the loopZack Proser
The loop, in action

I review. The bot does the typing.

One bug nudge → tested, deployed, verified, merged. Two human touches.

01 👤 You Bug nudge in Slack. "Citations broke on the OAuth-tokens post."
02 🤖 Bot Reads the ticket · adds a subtask. Pulls the parent Linear ticket, files a child for the fix.
03 🤖 Bot Writes the fix · opens a PR with a plan. One file, twelve lines. Plan written in the PR body.
04 👤 You Reads the plan · says "yes." The only typing you do in this whole loop.
05 🤖 Bot Wrangler pre-deploys to prod. Through the escape hatch — not via merge.
06 🤖 Bot Fires crafted test threads · sleeps on its own timer. Three threads in #blog-post-drafthouse · 5-min wait.
07 🤖 Bot Reads back its own work · verifies. 3/3 threads cited correctly. Self-check passes.
08 🤖 Bot Merges PR · closes the subtask · DMs you. Done. You weren't typing — you were doing something else.

Still a human in the loop. Just not a human doing the typing.

02 · Complete the loopZack Proser
An opinion

Give your agent the tools directly.
Not via MCP.

MCP is great as a protocol. But every layer of indirection is a layer where context, auth, and permissions get lossy.

For the tools you use every day — Slack, Linear, Granola — wire them in natively. Fewer round-trips. Fewer surprises.

# the loop, in one line agent.tools = [ slack, linear, granola, ] # not: agent.tools = ["mcp://slack", …]
02 · Complete the loopZack Proser
PART · 03

The imagination gap.

The models can already do more than we're asking of them. The gap is widening.

The gap, illustrated

Model capability outruns our product imagination.

03 · The imagination gapZack Proser
The exercise

Re-ask the question, every quarter:

“What's possible now — that was too expensive to even try last year?”

The list is longer than you think. Most of the value left on the table is from us not asking.

03 · The imagination gapZack Proser
This month's answer

A worked example, this week.

ChatGPT shipped a realtime API. Last quarter, latency made voice-first not worth trying. This quarter, it is.
Hermes becomes my hardened personal API layer. One auth boundary. Same CI/CD rails as my deploy loop.
Voice → context dump → implementation thread. I talk. Hermes routes. The loop starts spinning up before I'm done speaking.

Time-to-delivery compresses again.

03 · The imagination gapZack Proser
BONUS

An emerging pattern I'm watching.

Long-running threaded conversations — with a buffer flush.

Pattern · long-running threads

Let humans talk. Flush on request.

Users @-mention each other freely in the thread. The bot watches but doesn't act — it keeps a buffer of message history in D1. Edits only apply when a user explicitly asks.

01 · Listen

Keep the buffer.

Every message in the thread streams into D1. No edits, no opinions, no interruptions.

02 · Wait

Let humans collaborate.

People @-mention each other, debate, change their minds. The bot doesn't care — yet.

03 · Flush

Act on request.

"Hey bot, apply the edits we just discussed." It reads the buffer, makes the change, ships.

Bonus · Emerging patternsZack Proser
In summary

Three things, one motion.

01 Ship the interface, not the stack.
02 Wire the whole loop, not the steps.
03 Re-ask what's possible, not what's safe.

…and then your loop becomes an API your team can hit when you're busy.

Applied AI LearningsZack Proser
Thank you

Questions?

Find me in #applied-ai or grab me at the bar after.

Deep dive (written by the bot itself): workos.com/blog/cloudflare-workers-workflows-ai-blog-bot

Zack Proser Applied AI · WorkOS
zackproser.com Slides linked there too