Skip to content

The manifest: basemodo.toml

Every key of basemodo.toml, the optional file that names your App and says what detection cannot know: its start command, runtime versions, workers, cron entries and Public Paths.

Most Apps need no manifest: Basemodo detects how to build and run the folder (see Supported runtimes). Add a basemodo.toml at the top of the folder only for the exceptions. It is TOML, and every key is optional.

name = "lunch-rota"
[web]
command = "node server.js"
  • Strict. A key Basemodo does not know, or a wrong value, stops the Deploy before anything is built, with the error invalid_manifest naming the key, its line, and the fix. A typo never goes unnoticed.
  • On top of detection. What the manifest changes in the detected plan is listed as an override, with its line, next to the detection's explanation, so you always see why your App is built the way it is.
  • With your own Dockerfile, web.command replaces the image's command, and [build] versions are refused: the Dockerfile's FROM line chooses the runtime.

Every key at once

No App needs all of these; this is every key basemodo.toml accepts, each explained below.

name = "lunch-rota"
public_paths = ["/webhooks/stripe", "/hooks/*"]
[web]
command = "node server.js"
indexable = true
toolbar = false
[build]
node = "22"
python = "3.12"
[[worker]]
name = "mailer"
command = "node mailer.js"
[[cron]]
name = "nightly-report"
schedule = "0 3 * * *"
command = "node report.js"
timezone = "America/Bogota"
timeout = "15m"
[network]
allow = ["api.stripe.com", "*.trello.com"]

Keys

name

The App's name: basemodo deploy deploys to the App of this name.

name = "lunch-rota"

public_paths

Paths that bypass sign-in, for webhooks, under stricter rate and size limits; /* at the end opens every path under it.

public_paths = ["/webhooks/stripe", "/hooks/*"]

web

The web Process, which answers HTTP.

[web]

web.command

Starts the web Process instead of the detected start command; it must listen on $PORT.

[web]
command = "node server.js"

web.indexable

Lets search engines index the App; only while its Visibility is Public.

[web]
indexable = true

web.toolbar

Turns off the Toolbar Basemodo shows signed-in visitors on the App's pages (true turns it back on); without it, the App keeps the setting it has.

[web]
toolbar = false

build

Runtime versions, one key per runtime.

[build]

build.node

The Node.js version, instead of the detected one.

[build]
node = "22"

build.python

The Python version, instead of the detected one.

[build]
python = "3.12"

worker

A Process that runs continuously beside web, in the same Machine; repeatable.

[[worker]]

worker.name

The worker's name, in logs.

[[worker]]
name = "mailer"

worker.command

How the worker starts.

[[worker]]
command = "node mailer.js"

cron

A Process run on a schedule; repeatable.

[[cron]]

cron.name

The entry's name, in logs.

[[cron]]
name = "nightly-report"

cron.schedule

Five fields: minute hour day-of-month month day-of-week.

[[cron]]
schedule = "0 3 * * *"

cron.command

What runs.

[[cron]]
command = "node report.js"

cron.timezone

The time zone the schedule is read in; default UTC.

[[cron]]
timezone = "America/Bogota"

cron.timeout

How long a run may take before it is killed; default 15m, at most 24h.

[[cron]]
timeout = "15m"

network

Outbound network rules (Workspace Apps only).

[network]

network.allow

The only hosts the App may reach (*. for every subdomain); what Basemodo always blocks stays blocked.

[network]
allow = ["api.stripe.com", "*.trello.com"]