All Aspire repos live on self-hosted GitLab, not GitHub
Context
Aspire needs version control for ~40+ projects (webapps, MCP servers, AIOS workspace, mobile apps planned, packages). Originally many projects sat on GitHub. As the org grew, GitHub costs + lack of integration with self-hosted CI/CD became friction.
Detail
Decision
We chose: GitLab self-hosted at gitlab.dssc.co.th as the single git remote for all Aspire code.
Rationale
- Self-hosted = $0 marginal per-seat cost as the org grows.
- Native integration with self-hosted GitLab Runners for CI/CD (each project's
.gitlab-ci.ymlruns against shared runners on the same VPS). - Existing GitLab admin (
pratak) already operates the instance. - GitLab MCP available in Claude Desktop for agent-driven repo operations.
Constraints we accepted
- Outage = no pushes/CI for the whole org. Mitigation: agents work locally, push when instance is back (proven during 2026-05-17 outage).
- New engineers need GitLab credentials, not GitHub.
- External contributors (rare) need invited accounts.
Group structure
gitlab.dssc.co.th/aspire/
โโโ infrastructure/ # CI templates, KO engine, Coolify config
โโโ webapps/ # All web apps (deploy to Coolify)
โโโ mcp-servers/ # 32+ MCP integrations
โโโ mobile/ # Mobile apps (future)
โโโ plugins/ # Scrapers, n8n workflows
โโโ packages/ # Shared libraries (future)
โโโ aios-workspace # AIOS + all skills (standalone)
Revisit trigger
GitLab self-hosted SaaS pricing changes materially, OR instance MTTR exceeds 2 hours/month.
Actions
- [x] All new repos created under
gitlab.dssc.co.th/aspire/. - [x] Legacy GitHub repos archived after GitLab mirror confirmed.
- [x] Coolify deploys pull from GitLab (not GitHub).
- [x] CLAUDE.md documents the structure for all agents.
Related
๐ Relationships
graph LR
gitlab_self_hosted_not_github["gitlab-self-hosted-not-github"]:::self
gitlab_self_hosted_not_github --> aspire_llm_gateway["aspire-llm-gateway"]
gitlab_self_hosted_not_github --> knowledge_os_stage_1["knowledge-os-stage-1"]
classDef self fill:#715EE3,color:#fff,stroke:#291F50;