- Static: files served to the browser. Anything that produces HTML, CSS, and JavaScript works.
- Dynamic: a request handler that runs on Marina, with access to platform services (database, storage, jobs, AI, connections).
Supported stacks
Not supported: apps that start their own server and listen on a port
(Express, Fastify, and similar), and languages other than JavaScript and
TypeScript for the handler. Deploy source, not build output: if a project
has a build step, Marina runs it, which keeps the app editable in Studio.
Builds run offline, so everything a build needs must be in the project or
its npm dependencies.
Project layout
The request handler
A dynamic app exports a handler. Marina passes each request plus the services the manifest declares:src/app.ts
Request, Response, fetch, URL,
crypto, and friends. TypeScript needs no build configuration; Marina
bundles the entrypoint for you. There is no port to listen on and no server
to manage: export the handler and Marina routes requests to it.
marina carries only the services the version declares in its manifest.
Calling an undeclared service fails with a clear error naming the
declaration to add.
Who is making the request
Marina authenticates viewers before requests reach your app and identifies them with headers such asx-platform-user-id. Your code can trust these for
per-user data without building sign-in. Callers without a browser can use
app keys or temporary links.
From code to running app
marina deploy uploads the project, builds it, and publishes an immutable
version. Changes that expand what an app can touch (a new service, a new
connection, new migrations) go through an approval before the version goes
live. During development, marina dev runs the
same code locally.
App configuration
The full
marina.json reference.Deployments and versions
Builds, approvals, versions, and rollback.