Product design · Flyway Desktop · 2025 – 2026
Code Review: from violations to rule ownership
Two connected design problems. First, how to show migration warnings and code-quality issues so DBAs can act on them. Then, how to give teams control over which rules apply, and get those rules into their pipelines.
- design legs
- 2
- hall test participants
- 3
- practitioner conversations
- 7
- Company
- Redgate
- Product
- Flyway Desktop
- My role
- UX designUser researchUX copyField research
- Methods
- Field research at SQLBits 2026 · Hall testing · Design reviews with engineering · Progressive disclosure
OutcomeThe violations experience shipped. Rule configuration went through hall testing to final designs. There’s no headline metric here, deliberately: the story is the design work.
Full story: showing every section.
Context
Catching schema mistakes before they reach production
Database migrations carry real risk. A poorly written script can cause data loss, downtime or irreversible schema changes in production. Code Review is a Flyway Desktop feature that analyses migration scripts against a configurable ruleset and surfaces violations before a migration runs. It gives DBAs and developers a systematic way to catch problems early, rather than relying on manual review or discovering issues after the fact.
The feature had two distinct design challenges that needed solving in sequence: how should violations be surfaced clearly and actionably, and how should people configure and manage the rules that govern them? This case study covers both.
Problem
Two problems, in sequence
Leg 1 — Violations experience
Surface issues without overwhelming people. Design the violations display: how to present Migration Warnings and Code Quality Issues in a way users can scan, understand and act on. Includes the violations panel, severity categorisation, inline suppression and the “learn more” flow.
Leg 2 — Rule configuration
Give people control over what gets checked. Design the rule configuration interface: policy settings with severity controls, import from an existing project, and CI/CD export with TOML configuration. Plus a progressive-disclosure feedback widget.
Research foundation
What we knew before we designed
I attended SQLBits 2026 as field research and had seven practitioner conversations with DBAs, platform engineers and community ambassadors. Code Review as a problem space was validated unprompted. People raised concerns about script quality, permissions, audit trails, and AI-generated migrations reaching production without human review. Several described painful manual review processes that Flyway’s Code Review could replace.
That confirmed the feature was worth investing in, and it sharpened the framing: Code Review needed to feel like a professional DBA tool, not a linting afterthought.
Leg 1
Displaying violations clearly
The core problem was presentation. When Flyway Desktop detects issues in a migration script, how do you show them in a way that’s fast to scan, clearly categorised and easy to act on, without obscuring the code itself? Two categories needed visual distinction: Migration Warnings (risks to whether a migration succeeds) and Code Quality Issues (style and pattern violations). The violations panel lists both, with severity badges, line references, inline suppression controls, and a “learn more” path that explains each rule in plain language rather than restating its name.
Key design decisions
Three decisions that shaped the violations panel
Separate Migration Warnings from Code Quality Issues
They represent different types of risk requiring different responses. Separating them lets people triage by category before reading individual entries, rather than reading everything to understand severity.
Make suppression immediate and visible
People need to dismiss violations they’ve consciously accepted. Inline suppression keeps the action lightweight; a visible suppressed count maintains an audit trail without cluttering the active view.
Write “learn more” content that actually explains
Rule descriptions across tools tend to restate the rule name. The “learn more” flow was designed to answer what someone actually needs to know: what does this rule detect, and why does it matter?
Research
Hall testing rule configuration
Before designing the second leg in full, I ran hall tests with three internal participants using early rule-configuration screens. The sessions surfaced three clear findings that directly shaped the final design.
Rule descriptions don’t describe
All three participants noted that the rule subtext essentially rephrased the rule name without adding understanding. For non-SQL experts this left them no better off; even for DBAs it didn’t explain the why. One participant: “It’s saying the same thing, but with different words.”
People want confidence before copying from an existing project
Participants expected to see a preview of what rules would be imported and what would be overwritten before committing. Confidence before bulk operations was a consistent theme across all three sessions.
Rule configuration needs to be reachable from where violations appear
If a violation surfaces in the migrations view, rule configuration should be accessible from there, not only from the settings menu. The need arises in context; the path should exist in context.
“Diparati is, at heart, a connector — looking to bring people and technology together in a meaningful way.”
Leg 2
Giving people control over what gets checked
The rule configuration design needed to let people do three distinct things in one place: understand what rules exist, manage which apply to their project, and get those rules into their CI/CD pipeline. The final design handles each clearly without conflating them.
Policy configuration
Import from existing project
Additional design
An in-app feedback widget that doesn’t get in the way
Alongside rule configuration, I designed an in-app feedback mechanism that appears at contextually relevant moments across four product surfaces, including the Code Review violations panel. It uses progressive disclosure: a lightweight star rating appears first, and only expands into a categorised follow-up question if the person engages. The initial ask stays non-intrusive while still collecting structured signal when people choose to give it.
Two follow-up paths were designed for the Code Review context: one for positive ratings, asking what made it helpful, and one for negative ratings, asking what could be better. Each offers pre-filled categories drawn from likely failure modes, with an open “Other” option. The point was to give the team direct signal from active users at the point of use, rather than relying on support tickets or NPS to understand how the feature was landing.
Step 1 — Rating prompt
Step 2 — Positive follow-up
Step 2 — Negative follow-up
Where it landed
What shipped, and what I’m not claiming
The violations experience shipped and was presented at a design share slot. I took the rule-configuration work through hall testing to final designs, largely independently, running design reviews with the engineers building it so design gaps surfaced early rather than after the fact.
I haven’t put an adoption number on this page because there isn’t one I can stand behind yet. What this project shows is the shape of the work: two audiences (DBAs and developers), rule ownership and governance, two connected surfaces designed in sequence, and research at each stage that changed the design.
Reflection
What this taught me
Descriptions that restate the name aren’t descriptions
Every tool in this space has rule text that rephrases the rule. Hall testing made it obvious that people, including experts, want to know what a rule detects and why it matters. Writing that content is design work, not documentation.
Put the path where the need appears
Configuration lived in settings; the need to change it showed up in the migrations view. Testing with three people was enough to make the gap undeniable.
Sequence the problems
Trying to solve violations and rule ownership at once would have muddled both. Designing leg one first gave leg two a concrete context to be reachable from.
