Skip to main content
fresh.dev

Managed Postgres

Postgres on its own machine.
Priced like one_

A dedicated PostgreSQL 18 server on your private network. TLS required, health checked every 15 seconds, restarted if it stops, and patched by us. A SQL editor and 41 extensions in the console. The price is the price of the machine it runs on.

From £8 a month max · £0.0119 / hour · the £8 new-account credit covers a Fresh 4 for a month

The SQL editor on a managed database: schema browser, a query and its results The SQL editor on a managed database, dark theme
PostgreSQL 18
Minor releases and security updates installed by us.
Own machine
Nothing else runs on it. Your private network, with optional public access behind an allowlist.
41 extensions
pgvector, PostGIS, pg_cron, TimescaleDB and more. One switch each.
Every 15 s
A health check, and an automatic restart if it stops responding.
99.5% SLA
Measured every minute on the status page. 10–50% of charges back if we miss it.

The decision

Same price as a machine.
So why managed_

A Fresh 4 database costs exactly what a Fresh 4 machine costs. The difference is what you get and what you give up.

You get

  • Postgres installed and tuned for the plan’s memory, with TLS required
  • Health checks every 15 seconds, with an automatic restart
  • Security updates for the system and PostgreSQL 18 minor releases, by us
  • A SQL editor with schema browser, autocomplete, history, saved queries, EXPLAIN and CSV/JSON export
  • 41 extensions, turned on from a tab, with a warning before one needs a restart
  • Disk, memory, CPU and transfer, recorded every five minutes
  • An owner role, the connection string, and a password shown once in the console

You give up

  • SSH and OS access. It’s a database, not a box.
  • Superuser. You connect as your database’s owner; we keep postgres.
  • Extensions outside the 41. Ask and we’ll consider it.
  • Editing postgresql.conf. We tune it for the plan.
  • Running anything else on the machine.

Want all of that? Create a machine and install Postgres yourself. Same price, same hardware.

Not just a database

Three things in the console_

01

SQL editor

Query your database without leaving the console. Schema browser, autocomplete, 90 days of history, saved queries, EXPLAIN, and CSV and JSON export.

Safe on production. It opens read-only. Each run is one transaction that commits only if every statement succeeds.

02

Extensions

41 we build and test against PostgreSQL 18, each with a plain explanation and an example. On or off from the Extensions tab.

  • pgvector
  • postgis
  • pg_cron

03

Usage you can see

Disk used of allocated, memory and CPU p95, and transfer, recorded every five minutes per database, with a plain note when something needs a look.

disk
12.4 of 40 GiB
memory p95
1.9 of 4 GiB
cpu p95
18%

Where it sits

On your private network, next to your machines and apps

Anything you run on Fresh reaches the database over its private address, with no public exposure. Something elsewhere connects over the internet only if you turn public access on when you create the database and add its IP to the allowlist.

Specifics

The datasheet_

The things you’d otherwise have to email us to find out, including the ones that are a no.

Version
PostgreSQL 18, kept on the latest minor release by us
Connections
102 · 204 · 409 by plan. No pooler; PgBouncer on a machine works
Storage
40 · 80 · 160 GiB. No in-place resize yet
Network
Private always. Public behind an IP allowlist, if chosen at creation. TLS required either way
Replicas · HA
None. One server, restarted automatically if it stops responding
Backups · PITR
Not yet. Keep your own pg_dump copies
Access
Owner role on your database. No superuser, no SSH
Config
Tuned for the plan’s memory; shared_buffers is a quarter of it
Maintenance
Announced on the status page at least 48 h ahead, up to 4 h a month
Location
Kent, United Kingdom
Billing
By the second, 60-second minimum, capped at the monthly price
Import
pg_dump from anywhere, pg_restore over the private network or the allowlist

Extensions

41 extensions. One switch each_

Built and tested against PostgreSQL 18. Turn one on from the database’s Extensions tab; the console says first if a change needs a restart.

