basalt
A type-safe, migration-first ORM for Dart: a compile-time-checked query builder, code-generated row mappers, and pluggable SQL backends.
0.1.0
4akloon/basalt_dart
What this package is like to depend on
Last release 1 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
1 months old
4 releases · first in 2026
4 releases in the last 12 months
see the full history below
Release timeline
4 releases · Jul 2026 to Jul 2026Releases
latest 4-
0.1.022 Jul 2026Release notes
Open source →Schema model redesign: table markers are real objects, columns are typed to their table.
- Breaking: a table marker is now a
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. - Breaking:
TableRefis abstract and stores onlytableName; the marker overridescolumnsas a getter (lazy evaluation is what keepstable⇄ columns free of const-initializer cycles, FKs included). - Breaking:
QuerySource.tablerenamed totableName, andTableRef.namemerged into it — a static column named like an inherited instance member would not compile, sotable/namehad to leave the instance surface.TableColumn.table(the effective SQL qualifier string) is unchanged and now derived asowner.alias ?? owner.tableName. TableColumngainedowner(QuerySource<Tbl>);TableAliasrebinds columns by passing itself as the owner.- Serialization, scope validation, and
RowReaderkeys are byte-for-byte unchanged — only the schema declaration surface moved.
- Breaking: a table marker is now a
-
0.0.320 Jul 2026Release notes
Open source →- 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):
- Split lib/src/devtools/ into protocol/ · dto/ · host/ · client/.
- Add BasaltExtension (method-name enum, single source of truth), an
InspectorTransport seam, and a transport-agnostic InspectorClient exposed via
a new package:basalt/devtools_client.dart entrypoint. - Harden DTO fromJson (json_read) so wire-decoded JSON parses; add
RegisteredInstance.fromJson; restore SqlResultDto.truncated. - Drop backend knowledge from the inspector: RegisteredInstance loses
backend,
and InspectorService takes placeholders/quoting/encoding from
Connection.dialect (also fixes DateTime encoding on the raw path). - Decompose InspectorService into small SRP collaborators (SchemaReader,
TableReader, RowUpdater, SqlRunner, WhereClause, ParamBinder, SchemaLookup).
basalt_mcp:
- Depends on basalt; supplies a VmServiceTransport (package:vm_service) to the
shared InspectorClient, with IsolateFinder for app discovery. - One BasaltTool class per MCP tool + a ToolRegistrar with a uniform error guard
(replaces the 220-line inline cascade); split runner/exceptions/logging. - Tests over a fake InspectorTransport; connect docs + tool descriptions cover
Dart MCP DTD discovery of the VM service URI.
basalt_devtools_extension:
- Delete the duplicate lib/src/models/*; consume the shared InspectorClient via
a ServiceManagerTransport and core DTOs.
Also add basalt_mcp to the workspace, CI matrix, publish tags, and README.
Co-Authored-By: Claude Opus 4.8 (1M context) [email protected]
- fix(basalt_mcp): set process exit code instead of returning it from main
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) [email protected]
- chore(release): basalt 0.0.3; bump devtools extension build (internal)
- basalt 0.0.2 -> 0.0.3: shared DevTools inspector client
(package:basalt/devtools_client.dart), BasaltExtension, hardened DTO fromJson,
and the dev-only breaking removal of RegisteredInstance.backend (see CHANGELOG). - basalt_devtools_extension: config.yaml version 0.0.1 -> 0.0.2 and pubspec
build 1.0.0+1 -> 1.0.0+2. Internal only — the extension is publish_to: none
and has no release tag, so nothing republishes; the bump just marks the new
build that consumes the shared client.
Co-Authored-By: Claude Opus 4.8 (1M context) [email protected]
Co-authored-by: Claude Opus 4.8 (1M context) [email protected]
Release notes
Open source →Shared DevTools inspector client — one host + client + DTO layer behind the
ext.basalt.*protocol, so the DevTools extension and thebasalt_mcpserver stop re-implementing it.- New
package:basalt/devtools_client.dartentrypoint (kept separate from the hostpackage:basalt/devtools.dart): a transport-agnosticInspectorClientplus anInspectorTransportseam and the shared DTOs. Consumers implement only the transport (VM service, DevToolsserviceManager, ...). BasaltExtension— enum of theext.basalt.*method names, the single source of truth for host registration and every client (exported from both entrypoints).- DTO
fromJsonfactories now parse realjsonDecodeoutput (previously the blindas List<...>casts threw);SqlResultDto.fromJsonrestorestruncated;RegisteredInstance.fromJsonadded. - Breaking (dev-only):
RegisteredInstance.backendremoved — the inspector no longer infers a backend name.InspectorServicenow takes placeholders, identifier quoting, and value encoding fromConnection.dialect(this also fixesDateTimeencoding on the raw-SQL path).lib/src/devtools/was reorganized intoprotocol/·dto/·host/·client/(internal), andInspectorServicewas split into focused collaborators.
-
0.0.216 Jul 2026Release notes
Open source →Single-statement batch writes.
updateAll(table).keyedBy(col).values([...])— a newUpdateAllStatementthat updates many rows with per-row values in one statement (WITH ... AS (VALUES ...) UPDATE ... FROM), with composite keys (repeatedkeyedBy), an optional extra.where(...), andRETURNINGsupport (columns are table-qualified there to stay unambiguous next to theVALUEStable).SqlDialect.castType(SqlType)— new dialect seam naming the native type toCASTa bound parameter to where SQL gives the server no inference context (theVALUEStable ofupdateAll); dialects that don't need casts returnnull.ColumnValuenow carries the column'sSqlType(set byTableColumn.set) so serialization can emit those casts.- A zero-row
INSERT(no.value(...)/.values(...)) now throwsStateErrorat build time instead of emitting invalid SQL. @Insertabledoc updated for the new generated batch extension (seebasalt_codegen0.0.2).
-
0.0.112 Jul 2026Release notes
Open source →Initial development release of the basalt_dart core.
- Type system:
SqlType<T>codecs (IntSqlType/StringSqlType/DoubleSqlType/BooleanSqlType/BlobSqlType/DateTimeSqlType) with a singleNullableSqlType(...)wrapper for nullable columns. - Schema: sealed
TableColumn<T, Tbl>(ValueColumn/PrimaryKey/Ref),TableRef,QuerySource,TableAliasfor self-joins. - Expressions with phantom table scope;
eq/ne/gt/ge/lt/le/isIn/between/isNull/like/eqColumn, operator sugar, and&/|combinators. - Query builder:
from().where().orderBy().limit().offset().select().innerJoin()/leftJoin().map()→MappedQuery;RowReader(read by column name) and reusableRowMapper. - Writes:
insertInto/update/deleteFromwithTableColumn.set. - Serializer (
QueryBuilder+SqlDialect) with two-tier join scope validation. - Async-first
Connectioninterface with transactions (nested → SAVEPOINT) andintrospect(). - Annotations for codegen:
@Queryable,@Insertable,@AsChangeset,@Column(readOnly/writeOnly),@Relation.
- Type system: