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 typeRenders as
stringA single-line text box — or a multi-line text area when marked multiline (see below).
numberA numeric input.
selectA dropdown of the values listed in the property's enum.
passwordA 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

A string 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.