Yes, designing for yourself breaks the cardinal rule of UX design. This isn't a product — it's a personal tool. And for a personal tool, being the user IS the advantage: no user research needed, instant feedback loop, zero compromise.
I have 2,000 audiobooks on Audioteka. I pay a monthly subscription and I'm a happy customer — the catalog is great, the service works. But I listen on the go, switching between Wi-Fi and mobile data, often in areas with patchy signal. Audioteka's player always reaches for the network. When it can't connect, it stalls. You can download books for offline listening, but it's manual — remember to do it before you leave, or you're stuck.
I also have about 50 books on Audiolibrix, another Czech audiobook service. Their app is worse: tap Play and a popup tells you nothing is downloaded, asking if you'd like to download first. So I stopped using it — but I still want access to those books.
That's the real reason I built my own player: reliable offline playback and merging two platforms into one library. Even Claude told me I shouldn't start this — said I should use an existing platform. But I didn't like the players.
So I built Přehrávač — and it's a web player, a PWA running in Safari, not a native iOS app. It works better than the native apps it replaces.
Clickable author and narrator links, player controls within thumb reach, a catalog millions use daily. But some things add up.
To see what a single book is about on Audioteka, you scroll through five screens: a giant cover, redundant metadata, a collapsed description prefixed with boilerplate ("Audiokniha [title], autor [author], cte [narrator], rezie [director]"), and when you finally expand it — marketing copy, CAPSLOCK taglines, and user reviews. The actual story is buried four screens down.
Same book in Přehrávač. Metadata, player controls, and a clean description — all visible without scrolling.
Most evenings the same question: what should I listen to next? I know I like a narrator, I'm in the mood for sci-fi — but I can't combine those. Tap a narrator and you see everything they've read: crime, romance, history. No way to say "just the sci-fi." So I scroll through a flat list, trying to remember what I've already heard.
Cover + author + title + rating. Tapping a narrator filters by that narrator — but you can't combine it with genre or series. 119 favorites, no cross-filtering.
Genre tags, narrator and author filters that combine. Series cards with position ("Part 6 of 7"), descriptions visible inline. Search across all metadata.
Someone stops to chat, your mind wanders on a walk, you doze off for a bit — when you come back, you need to rewind. It's always roughly the same amount: five, ten, maybe fifteen minutes. Dragging a slider means guessing — you never know how much time you just moved. Tapping a dot that's always 5 minutes is a different thing entirely. You know exactly where you'll land.
Cover takes 60% of the screen. Raw chapter name "19_Muz na stezce 13". Controls at the bottom — correctly placed for thumb reach. But the seek bar is chapter-level, not book-level.
Small cover + metadata. Book-level elapsed and remaining time. A 30-minute seek window with 5-minute interval dots as tap targets. Sleep and offline as pill controls.
Honor Harringtonová, Boží mlýn s turbem, the Czech sci-fi I keep coming back to — most of what I listen to are long series. I want to know where I am: Part 3 of 7, not just a title in a list. And when I discover a new series, I want to know what it's about before committing to 50 hours of listening.
Series are tagged in descriptions with #. But the series page itself is just a giant cover and a flat list — no part numbers, no description of what the series is about.
"Part 6 of 7" visible directly in the library. Tap to expand: every book shows a 2-line description. AI-written series descriptions where Audioteka has none. Tap the series name to see all parts.
Audiobook players play chapters. So the progress bar sometimes represents 8 minutes, sometimes 3 hours. I don't care about chapters. I care how much of the book is left.
The first solution was obvious: show book-level time and add ±30 minute skip buttons so users can jump past chapter boundaries. Then I built a sleep timer with a rewind feature — fall asleep for 30 minutes, wake up, and the player offers to rewind exactly those 30 minutes with one tap. It felt like a killer feature.
Then I redesigned the seek bar itself. Instead of a continuous slider, I built a 30-minute window centered on the current position, with 5-minute interval dots as tap targets. Want to go back 10 minutes? One tap on the −10 dot. Forward 5? One tap. The dots are large enough for a sleepy thumb at midnight.
Something unexpected happened: the sleep rewind toast — the "killer feature" I was proud of — went from essential to optional. When basic navigation is one tap on the nearest dot, you rely on clever workarounds less.
The backbone of this project is the player — offline playback that just works. But once that was solved, a natural next step emerged: I don't pick audiobooks by their cover. I pick them by what they're about and who reads them. Audioteka's descriptions make that harder than it should be.
So I built a cleanup pipeline: strip the boilerplate prefix ("Audiokniha [title], autor [author]..."), remove CAPSLOCK taglines and credit blocks, cut at the actual story. A typical Audioteka description is 3,000 characters of noise — the pipeline extracts the plot and caps it at 800. Then Google Gemini reads the cleaned text and generates genre tags (9 genres, 28 sub-genres), detects series membership through a 3-tier system (regex extraction, manual overrides for known edge cases, AI fallback), and writes short series descriptions in Czech.
2,000 books, all with clean story-focused descriptions, genre and sub-genre tags for filtering, and series positioning. Not a replacement for Audioteka's data — a layer on top of it that makes the library actually browsable.
The features nobody sees are the ones that matter most when you're listening in bed with no signal. My design principle was simple: the system handles every error automatically. Toast notifications are a last resort, not a first response.
After the first day I went to bed with headphones on, listening to adventures of Captain Harrington, and I almost broke into tears when I put airplane mode on and it still played.
I'm a UX designer, not a developer. I built this with Claude Code — but the player wasn't the only goal. Before I started, I had a plan: create a reusable design skill that Claude applies to every project automatically. I picked GitLab Pajamas as the foundation, added principles I believed in — forgiving software, undo instead of confirmation dialogs, inputs sized to content — and started building. Every real problem refined the skill. "Names are navigation" came from fixing the library. "System handles errors, user does nothing" came from offline playback. The skill grew from a general template to 24KB of battle-tested patterns. The audiobook player was the real project. The design skill was the plan from the start.