{"id":50776224,"url":"https://github.com/simonsruggi/stockdock","last_synced_at":"2026-06-12T00:01:22.005Z","repository":{"id":342535751,"uuid":"1164365050","full_name":"simonsruggi/StockDock","owner":"simonsruggi","description":"Free macOS menu bar app to track stocks, watchlists \u0026 portfolios in real-time. Built with SwiftUI.","archived":false,"fork":false,"pushed_at":"2026-06-08T00:21:11.000Z","size":3651,"stargazers_count":4,"open_issues_count":0,"forks_count":4,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-06-08T02:19:07.714Z","etag":null,"topics":["finance","macos","menu-bar","menu-bar-app","menubar","open-source","portfolio","sparkle","stock-market","stocks","swift","swiftui","watchlist"],"latest_commit_sha":null,"homepage":null,"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":null,"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}},"created_at":"2026-02-23T01:55:14.000Z","updated_at":"2026-06-08T02:07:33.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":11,"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":34222709,"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-06-11T02:00:06.485Z","response_time":57,"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":["finance","macos","menu-bar","menu-bar-app","menubar","open-source","portfolio","sparkle","stock-market","stocks","swift","swiftui","watchlist"],"created_at":"2026-06-12T00:00:34.928Z","updated_at":"2026-06-12T00:01:21.990Z","avatar_url":"https://github.com/simonsruggi.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# StockDock\n\nA lightweight macOS menu bar app for tracking stocks and portfolios in real time.\n\nBuilt with SwiftUI. No account required, no API keys needed — data comes directly from Yahoo Finance.\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- **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- **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### 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| **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## 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## License\n\nMIT\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"}