NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
Generates immutable models from Ack schemas and validated schemas from Dart classes
Last release today
07 Oct 2026
Release timing varies
gaps range from 8 days to 3 months
Nearly every release is documented
notes for 10 of 10 stable releases
Nothing withdrawn
no release was ever pulled
1 years old
27 releases · first in 2025
One column per month.
Imported pattern expressions now use ECMA-262 Unicode mode. This is a deliberately accepted breaking change in 1.7.0, affecting users upgrading from s…
contains and if/then/else.keyword, documentUri, and pointer through JsonSchemaValidationError. Source pointers correctly encode URI fragments containing percent signs, spaces, #, and Unicode.Imported pattern expressions now use ECMA-262 Unicode mode. This is a deliberately accepted breaking change in 1.7.0, affecting users upgrading from stable 1.6.2 or earlier 1.7.0 betas.
. matches one code point: ^.$ accepts 😀, while ^..$ no longer matches its two UTF-16 code units. Review identity escapes too; replace ^\d{3}\-\d{4}$ with ^\d{3}-\d{4}$ outside character classes. Invalid Unicode-mode patterns fail import with an invalid_schema diagnostic.
Native Ack.string().matches() retains its Dart regex behavior. A native pattern can behave differently or fail import after export to JSON Schema.
Existing SchemaValidationError catches still work. Consumers requiring an exact runtime type or serialized error-map shape should allow the new subtype and its three additional fields. Initial null-input and JSON-value checks retain their existing Ack error types.
The beta.3 annotation and generator migrations still apply to users upgrading from older versions.
Full workspace tests, minimum Dart/Flutter checks, API comparison against 1.6.2, deterministic generation, Draft-7 validation, documentation validation, and zero-warning publish dry runs passed. The local aggregate passed 2,161 tests, including 394 generator tests; four opt-in Firebase live tests were skipped without credentials.
All five packages are aligned at 1.7.0-beta.4 : ack , ack_generator , ack_json_schema_builder , ack_mcp_dart , and ack_firebase_ai .
All five packages are aligned at 1.7.0-beta.4: ack, ack_generator, ack_json_schema_builder, ack_mcp_dart, and ack_firebase_ai.
Ack.fromJsonSchema() now validates the supported date-time format automatically. Unsupported format labels continue to produce diagnostics.Ack.string().datetime() now accepts lowercase t and z on announced leap seconds.ack 1.7.0-beta.4 or later, without a new API or dependency minimum.final timestamp = Ack.fromJsonSchema({
'type': 'string',
'format': 'date-time',
});
timestamp.parse('2024-02-29T12:34:56.123456789+02:00');Ack's strict JSON Schema importer supports a documented subset; this release does not claim full JSON Schema Draft 2020-12 support.
No new generator or annotation migration is introduced in beta.4. When upgrading from beta.2 or earlier, the beta.3 breaking migrations still apply: annotations moved into ack, @Schemable() is the unified entry point, and JsonKey is no longer re-exported. See the repository changelog for the full migration details.
The reviewed release commit passed CI, browser tests, release preflight, schema validation, API compatibility checks, and zero-warning publish dry runs for all five packages.
Release commit: 0023d152288fb69b2967d230481fe8b681606d8b.
ack dependency remains
at the first beta that supplies the required annotations.Files that use constraint annotations or the deprecated spellings also import package:ack/annotations.dart , with a prefix ( as ack ) where a name cla…
ack_annotations package; the annotations ship in ack. Modelspackage:ack/ack.dart (@Schemable, @AckField, @Optional,@Required, @NotNull). Files that use constraint annotations or thepackage:ack/annotations.dart, with aas ack) where a name clashes with another type. Formatpackage:ack/format_annotations.dart.@Schemable() is the single annotation for schema-first and class-first@AckInfer() and @AckModel() are deprecated and will be@Pattern to @Matches. The deprecated Pattern alias stays inpackage:ack/annotations.dart; an unprefixed import of that library hidesdart:core's Pattern.ack no longer depends on json_annotation or re-exports JsonKey. A field@JsonKey(name: ...) imports JsonKey frompackage:json_annotation and the app depends on json_annotation.AckModel.jsonSerializable and AckGeneratedJson.config are removed.schema resolves to it withschema<A>() method that can receive each type argument's schema.@AckField(schema:) functions, non-finite constraint values, @SchemableJsonConverter annotations on class-firstack 1.7.0-beta.3.ack 1.7.0-beta.3, which owns the annotations.package:ack; the ack_annotations package is
removed. Import package:ack/ack.dart in annotated libraries, and
package:ack/annotations.dart where they use constraint annotations.@Schemable.generatedJson instead of
@AckInfer.jsonSerializable. Regenerate after upgrading.json_serializable configuration itself, from
caseStyle; ack carries no json_annotation types. @JsonKey(name: ...)
keeps working with JsonKey imported from package:json_annotation.JsonConverter annotation on a class-first model or field is rejected,
because json_serializable would apply it in place of Ack's validated
runtime bridge.@Schemable() drives both schema-first and class-first generation. The
deprecated @AckInfer() and @AckModel() spellings generate identical
output, and diagnostics name the annotation that was written.schema resolves to it with no
annotation, also per List / Set item and as a Map value. Extension
types are supported, and a generic type declares a static
schema<A>() method that is called with the field's type arguments
(Command.schema<CompletionAction>()). Schema-first objects may reference
the same members; void type arguments are supported only in class-first
fields. A @Schemable class may expose its facade as
static final schema = XSchema.schema;. The schema must produce the field's
type.schema<A>() that declares one positional AckSchema<Object, A>
parameter per type parameter A receives the schema inferred for each type
argument (Box.schema<Row>(RowSchema.schema)). Type arguments may be void
(Command.schema<void>()). An enum's static schema takes precedence over
Ack.enumValues.@Schemable options set for the other target (name on a class, class
options on a top-level schema) are rejected instead of ignored.@AckField(schema:) functions must produce the field's type; generic
functions, whose type arguments the generated call would drop, are rejected.Set<Set<T>> field apply to the outer set.Map
value.copyWith on @AckInfer() and @AckModel() models is a getter that returns a typed $ClassCopyWith interface. A wrongly typed argument is now a compile-ti
copyWith on @AckInfer() and @AckModel() models is a getter that returns
a typed $ClassCopyWith<Class> interface. A wrongly typed argument is now a
compile-time error instead of a runtime TypeError. Omission still keeps the
current value, and explicit null still clears a nullable field. Calls such
as model.copyWith(name: 'x') are unchanged. Code that tears off copyWith
as a function or mocks a model's copyWith method must be updated to use the
getter. Arguments statically typed Object or an incompatible type must be
narrowed or cast; dynamic arguments still compile.copyWith interface
compatible with the parent model's interface.Set field with @MinItems, @MaxItems, or @UniqueItems
now requires unique items at the JSON boundary, so the list's item count
matches the decoded set. Input with duplicate items, such as ['a', 'a'],
now fails validation instead of collapsing into a smaller set, and the JSON
Schema declares uniqueItems: true..ack.dart and .ack.g.dart parts start with
// ignore_for_file: type=lint and // coverage:ignore-file, so consumer
lint rules and coverage reports cover only hand-written source.$ack, and class-first
facades now have doc comments.ack and ack_annotations ^1.7.0-beta.2.description: or an @description doc
tag. This replaces the unreleased development behavior that exported every
field doc comment. Untagged prose and // comments never become schema
data. Shared AckSchemaInference.applyDescription uses the same rule.@AckInfer() models declare static final schema as a shorthand for
$ack.modelSchema. The generator omits this member when schema conflicts
with a field, discriminator, annotated declaration, or import prefix.@AckModel and @AckField
descriptions, plus single-line @description doc tags. Explicit annotation
values take precedence. Class descriptions apply to the wire object and
model codec; field descriptions apply only to that property.inference.dart exports shared type and constraint inference for other
generators. The class-first generator uses this library.@Pattern, discriminator, and key values containing a
newline or carriage return now produce valid Dart source.This coordinated release publishes ack , ack_annotations , ack_generator , ack_json_schema_builder , ack_mcp_dart , and ack_firebase_ai at version 1.6
This coordinated release publishes ack, ack_annotations, ack_generator, ack_json_schema_builder, ack_mcp_dart, and ack_firebase_ai at version 1.6.2.
Ack.fromJsonSchema() now compiles the standard pattern keyword, restoring import of schemas exported from Ack. It uses an unanchored ECMA-262 search on strings and rejects invalid regular expressions at import time.Ack.fromJsonSchema() now accepts the standard propertyNames keyword to validate each object key against its subschema. Both keywords round-trip through Draft-7 export unchanged.The other five packages are version aligned and have no source or public API changes from 1.6.1. Compatible sibling dependency minimums remain unchanged.
See the publishing guide and changelogs for details.
Honor effective nullability consistently across unions, defaults, boundaries, codecs, object properties, and list-item validation.
All six ACK packages are aligned at 1.6.1. See the core package changelog for compatibility details and migration guidance.
Align with the coordinated Ack 1.6 release; this package has no runtime or public API changes from 1.5.0.
Infer open JSON class-first fields from their Dart types: Object → Ack.any(), Object? → Ack.any().nullable() (with the same presence annotations as St
Object →
Ack.any(), Object? → Ack.any().nullable() (with the same presence
annotations as String?), List<Object> → Ack.list(Ack.any()), and
Map<String, T> → Ack.map(<schema for T>), including
Map<String, Object?>. Map fields no longer require @AckField, which
still overrides an inferred schema. dynamic, List<Object?>, and
non-String map keys stay rejected; the dynamic error now suggests
Object?.Ack.any() and Ack.map(...) schema-first fields, inferring
Object/Object? and Map<String, T>. Ack.any() and Ack.map() model
roots stay rejected, including when reached through a variable.ack: ^1.5.0, because generated code now uses Ack.map.as Object? cast in generated copyWith bodies for
Object? fields.Ack.map values when the value schema is a variable declared
with .nullable(), such as Ack.map(nullableLabel).--fatal-infos: fieldless class-first
models no longer declare an unused self local, and nullable collection
bridges use null-aware access.Set<T>? fields; the set
codec now uses the non-null set type and presence adds nullability.@AckField(presence: ...) remains during migration and is deprecated for removal in 2.0.0.
Ack 1.4 adds @Optional(), @Required(), and @NotNull() so class-first
models can override JSON key presence independently of whether a present
value may be null. @AckField(presence: ...) remains during migration
and is deprecated for removal in 2.0.0.
null on a nullable Dart field with @NotNull().copyWith from the constructor type so optional non-nullablenull.All six packages use version 1.4.0: ack, ack_annotations, ack_generator,
ack_firebase_ai, ack_json_schema_builder, and ack_mcp_dart.
The runtime, Firebase, JSON Schema, and MCP packages have no runtime or
public API changes from 1.3.0.
@Optional(), @Required(), and @NotNull() class-first field
annotations. Key presence stays separate from JSON null acceptance.copyWith nullability from the constructor parameter type
so optional non-nullable codec fields compile and do not receive null.@AckField(presence: ...) during migration with a deprecation warning;
reject conflicts with @Optional() / @Required().Ack 1.3 adds ack_mcp_dart , a small adapter that uses one ACK input contract for MCP tool discovery and runtime argument parsing with mcp_dart ^2.4.2
Ack 1.3 adds ack_mcp_dart, a small adapter that uses one ACK input contract for
MCP tool discovery and runtime argument parsing with mcp_dart ^2.4.2.
All six packages use version 1.3.0: ack, ack_annotations, ack_generator,
ack_firebase_ai, ack_json_schema_builder, and ack_mcp_dart.
The existing five packages have no runtime or public API changes from 1.2.0,
and compatible dependency minimums remain at ^1.2.0.
Release tooling now uses Melos fixed versions and a shared workspace tag,
compares APIs with 1.2.0, and supports resuming a partially completed publication.
ack_mcp_dart;
this package has no runtime or public API changes from 1.2.0.docs: align contracts and Firebase fixture dependencies by @leoafarias in #126
Full Changelog: v1.1.0...v1.2.0
@AckInfer() schema-first immutable models with parse/JSON/copy/value
APIs, named recursion, unions, codecs, defaults, nullability, additional
properties, immutable collections, and cross-library composition.@AckModel() class-first generation with private backing codecs, public
schema facades, constructor and field inference, unknown-property policies,
sealed unions, generated mixins, and inferred static fromJson aliases..ack.dart and .ack.g.dart builders so modern Ack output
remains separate from legacy and ordinary .g.dart generators.@AckType() generator path for removal in Ack 2.0.0. Use
@AckInfer() for schema-first models or @AckModel() for class-first
models. Existing Ack 1.1 output remains frozen and supported through 1.x.@AckType() analyzer, emitter, tests, and
ack_generator LibraryBuilder. Legacy *Type, Map, .args,
parse, safeParse, naming, getter, union, transform, and additional
property behavior is frozen until Ack 2.Error objects through runtime validation.wireSchema results in their original boundary
representation when nested models, collections, enums, or codecs decode.copyWith arguments from explicit null, so nullable
fields can be cleared in both schema-first and class-first models.copyWith arguments so a
consumer's const Object() cannot be mistaken for omission.AckUnknownPropertyPolicy / unknownProperties / captureField
contracts and delegate captured-map snapshots to
deepUnmodifiableJsonMap instead of emitting duplicate recursive helpers.JsonKey options and parameter placement, cross-library
class-first cycles, direct one-way transforms beneath codecs, and legacy
object fields whose schema expressions cannot be analyzed.@AckField codecs.>=10.0.0 <11.0.0.@AckType() to @AckInfer(),
add .ack.dart and .ack.g.dart, replace *Type/Map access with the
immutable class API, then use fromJson/toJson at the JSON boundary.@AckType() and .g.dart unchanged when migration is not desired.Ack 1.1.0 is a correctness-focused release that aligns runtime validation, generated schemas, and tooling with their documented contracts. It does not
Ack 1.1.0 is a correctness-focused release that aligns runtime validation,
generated schemas, and tooling with their documented contracts. It does not
change the public Dart API surface.
safeParse non-throwing for recoverable callback exceptions whileError values so programming defects remain visible.t and z separators.multipleOf, IPv6, RFC 3339 date-times, range bounds, collectionallOf, and export exactsource_gen diagnostics without undeclared debug-file output.Although the public API is unchanged, invalid or ambiguous inputs that were
previously accepted may now fail earlier:
ArgumentErrors.Ack.list(item).nullable()), not its item.multipleOf.toJsonSchema().AckException from parse() when a recoverable constraint orSee the package changelogs for the complete behavior notes.
Ack.list(x.nullable()) build now fails; put nullability on the list with
Ack.list(x).nullable().)This patch hardens recursive schemas built with Ack.lazy against unbounded recursion.
This patch hardens recursive schemas built with Ack.lazy against unbounded recursion.
Ack.lazy / LazySchema (#122): recursive schemas nowlazy_max_depth: "Maximum recursion depth (N) exceeded.") instead of crashing.Ack.lazy(...) accepts an optional maxDepth (default LazySchema.defaultMaxDepthcopyWith, equality, and serialization.maxDepth check can't be expressed via$ref and is omitted from the exported schema.Behavior note: recursion is now capped at depth 100 by default. Structures that
legitimately nest deeper must pass an explicit highermaxDepth.
The other packages (ack_annotations, ack_generator, ack_json_schema_builder,
ack_firebase_ai) are version-aligned to 1.0.1 with no functional changes.
Ack 1.0.0 is the first stable release of Ack, a schema validation library for Dart and Flutter. Ack helps you validate untrusted data at application b
Ack 1.0.0 is the first stable release of Ack, a schema validation library for Dart and Flutter. Ack helps you validate untrusted data at application boundaries, reuse the same schemas across runtime validation and JSON workflows, and generate typed wrappers when you want stronger ergonomics than map access.
Start with the documentation site or jump straight into the Quickstart Tutorial.
safeParse, SchemaResult, structured paths, and readable validation messages.@AckType() for extension types, typed getters, parse, and safeParse.toJsonSchema() and the reusable schema-model boundary for adapter authors.ack: core runtime validation library.ack_annotations: @AckType() annotation package.ack_generator: build_runner generator for typed schema wrappers.ack_json_schema_builder: adapter for json_schema_builder.ack_firebase_ai: Firebase AI structured-output schema adapter.Ack also publishes an llms.txt index with a compact overview of the packages, core APIs, code generation workflow, and common examples.
This release was validated with the full package test suites, documentation checks, example tests, and pub.dev dry-runs before publishing. All five packages are now available on pub.dev at version 1.0.0.
DoubleSchema and NumberSchema now reject non-finite values ( NaN , Infinity , -Infinity ) during runtime validation by default, aligning numeric schem
ackBreaking
DoubleSchema and NumberSchema now reject non-finite values (NaN, Infinity, -Infinity) during runtime validation by default, aligning numeric schemas with JSON-safe values.AckSchemaModel variants and a canonical AckSchema.toSchemaModel() adapter conversion.Added
Ack.enumCodec<T extends Enum>(List<T> values) returns a CodecSchema<String, T> wrapping EnumSchema<T>.NumberSchemaExtensions adds fluent numeric constraints to Ack.number(): .min, .max, .greaterThan, .lessThan, .positive, .negative, .multipleOf.Changed
Migration
double/num values. If a boundary must accept NaN/infinities, model that value outside the JSON numeric schema path before validation.ack_annotationsBreaking — Removed AckModel, AckField, and decorator annotations. Only @AckType() remains.
ack_generatorBreaking — Removed class-based schema generation. Only top-level @AckType() schema variables and getters are supported.
ack_firebase_aitoFirebaseAiResponseJsonSchema() for Firebase AI's GenerationConfig.responseJsonSchema path, plus committed golden fixtures and native fixture corpora.Schema conversion APIs — use toFirebaseAiResponseJsonSchema() instead.ack_json_schema_builderAckSchemaModel boundary and generic Draft-7 JSON Schema renderer; preserves defaults, const values, extension keywords, transformed metadata, and composition.All five packages are released in lockstep at 1.0.0-beta.12.
ack_generator now supports only
top-level @AckType() schema variables and getters.chore(release): bump to 1.0.0-beta.11
chore(release): bump to 1.0.0-beta.11 (#102)
docs: add ack package README for pub.dev
docs: add ack package README for pub.dev (#98)
chore(release): bump to 1.0.0-beta.9
chore(release): bump to 1.0.0-beta.9 (#88)
ack_json_schema_builder@1.0.0-beta.8
* See release notes for details.
Primitives: Comprehensive fixes for primitives and correctness (#50).
schema.parseAs(...) / schema.safeParseAs(...) calls and stop emitting _$ackParse / _$ackSafeParse helpers.Doc comments: Support doc comments for schema descriptions (#61). Field and class doc comments are now used to populate schema descriptions.
ack, ack_annotations, meta and test dependencies to latest versions (#56).Primitives: Comprehensive fixes for primitive schema generation and correctness.
Ack.list(schemaRef) for typed list getters (#47).REFACTOR: simplify validation workflow by eliminating duplicate nullable handling (#17).
* See release notes for details.
Packages with breaking changes:
Packages with breaking changes:
Packages with other changes:
Packages with dependency updates only:
Packages listed below depend on other packages in this workspace that have had changes. Their versions have been incremented to bump the minimum dependency versions of the packages they depend upon in this project.
ack_example - v0.3.0-beta.2Packages with breaking changes:
0.2.0-beta.1.Packages with breaking changes:
Packages with other changes:
Your coding agent can read these notes before it upgrades. Set up the MCP server →