This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Syft Space Server is a full-stack application with a FastAPI backend and Vue 3 frontend. The backend uses FastSyftBox framework and serves the frontend as static files from /frontend subpath. The application includes modular components for accounting, integrations, policies, profiles, services, and settings management.
- Framework: FastAPI with FastSyftBox wrapper
- Structure: Domain-driven design with components organized by feature
- Components: Each component has entities, handlers, interfaces, repositories, routes, and schemas
- Main Components:
accounting/- Financial tracking and billingintegrations/- External service integrations (Weaviate, vLLM models)policies/- Rate limiting and accounting guardsprofile/- User profile managementservice/- Core service functionalitysettings/- Application configurationshared/- Common utilities (database, errors, logging)
- Framework: Vue 3 with Composition API, TypeScript, Tailwind CSS
- UI Library: shadcn/ui components (located in
src/components/ui/) - State Management: Pinia stores
- Routing: Vue Router with pages in
src/pages/ - Components: Reusable components in
src/components/ - Composables: Shared logic in
src/composables/
# Setup and run backend (from project root)
./run.sh
# Manual setup
rm -rf .venv
uv venv -p 3.12
uv pip install -e backend/
# Run server
uv run uvicorn backend.main:app --reload --host 0.0.0.0 --port 8080
# Code quality (from backend/ directory)
black . # Format code
isort . # Sort imports
flake8 . # Lint code
mypy . # Type checking
pytest # Run testscd frontend
# Package management (use bun, not npm)
bun install # Install dependencies
bun add <package> # Add dependency
bun add -D <package> # Add dev dependency
# Development
bun dev # Start dev server
bun run build # Build for production
bun run preview # Preview production build
# Code quality - ALWAYS run these after making changes
bun run lint # Lint with ESLint and Oxlint
bun run typecheck # TypeScript type checking
bun run format # Format code with Prettier
# Testing
bun run test:unit # Unit tests with Vitest
bun run test:e2e:dev # E2E tests in development
bun run test:e2e # E2E tests against production build- Each component follows the same structure: entities, handlers, interfaces, repositories, routes, schemas
- Use SQLModel for database models
- Pydantic for request/response schemas
- FastAPI dependency injection for shared services
- Environment-based configuration via
config.py
- UI Components: Always use shadcn/ui components. If needed component doesn't exist, install with
npx shadcn-vue@latest add <component-name> - Icons: Use lucide-vue-next icons
- Styling: Tailwind CSS classes following existing patterns
- Forms: Use shadcn/ui form components with consistent validation
- File Organization:
- Pages in
src/pages/ - Reusable components in
src/components/ - UI components in
src/components/ui/ - Shared logic in
src/composables/ - State management in
src/stores/
- Pages in
- Backend: Black formatting (line-length 88), isort with black profile, type hints required
- Frontend: Vue 3 Composition API with
<script setup>, TypeScript, ESLint + Oxlint for linting
- Backend runs on configurable port (default 8080, set via
SYFTBOX_ASSIGNED_PORT) - Frontend served from
/syft-space-serversubpath - CORS enabled for localhost:5173 (frontend dev server)
- Uses SyftBox configuration from
~/.syftbox/config.json - SQLite database at
~/.syai-server/app.db
When integrating a backend API endpoint into the frontend:
-
Create API types in
frontend/src/api/types/index.ts:export interface MyResponse { // Match the backend Pydantic schema }
-
Add API function in
frontend/src/api/endpoints/:export const myApi = { fetch: async (params): Promise<MyResponse> => { const response = await apiClient.get('/my-endpoint', { params }) return response.data } }
-
Create composable for complex logic in
frontend/src/composables/:export function useMyFeature() { // Handle loading states, errors, data transformation }
-
Update components to use the API through stores or composables
- API types:
frontend/src/api/types/index.ts - API endpoint:
frontend/src/api/endpoints/datasets.ts - Composable:
frontend/src/composables/useDatasetBrowser.ts - Component:
frontend/src/components/FileExplorer.vue
- The frontend has its own CLAUDE.md with detailed UI component guidance
- Always run lint and typecheck commands after making changes
- Use bun for all frontend package operations
- Backend uses UV for Python package management
- The app serves frontend static files and redirects root to
/syft-space-server