Project manifest
computalot.project.json is the runtime contract for projects. Put it at the tarball root next to your Dockerfile and code.
Most projects only need the minimal manifest below. Use the optional fields when you have a concrete problem: cache_mounts when downloads repeat across tasks, data_sources for large immutable inputs such as model weights, requirements for project-wide hardware defaults, and artifacts to declare expected outputs.
The smallest valid manifest is:
{
"version": 1,
"runtime": {
"kind": "oci",
"sandbox": "gvisor",
"workdir": "/workspace"
},
"entrypoint": {
"command": ["python", "job.py"]
}
}Computalot builds a container image from your tarball and runs tasks in a sandboxed environment.
File location
- Tarball root:
computalot.project.json
Required fields
version
- Positive integer, currently
1
runtime
kind:ociworkdir: absolute in-container working directory (for example/workspace)sandbox:gvisor(required for public execution)
entrypoint
command: non-empty array of strings
Common optional fields
build
Configure how Computalot builds your container image.
{
"build": {
"dockerfile": "Dockerfile",
"context": ".",
"target": "runtime",
"args": { "PYTHON_VERSION": "3.11" }
}
}If build.dockerfile is omitted, Computalot defaults to a root Dockerfile. If that file is missing, the push fails.
validation
Declarative executable and file checks that can run during runtime preparation.
{
"validation": {
"executables": ["python"],
"files": ["job.py"]
}
}User-upload projects cannot declare validation.commands. Put dependency installation and build-time checks in the Dockerfile. Use validation.executables and validation.files for declarative runtime checks.
Restricted fields (rejected on push)
User-upload projects cannot declare runtime.init.commands, runtime.services, or validation.commands. Host-command surfaces are reserved for the platform. The API rejects a push that contains any of them.
Everything that those fields did belongs in the image or the entrypoint instead. Build dependencies and generated assets into the OCI image. If a task needs a helper process, start and supervise it from your entrypoint inside the sandbox. The final exit code of the entrypoint still decides task success.
requirements
Project-level placement defaults merged into job routing.
{
"requirements": {
"profile": "gpu",
"gpu_count": 1,
"gpu_memory_mb": 24576,
"cpu": 8,
"memory_mb": 16384,
"storage_gb": 40
}
}storage_gb must reflect real worker disk headroom, not only the input data size. For sandboxed OCI workloads, count the runtime and image footprint, the per-task sandbox copy overhead, writable caches, temp files, checkpoints, and any runtime downloads.
cache_mounts
Managed writable caches mounted into the runtime.
{
"cache_mounts": [
{
"name": "hf-cache",
"scope": "project_digest",
"path": "/cache/huggingface",
"class": "model"
},
{
"name": "pip-cache",
"scope": "project_digest",
"path": "/cache/pip",
"class": "pip"
}
]
}Fields: name, scope (currently project_digest), path (absolute), max_bytes, class (pip, cargo, model, data), seed_from_image (boolean).
Cache mounts persist per worker and per project version. Use COMPUTALOT_CACHE_<NAME>_DIR env vars when you access caches outside runtime.workdir.
Use cache mounts for writable runtime state that your code populates at startup or during the task:
- package caches such as
pip - Hugging Face runtime caches such as
HF_HOMEorTRANSFORMERS_CACHE - model/data caches created by your own code at runtime
A cache mount replaces the image contents at that path. If the baked files of the image must survive the first mount, use seed_from_image: true.
data_sources
Declarative external inputs fetched before task launch.
{
"data_sources": [
{
"name": "weights",
"source": "huggingface",
"uri": "hf://org/model-name",
"delivery": "mount",
"path": "/workspace/models/model-name",
"cache": "hf-cache",
"required": true
}
]
}Use data sources for immutable inputs that Computalot must prepare before your code starts, such as model weights or reference datasets.
For Hugging Face, delivery: "mount" uses the worker-managed hf-mount path. This applies only to Hugging Face sources declared here in the manifest. If your runner script downloads from Hugging Face on its own, it does not use hf-mount automatically. Declare the source here, or add a writable Hugging Face cache mount for those runtime downloads.
Long ML jobs
For long ML and evaluation workloads:
- Use
data_sourcesfor immutable large inputs such as model weights and reference datasets. - Use
cache_mountsfor writable runtime caches such asHF_HOME,TRANSFORMERS_CACHE, or package caches. - Declare realistic
requirements.storage_gb. PyTorch, CUDA, and Hugging Face stacks often need tens of GB of free worker disk before checkpoints or datasets. - Enable
checkpointing.resume_from_lateston jobs, and emit durable checkpoints through the run. - Write checkpoints and outputs to
$COMPUTALOT_ARTIFACT_DIR, not to repo-relative folders. - Do not assume that runtime-downloaded models are reused, unless you declared a matching cache mount or manifest data source.
- Keep runtime and dev environments separate. Do not install notebook, lint, or test extras onto production workers unless the task needs them.
artifacts
Named outputs and upload declarations.
{
"artifacts": {
"upload": [
{"name": "report", "path": "report.json", "required": true}
],
"outputs": [
{"name": "checkpoint", "path": "ckpt/latest.pt", "type": "checkpoint"}
]
}
}Relative paths are resolved under $COMPUTALOT_ARTIFACT_DIR.
Filesystem rules
- The container filesystem is read-only during task execution
- Use
$COMPUTALOT_TASK_SCRATCH_DIRor$TMPDIRfor temporary files - Use
$COMPUTALOT_ARTIFACT_DIRfor checkpoints and outputs - Managed cache mounts are writable at their declared paths
- Do not assume repo-relative paths like
checkpoints/are writable
Path rules
runtime.workdirand cache mountpathvalues must be absolutebuild.dockerfile,build.context, and commandcwdvalues must be relative- Push-time validation rejects missing files, directories, cache names, or invalid paths
Common push errors
version must be a positive integerruntime.kind must be tarball or ociruntime.workdirmust be an absolute pathentrypoint.command must be a non-empty string arraybuild.dockerfile does not exist in the tarballbuild.context does not resolve to a directory