Case studyService designFront-end engineering
Making an LLM API access workflow easy to follow.
Clickable mockups of a governance workflow that gives staff self-service access to large language model APIs, with per-user budgets and usage tracking. I mapped the current flow, marked where users got lost, and proposed a simpler one, built on the VA Design System (VADS).
- Clickable mockups
- 67
- Actors across two tools
- 5
- Problems found
- 8
- Changes proposed
- 10
- Now built, fully or in part
- 6 / 10
01The problem
Two tools, five actors, and no single view of a request.
A request for model access started as a GitHub issue form. A reviewer approved it in the issue. Each member then signed the rules of behavior in a web app, and a worker created the API subscriptions. Users could not easily see the status of a request or what to do next.
- RequesterFiles the issue formGitHub
- ReviewerApproves in the issueGitHub
- ApproverFinal approvalWeb app
- MemberSigns the rules of behaviorWeb app
- AdminHandles failed provisioningWeb app
Walking through each screen for each actor and state, I found eight problems.
- P1The request status is split between the GitHub issue and the web app. No screen shows every step.Fixed by C1
- P2Pages do not say who acts next. State names such as "queued for final approval" are internal.Fixed by C2
- P3A member is asked to sign the rules of behavior only after approval. The notice is only logged, so the member may never learn they must sign.Fixed by C3
- P4The review link is in the bot comment only until the next hourly sync rewrites it. The provisioned text has no link to Me.Fixed by C4
- P5Me shows internal fields (subscription id, desired state, apply status) and no usage. "File a new issue" has no link.Fixed by C5
- P6Expiry and budget have no warning before access stops.Fixed by C6, C10
- P7The header shows "Signed in as" with the name, the role ids, and a separate Sign out. VADS puts the signed-in user in a header menu.Fixed by C7
- P8A user lands on the change list or Me, by role. No page says what this user can do next.Fixed by C8, C9
02Approach
Render the real thing. Draw only what is missing.
- 2.1
Render the real pages, not redraw them.
The current-flow mockups run the production React app against fixture data, with a stubbed fetch. A change to a page shows in its mockup, so the record stays true.
- 2.2
Draw only what does not exist yet.
Proposed screens use the app's own header and components, so the old and new flows can be compared side by side.
- 2.3
Stay inside the design system.
Every screen uses VADS components and patterns: Card - Status, Service List Item, Critical Action, Link - Action. No custom components.
- 2.4
Label every screen.
Each mockup opens with a note naming the actor, the state, and the problem or change it shows, outside the page frame, so the page itself looks as a user sees it.
- 2.5
Test the mockups like product code.
A unit test checks every request state, actor, workflow, notice, and alert has a mockup. A browser test opens every page, fails on a script error or an outside request, and runs an axe scan (WCAG 2.1 AA).
03Before / after
Same data. Clearer next step.

CurrentProposedDrag the handle, or focus it and use the arrow keys.
Problem P2
Pages do not say who acts next. State names such as "queued for final approval" are internal.
Change C2
The active step says who acts next, in plain words.
04Outcome
Six of ten changes shipped to the live app.
Four are built in full: the new header, the header menus, a home page for each kind of user, and links between the issue and the web app that stay in place. Two more are built in part: the rules of behavior reminder and the expiry alert.
- C1One status view: the same steps on the review page, Me, and the bot comment.Fixes P1: The request status is split between the GitHub issue and the web app. No screen shows every step.Proposed
- C2The active step says who acts next, in plain words.Fixes P2: Pages do not say who acts next. State names such as "queued for final approval" are internal.Proposed
- C3The bot comment names each member who has not signed. The notice goes out when the request is filed.Built in part: a separate bot comment names the members who have not signed and links Me. The notice still goes out after approval.Part built
- C4Each bot comment links the review page and Me, and the sync keeps the links. The provisioned comment links Me.Fixes P4: The review link is in the bot comment only until the next hourly sync rewrites it. The provisioned text has no link to Me.Built
- C5Me shows access, usage, and next actions. Internal fields stay on the review page.Fixes P5: Me shows internal fields (subscription id, desired state, apply status) and no usage. "File a new issue" has no link.Proposed
- C6Expiry and budget alerts.Built in part: Home shows the expiry alert from 7 days before access ends. Budget alerts are not built.Part built
- C7As on VA.gov, the header shows "Sign in" when signed out, and an account menu when signed in.Fixes P7: The header shows "Signed in as" with the name, the role ids, and a separate Sign out. VADS puts the signed-in user in a header menu.Built
- C8A main menu row: Use the API, and Access and budget, plus direct links to Projects and Change requests.Fixes P8: A user lands on the change list or Me, by role. No page says what this user can do next.Built
- C9A home page for each kind of user: actions first, information after.Fixes P8: A user lands on the change list or Me, by role. No page says what this user can do next.Built
- C10Request extension shows from 30 days before access ends. The expiry alert starts at 7 days.Fixes P6: Expiry and budget have no warning before access stops.Proposed
05The mockups
Walk the whole flow.
The app as built, the user workflows, and the changes still proposed. Open any card to try the mockup; use the arrow keys to step through. All names and data are fictional.
67 of 67
Sign-in and Home8Current flow
Change requests2Current flow
Review page7Current flow
Me4Current flow
Failures2Current flow
GitHub issue5Current flow
Request an extension14User workflows
Request more budget5User workflows
See my own usage6User workflows
Sign the rules of behavior1User workflows
Budget warning and over budget5User workflows
Proposed screens8Proposed flow
06In brief
Questions, answered.
01What is this case study about?
It documents the redesign of a governance workflow that gives staff self-service access to large language model (LLM) APIs, with per-user budgets and usage tracking. I mapped the current flow across a GitHub issue and a web app, found where users got lost, and proposed a simpler flow built on the VA Design System (VADS).
02What problems did the original workflow have?
Eight, found by walking every screen for every actor and state. The main ones: the request status was split between the GitHub issue and the web app, pages did not say who acts next, members learned they had to sign the rules of behavior only after approval, access and budget ended with no warning, and no page told a user what they could do next.
03What changes were proposed?
Ten. They include one status view with the same steps everywhere, a plain-language "who acts next" on the active step, asking for the rules of behavior when the request is filed, a VA.gov-style header and menus, a home page for each kind of user, and expiry and budget alerts with Request extension from 30 days before access ends.
04How many of the proposed changes shipped?
Six of ten. Four are built in full: the new header, the header menus, a home page for each kind of user, and links between the issue and the web app that stay in place. Two are built in part: the rules of behavior reminder and the expiry alert.
05How were the 67 mockups made?
The current-flow mockups render the production React app against fixture data with a stubbed fetch, so they stay true to the real pages. Only screens that do not exist yet are drawn, using the app’s own components. Every screen uses VADS components, is labeled with its actor, state, and the problem or change it shows, and is tested with Playwright and an axe accessibility scan (WCAG 2.1 AA).
06What technology is the portfolio built with?
The case study site is Next.js (App Router, static export), strict TypeScript, and Tailwind CSS v4, tested with Vitest and Playwright. The mockups are React, TypeScript, Vite, and VADS web components.
07Is this an official VA website?
No. It is a portfolio design sample by Michael Nau / Bornless Studio. It is not affiliated with or endorsed by the U.S. Department of Veterans Affairs, and all names and data are fictional.


