WattleDB DEVELOPER GUIDE

Ship on sovereign Australian Postgres.

WattleDB gives you a fully-managed PostgreSQL database — plus an instant REST API, object storage, backups and point-in-time recovery — running entirely on Australian-owned infrastructure in Sydney. This guide takes you from zero to a connected, production database in about ten minutes.

PostgreSQL 17 Sydney · au-syd-1 Auto REST API Daily backups + PITR No US jurisdiction
01

Sign in to the console

Everything starts at the console — console.wattledb.com.au. It's where you create databases, grab connection strings, run SQL, and manage billing.

WattleDB is in private beta, so public sign-ups are closed. If you have an invite, use Log in with your email and password. First time in, you'll confirm your email address before the workspace opens.

Turn on two-factor authentication under Settings once you're in (step 12) — it takes 30 seconds and protects the keys to your data.
02

Create your first database

From Databases → New database, pick a plan and click create. WattleDB provisions an isolated PostgreSQL 17 instance in Sydney — usually ready in a minute or two.

  • Free — kick the tyres. One per workspace, auto-pauses when idle, no card needed.
  • Hobby / Launch / Scale — always-on production tiers with more CPU, RAM, storage and pooled connections. Scale additionally unlocks masked clones (step 9).

Every database — on every tier — gets daily backups, point-in-time recovery, TLS, a connection pooler, and the instant REST API. See the full plan table for specs. Prices are in AUD and exclude GST (10% is added at checkout).

Paid tiers need a payment method on file. Add one under Billing first, then create the database — the console will nudge you there if it's missing.
03

Connect to it

Once the database shows Active, click Connection on its row to reveal two connection strings. Use the right one for the job:

  • Pooled (DATABASE_URL) — routed through PgBouncer in transaction mode. Use this for your app at runtime; it handles many short-lived connections efficiently.
  • Direct (DIRECT_URL) — a session-mode connection straight to Postgres. Use this for migrations, psql, and anything needing session features (advisory locks, LISTEN/NOTIFY, prepared statements across calls).

Both are TLS-encrypted — always keep sslmode=require. Connect with anything that speaks Postgres:

terminal
# Connect with psql (use the Direct string for interactive work)
psql "postgresql://app:YOUR_PASSWORD@ab12cd34.db.wattledb.com.au:31234/app?sslmode=require"

# You're in:
app=> select version();
app.ts — node-postgres
import { Pool } from 'pg';

// Pooled connection string from the console → your app's DATABASE_URL
const pool = new Pool({ connectionString: process.env.DATABASE_URL });

const { rows } = await pool.query('select now() as ts');
console.log(rows[0].ts);
For full certificate verification (sslmode=verify-full), download the database's CA certificate from the console and point your client at it. sslmode=require already encrypts the connection.
04

Create tables & run SQL

Click Open on a database to enter Database Studio. The SQL editor tab runs any SQL against your database — schema changes, queries, seed data.

SQL editor
create table employee (
  id     bigint generated always as identity primary key,
  name   text,
  email  text unique
);

insert into employee (name, email)
values ('Ada Lovelace', 'ada@example.com');

Prefer your own tooling? Point any migration tool (Prisma, Drizzle, Flyway, psql -f) at the Direct connection string and manage schema from code. The Studio and your migrations see the same database.

05

Browse your data

The Tables tab is a full data browser. Pick a table from the searchable list on the left — even with hundreds of tables — and the right pane shows its rows. Toggle between Data and Schema, adjust how many rows to load, or hit Query to drop that table straight into the SQL editor.

It's read-and-explore for quick checks; reach for the SQL editor when you want to change data.

06

Turn on the instant REST API

The REST API tab turns every table into a REST endpoint — no backend code. It's powered by PostgREST and served from <id>.api.wattledb.com.au. Click Enable REST API, and each table becomes an endpoint supporting GET · POST · PATCH · DELETE with filtering, ordering and pagination via query params.

Authentication & security

  • Requests with no token use the anon role.
  • A JWT with role=authenticated unlocks the rows your policies allow. Mint a test token from the tab.
  • Click Secure (RLS) on a table to require a token and enforce Row-Level Security — the same policies apply to the REST API and to direct SQL, because it's one database.
terminal
# Read (filter, sort, paginate with query params)
curl "https://ab12cd34.api.wattledb.com.au/employee?select=*&order=id.desc&limit=10" \
  -H "Authorization: Bearer <TOKEN>"

# Insert
curl -X POST "https://ab12cd34.api.wattledb.com.au/employee" \
  -H "Authorization: Bearer <TOKEN>" \
  -H 'Content-Type: application/json' \
  -d '{"name":"Grace Hopper","email":"grace@example.com"}'
The API is PostgREST-compatible, so supabase-js and other PostgREST clients work against it — supabase.from('employee').select('*').
07

Store files with object storage

