Apps are data
Pages, regions, items, validations and processes are rows in a meta schema. Export them, diff them in git, import them in one transaction.
Open source · PostgreSQL · Apache-2.0
pgkiln is a low-code application builder for PostgreSQL, modeled on Oracle APEX. Generate reports, forms, dashboards and maps from your tables, keep your rules in PL/pgSQL, and ship secure web apps your team can run.
# with Docker: PostgreSQL 17 + pgkiln
cd deploy && cp .env.example .env # fill in four secrets
docker compose up -d # → http://127.0.0.1:3100/builder
The parts you would otherwise build by hand, ready on day one and driven by SQL.
Pages, regions, items, validations and processes are rows in a meta schema. Export them, diff them in git, import them in one transaction.
Point a wizard at a table and get a report and form, a grid, cards, a calendar, a chart, a map or a faceted search, with defaults from the catalog.
A least-privilege runtime role, a database role per app, row level security, checksummed URLs, CSRF protection and a strict CSP.
Business rules live in PL/pgSQL. Raise an exception and the message appears on the right form field.
Built-in accounts with roles, OpenID Connect, SAML 2.0, LDAP, HTTP headers or database accounts, and authorization schemes.
Responsive pages, installable as a Progressive Web App, with offline pages and forms sent when the network is back.
REST modules and OAuth clients for your API, PostgREST alongside, and regions and lists of values on other web services.
Template components and plug-ins with their own JavaScript, CSS and PL/pgSQL, packed in one file.
AI assistants in your apps with Claude or OpenAI, and an MCP server so coding agents can read and change your apps.
The HR example application that ships with pgkiln, and the builder.

Install pgkiln next to your schemas (or in its own database). It adds one schema, meta, and a few roles; nothing else changes.
Create an application from existing tables, a spreadsheet or pasted data. You get reports, forms, navigation and a dashboard.
Refine pages in the designer, write queries and PL/pgSQL, add security, translations and documents. Deploy with one command.
A region is a query. A validation is a PL/pgSQL function. Bind variables work the way APEX developers expect, and an exception lands on the form field it is about.
:P3_DEPTNO bind variables, meta.v() inside functionsmeta.app_user() and meta.has_role()-- a report region's source
select e.empno, e.ename, e.job, d.dname
from sales.emp e join sales.dept d using (deptno)
where :P2_DEPTNO is null or e.deptno = :P2_DEPTNO;
-- a rule the Save button runs
create function sales.check_discount(p numeric)
returns void language plpgsql as $$
begin
if p > 0.2 and not meta.has_role('manager') then
raise exception 'Discounts over 20% need a manager'
using column = 'discount';
end if;
end $$;For your git workflow
Export an app as one file per component, review the diff in a pull request, and deploy with pgkiln import --replace: one transaction, users and saved reports kept.
For AI coding agents
Claude Code, Cursor and other agents can list your apps, explain a page, look at the tables behind it, and change the app through files with a diff before anything is imported. Queries are read-only.
AI coding agents →Coming from Oracle APEX?
Pages, regions, items, dynamic actions, shared components, authorization schemes, the page designer and the SQL Workshop all work the way you expect. The guide maps every concept and shows how to port PL/SQL.

One plan, and it is the whole thing.
Community
Free forever, self-hosted
Yes. pgkiln is open source under the Apache-2.0 license. You host it yourself; there are no paid tiers or usage limits.
pgkiln follows APEX’s model (apps as metadata, pages with regions and items, page processing in SQL) on PostgreSQL. The parity matrix compares 137 APEX features: most are available, and what is partial or missing is listed honestly.
PostgreSQL 15 or newer and Node.js 20 or newer, or just Docker: the compose file starts PostgreSQL 17 and pgkiln together. There is no separate web listener like ORDS.
Yes. The command line exports an application as one readable file per component (JSON or YAML with the SQL inline), shows a diff against the database and updates an application in place.
Your data stays in your own PostgreSQL tables with your own constraints and policies. pgkiln only adds its meta schema, and an application is a JSON document you can read.
Install with Docker, open the builder and create an application from a table.