- single spec grammar for symbol and benchmark fields: commas join one portfolio (MSFT:0.6,V:0.4), spaces separate distinct symbols/portfolios; both fields accept one or many entries - benchmarks simulated with the same scheme/cost/tax rules; per-benchmark beta/alpha columns; after-tax benchmark curves - global Curve mode (pre/after/both) above the tabs; clean names in single-curve mode - live updates: field commits on Enter/blur, page recomputes per rerun; portfolio+tax sims cached (st.cache_data); plotly.js from CDN (4.6MB -> browser-cached) with F_INLINE_PLOTLY=1 offline fallback - chart: legend underneath, solid lines, pan sticks to data edges (width-preserving), zoom edge-clamped - inputs persist in settings.json across reloads/restarts/devices - tests: tests/test_app.py (AppTest) + tests/test_e2e_browser.py (Playwright) via ./run_tests.sh
16 lines
424 B
Bash
Executable File
16 lines
424 B
Bash
Executable File
#!/usr/bin/env bash
|
|
# Launch the Stock & Portfolio Analyzer web UI.
|
|
# Fixed port: 8599 (http://localhost:8599)
|
|
set -euo pipefail
|
|
cd "$(dirname "$0")"
|
|
|
|
if pgrep -f "streamlit run app\.py" >/dev/null; then
|
|
echo "already running: $(pgrep -af 'streamlit run app\.py' | head -1)"
|
|
exit 0
|
|
fi
|
|
|
|
exec .venv/bin/streamlit run app.py \
|
|
--server.port 8599 \
|
|
--server.headless true \
|
|
--browser.gatherUsageStats false
|