EN | RU
Beautiful desktop widget for real-time S&P 500 tracking and stock portfolio management. Built with Electron.
- Real-time S&P 500 tracking — live index price, updated every 15 seconds
- Portfolio management — buy, sell, and track your stock holdings
- Live quotes — real-time stock prices from Yahoo Finance
- Trend analytics — weekly, monthly, and yearly performance (S&P 500 & portfolio)
- Auto-start — launches automatically with Windows
- Compact design — minimal, beautiful widget that stays out of your way
- Transparent rounded corners — pixel-perfect look, no visual artifacts
- Connection status indicator — green/yellow/red dot shows data freshness
- Offline resilience — cached data shown when connection is lost
This version has been fully hardened following Electron security best practices:
- Context Isolation enabled — renderer process has zero access to Node.js APIs
- Preload script with
contextBridge— only whitelisted IPC methods are exposed - Content Security Policy (CSP) — restricts script/style/font sources
- No
nodeIntegration— renderer runs in a sandboxed environment - All network requests via main process — renderer never touches the network directly
- Fetch with retry + timeout — resilient to transient network failures
- No
alert()/confirm()— replaced with non-blocking HTML notifications and modals
sp500-widget/
├── main.js # Electron main process (window, tray, IPC, data fetching, caching)
├── preload.js # contextBridge — safe IPC API for renderer
├── renderer.js # Frontend logic (UI, portfolio, trends)
├── styles.css # All styles
├── index.html # Clean HTML markup only
├── installer.nsh # NSIS installer script (autostart, migration, cleanup)
├── package.json # Config + electron-builder settings
└── icons/ # App icons
Yahoo Finance API <--> main.js (fetch + cache + retry) <--> preload.js (contextBridge) <--> renderer.js (UI)
- Prices: cached 10 seconds, retry up to 3 times with backoff
- Historical data (1Y): cached 5 minutes — no hammering Yahoo API
- Stale cache fallback: if API fails, last cached data is used (up to 10 min)
- Download
SP500-Widget-Setup-1.0.0-x64.exefrom Releases - Run the installer — choose install directory
- Widget starts automatically after install and on every Windows boot
Download SP500-Widget-Portable-1.0.0.exe — no installation required.
The installer automatically:
- Kills the running old widget process
- Cleans up old config files (
.sp500-widget-config.json,.sp500-widget-temp.json) - Preserves your portfolio data — migrated to new format on first launch
- Updates the Windows autostart registry entry
- Node.js 18+
- npm
git clone https://github.com/cmeept/sp500-widget.git
cd sp500-widget
npm install
npm start # Run the widget
npm run dev # Run with DevTools enabled
npm run build-installer # Build Windows installer
npm run build-portable # Build portable version- Enabled
contextIsolation: true+ disablednodeIntegration - Created
preload.jswithcontextBridge(only safe IPC methods exposed) - Added Content Security Policy header
- Replaced
alert()/confirm()/prompt()with HTML notifications and modals - DevTools only enabled via
--devflag
- Split monolithic
index.html(2248 lines) intoindex.html+styles.css+renderer.js - Eliminated 4x duplicated show/hide form handlers in main.js → single function
- Replaced 3 manual JSON config files with
electron-store - Removed
node-fetchdependency (nativefetchin Electron 28+)
- Fixed portfolio trend calculation — old code used array index offset (
findPriceAt(365)) which confused trading days with calendar days. New code uses binary search on timestamps to find the correct price at any date - All network requests moved to main process — cached, retried, with timeout
- Separated update intervals: prices every 15s, trends every 60s (historical data cached 5 min)
- Fetch with retry (3 attempts, exponential backoff, 10s timeout)
- Data cache with stale fallback (if API fails, shows last cached data)
- Connection status indicator (green/yellow/red)
- Graceful offline handling
- Fixed widget not draggable after refactor (
-webkit-app-region: dragon body) - Fixed black corners —
transparent: truewindow with CSS border-radius - Removed all debug junk (test fields, alternative inputs,
window.testPrompt, etc.) - Removed old files:
index_old.html,main_old.js,nul,test.html
- Old process killed before install
- Old config files cleaned up
- Portfolio data preserved and migrated on first launch
- Clean uninstall with option to keep or remove user data
- Electron: 37.2.1 → 41.0.4
- electron-builder: 24.13.3 → 26.8.1
- Removed:
node-fetch(native fetch available)
EN | RU
Красивый десктопный виджет для отслеживания индекса S&P 500 в реальном времени и управления портфелем акций. Построен на Electron.
- Отслеживание S&P 500 в реальном времени — актуальная цена индекса, обновление каждые 15 секунд
- Управление портфелем — покупка, продажа и отслеживание акций
- Живые котировки — актуальные цены акций с Yahoo Finance
- Аналитика трендов — недельная, месячная и годовая динамика (S&P 500 и портфель)
- Автозапуск — запускается автоматически с Windows
- Компактный дизайн — минималистичный, красивый виджет
- Прозрачные скруглённые углы — идеальный вид без визуальных артефактов
- Индикатор соединения — зелёная/жёлтая/красная точка показывает свежесть данных
- Работа офлайн — кешированные данные показываются при потере соединения
Версия полностью защищена по лучшим практикам безопасности Electron:
- Context Isolation включён — renderer-процесс не имеет доступа к Node.js API
- Preload-скрипт с
contextBridge— открыты только разрешённые IPC-методы - Content Security Policy (CSP) — ограничены источники скриптов, стилей, шрифтов
nodeIntegrationотключён — renderer работает в изолированной среде- Все сетевые запросы через main process — renderer не обращается к сети напрямую
- Fetch с повторами и таймаутом — устойчивость к сбоям сети
- Нет
alert()/confirm()— заменены на HTML-нотификации и модальные окна
sp500-widget/
├── main.js # Main process (окно, трей, IPC, загрузка данных, кеш)
├── preload.js # contextBridge — безопасный IPC API для renderer
├── renderer.js # Логика фронтенда (UI, портфель, тренды)
├── styles.css # Все стили
├── index.html # Чистая HTML-разметка
├── installer.nsh # NSIS-скрипт установщика (автозапуск, миграция, очистка)
├── package.json # Конфигурация + настройки electron-builder
└── icons/ # Иконки приложения
Yahoo Finance API <--> main.js (fetch + кеш + retry) <--> preload.js (contextBridge) <--> renderer.js (UI)
- Цены: кеш 10 секунд, до 3 повторов с нарастающей задержкой
- Исторические данные (1 год): кеш 5 минут
- Fallback на устаревший кеш: при сбое API показываются последние данные (до 10 мин)
- Скачайте
SP500-Widget-Setup-1.0.0-x64.exeиз Releases - Запустите установщик — выберите каталог установки
- Виджет запустится автоматически после установки и при каждой загрузке Windows
Скачайте SP500-Widget-Portable-1.0.0.exe — установка не требуется.
Установщик автоматически:
- Завершает запущенный старый процесс виджета
- Удаляет старые файлы конфигурации
- Сохраняет данные портфеля — мигрирует в новый формат при первом запуске
- Обновляет запись автозапуска в реестре Windows
- Node.js 18+
- npm
git clone https://github.com/cmeept/sp500-widget.git
cd sp500-widget
npm install
npm start # Запуск виджета
npm run dev # Запуск с DevTools
npm run build-installer # Сборка Windows-установщика
npm run build-portable # Сборка портативной версии- Включён
contextIsolation: true+ отключёнnodeIntegration - Создан
preload.jsсcontextBridge(открыты только безопасные IPC-методы) - Добавлен заголовок Content Security Policy
alert()/confirm()/prompt()заменены на HTML-нотификации и модальные окна- DevTools включаются только через флаг
--dev
- Монолитный
index.html(2248 строк) разделён наindex.html+styles.css+renderer.js - 4 дублированных обработчика show/hide форм → одна функция
- 3 ручных JSON-файла конфигурации заменены на
electron-store - Удалена зависимость
node-fetch(нативныйfetchв Electron 28+)
- Исправлен расчёт трендов портфеля — старый код использовал смещение индекса массива (
findPriceAt(365)), путая торговые и календарные дни. Новый код использует бинарный поиск по timestamp для нахождения цены на любую дату - Все сетевые запросы перенесены в main process — с кешем, повторами и таймаутом
- Разделены интервалы обновления: цены каждые 15 сек, тренды каждые 60 сек (исторические данные кешируются 5 мин)
- Fetch с повторами (3 попытки, экспоненциальный backoff, таймаут 10 сек)
- Кеш данных с fallback на устаревшие (при сбое API показываются последние данные)
- Индикатор состояния соединения (зелёный/жёлтый/красный)
- Корректная работа офлайн
- Исправлено перетаскивание виджета (
-webkit-app-region: dragна body) - Исправлены чёрные углы —
transparent: trueокно с CSS border-radius - Удалён весь отладочный мусор (тестовые поля, альтернативные инпуты,
window.testPromptи т.д.) - Удалены старые файлы:
index_old.html,main_old.js,nul,test.html
- Старый процесс завершается перед установкой
- Старые файлы конфигурации очищаются
- Данные портфеля сохраняются и мигрируются при первом запуске
- Чистое удаление с возможностью сохранить или удалить данные пользователя
- Electron: 37.2.1 → 41.0.4
- electron-builder: 24.13.3 → 26.8.1
- Удалён:
node-fetch(доступен нативный fetch)
MIT License — see LICENSE
Made for traders and investors