Developers eyed MarvinSync like it was just another KMP play—Kotlin Multiplatform smoothing Mac-to-Android bridges, because why not? That’s the script: reuse code, skip language drama. But nope. This macOS utility for shoving local music libraries onto Android phones flipped it. Native SwiftUI on top, ADB plumbing underneath, all vibe-coded via Cursor AI. Shifts the game—AI doesn’t just autocomplete; it teleports your brain across syntax walls.
Look, the creator’s an Android GDE, knee-deep in Kotlin and Compose daily. Swift? Rusty at best. Yet MarvinSync shipped, binaries imminent, code on Codeberg. Vibe-coding: you feed the logic, constraints, that gut feel—the AI spits boilerplate, idioms, the works. Suddenly, native Mac apps aren’t gated by language fluency.
What the Hell is MarvinSync, Anyway?
Niche as hell. Local media diehards—you know, folks hoarding MP3s, cursing Spotify—get a clean sync from Mac folders to Android. No cloud BS. ADB handles the push. Folders mirror your library: base/Artist/Album/tracks. Brutal simplicity.
But here’s the rub. Early tries? ID3 tag scans via APIs. Disaster—dupe tracks, mangled titles. Mismatch city.
They pivoted. Hard. Ditch the ‘smart’ metadata. Scan directories literally. Non-recursive, folder-first. Pull artwork from first track’s AVMetadataItem. strong? Hell yes. Matches your real vibe.
By using a non-recursive scan of the directory structure instead of metadata deep-dives, the app finally reflected the vibe of the actual library. It’s a reminder that sometimes the simplest architecture—the folder tree—is more strong than the most modern API.
That’s the creator’s words. Spot on. Echoes Unix philosophy—do one thing, filesystem as truth.
Short para: Architecture wins.
Now, the Android handshake. ADB ain’t native Mac. Polls every 2s via ConnectedDeviceChecker. @Published deviceStatus: enum from .adbNotSet to .multipleDevices. Sync button? Lights up only for exactly one device. Smart—avoids ‘which phone?’ hell.
enum ADBDeviceStatus: Sendable {
case adbNotSet
case adbNotAccessible
case noDevice
case oneDevice
case multipleDevices
// etc.
}
Cursor handled the ObservableObject boilerplate, DispatchQueue tweaks. Vibe in, Swift out.
Why Go Native Swift When KMP Screams Cross-Platform?
Expected KMP, right? Author’s wheelhouse. Share logic, one codebase. But nah—SwiftUI for that Mac polish, buttery UI. AI bridged the gap. You’re not learning Swift; you’re directing it.
This ain’t hype. It’s a sneak peek at native revival. Web apps dominated because native was brutal—learn iOS, Android, web stacks. Now? Vibe-code natives. Prediction: by 2026, indie devs flood App Store with AI-native tools, killing PWAs for real apps. (Unique take: parallels 90s Java hype promising ‘write once,’ but Cursor actually delivers cross-language ‘think once.’)
Corporate spin? None here—solo dev postmortem. No vaporware.
Dig the code: MusicFolderStore.scanForAlbumsFolderBased. FileManager.contentsOfDirectory, filter directories, nest artist/album. Sorted output. Clean.
Hurdles? Permissions, async scans. Cursor iterated prompts: ‘Make it crash-proof,’ ‘Add logging.’ Vibe evolves to shippable.
How Does Cursor’s Vibe-Coding Actually Work Here?
Sessions like therapy. ‘Build folder scanner, folder=artist/album.’ AI drafts func. Test, tweak: ‘Handle errors, skip hidden.’ Rinse. Metadata flop? Prompt: ‘Ignore tags, use paths.’ Boom—pivot.
Not magic. Architectural vision stays yours. AI? Syntax plumber.
And the poll? ‘Timer every 2s, parse adb devices output.’ Handles multiple/emulator edge. isDeviceConnected as computed prop. SwiftUI binds smoothly.
One gripe—polling sucks battery. Future? Reactive ADB events? But v1 ships lean.
Expansive bit: This exposes a shift. Devs hoard Kotlin expertise, but platforms fragment—macOS SwiftUI gleams, Android Compose Multiplatform lags parity. AI levels it. Kotlin dev vibes Swift app? Done. No bootcamps. Expect MarvinSync clones: native utils everywhere, AI-fueled.
Why Does Folder-Over-Metadata Matter for Your Library?
Google it: music apps choke on tags. iTunes mismatches files. Folder tree? Your truth. Artist folders alphabetical, albums nested—sync preserves intent. Artwork? First track’s embed. No deep dives.
Critique: Still ADB-dependent. USB tether? Fine for power users. Wireless ADB? Prompt away.
Punchy: Simplicity scales.
Dense para: Broader why—local media fights back. Streaming owns discovery, but ownership? Folders. MarvinSync weaponizes that. Android gets lossless, metadata-true copies. No subs. In AI era, tools like this proliferate—vibe-code your niche solver.
UI? SwiftUI lists, status bar. Device checker publishes, views react. Native feel without native pain.
🧬 Related Insights
- Read more: Forget $1,000 Tools: Track 50 Rivals for $12/Month and Spot Pivots Early
- Read more: Kubernetes’ cgroup CPU Fix: From Linear Disaster to Quadratic Sanity
Frequently Asked Questions
What is MarvinSync and how do I get it?
macOS app syncing local music folders to Android via ADB. Code on Codeberg; binaries soon.
Can I use Cursor for my own native apps if I’m not a Swift expert?
Absolutely—vibe the architecture, let AI handle syntax. Bridges languages fast.
Why folders instead of ID3 tags for music sync?
Tags lie or duplicate; folders match your organization perfectly, simpler code.