Skip to content

OneSpend

GitLab dowardev/onespend

Install OneSpend

Download Zapstore

Download
QR code for zapstore.dev/download
  • Scan the code with your phone’s camera
  • Tap Download anyway if the browser warns about the file
  • Allow your browser to install unknown apps if Android asks
  • Open Zapstore and finish the onboarding

Open OneSpend in Zapstore

Open
QR code to open OneSpend in Zapstore
  • Scan the code to open OneSpend in Zapstore, or search for it there
  • Tap Install, and Download if Zapstore asks you to confirm the developer
  • Confirm in Android’s install dialog. Allow Zapstore to install unknown apps if Android asks

Unclaimed app

The catalog lists OneSpend from GitLab dowardev/onespend and signs its releases. The developer has not claimed it. The file is still checked before you install it.

Are you the developer? Cryptographically prove you hold the key that signs it.

How trust works

Offline-first personal finance manager for tracking expenses and budgets. Sync is optional, allowing you to connect to a self-hosted backend or use the default public server.

OneSpend is an offline-first personal finance manager. (i) Sync is opt-in: the app never connects to a hardcoded server - the user picks the backend URL in Ajustes -> Conexiones (the bundled default is the author's public server, only used if the user enables sync, and overridable in-app without a rebuild). (ii) UI is wrapped for es + en; the language selector is in the side menu.

Default servers — the build ships with these defaults, which you can override in Settings → Connections after install:

  • Sync server: https://onespend-back.dowar.xyz
  • SSO server: https://auth.dowar.xyz/api (login panel: https://auth-panel.dowar.xyz)

The author maintains these as a public service for anyone who does not want to self-host. To use a self-hosted sync server and/or SSO, change the URLs in the Connections screen (no rebuild needed). The SSO source is public at https://gitlab.com/dowardev/sso.

Summary generated by Zapstore from source.

Original description, as the developer published it.

Zap OneSpend

Zapping anonymously. Sign in to zap with your identity.

No developer has verified this app yet, so sats go to npub1gnwq4…thdn3y, the catalog that brought it to you.

Amount in sats

Latest release

Nov 11, 2026

Unclaimed app No Google servicesSource available · AGPL-3.0-only

The catalog lists this app from GitLab dowardev/onespend and signs its releases. The developer has not claimed it. Are you the developer? Claim your app

It asks for no sensitive access.

Release notes

Changed

• The merge retry lifecycle is now a single state machine (SyncRetryScheduler) with one predicate, one timer and one re-arm per transition, instead of four independent guards each with its own arming logic. Its lock-retry budget lives in that state, so a lock that never frees can no longer be retried forever (GitLab #14).

Fixed

• Editing a record right after creating it no longer produces a false "concurrent edit" conflict. The server now compares the pushed fields against the last synced state one by one, so an edit to a row the same client just created is applied instead of landing in the conflict list, and an edit made while another device changed a different field is merged instead of rejected (GitLab #15). • The local copy of a record now keeps the same revision counter as the server after every sync, for every kind of record. Before, a record created on the device kept revision 0 on the device while the server had already moved on, which the sync diagnostics reported as a version drift on every row the device had created (GitLab #15). • The live pull mapper (SyncQueueService.mapServerItemToRow) normalizes recurring_record.time to "HH:MM" ("14:30:00" -> "14:30", "9:00:00" -> "09:00"), falling back to the local row's time when the server omits it. The server stores the column as a MySQL TIME and hands back "HH:MM:SS", which the client stored verbatim, so the row disagreed with the field hash the server computes over the "HH:MM" the client sent — a phantom conflict on every push (GitLab #17). • The date picker derives its locale from the app's active language (es -> es-ES, en -> en-US) instead of forcing en-US, so the calendar and the time picker follow the language the user picked. An explicit locale prop still wins (GitLab #17). • The app now pushes the changes it queued while it was offline as soon as the connection comes back, instead of leaving them pending until the user taps sync by hand. An item queued offline carries no retry evidence of its own, so the reconnect itself is what marks a push as owed (GitLab #14). • A run whose chunks all failed with a network or server error no longer unblocks the retries against an expired token: the auth block is now only lifted by a successful response from the server (GitLab #14).

Removed

• fromApiFormat (front/src/services/sync/entityMappers.ts): a second pull mapper that only the tests used. The live pull path is SyncQueueService.mapServerItemToRow, and its coverage now pins the cases the dead mapper used to cover (GitLab #17).

Comments

Loading comments…

See more

Get OneSpend the private way

Updates checked on your device, and every release verified before it installs.

Get Zapstore for Android

  1. Tap Download APK below.Scan the code with your Android phone’s camera.
  2. If Android asks, allow your browser to install unknown apps.
  3. Open Zapstore and finish the onboarding.
Download APK

v2.0.4 · 71.2 MB · Android 10+

Verify the download

On a computer, run shasum -a 256 <the file you downloaded>. It should print: b13e01319fecf0b3ba1fd60132758bd0fa08a235836c52d44fddb412cf1b7137

If you have zsp, Zapstore’s publishing tool, zsp utils extract-apk <the file you downloaded> works too. Its hash should be the same SHA-256: b13e01319fecf0b3ba1fd60132758bd0fa08a235836c52d44fddb412cf1b7137

On the phone, AppVerifier should show this signing certificate: 99e33b0c2d07e75fcd9df7e40e886646ff667e3aa6648e1a1160b036cf2b9320

Source code All releases and notes

Get zsp

  1. Download the file for your computer.
  2. Make it executable and put it on your PATH.
  3. In your project folder, run zsp.

Have Go? This does the same:

go install github.com/zapstore/zsp/v2/cmd/zsp@latest
macOS, Apple silicon Linux, x86-64 Linux, arm64

v2.0.1 · macOS and Linux

Verify the download

On your computer, run shasum -a 256 <the file you downloaded>. It should print the SHA-256 for the one you chose.

macOS, Apple silicon · 18.6 MB 99018fb9744e5ace2b44557550dc333496239912c0e9b1137266d4922c803346

Linux, x86-64 · 23.8 MB 1ef5373f8ecd9ba63d2c3fab98abb0d31b2244a2aac31b3749fb205c7d5f5b38

Linux, arm64 · 22.1 MB e421005ee47cba58293dce4277bb784e4cfe706dbbcb8617d671629d0238be18

Source code All releases and notes