# Milestone 1: Foundation

**Duration:** 2 weeks  
**Goal:** Working server that can serve markdown files as HTML

## Tasks

### Week 1: Project Setup & Infrastructure

- [ ] Initialize monorepo structure
  - `apps/server/` with Go module
  - embedded templates and static assets under `apps/server/internal/httpserver/`
  - `packages/protocol/` with protobuf schema
  - `docs/` with existing documentation
  
- [ ] Go server skeleton
  - `main.go` with graceful shutdown
  - Chi router with middleware chain
  - Configuration management (environment variables + config file)
  - Structured logging (slog)
  
- [ ] Database layer
  - libsql connection setup
  - Migration system (golang-migrate)
  - Initial schema (users, documents, document_versions)
  - Query builder / repository pattern
  
- [ ] Docker setup
  - Multi-stage Dockerfile for Go app
  - `docker-compose.yml` with volume mounts
  - Health check endpoint
  - Non-root user in container

### Week 2: Markdown Rendering & Static Serving

- [ ] Markdown parser integration
  - Goldmark with all extensions
  - Wiki-link parser: `[[Page Name]]` → internal link
  - Tag extractor: `#tagname` → tag link
  - Admonition support: `> [!NOTE]` blocks
  - Mermaid diagram containers
  - Math markup containers (KaTeX)
  
- [ ] Template system
  - Base layout template (header, nav, footer)
  - Document template with rendered markdown
  - Error page templates (404, 500)
  - Design system CSS custom properties
  
- [ ] Static file serving
  - Content-addressed filesystem setup
  - File upload endpoint (basic)
  - Security headers middleware
  - MIME type detection
  
- [ ] Initial browser UI
  - Go template routes
  - Embedded framework-free browser scripts
  - Progressive enhancement entry points
  - CSS design system foundation

## Acceptance Criteria

### Functional
- [ ] Server starts and listens on configurable port (default 8080)
- [ ] Database auto-migrates on startup with no manual intervention
- [ ] Markdown files render correctly with all extensions:
  - [ ] Wiki-links resolve to internal document paths
  - [ ] Tags are extracted and displayed
  - [ ] Admonitions render with appropriate styling
  - [ ] Mermaid diagrams have syntax-highlighted containers
  - [ ] Math markup has proper delimiters for KaTeX
- [ ] Attachments served with correct Content-Type headers
- [ ] 404 and 500 pages render correctly

### Non-Functional
- [ ] Docker compose brings up full stack with `docker-compose up -d`
- [ ] Container health check passes within 30 seconds
- [ ] All Go dependencies pinned in go.sum
- [ ] Build is reproducible (same commit → same binary hash)
- [ ] No plaintext secrets in code or logs
- [ ] Security headers present on all responses:
  - [ ] Content-Security-Policy
  - [ ] X-Content-Type-Options: nosniff
  - [ ] X-Frame-Options: DENY
  - [ ] Referrer-Policy: strict-origin-when-cross-origin

### Performance
- [ ] Initial page load (TTFB) <100ms for cached documents
- [ ] Markdown rendering <50ms for documents <100KB
- [ ] Static file serving supports 1000 concurrent requests

## Deliverables

1. Working development environment (README with setup instructions)
2. CI pipeline (GitHub Actions or similar) with:
   - Go tests
   - TypeScript type checking
   - Dockerfile build
   - Security scan (govulncheck)
3. API documentation (OpenAPI spec)
4. Database migration files

## Risk Mitigation

| Risk | Mitigation |
|------|-----------|
| Goldmark extension conflicts | Test each extension in isolation, then combined |
| Docker volume permissions | Document UID/GID requirements, provide setup script |
| libsql compatibility | Test on both native SQLite and Turso cloud |

## Definition of Done

- [ ] All acceptance criteria pass
- [ ] Code review completed
- [ ] Documentation updated
- [ ] CI pipeline green
- [ ] Security scan shows no critical/high vulnerabilities
