Functions on orkestr, in beta
Write HTTP handlers in Node or Python, get a public URL in under a minute. No Dockerfile, no repo. EU-hosted. orkestr Functions is in beta.
You’ve got a service to ship. Not an app. A function. Something that receives an HTTP request, does a thing, returns JSON. Maybe it validates a webhook from Stripe. Maybe it’s the “contact us” endpoint for a static site. Maybe you just want a URL that returns {ok: true} so your uptime checker has something to ping.
So we built orkestr Functions. It’s in beta as of today.
What orkestr Functions is
Paste code, pick a runtime, get a URL. That’s the whole flow.
// node20
exports.handler = async (event) => {
return { ok: true, method: event.method };
};
Within about a minute, you have https://fn-<name>.orkestr.eu that runs that code on every request. event has method, path, query, headers, and body. Return a JSON-serialisable object, done.
Two runtimes for now: Node.js 20 and Python 3.12. Public URL or API-key-gated. Environment variables are encrypted at rest. Each function gets its own subdomain under orkestr.eu, with TLS on by default.
The containers scale to zero when idle. If a function isn’t hit for a minute, its container stops. The next request wakes it back up. Idle functions don’t sit on cluster capacity, which is why a fixed count is bundled into every plan instead of metered per invocation.
What it isn’t
The first thing you’ll hit: no npm, no pip. Not yet. The runtime is the language’s standard library, nothing more. Python functions get json, urllib, re, datetime, and the rest of the stdlib. Node functions get the Node 20 built-ins. If your webhook handler needs stripe-node or requests, you’re blocked today.
User-supplied dependencies are the #1 thing on the beta list. I want to ship something that works in a small scope before expanding it, so this is what you get first.
That also shapes what functions are good for right now:
- Webhook receivers that validate and forward
- Small JSON APIs for static sites (contact forms, search-as-you-type proxies)
- Cron-adjacent glue (hit this URL on a schedule from an external trigger)
- Endpoints that wrap an outbound HTTP call and add auth or headers
It’s not a good fit for a Next.js backend, image processing, anything that wants a real SDK, or anything compute-heavy.
Cold starts, honestly
Scale-to-zero always has a first-request cost. Measured cold starts (Python 3.12, our benchmarks):
- Starter (free): 1 function, 0.5 vCPU, 256 MB. Cold start ~3s.
- Pro (€9.99/mo): 10 functions, 1 vCPU, 512 MB each. Cold start ~1.7s.
- Team (€29.99/mo): 50 functions, 2 vCPU, 1 GB each. Cold start ~1s.
After the first request, the container stays warm for about a minute of idle time, so sequential traffic is hot. Resources are tied to your plan because upgrading should actually buy you something measurable.
Where orkestr Functions runs
Hetzner servers in Falkenstein, Germany. Same infrastructure orkestr uses for regular app deploys. Your handler code is encrypted at rest, and the runtime container is hardened the same way app containers are (cap-drop, no-new-privileges, limited network capabilities). No US data transfer.
If that matters to you, you already know why.
What’s missing in beta
The honest list:
- No dependency installs (npm / pip). Coming.
- No CLI or git-based deploy yet. You paste code in the dashboard today.
- Metrics tab shows request counts and latency but no per-invocation logs yet.
- No custom domains on a function. You get
fn-<name>.orkestr.eufor now. - Only HTTP trigger. No direct queue or cron integration.
If you hit something not on this list that feels like it should work, that’s probably a bug. Email me.
Trying it
One function is free on the Starter plan. If you don’t have an account yet, register here, then head to Functions to create one. The default handler is a working example. Deploy it unchanged and watch it return JSON at its subdomain.
If you build something with it, I’d like to see it.