<?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: albilu</title>
    <description>The latest articles on DEV Community by albilu (@albilu).</description>
    <link>https://dev.to/albilu</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4036364%2F4940ed06-66fa-47f6-a187-912a90eeccf1.jpg</url>
      <title>DEV Community: albilu</title>
      <link>https://dev.to/albilu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/albilu"/>
    <language>en</language>
    <item>
      <title>Linux Device Manager — every bus, driver, and kernel event in one GTK4 tree</title>
      <dc:creator>albilu</dc:creator>
      <pubDate>Sat, 26 Sep 2026 10:36:49 +0000</pubDate>
      <link>https://dev.to/albilu/linux-device-manager-every-bus-driver-and-kernel-event-in-one-gtk4-tree-49dn</link>
      <guid>https://dev.to/albilu/linux-device-manager-every-bus-driver-and-kernel-event-in-one-gtk4-tree-49dn</guid>
      <description>&lt;p&gt;Windows has Device Manager. Linux has &lt;code&gt;lspci&lt;/code&gt;, &lt;code&gt;lsusb&lt;/code&gt;, &lt;code&gt;lshw&lt;/code&gt;, three sysfs walks, and a &lt;code&gt;dmesg&lt;/code&gt; grep you run from memory. I wanted one window that shows all of it — with safe enable/disable — so I built &lt;strong&gt;Linux Device Manager (LDM)&lt;/strong&gt;: a native GTK4 app that combines sysfs, udev, and the proven CLI tools into one clean category tree.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/getldm/linux-device-manager" rel="noopener noreferrer"&gt;https://github.com/getldm/linux-device-manager&lt;/a&gt; (GPL-3.0-or-later, v0.2.0 out now)&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Category tree&lt;/strong&gt; — Multimedia, Network, Storage, USB, PCI and more, with functional categories taking priority over raw bus groupings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Detail tabs&lt;/strong&gt; — General, Advanced, Driver, and Kernel logs/events, loaded lazily and cached until refresh&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safe Enable / Disable&lt;/strong&gt; — USB authorization plus driver bind/unbind through a polkit-protected privileged helper, with state verification after every action&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accurate identity&lt;/strong&gt; — canonical sysfs paths deduplicate aliases, so controllers stay separate from their disks/NICs; USB composites are classified by all their functions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kernel logs that actually match&lt;/strong&gt; — current-boot snapshots matched to device/interface IDs, not shared driver names&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast search&lt;/strong&gt; — type in the tree, &lt;code&gt;Ctrl+F&lt;/code&gt;, &lt;code&gt;Esc&lt;/code&gt; returns focus, full keyboard + context-menu support&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How it's built
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Java 25 + java-gi&lt;/strong&gt; for GTK4 bindings, UI defined in Cambalache (&lt;code&gt;main.ui&lt;/code&gt;) loaded via &lt;code&gt;GtkBuilder&lt;/code&gt; — no programmatic widgets&lt;/li&gt;
&lt;li&gt;Data layer reads &lt;strong&gt;sysfs/udev&lt;/strong&gt; directly and shells out to &lt;code&gt;lspci&lt;/code&gt;, &lt;code&gt;lsusb&lt;/code&gt;, &lt;code&gt;modinfo&lt;/code&gt;, &lt;code&gt;journalctl&lt;/code&gt;, &lt;code&gt;dmesg&lt;/code&gt;, &lt;code&gt;udevadm&lt;/code&gt; (all optional enrichments)&lt;/li&gt;
&lt;li&gt;Ships a &lt;strong&gt;trimmed &lt;code&gt;jlink&lt;/code&gt; runtime&lt;/strong&gt;; only GTK4 and the hardware tools come from the host&lt;/li&gt;
&lt;li&gt;XDG-compliant, no hardcoded home paths — works sandboxed&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;

&lt;p&gt;Packages for Debian/Ubuntu (&lt;code&gt;.deb&lt;/code&gt;), Fedora/RHEL (&lt;code&gt;.rpm&lt;/code&gt;), Arch (&lt;code&gt;pkg.tar.zst&lt;/code&gt;), plus portable &lt;strong&gt;AppImage&lt;/strong&gt; and &lt;strong&gt;Flatpak&lt;/strong&gt;, all assembled from one stage tree:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Debian/Ubuntu&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; ./linux-device-manager_&lt;span class="k"&gt;*&lt;/span&gt;.deb

&lt;span class="c"&gt;# Fedora/RHEL&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;rpm &lt;span class="nt"&gt;-i&lt;/span&gt; linux-device-manager-&lt;span class="k"&gt;*&lt;/span&gt;.rpm

&lt;span class="c"&gt;# Arch&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-U&lt;/span&gt; linux-device-manager-&lt;span class="k"&gt;*&lt;/span&gt;.pkg.tar.zst

