Cells/ribo.toml Reference

ribo.toml Reference

Every Cell has a ribo.toml configuration file. ribo deploy reads it from the current directory by default, or from the path given by --config.


[cell]

The [cell] table is required.

[cell]
name  = "my-cell"          # required
js    = "./cell.js"        # required (or wasm, or static)
build = "npm run build"    # optional — run before uploading

Fields

Field Type Required Description
name string yes Human-readable name. Used to derive the stable address.
js string one of Path to the JavaScript entry point (relative to ribo.toml)
wasm string one of Path to the compiled .wasm file
static string one of Path to a local directory — deploys a static site with no JS required
build string no Shell command to run before deploying. Runs in the directory containing ribo.toml.
bindgen_glue string no Path to the wasm-bindgen JS glue file. Required when wasm is set and the binary uses wasm-bindgen.

Exactly one of js, wasm, or static must be present.


[[bindings]]

Each [[bindings]] block declares a resource that the Cell can access at runtime. The binding name becomes a property on the env object passed to fetch.

c3 — SQLite database

[[bindings]]
type     = "c3"
binding  = "DB"        # env.DB in your cell
database = "myapp"     # database name (created with ribo db create)

Multiple databases:

[[bindings]]
type     = "c3"
binding  = "USERS"
database = "users"

[[bindings]]
type     = "c3"
binding  = "LOGS"
database = "request-logs"

g7 — Object storage bucket

[[bindings]]
type    = "g7"
binding = "IMAGES"     # env.IMAGES in your cell
bucket  = "avatars"    # bucket name (created with ribo bucket create)

files — Static file tree

[[bindings]]
type    = "files"
binding = "ASSETS"     # env.ASSETS in your cell
dir     = "./public"   # local directory to upload

Files are uploaded at deploy time and served from object storage. The binding has a fetch(request) method for URL-based serving and a get(key) method for direct access.

text — Plain string value

[[bindings]]
type    = "text"
binding = "API_KEY"    # env.API_KEY in your cell
value   = "sk-..."     # literal string value

Use text bindings for configuration, feature flags, or non-secret string values.


[[pulse]]

Each [[pulse]] block declares a cron schedule. The platform calls the Cell's pulse(event, env) handler at each scheduled time.

[[pulse]]
schedule = "0 * * * *"     # every hour at :00

[[pulse]]
schedule = "*/15 * * * *"  # every 15 minutes

Multiple [[pulse]] blocks are allowed. Each fires independently.

Fields

Field Type Required Description
schedule string yes 5-field POSIX cron expression (UTC). Validated at deploy time.

Cron syntax: min hour dom month dow. All times are UTC. Minimum interval is 1 minute.

See Pulse Overview for the handler interface and examples.


[server]

Override the default management API URL. Useful for local development.

[server]
url = "http://localhost:8082"

When omitted, ribo uses https://api.dev.tissue.systems.


Complete example

[cell]
name  = "notes-app"
js    = "./dist/cell.js"
build = "esbuild src/cell.ts --bundle --outfile=dist/cell.js --format=esm"

[[pulse]]
schedule = "0 * * * *"     # hourly cleanup

[[bindings]]
type     = "c3"
binding  = "DB"
database = "notes"

[[bindings]]
type    = "g7"
binding = "UPLOADS"
bucket  = "note-attachments"

[[bindings]]
type    = "text"
binding = "APP_VERSION"
value   = "1.0.0"

Static site shorthand

For a Cell that only serves static files, the static field eliminates the need for a JS entry point entirely:

[cell]
name   = "my-site"
static = "./public"

ribo generates the pass-through worker automatically and deploys the directory contents. See Static Sites for routing behaviour and the hybrid (static + dynamic) pattern.