I Love Nanjing: The Complete Li Zhi, on Vinyl

How do you build a vinyl record player in 2025 to play the complete works of a singer who no longer exists?

I Love Nanjing

TL; DR

How It Started

I first heard Li Zhi around 2012. I hadn’t started college yet — after getting my early admission, I was killing time on Renren and stumbled onto his music. In 2013, I moved to Beijing and caught him live once at the Workers’ Stadium, a multi-artist folk show. One song, “Sunflower on the Wall,” made it immediately clear that he was nothing like the rest of them.

After that, I listened on and off, picking up bits of his story along the way — the legendary BB saga on Douban and whatnot, lol.

Then, without explanation, he was erased. By that point I’d long mastered the art of climbing the wall, so I went to Spotify, YouTube — listened to everything I could find.

The night before I left for Shanghai in June 2020, I couldn’t sleep. On impulse, I organized all of Li Zhi’s albums in my local iTunes library, piecing them together from every corner of the internet. It was probably the most complete collection anywhere. I shared it with a few friends, but the files were enormous and unwieldy — when I gave it to @Junyu, I had to go downstairs and hand him a USB drive.

Li Zhi's iTunes library

In 2024, I went to Fukuoka for the Three-Missing-One tour. The venue was packed. You could tell Li Zhi had been bottling it up — he played for over two hours. My legs gave out before his voice did. It was wonderful.

Three-Missing-One Tour, Fukuoka

Earlier this year, with some free time at home, I revisited the library. Filled in the missing lossless albums, completed the ID3 tags, added all the cover art. A milestone of sorts.

How to Put It on the Internet?

The next question was: how do you put a music library like this on the internet?

I didn’t want ongoing maintenance. I wanted it to be a museum on the web — deploy it once and walk away. I do nothing, you do nothing, it just sits there, and you open it and listen.

Others have built online players, but they looked expensive to run — domains, CDN, storage all add up. And their interfaces weren’t exactly elegant.

Storage was the easier part. For streaming, 256kbps AAC is more than sufficient, hosted on Cloudflare R2. For the lossless Apple Lossless files, @碎瓜 suggested Hugging Face Datasets — a perfect fit. It had never occurred to me you could use it that way.

Let’s Build a Vinyl Player!

In January I visited Tokyo and picked up a Li Zhi vinyl record at Tower Records. Around the same time, I’d been obsessed with an app called MD Vinyl — its album-switching view looks exactly like flipping through records at Tower Records. Stunning.

So I thought: why not go all in and build a vinyl record player?

I found an open-source project with decent aesthetics and got it running locally. But when I tried to modify the styles, I discovered it was a single-page monolith of 2,000+ lines, last updated in 2016. Untouchable.

Better to write my own. I named the new project Vinyl Vue, purely because it sounded good. I didn’t know Vue — just heard of it, good reputation, rolls off the tongue. Good enough.

So I opened Cursor.

I cannot write code. Not at all. I’m not being modest.

But I have Cursor.

This wasn’t my first project with it. Before this, I’d built an Astro-based personal website with Cursor (the one you’re reading right now). Cursor gives me the genuine illusion of omnipotence:

  • I can build literally anything
  • Don’t understand something? Ask. Don’t care? Just hit accept. Doesn’t work? Try again

After the usual struggles (mostly arguing with Cursor), I hammered the project out over the Qingming holiday at home. Not counting the time I spent on the original open-source project, it took about 16 hours of building, plus a few more hours organizing metadata and deploying — roughly 20 hours total.

The Final Result

My favorite Hangzhou version

Allow me to present my creation:

  • A retro vinyl record player with a skeuomorphic interface
  • Play, pause, track switching, and current track display using a dot-matrix font reminiscent of old CD players
  • During playback, you hear the soft crackle of needle on vinyl, the record spins, and the tonearm tracks the progress
  • Click the button or click the tonearm to pause; the arm lifts and swings aside on its own
  • Click the album cover to browse all albums; I originally had a tracklist view but removed it — after all, a real vinyl player doesn’t show you a tracklist either

In short, I — someone who genuinely cannot code — powered by sheer enthusiasm (and a perfectly ordinary Cursor armed with a top-tier LLM, yours for a mere $20/mo) — built this thing. I’m fairly proud of it.

Here’s the tech stack I used:

  • Framework: Vue 3
  • Language: TypeScript
  • Build tool: Vite
  • State management: Pinia
  • Deployment: Cloudflare Pages
  • Analytics: Umami
  • Storage: Cloudflare R2
  • Lossless storage: Hugging Face Datasets

Closing Thoughts

The project has a complete music library, a complete technical implementation, and complete SEO. After launch, I left it alone. Occasionally I check the Umami dashboard and find that people are actually listening. That feels pretty great.

Umami dashboard

I haven’t promoted it at all — haven’t even posted about it anywhere. I just quietly put it online, because the music is Li Zhi’s. All I did was organize it and build a player. A small contribution.

Recently Li Zhi joined Jike and has been posting a lot. I wonder if he’ll come across this project. I wonder what he’d think. I never asked for his permission, and that does make me uneasy. B-ge, if you see this and disapprove, please let me know and I’ll take it down immediately.

If you — reader, listener — enjoy this project, please let me know too. It would make me very happy :)

anyway, have fun

Baby

Between people, it’s all a game


2025-04-20 @Shanghai


Comments