Platform Engineering for the AI era
Primitives for the modern cloud.
Stop glueing together services. Write app logic, not infrastructure scripts.
monolayer provides the essential building blocks pre-configured for security, scalability, and developer experience.
Your code defines your app, and monolayer turns it into production-ready environments.
Zero Infra Code
monolayer provisions and configures infra with best practice defaults.
One-Step Deploys
From git push to running in AWS, no YAML, no Terraform, no IaC.
Own Your Infrastructure
Everything runs in your AWS account, under your control
Databases
PostgreSQL and Redis.
Background Tasks
Offload tasks from the main web request cycle.
Cron Jobs
Define cron jobs as code.
Object Storage
Store and serve files with global durability. Backed by Amazon S3.
Real-time Subscriptions
Build live dashboards, feeds, and UI updates.
Control Plane
Dashboard for deployments, logs, and environments.
Global Edge Delivery
CDN configured out of the box for fast frontends.
Preview Envs
Every branch gets an isolated full-stack preview environment.
Cost Transparency
Pay AWS directly — no hidden markup.
Outcomes from teams building on monolayer:
4x
-75%
Zero
3x
"Ship to production in 2 hours, no infra team."
"Our developers finally ship without fear."
"Zero-Ops isn't hype. It's real."
Own your infrastructure from Day One.
monolayer provisions everything directly in your AWS account.
The monolayer platform and control plane also run in your AWS account.
You keep full control over data, compliance, and costs, without vendor lock-in.
Your app declares what it needs.
With the monolayer SDK, databases, background tasks, cron jobs, object storage, and real-time channels are defined directly in your code.
No YAML, no ClickOps, no separate infra repo — just code that runs.
const pgDb = new PostgresDatabase("app-db");const credentials = process.env[pgDb.connectionStringEnvVar];const redis = new Redis("counters")const redisCredentials = process.env[envVarName];const documents = new Bucket("documents");const result = paginateListObjectsV2( { client: s3Client }, { Bucket: documents.name });Databases & Object Storage
- PostgreSQL
- MySQLComing soon
- Redis
- S3 Buckets
Databases & Object Storage
- PostgreSQL
- MySQLComing soon
- Redis
- S3 Buckets
const pgDb = new PostgresDatabase("app-db");const credentials = process.env[pgDb.connectionStringEnvVar];const redis = new Redis("counters")const redisCredentials = process.env[envVarName];const documents = new Bucket("documents");const result = paginateListObjectsV2( { client: s3Client }, { Bucket: documents.name });Background tasks
- Type-safe API
- Runs in Lambda functions
- Backed by SQS and DynamoDB
interface ProcessImage { text: string;}const processImage = new Task<ProcessImage>("img-processor", async ({ data }) => { // your business logic here. });await processImages.performLater({ text: "hello" });Background tasks
- Type-safe API
- Runs in Lambda functions
- Backed by SQS and DynamoDB
interface ProcessImage { text: string;}const processImage = new Task<ProcessImage>("img-processor", async ({ data }) => { // your business logic here. });await processImages.performLater({ text: "hello" });const broadcast = new Broadcast({ channels: { "/rooms/[id]": { data: new ChannelData<{text: string}>(), }, },});type Channels = typeof broadcast._channelDataType;await new BroadcastPublisher<Channels>().publishTo( "/rooms", { id: "some-id" }, [{ text: "hello" }],);const { useSubscription } = broadcastClient<Channels>();const subscription = useSubscription("/messages", { id: "some-id" });Real-time channels
- Type-safe API
- Public channels
- Private channelsComing soon
- Serverless WebSockets
Real-time channels
- Type-safe API
- Public channels
- Private channelsComing soon
- Serverless WebSockets
const broadcast = new Broadcast({ channels: { "/rooms/[id]": { data: new ChannelData<{text: string}>(), }, },});type Channels = typeof broadcast._channelDataType;await new BroadcastPublisher<Channels>().publishTo( "/rooms", { id: "some-id" }, [{ text: "hello" }],);const { useSubscription } = broadcastClient<Channels>();const subscription = useSubscription("/messages", { id: "some-id" });Cron jobs
- Runs in ECS
- Backed by EventBridge
const dailyReport = new Cron("daily-report", { schedule: "* * * * *", run: async () => { // your business logic. },});Cron jobs
- Runs in ECS
- Backed by EventBridge
const dailyReport = new Cron("daily-report", { schedule: "* * * * *", run: async () => { // your business logic. },});Framework Support
- Next.js
- React RouterComing soon
- TanStack StartComing soon
Simple, transparent pricing
We don't gate by features. Choose the option that works best for you.
- 3 users
- 5 projects
- Priority Support
Frequently Asked Questions
- - While we handle complex infrastructure behind the scenes, your cloud environment remains under your account.
- - You benefit directly from AWS scalability, reliability, and pricing.
- - No vendor lock-in. monolayer makes AWS your platform — we just do the heavy lifting.
Currently, monolayer supports Next.js. Support for more frameworks is planned.
Based on your application code, monolayer provisions among other cloud resources:
- - Serverless functions for Next.js, background tasks, and image optimization.
- - Fargate tasks for your cron jobs.
- - Message queues for background tasks.
- - Databases (PostgreSQL).
- - Caches (Redis).
- - Object storage (S3).
- - CDN (CloudFront).
- - S3 buckets for static data, images, and cache.
- - DynamoDB tables for application cache and tasks running.
monolayer provisions infrastructure in your AWS account using secure and sensible defaults.
For each project, application infrastructure runs (or is attached) to private subnets in a VPC.
- - Databases and internal services are not publicly accessible from the internet.
- - Lambda functions and ECS containers are attached to the VPC, allowing controlled access to internal resources.
- - A shared NAT gateway enables outbound traffic without exposing services.
monolayer provisions infrastructure in your AWS account using secure and sensible defaults.
Application infrastructure runs (or is attached) to private subnets in a VPC. Each project has two VPCs: VPC for the production branch and a VPC for preview environments.
- - Databases and internal services are not publicly accessible from the internet.
- - Lambda functions and ECS containers are attached to the VPC, allowing controlled access to internal resources.
- - A shared NAT gateway enables outbound traffic without exposing services.
With the monolayer SDK package, you can define lifecycle workloads tied to specific phases of the deployment.
Each lifecycle workload runs an `npm` script from your `package.json`.
- - `bootstrap`: runs only once when a new environment is created. Ideal for creating schema, tables, or initial seed data. -
- - `beforeRollout`: runs before each deployment. Useful for applying database migrations or validating external systems. -
- - `afterRollout`: runs after the deployment. Use it to send notifications or cleanup tasks.
The monolayer control plane is designed to give you full visibility over your environments and deployments, providing a unified interface to manage your full-stack application.
Key features include:
- - Project Settings: Customize compute resources, database configurations, and other infrastructure-specific settings for each environment.
- - Environment Overview: Get a high-level view of your application's environments, including resource usage, health status, and active services.
- - Each environment comes with dedicated sections for app services, background jobs, cron tasks, databases, and storage (e.g., S3 buckets). You can see metrics, and check logs.
- - Deployments overview and progress: Track the progress of your deployments and easily review past deployment logs.
- - Environment Variables Management: Add, update, and manage environment variables for different environments — whether for production or preview setups.
Applications are deployed using a serverless-first architecture designed to minimize idle costs and scale with usage.
Here's how that translates to pricing:
- - Compute (Lambda, ECS Fargate): You only pay when functions or scheduled jobs run.
- - Storage (S3, DynamoDB, Logs): Charges scale with usage—typically minimal in development.
- - Database (Aurora Serverless v2): Used for Postgres; scales ACUs based on load. Preview environments are always set to min ACU = 0 (no idle cost). For production, we recommend setting a non-zero minimum for responsiveness.
- - CloudFront (CDN): Charges for data transfer and requests (low cost for global caching).
- - S3: Charged by storage volume and requests (used for static assets and file storage).
- - DynamoDB (Next.js cache): On-demand or provisioned pricing based on reads/writes and storage.
For each project, there's a baseline cost of ~$5/month for the NAT Gateway.
Redis workloads, backed by serverless ElastiCache, have a minimum ~$7/month for the storage.
The monolayer platform runs as a Next.js application fully hosted on AWS using serverless services. Key components include:
- - Builds run on AWS CodeBuild, triggered by your deployments.
- - Deployment orchestration is managed via AWS Step Functions.
Because monolayer is serverless, your running costs mainly depend on your usage, particularly the number of deployments you make. More deployments trigger more builds and deployment workflows, which drive the majority of compute costs.
We expect the costs to run a typical deployment to be in the low single digit cents.
You can add custom environment variables — API keys, feature flags, config values, etc. in the project page on your control plane:
- - For all environments.
- - Only for production.
- - Only for preview environments.
- - Per environment.
Changes are applied automatically on the next deploy.