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_manifestnaming 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.commandreplaces the image's command, and[build]versions are refused: the Dockerfile'sFROMline 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 = truetoolbar = 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 = trueweb.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 = falsebuild
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"]