Serverless functions in the EU
Put a JavaScript or TypeScript file in functions/ and push. It answers over HTTPS at its own address, runs on Node 22 in Paris and scales to zero when nobody calls. In closed beta, and free while it lasts.
A file, a push, a URL.
No framework to add, no configuration file, no separate build step. Your next production deploy bundles each file on its own and gives it a hostname with a certificate already in place.
functions/hello.jsa function_lib/greeting.jsshared code, bundled in
[functions] Bundled 1 function(s): hello (1208 bytes)⚡ Registered function "hello" (http, 60s timeout)🌐 HTTP function "hello" live at https://hello-example-site.fn.deploybase.eu
Its own hostname
The file name, then your project's subdomain. Together they must fit in 63 characters, or the deploy says so in the build log.
https://{name}-{subdomain}.fn.deploybase.eu TypeScript as it is
A .ts file works the same way. Types are stripped when the function is bundled, with no tsconfig and no type-check step.
Two doors, one file.
Call a function over HTTPS and it answers inside the request. Or queue it through the API: you get a URL to poll at once, and the result waits for you for 7 days.
curl -i "https://hello-example-site.fn.deploybase.eu/?name=Ada"
HTTP/2 200
content-type: application/json
access-control-allow-origin: *
strict-transport-security: max-age=63072000; includeSubDomains; preload
x-keda-http-cold-start: true
{"message":"Hello, Ada!"} The first call after a quiet spell waits 2 to 5 seconds while an instance starts, and the reply says so. The calls after it do not.
curl -X POST "https://api.deploybase.eu/api/v1/public/functions/example-site/hello?name=Ada"
{
"data": {
"invocation_id": "01234567-89ab-…",
"status": "pending",
"poll_url": "/api/v1/public/functions/example-site/hello/invocations/01234567-89ab-…"
}
} Each queued call runs in a fresh container. Its console output shows on the function's page in the dashboard.
The Request and Response you know
Your handler takes a standard Request and returns a standard Response, the shape Netlify, Cloudflare and Deno use. A handler written for one of them usually runs here unchanged.
Rollback brings its handlers back
Promote an older deployment and it serves that deployment's functions, not the ones the newest build left behind. Site and functions move together.
The limits, in writing.
What every team in the closed beta gets today, whatever its plan, Free included. The same numbers are in the reference and in the beta terms you accept.
| Memory per instance | 512 MB |
|---|---|
| Concurrent requests per instance | 10, then a second instance starts |
| Instances per function | Up to 3 |
| Request budget | 60 seconds |
| Request body | 10 MiB over HTTPS, 1 MB queued |
| Bundle size | 900 KB per function |
| Cold start | 2 to 5 seconds after a quiet spell |
| Price during the beta | €0 |
Where your code runs
Compute is Scaleway in Paris, on nodes reserved for functions. Bundles sit in a private Bunny.net storage zone in Germany, never on your site's CDN. Our DPA covers the personal data your functions process.
When the beta ends
Functions become part of paid plans at published pricing. We email you at least 30 days before anything changes, and the terms say exactly what that means.
Your code, in a sandbox.
Every instance runs under gVisor, which keeps one customer's code away from the host kernel and from other customers, on top of the usual container isolation.
Source never published
Nothing under functions/ reaches your site's CDN. The bundle is stored where no public URL points, so your handler's code cannot be downloaded.
Errors say nothing to strangers
A handler that throws answers 500 with no detail, on purpose. Reproduce it with a queued call to read the console output.
What functions do not do yet.
- Environment variables Project variables reach builds only. A function cannot read a secret you set yet.
- Scheduled functions Not built. Use an external scheduler to call the HTTPS address.
- Logs for HTTPS calls Queued calls show their output in the dashboard; HTTPS calls do not yet.
- A path on your own domain A function answers at its own hostname only, not at a path of your site.
- Framework server builds A SvelteKit or Astro server build cannot deploy as a function. Today a handler is a file you write.
- Metering and request caps Not enforced. The beta asks for fair use, and abusive traffic may be throttled.
Databases, containers and long-running processes are out of scope by decision, not on the list.
Questions about functions.
Something else? Write to support@deploybase.eu. A person answers.
How do I get into the functions beta?
A team owner or admin applies from the billing page, or from app.deploybase.eu/functions-beta, and accepts the beta terms for the team. We review applications by hand and email you when the team is in. Access is per team and works on every plan, Free included.
Functions overviewWhat do functions cost?
Nothing during the closed beta. When it ends, functions become part of paid plans at published pricing, and we email you at least 30 days before anything changes.
Can I use npm packages in a function?
Yes. Relative imports and the packages your build installed are bundled into one file per function, up to 900 KB. Node built-ins stay external. Files in a subdirectory of functions/ are shared code, not functions of their own.
The referenceDo preview branches run functions?
No. Functions deploy from your production branch only, so a preview never puts unreviewed server code behind a live hostname. Promoting a deployment, including rolling back to an older one, also brings back that deployment's functions.
Is this Node, Deno or something else?
Node 22, in a distroless image with no shell. Your handler takes a standard Request and returns a standard Response, the shape Netlify, Cloudflare and Deno use, so a handler written for one of them usually runs here unchanged. Responses can stream.
Put a function next to your site.
Create a team on the free plan, apply for the beta from the billing page, and push a file.