- Simpler Tax
- Offline accounting software, 0 outbound
Free accounting software that works offline and uploads nothing: what "0 outbound" means, and how to check it
Simpler Tax is a free Windows desktop app that keeps a Singapore Pte Ltd's accounts in one file on your own machine and prepares its ECI, Form C-S and GST F5 for you to file. It makes no outbound network connection: the vendor states that every network route out of its engine is wrapped, that any attempt is refused and counted, and the count sits in the corner of the window, where it reads 0 outbound.
You can check it in a minute. Block Simpler Tax in Windows Firewall, then use it. Nothing changes, not even reading a photographed receipt, because the OCR data ships in the installer.
About the product, as the home page states it Edition YA-2027 · sources verified through 24 Jul 2026
What "0 outbound" means
The foot of the app's navigation rail carries one line: on-device · 0 outbound. The number is a count, kept by the engine itself, of connection attempts aimed off this machine since the engine started. The window reads it from the engine and paints it; it is not a setting, and not a promise printed once.
The count works like this. The home page says "Every network route out of the engine is wrapped." What the code shows is where the wrap sits: when the engine starts, before any other part of it loads, its main thread wraps the three routes a program on that thread can use to reach the network:
| Route | What happens to an attempt |
|---|---|
| fetch | Wrapped. A target off this machine is refused with a message naming the host, and counted. |
| http and httpsrequest and get | Wrapped the same way. |
| The raw socketunderneath both | Wrapped, so on this thread a library holding its own HTTP client still ends at a wrapped connect. |
| 127.0.0.1, ::1, localhost | Allowed. That is the window talking to the engine on the same machine, not egress. |
Zero means nothing on that thread tried. The guard is installed the moment the engine's first module loads, ahead of every other dependency, so a library that phones home from that thread while it is being loaded is caught too. The total is never trimmed: the engine keeps only a short tail of recent attempts, so a dependency stuck in a retry loop cannot turn the instrument into a leak, but the count only goes up.
The licence, clause 6, puts the promise in one sentence: "If it ever reads anything but zero, something we did not intend has happened, and you will see it before we do." The engine's own source is plainer still about what the counter is and is not: "This is deliberately NOT a security boundary. A determined dependency could reach past it. It is an honesty instrument: it makes an accident loud." A determined dependency could reach past it; what the counter guarantees is that an accident on that thread cannot happen quietly.
Two parts of the engine run outside that thread, and the counter does not see them. The OCR library runs in a worker thread of its own, and the snapshot that copies the company file runs in a child process that loads the database library and nothing else. The licence names the first: some bundled components carry HTTP client code of their own, and the OCR library is written to fetch its language data from a CDN. The vendor gives it that data on disk inside the installer instead; the code hands the library a folder on the machine, never a URL, and tells it to keep no cache anywhere else, so the library has nothing to fetch. That is the firewall test's job, not the counter's, and it is why the home page's test names a photographed receipt.
The sixty-second check with Windows Firewall
The home page states the test in two sentences: "Block Simpler Tax in Windows Firewall, then use it. Nothing changes, not even reading a photographed receipt, because the OCR data ships in the installer." In order:
- Block it. In Windows Firewall, add an outbound rule that blocks the program. The installed app is two programs, and a firewall rule names one, so add a rule for each: the window, Simpler Tax.exe, and the engine it starts beside itself, simpler-tax-engine.exe. Both names are in the vendor's own third-party notices, and the app's configuration ships the engine as a separate binary.
- Use it. Open the company file, drop a PDF or a photographed receipt in and let it read it, open the Tax screen and look at a pack. Nothing changes.
- Read the rail foot. It still says on-device · 0 outbound.
The two halves check different things. The firewall block shows the app needs nothing from outside to do its work, OCR included; that half covers the OCR library's own thread, which the counter does not see. The counter shows that nothing on the engine's main thread tries: an attempt there is refused inside the engine before it reaches Windows, so the reading does not depend on the rule, and it should be zero with the rule on or off.
The counter reads what has been attempted since the engine started, and its tooltip says so. To read it over a working day, leave the app open.
Three limits, stated by the vendor
The vendor states three limits beside the claim, and this page repeats them rather than leaves them out.
| Limit | What the vendor states |
|---|---|
| Closed source | The code is not published. The vendor's position is that the counter and the firewall test replace source auditability: the claim is measured on your machine rather than audited by reading. |
| WebView2 | The window is drawn by Microsoft Edge WebView2, a Windows component that performs its own telemetry and update checks according to your Windows settings, outside the app and outside its counter. Your books, figures and documents are not in that traffic. |
| The installer, once | If Windows has no WebView2 at all, the installer fetches Microsoft's copy once. After that, nothing. |
On the WebView2 row, the app's configuration starts the window with switches named --disable-background-networking, --disable-component-update, --disable-sync, --disable-breakpad and --no-pings, among others, and its content security policy lets the window connect only to itself and to the engine at 127.0.0.1:5174. The vendor still lists WebView2 as outside the counter and outside its control: the component is Microsoft's, and a switch passed to it is a request, not a measurement.
The web page you are reading fetches nothing from any other host either: no hosted fonts, no analytics, no cookies. View source.
Where the books live
In one company file. It is an ordinary SQLite database in a folder you chose, on a machine you control, and the documents you scan or import stay beside it. You can copy it, back it up, or keep it on an encrypted disk.
What goes into it: Peppol / InvoiceNow XML, bank statement CSV, spreadsheets (.xlsx / .ods), PDF invoices and receipts, and photographs of receipts read by OCR on the machine. Every figure is read off the document and re-added; what holds posts itself as double-entry, and anything else is held as one question for you.
The app takes a snapshot at every launch and every thirty minutes. If a crash or a bad restore hands it a smaller file, it says "some recent work could not be recovered", never a quietly smaller set of books. Uninstalling leaves the company file and its backups on disk.
Nothing goes to IRAS from the app either. It prepares the numbers for ECI, Form C-S and GST F5 with a copy button on every box it computes; you type them into myTax Portal and sign with your own Corppass. It holds no credentials and has no route to the portal. See filing Form C-S on myTax Portal step by step.
Free, and what that covers
Always free: no account, no email, no trial. The vendor states that other Simpler apps will cost money someday and this one will not. It runs on Windows 10 and 11 on x64 today; macOS is described as on the way, with no date given.
The installer is Simpler-Tax_1.0.0_x64-setup.exe · 55 MB · not signed yet. The vendor's code-signing certificate is still being issued, so the 1.0.0 build is not signed and Windows SmartScreen warns "Windows protected your PC", publisher unknown; that warning reports the absence of a certificate, not something found in the file. Verify the download by its SHA-256, printed at the foot of the home page, and get it from simpler.tax typed into the browser yourself, never from a forwarded link. See what Simpler Tax is, plainly.
Download it, block it, and watch the counter
Install it, open a company file, and look at the foot of the rail: on-device · 0 outbound. Then add the firewall rules and carry on working. The app is free, needs no account, and sends nothing to anyone; the counter is there so that you do not have to take that sentence on trust.
Download for WindowsQuestions people ask
Does Simpler Tax upload my accounts anywhere?
No. The vendor states it never receives your data and could not if it wanted to, and the licence puts it as a term: "The Software makes no outbound network connection. Its engine listens only on 127.0.0.1 and speaks only to the application on the same machine." On the engine's main thread every attempt to reach further is refused and counted on the on-device · 0 outbound line in the window; the OCR library, which runs in a thread of its own, is kept offline by its language data shipping in the installer, which the firewall test covers.
Do I need an internet connection to use it?
Not to use it. The books, the OCR of a photographed receipt and the tax packs all work with the app blocked in Windows Firewall, because the OCR language data ships in the installer. You need the internet for two things outside the app: filing the prepared figures at myTax Portal yourself, since the app files nothing, and, only if your Windows has no WebView2 at all, the installer fetching Microsoft's copy once.
What does the counter show if something does try to connect?
A count above zero in the same corner, with a tooltip naming the most recent attempt by route and host and ending "Nothing left this machine." The attempt was refused inside the engine before it went anywhere. The licence puts it this way: "If it ever reads anything but zero, something we did not intend has happened, and you will see it before we do."
Is it open source, so I can read the code myself?
No, the source is closed. The vendor's position is that the counter and the firewall test replace source auditability; the engine's own source gives the reason, that almost nobody can audit a codebase and anybody can read a number that is supposed to be zero, and says of the counter: "This is deliberately NOT a security boundary. A determined dependency could reach past it. It is an honesty instrument: it makes an accident loud."
What about the WebView2 traffic?
The window is drawn by Microsoft Edge WebView2, which performs its own telemetry and update checks according to your Windows settings, outside the app and outside its counter. The vendor states that nothing about your books, your figures or your documents is included in that traffic. The app starts WebView2 with switches named --disable-background-networking, --disable-component-update, --disable-sync, --disable-breakpad and --no-pings, and its content security policy lets the window connect only to itself and to the engine at 127.0.0.1:5174; the vendor still lists WebView2 as outside the counter.
If I install the model, does anything go to a server?
No. The app bundles no model and downloads none; there is nothing there out of the box. A shared Simpler model you install separately runs on your own machine and is reached over the loopback address, which never leaves it, and the counter treats a route off the machine the same way whether a model asked for it or not. What the model is allowed to do at all, which is to propose identity fields and one cost category on a held document and never an amount, is a question about scope rather than about the network.
Sources
This page carries no statutory figure, so it was computed from no rulebook entry. Everything below is what it was written against. The build is edition YA-2027, sources last checked 24 Jul 2026.
- This page holds no statutory figure and rests on no rulebook entry or IRAS page. Its sources are the vendor's own site texts and the code files below, each read at build time on 9 Sep 2026; the build refuses if a sentence quoted here is no longer in its source.
- Simpler Tax home page: "Where your books live", "Four things it does not do" and the footer
https://simpler.tax/ - The licence, clause 6 (Network)
https://simpler.tax/eula.txt - The privacy statement, section 3 (The application)
https://simpler.tax/privacy.txt - The briefing for an AI: the Privacy section and the OUTBOUND rule
https://simpler.tax/llms.txt - The website terms, section 4 (The download): the forwarded installer
https://simpler.tax/terms.txt - The third-party notices, section 1 (the engine runtime, shipped as simpler-tax-engine.exe) and section 3.5 (the WebView2 process tree under Simpler Tax.exe)
https://simpler.tax/third-party-notices.txt - The engine's egress guard, app/engine/egress.mjs, read at build time: the three wrapped routes, the loopback allowance, the untrimmed count, the honesty-instrument comment, and that it reaches no worker or child
- The engine's entry file, app/server.mjs, read at build time: the guard is its first import, and the snapshot copy is a forked child
- The OCR lane, app/ingest/image-scan.mjs, and the resource manifest, app/resources.mjs, read at build time: the worker thread, the language data as a folder on disk, no cache, and the boot preflight that proves the file arrived
- The snapshot child, app/db/backup.mjs, read at build time: its only import is the database library
- The window, app/src/main.mjs, read at build time: the rail-foot line and its tooltip
- The window configuration, app/src-tauri/tauri.conf.json, read at build time: the WebView2 switches, the content security policy, the engine shipped as a separate program