Why I built a money app that works with the network off

A money app that needs a server to record a coffee has it backwards. Why Tavala keeps the books on your device, and what that costs to build.

By Dejan Bogatinovski4 min read

Drafted with AI assistance, researched, fact-checked and edited by Dejan Bogatinovski. How we write.

A money app that needs a server to record a coffee has its priorities backwards. The phone in your hand is where the money gets spent, so the phone should hold the books, and the cloud should hold a copy. That is the rule Tavala works offline by: every screen reads from a database on the device, and sync happens afterwards, whenever it can.

When you actually pay

A sandwich from the trolley on a plane. A bar in a basement with no signal. A week abroad with roaming off to avoid the bill. A border, where you change cash at a kiosk while the phone hunts for a network. These are the amounts you forget first, and the moments an online-only app shows a spinner.

An offline budgeting app does not wait for a good moment. You type coffee 4.80, it is saved, and the total is right. Foreign amounts too: the device keeps a copy of the rate list (the last 7 days for every currency, about 400 days for the ones you use), and a new install starts with a snapshot built into the app, so a conversion needs no connection.

Start without an account

Tavala opens without an account. As a guest, your wallets, entries and budgets are written to a database on the device, and the app sends none of them anywhere: no server copy, no upload queue. Two things do leave every device, guests included: a crash report if the app crashes, with email addresses and anything shaped like an amount removed first, and a request for the shared rate table, which carries nothing about you. Both are listed in what Tavala stores and who can see it.

I want an account to be something you add for a backup or a second device, not the price of trying the app. Use Tavala without an account lists what a guest can and cannot do.

What offline costs the builder

Two devices, one entry. If you edit the same entry on your phone and your laptop before either syncs, one edit has to win. I made the last change received win, with no merge prompt. Money entries are mostly created once and rarely edited on two devices at once, so a merge dialog would cost more than it saves. It is still a trade, and how sync and offline work says so.

The server says no. Sometimes the account refuses a change, for example because it hit a free plan limit. The easy path in sync code is to drop the refused change; the device then takes the server's copy and your entry vanishes without a word. I made Tavala keep a copy of every refused change on the device instead. Home says "2 changes couldn't be saved to your account. They're still on this device." Each change gets two buttons, Try again and Delete, and nothing is deleted unless you choose Delete.

Retries have to be harmless. Changes wait on the device in the order you made them and upload when the network returns. If the connection drops halfway, the same change can arrive twice, so every upload is written to have the same effect sent twice as sent once.

Why the money model makes this safe

Every amount is stored as a whole number in its currency's smallest unit: cents for the dollar, whole yen for the yen, fils for the Kuwaiti dinar, which has three decimals. Decimals appear only when a number is drawn on screen. Floating-point numbers are not exact: 0.1 plus 0.2 is not quite 0.3, and the order of addition can change the last digit. Whole numbers add up the same way every time, so a phone that was offline for a week and a laptop that never was agree on the total to the cent.

Every entry also keeps the exchange rate of its date, locked when you save. A taxi 1200 MKD charged to a euro account at 1 MKD = 0.01626 EUR is saved as €19.51, and it is still €19.51 in budgets and reports a month later. The converted value travels with the entry, so no device recomputes it with whatever rates it holds, and two devices with different rate tables report the same spending. Wallet balances and net worth are the deliberate exception: they use today's rate each time you look.

The honest limits

  • A guest has no backup. Delete the app, lose the phone or clear the browser's site data, and a guest's records are gone. Tavala cannot recover them because it never had them.
  • Some things need a connection: creating an account and signing in, Ask Tavala, sharing a space, connecting a bank (for banks in the United States and Canada, read-only, through Plaid) and buying Plus.
  • Last write wins. An entry edited on two devices before a sync keeps only the later edit.
  • Coin prices need one fetch after a new install. The built-in snapshot covers regular currencies only.

Choosing a budget without a bank feed? Read budget apps that don't connect to your bank, then how to track expenses by hand.

Dejan Bogatinovski

Dejan BogatinovskiFounder of Tavala. He has written software for more than ten years, builds Tavala on his own in Skopje, and checks every guide against the app or the source it cites.

Start with what you spent today.

There is no account to create and no card to enter. Pick your currency, add what you paid, and Home shows what is left.