GLKB Dev Experience
Shipping the questions with the answers.
Company
GLKB · Jie Liu Lab, University of Michigan
My Role
UX/UI Designer
Tools
Figma · Claude Code · Markdown
Timeline
May – Aug 2026
Description
GLKB is an AI-powered research engine that synthesizes biomedical literature into answers grounded in real publications, which provides a public agent API. Its developer surface was my first project there and my last: the documentation in the first week, the dashboard at the end of the summer.
Context
I was handed a 21-page document and told to turn it into API documentation. I kept its argument on the front page and built the half it did not have around it: endpoints, parameters, response fields, and more. The documentation is deployed to a protected dev site and held there until a developer has reviewed it in full. The dashboard is live on glkb.org, behind sign-in.

I designed the developer surface end to end: the competitive research behind it, the information architecture, the page content and the interface. The PM set the brief and carried it between me and the agent team, who own the API. A front-end developer built the site.
An API, a console for keys, and nothing to read
GLKB’s interface is built for a researcher asking a question. The API is for the opposite person: someone who will never open the web interface, and who wants to push 5,000 genes through it from a script. That person had a working endpoint, a screen for generating keys, and nothing to read.
Three things made the writing harder than writing it well:
Nothing in-house to match. No documentation existed for any other part of the platform: no house structure, no house voice, no precedent.
Engineering’s own questions were open, and the documentation could not wait for them.
No reader to ask. The API had users inside the team and none outside it; I asked to speak to a developer using it and was pointed at the team’s own.

I dismissed it as not documentation, and it was half of one
I asked what I was building from and got a 21-page document. My first read was that it was not documentation: “sure there’s some good content, but this thing does not read like API doc really.” No authentication section, no parameter table, no response schema, and the address of the API is a placeholder in every code sample it contains, including the one headed “try it in sixty seconds.”
So I read Anthropic’s and OpenAI’s developer documentation, not for a structure to copy but for the shape of the thing. My first judgement was wrong. The document was one entire half of documentation and none of the other: all persuasion, no reference. Five of the 12 pages that shipped carry its section titles.

The word was “tab” and we meant different things by it
On the same day, I was told the documentation went under the third tab. The screen already had a sidebar down the left and tabs across the main content, so a 12-page reference under one of those meant a third level of navigation: a sidebar inside a tab inside a sidebar. I asked the PM to confirm. She confirmed. So I built it there.
I laid the whole document out at product width inside that panel. Two days. Then it came back. “Why are these under the tab?” She had never meant the documentation should live in the tab. She meant the tab should be a button linked to a site of its own. We had wanted the same thing the whole time.

So I argued that it should not be a tab at all. The finished set is 12 pages and 1,067 lines, and a panel cannot hold a persistent sidebar, a search field, an on-page table of contents and 12 long-form pages carrying parameter tables and copyable code. A tab is a place. This needed a door.
That went on hold, and the tab stayed, which left it still needing something underneath. I drew three options and we took the one that looked right and asked least of the dev team, as the answer for now.

At the end of the summer I got the screen back
By then I had rebuilt the design system, and the brief was the user experience of every page in the product. The API screen still had its three tabs: the third carried the stopgap, and the other two showed the same table keyed on the same items, differing only in a few columns.
I proposed no tabs at all: one screen, everything on the surface, and the way out to the documentation as a button sitting on it. It was agreed within a day. So the tab became a button.

The Outcome: Something to Read, and Somewhere to Watch It Run
12 pages in four groups on a site of its own, and the console rebuilt into a single screen.

Overview: Keeping the Argument, Building the Reference
The front page is the source document’s argument, re-cut and kept. Four cards under Why GLKB compress four of its sections into a sentence each. Beneath them, What you can build turns its four worked tasks into three columns: the workflow, what you send, what you get back — the first thing on the page that is not in the document.

Shipping the Questions With the Answers
Three things were not settled when this had to ship: the production base URL, the name and format of the authentication header, and where the user identifier in the path comes from — the same three the source document had left open. So I put each one into the deployed build as a comment on the line it blocks. A developer meets the open question at the point that stops them, instead of finding it in a list afterwards.

Structure: Two Ways In
I drew five site maps on the same 16-item outline, each changing only how much sits on a page and how much nests behind an index. All five capped out at eight pages. What shipped is 12, in four groups, and five of those are use cases — more than twice the endpoint reference. The person pushing a gene list through a script needs to know what to ask the graph before they need to know how to authenticate to it.
Search I did not specify, so it went to build as a line in the sidebar too narrow to show a result. It moved to a panel over a dimmed page. A rail can carry a page title but not the sentence the term was found in, and without that sentence the reader is choosing between 12 page names instead of 12 answers.

The Dashboard: A Key List Becoming an Account
The spend is read off the whole account rather than summed in the reader’s head. From running my own keys against somebody else’s models on a side project that summer, I knew the number you want is what all of them cost together, not what each one cost.
The bottom half of that screen is not a reorganization. A key list tells you what each key has done; it does not tell you where the month is going. So the table got a monthly view beneath it, funds and balance together, so that somebody running keys sees the whole month instead of assembling it from rows.

Impact
12 pages in four groups, from 1,067 lines of drafted content, deployed behind a password on a development host. The dashboard is live on glkb.org behind sign-in, with the tabs gone. Its funds and balance controls are built, disabled on the development host and hidden in production, waiting on payment coordination. The two surfaces point at each other: the dashboard carries a button out to the site, the site carries one back.
Saying it is not the same as making the case
I made the same argument twice about the same screen. The first time was half a sentence on the second day. I raised it, asked the PM to confirm, and treated her yes as the end of it.
The second time, four months later, I brought the cost with me: two days spent laying a document into a panel that could never hold it, and a summer of the documentation living at an address the product had to explain. It was agreed within a day.
The idea did not improve in between. What I brought to it did.
Credit
Product manager — Zhiyuan Liu
GLKB — Zhaowei Han, the PhD student who led GLKB
Agent team — Xiang Zhang
Front end — Bing Han
Lab — Jie Liu Lab, University of Michigan