Skip to content
Halden

Oslo local time

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
Tovholm’s refund tool pulled apart into four layers on signal orange: the interface, its bindings, the SQL queries and the database table, joined by thin lines

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. 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. 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. 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. 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. 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.

A small Gantry builder: the refunds table selected on the canvas, and an inspector saying it shows 14 rows from refunds_waiting on ops-eu
A working corner of the builder, on Tovholm’s refund data. Pick a component, then change its query, columns or filter, and the preview follows.Click a component, or Tab to its name tag and press Enter
After: the same page with refundsTable selected, and an inspector that says it shows 14 rows from refunds_waiting on ops-eu
Before: the old builder with table1 selected, 28 fields on the first of four tabs, and a comment asking which database query3 is on
The same page in the same state, before and after. Drag the divide, or focus it and use the arrow keys.

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.

Close-up of the inspector: the chain from refundsTable to refunds_waiting to ops-eu, and three queries to choose from with their row counts
Each query shows its row count before you pick it. One with different columns says so before it swaps yours.
The builder with approveForm selected: it edits the row picked in refundsTable, saves with approve_refund, and names who can approve
A form names what it reads and what it writes. The second-lead rule comes from Permissions, not from a script.

“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.”

Sofie Lund, Support lead, Tovholm
The query editor: refunds_waiting in SQL, its 14 rows underneath, and the two components that read it
Every query lists the components that read it and the columns they depend on.
A new tool: ops-eu connected with a read-only user, and five tables to start from, with refunds pickedPermissions as a matrix of eight actions and four roles, with approvals over €500 needing a second lead
A new tool starts from a table and arrives already bound. Permissions are one matrix, enforced on the server.
Version 24 compared with the live version 23: a new column drawn side by side, the SQL change, a permission change and four passed checks
A deploy shows what people will notice, and ships only when every binding still resolves.
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.

Tovholm’s refund approvals as the support team sees it: 14 refunds waiting, with Lea Christensen’s open beside the approve form
What the builder makes: Tovholm’s refund approvals, used by 15 people on the support team.