Most POS software is a monthly subscription that stops working when the internet does. ShopDesk runs on the counter, offline, with the shop's data in one…
Most point-of-sale software is a subscription. That means two things a small shop
feels sharply: a bill every month whether trade is good or not, and a till that
stops working when the internet does.
The second one is the real problem. A shop with no internet still has customers
in it. A cloud POS that cannot reach its server on a Saturday afternoon is a shop
that cannot sell anything.
ShopDesk runs on the counter. No account, no activation, no
monthly fee, and it does not need a connection at all. The shop's entire history
lives in one SQLite file on that computer.
Scan a barcode, or type a few letters and press Enter to take the top match.
Type 3*cola to add three at once. Cash, card, mobile money or bank transfer,
with change worked out as you type what the customer handed over — plus
quick-cash buttons so the common case is one key.
A sale can be held and picked up later, for when someone goes back for the
milk they forgot. One-off lines cover things that were never in the catalogue: a
delivery charge, a photocopy. Discounts work whole-sale or per line, and are
spread across the lines so tax and refunds stay correct afterwards.
It is keyboard-first, because a till that needs a mouse is slower than the queue:
F1 search, F2 customer, F3 discount, F9 charge, Del remove
line. A cash sale for a walk-in is a scan and one key.
This is the design decision I would defend hardest.
Most small-shop software stores a quantity and edits it. You had 40, you sold
one, now you have 39. When the shelf and the screen disagree — and they always
eventually disagree — there is nothing to look at. Just a number that is wrong.
In ShopDesk every unit that moved has a row saying why it moved: a delivery
received, a count corrected, damage written off, a return put back, a sale, a
voided sale. When the count is wrong you read the history and find the moment it
went wrong, instead of guessing and overwriting.
Products carry a barcode, SKU, category, cost and selling price, and a low-stock
level. Things can be sold by the piece, the kilo or the litre — 1.5 kg is a
real quantity rather than a rounding problem.
Every shop eventually has a stock discrepancy. The shelf says eleven, the system
says fourteen. With a stored quantity, your options are to guess or to overwrite,
and overwriting destroys the only evidence of what went wrong.
With a ledger you can read the last month for that product and find it: three
were received on the 12th but the delivery was entered twice, or a return was
processed without the stock going back. You fix the cause rather than the symptom,
and the correction is itself a row — so next month's audit can see that a
correction was made, by whom, and why.
This is the same reason accountants have never used a single "balance" column.
It is not an advanced feature; it is the correct data model for anything that
moves, and most small-shop software gets it wrong because a quantity field is
easier to build.
Walk-in is the default. Attaching a customer is optional and never required,
because most sales do not need one.
For the ones that do: a sale can go on the book, payments collected against
the balance later, and each customer can have a credit limit. Every customer has
a statement — what they bought, what they paid, what is still owed. For any shop
that lets regulars settle at the end of the month, that ledger is the thing a
spreadsheet keeps getting wrong.
If your shop lets regulars settle at the end of the month, you almost certainly
have a paper book or a spreadsheet for it. Both fail the same way: the record of
what was bought lives in one place and the record of what was paid lives in
another, and reconciling them is somebody's Sunday.
Putting credit in the same ledger as the sale means a customer statement is a
query rather than an exercise. What they bought, what they have paid, what is
outstanding, in order. When a customer disputes a figure — and they will — you
can show them the line items rather than a total they have no reason to accept.
The credit limit is the other half. A limit that the till enforces at the moment
of sale is a policy; a limit written in a notebook is a hope.
Thermal receipts on 80mm or 58mm rolls, through any printer Windows already
knows about. A4 PDF invoices with your logo for customers who need a document.
Every list exports to Excel.
A dashboard of net sales, gross profit, best sellers and how people paid. A
day close that says what the till should hold and compares it against what
you counted. Low stock, unpaid balances and lines that have not sold in a month
are surfaced without being asked for — the things you would otherwise notice late.
Admin and cashier roles: a cashier can sell but cannot change prices or see
profit. Backups are one click and restore works from any of them.
At the end of trading, the system knows exactly what the till should contain:
opening float, plus cash sales, minus cash refunds and payouts. You count the
drawer and enter what is actually there.
The difference is the number that matters. A shop that closes off every day
catches a discrepancy the day it happens, while somebody still remembers the
transaction. A shop that reconciles monthly finds a variance across four weeks of
trading and has no way to attribute it.
It takes two minutes and it is the single highest-value habit a small shop can
adopt.
One SQLite file in %LOCALAPPDATA%\ShopDesk, on the shop's own computer. It
never leaves.
There is no cloud account to lose access to, no subscription that can lapse and
lock the till on a Saturday morning, and nothing to migrate if you stop using it.
If you want it on another machine, copy the file.
Local-first is not strictly better than cloud. It is a different set of
trade-offs, and you should pick deliberately:
What you gain. It works with the internet down. It has no monthly cost. It
cannot be discontinued, price-raised, or locked behind a plan change. Your data
is a file you own rather than rows in somebody's database. It is fast, because
nothing is a network call.
What you give up. Multi-site sync out of the box. Remote access from home.
And — the important one — backups are your responsibility. A cloud POS backs
itself up. This one gives you a one-click backup and it is on you to actually
take it, and to keep a copy somewhere that is not the same computer.
If your shop has one till and one computer, the trade is straightforward. If you
have four branches that need to share stock, you want something else, and I would
rather say so than sell you the wrong thing.
Take a backup weekly and put it on a USB stick. That is the whole
responsibility, and it is the one thing that turns "my data is a file I own" from
a liability into an advantage.
Windows SmartScreen will warn about an unsigned application — choose **More
info, then Run anyway**. That warning means Microsoft has not vetted this
particular build, not that anything is wrong with it. Code-signing certificates
cost several hundred pounds a year, which a free app cannot justify.
The full source is on GitHub if you would rather read it or build it yourself.
Download ShopDesk — free, MIT licensed, Windows 10 or
later. There is an installer that adds a Start-menu entry and uninstalls cleanly,
and a portable single file that runs from a USB stick.
On macOS and Linux it runs from source — Python 3.10 or newer, and the
instructions are in the repository.
Nothing exotic is required, which is deliberate:
nearly all of them. No driver, no configuration; it types the barcode and
presses Enter, which is exactly what the search box expects.
58mm rolls.
as the printer does.
application, and an old machine behind a counter is fine.
If you already have a till running something else, the hardware you have almost
certainly works.