
The product didn't have a design problem. It had a decision problem.
Feedback arrived as email: isolated reports, no volume signal, no way to tell a pattern from a one-off. To fill that gap, I built the research system in layers, each answering a different question.
Listen: Discord community where patterns showed up through repetition instead of one-off emails.
Measure: Survey to find out how widely those patterns held.
Understand: In-depth conversations with the most active users, to learn the reasons behind the numbers.
The ask going in was a visual refresh. What came back was more specific: synced lyrics was the one thing missing that actually mattered. Existing things working reliably mattered more than anything new. That kept the scope focused.
Synced lyrics didn't exist. Users could add plain lyric text manually, but nothing highlighted in time with the song.
9:41
Velvet Lights
Luca Hart
0:05
3:20
Add lyrics
City whispers through the glass
Taxi headlights racing past
Your silhouette in amber glow
Like a scene I've always known
Empty words, half-finished drinks
Conversations hanging thin
Everything slows down tonight
When your eyes meet mine
We don't have to chase the morning
Time can wait outside the door
Every heartbeat tells a story
I've been waiting for
Paste
Cancel
Ok

Commercial lyric APIs introduced costs the business model couldn't absorb and licensing terms the product wasn't equipped to manage. I proposed sourcing from community-maintained lyric databases instead.
Copyright shaped how the feature works: lyrics are fetched on user request rather than cached or served automatically, which keeps the product out of legally ambiguous territory.
The entry point is strictly on-demand. Rather than preemptively flagging missing lyrics during playback, the option surfaces only when explicitly requested and quietly expires if ignored.
9:41
Velvet Lights
Luca Hart
0:05
3:20
Adding lyrics for
Velvet Lights
Luca Hart
Search online
Recommended
Find lyrics from the web
Import file
Add a .lrc file from your device

Lyric databases vary in accuracy. I kept source selection visible so users can judge before committing rather than having the choice made for them.
A preview is available before anything is applied.
Preview
LrcLib
•
Synced
City whispers through the glassTaxi headlights racing pastYour silhouette in amber glowLike a scene I've always known
Empty words, half-finished drinksConversations hanging thinEverything slows down tonightWhen your eyes meet mine
City whispers through the glassTime can wait outside the doorLet the night keep moving fastIf we disappear into the blueI could stay here next to you
Under velvet lightsWhere the shadows lose their shapeYou pull me closerAnd the whole world fades away
Street signs flicker on the rainYour perfume lingers in the laneEvery window catches fireEvery glance takes me higher
If no match is found, an import option surfaces in place rather than a dead end.
9:41
Velvet Lights
Luca Hart
0:05
3:20
Search results
No lyrics found for this track
Try importing a .lrc file instead
Import file

Not every set of fetched lyrics syncs perfectly. The first approach I considered was tap-to-sync: tapping each line as it starts. I ruled it out during brainstorming, before anything was prototyped. Response lag makes it unreliable, and one missed line corrupts everything after it. Correcting existing timestamps was safer than asking users to create them
The editor shows every lyric line alongside its timestamp, editable in place. Direct entry handles significant errors. Nudge controls handle smaller offsets. Two modes, two kinds of correction.
9:41
Edit lyrics
Velvet Lights
•
Luca Hart
City whispers through the glass
00:12.537
Taxi headlights racing past
00:16.284
Your silhouette in amber glow
00:20.071
Like a scene I've always known
00:24.163
Empty words, half-finished drinks
00:28.492
Everything slows down tonight
00:33.047
When your eyes meet mine
00:37.126
We don't have to chase the morning
00:41.318
City whispers through the glass
00:46.094
Let the night keep moving fast
00:50.082
If we disappear into the blue
00:54.217
I could stay here next to you
00:58.371
Cascade

9:41
Edit lyrics
Velvet Lights
•
Luca Hart
City whispers through the glass
Taxi headlights racing past
00:16.284
Your silhouette in amber glow
00:20.071
Like a scene I've always known
00:24.163
Empty words, half-finished drinks
00:28.492
Everything slows down tonight
00:33.047
When your eyes meet mine
00:37.126
We don't have to chase the morning
00:41.318
Let the night keep moving fast
00:50.082
Cascade

While designing the editor I noticed that sync issues rarely affect individual lines. More often, everything from a certain point shifts by the same amount.
I designed cascade to handle this: when enabled, any adjustment propagates to every following line simultaneously. It's off by default. Enabling it incorrectly would cause more problems than it solves.
9:41
Edit lyrics
Velvet Lights
•
Luca Hart
City whispers through the glass
00:12.537
Taxi headlights racing past
00:16.284
Your silhouette in amber glow
00:20.071
Like a scene I've always known
00:24.163
Empty words, half-finished drinks
00:28.492
Everything slows down tonight
00:33.047
When your eyes meet mine
00:37.126
We don't have to chase the morning
00:41.3345618
City whispers through the glass
00:46.0012394
Let the night keep moving fast
00:50.0012382
If we disappear into the blue
00:54.2234517
I could stay here next to you
00:58.3345671
Under velvet lights
01:02.6678914
Where the shadows lose their shape
01:06.4456738
You pull me closer
01:10.5567873

The first time a user opens the editor, a walkthrough runs automatically to explain how it works before anything is touched. The same walkthrough is reachable from the More menu afterward. Undo and reset handle mistakes.
Edit lyrics
Velvet Lights
•
Luca Hart
City whispers through the glass
00:12.537
Taxi headlights racing past
00:16.284
Your silhouette in amber glow
00:20.071
Like a scene I've always known
00:24.163
Empty words, half-finished drinks
00:28.492
Everything slows down tonight
00:33.047
When your eyes meet mine
00:37.126
We don't have to chase the morning
00:41.318
City whispers through the glass
00:46.094
Let the night keep moving fast
00:50.082
If we disappear into the blue
00:54.217
I could stay here next to you
00:58.371
Under velvet lights
01:02.614
Cascade
9:41
How editor works
Tap a row to select it and edit
Tap a timestamp to type a new value
Use − and + to nudge by 0.1 seconds
Cascade shifts all following lines
Tap anywhere to continue

Changes saved
9:41
Edit lyrics
Velvet Lights
•
Luca Hart
City whispers through the glass
00:12.537
Taxi headlights racing past
00:16.284
Your silhouette in amber glow
00:20.071
Like a scene I've always known
00:24.163
Empty words, half-finished drinks
00:28.492
Everything slows down tonight
00:33.047
When your eyes meet mine
00:37.126
We don't have to chase the morning
00:41.318
City whispers through the glass
00:46.094
Let the night keep moving fast
00:50.082
If we disappear into the blue
00:54.217
I could stay here next to you
00:58.371
Under velvet lights
01:02.614
Where the shadows lose their shape
01:06.438
You pull me closer
01:10.573
And the whole world fades away
01:14.329
Street signs flicker on the rain
01:18.681
Your perfume lingers in the lane
01:22.746
Every window catches fire
01:26.793
Every glance takes me higher
01:30.967
Reset everything?
All timestamps and text will revert
to the original imported values
Reset to original
Cancel

The synced lyrics design settled the harder question: how to bring synced lyrics to an offline player without licensing costs, copyright exposure, or leaving users stuck with timing they can’t fix. I designed it end to end, from source discovery through timing correction.
The research system was built to outlast the project: a community, a survey and a direct line to users that could give the team a more reliable way to decide what to build next.
The most durable thing I built wasn't a feature. It was a way for the team to keep asking the right questions.