<?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: Max</title>
    <description>The latest articles on DEV Community by Max (@iammxfschr).</description>
    <link>https://dev.to/iammxfschr</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%2F3785209%2F651618ac-1f4d-4540-a426-b51a683c9b55.jpg</url>
      <title>DEV Community: Max</title>
      <link>https://dev.to/iammxfschr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/iammxfschr"/>
    <language>en</language>
    <item>
      <title>How I built on-device AI background removal in a native Windows app</title>
      <dc:creator>Max</dc:creator>
      <pubDate>Sat, 20 Jun 2026 11:36:18 +0000</pubDate>
      <link>https://dev.to/iammxfschr/how-i-built-on-device-ai-background-removal-in-a-native-windows-app-5hdp</link>
      <guid>https://dev.to/iammxfschr/how-i-built-on-device-ai-background-removal-in-a-native-windows-app-5hdp</guid>
      <description>&lt;p&gt;Every "remove the background" tool I tried uploads your image to a server first. For a screenshot tool that's backwards — your screenshots are the most private thing on your screen. So I built mine to run 100% on your machine. Here's how — and the honest part: the AI isn't the hard bit.&lt;/p&gt;

&lt;h2&gt;
  
  
  The thing nobody says about "AI background removal"
&lt;/h2&gt;

&lt;p&gt;Most tools that cut out a background send your image to their server, run the model there, and send the result back. Fine for a stock photo. Not fine for a &lt;em&gt;screenshot&lt;/em&gt; — which is usually a half-finished feature, a customer's data, an API key you forgot to blur, or a DM you only meant one person to see. I didn't want any of that leaving the machine. So in ShotsGlow the cutout runs locally, on your own hardware. Nothing is uploaded. There's no server to send it to in the first place.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Demo: the one-click cutout — and the same thing running with the Wi-Fi off — at &lt;a href="https://shotsglow.com/blog/on-device-background-removal-windows" rel="noopener noreferrer"&gt;https://shotsglow.com/blog/on-device-background-removal-windows&lt;/a&gt; )&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest part: the model isn't mine
&lt;/h2&gt;

&lt;p&gt;Let me kill the "proprietary AI" thing right away. The model is &lt;strong&gt;BiRefNet&lt;/strong&gt; — an open background-removal model anyone can download. A handful of other local tools use the exact same one. If I told you the AI was my secret sauce, you'd be right to close the tab.&lt;/p&gt;

&lt;p&gt;The actual work was the unglamorous part: getting that model to run &lt;em&gt;natively inside a Windows app, in the capture flow, with nothing leaving the machine&lt;/em&gt; — and to keep working on a normal person's PC, not just on my dev box.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it actually runs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ONNX Runtime, on the CPU.&lt;/strong&gt; No GPU acceleration — and that's a deliberate, hard-won choice (the next section is the whole story). It runs on the processor every machine already has.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The model downloads once on first run (~890 MB), sized to your PC.&lt;/strong&gt; Instead of shipping one giant file for everyone, the app checks your RAM and pulls the variant that fits — full resolution on a roomy machine, a lighter one on a 4–8 GB laptop — so it runs without choking a modest PC. One chunky download, once; after that it's local forever.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No NPU claims.&lt;/strong&gt; I scaffolded support for the Copilot+ neural chips and then left it switched off, because it isn't shipping yet. What ships is plain CPU. I'd rather under-claim than put a spec on the box that isn't real.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And because there's no server in the loop, it keeps working with the Wi-Fi off (after that one-time download) — same one-click cutout, nothing uploaded, because there's nowhere to upload it to.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part I got wrong first: I shipped it on the GPU
&lt;/h2&gt;

&lt;p&gt;Here's the honest version. I shipped the cutout on the GPU first (via DirectML), with a CPU fallback. It was faster on my machine. Then it broke on other people's: integrated GPUs that hung mid-inference, drivers that handed back a garbled mask, low-memory laptops that simply ran out of RAM. "Fast on mine" is worthless when it's broken on a reviewer's Surface or a customer's five-year-old laptop.&lt;/p&gt;

