Project Management
Projects are isolated workspaces within a team that provide data isolation, fine-grained access control, and API key management.
What is a Project?
A project is an isolated workspace that:
Belongs to a team - Every project is owned by exactly one team
Has its own API key - For service-to-service authentication
Provides data isolation - Backend services filter data by project
Has its own members - With specific roles (project_admin, editor, viewer)
Stores metadata - Custom configuration and settings
Example Project Structure
┌─────────────────────────────────────────────────────────────────────────────┐
│ PROJECT: LLM API │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ BASIC INFO │
│ ══════════ │
│ Team: Engineering │
│ Status: active │
│ Created: 2025-01-15 │
│ │
│ API KEY │
│ ═══════ │
│ sk-llm-api-abc123... (shown only at creation) │
│ Last used: 2025-01-20 14:30:00 │
│ │
│ MEMBERS │
│ ═══════ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ [email protected] │ project_admin │ explicit │ 2025-01-15 │ │
│ │ [email protected] │ editor │ explicit │ 2025-01-16 │ │
│ │ [email protected] │ viewer │ explicit │ 2025-01-17 │ │
│ │ [email protected] │ team_admin │ implicit │ (via team role) │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │
│ METADATA │
│ ════════ │
│ { │
│ "model": "gpt-4-turbo", │
│ "max_tokens": 8192, │
│ "temperature": 0.7, │
│ "config": { │
│ "destination_folder": ["production-outputs"], │
│ "enabled_features": ["summarization", "translation"] │
│ } │
│ } │
│ │
└─────────────────────────────────────────────────────────────────────────────┘Project Roles
project_admin
Project administrators have full control over the project:
Manage Members
Add/remove users, change roles
Edit Settings
Update project name, description
Manage Metadata
Create, update, delete metadata keys
Manage API Keys
Create/revoke project API keys
Full Data Access
Read and write all project data
editor
Editors can work with project data but cannot manage the project:
Read Data
View all project data
Write Data
Create, update, delete data
Execute Services
Call backend services
Cannot Manage
Cannot add members, change settings, or manage API keys
viewer
Viewers have read-only access:
Read Data
View all project data
Cannot Write
Cannot create, update, or delete data
Cannot Execute
Cannot call backend services
Cannot Manage
Cannot change anything
Data Isolation
One of the most important features of projects is data isolation. Each project's data is completely separate from other projects.
How It Works
Why This Matters
User A sees User B's data
User A only sees their project's data
Data leaks between projects
Complete separation
Security vulnerabilities
Secure by design
Backend Service Responsibility
⚠️ Critical: Backend services MUST filter all data by X-Project-ID:
Access Types
When viewing project members, you'll see an access_type field:
Explicit Access
User has a direct role assignment to the project.
Implicit Access
User has access via their team role (team_admin or team_member get implicit access to all team projects).
Access Hierarchy
Project Metadata
Projects can store arbitrary key-value metadata for configuration, settings, or custom data.
Common Use Cases
Model Configuration
{"model": "gpt-4", "temperature": 0.7}
Feature Flags
{"beta_features": true, "new_ui": false}
Integration Settings
{"webhook_url": "https://...", "notify_on_complete": true}
Storage Config
{"destination_folder": ["outputs"], "retention_days": 30}
Metadata Operations
Get All
Retrieve all metadata
read:project (viewer+)
Get Key
Retrieve specific key
read:project (viewer+)
Set Key
Create/update a key
write:project (project_admin+)
Merge
Update multiple keys
write:project (project_admin+)
Delete Key
Remove a key
write:project (project_admin+)
Metadata Best Practices
✅ Store configuration
❌ Store secrets/passwords
✅ Store feature flags
❌ Store large binary data
✅ Use consistent key names
❌ Store PII without encryption
✅ Document your keys
❌ Use metadata as a database
Admin Dashboard Features
Access project management at: /admin/projects
Project List View
Name
Project name
Team
Parent team
Members
Number of members
Status
active/inactive/archived
Created
Creation date
Project Detail View
Overview
Project info, stats, quick actions
Members
List members, add/remove, change roles
Metadata
View/edit configuration
API Keys
Manage project API keys
Settings
Edit name, description, status
Common Scenarios
Scenario 1: Creating a New Project
Scenario 2: Adding a User to a Project
Scenario 3: User Needs Different Access Level
Scenario 4: Configuring Project for a Service
Best Practices
Project Structure
One project per use case
Clear boundaries
Meaningful names
"LLM Production" not "Project 1"
Use descriptions
Document purpose
Consistent naming
"team-service-env" pattern
Member Management
Limit project_admins
1-2 per project
Use viewer for read-only needs
Principle of least privilege
Review membership regularly
Remove inactive users
Metadata Management
Document your keys
Others need to understand them
Use namespaces
config.model vs just model
Version sensitive changes
Track what changed when
Don't store secrets
Use Secret Manager instead
Troubleshooting
"You are not a member of this project"
Error: 403 Forbidden: You are not a member of this project
Cause: User doesn't have explicit or implicit project access.
Solution:
Add user to the project with appropriate role, OR
Add user to the team (team members have implicit access)
User may need to re-login for JWT to update
"User must be a team member first"
Error: 400 Bad Request: User must be a team member before being added to a project
Cause: Trying to add a user who isn't in the parent team.
Solution:
First add user to the team
Then add them to the project
"Cannot access project data"
Error: Data requests return empty or 403
Cause: User's JWT has wrong project_id, or backend isn't filtering correctly.
Solution:
Verify user is project member
User should re-login to get fresh JWT with correct project_id
Check backend service is using X-Project-ID header
"Metadata not updating"
Error: Metadata changes don't appear in backend service
Cause: Backend may cache metadata.
Solution:
Wait for cache TTL to expire
Backend should implement cache refresh
Verify metadata was actually saved in dashboard
Last updated