Redesigning the densest record in the Virginia State Police's system
A redesign that answers density by making a mountain of data navigable, disclosable, and comparable rather than by removing it — while preserving the transaction model of a two-decade-old system of record.

- Role
- Product designer — IA, interaction design, lo-fi through hi-fi
- Timeline
- 2026
- Team
- Under senior designer Madhavi Soma, with VSP stakeholders
- Platform
- Desktop web — dark and light themes
- Status
- Delivered interactive build · synthetic test data only
The problem
One person's criminal record can hold nine name variants, five identifications and ten arrest bookings — and none of it can be simplified away, because reconciling it is the job.
The outcome
A record interface that answers density with navigation, disclosure and comparison — while preserving the transaction model a two-decade-old system of record runs on.
If you read nothing else
You can't simplify a screen where the data is the job — so I gave a huge record structure instead of removing anything from it.
Stakeholders pushed back that a tidy outline wasn't enough; I turned disclosure itself into a control with expand-all, progress and keyboard shortcuts.
I kept the legacy Desired Action workflow exactly as-is — modernising the interface without retraining every analyst or re-proving every transaction.
This is the densest screen I have ever designed. One person can carry nine names, five identifications and ten arrest bookings that each branch into offenses and then dispositions — and every field has to stay editable.
How it started
A workhorse that fights the person using it
The legacy CCH is a mid-2000s enterprise app where an analyst manages an entire criminal-history record through one cramped accordion. Every section — names, arrest bookings, identifications, physical characteristics, fingerprints, firearm-rights restoration — stacks flat, with no hierarchy to tell you where you are. The forms are dense multi-panel grids of coded dropdowns that assume you already speak the system's private language, and everything hangs off a single “Desired Action” dropdown per record. It works. It just fights you.
The reframe
Don't reduce the record — give it structure
The instinct with a screen this dense is to strip it back, but here the data is the job: you can't simplify away nine names when reconciling those nine names is the work. So the goal changed from reduction to legibility — make a huge record navigable, its sections openable on demand, and its duplicates directly comparable, while leaving the system of record intact underneath.
Design principles
Three rules for surviving density
Orientation before action
Show the shape of a record — how many names, IDs, bookings — before anyone opens a section, so nobody works blind inside something they can't see the edges of.
Disclosure is a control
With this many rows, hiding detail isn't enough. The analyst decides how much of the record is exposed, in one action, at any moment.
Respect the muscle memory
The transaction model is a contract analysts already know. Modernise how it looks and reads; never change what it does.
Process
Lo-fi, a tree, a pushback, then compare
Started in low fidelity — structure before style
I gray-boxed the whole record first to settle the hard question: how does an entire criminal history fit on one screen without becoming the legacy wall of panels? Lo-fi kept the argument about organisation rather than colour.

The core decision — a left record-nav tree
Flat, a record this size buries the analyst on load. A collapsible tree turns it into an outline — Overview, Source Data, Criminal Lifecycle — with a live count badge on every node, so you read what the record contains before opening a single section.

Stakeholder pushback: “we have to get to the details”
The note back was sharp and correct: this is a data-driven record, and the job is reaching all of the detail, fast. A tidy outline you have to click through eleven times isn't a win under time pressure. Orientation alone wasn't enough.

Progressive disclosure with bulk controls
So disclosure became first-class: Expand All / Collapse All, a live “1 / 11 open” progress readout, and visible keyboard shortcuts for analysts who live on the keyboard. The deepest object — booking → offense → disposition, three levels down — stays reachable without losing the thread back to the top.

Compare mode for the analyst's real task
The work isn't reading a record top to bottom; it's reconciling variants. Select two or more rows and open them side by side with colour markers, so duplicates are judged against each other in place rather than held in working memory.
High fidelity, in dark and light
Madhavi and I took it to high fidelity as one system in two full themes, each carrying the sticky identity bar, the status-lifecycle pills, and search-first entry with its two-field floor. Same components, two skins.

The colour logic
A record's legal state, readable at a glance
SID status pills let an analyst read lifecycle state in the results table and identity bar before opening or editing anything — because state changes what you're allowed to do.
Key decisions
Comparison, hierarchy, and not breaking what works
A left record-nav tree, not a longer scroll
WhyA persistent tree with live count badges answers “where am I and how much is here” before you touch anything — orientation before action, on a record too large to hold in working memory.
Expand All / Collapse All, progress, and keyboard shortcuts
WhyStakeholders needed to reach the details, so control became explicit: everything or nothing in one action, a progress bar showing how much is open, and shortcuts for expert hands. Progressive disclosure here isn't decoration — it's how you survive the density.
Compare mode — open 2+ rows side by side
WhyReconciliation is the real task: which of these nine names is the same person? Making an analyst expand rows one at a time and hold differences in memory is where errors happen. Side-by-side turns recall into recognition.
Preserve the legacy “Desired Action → Submit” model
WhyIt's the contract the entire workflow runs on. Reinventing it would have meant retraining every analyst and re-proving every transaction. I kept the model exactly and only made it legible — the muscle memory survives, the friction doesn't.
Search-first entry with a two-field minimum
WhyThe legacy app dropped you into a dense record with no front door. Leading with search matches how an analyst actually starts, and the two-field floor is a quiet guardrail against pulling up the wrong human.
SSN masked in lists, revealed only in detail
WhyA results table is shoulder-surfable and screenshot-prone. Identifiers stay masked there and appear in full only inside a record you deliberately opened — least exposure by default.
Where it stands
More case studies