The Storage tab gives each database its own private, S3-compatible bucket on Australian-owned infrastructure. Grab the endpoint, region (au-syd-1), bucket name and access keys, and use any S3 client — path-style addressing.

terminal — aws cli
aws --endpoint-url https://storage.wattledb.com.au --region au-syd-1 \
  s3 cp ./report.pdf s3://tenant-ab12cd34/report.pdf
upload.ts — aws-sdk v3
import { S3Client } from '@aws-sdk/client-s3';

const s3 = new S3Client({
  endpoint: "https://storage.wattledb.com.au",
  region: "au-syd-1",
  forcePathStyle: true,   // required
  credentials: { accessKeyId: "…", secretAccessKey: "…" },
});

Each key can access only that database's bucket, and files never leave Australian-owned infrastructure.

08

Backups & point-in-time restore

Every database is backed up daily (02:00 AEST) with continuous WAL archiving, stored cross-state in Melbourne for disaster recovery. The Backups page lists every backup and lets you trigger an extra one anytime.

Restore to any moment in the last 7 days

Restore creates a new database recovered to the point you choose — your current one is never touched. Pick Latest or a specific backup, choose a plan (at least the source's storage), confirm, and a fresh database provisions. Verify it, repoint your app to its connection string, then delete whichever you no longer need. It's billed as a normal database — no restore fee.

A restore needs at least one completed backup to recover from. Brand-new database? Hit Back up now and wait for it to complete before restoring.
09

Masked clones for safe test data

Need production-shaped data in a staging environment without exposing real PII? A masked clone copies a Scale database into a new one and anonymises personal fields on the copy — emails, names, phone numbers, addresses and dates of birth are replaced with realistic but fake values. Your source is never modified.

From a Scale database's Studio, choose Masked clone, pick a plan and an expiry (minimum 7 days, AEST), and confirm. It's billed pro-rata for the days you keep it and auto-expires — extend anytime if you need it longer.

Masked clones are one-off and non-refundable on early deletion (you can always extend). Great for demos, load tests and onboarding a new engineer safely.
10

Scale up (or down) in place

Change plan resizes a database without a data migration — same database, same connection string. CPU, RAM and pooled connections apply after a brief restart; storage grows immediately.

Storage can only grow — disks don't shrink. Size for where you're heading, not just today.
11

Watch what's happening — Logs

The Logs tab is a read-only viewer with two streams:

  • REST API — every request to your auto-generated API (method, path, status).
  • Database — Postgres connections, disconnections, errors and notices.

Filter in place, download the current window, and know it's collected into a durable store in Sydney (retained 30 days) that never leaves Australian-owned infrastructure.

12

Lock down your account

Under Settings: enable two-factor authentication (scan the QR with any authenticator app and save your recovery codes), change your password (which signs out other devices), sign out everywhere if you lose a device, and manage your workspace. Changing your password rotates your session automatically.


R

Reference — Plans

All tiers include daily backups, PITR, TLS, connection pooling and the REST API. Prices in AUD, ex GST.

PlanPrice / movCPURAMStoragePooled connsNotes
FreeA$00.25256 Mi512 Mi5One per workspace · auto-pauses when idle
HobbyA$90.5512 Mi1 Gi10Cheapest always-on
LaunchA$291.01 Gi4 Gi20Production default
ScaleA$992.02 Gi10 Gi60Unlocks masked clones
R

Reference — Endpoints

WhatAddressUse for
Consoleconsole.wattledb.com.auEverything — create, manage, billing
Postgres (pooled)<id>.db.wattledb.com.auDATABASE_URL · app runtime
Postgres (direct)<id>.db.wattledb.com.auDIRECT_URL · migrations, psql
REST API<id>.api.wattledb.com.auAuto-generated REST (PostgREST)
Object storagestorage.wattledb.com.auS3-compatible · bucket tenant-<id>

<id> is your database's identifier (e.g. ab12cd34), shown on its row in the console. Ports and passwords come from the Connection panel.

R

Reference — FAQ

Where does my data live?

Primary compute and storage are in Sydney (NEXTDC S1); backups are replicated cross-state to Melbourne (NEXTDC M2). Everything runs on Australian-owned infrastructure — no US jurisdiction anywhere in the stack.

Is it real PostgreSQL?

Yes — standard PostgreSQL 17. Anything that speaks Postgres works: your ORM, migration tools, extensions, psql, dashboards.

What happens if my Free database goes idle?

It hibernates to save resources (the data is kept). Open the SQL editor or connect and it resumes automatically.

How am I billed?

Paid plans are charged in advance at sign-up, then monthly on the anniversary. One-off items (like masked clones) are charged upfront. GST is added at checkout, and you get a tax invoice for every payment.

Can I cancel or delete anytime?

Yes. Delete a database whenever you like; cancel a subscription and service runs to the end of the paid month. Consistent with the Australian Consumer Law.