Open Net Worth
Open Net Worth is an open-source personal AI wealth assistant you run yourself: one ledger for your whole financial life, worked by an AI agent you control.
翻訳待ち
No updates detected yet. GitHub releases will appear here.
Loading the full README. The saved excerpt is shown below.
A personal dashboard that recalculates each Indian mutual fund AMC's equity AUM in near-real-time by
repricing their disclosed holdings against live market data (DHAN API), instead of relying solely on
the once-a-month reported figure.Read the full README ↗A personal dashboard that recalculates each Indian mutual fund AMC's equity AUM in near-real-time by repricing their disclosed holdings against live market data (DHAN API), instead of relying solely on the once-a-month reported figure.
2026-06).price × shares. US-listed holdings (ISIN starting US) are priced separately via Finnhub +
USD/INR conversion (see below). G-Secs, other-country foreign holdings, and anything neither source
can price fall back to their last reported value.Reported AUM − Σ(all disclosed holdings' value) and carried forward unchanged, since there's no
live feed for cash/receivables. In practice this dataset already itemizes cash-equivalents (Net
Current Asset, TREPS) as disclosed holdings, so the residual is usually ~₹0.DHAN access tokens expire every ~24 hours. Both the access token and the client ID it's paired
with are stored in the database (app_settings table), editable together from the /admin page
without a redeploy — the DHAN_CLIENT_ID env var is now only a fallback default used until something's
been saved there. Each day:
/admin on your deployed app and paste the new token into the DHAN credentials card. If you
generated it under a different DHAN account than the one already configured, update the Client ID
field too — a token only works with the client ID it was generated under, and saving a pair DHAN
rejects is blocked by a live test call before anything is persisted.If the token expires and isn't refreshed, the app keeps working — it just falls back to last-reported values for every holding and shows a banner saying pricing is unavailable.
Note on /admin: this page and its API routes (/api/admin/*) are gated behind a shared secret
(ADMIN_SECRET) — enter it once at /admin and it's remembered in this browser (localStorage)
across restarts until you explicitly log out or clear site data, so the daily token-refresh workflow
above stays just as quick as visiting the page directly. The Client ID is also encrypted at rest
(app_settings table) and only ever shown/returned masked (last 4 characters) — the DHAN access token
itself is never returned by any endpoint at all, only a "configured/updated" status.
~169 holdings across all AMCs are US-listed equities (Amazon, Microsoft, etc., held in global/feeder sleeves) — about 0.9% of total industry AUM. These are priced independently of DHAN:
npm run sync-foreign-instruments resolves each US ISIN to a Finnhub ticker symbol via their
symbol-search endpoint (it accepts ISIN directly, no manual ticker mapping needed) and stores the
mapping in foreign_instrument_map..github/workflows/refresh-foreign-prices.yml) runs
once a day, ~2h after US markets close, fetching each mapped symbol's latest quote from Finnhub and
the current USD/INR rate from ExchangeRate-API, caching both in Postgres. This runs in GitHub
Actions rather than Vercel Cron because refreshing ~169 symbols at Finnhub's free-tier rate limit
(60/min) takes a few minutes — longer than Vercel's serverless function timeout allows.Setup: get a free Finnhub API key at finnhub.io/register (no card
required) and set FINNHUB_API_KEY. For the GitHub Actions workflow to run, add DATABASE_URL and
FINNHUB_API_KEY as repository secrets (Settings → Secrets and variables → Actions).
Create a free Postgres database at neon.tech (or via Vercel's Storage tab → Create Database → Neon), and copy its connection string.
This is the beginning of the README. Read the rest at the original. Read the full README ↗