# Development setup

Speedwave's codebase spans Rust, Angular, Node.js, and Swift. See the [tech stack](/docs/contributing/tech-stack/) page for how those pieces fit together. GNU Make wraps all of it, so setting up your machine mostly means installing prerequisites and letting `make setup-dev` do the rest.

## Prerequisites

- **Rust**, stable toolchain, via `rustup`
- **Node.js**, LTS (v20+), with npm
- **Platform tools**: Xcode command-line tools on macOS, Visual Studio Build Tools on Windows

Run `make setup-dev` to check for these and install the remaining dependencies automatically.

## Building and testing

Use the `Makefile` for every build, test, and check, not `cargo` or `npm` directly: it sets the working directories and flags each stack needs.

The main targets:

```bash
make setup-dev      # first-time: check prerequisites + install all dependencies
make test           # run all tests (Rust + Angular + MCP + entrypoint + desktop)
make check          # lint + clippy + type-check + format
make check-all       # full quality gate: check + test + coverage + audit
make coverage-html   # generate HTML coverage reports and open in browser
make audit           # check dependencies for known vulnerabilities
make dev             # start desktop in dev mode (Tauri + Angular hot reload)
make build           # build everything
make fmt             # format all code
make status          # quick health check
```

Granular targets exist per stack too: `test-rust`, `test-angular`, `test-mcp`, `test-swift`, `build-cli`, `build-desktop`, `build-angular`. See [testing](/docs/contributing/testing/) for how the test runners and coverage thresholds break down.

Two CLI targets matter if you touch the CLI binary. `make build-cli` builds the **debug** binary at `target/debug/speedwave`, which `make dev` uses. `make build-cli-release` builds the **release** binary: the bundled CLI must be release so a debug-only signature bypass is compiled out of shipped builds.

## Running in dev mode

`make dev` builds the CLI first and copies it into `desktop/src-tauri/cli/` before starting Tauri dev mode, so the desktop app's "Open Terminal" feature works while you develop.
**Note:** `desktop/src/angular.json` disables Angular CLI analytics on purpose. Without that, a fresh machine gets an interactive telemetry prompt on the first `ng serve`, `ng test`, or `ng build`, and that prompt waits on stdin forever, hanging `make dev` and the Angular test suite.

On Windows, a few toolchain quirks need handling before `make dev` runs natively: see [Windows setup](/docs/contributing/windows-setup/).