{"id":51440996,"url":"https://github.com/simonsruggi/StockDock","last_synced_at":"2026-07-07T22:00:47.027Z","repository":{"id":342535751,"uuid":"1164365050","full_name":"simonsruggi/StockDock","owner":"simonsruggi","description":"Free \u0026 open-source macOS menu bar app to track stocks, ETFs, crypto \u0026 portfolio P\u0026L in real-time. Native SwiftUI, no account, no subscription, privacy-first.","archived":false,"fork":false,"pushed_at":"2026-07-03T23:01:06.000Z","size":3656,"stargazers_count":8,"open_issues_count":0,"forks_count":5,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-07-04T01:07:18.601Z","etag":null,"topics":["apple-silicon","finance","investing","macos","menu-bar-app","menubar","open-source","portfolio","portfolio-tracker","real-time","stock-market","stock-ticker","stocks","swift","swiftui","ticker","trading","watchlist","yahoo-finance"],"latest_commit_sha":null,"homepage":"https://github.com/simonsruggi/StockDock/releases/latest","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/simonsruggi.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"simonsruggi"}},"created_at":"2026-02-23T01:55:14.000Z","updated_at":"2026-07-03T23:01:10.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/simonsruggi/StockDock","commit_stats":null,"previous_names":["simonsruggi/stockbar","simonsruggi/stockdock"],"tags_count":19,"template":false,"template_full_name":null,"purl":"pkg:github/simonsruggi/StockDock","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/simonsruggi%2FStockDock","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/simonsruggi%2FStockDock/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/simonsruggi%2FStockDock/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/simonsruggi%2FStockDock/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/simonsruggi","download_url":"https://codeload.github.com/simonsruggi/StockDock/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/simonsruggi%2FStockDock/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35243953,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-07T02:00:07.222Z","response_time":90,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["apple-silicon","finance","investing","macos","menu-bar-app","menubar","open-source","portfolio","portfolio-tracker","real-time","stock-market","stock-ticker","stocks","swift","swiftui","ticker","trading","watchlist","yahoo-finance"],"created_at":"2026-07-05T12:00:25.879Z","updated_at":"2026-07-07T22:00:47.004Z","avatar_url":"https://github.com/simonsruggi.png","language":"Swift","funding_links":["https://github.com/sponsors/simonsruggi","https://github.com/sponsors/simonsruggi)*"],"categories":["ファイナンス","Menubar"],"sub_categories":["オーディオ録音・処理","Text"],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"screenshots/banner.png\" alt=\"StockDock — track stocks from your macOS menu bar\" width=\"100%\"\u003e\n\n# StockDock\n\n**A free, open-source macOS menu bar app for tracking stocks, ETFs, indices, crypto, and your portfolio P\u0026L in real time.**\n\nNo account. No API keys. No subscription. No tracking. Just your watchlist and portfolio, always one click away in the menu bar.\n\n\u003cbr\u003e\n\n[![Latest Release](https://img.shields.io/github/v/release/simonsruggi/StockDock?label=download\u0026logo=apple\u0026color=black)](https://github.com/simonsruggi/StockDock/releases/latest)\n[![Downloads](https://img.shields.io/github/downloads/simonsruggi/StockDock/total?logo=github\u0026color=2ea44f)](https://github.com/simonsruggi/StockDock/releases)\n[![Platform](https://img.shields.io/badge/macOS-14%2B-black?logo=apple)](https://github.com/simonsruggi/StockDock/releases/latest)\n[![Swift](https://img.shields.io/badge/Swift-5.9-orange?logo=swift\u0026logoColor=white)](https://swift.org)\n[![License: MIT](https://img.shields.io/github/license/simonsruggi/StockDock?color=blue)](LICENSE)\n[![Star](https://img.shields.io/github/stars/simonsruggi/StockDock?style=social)](https://github.com/simonsruggi/StockDock)\n\n\u003cbr\u003e\n\n```bash\nbrew install simonsruggi/tap/stockdock\n```\n\n**[⬇️ Download](https://github.com/simonsruggi/StockDock/releases/latest)** · **[✨ Features](#features)** · **[📸 Screenshots](#screenshots)** · **[🐛 Report a bug](https://github.com/simonsruggi/StockDock/issues)**\n\n\u003c/div\u003e\n\n---\n\n\u003e ⭐️ **Using StockDock?** It's free and there's no tracking, so a GitHub star is the only way I know anyone's out there. If the app is useful to you, please [star the repo](https://github.com/simonsruggi/StockDock) — it takes a second and genuinely helps.\n\n## Why StockDock?\n\n- 🆓 **Truly free \u0026 open source** — no paid tiers, no premium lock, no subscription, ever.\n- 🔒 **Private by design** — no account, no login, no analytics, no telemetry. Your watchlist and portfolio never leave your Mac.\n- ⚡️ **Live in your menu bar** — real-time P\u0026L and prices without opening a single browser tab.\n- 🌍 **Multi-currency** — track holdings in mixed currencies and see totals converted to yours, with historical rates on your cost basis.\n- 🔔 **Alerts that reach you** — native macOS notifications plus optional Discord / Slack webhooks.\n- 🍎 **Native \u0026 lightweight** — pure SwiftUI, universal binary (Apple Silicon + Intel), auto-updating via Sparkle.\n\n## What you can track\n\nStocks, ETFs, indices (S\u0026P 500, NASDAQ…), crypto, and forex — anything with a Yahoo Finance symbol. Search by **symbol**, **company name**, or **ISIN** (e.g. `AAPL`, `Tesla`, `IE00B4L5Y983`).\n\n## Screenshots\n\n| Menu Bar | Watchlist | Portfolios | Settings |\n|---|---|---|---|\n| ![Menu Bar](screenshots/menubar.png) | ![Watchlist](screenshots/watchlist.png) | ![Portfolios](screenshots/portfolio.png) | ![Settings](screenshots/settings.png) |\n\n## Features\n\n- **Menu Bar P\u0026L** — See your portfolio performance at a glance, always visible\n- **Watchlist** — Track any stock by symbol, name, or ISIN with live prices and daily change\n- **52-Week Range** — A range bar in the watchlist showing where the price sits between its yearly low and high\n- **Portfolios** — Create multiple portfolios with holdings, average cost, purchase date, and P\u0026L\n- **Long \u0026 Short + Leverage** — Track short positions and leveraged holdings with correct P\u0026L math (optional, off by default)\n- **Export / Import** — Export single or all portfolios to JSON and import them back\n- **Extended Hours** — Pre-market and after-hours prices with PRE/POST badges\n- **Currency Conversion** — Convert stock prices and portfolio values to your preferred currency\n- **Price Alerts** — One-shot alerts on price thresholds, daily change %, or proximity to 52-week high/low\n- **Portfolio Notifications** — Per-portfolio alerts for daily change %, change amount, value milestones, and a daily summary\n- **Discord / Slack Webhooks** — Mirror every notification to a Discord or Slack webhook with colored embeds\n- **Customizable Watchlist** — Toggle company name, day range, 52-week bar, and absolute change per row\n- **Customizable Menu Bar** — Choose what to display: P\u0026L, total value, percentages, best/worst stock, or just an icon\n- **6 Languages** — English, German, French, Spanish, Italian, Portuguese\n- **Auto-Updates** — Updates are delivered automatically via Sparkle, no manual downloads needed\n\n## Install\n\n### Homebrew (recommended)\n\n```bash\nbrew install simonsruggi/tap/stockdock\n```\n\nThe app updates itself automatically via Sparkle — no need to run `brew upgrade`.\n\n### Download\n\n1. Download the latest `StockDock.zip` from [Releases](https://github.com/simonsruggi/StockDock/releases/latest)\n2. Unzip and move `StockDock.app` to `/Applications`\n3. Launch — the app appears in the menu bar (no Dock icon)\n\n### Build from source\n\nRequires **Xcode 15+** and **macOS 14 Sonoma** or later.\n\n```bash\ngit clone https://github.com/simonsruggi/StockDock.git\ncd StockDock\nxcodebuild -scheme StockDock -configuration Release -destination 'platform=macOS' -derivedDataPath .build/xcode build\n```\n\nThe app bundle will be at `.build/xcode/Build/Products/Release/`.\n\n## Usage\n\n### Watchlist\n\nAdd stocks by clicking **Add stock** at the bottom of the Watchlist tab. Search by symbol, company name, or ISIN (e.g. `AAPL`, `Tesla`, `IE00B4L5Y983`). A local filter box lets you quickly narrow the list by name, symbol, or ISIN. Stocks show:\n\n- Current price with currency symbol\n- Daily change (absolute and percentage)\n- Day range (low – high)\n- A 52-week range bar with a marker showing where the price sits between its yearly low and high\n- Extended hours price when available (PRE/POST badge)\n\nEach of these rows can be toggled on/off in **Settings → Watchlist Display**.\n\nRight-click a stock to remove it, add it to a portfolio, or create a price alert.\n\n### Portfolios\n\n1. Click the **Portfolios** tab\n2. Click **New portfolio** to create one\n3. Click **Add holding** to add a stock with quantity, average price, and purchase date\n\nThe purchase date is used to apply the historical exchange rate to your cost basis, so P\u0026L stays accurate across currencies.\n\nEach portfolio shows:\n- **Total value** in your chosen currency\n- **P\u0026L** (profit \u0026 loss) in absolute and percentage terms\n- Per-holding breakdown with price, value, and individual P\u0026L\n\nRight-click a holding to edit or delete it. Right-click a portfolio header to configure its notifications.\n\nYou can **Export** a single portfolio (or **Export All**) to a JSON file, and **Import** portfolios back — imports regenerate IDs and de-duplicate names so nothing is overwritten.\n\n### Long / Short \u0026 Leverage\n\nBy default every holding is a plain long position. Turn on **Settings → Advanced → \"Enable short positions \u0026 leverage\"** to unlock a **Long / Short** picker and a per-holding **leverage** field when adding or editing a holding. P\u0026L, market value, and portfolio percentages are computed with the correct sign and exposure so long and short baskets don't cancel each other out. Existing portfolios are unaffected — the feature is opt-in.\n\n### Price Alerts\n\nCreate a one-shot alert from a watchlist stock's right-click menu. Six conditions are supported:\n\n- Price rises above a threshold\n- Price falls below a threshold\n- Daily change rises above a % \n- Daily change falls below a %\n- Price gets near its 52-week high\n- Price gets near its 52-week low\n\nAlerts are evaluated on every price update (WebSocket tick, REST refresh, launch, and wake). When triggered they fire a local macOS notification once, then disarm. Manage them in **Settings → Notifications**: re-arm, delete, or see the \"triggered\" badge.\n\n### Portfolio Notifications\n\nRight-click a portfolio header → **Notifications…** to configure per-portfolio alerts. Four modes:\n\n- **Daily change ≥ %** — fires when the portfolio moves by at least a given percentage\n- **Daily change ≥ amount** — fires on an absolute move in your portfolio currency\n- **Value milestone** — fires when total value crosses a milestone (e.g. every 10,000)\n- **Daily summary** — a recap delivered after a set time of day\n\nStep-based anti-spam with hysteresis prevents repeat firing within the same step (re-fires only on the next step, resets daily). Rules and state persist per portfolio in `data.json`.\n\n### Discord / Slack Webhooks\n\nIn **Settings → Notifications**, enable the webhook toggle and paste a Discord or Slack webhook URL. Every notification (price alerts and portfolio notifications) is mirrored to the webhook in addition to the macOS notification. The app auto-detects Discord (colored green/red embeds) vs Slack (text), and only posts to `https` URLs on known hosts (SSRF-safe). Use **Send test** to verify it works.\n\n### Settings\n\nClick the gear icon tab to configure:\n\n| Setting | Description |\n|---|---|\n| **Stock Price Currency** | Convert all displayed prices to a single currency, or keep original |\n| **Portfolio Currency** | Base currency for portfolio totals and P\u0026L (EUR, USD, GBP, CHF, JPY, CAD, AUD) |\n| **Show Extended Hours** | Toggle pre-market and after-hours prices on/off — affects prices, P\u0026L, and menu bar |\n| **Watchlist Display** | Toggle company name, day range, 52-week range bar, and absolute change value per row |\n| **Menu Bar Display** | What appears in your menu bar (see below) |\n| **Language** | English, German, French, Spanish, Italian, Portuguese |\n| **Notifications** | Discord/Slack webhook, plus management of price alerts and portfolio notifications |\n\n### Menu Bar Display Options\n\n| Option | Example |\n|---|---|\n| P\u0026L | `P\u0026L +321.09€` |\n| P\u0026L % | `P\u0026L +2.3%` |\n| P\u0026L + % | `+321.09€ (+2.3%)` |\n| Total Value | `14396.67€` |\n| Best Stock | `AAPL +1.2%` |\n| Worst Stock | `TSLA -0.8%` |\n| Best \u0026 Worst | `▲AAPL +1.2%  ▼TSLA -0.8%` |\n| Icon Only | Chart icon |\n\nBest/Worst are based on daily change % from your watchlist.\n\n## Updates\n\nStockDock checks for updates automatically on launch via [Sparkle](https://sparkle-project.org/). You can also check manually from **Settings → Check for Updates**. No action needed — updates install seamlessly in the background.\n\n## Data \u0026 Privacy\n\n- Real-time prices via Yahoo Finance WebSocket (~1 update/sec per symbol)\n- REST polling every 5 min as fallback for exchange rates\n- All data is stored locally in `~/Library/Application Support/StockDock/data.json` (watchlist, portfolios, alerts, portfolio notifications, webhook, and preferences)\n- No data is sent anywhere — the app only talks to Yahoo Finance APIs (and your own Discord/Slack webhook, if you enable it)\n- No account required, no API keys needed\n\n## FAQ\n\n**Is StockDock really free?**\nYes — free and open source under the MIT license, with no paid tier or subscription. If you want to support development, you can optionally [sponsor me](https://github.com/sponsors/simonsruggi).\n\n**Does it work on Intel Macs?**\nYes. StockDock ships as a universal binary for both Apple Silicon and Intel, on macOS 14 (Sonoma) and later.\n\n**Where does the data come from?**\nPublic Yahoo Finance endpoints (WebSocket for live prices, REST for exchange rates). No API key needed.\n\n**Can I track crypto, ETFs, or indices?**\nYes — anything with a Yahoo Finance symbol, including crypto, ETFs, and market indices.\n\n**Do you collect any data about me?**\nNo. There's no analytics, no telemetry, no account. Everything stays local on your Mac.\n\n**How do I uninstall it?**\n`brew uninstall stockdock` (or drag the app to the Trash), then optionally delete `~/Library/Application Support/StockDock`.\n\n## Tech Stack\n\n- Swift 5.9 / SwiftUI\n- macOS 14+ (Sonoma) — Universal binary (Apple Silicon + Intel)\n- Yahoo Finance WebSocket (real-time) + REST API (fallback)\n- [Sparkle](https://sparkle-project.org/) for auto-updates\n- [swift-protobuf](https://github.com/apple/swift-protobuf) for WebSocket decoding\n\n## Support the project\n\nStockDock is **free and open source, and it will always stay that way** — no paid tiers, no premium lock, no subscription, ever. It's also completely private: there's no analytics, no telemetry, no way for me to know how many people use it.\n\nIf you find it useful, the best (and free) thing you can do is **[⭐️ star the repo](https://github.com/simonsruggi/StockDock)** — it's quick and it's the only signal I get that the app is worth maintaining.\n\nAnd if you'd like to go a step further, you can **[💛 sponsor me on GitHub](https://github.com/sponsors/simonsruggi)**. It's completely optional and changes nothing about the app — every feature stays free for everyone — but it helps me keep building and maintaining StockDock and my other open-source projects. Thank you! 🙏\n\n## License\n\n[MIT](LICENSE) © [Simone Ruggiero](https://simoneruggiero.com)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsimonsruggi%2FStockDock","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsimonsruggi%2FStockDock","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsimonsruggi%2FStockDock/lists"}