Describe Filters. Say which rows you want. Get filters you can see, remove and edit.
Live demo. Try a suggestion, remove a chip, or edit the description.
The problem
Table filtering has looked the same for twenty years. A filter button, a column dropdown, an operator dropdown, a value field. Three clicks per condition, and you need to know which column holds the thing you're thinking about.
That last part is where it breaks. People don't think in columns. They think "the ones that need a human to sign off" or "anything that shows progress". No column says that.
The usual AI answer is a chat box next to the table. Ask a question, get a paragraph back. Now the result lives somewhere else, you can't tell which rows it looked at, and changing your mind means asking again.
The idea
Keep the table. Keep the filters. Let the model write them.
The Describe button sits first in the toolbar, next to keyword search. It doesn't replace the manual filter UI, it's a faster way into it. You write a sentence and get back the same chips you'd have built by hand: Status · is · Beta, Updated · is after · Oct 1, 2026. Each one is removable on its own. A new description replaces the generated chips and keeps the ones you added yourself.
Column first, meaning second
The model is told to prefer real columns. "Voice patterns" becomes Category · is · voice, not a fuzzy match.
Only when no column, or combination of columns, can express the request does it fall back to a semantic filter: About · matches · agent oversight. That chip looks different on purpose. Dashed border, italic field name, and a tooltip: "No column covers this — rows were matched by meaning". The field name itself, "About", says it isn't a column.
That distinction is the whole pattern. A column filter is exact and auditable. A semantic filter is a judgment call. The user should never have to guess which one decided what's on screen.
What stays visible
A thin line under the toolbar quotes the description back word for word, with the row count it produced: "Filtered for “Beta patterns for showing progress” · 3 of 14". Edit reopens the field with the same text.
If nothing matches, the empty state offers the same Edit. If the model can't make sense of it, the field stays open with what you typed still in it, and an error underneath. Nothing you wrote gets cleared.
Motion
The motion is there to explain cause and effect, so it stays short.
- The toolbar and the describe field cross-fade in place, so the input never jumps.
- While the model works, the field goes read-only, a sparkle spins, and the table dims. The rows stay where they are.
- New chips pop in with a small stagger, then rows that don't match collapse out and the remaining ones slide up into the gap.
With reduced motion on, the stagger, the collapse and the slide all go away. The filters still apply.
About this demo
The table at the top is a port of the AI Patterns component, rebuilt on this site's own buttons, icons and tokens. The model call is stood in by a small local matcher, so it answers without a network round trip. The interface contract is the one a real model would be prompted with: read the column schema, return structured filters, and say when no column covered the request.
The full UX spec (anatomy, behavior, accessibility, content rules) is on the pattern page.