Single-container supervisord approach added unnecessary complexity.
Two containers is simpler and more standard:
- Dockerfile.backend: python:3.11-slim, uvicorn on port 8000
- Dockerfile.frontend: node build → nginx:alpine on port 80
- nginx.conf: proxy_pass restored to http://backend:8000
- docker-compose.yml: two services with depends_on
- Removed combined Dockerfile and supervisord.conf
Each container does one thing; logs are separate; either can be
restarted independently.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Rewrite airport search to use priority buckets instead of simple
append: exact IATA → IATA prefix → city prefix → city contains →
name prefix → name contains → country match. This ensures BER
appears before Berlin-Schönefeld when typing "BER".
- Add _MISSING_AIRPORTS patch list to get_airport_data() so airports
absent from the OpenFlights dataset (e.g. BER opened Nov 2020,
IST new Istanbul airport) are included at runtime.
- Deduplicate results via seen-set to avoid duplicate entries.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Added fastapi, uvicorn, pydantic, requests to requirements.txt
(were missing — only CLI deps were present)
- Changed fast-flights entry to git+GitHub URL (v3 not on PyPI)
- Added git to apt-get install in Dockerfile (needed for pip git+ URL)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace two-container setup (separate backend + nginx frontend) with a
single image that runs both via supervisord:
- New Dockerfile: Node stage builds React, Python+nginx stage is the runtime
- supervisord.conf: manages uvicorn (api_server.py) + nginx as sibling procs
- nginx.conf: proxy_pass updated to localhost:8000 (same container)
- docker-compose.yml: simplified to one service on port 80
Deploy:
docker-compose up -d # or
docker build -t flight-radar . && docker run -p 80:80 flight-radar
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Each date row now shows e.g. "WED 2026-04-01" — the 3-letter weekday
prefix is rendered in muted monospace before the date string.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Auto-refresh toggle (RefreshCw icon, animates when active, polls every 5s)
- Horizontal filter bar: level select (140px) + search input + Clear button
- Clear button only rendered when level or search is active
- Level badges: INFO=blue, WARNING=amber, ERROR=red, CRITICAL=dark red, DEBUG=grey
- Row background tints: ERROR=#FFF5F5, WARNING=#FFFBF0, CRITICAL=#FFF0F0
- Message text in font-mono, metadata line with · separators
- Right-aligned timestamp: time on first line, date below
- Skeleton loading (8× SkeletonTableRow) while fetching
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>