The collect endpoints were defined as async def but called synchronous collector.run() directly, blocking the single uvicorn event loop for up to 15+ minutes during price collection. This caused all other requests (including auth/login) to hang, making the app unusable. Backend: Run each collector in a daemon thread with its own DB session, returning HTTP 200 immediately. The collector logs status to JobLog as before, which the frontend can poll. Frontend: Auto-poll job status every 3s while any job is "running", with a visual indicator. Disable collect buttons during active jobs. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Galaxis-Po
Integrated Quant Portfolio Management Application
Tech Stack
- Backend: FastAPI, Python 3.12, SQLAlchemy, PostgreSQL
- Frontend: Next.js 15, React 19, TypeScript, Tailwind CSS
- Infrastructure: Docker, Docker Compose, uv
Development
Prerequisites
- Docker & Docker Compose
- Python 3.12
- Node.js 24
- uv (Python package manager)
Quick Start
# Start all services
docker-compose up -d
# Backend only (development)
cd backend
uv sync
uv run uvicorn app.main:app --reload
# Frontend only (development)
cd frontend
npm install
npm run dev
Project Structure
galaxis-po/
├── backend/ # FastAPI backend
├── frontend/ # Next.js frontend
├── docker-compose.yml
└── docs/plans/ # Implementation plans
Description
Languages
Python
50.6%
TypeScript
48.7%
CSS
0.3%
Dockerfile
0.3%