Work / 2024
GantryA builder for the internal tools nobody wants to maintain.
- Client
- Gantry ApS
- Year
- 2024
- Role
- Product design, Design system, Prototyping in code
- Team
- Ingrid Solberg, Mats Eide, Selma Varga

The brief
Gantry ApS, in Copenhagen, makes a builder for internal tools. Operations teams use it to put tables, forms and buttons on their own databases and APIs: refund queues, stock corrections, delivery overrides. By 2023 a table component had 54 settings across four tabs, and its data lived in a text field that read {{ query3.data }}.
Gantry’s support queue showed the cost. Six in ten new builders asked for help before their first table showed real rows, and the most common question was where a query lived. The brief was a first tool anyone could finish alone, and changes safe enough to ship to people who handle money.
What we decided
- 1
Every component answers one question first
The inspector opens on where the data comes from, written as a sentence: “Shows 14 rows from refunds_waiting on ops-eu.” Under it sits the chain from table to query to database, each step with its own state. Style and the rarely used settings moved behind two rows. We tried a separate data tab first. In testing, nobody opened it.
- 2
Bindings have names, not template strings
Queries are named for what they return, and components bind to them by picking from a list. The template syntax still works underneath for the one binding in twelve that needs it. Each query lists every component that reads it, and which of its columns they use, so renaming one is no longer a guess.
- 3
The canvas runs on live data, read only
Every query runs against a read replica while you build, so picking another query redraws the table with its real rows at once. We prototyped sample data to keep the canvas fast, and builders didn’t trust a tool they hadn’t seen with their own rows. Writes never run in preview. They say what they would have changed.
- 4
Permissions are a table you can read
Who may do what is one matrix of roles and actions, enforced on the server rather than by hiding buttons. A rule like “over €500 needs a second lead” is a cell, not a script. Any page can be previewed as any role before it ships.
- 5
Every deploy is a diff
A deploy compares the draft with what is live: components drawn side by side, SQL line by line, permission changes in words. The button stays off until Gantry has checked that every column a component reads still exists. Rolling back is one click, and people keep their place.
What happened
The new builder went to every Gantry workspace in September 2024. In the first six months, 71% of new builders put a table on live data in their first session without contacting support, up from 38%.
We designed the builder with Gantry’s product team, prototyped the inspector in React against real customer schemas, and handed over the component kit and its documentation in October. Gantry’s engineers have added three components to it since.



Watching people build
We sat with eleven operations teams in Copenhagen, Malmö and Hamburg while they built something they needed that week. Nobody struggled with layout. They struggled with one question: what is this table showing, and where does it come from?
So bindings became the spine of the product. Every component, query and page answers that question in a sentence, and the answer reads the same in the canvas, the inspector and the deploy.


“I built our refund tool on a Tuesday afternoon. When finance asked who can approve anything over €500, I sent them a screenshot of one table.”




- of new builders put a table on live data in their first session, up from 38%
- 71%
- median time from connecting a database to a working table, down from 52
- 11 min
- support tickets about queries and bindings per new workspace
- −64%
- deploys rolled back, down from 1 in 14 before diffs and checks
- 1 in 60
Gantry’s figures, October 2024 to March 2025.
