Release notes

Every change.
Documented.

Real release notes — not autogenerated commit log dumps. Every notable change, fix, and feature explained in context.

v1.0.0-beta

2026-05-11 Latest Beta
First public release. Ledger is now available for general use. Previously developed privately as DBForge between December 2025 and May 2026, now rebranded and validated outside of internal use. Expect rough edges on PHP versions, MariaDB forks, and hosting environments other than the development setup. Please file issues for anything that breaks.

Rebrand

  • DBForge → Ledger. 428 references swept across the codebase in three case forms. New logo (brackets framing three horizontal bars). JS globals DBForge.* are now Ledger.*. Install path moves to the repo root. Cookies and localStorage keys formerly prefixed dbforge_ are now ledger_. Existing users log in once and re-pick their theme.

New features

  • Multi-statement execution in the SQL editor. Paste a full migration with multiple CREATE TABLE, INSERT, ALTER statements separated by semicolons. Each runs in sequence with its own result card showing row counts, errors, and timing. Execution stops on the first failure — use START TRANSACTION / COMMIT for atomicity.
  • DELIMITER directive support. The splitter handles DELIMITER // blocks correctly, so stored procedure definitions with BEGIN ... END// bodies parse cleanly.
  • USE works in the SQL editor. Paste USE mydb; CREATE TABLE foo (...); INSERT INTO foo ... and it executes correctly. Previously the second and third statements ran against the wrong database because each statement reconnected and lost the USE context.
  • Bootstrapping scripts work. Paste CREATE DATABASE new; USE new; CREATE TABLE t (...); and it runs end-to-end. Previously the initial connection to new failed because the database didn't exist yet.
  • Index management overhaul. Composite indexes display on a single row with kind badges (PRIMARY/UNIQUE/INDEX/FULLTEXT/SPATIAL). Add Index form with click-to-select column picker and numbered order badges. Per-index Drop button with confirmation.
  • phpMyAdmin-compatible export style. New style selector below the mode radio. The phpMyAdmin format produces a 4-pass output (tables → data → indexes → constraints) that imports cleanly on servers where FOREIGN_KEY_CHECKS can't be disabled.
  • ER diagram Reset button. Red button with confirmation deletes the saved layout for the current database and rebuilds from auto-layout against the live schema. Useful when tables have been added or removed since the layout was saved.

Fixed

  • Multi-statement read-only enforcement. isWriteQuery() previously only checked the first keyword in the input, so a read-only user pasting USE foo; DROP TABLE bar; would have the DROP slip through. Every statement in the batch is now checked.
  • Stale ER diagram schema. AJAX responses were being cached indefinitely because no cache-control headers were sent. Schema changes (adding/removing tables) didn't reflect in the diagram without a hard refresh. Added Cache-Control: no-store, Pragma: no-cache, and Expires: 0 globally to all 70+ AJAX endpoints.

Internal

  • New Database::executeQueries() routes single statements through the existing fast path (backward-compatible) and multi-statement input through a per-statement loop with aggregated results. Connects once and reuses one PDO across all statements in the batch, preserving session state.
  • New public Database::splitSqlStatements() handles backtick-quoted identifiers, doubled-quote string escapes ('it''s'), hash comments (#), DELIMITER directives, and pure-comment lines. The old private splitter is removed; the executeSqlDump importer uses the new one transparently.
  • When input contains CREATE DATABASE, DROP DATABASE, or USE, the batch connects without a target database to avoid "unknown database" errors at connect time. If the original URL had a database set, a USE is issued after connect to restore intended context.
  • USE, CREATE/DROP DATABASE, CREATE/DROP SCHEMA, and SET now route through PDO::exec() instead of prepare() + execute(). PHP-PDO mishandles prepared USE on some MySQL versions.
  • Added WITH (CTE) to the SELECT detector so CTEs are recognized as resultset queries.

Project infrastructure

  • SECURITY.md — vulnerability disclosure policy with supported versions table, in-scope / out-of-scope rules, and responsible-disclosure expectations.
  • CONTRIBUTING.md — bug-report expectations, what won't be merged (no Composer, no npm, no build step), code style by language.
  • CODE_OF_CONDUCT.md — Contributor Covenant 2.1, rewritten in plain language with a maintainer-accountability paragraph.
  • Issue and PR templates under .github/ — structured bug-report and feature-request forms, PR checklist that catches no-dependencies and no-build-step rules, config that disables blank issues and routes security reports to the private advisory channel.
  • .github/FUNDING.yml scaffold for optional sponsor links (commented out — uncomment to activate).
  • Repository structure flattened. Git repo root and install root are now the same directory. Previously a wrapper ledger/ subfolder forced users to dig in after extracting a release zip.

Development history

Dec 2025 – May 2026
Development before the public 1.0.0-beta release is preserved in the git commit log and tag list. The project was originally developed under the name DBForge between December 2025 and May 2026 before being rebranded to Ledger for public release. Earlier internal alpha versions (1.x-alpha series) are not documented in the public changelog. See commit history if you want the full archaeological record.