Frigade

Less is more: designing an AI assistant for mobile web

The design work behind the Frigade Assistant on mobile web. Most of it was deciding what to take away so your product keeps the screen.

Elton Lai-Rego, Senior Engineer
8 min read

Less is more is the oldest advice in design, and on a desktop you can definitely ignore it often without paying for it. A panel can show your question, the answer, the sources, and four follow-ups at once, and the screen absorbs all of it simply because there's plenty of screen to go around. You still want to be cognizant of how you present information in an effort to be as concise and efficient as possible, but the leeway is there.

On a phone there is no room to ignore it. Whatever space Frigade Assistant takes up on screen is space that is taken away from your product. Every element has to justify and make the case for the space it occupies. Designing the mobile assistant was mostly subtraction.

How much of this product can we remove and still keep the soul of what it does?

You may have seen that we shipped mobile web support recently. The mobile feature page covers what it does, and this is the design work underneath it.

Keep the skeleton the same

When we started designing for mobile, we wanted to strike a balance of removing as much as we can to make this effort tenable, but also keep as much of the product intact as possible.

What we centered on was an architecture where the underlying bones: state machines, API calls, overall structure remains the same.

We hand built and re-designed every UI element and component: message bubbles, the answer and guide cards, clarify options, the feedback row, and source pills are hand re-built for mobile. This architecture decision lets us build on the same backend our desktop assistant already runs on, but also tailor a UI that is specially designed for mobile in order to better serve the task at hand.

Desktop UI
Mobile UI
Shared underneath
State machine, streaming, API calls, tool-call handling, guide navigation, theme tokens
Two presentational layers over one engine. Everything above the line is hand-built per surface; everything below it is the same code answering both.

There is a real case against it: two sets of visual components will cause drift and extra work. With two different UIs, you need to maintain different code bases. Different design decisions, different contexts to switch between, and every time a change needs to be made, you have to consider that change on both mobile and desktop UIs.

We determined that this was a benefit. If we had to reconsider the UI of our assistant on mobile, then our customers likely had different UI patterns on mobile as well. This being the case meant that we had to adapt with what people are familiar with rather than taking our desktop application and making it small. The deviation and bifurcation is a small price to pay for a better experience for the customer.

The question comes off the card and what it says about reduction

Condensed, the desktop panel shows your question above the answer. That is right on a screen with room for both. On a phone it puts a person's own words on top of the thing they just asked for, and they already know what they asked.

So the mobile answer card holds only the answer. Removing one element sounds small, and the differences are all like that: individually small, and collectively a different UI.

Desktop, condensed
How do I add a teammate?
Open Settings, then Members, and use Invite.
Mobile, card
Open Settings, then Members, and use Invite.
The same turn, both surfaces. The question bubble is right on a screen with room for both and is the first thing cut on a phone, where it pushes the answer down by roughly a third of the card.

This is the ethos behind the designs here. Every element that follows got the same question asked of it, and each one came back smaller.

The card is only as tall as its answer

We landed on three heights for the sheet: docked at the bottom edge, a card, or full screen.

your product
Open Settings, then Members, and use Invite.
The three heights, at the real 20px corner radius and 12px inset. Height moves on a 300ms cubic-bezier(0.22, 1, 0.36, 1), and the card height is whatever the answer needs rather than a fixed stop.

The card is what you get by default, and it sizes itself to the answer rather than to a layout. Most answers on a phone are instructions about the screen behind the sheet, so if we cover that screen, the answer stops being useful at the exact moment someone needs it. Docked, the sheet shows only a title, so you can go act on what you read and find the conversation waiting. Full screen carries sources, follow-ups, and everything the desktop panel holds, and only comes up when someone asks for it.

Two gestures do two different jobs here, and getting them to stop fighting took a few passes. Dragging the handle changes the sheet's height, so the top edge follows your thumb while the bottom stays where it is. Dragging the sheet itself throws it to the other edge of the screen, so when it is covering the thing you are trying to look at, you can move it to the top and carry on.

It also moves on its own. When the assistant works out that it is covering something you need to see, it relocates to whichever edge is furthest from it. If you have already moved it yourself, it stays where you put it, because relocating a sheet you placed by hand overrules a decision you already made.

At rest
your product
Invite
Tap Invite to add them.
Two gestures, two jobs. The handle changes the sheet's height on a 300ms cubic-bezier(0.22, 1, 0.36, 1) with the bottom edge staying put, and dragging the sheet itself re-anchors it to the opposite edge on a spring at 700 stiffness and 52 damping. Here it makes that second move on its own, going to the edge furthest from the control it would otherwise cover.

The launcher badge and the composer are one element rather than two, so tapping the badge grows it into the composer instead of swapping one for the other. Its corner radius has to travel with it, and stay concentric while it does, or the corner tightens visibly as the width moves.

Nothing to show is a state of its own

A lookup that has nothing in it for you to decide gets a labeled pill instead of a sheet. Opening a whole panel on an empty thread to announce that we are thinking costs you the view you were using and gives nothing back. A confirmation still earns a card, because there is an actual decision sitting inside it.

Lookup, nothing to decide
Looking up your plan
Confirmation, a decision inside
Invite Dana?
dana@acme.com, as Editor
Cancel
Invite
Progress with nothing to act on stays a pill at the 19px shell radius. A confirmation gets a card, because there is something in it to say yes or no to.

Giving back space it never had

When the assistant walks you through a guide, it points at real controls in your product, and on a phone it is regularly sitting on top of the one it wants to point at. Moving out of the way covers most of that. The rest is in the scrolling: we center a target in the band that is still visible rather than in the viewport, and that band changes as the sheet changes height.

Then there is space the assistant never had to begin with. Docked, it runs the full width of the screen, which puts it exactly where mobile apps put their tab bar. We looked at hiding it on scroll, and at giving people a control to tuck it aside, and both answer a permanent condition with a gesture you have to keep repeating.

So we measure instead. The assistant reads whatever your app has fixed to the bottom edge and positions itself above it, with enough skepticism to avoid clearing the wrong thing: a floating action button is not a tab bar, and neither is a full-screen modal, which would push the assistant off the screen. The keyboard, the home indicator, and your tab bar all resolve into one number, and nobody has to describe their layout to us.

Tab bar, cleared
Action button, ignored
Modal, ignored
bottom = 12px + max(safe area, keyboard, obstruction)
What counts as bottom chrome. Something has to reach the bottom edge, span at least 60 percent of the width, and stay under a quarter of the viewport height, which is what separates a tab bar from an action button or a modal backdrop.

Where less stops being a virtue

Subtraction has a floor, and on a phone that floor is higher than on a desktop. Every tappable target is at least 44 pixels, including the source pills that are small chips on desktop. Nothing renders below 16 pixels, partly because iOS zooms the whole page when someone focuses an input smaller than that, and partly because a type sweep turned up headings rendering smaller than the paragraph beneath them.

Desktop source pill
Inviting teammates
24px tall, 12px text
Mobile source pill
Inviting teammates
44px tall, 16px text
The floor, drawn to scale. The same element grows on the smaller screen: 44 pixels so a thumb can land on it, and 16 pixels of type so iOS does not zoom the page out from under someone who taps the input.

So we take less of your screen and spend more of what we take. One answer, at 16 pixels, with 44-pixel targets, makes a small surface rather than a dense one, and it never asks anyone to aim.

Mobile web support is in early access now. The question we started with has very little to do with phones: any surface where the assistant does not own the screen ends up asking it, whether that is a native app, a tablet in split view, or a panel living inside someone else's layout. Work out what you can take away, and give the rest back.

Continue reading