&lt;p&gt;So I tore the GPU path out and went CPU-only. Slower — a few seconds, more on a weak chip — but it produces the &lt;em&gt;same&lt;/em&gt; result on every Windows machine I could find, down to a 4 GB Atom tablet. Then I made the model adaptive to the machine's memory so the weakest PCs don't choke. "Works everywhere" beat "fast on mine," and it wasn't close.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "local" is also why it's $9 once
&lt;/h2&gt;

&lt;p&gt;Here's the part I didn't see coming. Going on-device didn't just solve privacy — it's the whole reason I can sell this once instead of renting it to you forever.&lt;/p&gt;

&lt;p&gt;Cloud AI means GPU servers. GPU servers mean a bill every month, for as long as anyone uses the feature. The only way to cover that bill is a subscription — which is why every cloud tool eventually starts renting itself to you.&lt;/p&gt;

&lt;p&gt;On-device, &lt;em&gt;your&lt;/em&gt; hardware does the work. No server, so no monthly bill, so I don't have to charge you monthly. The privacy decision and the pricing decision turned out to be the same decision: keep it on your machine, and "$9 once, no subscription" stops being a marketing line and just becomes the math.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you're building the same thing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Download the model on first run and be honest about the size, rather than hiding a ~900 MB surprise — or, if you bundle it, own the installer size. Either way, don't pretend it's small.&lt;/li&gt;
&lt;li&gt;DirectML &lt;em&gt;looks&lt;/em&gt; like the pragmatic Windows path — until you ship it to strangers. On real hardware it's a lottery: integrated GPUs hang, drivers return garbage, low-RAM machines OOM. If the feature has to work for &lt;em&gt;everyone&lt;/em&gt;, CPU-only is more reliable than GPU-fast. (And don't chase the NPU until it's real for enough users.)&lt;/li&gt;
&lt;li&gt;The model is a commodity. The product is everything &lt;em&gt;around&lt;/em&gt; it — the native capture, the editor, redaction that survives a crop, the export sizes. That's where the work, and the actual moat, lives.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;I built this into &lt;strong&gt;ShotsGlow&lt;/strong&gt; — a native Windows screenshot tool that captures, polishes, annotates, redacts and cuts out backgrounds on-device, then exports to 30 social and App-Store sizes. $9 once, no subscription, nothing uploaded. I'm building it in public as a solo Windows dev → &lt;a href="https://shotsglow.com" rel="noopener noreferrer"&gt;shotsglow.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>windows</category>
      <category>ai</category>
      <category>machinelearning</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>I built a self-hosted database GUI because everything else annoyed me</title>
      <dc:creator>Max</dc:creator>
      <pubDate>Mon, 09 Mar 2026 12:22:12 +0000</pubDate>
      <link>https://dev.to/iammxfschr/i-built-a-self-hosted-database-gui-because-everything-else-annoyed-me-2cgg</link>
      <guid>https://dev.to/iammxfschr/i-built-a-self-hosted-database-gui-because-everything-else-annoyed-me-2cgg</guid>
      <description>&lt;p&gt;I've been working with databases for years. PostgreSQL mostly, some MySQL, recently SQLite for smaller projects. And every single time I needed to look at data, I went through the same pain.&lt;/p&gt;

&lt;p&gt;pgAdmin looks like it was designed in 2003 and never updated. DBeaver takes 30 seconds to start because it's built on Eclipse. DataGrip is great but costs $229/year and I don't need a full IDE just to check a table. TablePlus is nice but desktop-only, and $89 per device adds up fast.&lt;/p&gt;

&lt;p&gt;I just wanted something that opens instantly, looks clean, works in my browser, and doesn't send my data to someone else's server. That's it. That's the whole requirement.&lt;/p&gt;

