Skip to main content

DividendCase

Tests Build Release PyPI Python 3.11+ Licence: AGPL-3.0-or-later

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)

Source distribution for dividendcase 0.3.0
File Size Uploaded
dividendcase-0.3.0.tar.gz 1.3 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for dividendcase 0.3.0
File Interpreter ABI Platform
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 log

Release 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

Release history Release notifications | RSS feed

This release

0.3.0 This release

2 release files

0.2.0

2 release files

0.1.1

2 release files

0.1.0

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