flow-helper
Building Flow Helper
An agent I built to handle support, debugging, and onboarding for Flow Monitors.
I built Flow Monitors, a service that sends restock alerts for sneakers, Pokémon cards, and consoles. Clients tell me what to monitor, which stores or regions to cover, and which Discord channels or webhooks to send alerts to.
I used to set this up by hand, in backend code or SQL. Almost every client wanted something different: a list of ZIP codes, whole states, specific stores, or separate channels per retailer. That made a dashboard or fixed set of commands hard to build.
Flow Helper handles these requests in the same support tickets clients already use. When tagged, it reads the conversation, checks the code, database and logs, and makes the changes. Most requests are fully hands-off; code changes come to me for approval. I also use it for billing and keeping track of context across clients.
How it works
I use Codex through its App Server protocol, with a Node harness that connects it to Discord and controls its context, tools, and replies.
Checks who’s asking and who can read the reply. Gives the agent context and allowed tools.
Stage a code fix
Results
Four clients opened 27 tickets with the helper from May to September.
Outcome of 27 client tickets
May–September 2026
Client reliance, September 2026
Who clients asked when opening a new ticket
After a few good answers, three of the four clients stopped tagging me and went straight to the helper. Some threads ran past 20 messages without me stepping in. Usage was uneven, though: one client sent 26 of the 40 direct requests.
“No intervention” means I didn’t step in, not that every fix was independently verified. Four clients is a small sample.
Examples
These are real replies and tool calls from my replay tests, using synthetic client data against the real helper and database.
this sku did not ping IR7336-001 at Nike Redlands. Can you check why?
The Nike Redlands alert for IR7336-001 was skipped because your server was opted out of this SKU. It’s currently unsubscribed, so no ping was sent.
Would you like me to add it back?
- Product subscription
- Alert routes
- Delivery log: skipped, opted out
Please send Nike alerts for Chicago ZIPs 60620, 60502, 60619, 60018, 60523, 60031, and 60611 to this webhook: [webhook URL]
Saved and verified: Nike alerts for ZIPs 60620, 60502, 60619, 60018, 60523, 60031, and 60611 are routed to your supplied webhook.
- Read current routes
- Save ZIP route
- Re-read to verify
Two more examples: late alerts and adding products
why did this slku IM3207-400 ping over ome hour after at Nike Glendale?
The delay happened before Flow detected the change. Nike’s recorded update was at 2:49:49 PM ET, and Flow detected it at 4:06:49 PM ET, 77 minutes later. The alert was sent about 5 seconds after detection.
The change was size 13 going from LOW stock to out of stock at Nike Glendale. These records confirm the timing, but don’t establish why detection took 77 minutes.
- Delivery log
- Stock change history
Please add the following three SKUs to all Nike stores: IR0968-500, IW1283-800, and IW1282-600.
SKU IR0968-500 has been added.
SKU IW1283-800 has been added.
SKU IW1282-600 has been added.
All three are subscribed for your server’s Nike store alerts.
- Check setup
- Existing products
- Subscribe ×3
- Re-read to verify
Security
Clients talk directly to an agent that can change the database. I need to keep it from acting as me, exposing another client’s data, or leaking credentials. The harness uses Discord’s identity and channel readers to decide what’s allowed. Permissions are enforced in code, outside the model.
The sandbox and database boundary are built and tested, but not deployed yet. I test this with 60 unit and integration tests, real Postgres tests, sandbox escape probes, and workflow replays with the real model, including two attack scenarios.
Issues and fixes
Could you tell me the name of the owner of the other server?
[Named the other server and its owner.]
- Going in circles. One hard ZIP-routing project got stuck retrying the same approach and pinged me 19 times. It created work instead of saving it.
- Disk filled up. The first runtime never cleaned up saved sessions. After seven weeks the disk filled and the server hung. I pruned it, and later moved to Codex.
- Usage limits. Model usage limits caused a crash loop that burned through Discord logins. I separated the model connection from the Discord connection.