Metadata-Version: 2.4
Name: voila-sus
Version: 0.1.0
Summary: Multi-objective suspension hardpoint optimiser (NSGA-II/III) over a validated Shark kinematic solver
Author: Owais Sadiqque
License-Expression: MIT
Project-URL: Homepage, https://github.com/owais-sadiqque-dayderh/Voila
Project-URL: Repository, https://github.com/owais-sadiqque-dayderh/Voila
Project-URL: Issues, https://github.com/owais-sadiqque-dayderh/Voila/issues
Keywords: suspension,kinematics,hardpoints,nsga,automotive
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Science/Research
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Topic :: Scientific/Engineering
Classifier: Operating System :: OS Independent
Requires-Python: >=3.10
Description-Content-Type: text/markdown
Requires-Dist: pymoo>=0.6.2
Requires-Dist: numpy
Requires-Dist: scipy
Requires-Dist: fastapi>=0.110
Requires-Dist: uvicorn[standard]>=0.29

# voila-sus

**Standalone** PyPI package for the Voila suspension hardpoint optimiser.

Everything needed to build, publish, and run lives inside this folder. After
`pip install voila-sus`, users need nothing else from the repo — no parent
`solver/` tree, no Node.js, no separate clone step.

```
pypi/
├── pyproject.toml
├── build.sh
├── README.md
└── src/voila_sus/          ← entire app (solver + optimiser + UI)
    ├── cli.py              ← `voila-sus` command
    ├── kinematic_solver.py
    ├── shark_api.py
    ├── report_parser.py
    ├── report_writer.py
    └── optimization/
        ├── server.py       ← FastAPI backend
        ├── metrics.py …
        └── web/
            ├── src/        ← React source (for UI changes)
            ├── dist/       ← pre-built UI (shipped in the wheel)
            └── package.json
```

## For users (after you publish to PyPI)

```bash
pip install voila-sus
voila-sus
```

Opens the browser at `http://127.0.0.1:8000`. Uses their CPU and saves
geometries to `~/Desktop/Suspension Geometries`.

Options: `voila-sus --port 9000` · `voila-sus --no-browser`

## For you — build a release

```bash
cd solver/pypi          # or just pypi/ if Voila repo root is solver/
chmod +x build.sh
./build.sh
```

Produces `dist/voila_sus-0.1.0-py3-none-any.whl`. The wheel bundles:

- Shark kinematic solver (pure Python)
- NSGA-II / III optimiser
- Pre-built React UI (`web/dist/`)

Node is only needed if you change the frontend (`web/src/`) and rebuild.

## Publish to PyPI

1. [pypi.org](https://pypi.org) account + **2FA** + **API token**
2. `pip install twine`
3. TestPyPI dry run (optional): `twine upload --repository testpypi dist/*`
4. Production: `twine upload dist/*`

Check name availability: [pypi.org/project/voila-sus](https://pypi.org/project/voila-sus/)

## Bump version

Edit `version` in `pyproject.toml` and `src/voila_sus/__init__.py`, then `./build.sh`.

## Install from Git (without PyPI)

If the repo contains this `pypi/` folder with committed `web/dist/`:

```bash
pip install "git+https://github.com/owais-sadiqque-dayderh/Voila.git#subdirectory=pypi"
```

(Adjust the subdirectory path if your repo layout differs.)

## Standalone vs old `solver/` folder

| | `solver/` (dev tree) | `solver/pypi/` (this package) |
|---|---|---|
| Purpose | Local development, fixtures, tests | Distribution via pip |
| Depends on sibling files? | Yes | **No — self-contained** |
| What users need | Clone + manual setup | `pip install voila-sus` |

If you edit the app in `solver/` during development, copy changes into
`pypi/src/voila_sus/` before releasing (or edit here directly).