pgvector no restart

A 1,536-dimension column for OpenAI-style embeddings, an HNSW index, and a nearest-neighbour query.

alter table products add column embedding vector(1536);

-- cosine distance; build it after loading the embeddings
create index products_embedding_idx
  on products using hnsw (embedding vector_cosine_ops);

-- the 10 products most similar to a query embedding
select id, name, 1 - (embedding <=> $1) as similarity
from products
order by embedding <=> $1
limit 10;

Keep the index in memory for fast queries. A vector takes 4 bytes per dimension, so 500,000 rows of 1,536 dimensions is about 3 GB before the index's own links: that wants a Fresh 8 or larger.

pg_cron restarts PostgreSQL once

Delete expired sessions every night at 03:00 UTC, and see how recent runs went.

select cron.schedule('expire-sessions', '0 3 * * *',
  $$delete from sessions where expires_at < now()$$);

select jobid, status, start_time, return_message
from cron.job_run_details
order by start_time desc
limit 10;

It needs a library loaded at start-up, so enabling it restarts PostgreSQL once (about ten seconds).

postgis no restart

Shops with a location, a spatial index, and the ten nearest to a point.

alter table shops add column location geography(Point, 4326);

create index shops_location_idx on shops using gist (location);

select name, st_distance(location, st_makepoint(-0.1276, 51.5072)::geography) as metres
from shops
where st_dwithin(location, st_makepoint(-0.1276, 51.5072)::geography, 5000)
order by metres
limit 10;

Use geography for latitude and longitude on the Earth's surface (distances in metres); geometry for planar data and the full function set.

timescaledb restarts PostgreSQL once

A hypertable of readings, hourly averages, and dropping data older than 90 days.

create table readings (time timestamptz not null, sensor int, value double precision);
select create_hypertable('readings', by_range('time'));

select time_bucket('1 hour', time) as hour, avg(value)
from readings
where time > now() - interval '1 day'
group by hour order by hour;

select drop_chunks('readings', older_than => interval '90 days');

It needs a library loaded at start-up, so enabling it restarts PostgreSQL once (about ten seconds).

