Frequently asked questions
Short answers, each pointing at the page that covers the topic properly. If your question isn’t here and the docs don’t answer it, see Where do I get help? at the bottom.
Getting started
What is Theseus, exactly?
Theseus is GitLab’s paved path for building modular services. It makes the
platform GitLab already has easier to build on rather than replacing it. It is
the set of components (Lab Bench, LabKit, Caproni, Runway, Fairway, the project
template, and the CI components) that together take a service from copier copy
to a deployed, instrumented, PREP-ready artifact. The goal is to move mean time
to production for a new modular service from weeks to hours. See
Vision.
How do I create a new service today?
Run common-template-copier:
copier copy https://gitlab.com/gitlab-com/gl-infra/common-template-copier.git my-service --trustAnswer golang, release_platform, and three_layer_go with yes to get the
modular service skeleton. The
Get Started
tutorial walks the whole flow, including pushing the project and bringing it up
locally.
What about bench? The vision page talks about bench new.
bench is the CLI from the
LabBench project that will automate the copier flow and project registration. It
is not the paved path yet; until it lands, use copier directly. See
Lab Bench and the
bench CLI reference.
Do I have to write my service in Go?
Go is the language the template scaffolds today, and the Go three-layer skeleton
is what the tutorials and the
exemplar show.
Rust is a first-class target for the library layer:
labkit-rs is a deliberately
wire-compatible port — same header names, gRPC metadata keys, and log field
names — so Rust and Go services look identical in dashboards and share traces. A
rust-service-template
plays the exemplar role for Rust. See
LabKit.
Can I bring an existing service onto Theseus?
Partly. Release Framework supports importing existing projects, but the import
path is fragile and the guide recommends splitting the work across two merge
requests: one to align Terraform state, one to apply configuration. See
Importing existing projects.
Note that scaffolding with common-template-copier is mandatory for Release
Framework projects, so retrofitting the template is part of the job.
The pieces
What’s the difference between Runway and Fairway?
Fairway generates the Helm chart: it reads
your .runway/fairway.yaml manifest and emits a packaged, infrastructure-agnostic
chart.
Runway is the deployment platform that
takes that chart to production. One writes the artifact; the other ships it.
Do I need to write Helm charts?
No. You write a FairwayManifest — image, port, probes, and abstract
dependencies — and Fairway generates the Deployment, Service, HPA, optional
PDB/VPA, ingress, and cron jobs from it. The chart is a build output published as
an OCI artifact on tagged releases; it is never committed to Git. See
Fairway and the
manifest schema.
Why local Kubernetes (Caproni) instead of docker-compose?
Because Caproni runs the same CNG images and the same Fairway-generated chart that ship to customers, with hot-reload and full debugging. Your laptop and production consume the same service declarations and differ only in how the dependencies are satisfied, which is what the core contract describes. See Caproni and Run locally with Caproni.
What do I get from LabKit without doing anything?
Structured JSON logging in the format GitLab’s pipeline expects, Prometheus
metrics on /-/metrics on the probe port, OpenTelemetry tracing, correlation
IDs, access logging, panic recovery, health endpoints, and graceful shutdown.
The template wires all of it in from the first commit. The how-to guides for
tracing,
logging, and
metrics each cover getting that
data all the way into Grafana.
Configuration and deployment
Where does my service’s configuration come from?
Declare it once as spec.values.appConfig in your Fairway manifest and each
environment delivers it its own way: a ConfigMap in-cluster, a baked profile on
Runway, per-cell values on Cells. See
Pass application configuration via Fairway,
and
Set up typed configuration for
protobuf-defined, validated config via LabKit v2/config.
How do I change a value or a secret without rebuilding?
You don’t need to rebuild. Deploy-time values live under spec.values and
secrets are Vault-backed via secretEnvFrom and secretVolumes. See
Modify the values and secrets passed to your service.
Which platform binding should my service target?
If your service has synchronous dependencies on Cell infrastructure, or could go down when one Cell goes down, it is not an Enterprise service; it belongs in a Cell. The Enterprise binding is for GitLab Inc operational services that sit above every tenant (licensing, billing aggregation, cross-tenant data pipelines) and it carries a hard requirement: no synchronous dependency on the GitLab application or on components running in Cells. See Platform bindings.
Does Theseus deploy and operate my service in production?
Theseus’s scope runs from your laptop to a deployed, operable artifact. Fleet management of GitLab’s SaaS is not part of it: GitLab.com and Cells are operated by Tenant Scale, Dedicated environments by the Dedicated team, and rollout policy — rings, progressive rollouts, maintenance windows, upgrade groupings — belongs to them. Theseus’s job is to make the artifacts they orchestrate uniform and safe. See Separation of concerns between Theseus and Cells.
Does using Theseus mean I pass PREP automatically?
No. Theseus gives you evidence, not sign-off. Build & Release, Deployment,
Service Architecture, Observability, Operational Lifecycle, and several other
categories arrive largely satisfied by the scaffold, so the review becomes
confirmation rather than construction. Platform stakeholders still review and
approve, and threat modelling and AppSec review remain service-specific. The
bench prep evidence report is still to ship. See
the PREP connection.
Day to day
How do I pull in template improvements after scaffolding?
copier update --trust --skip-answeredYour project’s template version is recorded in .copier-answers.yml. See
Update your service template for
conflict handling and migrations.
Can I use feature flags outside the monolith?
Yes. The feature-flags service is generally available. Flags are plain YAML in the feature-flags repository, evaluated with the LabKit client, toggled by merge request, and deleted when the rollout is done. See Use feature flags in your service and the strategy page.
How do I test a modular feature without spinning up the world?
Test against the contract edges: in-process fakes for service dependencies and real infrastructure from Caproni. No monolith, no neighbouring services. See Modular feature test isolation and the companion how-to.
Where do I get help?
- General Questions: Reach out to us on Slack at #proj-theseus.
- A doc is missing: check Documentation gaps, which tracks what’s planned by Diátaxis quadrant. If it isn’t listed, open an issue on the Theseus tracker.
- Release Framework problems (broken mirroring, pipelines, token rotation):
the
Delivery tracker,
or
#g_deliveryon Slack for an urgent failed import. - Feature flags: the feature-flags repository.
- A specific component: each component page links its own project and issue tracker.