JupiterOne · security graph, risk & compliance
The product worked, but there was no shared foundation underneath it. Customers noticed the inconsistencies. One told us that part of the app was dark and part was light.
For engineers, the problem was even more obvious. Every new feature meant choosing between two sets of components, and some legacy pages had almost no traffic but still needed to be maintained.
A typical redesign replaces screens one at a time. I took a different approach and rebuilt the components, patterns and interaction rules that every screen would use.
The goal wasn't simply to make the UI look consistent. It was to make the product easier and cheaper to change.
That meant a migration, not just a redesign.
Reskin the existing UI. The first option was to add a theme layer over the legacy CSS, updating colours and typography while keeping the existing components. It was quick to demonstrate, but the underlying problems remained. Legacy pages had hardcoded colours, so dark mode still needed page-by-page fixes, and engineers would have to maintain both component sets. We tested it on the Vendors page in a week. It looked new in a screenshot, but switching themes exposed the same old problems.
Redesign pages individually. The second option was to rebuild the busiest pages first, designing each one independently. That looked like progress, but it recreated the problem we were trying to solve: each page ended up with its own tables, filters and modals. CCM shipped this way initially, and within a month UVM had its own, slightly different filter bar.

The J1 design system. Build the foundation first: one token file and 58 components, then migrate pages onto them in the order indicated by Pendo traffic.
Rebuilding everything at once would have put our most-used pages at risk. I used Pendo data to rank pages by traffic and split the migration into three phases.
CCM, UVM, Home, Settings and Integrations. Home was the most visited page, and sessions there were several times longer than anywhere else in the product. I migrated it without changing its layout first, then held the redesign for later to avoid hurting engagement.
Compliance status, evidence uploads and the Question Result page. These areas needed more care, particularly the Question Result page, where users often spent long sessions.
We moved the remaining low-traffic pages onto the new system, then decommissioned the legacy codebase.
One of the biggest savings came from work we decided not to do. Three legacy areas had almost no usage, so I proposed retiring them rather than spending time migrating them. The proposal was approved.
Each phase had to meet the same exit criteria before we moved on:
That last requirement was important. Without it, old and new implementations could easily have stayed around indefinitely.
The migration also gave us an opportunity to rethink two navigation decisions. Settings and Integrations moved under a single Configuration menu, while Ask J1 moved into the header so it could be accessed from anywhere in the product.
The brief wasn't to create a library that only designers understood. I wanted something the entire product team could build with.
I treated the design system as a shared contract between design and engineering. One token file defined colour, typography, radius and spacing across light and dark themes. All 58 components used those tokens, which meant changing themes was a single class change. The part-dark, part-light experience the customer had described was no longer something we'd need to fix page by page.
A few rules made the biggest difference:
The system also captured product decisions, not just visual styles.
In a security product, colour carries meaning. I defined four verdict tiers (act now, elevated, monitor and low) with specific visual treatments for each. I also made sure that the absence of a finding didn't compete for attention. For example, “not in KEV” appears muted, while the accent colour is reserved for actual risk.
We made the system available as a package, with a compiled bundle for environments that couldn't access a registry. Storybook became part of sign-off, and I opened pull requests alongside engineers rather than handing over designs and waiting for implementation.
That meant product managers and engineers could prototype with the real components instead of trying to recreate them from mockups.

A customer reported that CCM coverage was being represented inconsistently. Rather than patching the visuals on that one screen, I used the new foundation to address the underlying interaction and implemented the fix myself.
In PR #1795, I changed coverage and pass rate from two unrelated bars into a single status bar showing what was passing, failing or not measured.
It was a small change, but it made the information easier to interpret and gave us a consistent way to represent the same status elsewhere.
This was a good example of how the work came together: customer feedback informed the product decision, the design system made the change straightforward, and I could take it through implementation and release.



I also packaged the same design system contract as a Claude skill. The idea was to help a model build with JupiterOne's actual components, tokens and rules instead of generating an interface that looked and behaved like a different product.
That gave design, engineering and AI-assisted prototyping a shared language.
The skill targets Figma output. Claude imports components from the existing kit rather than rebuilding them, and interactive states map to named Eclipse tokens.

The same foundation also made it possible to build the AI assistant directly into the product.
Because the assistant panel used the existing components, it felt like part of JupiterOne rather than a separate experience bolted onto it.
Before the major changes, we established a baseline using customer surveys and product analytics.
| Metric | Result |
|---|---|
| Account retention | +31.6% |
| DAU/MAU | +56.9% |
| Users rating the new UI Good or Excellent | 78% |
These are before-and-after measures, not the results of a controlled experiment. They show the outcomes we observed around the redesign, rather than proving that the redesign alone caused the changes.
What customers saidNON.O.Head of Security"I honestly like the new look and feel of the UI very much, for the most part. Great job."
PAP.A.Security Lead"It looks like the whole place got a revamp. It's a new world."
TRT.R.Platform Engineer"There's a lot of good things happening recently. I'm seeing all these changes. It's getting better."
EBE.B.CISO"The assets UI looks a lot cleaner already, which I really like."
MFM.F.Security Engineer"I like the new UI. It abides by my dark setting, which is nice, because before, part of it was dark and part of it was light."
DVD.V.Head of Platform"You deployed this whole new application, and it's a huge improvement. It looks better and it works better."
Decommissioning legacy pages turned out to be the hardest part to get agreement on.
Pendo showed almost no usage of Compliance, Policies and Exposures, but Customer Success was concerned that some large accounts might notice if we removed them. The strongest objection came from our Customer Success lead, who had promised Policies to a customer as part of a renewal two quarters earlier.
We agreed to contact those accounts before switching anything off and point them towards the replacement workflow.
Home is still on its old layout, deliberately. It has the longest sessions in the product, so I migrated it without changing the layout and held off on the redesign rather than risk disrupting engagement.
If I did this again, I'd agree on the token contract with engineering in the first week, rather than waiting until after the first Figma pass. I'd also share the phase exit criteria with the wider company earlier, so conversations about retiring legacy pages could start before the migration work did.
The biggest change wasn't just how JupiterOne looked. It was how the team could build it.
We went from patching inconsistencies across two codebases to having a shared foundation we could extend. Designers and engineers could work from the same components and rules, and AI-assisted development had that same foundation to build on.
That gave us a more maintainable product and a better way to keep improving it without adding to the fragmentation that had caused the problem in the first place.