[{"data":1,"prerenderedAt":144},["ShallowReactive",2],{"project-en-durvald":3},{"id":4,"title":5,"author":6,"body":7,"company":121,"date":122,"description":123,"extension":124,"highlight":125,"meta":126,"navigation":125,"path":127,"priority":128,"role":129,"section":130,"seo":131,"sitemap":132,"stem":133,"tags":134,"thumbnail":141,"year":142,"__hash__":143},"work\u002Fwork\u002Fen\u002Fdurvald.md","Durvald","Salguento",{"type":8,"value":9,"toc":110},"minimark",[10,15,19,30,34,37,40,44,60,63,67,74,77,81,84,88,91,94,98,101],[11,12,14],"h2",{"id":13},"context","Context",[16,17,18],"p",{},"Durvald is a local-first desktop player for Windows, macOS and Linux, designed to give listeners control over their music collection. Instead of depending on a streaming service's catalog and connectivity, the application indexes local files, organizes artists and releases, and keeps queues, playlists and listening history on the device.",[16,20,21,26],{},[22,23],"img",{"alt":24,"src":25},"Durvald interface with an album library and persistent player.","\u002Fimg\u002Fwork\u002Fdurvald\u002Fcover-durvald.jpeg",[27,28,29],"em",{},"Durvald's interface and visual identity.",[11,31,33],{"id":32},"technical-problem","Technical problem",[16,35,36],{},"A local library combines workloads with different characteristics: intensive file and metadata reading, real-time audio playback, transactional persistence and an interface that must remain responsive. Running everything in the interface process would block the UI and mix native responsibilities with the presentation layer.",[16,38,39],{},"The solution separates responsibilities across an IPC boundary. SolidJS owns presentation and reactive state; Tauri commands forward privileged operations to Rust. The core processes files, controls audio, maintains the queue and persists data without coupling those details to visual components.",[11,41,43],{"id":42},"architecture","Architecture",[16,45,46,47,51,52,55,56,59],{},"The frontend is organized into pages, components, hooks and stores. It communicates with the backend through ",[48,49,50],"code",{},"invoke",", while events such as ",[48,53,54],{},"progress-update"," and ",[48,57,58],{},"song-changed"," bring player changes back into the interface.",[16,61,62],{},"In the native process, Tokio coordinates asynchronous tasks; Kira streams MP3, OGG, FLAC and WAV; Lofty extracts tags, technical properties and artwork; and SQLite stores the library, playlists, queue, history, settings and last session. Blocking database work uses a connection pool and dedicated tasks.",[11,64,66],{"id":65},"playback-and-continuity","Playback and continuity",[16,68,69,70,73],{},"The player maintains a ",[48,71,72],{},"VecDeque"," queue, an in-memory history and the current track. Changes are mirrored to SQLite. An asynchronous loop detects the end of each track, starts the next item and emits the new state to the interface.",[16,75,76],{},"The last session records the track, progress, volume, shuffle, repeat mode, queue snapshot and source context. This allows the experience to resume after the application closes.",[11,78,80],{"id":79},"integration-and-security","Integration and security",[16,82,83],{},"The Last.fm integration implements token authentication, now playing, scrobbling and offline retries. A rate limiter serializes requests to respect the API interval. Secrets are kept in Keychain on macOS; on Windows and Linux they are encrypted with AES-256-GCM and bound to the machine and user. Audio files remain local.",[11,85,87],{"id":86},"cross-platform-desktop-application","Cross-platform desktop application",[16,89,90],{},"Durvald runs natively on Windows, macOS and Linux. Tauri combines the SolidJS interface and Rust core into a single desktop application while providing controlled access to the filesystem, audio playback and platform-specific credential storage.",[16,92,93],{},"The production pipeline validates TypeScript before Vite generates the interface assets embedded in the application. Cargo verifies the Rust core, and Tauri produces platform-specific installers.",[11,95,97],{"id":96},"boundaries-and-evolution","Boundaries and evolution",[16,99,100],{},"The application is already functional on all three supported operating systems. The next quality milestones are adding automated tests for stores, commands and persistence, followed by formal database migrations. Indexing quality also depends on the consistency of metadata in the user's files.",[16,102,103],{},[104,105,109],"a",{":rel":106,":target":107,"href":108},"noreferrer","_blank","https:\u002F\u002Fgithub.com\u002Fsalguento\u002Fdurvald","GitHub",{"title":111,"searchDepth":112,"depth":112,"links":113},"",2,[114,115,116,117,118,119,120],{"id":13,"depth":112,"text":14},{"id":32,"depth":112,"text":33},{"id":42,"depth":112,"text":43},{"id":65,"depth":112,"text":66},{"id":79,"depth":112,"text":80},{"id":86,"depth":112,"text":87},{"id":96,"depth":112,"text":97},"Independent","2026-07","Local-first music player with a SolidJS interface and native Rust core","md",true,{},"\u002Fwork\u002Fen\u002Fdurvald","2","Full-stack Developer","featured",{"title":5,"description":123},{"loc":127},"work\u002Fen\u002Fdurvald",[135,136,137,138,139,140],"TypeScript","SolidJS","Rust","Tauri","SQLite","Last.fm","\u002Fimg\u002Fwork\u002Fdurvald\u002Fcover-durvald-card.png",2025,"TBgShSNfbXxaT8BIoRdhoryzqJO1xAkt9JRW-2jtY1M",1785351609753]