Core concepts
Services
In Dreambase, everything is a service. There is no fundamental distinction between an “app” and a “service” — every component of your system is modeled the same way.
Two kinds of services
While every component is a service, services come from one of two sources:
- Docker-image services — deployed from a Docker image. These are typically infrastructure: databases, queues, caches, and other pre-existing executables.
- Codebase services — built from a codebase. These are the applications you are developing — the web apps, APIs, and workers that make your product yours.
This mirrors Docker Compose
In Docker Compose, every component is a service, whether it is a ready-made image or something you build. Dreambase follows the same model, which keeps the mental model simple: one concept covers everything in your system.Service definitions vs. service instances
A service definition (often called a ServiceDef) is a reusable template: it carries an icon, metadata, the webhook URL of the platform service that backs it, a schema of the functions it exposes, and the scopes it needs. Service definitions can be private to your organization or published publicly to the marketplace.
A service on the canvas is an instance of a definition, placed at a position in your design and configured for your project. When you deploy, each service instance becomes a running deployment in an environment.
Inputs
A definition also declares the inputs the user fills in when they configure an instance — an object schema whose properties Dreambase renders as a form. Each property has a type plus optional title, description, default, and a required list on the parent schema.
| Field type | Renders as |
|---|---|
string | A single-line text box — or a multi-line text area when marked multiline (see below). |
number | A numeric input. |
select | A dropdown of the values listed in the property's enum. |
password | A masked text box for secrets. |
Any input value can also reference a stored secret with a {{env.KEY}} expression, and a property can be shown conditionally with showWhen (for example, only revealing a token field when serverType is dedicated).
Multi-line string inputs
Astring input marked multiline: true is rendered as a resizable text area instead of a single-line box — the right choice for long-form values like README content, a config blob, or a description. Only string fields honor it. For example, the Next.js and Express.js app scaffolds use it for their readme field:{
"readme": {
"type": "string",
"multiline": true,
"title": "README",
"description": "Markdown content for the generated README.md."
}
}Functions and events
A service can expose functions — named operations that other parts of your system (or the app itself) can call. The Email service, for instance, exposes send and sendEmails functions. Functions are invoked through events: Dreambase sends a FUNCTION_CALLevent to the service's webhook, and the service does the work and reports back.
Everything is composable
Because services share one model — definition, instance, functions, events — you can wire any service to any other on the canvas, and the same orchestration applies whether it is a database, a hosted app, or an email sender.