At Atlan I designed parts of Policy Manager, where data teams set the rules their data has to follow and deal with whatever breaks them. This case study is less about shipping metrics and more about how I take a messy domain apart and shape something people can actually use.
I was at Atlan for eight months. Three things have stayed with me since, one from each piece of work below.
Atlan is a data catalog. Large companies like Mastercard, Unilever and General Motors use it to keep track of every table, dashboard and pipeline they own: what it is, who owns it, where its data comes from.
Governance is the part that makes rules about all of that. A typical rule: every table containing personal data must have an owner and a PII tag. In Atlan, a rule like that lives in a policy. The policy has a scope (which assets it watches) and rules (what has to be true). When assets break the rules, Atlan raises an incident.
When I picked up governance work in early 2025, the first three boxes existed. The fourth didn't. That was the first problem I picked up.
A policy breach might flag 29 assets owned by several different teams. In the product, that was one incident with one long list of broken assets. The policy owner could see the problem but had no way to break it up, hand pieces to the people who could fix them, or see progress. Picking assets for an incident meant scrolling and ticking boxes one at a time.
I started on the model before drawing any screens.


That model gave me two people to design for, who care about very different things.
A smaller decision saved the most time. Instead of picking assets one by one, you filter ("has tag Finance", "owner is empty") and select everything that matches. The same filter pattern Atlan already used in search, reused where people needed it most.
Figma prototypes can't search, filter or save, and those were exactly the things I needed people to try. So I connected Figma to Cursor through a Figma MCP server and turned the Incidents prototype into a small working app on Vercel.
This was April 2025. The term "vibe coding" was two months old, and a designer testing ideas in real code instead of a Figma prototype was still a new idea. The first version took three to four hours, plus a day of polish, and I added Mixpanel so I could see what people did with it instead of only asking.
A policy's scope and rules are built from rows of filters: attribute, operator, value. They're precise and almost impossible to read back. "Connection is tableau-server AND name contains Quarterly AND certificate is not Verified" takes a minute to parse even if you wrote it.
The obvious fix was a plain-language summary written by an LLM, next to the filters. The interesting part was deciding when it should run.
I set two rules. First, don't generate anything until there's a complete rule. A half-written filter gives a summary of nothing, so the panel stays in an empty state until the first rule makes sense. Second, when someone edits, show the "regenerating" state immediately but wait a couple of seconds before calling the model, so a burst of edits turns into one request. It feels live and stays cheap.
I also explored where the summary should live: at the top of the page, next to each section, or inside a chat panel where you could ask for changes in plain English. Writing filters from a sentence ("only PII tables in production") came out of that exploration and stuck.


The biggest piece came in May. Atlan had grown several kinds of policy, each created somewhere different. Access policies (who can see or edit what) lived inside Personas and Purposes, each with its own sidebar. Governance policies lived in Policy Center. The goal was one place to create any policy.
My first version, on 22 May, kept Atlan's structure and moved it into a modal. You picked Persona, Purpose or Governance, then filled in fields that changed depending on your choice, then configured permissions on a second step.
By 12 June that had grown into a full-page, five-step wizard: type, details, scope, permissions, approval and a review page with an AI summary. I presented it in a review, and it got pushback on three things.
Each point was right. By the next day I had a new version with all three changes built in.
Creating the policy first means it exists as a draft straight away. It has a page you can come back to, a timeline from draft to approval, and somewhere for AI help to live. On the scope and permissions tab, you can describe the scope in plain English, tick permissions grouped by the asset types you picked, and read the summary from April sitting on top.


The review in June is the moment I'd point to if someone asked how I work. The wizard was thorough and well reasoned, and it was the wrong shape. Letting go of it in a day, and coming back with something better, is the part of this project I'm proudest of.