Fast & native
AOT executables. 4,500+ req/s on a single host in independent 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.
.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 since v3.17.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.