Everyone expected a Kotlin Multiplatform project. What they got instead was a masterclass in knowing when to ignore best practices.
When an Android GDE sits down to build a cross-platform sync tool, the logical play is KMP. You’ve got the language, the ecosystem, the experience. Except this time, the developer behind MarvinSync—a macOS utility for syncing local music libraries to Android without clouds or streaming—chose to go full Swift and SwiftUI. On purpose. While being, by their own admission, “no Swift expert.”
This is where the story stops being about another indie developer shipping code and starts being about what vibe-coding actually means in practice.
What Everyone Thought Would Happen
The setup was classic open-source promise territory. February posts on LinkedIn and Mastodon announced a deep dive into Cursor sessions. People expected either a polished retrospective about how AI solved everything, or a cautionary tale about the limits of code generation. What arrived was neither—and that’s what makes it worth paying attention to.
“I provided the vibe—the logic, the structure, and the constraints—and the AI handled the boilerplate and the nuances of a language I’m still learning.”
That single sentence does more work than most AI-adjacent think pieces manage in 2,000 words. It’s not “AI wrote my app.” It’s not “I wrote my app and used AI as a crutch.” It’s the honest middle ground that nobody talks about because it doesn’t fit the hype machine.
The Metadata Problem That Broke Everything
Real talk: the first approach was a disaster.
The obvious solution was to scan ID3 tags using standard APIs. It made sense on paper. Every music library system since the iPod has done this. But when the code ran, it spat back duplicates and wrong titles because the filesystem didn’t match the metadata. The library looked like chaos in a folder tree, even if the tags were technically correct.
So they killed it. Not because AI wasn’t smart enough, but because the developer made a decision: stop being clever with metadata parsing and start being literal with the folder hierarchy.
The actual implementation is almost boring in its simplicity. A non-recursive scan walks through base / Artist / Album / tracks. No deep metadata introspection. No tag normalization. The directory structure is the truth. If your files are messy on disk, yes, they’ll sync messy. That’s not a bug—that’s honest design.
Why This Matters More Than The Code
This is where the vibe-coding thing becomes genuinely interesting and not just a Silicon Valley buzzword.
The developer brought architectural thinking—knowing that folder structures are inherently more reliable than scraped metadata. Cursor brought Swift syntax fluency and the ability to wire up the file manager APIs without the developer needing to become a SwiftUI expert overnight. Neither could have gotten to this solution alone. And notably, the human rejected what would’ve been the “smart” approach because they understood the real problem wasn’t metadata extraction—it was trust.
The Android Handshake That Actually Worked
Connecting to Android via ADB sounds straightforward until you try to make it feel native on macOS. A ConnectedDeviceChecker that polls every two seconds. A state machine—adbNotSet, adbNotAccessible, noDevice, oneDevice, multipleDevices—that gates the sync button until exactly one device is connected. No ambiguity. No “which device do you mean?” UI hell.
Again, this is architectural clarity. The code itself is readable Swift. But the shape of the solution—the enum states, the polling interval, the decision to require exactly one device—these came from someone who’s spent years shipping Android apps and understands the gotchas.
Cursor didn’t invent that. It just didn’t get in the way.
The Unspoken Win
Here’s what nobody’s saying out loud yet: this is what good AI-assisted development actually looks like, and it’s boring.
No superhuman productivity gains. No lines of code written that never would’ve been possible before. No replacing the developer’s role. Instead: a senior engineer with deep platform knowledge using a tool to ship faster in a language they’re still learning. The result works, the code is maintainable, and it shipped to Codeberg as open source with full transparency about how it was built.
That’s not a headline. That’s the unglamorous reality of what Cursor and similar tools are actually good for—not replacing thinking, but removing the friction between thinking and implementation.
The Local-First Rebellion Underneath All This
MarvinSync exists because some people still want to own their media locally.
No streaming subscriptions. No cloud. Just your music collection, your metadata, your Android device, and a utility that moves files when you tell it to. In 2025, this is weirdly radical. It’s the kind of project that probably makes cloud-first product managers uncomfortable.
But it shipped. And it shipped with a straightforward design philosophy that came from someone who understands both sides of the macOS-Android bridge deeply enough to know when not to over-engineer.
🧬 Related Insights
- Read more: JavaScript’s Array.flat() Is Elegant. But Your Nested Data Might Need Something Meaner.
- Read more: Stop Preloading Every API: How Code Mode Fixes MCP’s Token Waste Problem
Frequently Asked Questions
What is MarvinSync and how does it work?
MarvinSync is a macOS utility that syncs your local music library to Android devices via ADB (Android Debug Bridge). It reads music from a folder-based hierarchy and transfers files and metadata to your phone without using clouds or streaming services.
Why did the developer choose Swift instead of Kotlin Multiplatform?
They wanted to ship a native macOS app quickly and use the project as a learning opportunity. Cursor helped bridge the gap between their architectural knowledge and Swift syntax fluency, making it feasible to go full Swift for the Mac side without becoming a SwiftUI expert first.
Can I download MarvinSync now?
The source code is live on Codeberg, but the developer says binaries are coming soon. Check the repository for the latest status and installation instructions.