Desktop Material

GitLab merge requests

Desktop Material can create, review, and manage GitLab merge requests natively for a repository whose selected account is a GitLab or self-hosted GitLab account, without leaving the app for the provider website. The workspace is reached from the same branch and pull-request surfaces that host GitHub pull-request creation; when the repository's bound account is GitLab and the repository is not a fork, those entry points open the native GitLab merge-request workspace instead of the browser.

Native handling is deliberately scoped. getPullRequestInteractionRoute returns gitlab-native only for a non-fork GitLab repository. GitLab forks and Bitbucket repositories still route to a provider composer URL in the browser, and GitHub repositories keep their existing native pull-request flow.

Behavior

The workspace covers the merge-request lifecycle against the bound project:

Draft state is carried through GitLab's title-prefix convention. The model strips Draft:, WIP:, [draft], and (draft) prefixes before validation and re-applies a single Draft: prefix when the draft flag is set, so the visible title and the draft toggle stay consistent.

Branch names offered in the composer are derived only from refs associated with the exact remote. The source is the published current branch, and the target list is bounded by the renderer model.

Configuration

The feature needs no separate setup beyond a signed-in GitLab account bound to the repository. Availability is computed from the repository and its accounts and reports one of available, signed-out, not-gitlab, no-remote, or endpoint-mismatch. It is available only when the repository has a hosted remote, the account selected for the repository is a signed-in GitLab account, and that account's endpoint canonicalizes to the same GitLab API endpoint as the repository remote. A missing or mismatched binding fails closed instead of selecting a different identity.

All request and mutation payloads are bounded before they leave the renderer: a title up to 1,024 characters, a description up to 1 MiB, branch names up to 255 characters, a project path up to 512 characters, at most 100 reviewers or assignees, and at most 10 pages of 100 items (1,000 merge requests or members) per collection.

Failure modes and recovery

Security considerations

Language and accessibility

All workspace labels, status messages, confirmations, and accessible names use the app's persisted English, playful Hong Kong Cantonese, or English / 香港粵語 bilingual mode with English fallback.

Verification

The feature arrives from origin/codex/report-gitlab-integration, which merges into the current main with zero conflicts. Its focused node:test / node:assert unit tests cover:

Because this checkout has no installed dependency tree or off-screen build environment, the production build, screenshot capture, and remote CI/Pages receipts for this feature are not claimed here. They remain pending the branch's merge, build, and pushed-SHA verification on main.