<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Andreas Nilsen</title>
    <description>The latest articles on DEV Community by Andreas Nilsen (@cybernilsen).</description>
    <link>https://dev.to/cybernilsen</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3218804%2F4f1c17fb-0ee8-4a9a-aeb3-65e061a3dfd3.jpeg</url>
      <title>DEV Community: Andreas Nilsen</title>
      <link>https://dev.to/cybernilsen</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cybernilsen"/>
    <language>en</language>
    <item>
      <title>Cross-Platform Music Downloader</title>
      <dc:creator>Andreas Nilsen</dc:creator>
      <pubDate>Sat, 06 Sep 2025 20:42:25 +0000</pubDate>
      <link>https://dev.to/cybernilsen/cross-platform-music-downloader-5299</link>
      <guid>https://dev.to/cybernilsen/cross-platform-music-downloader-5299</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Building Symphex: A Modern Music Downloader with C# &amp;amp; Avalonia&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;After getting frustrated with clunky, ad-filled music downloaders, I decided to build my own. Meet Symphex - a clean, cross-platform music downloader that respects your privacy and delivers high-quality audio with beautiful metadata.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🎯 The Problem I Wanted to Solve&lt;/strong&gt;&lt;br&gt;
Most music downloaders are either:&lt;/p&gt;

&lt;p&gt;Filled with ads and malware&lt;br&gt;
Platform-specific (Windows only)&lt;br&gt;
Missing proper metadata and album artwork&lt;br&gt;
Require technical knowledge to use&lt;/p&gt;

&lt;p&gt;I wanted something that "just works" - beautiful, fast, and respectful of user privacy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🛠️ Tech Stack Choices&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Framework: Avalonia UI 11.x&lt;br&gt;
Cross-platform from day one&lt;br&gt;
Modern XAML-based UI&lt;br&gt;
Great performance on all platforms&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Language: C# with .NET 8&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Strong typing and excellent tooling&lt;br&gt;
Great async/await support for downloads&lt;br&gt;
Familiar ecosystem&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Architecture: MVVM with CommunityToolkit.Mvvm&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Clean separation of concerns&lt;br&gt;
Reactive UI updates&lt;br&gt;
Easy testing and maintenance&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;🎨 Design Philosophy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I focused on creating a dark, modern interface that feels native on each platform:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;xml&amp;lt;Style Selector="Button.download"&amp;gt;
    &amp;lt;Setter Property="Background" Value="#1e40af"/&amp;gt;
    &amp;lt;Setter Property="Foreground" Value="White"/&amp;gt;
    &amp;lt;Setter Property="CornerRadius" Value="12"/&amp;gt;
    &amp;lt;Setter Property="Effect"&amp;gt;
        &amp;lt;DropShadowEffect Color="#1e40af" Opacity="0.3" BlurRadius="15"/&amp;gt;
    &amp;lt;/Setter&amp;gt;
&amp;lt;/Style&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The UI features:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Glassmorphism effects with subtle shadows&lt;/p&gt;

&lt;p&gt;Smooth animations for user feedback&lt;/p&gt;

&lt;p&gt;Responsive design that works on different screen sizes&lt;/p&gt;

