Delt

Serverless Laravel hosting built for developers who hate paying for idle servers.

The Problem

Indonesian Laravel developers face a frustrating choice: manage your own VPS (SSH, Nginx configs, SSL renewals — every week) or pay for US-based managed hosting with 200ms+ latency. Neither option is good. Manual VPS workflows consume hours that should be spent shipping features. US-based hosting adds latency, lacks local payment methods, and charges in dollars that hit differently when you're earning in rupiah.

The market needed a platform with Jakarta servers, QRIS and GoPay payments, and flat pricing — no per-request billing surprises.

Building the First Version

Delt started on Google Kubernetes Engine — the standard choice for a containerized Laravel PaaS. The architecture made sense: GKE Autopilot for compute, Supabase for the control plane (Edge Functions, Auth, PostgreSQL), and Google Cloud Build for the deployment pipeline.

Fifty-one Supabase Edge Functions orchestrated every part of the system: GitHub webhooks, deployment triggers, infrastructure provisioning, database management, custom domain verification, billing sync, and more. Each function was a small, focused piece of a larger state machine.

It worked. The ProductHunt launch got traction. Developers loved the concept — Laravel hosting that just works, with a Jakarta region and local payments.

But there was a problem.

The Hard Lesson

Zero paid conversions. Despite warm market reception and promotional codes (Rp 100K free credit), not a single tenant converted to a paid plan. The platform was burning $139 per month on GKE infrastructure, with GCP credits about to expire.

Two things became clear. First, Indonesian purchasing power at the scale needed to sustain the platform wasn't there yet. Second — and this was the real signal — the ProductHunt launch generated significant interest from US and European developers. Developers earning $80-150K per year who would happily pay $29 per month for a managed Laravel platform. But $139 per month minimum infrastructure cost made competitive global pricing impossible.

A change was needed.

The Pivot

Lambda had always been ruled out early in the design. The reason: a 15-minute function timeout kills queue workers. Laravel queues run background jobs — emails, notifications, image processing — that need persistent workers. A function that dies after 15 minutes can't replace a daemon.

The answer was hiding in plain sight: SQS. When Lambda is triggered by an SQS queue, it processes one message at a time. Each message is a single job. Each job completes in seconds. The 15-minute Lambda limit applies per invocation, per job — not per session. No persistent queue:work daemon needed.

That insight unlocked everything.

The entire GKE cluster was deleted and rebuilt on AWS Lambda with Bref, a production-proven PHP runtime for Lambda (40 billion executions per month across their user base). The migration took two weeks.

The results were dramatic:

Before (GKE)After (Lambda)
$139/mo minimum infrastructure cost~$0.50/mo idle
51 Supabase Edge Functions12 functions + n8n
Jakarta only (single region)Singapore + N. Virginia (multi-region)
IDR pricing onlyUSD ($29/$59) + IDR (Rp 349K/699K)
30-60 second cold starts500ms cold starts (Bref runtime)

The Pipeline Problem

The 51 Edge Functions that powered the GKE version moved to Lambda, but the complexity remained. A failed deployment required tracing through 6+ function logs. Error recovery relied on a retry-stuck-deployments cron job that existed because the pipeline regularly broke mid-deployment. There was no single view of the deployment flow — just a chain of functions passing state through PostgreSQL.

The pipeline was replaced with n8n, an open-source workflow automation tool running on ECS Fargate. A single visual graph shows the entire deployment flow: webhook → validate → build → deploy → provision. When a step fails, the node turns red. Built-in retry handles transient failures. Slack notifications fire on success and failure. Debugging went from cross-function log tracing to looking at one graph.

The pipeline also controls infrastructure costs. An hourly workflow checks whether RDS databases have active tenants. If no Growth or Business tenants exist, the database stops automatically. When a tenant deploys, the database starts again. No more paying for 24/7 compute that's used two hours a day.

Current Architecture

Delt runs on a Lambda-per-tenant model. Each project gets three functions: one for web requests (PHP-FPM via Bref), one for queue workers (triggered by SQS), and one for the Laravel scheduler (triggered by EventBridge every minute). Tenants are isolated by function — different code means different container images.

Cloudflare handles DNS, SSL, and traffic routing via a Worker that extracts the tenant slug from the subdomain and forwards requests to the correct Lambda function URL. Supabase remains the source of truth for authentication, project metadata, encrypted secrets, and billing records. n8n orchestrates the entire deployment pipeline, infrastructure provisioning, and cost control workflows. Payments go through Paddle (global) and Midtrans (Indonesia).

The platform runs in two regions — Singapore and N. Virginia — with on-demand provisioning for new regions when demand materializes. Multiple deployment options, from a single free Hobby tier that auto-hibernates to Business tier with provisioned concurrency for zero cold starts.

Lessons Learned

The biggest lesson: your assumptions are usually wrong. Lambda was dismissed for months because of a 15-minute timeout. SQS trivially solved the concern, and nobody checked until the credits ran out. The constraint that drove the entire architecture was a phantom.

Costs drive architecture more than technical elegance. GKE was the "right" choice — containerized, portable, industry-standard. But it was also $139 per month minimum. Lambda was unconventional for PHP and required a runtime layer (Bref), but it cost $0 when idle. The right technical choice was the wrong financial choice.

Building for a global market first and localizing second creates more sustainable economics. The Indonesian market validated the concept, but the US market paid the bills. A platform that serves both is stronger than one that serves either alone.

Visual pipelines beat imperative code for operations. A failed n8n workflow shows the failure immediately — one red node, one Slack notification. The equivalent in Edge Functions required tracing through 6+ function logs, re-playing webhook payloads, and manually retrying. Observable operations are not a luxury; they are a prerequisite for a solo founder running a platform alone.