Skip to main content

Overview

Projects are the top-level organizational unit in Mimir AIP. Each project groups all related resources for a specific use case or domain, providing isolation and management for:
  • Pipelines: Data ingestion and processing workflows
  • Ontologies: Domain vocabulary and entity definitions
  • ML Models: Machine learning models for predictions
  • Digital Twins: Real-time entity graphs and simulations
  • Storage Configs: Backend connections for data persistence
  • Schedules: Recurring pipeline execution triggers
Projects are fully isolated. Resources in one project cannot directly reference resources in another project.

Project Structure

pkg/models/project.go:15
type Project struct {
    ID          string
    Name        string
    Description string
    Version     string            // Semantic version (e.g., "1.0.0")
    Status      ProjectStatus     // active, archived, draft
    Metadata    ProjectMetadata
    Components  ProjectComponents // Resource associations
    Settings    ProjectSettings
}

type ProjectComponents struct {
    Pipelines      []string
    Ontologies     []string
    MLModels       []string
    DigitalTwins   []string
    StorageConfigs []string
}

Creating a Project

curl -X POST http://localhost:8080/api/projects \
  -H "Content-Type: application/json" \
  -d '{
    "name": "customer-analytics",
    "description": "Customer behavior analysis platform",
    "version": "1.0.0",
    "status": "active",
    "tags": ["analytics", "customer"],
    "settings": {
      "timezone": "America/New_York",
      "environment": "production"
    }
  }'

Validation Rules

  • Pattern: ^[a-zA-Z0-9_-]{3,50}$
  • Must be 3-50 characters
  • Alphanumeric, hyphens, and underscores only
  • Must be unique across non-archived projects
pkg/project/service.go:15
var projectNameRegex = regexp.MustCompile(`^[a-zA-Z0-9_-]{3,50}$`)
  • Pattern: ^\d+\.\d+\.\d+$
  • Must follow semantic versioning (e.g., “1.0.0”)
  • Defaults to “1.0.0” if not provided
pkg/project/service.go:16
var versionRegex = regexp.MustCompile(`^\d+\.\d+\.\d+$`)
Valid status values:
  • active — Project is operational (default)
  • draft — Project is being configured
  • archived — Read-only, hidden from listings
Archived projects maintain their data but cannot be modified.

Listing Projects

curl http://localhost:8080/api/projects
Query Parameters:
ParameterTypeDescription
statusstringFilter by project status
limitintegerNumber of results to return
offsetintegerNumber of results to skip

Updating a Project

curl -X PATCH http://localhost:8080/api/projects/proj-uuid-1234 \
  -H "Content-Type: application/json" \
  -d '{
    "description": "Updated customer analytics platform",
    "version": "1.1.0",
    "tags": ["analytics", "customer", "ml"]
  }'
Only provided fields are updated. Omitted fields remain unchanged.

Cloning a Project

Create a copy of an existing project with a new name. The clone includes all settings and tags, but components are empty.
curl -X POST http://localhost:8080/api/projects/proj-uuid-1234/clone \
  -H "Content-Type: application/json" \
  -d '{"new_name": "customer-analytics-dev"}'
Cloned project characteristics:
  • New unique ID assigned
  • Description appended with ” (cloned)”
  • Version reset to “1.0.0”
  • Status set to draft
  • All component arrays empty
  • Settings and tags copied from original
pkg/project/service.go:214
cloned := &models.Project{
    ID:          uuid.New().String(),
    Name:        newName,
    Description: original.Description + " (cloned)",
    Version:     "1.0.0",
    Status:      models.ProjectStatusDraft,
    // Components arrays are empty
    Settings:    original.Settings,
}

Managing Components

