Anudeep

Protected case study

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.

Government client work, shared by access code only. Enter the code I gave you to view the full case study.

Don't have the code? Email me and I'll send it.

Back to all work
All work
Civic Tech · Government2026·Product Designer

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.

Figma MakeDesign SystemInformation ArchitectureCivic UX
Virginia State Police · Criminal History (CCH)
Virginia State Police · Criminal History (CCH)
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

01

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.

02

Stakeholders pushed back that a tidy outline wasn't enough; I turned disclosure itself into a control with expand-all, progress and keyboard shortcuts.

03

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

01

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.

Low-fidelity blocking — proving the structure holds before any visual design.
Low-fidelity blocking — proving the structure holds before any visual design.
02

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.

The iteration that set the direction — a nav tree with live count badges.
The iteration that set the direction — a nav tree with live count badges.
03

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.

Reworked around the feedback — sections gain counts and bulk controls.
Reworked around the feedback — sections gain counts and bulk controls.
04

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.

An arrest booking opened three levels deep, and still legible.
An arrest booking opened three levels deep, and still legible.
05

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.

06

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 light theme — one system, two skins.
The light theme — one system, 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.

NewNewly assigned — created but not yet fully built out.
ActiveLive record in good standing — safe to view and edit.
MergedFolded into another SID; retained for lineage.
ExpungedSealed or removed by court order — handle under restriction.
PurgedRemoved from the active system — a terminal state.

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

11 sections
one record, one collapsible nav tree
3 levels deep
booking → offense → disposition, all editable
Dark + light
the same system proven under a full re-skin
Delivered
interactive build; deployment sits with VSP