~/rewind/tilt

Tilt (opens in a new tab)Case study · 2020 – 2022 · 8 min read

In January 2021 I left empty seats in a dashboard. By May 2022, every one was taken. Watch them fill up ↓

Building an extensible UI

A dashboard designed for features that didn't exist yet: buttons, groups, bulk actions and cluster status. Here's how I decided where the seats went, and what happened when they filled.

★ The futureA UI developers shape themselves, so Tilt becomes indispensable
⏪ Rewound toA clear table with spaces saved for what comes next
▶ Built forwardButtons, groups, bulk actions and cluster status filled those spaces
My role
Founding designer, the only designer at Tilt
When
New UI launched Jan 2021 · the saved spaces filled up through May 2022
Team
Under 10 Tilters at Series A: 6 full-stack engineers, 1 front-end engineer, 1 developer advocate and me, plus an external PM and a visual designer on retainer
My part
Research, archetypes, concepts, user testing, final design and handoff
What changed
Every saved seat was filled within 16 months: buttons Jun 2021 ↗, groups Aug 2021 ↗, bulk actions early 2022 ↗ and cluster status May 2022 ↗
4future features, given a home early
3layouts tested
2archetypes

01Meet Tilt

Write a Tiltfile, run tilt up, watch it live

Write a Tiltfile, run tilt up, and watch every service live. Teams with 100+ services live in it, and so do small focused teams.

Tilt is an open-source toolkit for fixing the pains of microservice development, on your laptop or in Kubernetes.

Three steps: write the Tiltfile in an editor, run tilt up in a terminal, and view everything in a browser-based UI.
Who runs it

Cloud-native companies with 100+ services, and smaller teams with a few focused projects.

Who uses it

DevEx folks and engineering managers who write the Tiltfile, and the app developers who live in it.

02The toolbox, rewound

Start from the toolbox developers can't live without

We couldn't build every widget users wanted. So I rewound the vision to a clear overview, designed with empty seats for what came next.

Problem statement

How might we create an extensible UI that gives Tilt users an overview of the health of their services, and lets them customize it to their needs, so that Tilt becomes an indispensable part of their toolbox?

We couldn't build every widget users would want. So I rewound the vision to what we could ship first, a clear overview, and designed it with empty seats for the future.

  1. Jan 2021See health at a glance
  2. Jun – Aug 2021Buttons and groups
  3. Jan – May 2022Bulk actions, cluster status
  4. ★ North starA UI users shape themselves

The goal of Tilt: make it easier to focus on, examine and troubleshoot the services running in your environment.

03Research

Busy teams and curious hackers

Two kinds of users: busy teams who trust what we ship, and curious hackers who build their own.

I listened everywhere: 1:1 research, Slack, bug reports, feature requests, Twitter, weekly client meetings, the roadmap, our async ideas board and hack week. Two archetypes stood out, and both pointed to an extensible UI.

Busy teams

"Relax, we got it"

A flagship app with 100+ services. They trust Tilt as a curated interface. They'll use the extensions we ship.

Curious hackers

"Get inspired, have fun!"

Smaller teams doing focused work. Tilt is their engine. They'll build their own extensions.

See the archetypes, and what users told us
Slide comparing two archetypes: Busy Teams, who will probably rely on available extensions, and Curious Hackers, who will go on to build their own extensions.
  • Blockers: Tilt didn't work well with multiple clusters, the web UI got CPU-intensive with lots of local services, and multiplexed "All Resources" logs became unusable.
  • UX frustrations: Tilt got lost among browser tabs, and the log filtering controls had issues.
  • Mental model: some users didn't trust Tilt to build and deploy automatically, and wanted more control.

04Ideation

Which layout can keep growing?

I tested three layouts with users. The table won: every new idea can become a column.

Before, Tilt was a list of services and logs, with errors on a separate tab. I tested three new structures with users, judging each by one question: will it still work when we add things we haven't thought of yet?

  1. 1Grid of cards

    + Loved the status bar and filters. − Accessibility issues, poor use of space for 100s of services, not extensible.

    Option 1: a grid of service cards with status, and a log drawer below.
  2. 2Split with tabs

    + Loved pinned services. − Still a long list, noisy while coding, no filtering.

    Option 2: a split view with a service list on the left, pinned tabs on top and build logs on the right.
  3. 3Table we picked this

    + Easy to parse, better use of space, and it "feels more extensible": every new idea can become a column. − Needed build vs runtime errors.

    Option 3: a table of services with columns for type, status, age and more, grouped into sections.
