Compare

The Heroku alternative hosted in the EU

Push-to-deploy hosting on Dutch-owned hardware: a static front-end on the edge, a back-end container and a managed database in one project.

Updated 24 September 2026

Where should you host an app if you are leaving Heroku?

Sarpius is a push-to-deploy platform built on hardware the company owns in the Netherlands, not a rented region inside a US hyperscaler. Connect a Git repository and push: a Project is one application made of Components, and Sarpius treats a front-end and a back-end differently by default. A static or client-rendered front-end (Vite, plain React, a prerendered SvelteKit build, Astro, plain HTML) is uploaded to S3-compatible object storage and served from Sarpius's own edge proxy, which sits behind Cloudflare's network, so it never occupies a container and never has an idle-compute bill. A back-end that needs a real process (PHP, Node, Python, Java, Go) gets a container, wired to the same project's managed database. Billing on the container half is per minute from a prepaid wallet instead of a flat dyno subscription, and the first app on every account runs free, permanently, with no credit card. If the reason you're looking is Heroku's 2022 free-tier removal, or a policy that requires EU-only data processing, both are addressed directly rather than sold as an add-on plan.

Why are people still looking for a Heroku alternative?

Heroku removed its free dyno and database tiers in November 2022, and the cheapest way to keep an app running continuously today is a $7/month Basic dyno, with a separate Postgres database starting at $5/month. That alone puts a two-service hobby project at roughly $12/month before bandwidth or add-ons, and Heroku has no separate, cheaper path for a project whose front-end is just static HTML and CSS, everything runs through the same dyno billing. The other reason people ask is jurisdiction: Heroku is owned by Salesforce, a US company, and Heroku's own documentation states that its standard Common Runtime remains subject to US law regardless of the region a customer picks; full EU data isolation is reserved for Enterprise-only Private Spaces.

Heroku free plan removal FAQ ↗Heroku pricing ↗Heroku GDPR FAQ ↗

How does a Sarpius Project split a front-end from a back-end?

The connect-a-repository wizard groups every detected Component into one of two buckets before you confirm the plan: "Served from storage (static)", marked storage only, egress free, or "Containers". A static Component's built output goes to an S3-compatible object storage bucket; Sarpius Router serves it directly from there, fingerprints hashed build assets (an 8+ character hex segment before the file extension, the shape Vite, Rollup and webpack all produce) as Cache-Control: public, max-age=31536000, immutable, and marks everything else no-cache so a redeploy is always observed. Sarpius's own edge also keeps a bounded in-process cache of the hottest static objects per router replica, keyed by a release prefix that rotates on every deploy, so a new deploy invalidates itself without a purge call. Sitting in front of all of that, Cloudflare is the platform's enforced default edge: outside traffic reaches a Sarpius app through Cloudflare unless a domain has the paid Privacy route enabled. A container Component, by contrast, runs continuously and is billed per minute the way Heroku bills dyno-hours, just from a wallet instead of a subscription.

How does Sarpius compare?

FeatureSarpiusHeroku
Company / legal seatSynthwave-technologies.nl, Netherlands (KVK 73239038), Dutch/EU law, owns its hardwareSalesforce (US); standard plans subject to the US CLOUD Act
Static / client-rendered front-endServed from object storage at the edge; no container, egress free, cached on Sarpius's own edge and on Cloudflare's networkNo separate path; a static site still runs on a dyno and bills like any other app
Free tierFirst app free forever: 1 small container, 10 GB egress, subdomain + TLS, no cardRemoved November 2022; no free compute or database tier remains
Cheapest always-on containerFree (first app); each additional app EUR 4.99/month, per-minute billed$7/month Basic dyno
Managed PostgresFree shared tier (500 MB, 5 connections), or dedicated from EUR 2.99/month with 10 GBFrom $5/month, no free tier
Object storageS3-compatible, built in, EUR 0.025/GB-monthNo native product; third-party add-ons only
Billing unitPer minute from a prepaid wallet; stop the app, billing stopsPer-second dyno hours on a recurring monthly charge
Custom domain + TLSEUR 1.99/month, automatic Let's Encrypt; optional paid Cloudflare-bypass ("Privacy route"), +EUR 4.99/monthIncluded, ACM-managed
Git sourceGitHub, GitLab, Gitea, Bitbucket, or any generic git remotegit push to a Heroku remote, GitHub integration
EU-only data residencyDefault, on every tierEnterprise Private Spaces only
Platform export / migration bundleFull Project migration bundle: container files, SQL database dumps, bucket objects, commit manifest, secrets.env via short-lived token behind 2FA, 24h retention, 1 bundle/24hNo project-wide archive; dyno filesystem is ephemeral and not exportable as an archive

