# Development Setup Guide

This guide explains how to run Archipelago locally for development.

## Prerequisites

- **Rust** (latest stable) - [Install Rust](https://rustup.rs/)
- **Node.js** (v18+) and **npm** - [Install Node.js](https://nodejs.org/)
- **Podman** (for container features) - [Install Podman](https://podman.io/getting-started/installation)
- **PostgreSQL** (for backend database) - [Install PostgreSQL](https://www.postgresql.org/download/)

## Project Structure

The project has two main components:

1. **Backend** (`core/startos/`) - Rust backend with RPC API
2. **Frontend** (`neode-ui/`) - Vue.js 3 frontend

## Quick Start

### Option 1: Mock Backend (Fastest for UI Development)

For frontend-only development, use the mock backend:

```bash
cd neode-ui
npm install
npm run dev:mock
```

This starts:
- Mock backend server on port 3000
- Vite dev server on port 8100
- Open http://localhost:8100

### Option 2: Full Stack Development

For full-stack development with the real backend:

#### Terminal 1: Backend

```bash
cd core
cargo run --bin startbox --features cli,daemon
```

The backend will:
- Start RPC server on port 5959
- Initialize database if needed
- Serve API endpoints

#### Terminal 2: Frontend

```bash
cd neode-ui
npm install
npm run dev:real
```

Or just:
```bash
npm run dev
```

The frontend will:
- Start Vite dev server on port 8100
- Proxy API requests to backend on port 5959
- Open http://localhost:8100

## Development Scripts

### Frontend Scripts (`neode-ui/package.json`)

- `npm run dev` - Start Vite dev server
- `npm run dev:mock` - Start with mock backend
- `npm run dev:real` - Start with real backend (backend must be running separately)
- `npm run build` - Build for production
- `npm run type-check` - TypeScript type checking

### Backend Scripts

- `cargo run --bin startbox` - Run backend in dev mode
- `cargo run --bin startbox --release` - Run backend in release mode
- `cargo test` - Run tests
- `cargo build` - Build backend

## Environment Variables

### Backend

Create `.env` in `core/` directory:

```bash
DATADIR=/tmp/archipelago-dev
RPC_BIND=127.0.0.1:5959
LOG_LEVEL=debug
```

### Frontend

Create `.env` in `neode-ui/` directory:

```bash
VITE_BACKEND_URL=http://localhost:5959
VITE_API_BASE=/rpc/v1
```

## Database Setup

The backend uses PostgreSQL. For development:

```bash
# Create database
createdb archipelago_dev

# Or use Docker
docker run -d \
  --name archipelago-postgres \
  -e POSTGRES_PASSWORD=dev \
  -e POSTGRES_DB=archipelago_dev \
  -p 5432:5432 \
  postgres:15
```

## Container Development

To test container features locally, you need Podman:

```bash
# Install Podman (macOS)
brew install podman

# Initialize Podman machine
podman machine init
podman machine start

# Verify
podman --version
```

## Hot Reload

- **Frontend**: Vite provides instant hot module replacement (HMR)
- **Backend**: Use `cargo watch` for auto-reload:

```bash
cargo install cargo-watch
cargo watch -x 'run --bin startbox'
```

## Debugging

### Frontend

- Use browser DevTools
- Vue DevTools extension recommended
- Console logs available

### Backend

- Use `RUST_LOG=debug` environment variable
- Add `println!` or use `tracing` macros
- Use a debugger like `lldb` or `gdb`

## Common Issues

### Port Already in Use

If port 5959 or 8100 is already in use:

```bash
# Backend - change port in .env
RPC_BIND=127.0.0.1:5958

# Frontend - change in vite.config.ts
server: { port: 8101 }
```

### Database Connection Errors

- Ensure PostgreSQL is running
- Check connection string in backend config
- Verify database exists

### Container Features Not Working

- Ensure Podman is installed and running
- Check Podman machine is started (macOS)
- Verify rootless Podman is configured

## Testing

### Frontend Tests

```bash
cd neode-ui
npm test
```

### Backend Tests

```bash
cd core
cargo test
```

## Building for Production

### Frontend

```bash
cd neode-ui
npm run build
```

Output: `dist/` directory

### Backend

```bash
cd core
cargo build --release
```

Output: `target/release/startbox`

## Next Steps

- Read [Architecture Documentation](./architecture.md)
- Check [App Manifest Specification](./app-manifest-spec.md)
- Review [Coding Standards](../CODING_STANDARDS.md)
