Skip to main content

Build Status Coverage

Dinary — Your Dinar Diary

See what went into the shopping bag.

Scan a fiscal receipt from Serbia or Montenegro and turn its line items into categorized expenses. Correct a category once and reuse that choice on future purchases. Track spending across currencies, trips, and tags, with optional Google Sheets export and AI-assisted analysis.

Pick your category set
Review receipt categories

Quick entry in any currency
  • Know what you bought. Split a supermarket receipt into item-level spending, review uncertain categories, and teach the app your preferences through corrections.
  • Capture it while you remember. Scan QR codes or enter expenses on your phone, including offline. Queued entries sync when the app reconnects.
  • Explore spending your way. Combine categories, trip or event context, and tags. Keep original currencies alongside converted totals, export to Sheets, or ask questions in the local analytics dashboard.

Install it by hand, or let Claude or ChatGPT do it for you.

Mobile app · Analytics dashboard

Under the hood

Corrections become reusable rules. Known items use stored classification rules; unfamiliar or uncertain items go to an LLM. A user correction takes precedence over the model and applies across branches of the same retail chain. Classification failures remain recoverable through retries and review. The classification design explains confidence, alternatives, and manual resolution.

Provider selection and failover are handled by llmbroker, a standalone library for applications that need a pool of LLM providers. Receipt logic stays in Dinary.

A saved expense outlives a failed network call. IndexedDB holds offline entries, and the QR scanner is bundled for offline use. On the server, the SQLite ledger is the source of truth. Google Sheets export runs through a retryable queue, so a spreadsheet outage does not prevent expense capture. See the offline design and Sheets integration.

Analysis has a separate home. The local analytics app uses DuckDB to query a read-only ledger replica, keeping heavy analytics dependencies off the capture server. Its AI can query spending and configure views without editing the ledger. The analytics design covers the dashboard and MCP interface.

Design decisions

Small, frequent lookups shaped the storage layer. In an early synthetic workload, 5,000 mapping lookups took 2.0 seconds with direct SQL and 19.9 seconds through Ibis. That comparison led to SQL files and migrations for the transactional backend. The architecture record documents the workload and trade-offs; the result describes that benchmark, not whole-application performance.

Contributing

Install uv and Node.js, then prepare the full development and test environment:

bash scripts/setup-test-env.sh
npm --prefix webapp ci
uv run inv dev --rebuild

The setup script installs all Python dependency groups and prepares the tools needed by analytics and backup tests. See the development guide for local configuration and platform prerequisites.

uv run inv pre
uv run pytest
npm --prefix webapp test

See AGENTS.md for repository conventions and the deployment guide for hosting.

Allure test report

Metadata

Release files for dinary 1.10.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for dinary 1.10.3
File Size Uploaded
dinary-1.10.3.tar.gz 6.6 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for dinary 1.10.3
File Interpreter ABI Platform
dinary-1.10.3-py3-none-any.whl Python 3 none any Details

Total release size: 6.7 MB

Release files / dinary-1.10.3.tar.gz

Download URL dinary-1.10.3.tar.gz
Size 6.6 MB
Tags Source
SHA-256 checksum
How to use checksums
170709f67bbd525515b2c1a40b45ba34f1ec0c0638cc96106a8c07c22e07d949
BLAKE2b-256 checksum
How to use checksums
ed9bcb93586d73f11dd82e558e8ac2a0f85b7b49b146ffd4f0afa1de30803129
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / dinary-1.10.3-py3-none-any.whl

Download URL dinary-1.10.3-py3-none-any.whl
Size 149.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
ddd2fa2fff577f74fae92ac3cc59ddccf846786b4473626f763e7b165484f90b
BLAKE2b-256 checksum
How to use checksums
4fa13c5c1398433ba21d9176f17709bfcb7db0159dc7f1530e3bf067849477cc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release history Release notifications | RSS feed

This release

1.10.3 This release

2 release files

1.10.0

2 release files

1.9.1

2 release files

1.9.0

2 release files

1.8.2

2 release files

1.8.1

2 release files

1.8.0

2 release files

1.7.2

2 release files

1.7.1

2 release files

1.7.0

2 release files

1.6.5

2 release files

1.6.4

2 release files

1.6.3

2 release files

1.6.2

2 release files

1.6.1

2 release files

1.6.0

2 release files

1.5.2

2 release files

1.5.1

2 release files

1.5.0

2 release files

1.4.1

2 release files

1.4.0

2 release files

1.3.1

2 release files

1.3.0

2 release files

1.2.4

2 release files

1.2.3

2 release files

1.2.2

2 release files

1.2.1

2 release files

1.2.0

2 release files

1.1.1

2 release files

1.1.0

2 release files

1.0.0

2 release files

0.8.1

2 release files

0.8.0

2 release files

0.7.0

2 release files

0.6.0

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.2.0

2 release files

0.1.0

2 release files

0.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page