DEV Community

Cover image for Why I Built a Lightweight Spotify Clone with Tauri 2 and React (Instead of Electron)
Mithun A
Mithun A

Posted on

Why I Built a Lightweight Spotify Clone with Tauri 2 and React (Instead of Electron)

I Built Orchestro: A Lightweight Spotify-Style Music Player for Local Music

We've all been there.

You open a desktop app just to play some local music, check Task Manager, and find it using hundreds of megabytes of RAM with a bunch of background processes running.

Modern music apps are built around streaming, accounts, recommendations, telemetry, and ads. That's great when you want a streaming service, but it feels like overkill when all you want to do is listen to the .mp3 and .flac files already sitting on your computer.

So I built Orchestro.

It's an open-source, local-first music player with a Spotify-inspired interface, built using Tauri 2, React, TypeScript, and Rust.

🔗 Project

GitHub: https://github.com/Kryiocifer/Orchestro

Built with: Tauri 2 · React · TypeScript · Rust · Vite · Tailwind CSS


🎵 What is Orchestro?

Orchestro is designed to make local music feel like a modern streaming app — without actually requiring a streaming service.

You can import your existing music collection, browse albums and artists, create playlists, manage your queue, and play your music completely locally.

It supports formats such as:

  • .mp3
  • .flac
  • .wav
  • .ogg

There are no accounts, cloud libraries, or external API keys required for basic playback.


⚡ Why Tauri 2?

For the desktop framework, I considered Electron, but I didn't want to bundle an entire Chromium runtime and Node.js environment for a relatively simple music player.

Tauri 2 was a much better fit.

The frontend can still be built with the tools I already enjoy using — React, TypeScript, Vite, and Tailwind — while Rust handles the native desktop side.

Tauri also gives the application a proper capability-based permission system, which is particularly useful when working with local files.


📂 Importing Music

One of the main goals was to make adding music as simple as possible.

Instead of manually entering metadata or configuring complicated library folders, you can just drag your music into Orchestro.

Using music-metadata, the application extracts information such as:

  • Song title
  • Artist
  • Album
  • Duration
  • Embedded album artwork

After processing, the track is immediately added to the local library.

Small things like this make managing a large music collection much less tedious.


🎨 A Spotify-Inspired Experience

I wanted Orchestro to feel familiar without trying to recreate Spotify itself.

It includes features such as:

  • Custom playlists
  • Playback queue
  • Seek and volume controls
  • Album artwork
  • Right-click context menus
  • Toast notifications
  • Local music library management

For example, right-clicking a track lets you interact with it directly instead of navigating through multiple screens.

A simplified version of the context-menu handling looks like this:

const handleContextMenu = (
  e: React.MouseEvent,
  song: Song
) => {
  e.preventDefault();

  setMenuPosition({
    x: e.clientX,
    y: e.clientY
  });

  setSelectedSong(song);
  setIsOpen(true);
};
Enter fullscreen mode Exit fullscreen mode

🔒 Local-First by Design

One of the biggest reasons I wanted to build Orchestro was privacy.

Your music library and playlists stay on your machine.

There's no requirement for:

  • An account
  • Cloud storage
  • Cloud synchronization
  • Tracking
  • Telemetry

If your music is already on your computer, Orchestro should be able to work with it.


🧠 What I Learned

Building Orchestro taught me quite a bit about desktop development.

The biggest difference from building a web application was dealing with things like filesystem access, native permissions, application packaging, and communication between the React frontend and Rust backend.

Tauri 2's capability system was especially interesting. Native functionality isn't simply exposed to the frontend by default — permissions have to be explicitly configured.

I also got a much better understanding of how local-first applications can avoid a surprising amount of unnecessary infrastructure.


🚀 What's Next?

The current version focuses on the core local music experience, but there's more planned:

  • 🎵 yt-dlp integration for downloading audio
  • 🎹 Global media keys
  • 🖥️ System tray mini-player
  • ↕️ Drag-to-reorder playlists
  • 🔎 In-library search and filtering
  • 🎨 More customization options

The goal is to keep Orchestro lightweight while adding the features that actually make a local music library enjoyable to use.


💻 Try It Out

Orchestro is free and open source.

If you have a local music collection and want a modern Spotify-style experience without a heavyweight streaming client, give it a try.

GitHub: https://github.com/Kryiocifer/Orchestro

If you find it useful, a ⭐ on GitHub is always appreciated!

And if you have ideas or suggestions, feel free to open an issue.

Thanks for reading! 🎵

Top comments (0)