First app walkthrough
This page goes from an empty install to a working app — a sidebar entry that opens a grid on a table, with an edit dialog. Everything is done from Settings (superuser), nothing is edited by hand.
Four elements, in order — pool → connector → screen → menu — each saved and applied at once.
At a glance
The example uses the default pool and a small tasks table.
Step 1 — The pool
Open Liberty Next → Administer → Pools. The installation created the default pool: on a Docker install it points at the bundled PostgreSQL database, on a Python install without PostgreSQL at a local SQLite file. It is enough for this walkthrough. To work on another database, add a pool with its URL — see Connectors.
Create the example table with any SQL client connected to that database:
CREATE TABLE tasks (
id INTEGER PRIMARY KEY,
title VARCHAR(200) NOT NULL,
status VARCHAR(10) NOT NULL DEFAULT 'open',
due_date DATE
);
INSERT INTO tasks (id, title, status, due_date) VALUES
(1, 'Draft sprint plan', 'open', '2026-06-10'),
(2, 'Review pull request 42', 'done', '2026-06-05'),
(3, 'Customer follow-up', 'open', '2026-06-12');
Step 2 — The connector and its queries
- Liberty Next → Build → Connectors → + Connector: name
tasks, type SQL, pooldefault. Save. - With
tasksselected, choose Tables in the mode bar, then + Add queries → Generate from DB. - In the CRUD wizard, pick the
taskstable, keep every column, tick key onID, and keep the four statements (SELECT, UPDATE, INSERT, DELETE). - Save. The connector now holds
tasks_get,tasks_put,tasks_postandtasks_delete:
SELECT ID, TITLE, STATUS, DUE_DATE FROM tasks
UPDATE tasks SET TITLE = :TITLE, STATUS = :STATUS, DUE_DATE = :DUE_DATE WHERE ID = :ID_ORIGINAL
The columns are read from the database when the query runs; nothing else needs declaring. See Create from a database table.
Step 3 — The screen
- Liberty Next → Build → Screens → + Add scope, pick
tasks: thetaskschip appears. - + Add screen, id
tasks. Click the new card to open the screen editor. - General tab: label
Tasks; check Editable for in-grid editing. - Queries tab: read
tasks_get, updatetasks_put, inserttasks_post, deletetasks_delete. - Dialog tab: drag the columns onto the form.
- Save.
The grid columns come from the read query; their labels and formats from the dictionary when entries exist (its Scan a table button proposes them). The Screen Creation Assistant does steps 2 and 3 in one pass for a table.
Step 4 — The menu entry
- Liberty Next → Build → Menus → + Add scope, pick
tasks: the empty tree of the app appears. - + Item, then in the inspector: label
Tasks, typescreen, targettasks_get(the screen built on it), icontable. - Save.
Since tasks now has a menu, it is an app: it appears in the app picker, and its sidebar shows Tasks. A click opens the grid: a row opens the edit dialog, + Add an empty one. See Build the tree and Make a connector an app.
What you have now
- A pool — the database connection.
- A connector — the four queries on the table.
- A screen — the grid and the dialog on these queries.
- A menu — the entry that opens the screen, which makes the connector an app.
Every save was applied without a restart. The pool and the connector are stored in connectors.toml, the screen in screens.toml, the menu in menus.toml.
What's next
- Project layout — where these files live.
- Dictionary — labels, lists of values and formats.
- Roles & permissions — who may open the new screen.
- CRM tutorial — a complete app with several screens, a dashboard and jobs.