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.
Track and manage automated dollar-cost averaging buy orders across different stock rungs
AI summary · website content
FinanceHTML · PythonGitHub @786603902ly-makerOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Codifies your tiered, moving-average-based dollar-cost-averaging rules into an automated pipeline: prices refresh daily via GitHub Actions alone (no Claude session needed), thresholds are evaluated against your ladder rules, and a dashboard (hosted on Vercel — see Hosting, which auto-deploys on every push) shows what's hit and lets you tick off what you've actually invested in, synced across your devices. A Claude Artifact copy of the same dashboard still exists as a manual backup/preview link, but nothing refreshes it automatically anymore (see below) — ask in chat if you want it re-published.
Trunk branch is
claude/investment-rules-stock-tiers-benvvw— the GitHub Actions crons and Vercel's Production Branch setting all read/write this branch. If you're a Claude session working from a different (session-specific) branch, merge into this one before you're done — seeCLAUDE.mdfor why this matters and what went wrong once already when it wasn't.
Daily (GitHub Actions, .github/workflows/daily-price-check.yml,
21:30 UTC ≈ 05:30 SGT next day, after US close): fetches fresh daily
closes, recomputes MA60/100/150/200/250 per stock, evaluates each tier's
ladder against the new price, and commits the result to data/state.json
along with a rebuilt dashboard/index.html (before 2026-09-21 it
committed the state alone, so the page Vercel served kept its previous
build until some later market-open run happened to rebuild it).
Prices come from stooq with Yahoo as a second source, and the two are
merged rather than "first one that answers wins": stooq publishes US
closes on a lag, so it can return a perfectly valid series that stops a
day or two short. Each source is checked against the last expected
trading session and the next is consulted if it's behind — otherwise a
stale-but-successful response silently pins the dashboard to an old
close, which is exactly what happened on 2026-09-21.
This step needs real internet access to Yahoo/stooq, which the Claude
sandbox that built this doesn't have — hence it runs on GitHub's own
runners instead of as a Claude-scheduled job. This is the data the
MA/ladder math is keyed off — it never changes intraday.
Live, on every page load (api/quote.js, no cron involved): the
dashboard asks this small serverless function for current quotes when you
open it, then again every 60 seconds while the US market is open (and
whenever you switch back to the tab). It fetches server-side, so the price
you see is seconds old, not hours. It updates the displayed price, each
pending rung's "% away", and flags any pending rung the live price has
already reached as hit now. If the fetch fails, every card falls back
to the committed close — the page never ends up blank or wrong, just less
current. This is display only: which rungs have officially fired is
still decided by run_check.py off the daily close, so a "hit now" flag
is a heads-up to go look, not a state change.
Market open (GitHub Actions, .github/workflows/market-open-price-check.yml):
NYSE opens at 9:30am ET, which lands at either 9:30pm SGT (EDT, roughly
Mar–Nov) or 10:30pm SGT (EST, roughly Nov–Mar) depending on the time of
year. Rather than track the DST flip, this workflow fires at both
possible "~15 min after open" times every weekday (13:44 UTC and
14:44 UTC). scripts/market_open_snapshot.py then checks the real
America/New_York clock and only actually fetches a live quote if it's
genuinely within ~25 minutes of today's open — so whichever of the two
firings doesn't match the current DST regime is a silent no-op, and the
schedule self-adjusts across the March/November transitions with no
manual cron edits.
Treat this as a fallback, not the live-price mechanism — step 2 is
that. GitHub queues scheduled runs behind everything else and was
starting this one 3.5–5 hours late (measured Sept 2026: firings due
at 09:44 ET actually landed 13:13–14:52 ET). Until 2026-09-21 the script
also only accepted 09:30–09:55 ET, so every firing fell outside its own
window and skipped the fetch — intraday_price had never once been
written for any stock, and the job's only real effect was rebuilding the
dashboard, under a commit message that claimed otherwise. The window is
now the whole session (09:30–16:00 ET). You can also run it on demand
from the Actions tab (workflow_dispatch), which starts immediately —
the delay only affects schedule events.
This is the beginning of the README. Read the rest at the original. Read the full README ↗