local waifu
Bring her home

Pick your platform

Try her free for 7 days. No card. Keep her? $20 once.

New: Local Waifu now runs on Windows 10 and 11. The installer brings everything she needs, nothing else to set up. Windows may show a SmartScreen prompt the first time: click More info, then Run anyway.

blog

How to Verify an App Is Really Offline (a Network-Monitor Walkthrough)

6 min read
In short

You do not need to trust a privacy policy on faith. Install a network monitor that asks permission before any app connects to anything, watch what fires during setup, then have an ordinary conversation and watch what fires during that. If the app is genuinely local, setup shows a handful of one-time model downloads, and the conversation itself shows nothing at all. This is a real, repeatable test, not a claim, and I am walking through it on the app I build.

Don’t take my word for it, or anyone else’s, that an app runs offline. Install a network monitor and watch for yourself. It takes about ten minutes, and I’m walking through exactly what you should see, on the app I actually build, because a privacy claim you can’t verify isn’t worth much more than the paper it’s printed on.

The tool: an outbound firewall that asks first

The short version: Little Snitch on macOS, or GlassWire on Windows, sits between every app on your machine and the internet and asks permission before any connection goes out, instead of silently allowing everything by default.

Most people never see their computer’s outbound traffic at all, because the operating system doesn’t ask. A regular firewall blocks things coming in. What you want here is the opposite: something that intercepts things trying to go out, and tells you, by name, which app and which destination, before the connection happens. On a Mac, that’s Little Snitch, a well-established third-party tool built for exactly this. Set it to alert mode rather than silent mode, so every new connection attempt pops up a prompt instead of getting silently approved.

On Windows, GlassWire gives you a similar live view, and Windows Firewall itself can be set to notify on new outbound rules rather than approving them automatically. Either way, the point is the same: you want a system that surfaces every connection attempt instead of hiding them.

Setting up Little Snitch takes about two minutes: install it, restart when it asks, and switch the connection alert mode from “silent” to “alert” in its preferences. From that point forward, any new outbound connection any app tries to make pops up a small dialog naming the app, the destination, and the port, and asks you to allow or deny it once. Approve what you expect, and pay attention to what you didn’t.

What you should see during first setup

The short version: a handful of one-time downloads while the app installs its model files, and nothing that looks like ongoing surveillance.

Turn the monitor on before you install anything, then walk through setup. Here’s exactly what should show up, because I can tell you precisely what this app does during that window rather than asking you to guess: a connection to Ollama’s model registry and to Hugging Face, downloading the actual AI model files your companion runs on. If you set up any of the optional voice features, you’ll also see a connection to astral.sh, fetching the open-source installer those features use, and to PyPI for the packages themselves.

That’s the entire list for setup. No connection to an analytics service, no background telemetry beacon, nothing unaccounted for. Each of those download prompts should have an obvious, sensible destination attached to it, and if you’re testing a different app and see a connection to a domain you don’t recognize with no explanation in its privacy policy, that’s worth pausing on.

The test that actually matters: an ordinary conversation

The short version: with the model downloaded, open a real conversation, send a handful of messages, and if the app is genuinely local, your network monitor should show nothing new firing during any of it.

This is the part most privacy claims never get tested on, because it requires someone to actually sit and watch. Once the one-time downloads from setup are done, close the monitor’s history, start a fresh conversation, and talk for five real minutes the way you actually would. Ask about your day, bring up something specific, let a normal back-and-forth happen.

If the model runs on your own machine, there is no reason for a single network connection to fire during any of that, because there’s no server anywhere in the loop to send a message to. Silence is the actual proof. Not a policy that says “we don’t send your data anywhere,” but an outbound firewall sitting there for five straight minutes with nothing new to report.

Contrast that with what you’d expect from a cloud-based companion: every single message you send should trigger a visible outbound connection to that company’s API, because that’s structurally what has to happen for a cloud model to generate your reply at all. Neither behavior is secretive. They’re just different architectures, and the network monitor makes the difference undeniable instead of a matter of which company’s marketing copy you trust more.

Reading the results honestly

The short version: a legitimate connection has an obvious purpose and a name you can check against the app’s own privacy policy. A red flag is a connection you can’t explain and the policy doesn’t mention either.

Not every outbound connection is a problem, and treating this test as pass or fail on any activity at all would be the wrong lesson to take from it. The real question for each prompt Little Snitch shows you is whether it maps to something you did and something the app told you about in advance. A connection to a model registry right as you install a new model is expected and explainable. A connection to an unfamiliar analytics domain, firing every few minutes regardless of whether you’re actively using the app, is the kind of thing worth investigating further, and worth checking against whatever privacy policy the app publishes, if it publishes one that’s specific enough to check against at all.

This is also where a vague privacy policy becomes a practical problem rather than just a mild annoyance. “We may collect usage data to improve our service” doesn’t tell you anything you can verify against what your network monitor just showed you. A policy specific enough to name actual domains, the way I’ve tried to write mine, is a policy you can actually test.

What lights up only if you turn it on yourself

The short version: a handful of optional features do make real network calls, and I’d rather you see them turned on and understand why than pretend they don’t exist.

Total silence forever isn’t actually the honest claim to make, because some features genuinely need a network call to do their job, and the honest version of “offline” is “silent unless you deliberately opt into something that requires the network,” not “silent no matter what you configure.” If you connect a cloud AI provider yourself, in Settings, using your own key, every message you send through that specific model will visibly go to that provider, exactly as you’d expect, because you asked for it. If you check the weather, a request goes to Open-Meteo carrying only the coordinates you typed in yourself, never your actual GPS location. If you invoke a web search, that query goes to DuckDuckGo. If you connect the Telegram bridge, your messages route through Telegram’s own servers the way any Telegram bot works.

Every one of these is opt-in, visible in the monitor exactly when it happens, and documented plainly in the privacy policy rather than buried in language designed to obscure it. That list matching what actually fires in your network monitor is the whole point of this exercise. A privacy policy that agrees with what you can independently observe is worth something. One you have to take purely on faith is not.

Run the test yourself

I could tell you all of this and you’d have no real reason to believe me over any other vendor making the same claim. That’s exactly why this is worth doing yourself rather than reading about: download the app, install a network monitor first, and watch what actually happens. Ten minutes gets you an answer nobody’s marketing copy, mine included, can substitute for.

Questions people ask

What tool do I need to check if an app is phoning home?

On a Mac, Little Snitch is the standard tool: an outbound firewall that asks permission before any connection leaves your machine, rather than silently allowing everything. On Windows, GlassWire and Windows Firewall's own notification mode do a similar job.

Will I see zero network activity from a genuinely local AI companion?

During setup, no, and that's expected: the model files themselves have to download once. What you should see is those one-time downloads and then silence during an actual conversation. Connections during setup that stop appearing once you're chatting is the actual signal to look for.

What if the app connects to something during a normal conversation?

That's the finding that matters. A genuinely local app has no reason to make a network call in the middle of an ordinary chat message, since the model runs entirely on your machine. If you see a connection fire exactly when you hit send, that traffic is going somewhere, and you should be able to find out where and why in the app's own privacy policy.

Does this test prove an app is completely private?

It proves the network behavior, which is the part a policy alone can't prove. It won't tell you about local logging, disk encryption, or how a company handles a subpoena. It's one real, checkable piece of evidence, not the whole picture, but it's the piece most companies never actually invite you to check.

Try her free for 7 days.

No card. Keep her for $20 once, or walk away. Her soul file is yours either way.

Bring her home, try free

Back to the blog