ShoalStack is now

platform201
Multi-Service Orchestration

Run Your APIs, Workers, and Data
as One Application

In platform201, containers, functions, databases, queues, and schedulers share one visual graph, and each connection gives a service the values and routes it needs.

Connections That Pass Values
Between Services

Each connection between two of your services does part of the setup work. Databases, queues, and gateways give their values and routes to the services that use them.

No Credentials to Copy by Hand

Connect Cloud SQL, NeonDB, MongoDB, or a queue to a container. Its connection string arrives under the variable name that your code reads.

stagingNeonDBContainerQueueContainer variablesNo variables yetDATABASE_URL••••••••QUEUE_URL••••••••

Route Requests by Path

Put a gateway in front of all the containers and functions in your environment, and give each one its own URL path under a single HTTPS domain.

staginghttps://acme.dev/api/payments/hooks/apiAPI/paymentsPayments/hooksHooksGateway

Keep Variables in One Place

Add shared variables to the environment once. Nodes that need them refer to them by name, next to the values that their connections inject.

stagingAPIAPI_KEYWorkerAPI_KEYSchedulerAPI_KEYShared variablesAPI_KEY••••••••LOG_LEVELinfo

Call Services on a Schedule

Connect a scheduler to a container on one of its paths. Set its cron expression, HTTP method, timezone, and payload, or pause it.

stagingSchedulerContainerSchedulerSchedule0 6 * * *MethodPOSTTimezoneUTCPath/tasks/report

Match Each Service to the Work It Does

Request handlers, background workers, and scheduled jobs do different work. Give each one its own node with its own settings, and connect the nodes where they share data.

Background Work for APIs

Send slow tasks through a queue to a worker. The API keeps responding while the work completes.

Scheduled Data Pipelines

Call a processing service on a set cron schedule, and then write its results to a connected database.

Mixed-Language Services

Run Node.js, Go, and Python services side by side, each on its own path under the same domain.

Inside an Order Pipeline on One Graph

Picture an order system in one platform201 environment: an API, a background worker, a queue, a database, and a scheduled task. The steps show how they connect and get their settings.

1

Place the Services

In the graph editor, add a gateway, an API container, a worker, a queue, a database, and a scheduler. Set the language and port for each service.

2

Connect the Dependencies

Route /api to the API container. Connect the queue to the worker. Then connect the database to each service that reads from or writes to it.

3

Schedule Recurring Work

Point the scheduler at a task path on the worker. Set its cron expression, method, and timezone. Then add any shared variables your code expects.

4

Deploy the Environment

Deploy the environment and follow each status. The API answers at the HTTPS address of the gateway, and the worker receives its queue settings.

Begin With an Architecture That Works

Start from a prebuilt graph when a known pattern fits. Its services, routes, and connections are already in place. When the result suits your team, copy it or share it.

Clone Environments

Copy a working environment for staging or testing without rebuilding its nodes and connections.

Invite Team Members

On the Pro plan, invite team members, so they can open the graph and work on its services with you.

Grow Your Backend One Connection at a Time

Start with a container behind a gateway, or begin from a Blueprint with several services in place. Add workers, queues, and schedulers when your application needs them.

FAQ

Pass credentials to each service at runtime as environment variables, and keep them out of the source code and the container image. Each service then reads one variable, such as a connection string, and you can change the value without a rebuild. In platform201, a connection between a database and a service passes the value to the variable name that your code reads. platform201 stores environment variables encrypted, and it never builds them into the container image.