&lt;p&gt;So I built it.&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.amazonaws.com%2Fuploads%2Farticles%2Fgfrkmw3nvk9x67lp0xlc.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.amazonaws.com%2Fuploads%2Farticles%2Fgfrkmw3nvk9x67lp0xlc.png" alt="QueryGlow database GUI showing the query editor and data browser with a PostgreSQL connection" width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What QueryGlow actually does
&lt;/h2&gt;

&lt;p&gt;It's a web-based database GUI you host yourself. You deploy it with Docker, point it at your databases, and access it from any browser. Phone, laptop, tablet, whatever.&lt;/p&gt;

&lt;p&gt;It supports PostgreSQL, MySQL, MariaDB, SQLite, CockroachDB and TimescaleDB. One interface for all of them.&lt;/p&gt;

&lt;p&gt;The features that matter to me:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Safe Mode.&lt;/strong&gt; This was actually the first thing I built. If you've ever accidentally run &lt;code&gt;DELETE FROM users&lt;/code&gt; without a WHERE clause at 2am, you know why. Safe Mode blocks destructive operations by default. DROP TABLE, TRUNCATE, DELETE without WHERE, all blocked unless you explicitly turn it off. For production databases this is non-negotiable.&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.amazonaws.com%2Fuploads%2Farticles%2Fw9xjibaz2s8kk91jisxu.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.amazonaws.com%2Fuploads%2Farticles%2Fw9xjibaz2s8kk91jisxu.png" alt="QueryGlow Safe Mode blocking a destructive DELETE query without WHERE clause" width="800" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SSH Tunnels built in.&lt;/strong&gt; No more opening terminal, running &lt;code&gt;ssh -L 5432:localhost:5432 user@server&lt;/code&gt;, then connecting pgAdmin to localhost. You paste your SSH key, QueryGlow handles the tunnel. It sounds simple but it saves me 5 minutes every single time I connect to a remote database.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI SQL Generation.&lt;/strong&gt; Bring your own API key (OpenAI, Claude, or Gemini). Ask it "show me users who signed up last month grouped by country" and it generates the correct SQL for whatever database you're connected to. It only sees your schema, never your actual data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;EXPLAIN Visualizer.&lt;/strong&gt; This is the feature I'm most proud of. Run any query and see the execution plan as a visual tree. It highlights sequential scans on large tables, disk sorts, wrong row estimates. I built this because reading raw EXPLAIN output in a terminal is pain. Supports all 6 databases with dialect-specific options.&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.amazonaws.com%2Fuploads%2Farticles%2F6vy1904wrmlxzoykd3og.jpg" 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.amazonaws.com%2Fuploads%2Farticles%2F6vy1904wrmlxzoykd3og.jpg" alt="QueryGlow EXPLAIN Visualizer showing a query execution plan as a visual tree" width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monaco Editor.&lt;/strong&gt; Same editor engine as VS Code. Autocomplete for table names, column names, SQL keywords. Syntax highlighting. It feels like writing code, not fighting a textarea.&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.amazonaws.com%2Fuploads%2Farticles%2Fv66p1v18yt6vqrfb1od6.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.amazonaws.com%2Fuploads%2Farticles%2Fv66p1v18yt6vqrfb1od6.png" alt="QueryGlow AI SQL assistant dialog generating a query from natural language" width="800" height="759"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CSV Import.&lt;/strong&gt; Not just "upload and pray". It auto-detects delimiters, lets you map columns, validates everything before committing. Three strategies: INSERT (safe, skip duplicates), UPSERT (update existing), REPLACE (nuke and reload). Shows you exactly what will happen before it happens.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tech
&lt;/h2&gt;

