Your stocks and crypto on every page — a live Ticker Tape with real portfolio P&L.
Left to right: ambient Ticker Tape on the web · popup day P&L while you browse.
MyTicker is a small Chrome extension. After you connect a free price key and drop in your broker holdings file, a thin strip at the top of every tab shows your stocks and crypto with today’s P&L. The popup shows the same numbers in a bigger “scoreboard” view.
Nothing about your portfolio is sent to MyTicker servers — there are no MyTicker servers. Holdings stay in this browser and the optional Finnhub key is encrypted locally; only derived unlock material lives for the current browser session, so you unlock it again after a restart. There is no portfolio telemetry.
- You want a quick glance at how your portfolio is doing without opening a broker app on every tab switch.
- Setup should feel like a short checklist, not a maze of settings.
- You care that money data stays local.
Easiest — from the latest release
- Open Releases and download
MyTicker-v0.5.0-extension.zip - Unzip → you get a
MyTickerfolder - Chrome →
chrome://extensions→ enable Developer mode - Load unpacked → select that
MyTickerfolder - Settings opens → import holdings and go live
Or from source
- Clone the repo:
git clone https://github.com/harshabala/MyTicker.git
- Open Chrome →
chrome://extensions - Turn on Developer mode (top right)
- Click Load unpacked → choose the MyTicker folder
- The Settings page opens on first install
Then complete the three steps (same order in popup and Settings):
- Connect price data — get a free key at finnhub.io, paste it, Save, optionally Test connection
- Import your holdings — export holdings CSV from Zerodha (recommended). Or try first with Download a sample Zerodha CSV in Settings. Drop the file on the drop zone. Groww / Upstox / generic CSV are under More formats
- See it live — open any website. The strip appears at the top. Click the extension icon for Your day so far / today’s P&L
You can also toggle the strip with the keyboard shortcut shown in the popup (often Ctrl+Shift+Y / ⌘+Shift+Y).
| Situation | What to do |
|---|---|
| Popup stuck on checklist | Finish the incomplete step (it always names the next one) |
| “Waiting for market data” | Confirm the API key, wait for a refresh, or use Test connection |
| CSV import fails | Use the sample Zerodha file first; open More formats if your broker isn’t Zerodha |
| Strip not visible | Flip Show ticker on in the popup; reload the tab |
| Indian symbols look wrong | Zerodha imports append .NS for NSE automatically — re-import if needed |
Privacy on every stats surface: Stored only in this browser. Never uploaded.
graph TB
subgraph "Chrome Extension MV3"
M[manifest.json] --> BG[background.js<br/>Service Worker]
M --> CS[contentScript.js<br/>Ticker UI]
M --> POP[popup.html/js<br/>Scoreboard]
M --> OPT[options.html/js<br/>Setup + import]
BG -->|polls| FH[Yahoo / Finnhub / CoinGecko / Binance APIs]
BG --> SH[shared.js<br/>P&L + isActivated]
BG --> MET[metrics.js<br/>pts_metrics local]
BG --> STORE[(chrome.storage local/sync)]
CS --> STORE
CS --> TICKER[Ticker Strip]
POP --> STORE
OPT --> STORE
OPT --> CSV[csvParser.js]
OPT --> MET
POP --> ONB[onboarding.js]
end
USER[User] -->|CSV| OPT
USER -->|toggle| POP
USER -->|views| TICKER
- Holdings land in
chrome.storage.local(pts_holdings) viacsvParser.jspresets (Zerodha golden path + Groww/Upstox/generic). - background.js polls Yahoo Finance (
query1.finance.yahoo.com/query2.finance.yahoo.com) for Indian equities, Finnhub (finnhub.io) for unlocked US-equity quotes, CoinGecko (api.coingecko.com) for crypto, and Binance (data-api.binance.vision) only as the mapped crypto fallback. It merges snapshots inshared.jsand writespts_positions_state. - contentScript.js runs on all pages at document start to render the strip and reserve space before page content; it does not read page content. Its closed Shadow DOM loads only the
ticker.cssweb-accessible stylesheet. - popup.js is a small view machine: checklist → P&L scoreboard (or empty). First success shows Your day so far, then normal Today’s P&L.
Single activation constant in shared.js:
ACTIVATION_EVENT = "myticker_activated"
// activated = api_ok AND holdings_count >= 1 AND ticker_enabled
// AND >= 1 successful price refreshStored only in pts_metrics (never uploaded):
| Field | Meaning |
|---|---|
activatedAt |
First time isActivated(...) became true |
firstRefreshAt |
First successful quote fetch |
activeDays |
Local YYYY-MM-DD stamps with ≥1 successful refresh while enabled (cap 400) |
imports[preset] |
{ success, fail } for import success rate by broker |
Writer: background.js for refresh/activation; options.js for import outcomes. Popup/options only read.
| Feature | Detail |
|---|---|
| Live ticker strip | Dark bar, 5-min + day P&L per symbol |
| Scoreboard popup | Aggregate day P&L, top 3 movers by |day %|, strip status, method + privacy copy |
| Setup spine | API → holdings → live; incomplete rows are CTAs |
| Zerodha golden path | Sample CSV + auto .NS; other brokers under details |
| Crypto (optional) | CoinGecko primary with mapped Binance fallback; core loop works without it |
| Local privacy | Keys/holdings local; footer names Finnhub honesty |
# Unit tests (pure P&L + activation helpers)
node test_fixtures/test_shared.mjs
node test_fixtures/test_content_telemetry_bridge.mjs
node test_fixtures/test_ticker_render.mjs
node test_fixtures/test_content_script_classic.mjs
# Syntax check ES modules
for f in background.js contentScript.js shared.js popup.js options.js onboarding.js csvParser.js priceProviders.js metrics.js; do
node --input-type=module --check < "$f" && echo "OK $f"
doneLoad unpacked from the repo root. Manual E2E: save key → import test_fixtures/sample_holdings_zerodha.csv → keep popup open until first poll.
Task checklist: docs/TASKS.md · Privacy: PRIVACY.md
- Canonical API-key vault:
pts_finnhub_vaultin local storage, encrypted with your unlock code (not sync). Only derived unlock material is held in session storage and it is cleared on browser restart. - Metrics are counts and dates only — no symbols, quantities, prices, or portfolio telemetry.
- Network: Yahoo Finance (
query1.finance.yahoo.com,query2.finance.yahoo.com), Finnhub (finnhub.io), CoinGecko (api.coingecko.com), and mapped Binance fallback (data-api.binance.vision). No product telemetry.
MyTicker/
├── manifest.json
├── background.js / contentScript.js / shared.js / metrics.js
├── onboarding.js / csvParser.js / priceProviders.js
├── popup.html / popup.js
├── options.html / options.js
├── ticker.css / brand.css / motion.css
├── docs/TASKS.md
├── PRIVACY.md
└── test_fixtures/
MIT © 2026 MyTicker Contributors