&lt;p&gt;Toast notifications for user feedback&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;🔧 Technical Challenges &amp;amp; Solutions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Cross-Platform File Operations&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Getting folder opening to work across platforms was tricky:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;private void OpenFolder()
{
    if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
    {
        Process.Start("explorer.exe", DownloadFolder);
    }
    else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
    {
        Process.Start("open", Path.GetFullPath(DownloadFolder));
    }
    else // Linux
    {
        Process.Start("xdg-open", DownloadFolder);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Intelligent Metadata Detection&lt;/strong&gt;&lt;br&gt;
The app automatically detects artist and song titles from YouTube video titles:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class MetadataExtractor
{
    public TrackInfo ExtractFromTitle(string title)
    {
        // Smart parsing patterns
        var patterns = new[]
        {
            @"(.+?)\s*-\s*(.+?)(?:\s*\(.*\))?$",
            @"(.+?)\s*–\s*(.+?)(?:\s*\[.*\])?$",
            // More patterns...
        };

        // Extract and clean metadata
        return new TrackInfo(artist, title);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Album Artwork Integration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I integrated with iTunes and Deezer APIs for authentic album artwork:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public async Task&amp;lt;string&amp;gt; GetAlbumArtwork(string artist, string title)
{
    // Try iTunes API first
    var iTunesUrl = await SearchITunes(artist, title);
    if (iTunesUrl != null) return iTunesUrl;

    // Fallback to Deezer
    var deezerUrl = await SearchDeezer(artist, title);
    if (deezerUrl != null) return deezerUrl;

    // Last resort: use video thumbnail
    return videoThumbnail;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;🚀 Key Features That Make It Special&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Privacy First&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;No telemetry or data collection&lt;br&gt;
Works offline after initial setup&lt;br&gt;
No ads or premium upsells&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Smart Automation&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Automatic dependency management (yt-dlp, FFmpeg)&lt;br&gt;
Intelligent file naming&lt;br&gt;
Metadata embedding with proper ID3 tags&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;User Experience&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Batch downloads with individual progress tracking&lt;br&gt;
Real-time preview of detected metadata&lt;br&gt;
Toast notifications for completed downloads&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;📈 Performance Optimizations&lt;/strong&gt;&lt;br&gt;
Async/Await Throughout:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public async Task DownloadAsync(string url, IProgress&amp;lt;double&amp;gt; progress)
{
    await foreach (var chunk in downloader.DownloadChunksAsync(url))
    {
        await ProcessChunk(chunk);
        progress.Report(GetProgressPercentage());
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Efficient UI Updates:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Reactive properties with ObservableProperty&lt;br&gt;
Throttled progress updates to prevent UI lag&lt;br&gt;
Background processing with UI marshaling&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;🌟 What I Learned&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Avalonia is amazing for cross-platform desktop apps&lt;br&gt;
MVVM architecture scales really well for complex UIs&lt;br&gt;
Platform differences require careful abstraction&lt;br&gt;
User feedback through UI animations makes a huge difference&lt;br&gt;
Open source community provides incredible support&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;🎯 Future Plans&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Playlist support for batch downloading entire YouTube playlists&lt;br&gt;
System tray integration for background downloads&lt;br&gt;
Browser extension for one-click downloading&lt;br&gt;
Download history and favorites management&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;🔗 Try It Out!&lt;/strong&gt;&lt;br&gt;
Symphex is 100% free and open source:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;GitHub: CyberNilsen/Symphex&lt;br&gt;
Download: Latest releases&lt;br&gt;
Platforms: Windows, macOS, Linux&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;💭 Final Thoughts&lt;/strong&gt;&lt;br&gt;
Building Symphex taught me that sometimes the best solution is the one you build yourself. By focusing on user experience, privacy, and cross-platform compatibility, I created something that solves real problems.&lt;br&gt;
The combination of C#, Avalonia UI, and modern design principles made it possible to build a professional-grade application that competes with commercial alternatives.&lt;/p&gt;

&lt;p&gt;What features would you want in a music downloader? Let me know in the comments! 👇&lt;br&gt;
If you found this interesting, consider ⭐ starring the repo on GitHub!&lt;br&gt;
Github link: &lt;a href="https://github.com/CyberNilsen/Symphex" rel="noopener noreferrer"&gt;https://github.com/CyberNilsen/Symphex&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>CyberVault: A Fully Local, Open-Source Password Manager Built with C#</title>
      <dc:creator>Andreas Nilsen</dc:creator>
      <pubDate>Wed, 28 May 2025 16:57:14 +0000</pubDate>
      <link>https://dev.to/cybernilsen/cybervault-a-fully-local-open-source-password-manager-built-with-c-nop</link>
      <guid>https://dev.to/cybernilsen/cybervault-a-fully-local-open-source-password-manager-built-with-c-nop</guid>
      <description>&lt;p&gt;🔐 &lt;strong&gt;Introducing CyberVault&lt;/strong&gt; – A C# Password Manager for Full Local Control&lt;/p&gt;

&lt;p&gt;Hi everyone,&lt;/p&gt;

&lt;p&gt;Me and my friend CyberHansen recently built &lt;a href="https://github.com/CyberNilsen/CyberVault" rel="noopener noreferrer"&gt;CyberVault&lt;/a&gt;, a lightweight password manager written in C#. It’s designed for those of us who want &lt;strong&gt;complete control over our password data&lt;/strong&gt; — no accounts, no cloud sync, no servers.&lt;/p&gt;

&lt;h3&gt;
  
  
  💡 Why I Built It
&lt;/h3&gt;

&lt;p&gt;I couldn’t find a simple, open-source password manager that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Didn’t require cloud accounts&lt;/li&gt;
&lt;li&gt;Could run as a self-contained Windows app&lt;/li&gt;
&lt;li&gt;Was open to community contributions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I built my own.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔧 Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🖥️ &lt;strong&gt;Fully Local&lt;/strong&gt; – stores your data on your device only&lt;/li&gt;
&lt;li&gt;🔐 &lt;strong&gt;Encrypted Vault&lt;/strong&gt; – strong cryptographic security&lt;/li&gt;
&lt;li&gt;🚀 &lt;strong&gt;Standalone GUI&lt;/strong&gt; – just run the EXE, no server or installer&lt;/li&gt;
&lt;li&gt;🧩 &lt;strong&gt;Early Chrome Extension&lt;/strong&gt; – optional autofill support&lt;/li&gt;
&lt;li&gt;🧑‍💻 &lt;strong&gt;Open Source&lt;/strong&gt; – available on GitHub&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/CyberNilsen/CyberVault" rel="noopener noreferrer"&gt;GitHub Repo&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🧠 I’d Love Feedback On:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Security model / cryptography approach&lt;/li&gt;
&lt;li&gt;UX suggestions&lt;/li&gt;
&lt;li&gt;Chrome extension features you'd like&lt;/li&gt;
&lt;li&gt;Any bugs or issues you run into&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ⭐ If you find this project useful, don’t forget to star the repo and share it!
&lt;/h3&gt;

&lt;p&gt;Thanks for checking it out — happy to chat if anyone wants to collaborate! &lt;/p&gt;

&lt;p&gt;– CyberNilsen, CyberHansen&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>dotnet</category>
      <category>opensource</category>
      <category>security</category>
    </item>
  </channel>
</rss>
