---
title: "git.repo@1 · OpenVibe.Services"
canonical: "https://openvibe.services/docs/contracts/git.repo"
updated: null
---

# git.repo@1 · OpenVibe.Services

HTML: [git.repo@1 · OpenVibe.Services](https://openvibe.services/docs/contracts/git.repo)

# GitRepository `git.repo@1`

Generated at 2026-11-13 06:25:48 UTC from [`openvibe-contracts v0.419.0`](https://github.com/OpenVibers/OpenVibe.Contracts/tree/v0.419.0) and [`openvibe-sdk v0.161.0`](https://github.com/OpenVibers/OpenVibe.SDK/tree/v0.161.0).

- Version: 1.0.0
- Owner: git
- Visibility: public
- Status: active
- Compatibility: backward
- Schema: [`https://openvibe.network/contracts/git/repo.v1.json`](/docs/contracts/git.repo.json)

One repository on OpenVibe.Git (git.openvibe.codes): its owner, visibility, default branch, counts, and — when it has one — its GitHub mirror and the cached GitHub card. api/view/repo.

## Fields

| Field | Type | Required | Description | Constraints |
| --- | --- | --- | --- | --- |
| `id` | string | yes | The repository's own id (repo\_<ULID>), stable across a rename. | - `pattern ^repo_[0-9A-HJKMNP-TV-Z]{26}$` |
| `owner` | object | yes |  | - `no other fields` |
| `owner.username` | string | yes | The OpenVibe username that owns it, lower-case. | - `pattern ^[a-z0-9](?:[a-z0-9]\|-(?=[a-z0-9])){0,38}$` |
| `owner.subject` | string \| null |  | The owner's Network subject; absent when the owner is the organisation account. | - `pattern ^usr_[0-9A-HJKMNP-TV-Z]{26}$` |
| `owner.display_name` | string \| null |  |  |  |
| `owner.avatar_url` | string \| null |  |  | - `format uri` |
| `name` | string | yes | The repository name; lower-case, and never ending in .git. | - `pattern ^(?!.*\.git$)[a-z0-9][a-z0-9._-]{0,99}$` |
| `full_name` | string | yes | <owner>/<name>, the name every API path and clone URL uses. | - `pattern ^[a-z0-9](?:[a-z0-9]\|-(?=[a-z0-9])){0,38}/(?!.*\.git$)[a-z0-9][a-z0-9._-]{0,99}$` |
| `description` | string | yes |  | - `maxLength 500` |
| `visibility` | enum | yes |  | - `one of "public", "private"` |
| `default_branch` | string | yes |  | - `minLength 1`<br>- `maxLength 255` |
| `topics` | array of string | yes |  | - `maxItems 20`<br>- `items: pattern ^[a-z0-9][a-z0-9-]{0,34}$` |
| `stars` | integer | yes |  | - `minimum 0` |
| `watchers` | integer | yes |  | - `minimum 0` |
| `forks` | integer | yes |  | - `minimum 0` |
| `language` | string \| null | yes |  |  |
| `languages` | object |  | Language name → share of bytes, 0–100, the largest first. |  |
| `html_url` | string | yes |  | - `format uri` |
| `clone_url` | string | yes |  | - `format uri` |
| `mirror` | object \| null |  | A git repository mirrored from somewhere (today: a public GitHub URL). |  |
| `github` | object \| null |  | The GitHub card: cached GitHub API readings for the repository's twin. |  |
| `created_at` | string | yes |  | - `format date-time` |
| `updated_at` | string | yes |  | - `format date-time` |
| `pushed_at` | string \| null |  |  | - `format date-time` |

## Examples

From the contract's own test fixtures: valid ones validate, rejected ones must fail.

 Valid: full

~~~~
{
  "id": "repo_01JQZ8M4T7Y2N5K3B6V9C1X0DA",
  "owner": {
    "username": "openvibers",
    "subject": "usr_01JQZ8M4T7Y2N5K3B6V9C1X0DB",
    "display_name": "OpenVibers",
    "avatar_url": "https://openvibe.media/o/med_01JQZ8M4T7Y2N5K3B6V9C1X0DC"
  },
  "name": "openvibe.codes",
  "full_name": "openvibers/openvibe.codes",
  "description": "Chat with coding agents on your own computers or a cloud desk.",
  "visibility": "public",
  "default_branch": "main",
  "topics": [
    "agents",
    "codes"
  ],
  "stars": 12,
  "watchers": 4,
  "forks": 1,
  "language": "JavaScript",
  "languages": {
    "JavaScript": 72.4,
    "CSS": 19.1,
    "Shell": 8.5
  },
  "html_url": "https://git.openvibe.codes/openvibers/openvibe.codes",
  "clone_url": "https://git.openvibe.codes/openvibers/openvibe.codes.git",
  "mirror": {
    "url": "https://github.com/OpenVibers/OpenVibe.Codes.git",
    "state": "ready",
    "last_synced_at": "2026-11-09T08:47:55Z",
    "error": null
  },
  "github": {
    "full_name": "OpenVibers/OpenVibe.Codes",
    "html_url": "https://github.com/OpenVibers/OpenVibe.Codes",
    "stars": 42,
    "open_issues": 3,
    "open_pull_requests": 2,
    "ci_state": "success",
    "fetched_at": "2026-11-09T09:00:00Z"
  },
  "created_at": "2026-10-15T19:43:04Z",
  "updated_at": "2026-11-09T08:47:55Z",
  "pushed_at": "2026-11-09T08:40:00Z"
}
~~~~

Valid: private

~~~~
{
  "id": "repo_01JQZ8M4T7Y2N5K3B6V9C1X0DA",
  "owner": {
    "username": "openvibers",
    "subject": null,
    "display_name": null,
    "avatar_url": null
  },
  "name": "private-notes",
  "full_name": "openvibers/private-notes",
  "description": "",
  "visibility": "private",
  "default_branch": "main",
  "topics": [],
  "stars": 0,
  "watchers": 1,
  "forks": 0,
  "language": null,
  "languages": {},
  "html_url": "https://git.openvibe.codes/openvibers/private-notes",
  "clone_url": "https://git.openvibe.codes/openvibers/private-notes.git",
  "mirror": null,
  "github": null,
  "created_at": "2026-11-09T09:00:00Z",
  "updated_at": "2026-11-09T09:00:00Z",
  "pushed_at": null
}
~~~~

Rejected: name-ends-with-git

~~~~
{
  "id": "repo_01JQZ8M4T7Y2N5K3B6V9C1X0DA",
  "owner": {
    "username": "openvibers"
  },
  "name": "openvibe.codes.git",
  "full_name": "openvibers/openvibe.codes.git",
  "description": "A name ending in .git is refused.",
  "visibility": "public",
  "default_branch": "main",
  "topics": [],
  "stars": 0,
  "watchers": 1,
  "forks": 0,
  "language": null,
  "html_url": "https://git.openvibe.codes/openvibers/openvibe.codes.git",
  "clone_url": "https://git.openvibe.codes/openvibers/openvibe.codes.git.git",
  "created_at": "2026-11-09T09:00:00Z",
  "updated_at": "2026-11-09T09:00:00Z"
}
~~~~

Rejected: visibility-and-stars

~~~~
{
  "id": "repo_01JQZ8M4T7Y2N5K3B6V9C1X0DA",
  "owner": {
    "username": "openvibers"
  },
  "name": "openvibe.codes",
  "full_name": "openvibers/openvibe.codes",
  "description": "",
  "visibility": "secret",
  "default_branch": "main",
  "topics": [],
  "stars": -1,
  "watchers": 0,
  "forks": 0,
  "language": null,
  "html_url": "https://git.openvibe.codes/openvibers/openvibe.codes",
  "clone_url": "https://git.openvibe.codes/openvibers/openvibe.codes.git",
  "created_at": "2026-11-09T09:00:00Z",
  "updated_at": "2026-11-09T09:00:00Z"
}
~~~~

## Validate

~~~~
const contracts = require('openvibe-contracts');
contracts.validate('git.repo@1', value);   // { valid, errors: [{ path, message }] }
~~~~