&lt;span class="c"&gt;# AppImage (needs host GTK4)&lt;/span&gt;
./LinuxDeviceManager-&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="nt"&gt;-x86_64&lt;/span&gt;.AppImage

&lt;span class="c"&gt;# Flatpak&lt;/span&gt;
flatpak &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--user&lt;/span&gt; ./org.ldm.LinuxDeviceManager.flatpak
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Build from source in one reproducible Docker image (&lt;code&gt;eclipse-temurin:25-jdk&lt;/code&gt; + GTK4 + Xvfb):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make build &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make package
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Status and roadmap
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;v0.2.0 is released with all five formats; AppStream metainfo validates clean&lt;/li&gt;
&lt;li&gt;In flight: &lt;strong&gt;Flathub submission&lt;/strong&gt; (offline source-build manifest with vendored Maven deps — Flathub builders have no network), &lt;strong&gt;AppImageHub catalog&lt;/strong&gt; entry, and an &lt;code&gt;awesome-sysadmin&lt;/code&gt; listing&lt;/li&gt;
&lt;li&gt;Known limitation: inside the Flatpak sandbox, enumeration is read-only best-effort and the privileged helper is degraded — future work is reaching host tools via &lt;code&gt;flatpak-spawn --host&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How you can help
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Test on your hardware&lt;/strong&gt; — exotic USB composites, multi-function PCI cards, and weird drivers are where bugs hide; issues with &lt;code&gt;lsusb -v&lt;/code&gt; / sysfs paths attached are gold&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Packagers&lt;/strong&gt; — a Debian sponsor, Fedora COPR, or AUR maintainer would get LDM into Repology/pkgs.org automatically&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Design eyes&lt;/strong&gt; — the UI is Cambalache-defined, so layout tweaks are XML diffs, not code refactors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you've ever wished &lt;code&gt;lspci&lt;/code&gt; had a GUI with an off switch, give it a spin. ⭐s and hardware-bug reports equally welcome.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>gtk</category>
      <category>showdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Open Download Manager: One Native GTK Queue for Files, Torrents, Video, and Website Mirrors on Linux</title>
      <dc:creator>albilu</dc:creator>
      <pubDate>Fri, 25 Sep 2026 17:59:44 +0000</pubDate>
      <link>https://dev.to/albilu/open-download-manager-one-native-gtk-queue-for-files-torrents-video-and-website-mirrors-on-linux-m0</link>
      <guid>https://dev.to/albilu/open-download-manager-one-native-gtk-queue-for-files-torrents-video-and-website-mirrors-on-linux-m0</guid>
      <description>&lt;p&gt;Browser download queues top out fast. Real life is ISOs, torrents, playlists, full-site mirrors, flaky Wi-Fi, and rate limits — scattered across five CLI tools.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/odm-linux/open-download-manager" rel="noopener noreferrer"&gt;Open Download Manager (ODM)&lt;/a&gt; puts them in one native Linux queue: HTTP/FTP, BitTorrent/magnet/Metalink, video, and website mirrors, with pause/resume that survives restarts, proxy/Tor routing, scheduling, and batch automation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F010q27adzxuh04byxabb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F010q27adzxuh04byxabb.png" alt="Main window" width="800" height="405"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;One queue, four engines, live details.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Full user guide with screenshots: &lt;a href="https://github.com/odm-linux/open-download-manager/blob/main/docs/wiki/Home.md" rel="noopener noreferrer"&gt;docs/wiki/Home.md&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why another download manager?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One queue, proven engines.&lt;/strong&gt; aria2 (HTTP/FTP/BitTorrent/Metalink) + yt-dlp (media) + HTTrack (mirrors) + curl fallback — instead of one narrow protocol.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crash-safe.&lt;/strong&gt; XDG settings, persistent history, aria2 session files, ordered events, auto-resume.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Private.&lt;/strong&gt; Tor lifecycle + health, proxychains, proxy rotation on 403/429/5xx.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automated.&lt;/strong&gt; Clipboard polling, &lt;code&gt;.torrent&lt;/code&gt;/&lt;code&gt;.metalink&lt;/code&gt; folder watch, batch imports, weekly scheduler, checksum/AV/move/notify/shutdown actions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Native.&lt;/strong&gt; GTK4/Libadwaita via java-gi, tray/background mode, search/filter/detail tabs. &lt;code&gt;.deb&lt;/code&gt; / &lt;code&gt;.rpm&lt;/code&gt; / &lt;code&gt;.pkg.tar.zst&lt;/code&gt; with bundled Java 25 runtime.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Everyday downloads
&lt;/h2&gt;

