Fast & native
AOT executables. 3,500+ req/s on 4 dedicated cores in reproducible benchmarks.
Annotate PostgreSQL functions and SQL files with comments to declare HTTP routes, auth, caching, retries, and rate limits. Get a fast, typed REST API — no controllers, no models, no boilerplate. Then test it with SQL files too.
News Try PlumeSQL, our new PostgreSQL IDE that turns SQL into tools, now in beta. Extensible, featherweight, free, no account. macOS, Windows and Linux. NpgsqlRest integration is coming soon. Download →
.sql files run against real endpoints in-process (--test), and watch mode (--watch) restarts on SQL, config, and even database routine changes.tsc), and @mcp tools for AI agents — with OpenAI/Anthropic tool schemas and llms.txt generated from the same catalog.PostgreSQL in. REST API, typed TypeScript client, and AI-agent tools out — with real, reproducible numbers from a product in production. Use the arrows, thumbnails, or your keyboard (←/→, F for fullscreen, N for speaker notes).

SQL declares what data. Annotations declare what behavior. Configuration declares what infrastructure. Tests declare what correctness — also in SQL. There is no imperative glue anywhere — no controllers, no services, no mappers to keep in sync. And it is built on the declarative language that has been running the world's data for 50 years — the one every developer, and every LLM, already knows: SQL.
Declare what you want from your endpoint — caching, authorization, timeouts, retries, rate limiting — right where the SQL lives.
No test framework, no running server, no mocks. npgsqlrest --test invokes the real endpoint pipeline in-process, on the test's own transaction — insert fixtures, call the endpoint (it sees your uncommitted rows), assert with SQL, roll back.
-- tests/get_users.test.sql
begin;
insert into users (email) values ('fixture@example.com');
/*
GET /api/get-users
# @claim user_id=1
*/
select status = 200, 'authenticated caller gets 200' from _response;
select body::jsonb @> '[{"email": "fixture@example.com"}]', 'fixture is listed' from _response;
rollback;$ npgsqlrest ./config.json --test
PASS tests/get_users.test.sql (2 assertions, 52ms)
19 passed, 0 failed, 0 error(s) — 19 assertions in 9 files
endpoint coverage: 2/2 (100%) Parallel isolated connections, throwaway test databases, per-test clones, tags, JUnit XML, and endpoint coverage with a CI threshold gate. And with --watch, the running server restarts on SQL file, configuration, and database routine changes — create or replace a function in psql and the endpoint is live seconds later, TypeScript client regenerated.