What does replacing a small Heroku app actually cost?

A typical hobby setup, one static or server-rendered web app plus a small Postgres database, running continuously: on Heroku that's roughly $7 (Basic dyno) + $5 (Postgres Essential) = $12/month before bandwidth, whether or not the front-end is static. On Sarpius the same shape is EUR 0/month if it's your first app on the free shared Postgres tier (500 MB), and if the front-end is a static build it costs nothing extra beyond the app it belongs to. Once you outgrow the first free app: EUR 4.99/month for a second container app plus EUR 2.99/month for dedicated Postgres. Bandwidth above the included 10 GB on a container app is EUR 0.05/GB; object storage for a static Component is billed on storage size, not on egress, at EUR 0.025/GB-month, because egress is free under the EU Data Act.

What frameworks and languages actually deploy?

The connect-a-repository wizard recognizes 45 frameworks and runtimes. On the static/edge side: Next.js, Nuxt, SvelteKit, Astro, Angular, React, Vue, Vite and Remix-style React Router, plus Hugo, Eleventy, Docusaurus, MkDocs and plain static sites. On the container side: Laravel, Symfony, WordPress and plain PHP; Express, Fastify, NestJS, Hono and Node.js; Django, Flask, FastAPI, Streamlit and Gradio; Go, Java on Maven or Gradle, and .NET; plus Strapi, PocketBase and Discord bots. The general rule: a framework that needs no server process gets served from storage; anything that runs continuously runs in a container.

What Sarpius does not do yet

Being direct about this matters more than the pitch: everything currently runs in a single Netherlands location, so an outage there takes your app down with it; a second independent zone is on the roadmap. Backup and restore with self-service, point-in-time recovery is what Sarpius is building right now, not a someday item, but it isn't live yet, so a restore today runs through support. Serverless Functions do not exist yet either; they are planned, not available.

Frequently asked questions

Does Sarpius really have a free tier, or is it a trial like Heroku's used to be?

It's not time-limited. The first app on every account stays free for as long as the account exists: one small container, 10 GB of monthly bandwidth, a free subdomain with TLS, no credit card.

Does the free tier cover commercial projects?

Yes. There is no personal-use-only clause on the free tier the way some competitors carve one out for their free plan; a first app that starts making money stays on the same free tier. The Terms of Service state this plainly: you may use the Free Tier for any lawful purpose, including commercial use.

Is Sarpius "EU-based" the same way an EU AWS region is EU-based?

No. Sarpius is a Dutch company running on hardware it owns, with no US parent in the ownership chain. Compute and storage run in the Netherlands today, and any future region stays inside the EU/EEA by stated policy.

Can I bring my existing GitHub or GitLab repo?

Yes. GitHub, GitLab, Gitea, Bitbucket or a plain git remote all work the same way; a push to the configured branch triggers the deploy.

What happens if I go over the included bandwidth on a container app?

EUR 0.05 per GB above the 10 GB bundle, billed from the wallet, with email alerts at 80% and 100% of the bundle and an optional hard cap. A static Component served from storage has no such bundle to run out of; it's billed on stored size, not on traffic.

Is there a catch in the per-minute billing?

Stop a container and billing for it stops; there is no cancellation flow to run through and no idle-minute charge once it's off.

Can I leave if it doesn't work out?

The repository stays on its own git host regardless of outcome, and databases and object storage remain accessible with standard clients and S3 access keys. You can also download a complete Project migration bundle directly from the Project workspace behind a console login, plus your two-factor code when 2FA is on. The bundle packages the built front-end/static output and live container files for each component, a SQL dump of each database, bucket objects, and a manifest detailing git repository URLs, exact commit SHAs and sha256 checksums per file, plus an explicit list of anything omitted and why. Secrets are never stored in the saved archive artifact; they are decrypted and added as secrets.env at download time via a short-lived, single-use token valid for 5 minutes. Bundles are retained for 24 hours, and a new bundle can be requested once every 24 hours.

Keep reading