Sergey Krylov 60e456fbb5 perf: reduce portfolio enrichment from 298 to 2 MOEX API calls (-99.3%)
Three optimizations:
1. Merge getBondData + getBondMarketData into single batch call
   (same endpoint, parse both tables)
2. Remove redundant getSecurityDescription for shortName
   (shortName already in market data responses)
3. Batch by market: 1 call for all shares, 1 call for all bonds
   (instead of N individual calls)

Before: 298 API calls for 104 positions -> ~29.8s
After:  2 API calls for 104 positions -> ~0.3s
2026-06-14 13:19:22 +03:00

MoexVibe

Веб-приложение для анализа ценных бумаг Московской биржи (MOEX).

Tech Stack

  • Backend: NestJS, TypeScript, OpenAPI (Swagger)
  • Frontend: React, TypeScript, Vite, TanStack Query, lightweight-charts
  • Infrastructure: Docker, docker-compose

Quick Start

# Install dependencies
npm install

# Start backend (http://localhost:3000)
npm run dev:backend

# Start frontend (http://localhost:5173)
npm run dev:frontend

Swagger UI: http://localhost:3000/api/docs

Docker

docker compose up --build

Tests

npm run test:backend

Project Structure

apps/
  backend/     — NestJS API (single point of access to MOEX ISS)
  frontend/    — React SPA with Vite
docs/
  architecture/ — ADR documents and diagrams
  openapi/      — OpenAPI specification
  superpowers/  — Design specs and implementation plans
Description
No description provided
Readme 9.1 MiB
Languages
TypeScript 97.7%
Shell 1.2%
JavaScript 0.9%
CSS 0.2%