{"id":47718592,"url":"https://github.com/r-aas/platform_monorepo","last_synced_at":"2026-04-02T19:11:15.493Z","repository":{"id":347921140,"uuid":"1195753357","full_name":"r-aas/platform_monorepo","owner":"r-aas","description":"Local-first AI/ML platform on k3d — 35 Helm charts, 8 agents, 9 MCP servers, 243 federated tools. macOS Apple Silicon reference system.","archived":false,"fork":false,"pushed_at":"2026-03-30T03:14:02.000Z","size":2374,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-30T05:53:06.323Z","etag":null,"topics":["agentgateway","agents","apple-silicon","argocd","gitops","helm","k3d","kagent","local-first","mcp","mlops"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/r-aas.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-30T03:02:37.000Z","updated_at":"2026-03-30T03:14:05.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/r-aas/platform_monorepo","commit_stats":null,"previous_names":["r-aas/platform_monorepo"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/r-aas/platform_monorepo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/r-aas%2Fplatform_monorepo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/r-aas%2Fplatform_monorepo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/r-aas%2Fplatform_monorepo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/r-aas%2Fplatform_monorepo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/r-aas","download_url":"https://codeload.github.com/r-aas/platform_monorepo/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/r-aas%2Fplatform_monorepo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31314082,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-02T12:59:32.332Z","status":"ssl_error","status_checked_at":"2026-04-02T12:54:48.875Z","response_time":89,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agentgateway","agents","apple-silicon","argocd","gitops","helm","k3d","kagent","local-first","mcp","mlops"],"created_at":"2026-04-02T19:11:14.850Z","updated_at":"2026-04-02T19:11:15.485Z","avatar_url":"https://github.com/r-aas.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Platform Monorepo\n\n[![Build Images](https://github.com/r-aas/platform_monorepo/actions/workflows/build-images.yml/badge.svg)](https://github.com/r-aas/platform_monorepo/actions/workflows/build-images.yml)\n[![Lint Charts](https://github.com/r-aas/platform_monorepo/actions/workflows/lint-charts.yml/badge.svg)](https://github.com/r-aas/platform_monorepo/actions/workflows/lint-charts.yml)\n[![Release](https://github.com/r-aas/platform_monorepo/releases/latest)](https://github.com/r-aas/platform_monorepo/releases)\n\nA reference implementation for **AgentOps end-to-end** — running entirely on a single Mac. No cloud. No API keys. Everything local, reproducible, and observable.\n\nThis is what a complete agent operations system looks like when you wire together best-of-breed open-source tools: agent definitions, prompt lifecycle, experiment tracking, tool federation, autonomous scheduling, LLM observability, and GitOps deployment — all in one repo.\n\n```\ntask up    # ~20 min from zero to fully operational\n```\n\n## Why This Exists\n\nBuilding AI agents is easy. Operating them is hard. There's no single tool that covers the full lifecycle:\n\n| Problem | What's needed | What this repo uses |\n|---------|---------------|---------------------|\n| Agents need tools | Standardized tool interface | **9 MCP servers** behind a unified gateway (243 tools) |\n| Agents need memory | Persistent context across runs | **pgvector** with per-agent TTL and memory categories |\n| Agents need scheduling | Autonomous execution on cadence | **kagent** CRDs + k8s CronJobs |\n| Prompts need versioning | Track what changed and when | **MLflow** prompt registry with aliases and canary routing |\n| Prompts need evaluation | Know if changes help or hurt | **LLM-as-judge** eval pipeline with A/B testing |\n| LLM calls need observability | Cost, latency, quality tracking | **Langfuse** tracing + drift detection |\n| Everything needs deployment | Reproducible, auditable, rollback-able | **ArgoCD** GitOps from in-cluster **GitLab** |\n| Everything needs to talk | Standard protocols | **OpenAI-compatible API**, **A2A protocol**, **MCP** |\n\nThis repo is the answer to \"how do I actually run all of this together?\"\n\n## Architecture\n\n```\n┌─────────────────────────────────────────────────────────┐\n│                    macOS (Apple Silicon)                  │\n│                                                          │\n│  Ollama (native, Metal GPU)                              │\n│     ↑                                                    │\n│  ┌──┴────────────────────────────────────────────────┐   │\n│  │  k3d cluster \"mewtwo\"                             │   │\n│  │                                                   │   │\n│  │  LiteLLM ──→ Ollama (192.168.65.254:11434)           │   │\n│  │     ↑                                             │   │\n│  │  n8n (17 workflows) ──→ MLflow (prompts/evals)    │   │\n│  │     ↑                       ↓                     │   │\n│  │  agentgateway ←── 9 MCP servers (243 tools)       │   │\n│  │     ↑                                             │   │\n│  │  kagent (6 agents on CronJob schedules)           │   │\n│  │     ↑                                             │   │\n│  │  ArgoCD ←── GitLab CE (in-cluster git)            │   │\n│  └───────────────────────────────────────────────────┘   │\n│                                                          │\n│  Colima VM (dockerd, 8 CPU, 32 GB RAM)                   │\n└─────────────────────────────────────────────────────────┘\n```\n\n### How the layers connect\n\n**You ask a question** → n8n `/webhook/chat` receives it → looks up the agent's system prompt from MLflow → classifies the task → picks the right task-specific prompt → calls LiteLLM → LiteLLM routes to Ollama → response is traced to Langfuse and MLflow → returned to you with a `trace_id` for feedback.\n\n**An agent runs autonomously** → kagent CronJob fires → POSTs to the agent's A2A endpoint → agent loads its memory from pgvector → picks tools from the MCP gateway → executes → writes results back to memory → logs trace.\n\n**You change a prompt** → commit to GitLab → ArgoCD syncs → n8n workflow promotion hook patches URLs and upserts workflows → new prompt version is live. Roll back by reverting the commit.\n\n## Services\n\n| Service | Purpose | URL |\n|---------|---------|-----|\n| **n8n** | Workflow automation — 17 workflows expose webhook APIs for chat, prompts, eval, tracing | http://n8n.platform.127.0.0.1.nip.io |\n| **MLflow** | Prompt registry (versioned, with aliases), experiment tracking, eval storage | http://mlflow.platform.127.0.0.1.nip.io |\n| **LiteLLM** | OpenAI-compatible proxy — routes to Ollama, handles auth, per-key access | http://litellm.platform.127.0.0.1.nip.io |\n| **Langfuse** | LLM observability — traces, scores, cost analysis, drift detection | http://langfuse.platform.127.0.0.1.nip.io |\n| **Gateway** | Unified entry point — agent-gateway (Python) + agentgateway MCP proxy (Rust) | http://gateway.platform.127.0.0.1.nip.io |\n| **ArgoCD** | GitOps controller — syncs all 35 Helm charts from GitLab | http://argocd.platform.127.0.0.1.nip.io |\n| **GitLab CE** | In-cluster git — source of truth for ArgoCD, no external dependencies | http://gitlab.platform.127.0.0.1.nip.io |\n| **ODD Platform** | Data catalog — metadata, lineage, quality (PostgreSQL-only, ARM64 native) | http://odd.platform.127.0.0.1.nip.io |\n| **Plane** | Project management — issues, sprints, backlogs | http://plane.platform.127.0.0.1.nip.io |\n| **MinIO** | S3-compatible object storage for MLflow artifacts | http://minio.platform.127.0.0.1.nip.io |\n\nAll URLs use [nip.io](https://nip.io) wildcard DNS — `*.platform.127.0.0.1.nip.io` resolves to `127.0.0.1`. No `/etc/hosts` editing needed.\n\n## Agents\n\nSix autonomous agents, each with a defined role, schedule, tool access, and memory:\n\n| Agent | Schedule | What it does | Tools |\n|-------|----------|--------------|-------|\n| **platform-admin** | Every 15 min | Watches cluster health, responds to incidents, manages k8s resources | kubernetes, gitlab, kagent, ollama |\n| **project-coordinator** | Hourly | Triages backlog, manages sprints, reports status across Plane and GitLab | kubernetes, plane, gitlab |\n| **data-engineer** | Every 2 hours | Manages data catalog, traces lineage, runs quality checks, handles ingestion | kubernetes, minio, mlflow |\n| **mlops** | Every 4 hours | Tracks experiments, manages model lifecycle, monitors drift | kubernetes, mlflow, langfuse, minio, ollama |\n| **developer** | Every 6 hours | Generates code, reviews PRs, runs security audits, manages CI/CD | kubernetes, gitlab |\n| **qa-eval** | Nightly (2 AM) | Runs benchmarks, detects regressions, evaluates prompt quality | kubernetes, mlflow, langfuse |\n\nEach agent has:\n- **Autonomy guardrails** — max budget ($2-10), max turns (100-300), approval gates for destructive ops\n- **Persistent memory** — pgvector with categorized memories (incidents, decisions, patterns, baselines)\n- **Collaboration graph** — agents can delegate to each other via A2A protocol\n\nAgent definitions live in `agents/` as YAML specs.\n\n## Workflows (n8n)\n\nThe 17 n8n workflows are the API layer of the platform. Key endpoints:\n\n| Endpoint | Workflow | What it does |\n|----------|----------|--------------|\n| `POST /webhook/chat` | Chat | Unified chat — agent mode (with MCP tools) or plain LLM. Task classification, session management, trace logging |\n| `POST /webhook/prompts` | Prompt CRUD | Create, update, delete, promote, diff, canary config for versioned prompts |\n| `POST /webhook/eval` | Prompt Eval | Run test cases with LLM-as-judge scoring. A/B eval between production and staging |\n| `POST /webhook/traces` | Tracing | Log executions, submit feedback, set baselines, detect drift |\n| `POST /webhook/sessions` | Sessions | Persistent conversation history with append/close lifecycle |\n| `POST /webhook/datasets` | Datasets | Upload and manage evaluation datasets |\n| `POST /webhook/experiments` | Experiments | Browse MLflow experiments, runs, and metrics |\n| `POST /webhook/agents` | Agent Catalog | Query and manage registered agents |\n| `GET /webhook/v1/models` | OpenAI Compat | Drop-in OpenAI API — lists prompts as models |\n| `POST /webhook/v1/chat/completions` | OpenAI Compat | Chat completions with prompt-enhanced routing and canary support |\n| `POST /webhook/a2a` | A2A Server | Google Agent-to-Agent protocol (JSON-RPC 2.0) |\n\nWorkflow JSONs live in `n8n-data/workflows/` and are promoted to the cluster via a Helm post-install hook that clones the repo, patches service URLs, and upserts via the n8n REST API.\n\n## MCP Servers (Tool Federation)\n\nNine MCP servers expose platform capabilities as tools. The **agentgateway** (Rust, Linux Foundation) federates all of them into a single endpoint:\n\n| Server | Wraps | Example tools |\n|--------|-------|---------------|\n| **mcp-kubernetes** | k8s API | `kubectl_get`, `kubectl_logs`, `exec_in_pod`, `kubectl_apply` |\n| **mcp-gitlab** | GitLab CE | `create_issue`, `create_merge_request`, `list_pipelines` |\n| **mcp-mlflow** | MLflow API | `search_experiments`, `log_metric`, `get_model_version` |\n| **mcp-langfuse** | Langfuse API | `get_traces`, `create_score`, `get_usage` |\n| **mcp-n8n** | n8n API | `list_workflows`, `execute_workflow`, `get_executions` |\n| **mcp-plane** | Plane API | `create_issue`, `list_cycles`, `update_sprint` |\n| **mcp-minio** | MinIO S3 | `list_buckets`, `get_object`, `put_object` |\n| **mcp-ollama** | Ollama API | `list_models`, `pull_model`, `generate` |\n| **mcp-odd-platform** | ODD Platform | `search_catalog`, `get_upstream_lineage`, `get_quality_tests` |\n\n**243 tools** available in a single MCP session at `gateway.platform.127.0.0.1.nip.io/mcp/all`. Tool names are prefixed by backend (e.g., `kubernetes_kubectl_get`, `gitlab_create_issue`).\n\nPer-backend routes also available: `/mcp/kubernetes`, `/mcp/gitlab`, `/mcp/mlflow`, etc.\n\n## Prompt Lifecycle\n\nThe platform implements a complete prompt-as-code lifecycle:\n\n```\nseed → eval + judge → optimize → benchmark → promote → canary → monitor\n```\n\n1. **Version** — Prompts stored in MLflow with semantic versioning, `production` and `staging` aliases\n2. **Evaluate** — Run test cases against prompts, score with LLM-as-judge (built-in or custom criteria)\n3. **A/B test** — Canary routing sends configurable traffic percentage to staging version\n4. **Promote** — Move staging to production when metrics improve\n5. **Monitor** — Trace every LLM call, detect drift against baselines, alert on regression\n\n## Prerequisites\n\n**Minimum**: Apple Silicon Mac with 64 GB RAM (see [Hardware Requirements](#hardware-requirements) for details).\n\n| Tool | Version | Install |\n|------|---------|---------|\n| macOS | 14+ (Apple Silicon) | — |\n| Colima | 0.8+ | `brew install colima` |\n| Docker CLI | 27+ | `brew install docker` |\n| k3d | 5.7+ | `brew install k3d` |\n| kubectl | 1.30+ | `brew install kubectl` |\n| Helm | 3.16+ | `brew install helm` |\n| helmfile | 0.169+ | `brew install helmfile` |\n| Task | 3.40+ | `brew install go-task` |\n| Ollama | 0.6+ | [ollama.com](https://ollama.com) |\n| uv | 0.6+ | `brew install uv` |\n| jq, yq | latest | `brew install jq yq` |\n\n```bash\nbrew install colima docker k3d kubectl helm helmfile go-task uv jq yq\nbrew install --cask ollama\n```\n\n## Quick Start\n\n```bash\n# 1. Clone\ngit clone https://github.com/r-aas/platform_monorepo.git\ncd platform_monorepo\n\n# 2. Create secrets\ncp envs/secrets.env.example envs/secrets.env\n# Defaults work for local dev — edit if you want custom passwords\n\n# 3. Bootstrap everything\ntask up\n```\n\nThat's it. `task up` handles everything: preflight checks → starts Colima VM → starts Ollama → pulls models (glm-4.7-flash + nomic-embed-text) → creates k3d cluster → helmfile bootstrap → GitLab setup → pulls/builds images → ArgoCD sync → n8n workflow promotion → agent deployment → smoke tests. ~20 minutes on first run.\n\n### Verify it works\n\n```bash\ntask smoke           # Hit every endpoint, report pass/fail\ntask urls            # Print all URLs with credentials\ntask status          # Full platform health check\n```\n\n### Try it\n\n```bash\n# Chat with an agent\ncurl -X POST http://n8n.platform.127.0.0.1.nip.io/webhook/chat \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"message\": \"what experiments are running?\", \"agent_name\": \"mlops\"}'\n\n# Chat with MCP tools (agent can call any of 243 tools)\ncurl -X POST http://n8n.platform.127.0.0.1.nip.io/webhook/chat \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"message\": \"list pods in the genai namespace\", \"config\": {\"mcp_tools\": \"all\"}}'\n\n# Use the OpenAI-compatible API\ncurl -X POST http://n8n.platform.127.0.0.1.nip.io/webhook/v1/chat/completions \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"model\": \"glm-4.7-flash\", \"messages\": [{\"role\": \"user\", \"content\": \"hello\"}]}'\n\n# Initialize an MCP session (all 243 tools)\ncurl -X POST http://gateway.platform.127.0.0.1.nip.io/mcp/all \\\n  -H 'Content-Type: application/json' \\\n  -H 'Accept: application/json, text/event-stream' \\\n  -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"initialize\",\"params\":{\"protocolVersion\":\"2024-11-05\",\"capabilities\":{},\"clientInfo\":{\"name\":\"test\",\"version\":\"1.0\"}}}'\n```\n\n## Day-to-Day Operations\n\n```bash\ntask stop            # Pause (preserves state, frees RAM — ~21s)\ntask start           # Resume (~7 min)\ntask restart         # Full restart (handles crashes)\ntask down            # Destroy cluster (PV data preserved)\ntask smoke           # Verify all endpoints\ntask status          # Platform health overview\ntask urls            # All URLs + credentials\ntask doctor          # Preflight + smoke combined\n```\n\n## Repo Structure\n\n```\ncharts/                 # 35 Helm charts (ArgoCD-managed after bootstrap)\n  genai-n8n/            #   n8n + workflow promotion hook\n  genai-mlflow/         #   MLflow tracking server\n  genai-litellm/        #   LLM proxy\n  genai-agentgateway/   #   Rust MCP proxy (Linux Foundation)\n  genai-agent-gateway/  #   Python agent gateway (custom)\n  genai-langfuse/       #   LLM observability\n  genai-odd-platform/   #   Data catalog (ODD Platform)\n  genai-plane/          #   Project management\n  genai-minio/          #   Object storage\n  genai-agentregistry/  #   Agent/skill catalog + semantic search\n  genai-mcp-*/          #   Individual MCP server charts (9)\n  genai-pg-*/           #   PostgreSQL instances (n8n, mlflow, plane)\n  gitlab-ce/            #   In-cluster source control\n  argocd/               #   GitOps controller\n  ingress-nginx/        #   Ingress controller\nn8n-data/workflows/     # 17 workflow JSONs (promoted to cluster via Helm hook)\nagents/                 # Agent YAML definitions (6 agents + shared config)\nskills/                 # 21 skill definitions\nscripts/                # Bootstrap, import, benchmark, smoke test scripts\nspecs/                  # Feature specs (001-029, spec-driven development)\nservices/\n  agent-gateway/        # Python FastAPI — agent registry, skill catalog, MCP proxy\nimages/                 # 19 Docker image builds (MCP servers, custom services)\nmcp-servers/            # MCP server catalog config\ndata/                   # Seed prompts, benchmarks, training data\ndocs/                   # Architecture docs, environment guide\nenvs/                   # Environment config (global.env, secrets.env)\nmanifests/              # Raw k8s manifests + CRDs\ntaskfiles/              # Taskfile includes (mcp, mlops, quality, status, workflows)\nhelmfile.yaml           # Bootstrap-only (seeds ArgoCD + infra)\nTaskfile.yml            # Root task runner\n```\n\n## Secrets\n\nAll secrets live in `envs/secrets.env` (gitignored). The example file ships with safe defaults for local dev:\n\n| Secret | What it's for |\n|--------|---------------|\n| `PG_MLFLOW_PASSWORD` | MLflow PostgreSQL |\n| `PG_LANGFUSE_PASSWORD` | Langfuse PostgreSQL |\n| `PG_PLANE_PASSWORD` | Plane PostgreSQL |\n| `MLFLOW_FLASK_SECRET_KEY` | MLflow session signing |\n| `MINIO_ROOT_USER` / `PASSWORD` | MinIO S3 storage |\n| `LITELLM_API_KEY` | LiteLLM proxy auth |\n| `GITLAB_PAT` | Auto-generated during `task up` |\n| `PLANE_API_TOKEN` | Plane project management API |\n| `LANGFUSE_PUBLIC_KEY` / `SECRET_KEY` | Langfuse observability |\n| `PGVECTOR_PASSWORD` | Shared pgvector (ODD Platform, agent registry) |\n\n`task seed-secrets` creates k8s secrets from this file. Use `--force` to recreate.\n\n## Troubleshooting\n\n### Common issues\n\n| Symptom | Cause | Fix |\n|---------|-------|-----|\n| Pods stuck in `Pending` | Colima VM out of resources | `colima stop \u0026\u0026 colima start --cpu 8 --memory 32 --disk 200` |\n| `ImagePullBackOff` on MCP pods | Custom images not on all k3d nodes | `task build-images` (imports to all nodes) |\n| n8n webhooks return 404 | Workflows not activated after import | `task smoke` to check; workflow promotion hook runs on deploy |\n| MLflow rejects requests | DNS rebinding protection | Chart sets `disableSecurityMiddleware` flag — check ArgoCD sync |\n| Ollama unreachable from cluster | Wrong host IP | Pods must use `192.168.65.254` (Colima gateway), not `localhost` |\n| LiteLLM 401 errors | Missing API key in n8n | Check `LITELLM_API_KEY` in secrets.env, run `task seed-secrets` |\n| ArgoCD sync stuck | Failed Helm hook blocking | Delete the failed Job: `kubectl delete job \u003cname\u003e -n genai` |\n| PostgreSQL won't start | sshfs doesn't support chown | local-path provisioner must use `/var/lib/rancher/k3s/local-storage` (overlay FS) |\n| `disk-pressure` taint after restart | Colima VM disk was full | Free space, restart Colima, then `kubectl taint nodes \u003cnode\u003e node.kubernetes.io/disk-pressure-` |\n\n### Diagnostic commands\n\n```bash\ntask doctor          # Preflight checks + smoke tests\ntask status          # Full platform status\ntask smoke           # Hit every endpoint\nkubectl get pods -n genai | grep -v Running    # Find unhealthy pods\nkubectl logs deploy/genai-n8n -n genai         # n8n logs\nkubectl logs deploy/genai-mlflow -n genai      # MLflow logs\n```\n\n## How it's deployed\n\n1. **helmfile** bootstraps the cluster — installs ingress-nginx, creates namespaces, deploys GitLab CE and ArgoCD\n2. **ArgoCD** takes over — watches GitLab for changes to `charts/`, auto-syncs all 35 Helm charts\n3. **Workflow promotion** — a Helm post-install hook on the n8n chart clones this repo, patches service URLs for k8s DNS, and upserts all workflows via the n8n REST API\n4. **Agent scheduling** — kagent CRDs define agents, k8s CronJobs POST to their A2A endpoints on cadence\n\nChange anything in `charts/` → push to GitLab → ArgoCD syncs automatically. That's it.\n\n## Hardware Requirements\n\nThe platform runs 35 Helm charts totaling **9.3 CPU cores** and **12.5 GB memory** in requests (26.5 GB limits), plus Ollama running natively on the Mac for GPU inference. Here's what you actually need:\n\n### Resource breakdown\n\n| Component | CPU | RAM | Disk |\n|-----------|-----|-----|------|\n| Colima VM (k3d cluster) | 8 cores | 24-32 GB | 200 GB |\n| Ollama (native, Metal GPU) | shared | 19 GB (glm-4.7-flash) | 20 GB (model files) |\n| macOS + apps | shared | ~6 GB | — |\n\n### Machine tiers\n\nWith glm-4.7-flash (19 GB) + Colima VM + macOS:\n\n| Machine | RAM | Works? | Notes |\n|---------|-----|--------|-------|\n| 24 GB | 24 GB | No | Not enough for VM + model + macOS |\n| 36 GB | 36 GB | No | Can't fit 19 GB model + usable VM |\n| 48 GB | 48 GB | Tight | 22 GB VM, expect memory pressure under load |\n| 64 GB | 64 GB | Yes | 32 GB VM, comfortable headroom |\n| 96-128 GB | 96-128 GB | Ideal | Full resource limits, room for larger models |\n\n### LLM model\n\nThe platform uses `glm-4.7-flash` (19 GB) for inference and `nomic-embed-text` (274 MB) for embeddings:\n\n```bash\nollama pull glm-4.7-flash\nollama pull nomic-embed-text\n```\n\n### Adjusting for smaller machines\n\nIf you have 36-48 GB RAM, reduce the Colima VM size:\n\n```bash\n# In task up, or manually:\ncolima start --cpu 6 --memory 20 --disk 150\n```\n\nThe cluster will still run — pods will schedule with less headroom and some may restart under memory pressure.\n\n### Disk space\n\n| What | Size |\n|------|------|\n| Colima VM disk | 200 GB (thin-provisioned, grows as needed) |\n| Persistent volumes (databases, storage) | ~59 GB |\n| Docker images (all services) | ~25 GB |\n| Ollama models | ~20 GB (glm-4.7-flash + nomic-embed-text) |\n| Repo + tools | ~2 GB |\n\nDeveloped on a MacBook Pro M4 Max (128 GB RAM, 16 cores).\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fr-aas%2Fplatform_monorepo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fr-aas%2Fplatform_monorepo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fr-aas%2Fplatform_monorepo/lists"}