Quickstart
Try Tidings in about a minute, with no real bank accounts. The demo runs from a seeded SQLite database — no IMAP credentials, no AWS, no external services. Click around, then wire up your own data once the shape feels right.
Run the demo
Section titled “Run the demo”-
Clone the repository and start the stack.
Terminal window git clone https://github.com/tvhahn/tidings.gitcd tidingsdocker compose up -d -
Open the dashboard.
The default is demo mode — a seeded SQLite database (data/demo.db) of sample transactions. No real accounts touched, no IMAP connection, nothing sent anywhere.
Set your timezone
Section titled “Set your timezone”Tidings defaults to America/Los_Angeles. Change it under Settings → Timezone. The selector lists every IANA zone your browser supports; Detect from browser picks your local one in a click.
The setting is instance-wide — it applies to every browser pointing at this dashboard, not just the one you set it from. It persists to the timezone key in data/config.json, so you can also set it before first launch by editing that file.
Changing timezone after you have ingested transactions is safe but imperfect: new transactions bucket in the new zone, while existing rows keep their original local-time sort-key prefix.
Wire up your own data
Section titled “Wire up your own data”Once the demo feels right, three pages cover the real wiring, in order:
- Self-hosting with Docker — copy
.env.exampleto.env, setdemo_mode: falseindata/config.json, and run the stack against your own SQLite database. - Email setup — create a dedicated Gmail account, generate an App Password, and point your bank alerts at it.
- Notifications — pick a push or SMS provider. The recommended default is ntfy: free, no account, works on iOS and Android.
Common gotchas
Section titled “Common gotchas”- Port 8000 already in use — change the host side of the port mapping in
docker-compose.yml(for example"8001:8000") and openhttp://localhost:8001. - IMAP poller can’t connect — Gmail needs an App Password, not your account password, and 2-Step Verification has to be on. Email setup walks through it.
- Permission errors on
data/— the named volume is owned by the container user. If you switched between a bind mount and the named volume, reset withdocker compose down -v.
For the full JSON API while the stack is running, see the API reference.