~/rewind/tilt

Tilt (opens in a new tab)Case study · 2021 – 2022 · 9 min read

Your laptop fan is screaming. Tilt is running every service, even the ones you don't need today.

The story of building a button

One button that lets developers put a service to sleep, without shutting everything down. Simple to use, surprisingly deep to design. The devil is in the details, and this is where I got to wear many hats.

★ The futureA resource catalog: see every service you could run, wake only what you need
⏪ Rewound toOne button that puts one service to sleep
▶ Built forwardGroups, bulk actions, then Tilt listing every resource as disabled and ready to wake
My role
Founding designer, employee #8 at Tilt
When
At Tilt 2020 – 2022 · this feature shipped Oct 2021 – Feb 2022
Team
9 folks: 2 product owners, 4+ backend engineers, 1 frontend engineer, 1 dev rel advocate, a part-time PM, an external visual designer, and me
My part
Research, flows, prototypes, handoff and QA, plus roadmapping and prioritization
What changed
Out of beta in Tilt v0.24.0 ↗ (Feb 2022): disable and enable one service or many, from the UI or the CLI
1button, lots of details
3concepts explored
4releases to get there

01Meet Tilt

A live dashboard for apps made of many little services

Tilt is an open-source toolkit for running microservices on your laptop or in Kubernetes.

One dashboard shows every service: what's building, what broke, and the logs that explain why. I joined as the founding designer and employee #8, turning what users and the business needed into changes we could ship, and helping shape the roadmap.

The Tilt dashboard in action: a list of services with their build status, and live logs streaming for the selected service.
Every service, its status and its logs in one place.

02The dream, rewound

Start at the north star, then rewind

The dream was a resource catalog: open Tilt, see every service you could run, all asleep, and wake only the ones you need. Too big for one go, so we rewound it to one button that puts one service to sleep, then built forward.

  1. Step 1Disable one service
  2. Step 2From every view
  3. Step 3A whole group at once
  4. Step 4Bulk, with checkboxes
  5. ★ North starThe resource catalog

Business goal: keep developers in Tilt for longer each session, instead of shutting it down.

03Making the case

Why this, why now

Nobody asked for a "disable button". I weighed four signals against everything else on our roadmap, and they all pointed the same way:

  • Behaviorusers often ran tilt down
  • Metricsheavy use of clunky tilt args, in Grafana
  • Hack weekteam conversations
  • Researchmy weekly user sessions
Focus work

Tilt could slow the whole machine, even when you needed only a few services.

Visual noise

Hundreds of services, all reacting to every small change.

Switching projects

Cart to payments meant tilt down, then tilt up, every time.

Tilt said it in public, too"Many developers have far more resources defined in Tilt than they'd actually want to run at once." Tilt blog, Mar 2022 ↗

A terminal process monitor. The top process, tilt up, is using 224 percent CPU, and several more tilt up processes follow.
  • I have a list of servers I can run, which may include 1,000+ servers. I need a way to browse the list of servers available to me.App developer
  • My team may work on multiple features that use different subsets. I should be able to easily switch from one project to another.App developer
More quotes, workarounds and how I ran research
  • "I frequently run a subset of those servers. Most people on my team run the same subset to iterate on a given feature."
  • "I need to start a new server to make or verify a change, and stop it when I'm done."
  • Workarounds: teams set up subsets by hand in the backend with tilt args, and several built their own wrappers around it. Switching still meant restarting Tilt. Those wrappers taught us a lot about the ergonomics people wanted.
  • Research, the whole way through: weekly 1:1 sessions to validate designs against real use cases, findings shared in weekly design meetings, a look at other dev tools, and everything in Miro as a design↔dev guide for all Tilters.

04The hard part

What does "disable" even mean?

Before drawing a screen, I pinned down what each word would mean to users, and what it would mean technically.

Words we considered for the action, and what each would mean
ActionReverseWhat happens
StopStartStopped, but still listens to Tilt
PauseRestartPaused; doesn't help manage resources
DisableEnableStopped, and won't listen to changes
MuteUnmuteStill runs, but won't surface changes
KillRebuildSounds destructive, like deleting a service

We also weighed Abort, Clear, Close and Cancel.

Every state

Define the behavior for each of the many states a service can be in.

What already exists

How should it work with tilt args, and with tests set to auto or manual?

Persistence

Off until you change it? Across sessions? After closing the browser? Lots of opinions 🙃

Never the only thing

Many features in flight, so I balanced short-term fixes with long-term plans.

05Ideation

Three ways to get there

A whiteboard covered in sketches of Tilt interfaces: app, web, IDE and Slack possibilities, status views, menu bar widgets and extension ideas.
A typical hack week starting point.
  1. Edit modeA separate view to choose which services are on, to focus on a few.
  2. Resource catalognorth starOpen Tilt to all services, disabled, and pick what to enable.
  3. Bulk by groupLabel services into groups and disable a whole group.