&lt;p&gt;Hit &lt;strong&gt;+&lt;/strong&gt;, paste a link or pick a &lt;code&gt;.torrent&lt;/code&gt;, set folder and filename, Start. Pause/resume/reorder anytime; close the app mid-download and it resumes later.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9z6axibs3byu6jsxh720.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9z6axibs3byu6jsxh720.png" alt="New download" width="800" height="523"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Queue controls, live search, status/category filters, and Files/Trackers/Peers/Sources tabs keep big lists manageable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Video without browser gymnastics
&lt;/h2&gt;

&lt;p&gt;Paste a page URL, &lt;strong&gt;Fetch info&lt;/strong&gt;, pick format, subtitles (&lt;code&gt;en,fr&lt;/code&gt;), playlists (&lt;code&gt;1-3&lt;/code&gt;), cookies for logins, SponsorBlock — Download.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flq1bhbz61m4xmmrmcuxa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flq1bhbz61m4xmmrmcuxa.png" alt="New media" width="800" height="523"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Torrents + built-in search
&lt;/h2&gt;

&lt;p&gt;Magnets, &lt;code&gt;.torrent&lt;/code&gt;/&lt;code&gt;.metalink&lt;/code&gt;, per-torrent file selection — plus Jackett-powered search that sends results straight to the queue.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F12zyezfphb658iv0bda2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F12zyezfphb658iv0bda2.png" alt="Torrent search" width="800" height="523"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Search &lt;code&gt;ubuntu 24.04&lt;/code&gt;, tick two results, Download. No browser detour.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Offline websites
&lt;/h2&gt;

