Enterprise preview: content, claims and integrations remain subject to review.View launch readiness
Repos

API

Every endpoint under a novem repo: lifecycle, metadata, build config, git browsing, variables, sharing and threads.

AI assisted, human approved — novem uses AI to review and keep our documentation up to date.

A repo is a git repository novem hosts and (for the job type) builds into a container image. It follows the same conventions as the rest of the novem API: the filesystem metaphor, the HTTP verbs, plain-text writes, and the r/w/d permission model. See the API overview for the general mechanics and the repo guide for the concepts. This page lists the endpoint tree.

Every path below also answers OPTIONS with the verbs valid for your token.

Addressing a repo

PathUse
/v1/code/repos/:repoYour own repos (shorthand for your username)
/v1/users/:user/code/repos/:repoAny user's repos, yours or ones shared with you

Both serve the same tree. When you address another user's repo your access is decided by its shares: reads need a share granting r, writes w, deletes d. The examples below use the /code/repos form.

Note these are the management endpoints. The git data itself is pushed and pulled with ordinary git tooling against the clone url published at the repo's url path. See pushing code.

Lifecycle

VerbPathDescription
GET/code/reposList your repos
PUT/code/repos/:repoCreate a repo; comes up as the job type
GET/code/repos/:repoList the repo's files and folders
PATCH/code/repos/:repoRename; body is the new id (text/plain)
DELETE/code/repos/:repoDelete the repo

Metadata

VerbPathDescription
POST / GET / DELETE/code/repos/:repo/nameDisplay name
POST / GET / DELETE/code/repos/:repo/summaryOne-line summary
POST / GET / DELETE/code/repos/:repo/descriptionLonger description, rendered as markdown
GET/code/repos/:repo/shortnameThe repo's unique short id
GET/code/repos/:repo/urlGit clone url
GET/code/repos/:repo/logRepository and build log: pushes, selected heuristic, progress, and per-ref failure details

DELETE on a metadata file truncates it (clears the content) rather than removing the path.

Configuration

Config keys are plain-text files supporting POST (write), GET (read) and DELETE (reset to default). GET on config and its sub-folders lists the keys.

PathDefaultDescription
config/typejobBuild type: job builds a chain-runnable image on every push; code is plain git hosting with no build
config/branch/defaultmainThe branch latest tracks and novem checks out by default — the branch must already exist on the repo
config/options/commentstrueSet to false to block new comment threads on the repo
config/build/cpu(host)Whole CPU cores the image build is pinned to. Unset lets the builder use the host's cores
config/build/mem4gMemory for the image build. Takes a unit — m or g
config/build/disk4gBuilder disk. Raise it when a large image fails while assembling its filesystem

config/build_disk is the older spelling of config/build/disk and still works; if both are set, config/build/disk wins.

What your plan allows

Build resources are capped per plan. A value above your ceiling is stored capped rather than refused, and the write records a message on the repo saying what it was reduced to.

Plancpumemdisk
Free24g4g
Basic46g8g
Premium88g20g
Enterprise1212g20g

Image labels

Each push to a job repo publishes its image under a fixed set of labels. A job or chain picks one by writing it after the repo name, as in @alice/data_fetcher:prod. With no label it gets latest.

LabelPoints at
latestThe tip of the default branch (config/branch/default)
head, dev, testThe same commit as latest
tag:<name>The commit the git tag <name> points at, one label per tag
tagThe newest tag's commit, or the same commit as latest when the repo has no tags
prodThe same commit as tag
commit:<sha>That commit, by its full 40-character sha, for each commit in the default branch's history and each tagged commit

The newest tag is decided by creation time: an annotated tag by the time it was tagged, a lightweight tag by its commit's date. So pushing a tag moves tag and prod to it, unless it is a lightweight tag on a commit older than the current newest tag.

A label is matched by its exact name, and nothing else is looked up:

  • Branches other than the default get no label. Pushing a branch called dev or prod changes nothing, because those labels follow the default branch and the newest tag.
  • A tag is tag:<name>, not the bare name. Pin release v1.0.0 with @alice/data_fetcher:tag:v1.0.0.
  • A name outside this set is refused. Writing it as a job's repo reference returns 404 with Reference "<name>" not found, and a chain step naming it fails the run with "No usable image".

Note: prod equals latest until the repo has its first tag, so a job pinned to :prod on an untagged repo runs whatever the default branch holds. Tag the commit you want in production to pin it.

GET /code/repos/:repo/refs lists latest, head, dev, test, prod and one entry per tag, each linking to its commit. Tag entries are named without the tag: prefix (v1.0.0). The tag and commit:<sha> labels are not listed, and branches are under /code/repos/:repo/branches.

Browsing git contents

novem exposes a read-only view of the pushed history. Everything under a commit is content-addressed and therefore immutable, and served with a long-lived cache. These endpoints are GET-only.

PathDescription
/code/repos/:repo/branchesBranches, each with its tip commit_sha
/code/repos/:repo/refsThe image's labels, each with the commit it points at
/code/repos/:repo/commitsCommit list — sha, message, author, author_date
/code/repos/:repo/commits/:shaOne commit — adds tree_sha, parent_sha, committer and dates
/code/repos/:repo/commits/:sha/messageThat commit's message
/code/repos/:repo/commits/:sha/filesThe tree at the repo root for that commit
/code/repos/:repo/commits/:sha/*Browse any path within the commit — a directory lists its entries, a file returns the blob (JSON metadata, or the raw bytes)

Note: :sha is a full 40-character commit SHA. Paths are validated (no traversal, control characters or excessive depth), and a blob over the service limit returns 422 rather than streaming.

Variables

Repos support novem vars, live values you can reference from comments, descriptions and document content:

VerbPathDescription
GET/code/repos/:repo/varsList the repo's vars
PUT / GET / DELETE/code/repos/:repo/vars/:varCreate, inspect or remove a var
POST / GET / DELETE.../vars/:var/valueThe var's value
POST / GET / DELETE.../vars/:var/typerelative, number (default), date or text
POST / GET / DELETE.../vars/:var/formatFormat string (no default)
POST / GET / DELETE.../vars/:var/thresholdThreshold for relative vars (default 0)
POST / GET / DELETE.../vars/:var/aboutShort description
GET.../vars/:var/out.txtThe formatted value, plain text
GET.../vars/:var/out.ansiThe formatted value, ansi

Sharing, tags and threads

VerbPathDescription
GET/code/repos/:repo/sharedList who the repo is shared with
PUT / DELETE/code/repos/:repo/shared/:groupAdd or remove a share: public, @user~group or +org~group
GET/code/repos/:repo/tagsList the repo's tags
PUT / DELETE/code/repos/:repo/tags/:tagTag or untag the repo
GET/code/repos/:repo/threadsList comment-thread topics
GET / PUT / POST / DELETE/code/repos/:repo/threads/*Read and write topics, comments and reactions

Note: creating, updating or deleting threads, comments and reactions requires a paid subscription (basic and up). Reading threads is available on all plans, and the owner can turn comments off entirely via config/options/comments.

See also