&lt;p&gt;Next.js, TypeScript, Tailwind. Monaco Editor for the query interface. Node.js &lt;code&gt;pg&lt;/code&gt;, &lt;code&gt;mysql2&lt;/code&gt;, and &lt;code&gt;better-sqlite3&lt;/code&gt; drivers. All credentials encrypted with AES-256-GCM at rest. Zero telemetry, zero tracking, zero phone-home.&lt;/p&gt;

&lt;p&gt;Docker deployment takes about 2 minutes. &lt;code&gt;docker compose up&lt;/code&gt; and you're done. There's also a deploy script that handles nginx, SSL, and everything else for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why self-hosted
&lt;/h2&gt;

&lt;p&gt;I work with client databases. Production databases. Databases with real user data in them. There is zero chance I'm routing that through a SaaS provider's servers.&lt;/p&gt;

&lt;p&gt;Self-hosted means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your data stays on your infrastructure&lt;/li&gt;
&lt;li&gt;No vendor lock-in&lt;/li&gt;
&lt;li&gt;GDPR compliance without reading 40 pages of DPA&lt;/li&gt;
&lt;li&gt;Works on any VPS (I use Hetzner, works just as well on DigitalOcean or AWS)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The business side (since this is dev.to and people are curious)
&lt;/h2&gt;

&lt;p&gt;I'm a solo developer. Studied aerospace engineering, dropped out, went back, finished it, worked corporate for a bit, hated it, now I build products from a camper van in Europe.&lt;/p&gt;

&lt;p&gt;QueryGlow is $79 once. Lifetime access, all updates, unlimited users. No subscription. I chose this model because I personally hate paying monthly for tools I use every day. The tool doesn't get worse over time, so why should you keep paying?&lt;/p&gt;

&lt;p&gt;I launched in December 2025. Got 2nd place on Uneed. First sales came in the first week. I've since published 13 blog articles focused on SEO, comparisons, guides, setup tutorials. 10 out of 13 are ranking in Google. The site gets about 12,000 impressions per month now.&lt;/p&gt;

&lt;p&gt;The honest truth: distribution is the hard part. Building the product was the easier half. Getting people to find it, that's where I spend most of my time now.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned building this
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Safe Mode should be the default everywhere.&lt;/strong&gt; The number of horror stories about accidental DELETEs and DROPs is insane. Every database tool should block destructive operations by default. It takes one toggle to turn it off when you actually need it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nobody needs 200 features in a database GUI.&lt;/strong&gt; pgAdmin has feature menus nested 5 levels deep. Most people open a database tool to do 4 things: browse data, write a query, export results, check performance. Everything else is noise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Self-hosted doesn't mean hard to deploy.&lt;/strong&gt; The stigma that self-hosted = complicated is outdated. If you can run &lt;code&gt;docker compose up&lt;/code&gt;, you can deploy QueryGlow. I spent a lot of time making the setup experience smooth because I know the second someone hits a config issue, they bounce.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI in developer tools works when it's optional.&lt;/strong&gt; The AI SQL generation in QueryGlow is useful maybe 30% of the time. Complex joins, window functions, that kind of stuff. But it's completely optional. No AI key? Everything else still works. I hate tools that force AI into every interaction.&lt;/p&gt;

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

&lt;p&gt;There's a live demo on &lt;a href="https://queryglow.com" rel="noopener noreferrer"&gt;queryglow.com&lt;/a&gt; if you want to see it before buying anything.&lt;/p&gt;

&lt;p&gt;If you're tired of pgAdmin's UI, DBeaver's startup time, or DataGrip's subscription model, maybe this is what you've been looking for.&lt;/p&gt;

&lt;p&gt;I'm Max, you can find me on &lt;a href="https://x.com/iamMXFSCHR" rel="noopener noreferrer"&gt;X/Twitter&lt;/a&gt;. Happy to answer questions in the comments.&lt;/p&gt;

</description>
      <category>database</category>
      <category>selfhosted</category>
      <category>webdev</category>
      <category>postgressql</category>
    </item>
  </channel>
</rss>
