Web app for selecting CSV files from data/, exploring columns, and plotting graphs.
- Backend: FastAPI + pandas
- Frontend: React + Vite + Plotly
- Dataset identity: permanent slug per CSV in
backend/app/storage/datasets.json
- List datasets and navigate by slug (
/datasets/:slug) - Read schema from CSV columns
- Build charts from selected columns
- Password-protected CSV uploads
- Copy env file:
cp infra/.env.example infra/.env-
Update
UPLOAD_PASSWORDininfra/.env. -
Start both services:
docker compose up --build- Open:
- Frontend:
http://localhost:5173 - Backend API:
http://localhost:8000
- Stop services:
docker compose downThe production Compose file serves the built React app with Nginx and proxies /api and /health to the FastAPI backend. It binds to 127.0.0.1:8080 so your existing reverse proxy can own public ports 80 and 443.
-
Point DNS for
kebab.sevenlayer.orgat the server running Docker. -
Create/update
infra/.env:
UPLOAD_PASSWORD=replace_me
CORS_ORIGINS=https://kebab.sevenlayer.org
VITE_API_BASE_URL=- Start production services:
docker compose -f docker-compose.prod.yml up --build -d- Verify locally on the server:
curl -f http://127.0.0.1:8080/health- Configure your existing reverse proxy for
kebab.sevenlayer.org:
upstream: http://127.0.0.1:8080
websocket support: not required
max upload/body size: at least 1024 MB if uploading large CSVs
- Verify from a browser:
https://kebab.sevenlayer.orghttps://kebab.sevenlayer.org/health
- Backend:
cd backend
uv venv .venv
uv pip install --python .venv/bin/python -e ".[dev]"
source .venv/bin/activate
uvicorn app.main:app --reload- Frontend:
cd frontend
npm install
npm run devGET /healthGET /api/datasetsGET /api/datasets/{slug}/schemaPOST /api/datasets/{slug}/previewPOST /api/datasets/{slug}/chart-dataPOST /api/uploadwithAuthorization: Bearer <UPLOAD_PASSWORD>
Install Node.js 22+ and uv, then run from the repository root:
npm ci
npm ci --prefix frontend
uv sync --locked --project backend --extra dev
npm run format
npm run checknpm ci enables Husky commit and push hooks. They run the same checks as CI:
Prettier formatting, the existing ESLint rules with no warnings allowed,
TypeScript type checking, Ruff linting and formatting, and ty Python type checking.
The hooks check without modifying or staging files; npm run format applies
formatting and safe lint fixes. Dataset files, generated registries, dependencies,
and build output are excluded from Prettier.
GitHub Actions runs on pushes to every branch and on pull requests. Require the
Code quality / quality status check in repository rulesets to block failing
merges. CI reports failed pushes; GitHub rulesets enforce merge restrictions.