SQLPage
Relational DatabasesSQL-only dynamic website builder.
Features
- Generates web UIs from simple SQL queries
- Supports multiple database backends (SQLite, PostgreSQL, MySQL, MSSQL, ODBC)
- Provides components for lists, charts, forms, and custom cards
Recent releases
View all 13 releases →- Added submit and reset form button icons (validate_icon, reset_icon, reset_color)
- Improved error messages for incorrect SQLPage function usage with precise file reference and line number
- Updated SQL parser to version 0.61.0
Full changelog
SQLPage v0.43.0 (2026-03-08)
[!NOTE]
SQLPage transforms your SQL queries into web user interfaces. It lets you create web applications quickly, entirely in SQL.
Download for Windows, MacOS, or Linux, or try online!
- OIDC protected and public paths now respect the site prefix when it is defined.
- Fix: OIDC provider metadata refreshes now always happen in the background, and with a timeout. Previously, a slow OIDC provider could prevent SQLPage from handling requests for an arbitrary amount of time.
- Fix: forms without submit or reset buttons no longer keep extra bottom spacing.
- add submit and reset form button icons: validate_icon, reset_icon, reset_color
- improve error messages when sqlpage functions are used incorrectly. Include precise file reference and line number
- updated sql parser: https://github.com/apache/datafusion-sqlparser-rs/blob/main/changelog/0.61.0.md
- Add margin bottom in the big number component
- In forms without a submit button (such as auto_submit forms), remove awkward padding at the end of the form
- Better support for alternative databases: DuckDB‑specific syntax, Oracle‑specific syntax, and SQL file parsing
- New Docker image variant `lovasoa/sqlpage:*-duckdb` with preconfigured DuckDB ODBC drivers for easy CSV/XLSX/JSON/Parquet usage
- Added functions `sqlpage.web_root()` and `sqlpage.configuration_directory()` to reliably reference web root and config directories
Full changelog
SQLPage v0.42.0 (2025-12-28)
[!NOTE]
SQLPage transforms your SQL queries into web user interfaces. It lets you create web applications quickly, entirely in SQL.
Download for Windows, MacOS, or Linux, or try online!
New features
- Better support for alternative databases
- New docker image variant:
lovasoa/sqlpage:latest-duckdb,lovasoa/sqlpage:main-duckdb,lovasoa/sqlpage:v0.42.0-duckdbwith preconfigured duckdb odbc drivers. Just run the image and you have a sqlpage connected to a duckdb running. This makes it much easier to use SQLPage on existing local or remote CSV, XLSX, JSON, or Parquet files without any data conversion step. - New config option:
cache_stale_duration_msto control the duration for which cached sql files are considered fresh.
New Functions
sqlpage.web_root()returns the web root directory where SQLPage serves.sqlfiles from. This is more reliable thansqlpage.current_working_directory()when you need to reference the location of your SQL files, because it takes into account the--web-rootcommand line argument and theWEB_ROOTenvironment variable.sqlpage.configuration_directory()returns the configuration directory where SQLPage looks forsqlpage.json, templates, and migrations.
Bug fixes
- Fixed oracle-specifc bugs. The entire sqlpage test suite now runs against an oracle database after each change, guaranteeing no regression.
- The default welcome page (
index.sql) now correctly displays the web root and configuration directory paths instead of showing the current working directory. sqlpage.variables()returned json objects with duplicate keys when post, get and set variables of the same name were present. It now always returns valid json objects without duplicate keys. The semantics of the returned values remains the same (precedence: set > post > get).- better oidc support. Single-sign-on now works with sites:
- using a non-default
site_prefix - hosted behind an ssl-terminating reverse proxy
- using a non-default
- Fixed a bug where sqlpage would sometimes redirect to the wrong url after logout, causing logout failures when using
sqlpage.oidc_logout_url()
- Fixed compatibility with Auth0 for OpenID‑Connect authentication
- New function `sqlpage.oidc_logout_url(redirect_uri)` for RP‑Initiated OIDC logout
- Updated ApexCharts to version 5.3.6, re‑added `lime` color option and switched default palette to Open Colors
Full changelog
SQLPage v0.41.0 (2025-12-28)
[!NOTE]
SQLPage transforms your SQL queries into web user interfaces. It lets you create web applications quickly, entirely in SQL.
Download for Windows, MacOS, or Linux, or try online!
- New Function:
sqlpage.oidc_logout_url(redirect_uri)generates a secure logout URL for OIDC-authenticated users with support for RP-Initiated Logout - Fix compatibility with Auth0 for OpenID-Connect authentification. See https://github.com/ramosbugs/openidconnect-rs/issues/23
- updated sql parser: https://github.com/apache/datafusion-sqlparser-rs/blob/main/changelog/0.60.0.md
- updated apexcharts to 5.3.6:
- https://github.com/apexcharts/apexcharts.js/compare/v5.3.0...v5.3.6
- https://github.com/apexcharts/apexcharts.js/releases/tag/v5.3.6
- re-add the
limecolor option to charts - update default chart color palette; use Open Colors
- re-enable text drop shadow in chart data labels
Merry Christmas and a happy new year!
- Replace `$x` with `:x` in templates/queries to access form field values after upgrade.
- If a SET variable shadows an existing URL parameter, retrieve the original URL parameter using `sqlpage.variables('get')->>'name'`.
- Deprecation warning: Using `$var` when both URL and POST parameters exist with the same name will emit a warning; explicitly choose between `$var` (URL) or `:var` (POST).
- $variable no longer accesses POST parameters; use :variable instead.
- SET $name no longer overwrites URL parameters with the same name; SET variables now shadow URL/POST parameters.
- SQLPage respects HTTP Accept headers for JSON and NDJSON responses via curl requests.
- New function `sqlpage.set_variable(name, value)` returns a URL with the specified variable set while preserving others.
- Variable system improvements: immutable URL and POST parameters; mutable user-defined SET variables.
Full changelog
performance improvements, bug fixes, backwards incompatible variable
handling changes
- OIDC login redirects now use HTTP 303 responses so POST submissions are converted to safe GET requests before reaching the identity provider, fixing incorrect reuse of the original POST (HTTP 307) that could break standard auth flows.
- SQLPage now respects HTTP accept headers for JSON. You can now easily process the contents of any existing sql page programmatically with:
curl -H "Accept: application/json" http://example.com/page.sql: returns a json arraycurl -H "Accept: application/x-ndjson" http://example.com/page.sql: returns one json object per line.
- Fixed a bug in
sqlpage.link: a link with no path (link to the current page) and no url parameter now works as expected. It used to keep the existing url parameters instead of removing them.sqlpage.link('', '{}')now returns'?'instead of the empty string. sqlpage.fetch(null)andsqlpage.fetch_with_meta(null)now returnnullinstead of throwing an error.- New Function:
sqlpage.set_variable(name, value)- Returns a URL with the specified variable set to the given value, preserving other existing variables.
- This is a shorthand for
sqlpage.link(sqlpage.path(), json_patch(sqlpage.variables('get'), json_object(name, value))).
- Variable System Improvements: URL and POST parameters are now immutable, preventing accidental modification. User-defined variables created with
SETremain mutable.- BREAKING:
$variableno longer accesses POST parameters. Use:variableinstead.- What changed: Previously,
$xwould return a POST parameter value if no GET parameter namedxexisted. - Fix: Replace
$xwith:xwhen you need to access form field values. - Example: Change
SELECT $usernametoSELECT :usernamewhen reading form submissions.
- What changed: Previously,
- BREAKING:
SET $nameno longer makes GET (URL) parameters inaccessible when a URL parameter with the same name exists.- What changed:
SET $name = 'value'would previously overwrite the URL parameter$name. Now it creates an independent SET variable that shadows the URL parameter. - Fix: This is generally the desired behavior. If you need to access the original URL parameter after setting a variable with the same name, extract it from the JSON returned by
sqlpage.variables('get'). - Example: If your URL is
page.sql?name=john, and you doSET $name = 'modified', then:$namewill be'modified'(the SET variable)- The original URL parameter is still preserved and accessible:
sqlpage.variables('get')->>'name'returns'john'
- What changed:
- New behavior: Variable lookup now follows this precedence:
$variablechecks SET variables first, then URL parameters- SET variables always shadow URL/POST parameters with the same name
- New sqlpage.variables() filters:
sqlpage.variables('get')returns only URL parameters as JSONsqlpage.variables('post')returns only POST parameters as JSONsqlpage.variables('set')returns only user-defined SET variables as JSONsqlpage.variables()returns all variables merged together, with SET variables taking precedence
- Deprecation warnings: Using
$varwhen both a URL parameter and POST parameter exist with the same name now shows a warning. In a future version, you'll need to explicitly choose between$var(URL) and:var(POST).
- BREAKING:
- Improved performance of
sqlpage.run_sql.- On a simple test that just runs 4 run_sql calls, the new version is about 2.7x faster (15,708 req/s vs 5,782 req/s) with lower latency (0.637 ms vs 1.730 ms per request).
- add support for postgres range types
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.