contextIsolation: true
The page's JavaScript runs in its own context, separated from the preload bridge. Nothing loaded into the window can reach into the privileged side and rewrite it.
Meezan ERP POS is a desktop application that makes no network calls. The database is one file on your disk, there is no server component to reach it through, and nothing is uploaded, synced or reported anywhere. This page sets out exactly how that is enforced, so you can check it rather than take our word for it.
This is not a privacy policy promising restraint. It is an architectural fact about the build: there is no code path that talks to a remote host, because the application does not contain one.
There is no server for the interface to talk to — the renderer calls straight into the Electron main process over an in-process IPC bridge, which reads and writes one JSON file in your own user-data folder. Renderer, bridge, file: that is the entire data path, and none of it touches a network interface.
The practical test is the honest one: unplug the network cable, disable the wireless adapter, and keep trading. Nothing degrades, nothing queues up waiting to sync and no feature quietly stops working, because none of them ever depended on a connection. A restaurant with a dead internet line still takes payments, prints kitchen tickets and closes its shift.
Most of what goes wrong with restaurant software is not a breach. It is a dependency you did not know you had. These are the ones we removed by design.
Meezan runs inside Electron, and every one of Electron's dangerous conveniences is switched off. This is the verified posture of the shipped build.
contextIsolation: trueThe page's JavaScript runs in its own context, separated from the preload bridge. Nothing loaded into the window can reach into the privileged side and rewrite it.
nodeIntegration: falseThe interface has no access to Node's APIs. There is no require
to reach for, so a stray script has nothing powerful to call.
sandbox: trueThe renderer process runs inside the operating system's sandbox with the same restrictions a browser tab gets. Escaping it is the hard problem, not the easy one.
A Content-Security-Policy is set on every response the embedded server returns — not on the entry page alone. Nothing may be pulled in from outside the application bundle.
The window cannot be navigated away to another origin, and it cannot open a new application window. Both are intercepted before they happen rather than cleaned up afterwards.
Camera, microphone, geolocation, notifications — every permission request is refused. A point-of-sale system has no business asking where your restaurant is.
A link to the outside world is handed to your default browser, where it belongs. It never loads inside the application window, so nothing external is ever rendered next to your ledger.
There is no embedded server at all. The interface talks to the main process over a synchronous IPC bridge — a direct in-process call, not a network request — so there is no listening port for another machine to discover, let alone reach.
This is the one worth reading twice. The interface has no ability to touch the filesystem at all. Every file operation — an export, a backup, a printed PDF — goes through the narrow IPC bridge (one file, read/write/clear) or a native save dialog you click yourself. There is no path for the renderer to read or write an arbitrary file, so there is no path for anything running in it to do so either.
Picking a different account and entering that account's password is what changes who the app treats as signed in. Read this plainly: passwords in the database are stored as entered, not hashed — see Where the honesty stops below.
This is a single-user desktop application, not a multi-tenant service — there is no separate server tier to enforce a role independently of the interface. Read this section as what the app does, not as a claim that a modified copy of the app could not be made to do otherwise.
Everyone works under their own named account. Switching to a different one on the same machine asks for that account's password before the view changes.
Admin, Accountant and Viewer, as a label on each account. Give each person the role that best describes their job.
A malformed number, an unbalanced entry or a posting to an account that does not exist is refused
before it reaches the ledger — checked in the app's own posting logic, the same logic every screen
shares, rather than left to become NaN somewhere inside a report.
This is the control that matters most in an accounting system, and it is the one most often missing. A posted journal entry is immutable. To correct a mistake you post a reversal, then post the correct entry. The original stays in the journal, the reversal stays next to it, and anyone reading the books afterwards can see precisely what happened and when.
Two related rules are enforced the same way: an unbalanced entry is rejected outright, and a posting to an account that does not exist is rejected — both checked before anything is written, not caught afterwards by a report that happens to notice.
admin123 — are stored and compared as plain text, not through bcrypt or
any hashing algorithm. On a single-user desktop machine that only you have a login for, this matters far
less than it would on a shared server; it still matters if this machine is ever shared, and it is why the
first thing to do after installing is change the admin password and treat this machine's own login the way
you would any other machine that holds your books.
There is no proprietary vault and no encrypted blob only we can open. Your books are a database file and a plain export, in folders you can open in your file manager right now.
| Platform | Location |
|---|---|
| Windows | %APPDATA%\Meezan ERP POS\ |
| macOS | ~/Library/Application Support/… |
| Linux | ~/.config/… |
On a throttle, the database is mirrored to
Documents/Meezan ERP Restaurant/. Plain, human-readable files: the latest export, dated
snapshots and a copy of the database.
That folder is untouched by an uninstall. Remove the application completely, reinstall it months later, and your books and your activation are both still there waiting. It is also the folder to copy onto a USB stick and take out of the building each week, because a backup that lives in the same room as the computer does not survive the same fire.
.bak is kept beside the primary file.A licence check is a security mechanism, so it is worth explaining rather than hiding. Ours is offline, node-locked and cryptographically signed.
Activation uses Ed25519 signatures. Only the public key ships inside the application — the private key never leaves us, so an activation cannot be forged or extended by anyone holding a copy of the software, including us on a machine we were never asked about.
The signed message is machineCode|expiry. Both halves matter. The
machine code is derived from a stable hardware identifier on that computer, so a code issued for one
machine is meaningless on another. The expiry is inside the signature, so changing a single character
of the date breaks it.
The machine code is shown to you in the activation window in the form
MZR-DE07-EB9C-0099-17AA-7118. You send it to us; we return an activation code shaped as
<YYYY-MM-DD>.<base64 signature>; you paste it in. That is the entire
exchange.
Correctness in an accounting system is a security property. A build that quietly stops balancing costs you more than a build that quietly stops starting.
Three suites run before every release: persistence (durable writes, backup and restore), the Electron-adaptation regression suite, and the licensing module. Nothing here is mocked — the persistence tests write and read real files on disk.
Inside that suite, the parts most likely to be wrong quietly are checked against a worked example with a known answer: FIFO/weighted-average costing, cost-centre and combined-statement arithmetic, the approval engine's posting gates, POS-session cash-over/short, and batch/lot FEFO consumption. A change that breaks the maths fails the build, not just a smoke test.
A separate Electron integration smoke test boots the packaged application in a hidden window and probes it for a live render, a working IPC round-trip and zero console errors — not just the source running under a development process, which is where this class of bug likes to hide.
The CSV/paste importer for opening balances and invoices parses and shows a preview — balanced and unbalanced counts, accounts that do not yet exist — before anything is written, so what is about to change is checked by eye rather than assumed.
If you believe you have found a security issue in Meezan ERP POS, please tell us before you tell anyone else, and give us the chance to fix it.
Write to finance@northbeam.sa with the version you are running, your operating system, and the steps to reproduce what you found — the reproduction is the part that turns a report into a fix. Screenshots and the contents of File ▸ Open Log Folder help. Please do not include a password or a customer's personal data in the report; we do not need either.
We will reply within one business day, which is the same response target as ordinary support, and we will tell you plainly whether we can reproduce it and what we intend to do. We will not ask you to sign anything before we take the report seriously.
One installer, one database file, no account and no connection. Install it and check every claim on this page for yourself.