<?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;p&gt;I got tired of handing my bank credentials to hosted finance apps.&lt;/p&gt;

&lt;p&gt;Finary, Monarch, Maybe — great dashboards, but your most sensitive data lives on someone else's server, export is painful, and bank-file import is an afterthought. Desktop tools like GnuCash, HomeBank, and Skrooge keep data local, but feel stuck in 2005.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;Open-Finance&lt;/strong&gt;: a local-first personal finance manager. All your accounts, assets, liabilities, and transactions in one secured dashboard — that you self-host.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; Java 21 + Spring Boot + SQLite (WAL) + Flyway on the backend, React 19 + TypeScript + Vite + Tailwind 4 + shadcn/ui on the frontend. Licensed Elastic v2 — free to self-host and modify.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/openfinance-app/open-finance" rel="noopener noreferrer"&gt;https://github.com/openfinance-app/open-finance&lt;/a&gt;&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%2Ffxnbbrn1vmpl1wike1l4.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%2Ffxnbbrn1vmpl1wike1l4.png" alt="Open Finance Dashboard" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Open the dashboard and you immediately know where you stand: net worth, cash flow, budget health, portfolio movement — then act in seconds.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dashboard:&lt;/strong&gt; customizable card grid (layout persisted in localStorage), privacy eye-toggle to mask amounts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accounts &amp;amp; institutions:&lt;/strong&gt; multi-currency, multi-institution, base + secondary currency conversion&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transactions:&lt;/strong&gt; income / expense / transfer, splits, tags, attachments, global search, auto-categorization rules, recurring transactions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assets &amp;amp; market data:&lt;/strong&gt; portfolio tracking with Yahoo Finance + ECB rates refresh&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Liabilities &amp;amp; real estate:&lt;/strong&gt; amortization schedules, property management — things hosted PFAs charge extra for&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Budgets:&lt;/strong&gt; monthly budgets with alerts and progress&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Import that actually works:&lt;/strong&gt; QIF / OFX / QFX / CSV / JSON wizard with duplicate detection and rule application&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Undo / redo + full audit history:&lt;/strong&gt; every operation is reversible, with backup / restore&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Planners:&lt;/strong&gt; FIRE, compound interest, loan, buy-vs-rent, early payoff calculators&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Financial news + AI assistant (opt-in):&lt;/strong&gt; RSS news feed, floating chat + generated insights powered locally by Ollama via LangChain4j — no data leaves your box&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bilingual EN/FR:&lt;/strong&gt; every string exists in both locales, enforced by tests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How it compares to the usual suspects:&lt;/p&gt;

&lt;p&gt;Full dashboards, QIF/OFX import, real-estate mgmt, file attachments, undo/redo, financial planning, multi-currency, local AI, and client-side encryption — while staying FOSS and self-hosted.&lt;/p&gt;

&lt;p&gt;Full user guide: &lt;code&gt;docs/wiki/HOME.md&lt;/code&gt; in the repo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Privacy is the feature
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Self-host with Docker — SQLite file you can back up, no vendor DB.&lt;/li&gt;
&lt;li&gt;JWT auth + session-scoped encryption key (&lt;code&gt;X-Encryption-Key&lt;/code&gt; header from &lt;code&gt;sessionStorage&lt;/code&gt;). Server never sees plaintext amounts.&lt;/li&gt;
&lt;li&gt;AI is 100% optional via &lt;code&gt;docker compose --profile ai&lt;/code&gt; (Ollama ~4.7GB + SearXNG). No AI calls unless you enable it.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Run it in 60 seconds
&lt;/h3&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;# Generate JWT secret (min 32 chars)&lt;/span&gt;
&lt;span class="nv"&gt;JWT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;openssl rand &lt;span class="nt"&gt;-hex&lt;/span&gt; 32&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt;.bak &lt;span class="s2"&gt;"s|^JWT_SECRET=.*|JWT_SECRET=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;JWT&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;|"&lt;/span&gt; .env &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;rm&lt;/span&gt; .env.bak

docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;span class="c"&gt;# Open http://localhost:8080&lt;/span&gt;
&lt;span class="c"&gt;# demo user: demo / demo123 or register a new account&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With local AI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose &lt;span class="nt"&gt;--profile&lt;/span&gt; ai up &lt;span class="nt"&gt;-d&lt;/span&gt;
docker compose &lt;span class="nt"&gt;--profile&lt;/span&gt; ai &lt;span class="nb"&gt;exec &lt;/span&gt;ollama ollama pull qwen2.5:0.5b
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dev setup (DevContainer recommended — Java 21, Maven, Node 20, SQLite preconfigured):&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 :8080, swagger at /swagger-ui.html&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;openfinance-ui &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm run dev  &lt;span class="c"&gt;# frontend :3000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;API is straightforward REST:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://localhost:8080/api/v1/auth/register &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"username":"alice","email":"alice@example.com","password":"MyP@ss1!","masterPassword":"MasterP@ss1!"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;GET /api/v1/dashboard&lt;/code&gt;, &lt;code&gt;/api/v1/accounts&lt;/code&gt;, &lt;code&gt;/api/v1/transactions?accountId=...&lt;/code&gt;, &lt;code&gt;/api/v1/assets&lt;/code&gt;, &lt;code&gt;/api/v1/budgets&lt;/code&gt;, &lt;code&gt;/api/v1/reports/net-worth&lt;/code&gt;, &lt;code&gt;POST /api/v1/import/upload&lt;/code&gt;, &lt;code&gt;POST /api/v1/ai/chat&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Why this stack?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SQLite WAL + Flyway:&lt;/strong&gt; zero-ops for self-hosters, &lt;code&gt;busy_timeout=10000&lt;/code&gt; for writer contention, migrations run on startup. Postgres driver included for cloud deployments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spring Boot:&lt;/strong&gt; interfaces + impls, constructor injection, MapStruct, &lt;code&gt;BigDecimal&lt;/code&gt; everywhere for money, &lt;code&gt;@ControllerAdvice&lt;/code&gt; error DTOs, Bucket4j + Caffeine rate-limit/cache.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React 19:&lt;/strong&gt; TanStack Query for all server state, Zustand for UI state, react-hook-form + zod, axios &lt;code&gt;apiClient&lt;/code&gt;, Recharts, react-grid-layout.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quality gates:&lt;/strong&gt; JaCoCo (66% line), SpotBugs, OWASP Dependency-Check, Spotless Google-Java-Format, Vitest + Playwright + ESLint + Prettier + &lt;code&gt;tsc --noEmit&lt;/code&gt;. Backend + frontend CI on SQLite, Postgres, and browser.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Current version is &lt;code&gt;0.4.0-beta&lt;/code&gt;. If you do bank-file imports, multi-currency, or self-hosting — I'd love your harsh feedback.&lt;/p&gt;

&lt;p&gt;Bug reports and feature requests → GitHub Issues. If you want to contribute, start with &lt;code&gt;CONTRIBUTING.md&lt;/code&gt; — architecture, API reference, i18n workflow, and Conventional Commits (&lt;code&gt;feat(scope): ...&lt;/code&gt;) are all documented.&lt;/p&gt;

&lt;p&gt;Own your ledger. Self-host your net worth.&lt;/p&gt;

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