diff --git a/MicCheck.slnx b/MicCheck.slnx
index f24785e..ca6f511 100755
--- a/MicCheck.slnx
+++ b/MicCheck.slnx
@@ -3,7 +3,6 @@
-
diff --git a/dev-build.sh b/dev-build.sh
index 27eee0f..7e7a0fb 100755
--- a/dev-build.sh
+++ b/dev-build.sh
@@ -3,27 +3,19 @@ set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
-build_api() {
- echo "Building API..."
- dotnet publish "$SCRIPT_DIR/src/api/MicCheck.Api/MicCheck.Api.csproj" -c Release -o "$SCRIPT_DIR/src/api/MicCheck.Api/publish"
- docker compose -f "$SCRIPT_DIR/docker-compose.yml" restart api
- echo "API done."
-}
+echo "Building solution..."
+dotnet build "$SCRIPT_DIR/MicCheck.slnx"
-build_admin() {
- echo "Building admin..."
- npm --prefix "$SCRIPT_DIR/src/admin" ci --silent
- npm --prefix "$SCRIPT_DIR/src/admin" run build
- docker compose -f "$SCRIPT_DIR/docker-compose.yml" restart admin
- echo "Admin done."
-}
+echo "Installing admin dependencies..."
+npm --prefix "$SCRIPT_DIR/src/admin" ci --silent
-case "${1:-all}" in
- api) build_api ;;
- admin) build_admin ;;
- all) build_api && build_admin ;;
- *)
- echo "Usage: $0 [api|admin|all]"
- exit 1
- ;;
-esac
+echo "Building admin..."
+npm --prefix "$SCRIPT_DIR/src/admin" run build
+
+echo "Running .NET unit tests..."
+dotnet test "$SCRIPT_DIR/tests/api/MicCheck.Api.Tests.Unit/MicCheck.Api.Tests.Unit.csproj"
+
+echo "Running Jest tests..."
+npm --prefix "$SCRIPT_DIR/src/admin" test
+
+echo "Build and tests complete."
diff --git a/readme.md b/readme.md
index e34021b..c2a25c0 100755
--- a/readme.md
+++ b/readme.md
@@ -29,10 +29,11 @@ Code in the API is organized by feature area (e.g. `Features`, `Segments`, `Iden
## Running locally
-`docker-compose.yml` provides supporting services. `MicCheck.AppHost` (.NET Aspire) orchestrates the API and admin app for local development.
+`MicCheck.AppHost` (.NET Aspire) orchestrates the API, admin app, and supporting services for local development.
```sh
./dev-build.sh
+aspire run --project src/MicCheck.AppHost
```
## Testing