PocketBase, on demand.
Pick a name, get a backend: database, auth, files, realtime at
https://. No email, no setup — just sign up and build.
$ curl -s https://myapp.duckerhub.com/api/collections/posts/records { "page": 1, "perPage": 30, "totalItems": 2, "items": [ { "id": "a9xk2…", "title": "hello ducker" }, { "id": "b3qm7…", "title": "it is just PocketBase" } ] }
Signup to first API call in a minute.
No email, no credit card, no YAML. Three steps and your frontend has a backend.
Sign up
Username and password — that's the whole form. You get an API key and a one-time recovery code.
Name your ducker
Pick a name and it's live in seconds at <name>.duckerhub.com — container, persistent storage and TLS included.
Point your frontend at it
Create the superuser via the installer at /_/, then hit the API from JS, Dart/Flutter, or anything that speaks HTTP.
A backend that earns its keep.
Not a mock, not a shim — the real PocketBase, wrapped in the boring operational bits you didn't want to run yourself.
▤Real PocketBase
SQLite database, auth, file storage and realtime subscriptions — the complete PocketBase API and admin UI, unmodified.
zZSleeps when idle
After 15 idle minutes your ducker stops and costs nothing. The next HTTP request wakes it in a couple of seconds.
⬡Isolated by default
Every ducker runs in its own gVisor-sandboxed container with its own data volume. Your process, your data, nobody else's.
⇪Hosts your frontend too
Upload a tar.gz of your built site and it's served at the ducker root with SPA fallback. /api and /_/ stay PocketBase.
⌁Agent-native
Remote MCP at duckerhub.com/mcp lets your coding agent create and manage duckers with your API key — backends become a tool call.
◦No ceremony
No email verification, no org, no project, no region picker. A name is a backend. Delete is one click and actually deletes.
Any language that speaks HTTP.
The standard PocketBase REST API at your subdomain. Create collections in the admin UI, then read and write from your app.
// list records const res = await fetch( 'https://myapp.duckerhub.com/api/collections/posts/records'); const { items } = await res.json(); // create a record await fetch( 'https://myapp.duckerhub.com/api/collections/posts/records', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ title: 'hello ducker' }) });
import 'package:http/http.dart' as http; import 'dart:convert'; // list records final res = await http.get(Uri.https( 'myapp.duckerhub.com', '/api/collections/posts/records')); final items = jsonDecode(res.body)['items']; // create a record await http.post( Uri.https('myapp.duckerhub.com', '/api/collections/posts/records'), headers: {'Content-Type': 'application/json'}, body: jsonEncode({'title': 'hello ducker'}));