NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
A type-safe, migration-first ORM for Dart: a compile-time-checked query builder, code-generated row mappers, and pluggable SQL backends.
Last release 2 months ago
22 Jul 2026
Too new to tell
only 2 release windows
Nearly every release is documented
notes for 4 of 4 stable releases
Nothing withdrawn
no release was ever pulled
2 months old
4 releases · first in 2026
One column per month.
Schema model redesign: table markers are real objects, columns are typed to their table.
Schema model redesign: table markers are real objects, columns are typed to their table.
final class X extends TableRef<X>
with a private const constructor; static const table = X._() is the
singleton instance. Columns take that object as their first argument
(PrimaryKey<int, Users>(table, 'id', IntSqlType())) instead of repeating
the table-name string — handing a column another table's ref is a compile
error.TableRef is abstract and stores only tableName; the marker
overrides columns as a getter (lazy evaluation is what keeps
table ⇄ columns free of const-initializer cycles, FKs included).QuerySource.table renamed to tableName, and TableRef.name
merged into it — a static column named like an inherited instance member
would not compile, so table/name had to leave the instance surface.
TableColumn.table (the effective SQL qualifier string) is unchanged and now
derived as owner.alias ?? owner.tableName.TableColumn gained owner (QuerySource<Tbl>); TableAlias rebinds
columns by passing itself as the owner.RowReader keys are byte-for-byte
unchanged — only the schema declaration surface moved.feat: basalt_mcp server on a shared devtools inspector client
Add the basalt_mcp package (an MCP server for live DB inspection in a running
debug app) and refactor the DevTools inspector so both the MCP server and the
DevTools extension consume one shared client + DTO layer instead of each
re-implementing the ext.basalt.* wire protocol.
Core (basalt):
backend,basalt_mcp:
basalt_devtools_extension:
Also add basalt_mcp to the workspace, CI matrix, publish tags, and README.
Co-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com
Dart ignores the value returned from main, so returning 1 on arg-parse or
startup failure left the process exit code at 0 — a supervisor or CI checking
the code saw success. Assign exitCode (as tool/smoke.dart already does).
Co-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com
Co-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com
Co-authored-by: Claude Opus 4.8 (1M context) noreply@anthropic.com
Shared DevTools inspector client — one host + client + DTO layer behind the
ext.basalt.* protocol, so the DevTools extension and the basalt_mcp server
stop re-implementing it.
package:basalt/devtools_client.dart entrypoint (kept separate from the
host package:basalt/devtools.dart): a transport-agnostic InspectorClient
plus an InspectorTransport seam and the shared DTOs. Consumers implement
only the transport (VM service, DevTools serviceManager, ...).BasaltExtension — enum of the ext.basalt.* method names, the single source
of truth for host registration and every client (exported from both
entrypoints).fromJson factories now parse real jsonDecode output (previously the
blind as List<...> casts threw); SqlResultDto.fromJson restores
truncated; RegisteredInstance.fromJson added.RegisteredInstance.backend removed — the inspector
no longer infers a backend name. InspectorService now takes placeholders,
identifier quoting, and value encoding from Connection.dialect (this also
fixes DateTime encoding on the raw-SQL path). lib/src/devtools/ was
reorganized into protocol/ · dto/ · host/ · client/ (internal), and
InspectorService was split into focused collaborators.basalt 0.0.2 — single-statement batch writes
basalt 0.0.2 — single-statement batch writes
Single-statement batch writes.
updateAll(table).keyedBy(col).values([...]) — a new UpdateAllStatement that updates many
rows with per-row values in one statement (WITH ... AS (VALUES ...) UPDATE ... FROM), with
composite keys (repeated keyedBy), an optional extra .where(...), and RETURNING support
(columns are table-qualified there to stay unambiguous next to the VALUES table).SqlDialect.castType(SqlType) — new dialect seam naming the native type to CAST a bound
parameter to where SQL gives the server no inference context (the VALUES table of
updateAll); dialects that don't need casts return null.ColumnValue now carries the column's SqlType (set by TableColumn.set) so serialization
can emit those casts.INSERT (no .value(...)/.values(...)) now throws StateError at build time
instead of emitting invalid SQL.@Insertable doc updated for the new generated batch extension (see basalt_codegen 0.0.2).basalt 0.0.1 — initial development release
basalt 0.0.1 — initial development release
Initial development release of the basalt_dart core.
SqlType<T> codecs (IntSqlType/StringSqlType/DoubleSqlType/BooleanSqlType/
BlobSqlType/DateTimeSqlType) with a single NullableSqlType(...) wrapper for nullable columns.TableColumn<T, Tbl> (ValueColumn / PrimaryKey / Ref), TableRef, QuerySource,
TableAlias for self-joins.eq/ne/gt/ge/lt/le/isIn/between/isNull/like/
eqColumn, operator sugar, and &/| combinators.from().where().orderBy().limit().offset().select().innerJoin()/leftJoin().map() →
MappedQuery; RowReader (read by column name) and reusable RowMapper.insertInto / update / deleteFrom with TableColumn.set.QueryBuilder + SqlDialect) with two-tier join scope validation.Connection interface with transactions (nested → SAVEPOINT) and introspect().@Queryable, @Insertable, @AsChangeset, @Column (readOnly/writeOnly),
@Relation.Your coding agent can read these notes before it upgrades. Set up the MCP server →