DividendCase
A free, open-source dividend tracker that runs on your own computer. Your data stays with you.
Status: early release (0.1). Things may still change between versions; your data is backed up before every upgrade.
Install
DividendCase installs with uv, which also sets up Python for you.
macOS and Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
uv tool install dividendcase
dividendcase
Windows (PowerShell)
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
uv tool install dividendcase
dividendcase
It opens http://127.0.0.1:8765/dashboard/ in your browser once it's ready; the first start after installing or updating can take up to a minute. Keep the terminal window open while you use it, and press Ctrl+C there to stop. If dividendcase isn't found after installing uv, run uv tool update-shell and open a new terminal.
- Update:
uv tool upgrade dividendcase. The app tells you when a new version is out, and saves a copy of your data before an update changes it. - Uninstall:
uv tool uninstall dividendcase. Your data folder (below) stays until you delete it.
Docker (Linux servers, a NAS, or if you'd rather not install Python tools)
docker run -d --name dividendcase --restart unless-stopped \
-p 127.0.0.1:8765:8765 -v dividendcase-data:/data \
ghcr.io/dividendcase/dividendcase:latest
Then open http://127.0.0.1:8765/dashboard/. Keep 127.0.0.1: in the port mapping so only this computer can reach it. Your data lives in the dividendcase-data volume; to update, docker pull ghcr.io/dividendcase/dividendcase:latest and recreate the container.
Feedback: the app's Send feedback link opens a bug report with your version filled in; ideas are welcome here. See CONTRIBUTING.md.
What it does
- Income home: what your holdings should pay over the next 12 months, month by month, all in your home currency or one currency at a time, with upcoming payments and where the income comes from.
- After tax: what's left once the paying country withholds its tax, for residents of Ireland, the UK, India, Canada, Australia and the US (treaty rates, with the paperwork each assumes); set your broker's actual rate for any country in Settings.
- Stock pages: 10 years of dividend history, TTM yield, a safety score, dividend growth (CAGR) and growth streaks.
- Screener: index members from six markets, filtered by market, yield, how often they pay and whether they beat their local index over ten years.
- Portfolios: individual purchase lots in any currency, a 12-month income calendar, diversification charts, a benchmark comparison and a DRIP calculator.
- Watchlists and side-by-side comparison.
- Excel import and export of portfolios, holdings and watchlists.
- ⌘K search for any stock, page or action.
How it works
dividendcase starts a small web server that only this computer can reach (127.0.0.1) and opens it in your browser. There is no account and nothing is sent to DividendCase.
Market data is fetched by your computer from Yahoo Finance through yfinance, for your own personal use. Everything is stored in one SQLite file:
| System | Data folder |
|---|---|
| macOS | ~/Library/Application Support/DividendCase |
| Windows | %LOCALAPPDATA%\DividendCase\DividendCase |
| Linux | ~/.local/share/DividendCase |
Set DIVIDENDCASE_DATA_DIR to use another folder. Before an update changes the database, the app saves a copy in the backups folder inside it (the last five are kept).
On first launch the app asks where you're resident for tax, which currency to show totals in, and which markets the screener should download (all of it can be changed in Settings). Amounts in other currencies are converted with the European Central Bank's euro reference rates, downloaded by your computer: past amounts at the rate on their date, future income at the latest rate.
Once a day the app asks PyPI whether a newer version exists and says so in the sidebar. Nothing about you or your portfolio is sent; turn it off in Settings.
While the app is open it keeps data current in the background: your holdings and watchlist stocks when it starts and every day, and the screener's index members (S&P 500, NIFTY 50, TSX 60, FTSE 100, ISEQ 20, ASX 200 and some high-yield groups) every week. It fetches about one stock a second and pauses whenever Yahoo Finance asks it to. The Data page shows progress.
Run from source
You need uv and Node.js 20.9 or newer.
git clone https://github.com/dividendcase/dividendcase
cd dividendcase
uv sync
uv run python scripts/build_web.py # builds the interface into the package
uv run dividendcase # opens http://127.0.0.1:8765/dashboard/
Develop
npm install # once, from the repository root (npm workspaces)
uv run dividendcase --no-browser # API on http://127.0.0.1:8765 (docs at /docs)
npm run dev:app # interface with hot reload on http://localhost:3000
npm run dev:site # the dividendcase.com website on http://localhost:3002
Tests run against a real SQLite file in a temporary folder, with the network switched off and made-up market data:
uv run pytest
uv run python -m dividendcase.migrate check # models and migrations agree
uv run python -m dividendcase.migrate new "what changed" # after changing a model
The repository holds three JavaScript workspaces:
| Folder | What it is |
|---|---|
frontend/ |
The app's interface: Next.js 16, Tailwind CSS 4, ECharts |
site/ |
The website: Next.js 16 with Motion, built to static files in site/out |
packages/brand/ |
Colours, fonts and the logo, shared by both |
Both are Next.js static exports (output: "export"), so they can't use middleware, API routes, server actions or dynamic route segments. Pass ids as query parameters instead, such as /dashboard/stock/?t=KO.
Releasing
Bump version in pyproject.toml, add a matching section to CHANGELOG.md, run uv lock, merge, then push a tag such as v0.1.1. The Release workflow tests it, installs the built package on Linux, macOS and Windows, publishes it to PyPI with trusted publishing and creates the GitHub release.
Data and disclaimer
DividendCase is not affiliated with Yahoo. Yahoo Finance data is intended for personal use, so this project never distributes market data: each installation fetches its own. Nothing in DividendCase is financial advice.
Licence
AGPL-3.0-or-later. The DividendCase name and logo are not covered by the licence.
Metadata
Release files for dividendcase 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| dividendcase-0.3.0.tar.gz | 1.3 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| dividendcase-0.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 2.6 MB
Release files / dividendcase-0.3.0.tar.gz
| Download URL | dividendcase-0.3.0.tar.gz |
|---|---|
| Size | 1.3 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
16ba49eaa965c52aad2574a9dd9c6a25a3926c4b807885141ce4a0d43de5ee99
|
|
BLAKE2b-256 checksum How to use checksums |
37ec05e5a918f6e2de9cd4c50921ec55e9064968a675aecd9c015f12facf1029
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 29, 2026.
Transparency logRelease files / dividendcase-0.3.0-py3-none-any.whl
| Download URL | dividendcase-0.3.0-py3-none-any.whl |
|---|---|
| Size | 1.3 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3838247f572fea0ec4a1ae03d8262e9a22f8cdc0fe230fcf102fffbd60c945c5
|
|
BLAKE2b-256 checksum How to use checksums |
b31fba9f32205e8398a66ee1c6a811fa76bf3e91ddf57f408f1a56f30d9ad756
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 29, 2026.
Transparency log