NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev
Drive an Amwal POS terminal from Flutter. One Dart API over native Android and iOS ECR SDKs (Wi‑Fi, USB, Web Service, and Android app-to-app), plus a pure-Dart Windows host (LAN TCP + Web Service): sale, void, refund, inquiry, sign-on, e-receipt and close-receipt, with typed outcomes that keep an unknown result apart from a refusal.
Last release 4 days ago
04 Oct 2026
Ships on a steady schedule
a new release about every 2 weeks
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
One column per month.
iOS `signOn` — the bridge calls native AmwalECR sign-on over Wi‑Fi and USB cable (same transports as Android). Published 0.3.1 on pub.dev still answer
signOn — the bridge calls native AmwalECR sign-on over Wi‑Fi and
USB cable (same transports as Android). Published 0.3.1 on pub.dev still
answers every iOS signOn with a typed unsupported stub; point a path
dependency at this checkout (as example/ and AmwalECR-flutter-example do)
to get the real answer.closeReceipt — same as Android: Wi‑Fi / USB cable ask the terminal
to dismiss its on-screen receipt (idle / declined / failed). Web Service and
app to app still answer typed unsupported before anything is sent.Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
CI only: the publish check no longer fails on the tracked example lockfile. No code or API changes since 0.3.0 (which was never published to pub.dev).
Brings the package level with com.amwal-pay:ecr-sdk 1.0.5 and AmwalECR 0.2.1 — the ECR modes release: Wi‑Fi as before, USB cable on Android, and the W
Brings the package level with com.amwal-pay:ecr-sdk 1.0.5 and AmwalECR
0.2.1 — the ECR modes release: Wi‑Fi as before, USB cable on Android, and the
Web Service (REST) transport on both platforms, all opened through one native
session path.
EcrOpenedSession / EcrSessions.open (Dart) — names the same
session-open intent as native ecr_sdk / AmwalECR; wraps a transport-aware
EcrTerminal.EcrSessions.open so LAN,
USB cable, and Web Service share one dispatch path.flutter_secure_storage
(Keychain / Keystore), with one-shot migration from plaintext
SharedPreferences.EcrSecureHashKeys removed. The plugin/SDK only accepts
EcrConfig.secureHashKey. Apps persist secrets and assign the value for the
selected terminal mode.ecr_sdk: SECURE_HASH_KEY_ECR_WIFI,
SECURE_HASH_KEY_ECR_WIFI_OTHER, SECURE_HASH_KEY_WEBSERVICE on
EcrTestConfigs (lan / lanOther / webService).ios/ecr_sdk.properties +
example/ios/ecr_sdk.properties (project | cocoapods | spm), applied by
./tool/sync_ios_ecr_sdk.sh / ./tool/prepare_ios_example.sh to both the
podspec and Package.swift faces.EcrTerminal.probeReachability() / EcrReachability. Matches ecr_sdk
and AmwalECR: the same probe as isReachable(), plus host, port, endpoint and
the underlying error when the link fails. Channel method probeReachability;
isReachable remains as a convenience over it.webService; accepts web_service
as an alias without breaking existing callers.ecrMode 1 is USB cable. Matches ecr_sdk: Dart EcrTransport.usbCable,
channel name "usb_cable" (wire value 1). isIpTransport is true only for
Wi‑Fi. USB cable is driven on Android via AOA; iOS returns typed unsupported.
There is no Ethernet transport or channel name.Brings the package level with com.amwal-pay:ecr-sdk 1.0.4 and AmwalECR 0.2.0 — the same three features on both platforms, over the same channel contra
Brings the package level with com.amwal-pay:ecr-sdk 1.0.4 and AmwalECR 0.2.0
— the same three features on both platforms, over the same channel contract.
Breaking. The protocol renamed the field that names a transaction, so
requestId is merchantReference everywhere: on EcrResult, EcrInquiry,
EcrReceipt and on the platform channel. Rename it at the call sites; the type
is unchanged and it still arrives filled in whether or not you supply one. The
channel contract changed too, so the Dart side and the native hosts must be
upgraded together — an old host does not lose a field, it stops being understood.
merchantReference on sale,
voidTransaction, refund, run, inquire and receipt — an order number,
a basket id, whatever already names the sale in your system. Pass it and the
same string identifies the transaction in your books, in the terminal's records
and in any later lookup; leave it out and the host generates one. Either way it
comes back on EcrResult.merchantReference, and it is the only handle you
hold if the answer never arrives.EcrTerminal.inquireByReference. The answer to an outcome you never
received: looks a transaction up by the reference it was sent with, rather than
by a receipt number that only arrives in the answer.EcrFailed.recovered, .recoveredTransaction and .settled. The host now
follows a lost money-moving request with one inquiry and attaches what it
found. A settled failure is a delivery that failed and an outcome that is
known, so outcomeIsUnknown is false and the till books the transaction
instead of reconciling it. Turn the follow-up off with
EcrConfig.autoInquireOnFailure. Nothing is ever re-sent.EcrConfig.secureHashKey. The secret this till shares with the terminal.
Set it and the native SDK signs every request and checks every answer. Refused
at construction if it is not an even-length hex string of at least 16
characters — on the shop floor a bad key is a decline the cashier cannot
explain. Required in practice: a terminal refuses what it cannot verify. The
key is never printed by toString.EcrUnauthenticated, for an answer that cannot be shown to have come from
the terminal. Leaves the outcome unknown, like a timeout — never a decline,
and never to be retried.EcrNextStep, on every EcrResult. What the terminal says to do about an
outcome, rather than something a till has to infer from a response code. A
decline that asks for an inquiry now reports outcomeIsUnknown.secureHashKey, autoInquireOnFailure, merchantReference,
originalMerchantReference, nextStep, recovered, and the
unauthenticated failure kind. The frozen contract test lists them all.& or = — throws EcrArgumentError before anything is sent, on both
platforms and in Dart, with the same message.com.amwal-pay:ecr-sdk:1.0.4, and the iOS host
AmwalECR ~> 0.2.0.Your coding agent can read these notes before it upgrades. Set up the MCP server →