Skip to content

Manifest reference

Every key in .ceagle-flight, its default, its limit, and the error you get when it is wrong.

.ceagle-flight is a TOML file at the root of a repository, or at the manifest path of a project in a repository that backs several. It carries two things: the listing people see on Roost, and the instructions for building the program.

It is read from the commit being built, so changing it is a commit like any other.

Shape#

.ceagle-flight
[program]
# the listing, and the version this build publishes

[build]
# how to make the artifact

[library]
# LibLoad libraries only

The program table#

Everything a reader sees on Roost, plus the version.

[program]
namestringRequired

The program title on Roost. One to 64 characters. This is the listing title, not the calculator variable name, which comes from the built file.

versionstringRequired

The version this build publishes. At most 24 characters. No format is enforced, so 1.2.0, 2026.03 and beta-4 are all accepted, but pick one convention and keep it.

summarystringdefaults to empty

One line, shown in listings and search results. Truncated at 140 characters rather than rejected.

descriptionstringdefaults to empty

The long text on the program page. Truncated at 4000 characters. A TOML multi-line string is the comfortable way to write it.

authorstringdefaults to the project owner

Who to credit. Truncated at 64 characters.

categoriesarray of stringdefaults to ["other"], or ["libs"] for a library

One to four category keys. An unknown key fails the build. Some categories are restricted to administrators.

tagsarray of stringdefaults to []

Up to twelve free-form tags, each at most 32 characters.

hiddenbooleandefaults to false

A hidden program is downloadable at its address but left out of listings, search and category counts.

dependsarray of stringdefaults to []

Addresses of the libraries this build links against and that have to be on the calculator first. At most eight, each optionally pinned as address@version. See dependencies.

Categories#

Fetch the live list rather than guessing:

curl -s https://roost.ceagle.cc/api/v1/categories

Each entry has a key, which is what goes in the manifest, a name, a description and a restricted flag. A manifest that claims a restricted category from a non-administrator account fails with only administrators may publish into the CEagle Apps category.

The build table#

[build]
commandstringdefaults to make

The shell command that produces the artifact. Run through bash -lc in the directory holding this manifest, as an unprivileged user, with no network. At most 512 characters.

For a libify library this key must be absent: Flight writes the command itself, and setting one is an error rather than a silent no-op.

outputstringdefaults to bin/*.8xp

Where the artifact lands, relative to the directory holding this manifest. A glob is allowed, but it has to match exactly one regular file. At most 200 characters.

Not read for a library: the appvar path comes from the library table instead.

submodulesbooleandefaults to false

Clone git submodules. They resolve over HTTPS only.

timeoutdurationdefaults to 10m

Wall clock for the build command. Between 30s and 30m. Go duration syntax, so 90s, 5m and 1m30s all parse.

What the output path may not be#

Rejected before the build starts
absolute paths

Anything beginning with a slash.

backslashes

Rejected outright, so a Windows-style path fails rather than being reinterpreted.

parent segments

Any .. anywhere in the path, before or after cleaning.

shell metacharacters

Every manifest path reaches a shell, so quotes, backticks, dollar signs, semicolons, pipes, redirects and newlines are all refused.

The library table#

Only read when the project language is LibLoad library. See LibLoad libraries for what the two modes mean.

[library] — both modes
namestringRequired

The LibLoad name. One to eight characters, starting with a letter, capitals and digits only. This is what other programs link against and what LibLoad resolves at runtime.

modelibify | customdefaults to libify

Who builds it. libify lets CEagle generate the build command from the keys below; custom runs your own command and collects the files you name.

ce-libify and managed are accepted as spellings of libify; own and command as spellings of custom.

headersarray of stringdefaults to []

Public headers to ship in the developer archive. At most twelve. The archive is flat, so two headers whose base names collide are rejected.

[library] — libify mode only
versionintegerdefaults to unset

The library version passed to ce-libify. Omitted when zero or absent.

srcstringdefaults to src

The directory holding the C sources.

includestringdefaults to .

Where the headers live.

exportsstringdefaults to exports.txt

The export table. It is an ABI: see the export table.

optimizestringdefaults to -Oz

The optimisation flag. Must start with -O and be at most eight characters.

[library] — custom mode only
appvarstringdefaults to bin/NAME.8xv

Where your build leaves the appvar.

stubstringdefaults to bin/NAME.lib

Where your build leaves the linker stub. An explicit empty string says the build ships none: the library still loads on the calculator, but nothing else can link against it.

Complete examples#

.ceagle-flight
[program]
name = "Snake"
version = "1.0.0"
summary = "The classic, on your calculator."
description = """
Eat the pixels.

Do not eat yourself.
"""
categories = ["games"]
tags = ["arcade", "classic"]
author = "Ada Lovelace"
depends = ["my-graphics-library"]

[build]
command = "make"
output = "bin/SNAKE.8xp"
submodules = false
timeout = "10m"

The console serves these same examples live:

curl -s "https://roost.ceagle.cc/api/v1/manifest?language=lib&mode=custom"

Every manifest error#

StatusCodeMeans
buildno .ceagle-flight fileNot where this project expects it, or you pushed a branch that is not tracked. The Flight page shows the manifest the project builds.
buildnot valid TOMLA syntax error. Check quoting and multi-line strings.
buildname is requiredMissing, empty, or longer than 64 characters.
buildversion is requiredMissing, empty, or longer than 24 characters.
buildcommand is requiredEmpty in custom library mode, or longer than 512 characters.
buildoutput must be a relative pathAbsolute, contains a backslash, or escapes the repository.
buildtimeout is outside the allowed rangeUnder 30 seconds, over 30 minutes, or unparseable.
buildcategories names a category that does not existCheck the live catalog.
buildonly administrators may publish into the CEagle Apps categoryA restricted category.
buildneeds a [library] section with a nameA library project with no library name.
buildmode is either libify or customAn unrecognised mode.
builda libify library build writes its own commandRemove the build command.
buildappvar and stub are only read for a custom buildRemove them, or switch to custom mode.
buildtwo [library] headers share a file nameThe archive is flat; rename one.
buildheaders names too many filesAt most twelve.
builda [library] path must stay inside the repositorySame rules as the output path.
Troubleshooting

Errors that come from the build itself rather than the manifest.

Read on
CEagle documentation