Associate resources with a project using the component management endpoints.
curl -X POST http://localhost:8080/api/projects/proj-uuid-1234/pipelines/pipe-uuid-5678
Pipelines are automatically associated when created with project_id, but can also be manually linked.
curl -X DELETE http://localhost:8080/api/projects/proj-uuid-1234/pipelines/pipe-uuid-5678
Removes the association. The pipeline itself is not deleted.
The same pattern applies for:
  • Ontologies: /ontologies/:id
  • ML Models: /ml-models/:id
  • Digital Twins: /digital-twins/:id
  • Storage Configs: /storage/:id
pkg/project/service.go:242
func (s *Service) AddPipeline(projectID, pipelineID string) error {
    project, err := s.store.GetProject(projectID)
    if err != nil {
        return err
    }
    
    if slices.Contains(project.Components.Pipelines, pipelineID) {
        return nil // Already associated
    }
    
    project.Components.Pipelines = append(project.Components.Pipelines, pipelineID)
    project.Metadata.UpdatedAt = time.Now()
    
    return s.store.SaveProject(project)
}

Deleting a Project

Deleting a project performs a soft delete by marking it as archived.
curl -X DELETE http://localhost:8080/api/projects/proj-uuid-1234
Deleting a project does not delete its associated resources (pipelines, models, etc.). Those must be deleted separately.
pkg/project/service.go:177
func (s *Service) Delete(id string) error {
    project, err := s.store.GetProject(id)
    if err != nil {
        return err
    }
    
    // Soft delete - update status to archived
    project.Status = models.ProjectStatusArchived
    project.Metadata.UpdatedAt = time.Now()
    
    return s.store.SaveProject(project)
}

Project Settings

Timezone

Controls timestamp display and schedule execution. Defaults to "UTC".
{"timezone": "America/New_York"}

Environment

Deployment context label. Defaults to "development".
{"environment": "production"}

Best Practices

Use descriptive, kebab-case names:
  • customer-analytics
  • supply-chain-optimization
  • iot-sensor-monitoring
Avoid generic names like project1 or test.
Increment versions when making significant changes:
  • Patch (1.0.1): Bug fixes, minor updates
  • Minor (1.1.0): New features, backwards compatible
  • Major (2.0.0): Breaking changes
Use tags for categorization and filtering:
  • Domain: analytics, iot, ml
  • Team: data-team, ml-team
  • Purpose: production, experiment
Recommended workflow:
  1. Create as draft while configuring
  2. Activate when ready: active
  3. Archive when no longer needed: archived
Never delete without archiving first.

Example: Complete Project Setup

# 1. Create project
curl -X POST http://localhost:8080/api/projects \
  -H "Content-Type: application/json" \
  -d '{
    "name": "customer-analytics",
    "description": "Customer behavior analysis",
    "version": "1.0.0",
    "status": "draft",
    "tags": ["analytics", "customer"]
  }'

# 2. Create storage config
curl -X POST http://localhost:8080/api/storage/configs \
  -H "Content-Type: application/json" \
  -d '{
    "project_id": "proj-uuid-1234",
    "plugin_type": "postgres",
    "config": {"connection_string": "postgres://..."}
  }'

# 3. Create ontology
curl -X POST http://localhost:8080/api/ontologies \
  -H "Content-Type: application/json" \
  -d '{
    "project_id": "proj-uuid-1234",
    "name": "customer-ontology",
    "content": "@prefix : <http://example.org/customer#> ..."
  }'

# 4. Create pipeline
curl -X POST http://localhost:8080/api/pipelines \
  -H "Content-Type: application/json" \
  -d '{
    "project_id": "proj-uuid-1234",
    "name": "customer-import",
    "type": "ingestion",
    "steps": [...]
  }'

# 5. Activate project
curl -X PATCH http://localhost:8080/api/projects/proj-uuid-1234 \
  -H "Content-Type: application/json" \
  -d '{"status": "active"}'

Next Steps

Pipelines

Create data ingestion and processing workflows.

Ontologies

Define your domain vocabulary and entity types.

Storage

Configure storage backends for your data.

Build docs developers (and LLMs) love