06Try it yourself

Go on, press the button

Here's a little recreation of Tilt's table view. Put a few services to sleep and watch the noise, and the laptop fan, calm down.

Select services to act on many at once
Services
SelectResource nameTypeStatusDisable or enable

A playful sketch, not the real product: the services are made up, and so are the CPU numbers.

07Shipping

Shipped in small, planned steps

To keep risk low, single-service disable went out behind a feature flag and was tested with users first. Each step set up the next.

  1. 1One service, one button

    Before groups existed: disable from the detail view.

    Tilt's detail view for the muxer service, with an Enable service button at the top right and the log reading Service disabled by user.
  2. 2From both views

    Once grouping landed, the table view could do it too.

    Tilt's table view grouped into frontend and backend. In frontend, muxer is shown in grey italics with the status Service disabled, below services that are running or erroring.
  3. 3A whole group at once

    Disable or enable everything in a group, like frontend.

    Tilt's sidebar with a frontend group and a disable icon on the group header, next to streaming logs.
  4. 4Bulk, with checkboxes

    The checkboxes were waiting in the table since the extensible UI. Now they act on many services at once.

    Tilt's table view with three services checked, including a disabled one, and an Enable and Disable button pair beside the filter, labeled 3 selected.
git log --disable-resources // how it shipped, in public
  1. Behind a feature flag · PR #5085 ↗
  2. Bulk actions in the table view · PR #5405 ↗
  3. On for everyone in v0.24.0 · notes ↗
  4. Show / hide disabled in v0.25.0 · notes ↗
  5. On the Tilt blog · read ↗

08The details

The devil is in the details

One button touched almost every corner of Tilt.

A count you can trust

A new icon and count in the summary bar, so you always know how many services are asleep.

Tilt's summary bar: Resources, 4 errors, 1 pending, 12 of 16 OK, and a disabled icon with 12. Tests, 1 error.
Out of the way

Disabled services gather under "Disabled in this session".

Tilt's sidebar with a Disabled in this session label and two disabled services, muxer and recommendationservice, shown in italics.
Mixed selections

Defined what happens when only some selected services are disabled.

Close-up of the table: Enable and Disable buttons, and four selected services shown as disabled in italics.
  • Quiet by defaultHidden unless you choose to show them, still findable when filtering
  • Hard to hit by accidentEasy to reach, with a confirm step that isn't annoying
  • Readable when quietContrast and typeface for the disabled state
  • A new button patternHover, clicked, focused, pressed and disabled
  • Keyboard firstShortcuts for bulk actions and disable / enable
  • RememberedPersistence across sessions, browser cache and both views

09After launch

Users loved it. The north star still waits.

  • This makes it so much easier for me to focus on my current work.
  • I no longer have to tilt down every time I switch services.

Beyond adoption, we heard first-hand and in surveys that it made services easier to manage and helped productivity. After launch I ran QA with engineers, tracked metrics in Grafana and docs analytics, followed up with clients, and held a retro with the team.

See our retro board and one more kudos
A Miro retro board titled Table View Retro: sticky notes plotted from sad to happy over time, across card mocks, card launch, table mocks and table launch.
How the team felt, from the first mocks to launch.
  • It works brilliantly! Super excited for the rest of our team to experience the new UI/UX tomorrow!A Tilt user in our Slack, Jan 2022
What's next

A first glimpse of the catalog shipped: Tilt began listing every resource, even ones not running, as disabled and ready to wake. Then Docker acquired Tilt and my team moved on. I'd have taken the catalog further, to manage all resources, not just microservices. And honestly, I have many, many stories like this one.

✦The future, rewound

What this story says about how I work

The receipts this story, in public

  1. Nov 2021Disable resources lands in the UI, behind a feature flag Tilt v0.23.1 ↗
  2. Jan 2022Checkboxes for bulk actions in the table view Tilt v0.23.6 ↗
  3. Jan 2022Tilt News shares the beta with the community Tilt blog ↗
  4. Feb 2022Out of beta: one service or many, from the UI or the CLI Tilt v0.24.0 ↗
  5. Feb 2022A show and hide toggle for disabled services Tilt v0.25.0 ↗
  6. Mar 2022Tilt explains why running just a few services should be easy Tilt blog ↗
  7. May 2022Docker acquires Tilt Docker press release ↗

Research, all the way

From the first signal to the retro, users were in the loop at every stage.

Words are design

Naming one action meant mapping what it does for users and under the hood.

North star, small steps

A big idea, rewound into releases we could ship, test and learn from.

Sweat the details

Counts, states, persistence, contrast, keyboard: the button had to feel right everywhere.

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

Liked this story? Ready to hustle together? Reach out to me. I'd love to hear what you're building.

Email me ✉