# Server (Express API Backend)

**Generated:** 2026-02-19
**Location:** server/

## OVERVIEW

Express 5 + TypeScript backend serving REST API endpoints for homelab topology discovery.

## STRUCTURE

```
server/
├── index.ts         # Express app entry, CORS, route mounting
├── config.ts        # Server configuration
├── types.ts         # Shared TypeScript types
├── config.json      # Runtime config (contains hosts, credentials)
├── config.example.json
└── routes/          # API endpoints
    ├── discover.ts  # POST /api/discover - SSH discovery
    ├── config.ts    # GET/PUT /api/config
    ├── stats.ts     # GET /api/stats
    └── files.ts     # GET /api/files
```

## WHERE TO LOOK

| Task | File | Notes |
|------|------|-------|
| Add new endpoint | server/routes/{name}.ts | Create router, import in index.ts |
| Modify CORS | server/index.ts | CORS middleware (line 12-15) |
| Change port | server/index.ts | PORT const (line 9) |

## CONVENTIONS

- **Route files**: Export default router, mount in index.ts via `app.use('/api', router)`
- **Error handling**: Return JSON `{ error: string }` on failure
- **Config**: Use server/config.ts for shared config, not hardcode
- **Credentials**: Never log or expose SSH credentials in responses

## ANTI-PATTERNS

- **NEVER expose SSH credentials in API responses**
- **DO NOT store credentials in source** - use server/config.json

## API ENDPOINTS

| Method | Path | Purpose |
|--------|------|---------|
| POST | /api/discover | Run SSH discovery on hosts |
| GET | /api/config | Get configuration |
| PUT | /api/config | Update configuration |
| GET | /api/stats | Get statistics |
| GET | /api/files | Get file topology |

## NOTES

- Server runs on port 3001
- CORS allows only `http://localhost:3000`
- Health check: GET /api/health
