NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #1955 most downloaded on pub.dev
Matrix Dart SDK
Last release 16 days ago
22 Sep 2026
Ships on a steady schedule
a new release about every 2 weeks
Nearly every release is documented
notes for 59 of the last 60 stable releases
2 versions withdrawn
withdrawn after publishing
12 years old
250 releases · first in 2015
fix: (BREAKING CHANGE) prev_content handling (Christian Kußowski)
Nothing published for this version
One column per quarter.
fix: wrong if condition where rooms get removed from list even when includeLeave == true (Christian Kußowski)
This version changes how left rooms are stored in the client and the archive is loaded. When calling loadArchive() it no longer caches the archived ro
This version changes how left rooms are stored in the client and the archive is loaded.
When calling loadArchive() it no longer caches the archived rooms internally and
client.getRoomById() would no longer return such a cached room. It is up to the
app consumer to cache them if needed at all. On the other hand the sdk now allows
to always sync and store left rooms by default easily by just adding them in the
sync filter to the constructor:
Client(
'Client Name',
syncFilter: Filter(room: RoomFilter(includeLeave: true)),
// ...
);build: update to vodozemac 0.8.0 (Christian Kußowski)
chore: log to-device recipients that get silently skipped (td)
fix: ignore missing files during local file cache cleanup (Karthikeyan S)
feat: add clearCryptoIdentity to CryptoSetupExtension (Karthikeyan S)
build: fix workflow flutter version (Christian Kußowski)
fix: do not guess a file extension for video thumbnails with unknown mimetype by @td-famedly in #2419
[10.0.1] 11th August 2026
Full Changelog: v10.0.0...v10.0.1
chore: (BREAKING CHANGE) use dart 3.12 (td)
fix: refresh DM hero avatars in partial rooms (Qays Dwekat)
build: (BREAKING) update to matrix spec 1-19 (Christian Kußowski)
fix: avoid concurrent modification when updating group calls (Marco Attanasio)
chore: better error handling for soft logout (Christian Kußowski)
build: (BREAKING) update to matrix spec 1.18 (Christian Kußowski)
feat: add skipScanner flag to download methods for per-call content scanner bypass (Khalil Amor)
feat: add isValidMatrixIdStrict for spec-compliant matrix id validation (Cursor Agent)
chore: Follow up actually store updated tofu state in db (Christian Kußowski)
feat: Flag cross signing keys as tofu (Christian Kußowski)
fix: fail tests if they fail (#2348) (td)
feat: update ssss to centralise key logic (Abrish Sabri)
build: (deps): bump actions/checkout from 4 to 6 (dependabot[bot])
fix: do not send notify rtc event in direct chats (td)
fix: call delayed event canceller should not use application and actually remove it from local state on leave (td)
feat: custom rooms list sorter (Karthikeyan S)
refactor: (BREAKING) add type for power level as extension type over int (Christian Kußowski)
application and stop timers for cancelled delayed events (Yash Garg)chore: (BREAKING) Apply default soft logout handling (Christian Kußowski)
fix: handle UIA case for unexpectedResponse during exception + tests
build: Update vodozemac to 0.5.0 (Christian Kußowski)
feat: add an option to intercept log events (#2233) (Yash Garg)
feat: Implement MSC2964 dynamic client registration (Christian Kußowski)
refactor: Deprecated Client.customRefreshTokenLifetime in favor of method parameter (Christian Kußowski)
fix: remove call member event wrt unprotected state keys (td)
feat: New searchEvents method in room (Christian Kußowski)
refactor: CI as integrate.yaml file without file (Christian Kußowski)
Especially for larger accounts this should improve the performance a lot. v4.0.0 It comes with some breaking changes:
Matrix Dart SDK 4.0.0 comes with support for polls, adds first bits towards OIDC and improved support for spaces and threads. This release also fixes a major performance leak while updating user device keys in the sync loop. Especially for larger accounts this should improve the performance a lot. v4.0.0 It comes with some breaking changes:
Client.checkHomeserver() now returns a fourth value. You can just ignore it if you don't need auth_metadata.RelationshipType.reply has been removed in favor of Event.inReplyToEventId() where you can set if you want to ignore fallbacks or not. This makes it easier to differenciate fallback replies and replies inside of a thread.chore: bump vodozemac version to v0.4.0 (Karthikeyan S)
feat: Make display sending event configurable in Room.sendEvent() (Christian Kußowski)
fix: (BREAKING CHANGE) remove only your device call membership if room is not msc3757 (td)
With extended profiles in Matrix 1.16 you now have to use Client.getProfileField() instead of Client.getAvatar() or Client.getDisplayname().
You no longer need to ship flutter_openssl_crypto. The necessary encryption algorithms now come from the Vodozemac package. This should make the platform integration much easier.
fix: scheduled event list init (td)
There have been some breaking changes to the VoIP codebase. Specifically, you will have to pass your instance of the VoIP class to existing getCallMem…
There have been some breaking changes to the VoIP codebase. Specifically, you will have to pass your instance of the VoIP class to existing getCallMemberships* functions which are an extension on the Room class.
Nothing published for this version
fix: (BREAKING) Can not logout and login again with same Client object (Christian Kußowski)
Now if you logout and login again you will reuse the same database. In case you use database encryption and want to use a new key, please consider recreating the database like this:
await client.database.delete();
client.database = await MatrixSdkDatabase.init(/*...*/);
chore: Add hint to init vodozemac also in native implementations (Christian Kußowski)
feat: Migrate to vodozemac (Christian Kußowski)
From now on the Client constructor expects an open database. Client.database is no longer nullable.
Before:
final client = Client(
'Client Name',
databaseBuilder: (_) async {
final database = MatrixSdkDatabase(
'<Database Name>',
database: await databaseFactoryFfi.openDatabase(':memory:'),
sqfliteFactory: databaseFactoryFfi,
);
await database.open();
return database;
},
);
Now:
final client = Client(
'<Client Name>',
database: await MatrixSdkDatabase.init(
'<Database Name>',
database: await databaseFactoryFfi.openDatabase(':memory:'),
sqfliteFactory: databaseFactoryFfi,
),
);
LibOlm is no longer used. From now on you should use Vodozemac. For Flutter you can use flutter_vodozemac. This just needs to be initialized once:
import 'package:flutter_vodozemac/flutter_vodozemac.dart' as vod;
// ...
await vod.init();
final client = Client('Matrix Client',
// ...
// ...
nativeImplementations: NativeImplementationsIsolate(
compute,
// Also init in NativeImplemenetations if you use it there:
vodozemacInit: () => vod.init(),
),
// ...
);
This should work on Android, iOS, macOS, Linux and Windows.
For web you need to compile vodozemac to wasm. Please refer to the Vodozemac bindings documentation.
fix: fallback on homeserver is userID null (The one with the braid)
feat: Add logout command (Christian Kußowski)
feat: Add localization for voice message type (Krille)
chore: prev_batch update after a limited timeline follow-up (Karthikeyan S)
fix: Do not load timeline while sync is processed (Krille)
fix: add proper description for User class (Yash-Garg)
User class (Yash-Garg)onCallInvite (Yash-Garg)fix: deleting last message is edited (Mohammad Reza Moradi)
feat: endpoints for spec v1.14 (BREAKING CHANGE)
chore: Export event localizations (Krille)
Now you can pass a StringBuffer object to the command handler to pass some arbitrary data back to the caller.
Now you can pass a StringBuffer object to the command handler to pass some arbitrary data back to the caller.
Before:
addCommand('newCommand', (CommandArgs args){});
After:
addCommand('newCommand', (CommandArgs args, StringBuffer? stdout){});
In order to use the stdout, you should create a StringBuffer stdout object and
pass it to the parseAndRunCommand method or sendTextEvent (that uses parseAndRunCommand internally).
Like this:
final stdout = StringBuffer();
await client.parseAndRunCommand(
null, // Room can be null now, if the command isn't room specific
"/newCommand options",
...
stdout: stdout,
);
// OR
await room.sendTextEvent(
"/newCommand options"
...
commandStdout: stdout,
);
final output = DefaultCommandOutput.fromStdout(stdout);
if(output != null) {
print(output.toString());
}
There are multiple breaking changes:
Bigger release with a lot of refactorings under the hood. Those do not necessarily make the SDK more performant but more robust and type safe.
There are multiple breaking changes:
dynamics to Object?Also Client.onEvent has been deprecated in favor of:
Client.onTimelineEvent // For timeline events (after decryption)
Client.onHistoryEvent // Same for timeline events when fetching history
Client.onNotification // Events which would trigger a notification like messages or room invites (after decryption)
If you are using Client.onEvent to filter for state events, please from now on use Client.onSync and filter the state events out of it (as they are unencrypted anyway). Same with "Account Data" or ephemeral events.
For notifications the usage should now be much easier as Client.onNotification already filters out events which should not
trigger a notification.
refactor: Do not set the deprecated dont_notify action in push rules (Krille)
Before:
Client('Name', onMigration: () {
print('Migrating now....');
});
After:
Client('Name', onInitStateChanged: (state) {
if (state == InitState.migratingDatabase) {
print('Migrating now....');
}
});
Fixes a minor performance leak where the app re-requests the member list of all encrypted rooms. For this the parameter cache in Room.requestParticipa
Fixes a minor performance leak where the app re-requests the member list of all encrypted rooms.
For this the parameter cache in Room.requestParticipants() is now also
responsible to store the member data in the database. Also it is not true by default anymore for
unencrypted rooms.
feat: add equality and hashCode overrides for autogenerated models (BREAKING CHANGE) (td)
Your coding agent can read these notes before it upgrades. Set up the MCP server →