Tuesday 6:30 PM intermediate pickleball at Lifetime Fitness fills in under 15 seconds. Every Thursday at noon, slots drop. By 12:01, I'm on a waitlist. Over six weeks of trying, I got the session twice (a 33% success rate), and both times I was staring at my phone like my life depended on it. I don't love spending my lunch break in a thumb race. So I built an agent to win it for me.

Booking speed comparison: Manual booking takes ~15 seconds with 67% waitlisted, Dink Agent takes ~4 seconds with 100% registered. 3.75x faster.

The game before the game

If you play pickleball at Lifetime, you know the drill. Open play registration is first-come. Slots drop at a fixed time. You sit there refreshing the app, and the moment sessions appear, you tap as fast as you can. Miss by ten seconds? Waitlisted. Miss by thirty? The session doesn't even show available anymore.

I tracked my booking attempts over six weeks. Look at the Time to Tap column. Even sub-10 seconds isn't fast enough for the popular sessions:

WeekTarget SessionTime to TapResult
1Tue 6:30 Intermediate~18 secWaitlisted (#3)
2Tue 6:30 Intermediate~12 secWaitlisted (#1)
3Thu 7:00 Advanced~8 secRegistered
4Tue 6:30 Intermediate~15 secWaitlisted (#4)
5Tue 6:30 Intermediate~22 secFull, no waitlist
6Tue 6:30 Intermediate~6 secRegistered

Week 3 succeeded only because the Thursday advanced session is less popular. The Tuesday 6:30, the one everyone wants, required sub-6-second execution to land. Humans can't reliably do that through a mobile app with multiple tap targets. But an agent can.

What the agent actually does

I call it Dink Agent. Here's a real conversation:

Me

What's available for Tuesday?

Dink Agent

I found 3 open play sessions on Tuesday at Lifetime. The 6:30 PM intermediate on Court 2 has 4 spots left. Want me to register you?

Me

Yes, 6:30 please

Dink Agent

Done. You're registered for Tuesday 6:30 PM intermediate. $12 on your card on file. See you on the court.

Behind those four messages, the agent opened a browser, navigated to the Lifetime booking page, logged in with saved credentials, filtered for open play, found the session, checked availability, clicked register, and confirmed payment. About 4 seconds of actual browser time. No thumbs involved.

After deploying it, my booking rate went from 33% to 100% over the next four weeks. Browser agents are ready for real tasks, not just demos.


Built on BAP

Dink Agent runs on Browser Agent Protocol, the open standard I built for AI agents to control web browsers. BAP was the right tool here for three specific reasons:

Semantic selectors. Lifetime's booking page uses generic CSS classes that change between app updates. BAP doesn't care about CSS. It targets elements by their accessibility role: button("Register"), label("Session Type"). These survive redesigns because screen reader structure is more stable than styling.

Headless operation. The agent runs at noon whether I'm at my desk or not. BAP manages the browser lifecycle (spawn, navigate, interact, close) without needing a visible window.

Structured observation. After each action, BAP returns the page state as structured data, not a screenshot. The agent knows exactly what buttons exist, what text is on screen, and what's clickable. No computer vision needed.

The approaches I tried first

Before building BAP, I tried three other approaches. Each taught me something, and each failed for a different reason:

ApproachWhat HappenedWhy I Moved On
Selenium Worked for two weeks Lifetime updated their UI. Every CSS selector broke. I spent more time fixing selectors than playing pickleball.
MCP Chrome Worked well on my laptop Requires a visible browser window. Can't run headless at noon while I'm in a meeting.
Computer Use API Worked on everything ~500ms per action. A 15-step booking flow takes 7-8 seconds. In a fastest-fingers game, that's too slow. Also expensive at scale.

BAP hit the sweet spot: fast enough to win the race (~50ms per action), stable enough to survive UI updates (semantic selectors), and headless so it runs unattended. The Selenium experience in particular shaped BAP's design. I never wanted to fix a CSS selector again.


Security: because this thing spends money

An AI agent with access to a browser that can charge your credit card deserves serious guardrails. Here's what I built:

Confirmation gate. The agent prepares everything but pauses before clicking "Confirm Payment." I get a message: "Ready to book Tue 6:30 PM, $12. Confirm?" I reply yes, it clicks. This one rule saved me from two accidental double-bookings during testing.

Sandboxed browser. The BAP browser instance is isolated. No access to my filesystem, no other tabs, no other sites. It can reach exactly one domain: lifetime.life. If anything goes sideways, the blast radius is zero.

No credential exposure. The agent never sees my password. Login uses the browser's built-in credential manager. Payments go through the card already on file. The LLM only sends commands like "click the login button." It has no idea what the password is.

Full audit trail. Every action is logged: timestamp, page state before and after, the agent's reasoning, and the outcome. When the agent does something unexpected (and it will), I replay the logs like game tape to figure out what happened.

What I learned

Five things, after running this for two months:

1. Start with MCP Chrome for prototyping. Session sharing eliminates the entire auth problem. Get your flow working manually first, then automate.

2. Semantic selectors are worth the investment. I haven't fixed a broken selector since switching to BAP. The Lifetime app updated twice and the agent didn't notice.

3. Always gate financial actions. Never auto-execute anything involving money. Three seconds of confirmation prevents expensive mistakes.

4. Log everything. Screenshots, decisions, outcomes. Every failure becomes a lesson instead of a mystery.

5. The web is the universal API. Lifetime doesn't have a public API. Neither do most consumer services. But they all have a website. Browser agents turn any website into a programmable interface.

Results

Four weeks of Dink Agent vs. six weeks of manual booking:

Before (manual)After (Dink Agent)
Booking success rate33%100%
Time to book~15 sec (if fast)~4 sec
My involvementStare at phone at noonReply "yes" to a message
Waitlisted4 of 6 weeks0 of 4 weeks

The 6:30 Tuesday intermediate session is mine now. Every week.

If you want to build something similar, BAP is open source: github.com/browseragentprotocol/bap.

Now if only it could improve my backhand.