a loop worth closing
users were leaving the assignment they were configuring just to connect an integration, then trying to find their way back. a modal redesign and a session-storage redirect closed that loop.
> stat ./case-study
- ⎿ year2026
- ⎿ roleDesign Engineer
- ⎿ team1 design engineer + engineering team support
- ⎿ duration~1 week · design → production
- ⎿ stack[claude-code][figma-mcp][react][nextjs][oauth][amplitude]
Note on terminology: Duvo calls these "connections." I use "integration" interchangeably in this write-up because it's the term most people outside the product reach for first.
What shipped
Inside the Duvo assignment builder, users can now click any disconnected integration, hit "Enable," authorize through OAuth, and land back on the exact assignment they were configuring with the new connection ready to use. No new tab. No "where was I." No second trip to the Connections page.

How I noticed the problem
I sit in Amplitude session replays a lot. It is the cheapest research we have, and the patterns show up faster than any survey would surface them.
What I kept seeing: a user opens an assignment, starts wiring it up, opens the integration picker, and finds it only shows the integrations they already have connected. There is no way to discover what else they could connect, no way to start one from there. The user pauses. Opens the sidebar. Clicks Connections. Lands on a list page with no memory of where they came from. Connects the account. Then has to find their way back to the assignment they were halfway through configuring.
Some made it back. Some did not. Some made it back and forgot which tool they had been about to enable.
This was not a single replay. This was the shape of the friction across many of them.

The point of view that shaped the fix
If users are leaving a screen to do a thing, the screen is missing the thing. Adding a "back to assignment" button on the Connections page would have helped, but it would still be a detour. The right move was to make the detour disappear.
That meant two design moves had to land together. The integration selector modal had to grow up from a tool picker into a place where you could browse, search, and start a connection. And the OAuth round-trip had to deliver the user back to the exact same modal in the exact same assignment, with the new connection waiting for them in the list.
The redesigned modal
The integration selector inside the assignment builder used to be a flat picker over already-connected integrations. If you needed something you had not connected yet, the modal would not even tell you it existed. The Connections page in the sidebar was the only surface in the product that knew the full catalog. So the modal was a closed shop. The user had to walk to a different store.
The redesigned version split the surface into four sections that match how people actually shop for connections:
- Your Enabled Connections. OAuth accounts the user has already connected, with the email shown as a subtitle so they can pick the right one when they have several.
- Duvo Tools. First-party tools that do not need a connection (browser, files, human-in-the-loop). Custom sort order so the most useful ones come first.
- Custom Connections. Anything outside the catalog the user has wired up themselves via MCP.
- All Connections. Every integration available in the platform, searchable, with an "Enable" button on the disconnected ones.
The "Enable" button is the entire feature. Clicking it starts the connection flow without leaving the assignment. The modal closes, the OAuth flow runs, the user comes back, the modal reopens with the new connection sitting in the list, ready to pick. They keep building.
The redirect that makes it feel right
The detail I am proudest of is the part the user never sees.
OAuth is loud by nature. Provider redirects, callback URLs, query parameters, sometimes a cold reload of the app. Without care, the user comes back to a generic Connections page or a noisy URL full of identifiers, and the calm of the assignment builder is gone.
We made it land softly. The user clicks Enable, completes OAuth on the provider, and lands back on the same assignment they were on, with the same modal open, with the new connection sitting where they need it, with a clean URL. It feels like the OAuth detour did not happen.
That is the whole feeling. Smooth.
Impact
Two-week comparison windows, day-of-week aligned, before vs after the redesign shipped:
| Metric | Change |
|---|---|
| Users who started an integration connect within 30 min of opening the builder | +160% |
| Builder to connect conversion rate within 30 min | 2.1× |
| Total users initiating any integration connect across the org | +357% |
Builder-to-connect conversion roughly doubled. Total integration connects across the org grew +357%, while builder traffic only grew +25% in the same window, so the lift was not from more people opening the builder. The work of connecting an integration moved into the assignment building flow, which is exactly where it belongs.
From Figma into code
I started in Figma. Drafted the four-section modal, the empty states, the back-from-OAuth landing. Then I put it in front of the team and iterated through a few feedback loops until the layout and the flow felt right. Once it was settled, I pushed the frames through the Figma MCP into Claude Code as the source of truth for the build.
Built with Claude Code
I shipped this with Claude Code as my pair. It picked up the Figma frames and built out the four-section selector modal and the OAuth round-trip plumbing that lands users back in the same assignment with the new connection ready to use. Each time I caught a rough edge in testing (the modal flashing on return, a stale URL holding identifiers, the auto-bind firing twice) Claude Code helped me track it down and ship the fix the same hour. My job was deciding what the experience should feel like. Claude Code's job was getting it there.
The research was not AI-assisted. Watching session replays is something I do with my own eyes, my own pattern matching, and a notebook.
What this changed for me
The session replay habit pays for itself. I did not need a survey, a workshop, or a spec to know this was a problem. I needed an hour with replays and a willingness to act on the pattern.
And: the right design move sometimes does not need a big redesign. It needs a small redesign that closes a loop the existing product was leaving open. Two PRs, 950 lines, shipped in a week. The hard part was deciding what the right loop was, not building it.
Credits
- Engineering team. Code review and OAuth provider plumbing.
- Claude Opus 4.5. Pair programming on the TypeScript implementation.
- Our users. For the unintentional research, recorded one session at a time.
> built with case-study-skill, my open-source case study agent.