See the UI before, the opportunity map and industry research
Tilt's interface before the redesign, annotated: a separate tab for errors and warnings, a badge for errors on each service, overall status, and a running count.
Tilt before the design effort.
An opportunity map branching from Tilt to the TUI, VS Code extension, onboarding, overview or dashboard, docs, attention management, plugins or widgets, focus on CTA, and surfacing errors better.
How other tools show status: CircleCI inline checks, a terminal test summary, a test runner report and file-level status in a code editor.

05Final design

Two views, with empty seats for the future

Two views, each with room saved for the future.

The final dashboard: a summary bar, pinned services, a filter, and a grouped table with columns for status, pod ID, widgets, endpoints and mode.
The dashboard, or overall view.
The final detail view: a sidebar grouped into frontend and backend with each service's status, and the selected service's logs with level filters.
The sidebar, or detail view.
  • Overall status barErrors, warnings, pending and healthy counts, always in view
  • Pinned resourcesThe services you care about, one click away in both views
  • Status by typeBuild and runtime states, told apart at a glance
  • See what you wantA persistent filter, alerts on top, collapsible groups
  • Consistent across viewsFilters and pins persist between the table and the sidebar
  • Small but mightyThe favicon changes on a new error; sort and hide columns

06Built for the future

The seats filled up, one by one

Over the next year, new features moved into the seats the design kept open.

My handoff listed the spaces the design kept open. Tilt's public blog and docs show what moved into each one.

Spaces left in the 2021 design, and the features that later filled them
Room I left (2021)What filled it, in public
The table grows by columns, for new widgetsCustom buttons on resources, Jun 2021: "the first step towards enhanced Tilt dashboard customization." Tilt blog ↗
Collapse or expand groupsResource grouping by labels, Aug 2021, in v0.22.2. Tilt blog ↗
Space for global info, like cluster status or Tilt updatesNavbar buttons, Jul 2021, and cluster connection status in the navbar, May 2022. Buttons ↗ Cluster status ↗
Checkboxes ready for bulk actions like disable, enable or reloadBulk enable and disable in the table view, Jan 2022: "bulk action buttons will appear when any resource is selected." Tilt docs ↗ That's the Button Story →

Engineers built these features. My part was making sure the UI already had a place for them.

07Try it yourself

Fast-forward the dashboard

Start in January 2021 and step forward in time. Watch each new feature drop into the seat that was saved for it.

saved: global info cluster: connected ⚑ deploy RESOURCES✕ 2✓ 4/6
frontend ★✕ muxer ★
saved: bulk actions 2 selected
Services
SelectResource nameStatusWidgets

A playful sketch, not the real product. Dates and features come from Tilt's public blog and docs, linked above.

08Outcomes

Glows, grows, and what I'd do again

Users noticed right away, and the design became the baseline Tilt grew on.

  • Wow, HUGE improvements in the UI between 0.18.4 and 0.18.10A Tilt user in Slack, after the new UI shipped in v0.18.6
  • …it works great and I like the pin feature in the UI and that clear logs…A Tilt user in Slack
:) Glows

Extensible: add widgets or hide columns. Surfaces errors and warnings. Better attention management. Follows WCAG accessibility guidelines.

:/ Grows

Punted: the detail view log redesign and error messages in a bottom drawer. Project switching wasn't solved here, until the Button Story.

The design earned praise from existing and new users and became the baseline for growth, built alongside onboarding, a docs revamp, the VS Code extension and cluster status. What I loved most: debating and iterating with opinionated teammates and users, and influencing an ever-shifting roadmap. If I did it again, I'd do it almost exactly the same, with more user research in the early iterations.

See a typical design handoff
A design handoff document for bulk actions, with key points, workflows, features, and states for checkboxes and buttons.

✦The future, rewound

What this story says about how I work

The receipts this story, in public

  1. Jan 2021A new interface for Tilt, with an overview of every service Tilt blog ↗
  2. Jun 2021Seat 1 filled: custom buttons Tilt blog ↗
  3. Jul 2021Buttons move into the navbar too Tilt blog ↗
  4. Aug 2021Seat 2 filled: resource groups Tilt blog ↗
  5. Feb 2022Seat 3 filled: bulk enable and disable Tilt v0.24.0 ↗
  6. May 2022Seat 4 filled: cluster status Tilt blog ↗
  7. May 2022Docker acquires Tilt Docker press release ↗

Design for both ends

One UI for teams who want it handled, and hackers who want to build.

Judge layouts by the future

Pick the structure that still works when new ideas arrive.

Save seats for what's next

Columns, spaces and checkboxes ready before the features existed.

Steady in a shifting roadmap

Shipped alongside onboarding, docs, VS Code and more.

whoami // here I am

Senior title, staff-scope work. Looking for staff product design roles.

Complex, technical products are my favorite kind. The gnarlier, the better.

say --hi // let's talk

Curious where I'd take this dashboard next?