&lt;p&gt;Mirror docs for travel or archiving: depth, scope, include/exclude (&lt;code&gt;*.html *.css&lt;/code&gt;, skip &lt;code&gt;*/admin/*&lt;/code&gt;), cookies, then Start Scrape.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsek9ag1wyjd608op72oe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsek9ag1wyjd608op72oe.png" alt="Website mirror" width="800" height="523"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy routing
&lt;/h2&gt;

&lt;p&gt;Global or per-download: SOCKS5/HTTP proxy, proxychains, or Tor (&lt;code&gt;127.0.0.1:9050&lt;/code&gt;) with verification, exit IP, and New Identity. Rotation kicks in on rate limits.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F821tjmqtni2m8qmrveg0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F821tjmqtni2m8qmrveg0.png" alt="Network settings" width="800" height="523"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Automation that pays off
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm1ko27w1r98qopr2m0tf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm1ko27w1r98qopr2m0tf.png" alt="Batch import" width="800" height="523"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clipboard monitoring (silent mode queues links without asking).&lt;/li&gt;
&lt;li&gt;Folder watch for dropped descriptors.&lt;/li&gt;
&lt;li&gt;Batch import lists/sequences, scheduler presets (night/weekend/business), completion pipeline.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Settings cover General/Network/Aria2/yt-dlp/HTTrack/Advanced plus tray and troubleshooting:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fabiffi4bu8cn9hyzcwft.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fabiffi4bu8cn9hyzcwft.png" alt="Settings" width="800" height="523"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Under the hood
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Java 25, Maven multi-module (&lt;code&gt;core&lt;/code&gt; engine + &lt;code&gt;odm-gtk4&lt;/code&gt; UI), Jackson, Java-WebSocket, &lt;code&gt;java.util.logging&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Core stays toolkit-independent; all UI updates marshal through one &lt;code&gt;UiThread&lt;/code&gt; (&lt;code&gt;GLib.idleAddOnce&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;GtkBuilder &lt;code&gt;.ui&lt;/code&gt; layouts with fail-fast widget lookup — ID mismatches break the build, not at runtime.&lt;/li&gt;
&lt;li&gt;Docker-first dev: &lt;code&gt;make build/compile/test/run/package&lt;/code&gt; (Xvfb, aria2, yt-dlp, httrack, tor, proxychains in-image). Surefire forks per class; tests hit real tools.&lt;/li&gt;
&lt;li&gt;Installs: &lt;code&gt;sudo apt install ./open-download-manager_*.deb&lt;/code&gt; / &lt;code&gt;sudo rpm -i …&lt;/code&gt; / &lt;code&gt;sudo pacman -U …&lt;/code&gt; — no system Java needed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Debian/Ubuntu&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; ./open-download-manager_&lt;span class="k"&gt;*&lt;/span&gt;.deb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open the app, set your download folder, and queue your first link. If something breaks, restart — it resumes.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/odm-linux/open-download-manager" rel="noopener noreferrer"&gt;odm-linux/open-download-manager&lt;/a&gt; · Guide: &lt;a href="https://github.com/odm-linux/open-download-manager/tree/main/docs/wiki" rel="noopener noreferrer"&gt;docs/wiki&lt;/a&gt; · Stack: aria2, yt-dlp, HTTrack, curl, Jackett, proxychains-ng, Tor, java-gi.&lt;/p&gt;

&lt;p&gt;What would make you switch download managers — seeding controls, browser handoff, or something else? Tell me in the comments.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>opensource</category>
      <category>gtk</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Open-Finance: Local-first, privacy-focused personal finance application.</title>
      <dc:creator>albilu</dc:creator>
      <pubDate>Sun, 19 Jul 2026 10:06:50 +0000</pubDate>
      <link>https://dev.to/albilu/open-finance-local-first-privacy-focused-personal-finance-application-57gk</link>
      <guid>https://dev.to/albilu/open-finance-local-first-privacy-focused-personal-finance-application-57gk</guid>
      <description>&lt;h2&gt;
  
  
  Building (and Using) a Local-First Personal Finance App with Java 21, Spring Boot, and React
&lt;/h2&gt;

&lt;p&gt;Most personal finance tools force you to choose between "modern but SaaS" (your data on their servers) and "private but dated" (GnuCash-style UIs). This article walks through &lt;strong&gt;Open-Finance&lt;/strong&gt;, an open-source alternative that gives you both: a polished web interface and complete data sovereignty.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Local-First Matters
&lt;/h2&gt;

&lt;p&gt;Financial data is uniquely sensitive. Every cloud finance app is a potential target — and even "anonymous" usage data reveals your net worth, spending habits, and investment strategy. Open-Finance stores everything in a local SQLite database (WAL mode, encrypted), runs entirely on your machine, and never phones home.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture Overview
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;React 19 UI → REST API → Spring Boot Services → JPA → SQLite (encryption at rest)
                              ↓
                    External Integrations
                    (Yahoo Finance, ECB, Ollama)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; Java 21, Spring Boot 3.2, Hibernate/JPA, Flyway migrations, SQLite via Xerial JDBC&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; React 19 + TypeScript 5, Vite, Tailwind 4, shadcn/ui, Radix UI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State:&lt;/strong&gt; TanStack Query (server), Zustand (client), react-hook-form + zod&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI:&lt;/strong&gt; Local Ollama integration — no API keys, no data leakage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Market Data:&lt;/strong&gt; Yahoo Finance wrapper with caching and rate limiting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exchange Rates:&lt;/strong&gt; Daily ECB rate fetch&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Import Pipeline
&lt;/h3&gt;

&lt;p&gt;Support for QIF, OFX, QFX, CSV, JSON, and even Skrooge exports. The import engine includes duplicate detection, per-file account mapping, and an interactive preview so you can see what lands before committing.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Multi-Currency
&lt;/h3&gt;

&lt;p&gt;Transactions support any currency with automatic ECB rate conversion. The dashboard shows consolidated net worth in your base currency with historical trends.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Local AI Assistant
&lt;/h3&gt;

&lt;p&gt;Connected to Ollama, the AI analyzes your actual portfolio and spending patterns — no context window limitations from cloud APIs, and zero data exposure. It can simulate scenarios ("what if I increase my monthly investment by 20%?") against real data.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Rich Financial Instruments
&lt;/h3&gt;

&lt;p&gt;Track stocks, crypto, real estate, vehicles, and liabilities with amortization schedules. Market prices auto-update for tradable assets.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Start
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/openfinance-app/open-finance.git
&lt;span class="nb"&gt;cd &lt;/span&gt;open-finance
&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env
&lt;span class="c"&gt;# Edit JWT_SECRET in .env (or generate with openssl rand -base64 48)&lt;/span&gt;
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;span class="c"&gt;# Open http://localhost:8080 — demo/demo123&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Development Setup
&lt;/h2&gt;

&lt;p&gt;The repo includes a DevContainer with Java 21, Maven, Node.js, and SQLite pre-configured. Open it in VS Code with the Dev Containers extension and you're ready to contribute.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mvn spring-boot:run   &lt;span class="c"&gt;# Backend on :8080&lt;/span&gt;
npm run dev            &lt;span class="c"&gt;# Frontend on :5173&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Comparison to Alternatives
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Open-Finance&lt;/th&gt;
&lt;th&gt;GnuCash&lt;/th&gt;
&lt;th&gt;Finary&lt;/th&gt;
&lt;th&gt;Wealthfolio&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Modern UI&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local-first&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI Assistant&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;QIF/OFX Import&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Encrypted&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-currency&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FOSS&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;The project is on GitHub at &lt;a href="https://github.com/openfinance-app/open-finance" rel="noopener noreferrer"&gt;github.com/openfinance-app/open-finance&lt;/a&gt; under Elastic License v2 — free to self-host and modify.&lt;/p&gt;

&lt;p&gt;If you're interested in the architecture, I've written about specific components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/openfinance-app/open-finance/blob/main/docs/wiki/HOME.md" rel="noopener noreferrer"&gt;Wiki&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Have questions? Drop them in the comments or open a GitHub issue.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>fintech</category>
      <category>ai</category>
      <category>programming</category>
      <category>gnucash</category>
    </item>
  </channel>
</rss>