Search4
pg_trgm
Trigram similarity and fuzzy search; indexes that make LIKE '%term%' fast.
unaccent
A text-search dictionary that strips accents, so "café" matches "cafe". Pairs with pg_trgm for forgiving search.
fuzzystrmatch
Levenshtein distance and phonetic matching (Soundex, Metaphone, Double Metaphone).
rum
An index for full-text search that returns results already ranked.
AI & vectors1
pgvector
Store embeddings and search by similarity. HNSW and IVFFlat indexes; cosine, L2 and inner-product distance.
Geospatial6
postgis
Geometry and geography types, spatial indexes, distance and containment queries. The standard for anything with a location.
pgrouting
Shortest paths and routing over road or path networks. Needs PostGIS, which is enabled with it.
h3
Uber's H3 hexagonal grid: index points into cells for heatmaps and fast spatial grouping.
cube
Multi-dimensional points and boxes with GiST indexing.
earthdistance
Great-circle distances between latitude/longitude points, without PostGIS. Enables cube with it.
postgis_raster
Raster data in PostGIS: elevation, imagery and other gridded data. Enables PostGIS with it.
Time series1
timescaledb
Hypertables for time series: automatic partitioning by time, time_bucket() and fast deletion of old data.
Scheduling1
pg_cron
Run SQL on a schedule inside the database: nightly aggregates, clean-ups, refreshes. Jobs survive restarts.
Data types14
uuid-ossp
UUID generation: versions 1, 3, 4 and 5.
citext
Case-insensitive text: emails and usernames compare equal regardless of case, without lower() everywhere.
hstore
A key/value type for flat string maps.
ltree
Hierarchical labels like a.b.c, with fast ancestor and descendant queries.
pg_uuidv7
Time-ordered version 7 UUIDs, plus extracting the timestamp from one.
intarray
Fast operators and indexes for integer arrays: overlap, containment, sort and uniq.
isn
ISBN, ISSN, EAN13 and UPC types that validate check digits.
ip4r
IPv4 and IPv6 ranges with indexes that make "which range holds this address" fast.
semver
A semantic-version type that sorts 1.10.0 after 1.9.0.
hll
HyperLogLog: approximate distinct counts in a few kilobytes, mergeable across days.
tdigest
Approximate percentiles that merge: p95 and p99 from rollups.
prefix
Longest-prefix matching with an index, for phone-number routing and similar.
unit
Physical quantities with SI units, checked and converted.
seg
Line segments and measurements with uncertainty.
Performance9
pg_stat_statements
Timing and call counts for every statement the server runs. The first place to look when the database is slow.
btree_gist
B-tree behaviour for GiST indexes: exclusion constraints that mix equality with ranges.
btree_gin
B-tree behaviour for GIN indexes: one index over a scalar column and an array, jsonb or trigram column.
hypopg
Hypothetical indexes: see whether EXPLAIN would use an index without building it.
pg_buffercache
See which tables and indexes are in PostgreSQL's shared buffer cache.
pgstattuple
Measure dead rows and bloat in tables and indexes.
pg_prewarm
Load a table or index into memory on demand, so the first queries after a restart are fast.
pg_hint_plan
Planner hints in comments, for the rare query the planner gets wrong.
bloom
Bloom-filter indexes for equality searches over any combination of many columns.
Security1
pgcrypto
Hashing and encryption functions: bcrypt password hashes, digests, HMAC, PGP encryption.
Integration1
postgres_fdw
Query tables in another PostgreSQL database as if they were local. Works across your private network.
Testing1
pgtap
Unit tests for your schema and functions, written in SQL.
Languages2
plpgsql_check
A linter for PL/pgSQL: finds errors in functions without running them.
orafce
Oracle-compatible functions and packages, for porting applications from Oracle.

Need one that isn’t here? Email help@fresh.dev with its name.

Pricing

Priced like a machine. Tuned like a database_

Three sizes, billed by the second, never more than the monthly price. Each is tuned for its memory, so the plan you pick is a database decision, not a VM one.

Fresh 8

4 shared vCPU · 8 GiB · 80 GiB

£16/ month max

£0.0238 / hour

Fits
Busy production apps, bigger vector indexes
shared_buffers
2 GiB
Connections
204
Create a database

The £8 credit covers about two weeks

Fresh 16

8 shared vCPU · 16 GiB · 160 GiB

£30/ month max

£0.0446 / hour

Fits
Analytics, time series, large PostGIS data
shared_buffers
4 GiB
Connections
409
Create a database

The £8 credit covers about a week

Prices in GBP, including VAT.

Questions people ask

Before you create one_

Can my app on another host connect?

Yes, if you chose public access when you created the database: add the other host’s IP address to its trusted sources. TLS is required either way. Anything you run on Fresh should use the private address instead; it never touches the internet.

How do I import an existing database?

pg_dump it, then pg_restore into the connection string the console shows you: over the private network from a Fresh machine, or from anywhere on your trusted sources. Add --no-owner, because you restore as the database’s owner rather than a superuser.

What happens when I outgrow a Fresh 4?

There’s no in-place resize yet. Create a bigger database, pg_dump the old one into it over the private network, then delete the old one. Both are billed by the second while you move.

Is the SQL editor safe to use on production?

It opens read-only. Writes have to be switched on, and each run is one transaction that commits only if every statement succeeds. Your query history is kept for 90 days.

How do upgrades work?

We install security updates for the system underneath and PostgreSQL 18 minor releases automatically. Planned maintenance is announced on the status page at least 48 hours ahead. PostgreSQL 18 is the only major version for now.

What if I need an extension that isn’t on the list?

Email help@fresh.dev with its name. We add the ones people ask for once we’ve built and tested them against PostgreSQL 18.