LinkDesk/.kiro/steering/tech.md

2.7 KiB

Technology Stack

Backend

  • Framework: FastAPI (Python web framework)
  • ORM: SQLAlchemy
  • Database: SQLite (vfx_project_management.db)
  • Authentication: JWT tokens (access + refresh)
  • Validation: Pydantic schemas
  • Password Hashing: passlib with bcrypt
  • File Handling: python-multipart, Pillow

Frontend

  • Framework: Vue 3 with Composition API
  • Language: TypeScript
  • Build Tool: Vite
  • Styling: Tailwind CSS
  • UI Components: shadcn-vue (based on Radix UI)
  • State Management: Pinia stores
  • Routing: Vue Router with navigation guards
  • HTTP Client: Axios with interceptors
  • Icons: lucide-vue-next

Common Commands

Backend (from /backend directory)

# Start development server
uvicorn main:app --reload --host 0.0.0.0 --port 8000

# Create virtual environment
python -m venv venv

# Activate virtual environment (Windows)
venv\Scripts\activate

# Install dependencies
pip install -r requirements.txt

# Database utilities
python create_fresh_database.py
python create_admin.py
python create_example_data.py

Frontend (from /frontend directory)

# Start development server
npm run dev

# Build for production
npm run build

# Type checking
npm run type-check

# Install dependencies
npm install

API Documentation

Development Ports

Important: FastAPI Trailing Slash Issue

CRITICAL: When adding or modifying API routes, always ensure trailing slashes match between frontend and backend to avoid 307 redirects that lose authentication headers.

The Problem

  • FastAPI redirects requests when trailing slashes don't match route definitions
  • HTTP 307 redirects do NOT preserve the Authorization header
  • This causes authenticated requests to fail with 403 Forbidden

The Solution

Always match trailing slashes between frontend API calls and backend route definitions:

// Frontend - WITH trailing slash for query params
apiClient.get(`/tasks/?shot_id=12`)

// Backend - Route defined WITH trailing slash
@router.get("/tasks/")
// Frontend - WITHOUT trailing slash for path params
apiClient.get(`/tasks/${taskId}`)

// Backend - Route defined WITHOUT trailing slash
@router.get("/tasks/{task_id}")

Quick Check

Look for these patterns in backend logs:

❌ BAD (redirect happening):
INFO: "GET /tasks?shot_id=12 HTTP/1.1" 307 Temporary Redirect
INFO: "GET /tasks/?shot_id=12 HTTP/1.1" 403 Forbidden

✅ GOOD (no redirect):
INFO: "GET /tasks/?shot_id=12 HTTP/1.1" 200 OK

See: backend/docs/fastapi-trailing-slash-issue.md for complete documentation.