A pgoutput stream, decoded
pg-cdc-relay 0.1.0: change data capture for PostgreSQL over native logical replication.
Source on GitHubRun it in Codespacesrecords.json
This is one round of the demo workload (a fictional courier booking parcels, with a transactional outbox) as PostgreSQL 16 streamed it over a logical replication slot. Each row is one message from the walsender. Its first byte is the message type, highlighted in the bytes. Next to it is what the decoder read, and below are the records the relay delivered with examples/relay.yaml. The capture is the fixture the test suite replays, so the page and the tests always agree.
Things to look for:
- The booking that was rolled back is not in the stream at all. The server only sends committed transactions, which is why the outbox events below can never describe a change that did not happen.
- The second update of
SC-240002carries⟨unchanged TOAST⟩for the largenotescolumn. - Deletes only carry the key columns.
- The rider event has no outbox table: it is a
pg_logical_emit_messageinside the transaction. - The non-transactional heartbeat arrives before the truncate transaction. The message reports the end of its record, which is the exact position where that transaction's commit starts.
The stream
BeginCommitRelationlogical message
| position | message | decoded |
|---|---|---|
| 0/15FA880 | Begin | xid 844, commits at 0/15FAAC0bytes and decoded fields42 00 00 00 00 01 5f aa c0 00 03 02 6b 74 0c 44 63 00 00 03 4c{
"final_lsn": 23046848,
"commit_ts": "2026-11-04T05:31:01.849187Z",
"xid": 844
} |
| 0/15FA880 | Relation | public.riders: 4 columns, key (id), replica identity defaultbytes and decoded fields52 00 00 40 b5 70 75 62 6c 69 63 00 72 69 64 65 72 73 00 64 00 04 01 69 64 00 00 00 00 17 ff ff ff ff 00 6e 61 6d 65 00 … 77 bytes{
"oid": 16565,
"namespace": "public",
"name": "riders",
"replica_identity": "default",
"columns": [
{
"name": "id",
"type_oid": 23,
"type_modifier": -1,
"is_key": true
},
{
"name": "name",
"type_oid": 25,
"type_modifier": -1,
"is_key": false
},
{
"name": "phone",
"type_oid": 25,
"type_modifier": -1,
"is_key": false
},
{
"name": "zone",
"type_oid": 25,
"type_modifier": -1,
"is_key": false
}
]
} |
| 0/15FA880 | Insert | public.riders: id=1, name=Kamal Mia, phone=+8801711000101, zone=Mirpurbytes and decoded fields49 00 00 40 b5 4e 00 04 74 00 00 00 01 31 74 00 00 00 09 4b 61 6d 61 6c 20 4d 69 61 74 00 00 00 0e 2b 38 38 30 31 37 31 … 58 bytes{
"relation_oid": 16565,
"new": [
"1",
"Kamal Mia",
"+8801711000101",
"Mirpur"
]
} |
| 0/15FA980 | Insert | public.riders: id=2, name=Shafiq Ahmed, phone=+8801811000202, zone=Uttarabytes and decoded fields49 00 00 40 b5 4e 00 04 74 00 00 00 01 32 74 00 00 00 0c 53 68 61 66 69 71 20 41 68 6d 65 64 74 00 00 00 0e 2b 38 38 30 … 61 bytes{
"relation_oid": 16565,
"new": [
"2",
"Shafiq Ahmed",
"+8801811000202",
"Uttara"
]
} |
| 0/15FAA20 | Insert | public.riders: id=3, name=Rina Begum, phone=+8801911000303, zone=Dhanmondibytes and decoded fields49 00 00 40 b5 4e 00 04 74 00 00 00 01 33 74 00 00 00 0a 52 69 6e 61 20 42 65 67 75 6d 74 00 00 00 0e 2b 38 38 30 31 39 … 62 bytes{
"relation_oid": 16565,
"new": [
"3",
"Rina Begum",
"+8801911000303",
"Dhanmondi"
]
} |
| 0/15FCA00 | Commit | end 0/15FCA00: the relay may confirm up to here once deliveredbytes and decoded fields43 00 00 00 00 00 01 5f aa c0 00 00 00 00 01 5f ca 00 00 03 02 6b 74 0c 44 63{
"flags": 0,
"commit_lsn": 23046848,
"end_lsn": 23054848,
"commit_ts": "2026-11-04T05:31:01.849187Z"
} |
| 0/15FCA68 | Begin | xid 845, commits at 0/15FCE60bytes and decoded fields42 00 00 00 00 01 5f ce 60 00 03 02 6b 74 0c db 8b 00 00 03 4d{
"final_lsn": 23055968,
"commit_ts": "2026-11-04T05:31:01.887883Z",
"xid": 845
} |
| 0/15FCA68 | Relation | public.parcels: 12 columns, key (id), replica identity defaultbytes and decoded fields52 00 00 40 a4 70 75 62 6c 69 63 00 70 61 72 63 65 6c 73 00 64 00 0c 01 69 64 00 00 00 00 14 ff ff ff ff 00 74 72 61 63 … 244 bytes{
"oid": 16548,
"namespace": "public",
"name": "parcels",
"replica_identity": "default",
"columns": [
{
"name": "id",
"type_oid": 20,
"type_modifier": -1,
"is_key": true
},
{
"name": "tracking_code",
"type_oid": 25,
"type_modifier": -1,
"is_key": false
},
{
"name": "recipient_name",
"type_oid": 25,
"type_modifier": -1,
"is_key": false
},
{
"name": "recipient_phone",
"type_oid": 25,
"type_modifier": -1,
"is_key": false
},
{
"name": "district",
"type_oid": 25,
"type_modifier": -1,
"is_key": false
},
{
"name": "cod_amount",
"type_oid": 1700,
"type_modifier": 786438,
"is_key": false
},
{
"name": "status",
"type_oid": 25,
"type_modifier": -1,
"is_key": false
},
{
"name": "tags",
"type_oid": 1009,
"type_modifier": -1,
"is_key": false
},
{
"name": "notes",
"type_oid": 25,
"type_modifier": -1,
"is_key": false
},
{
"name": "meta",
"type_oid": 3802,
"type_modifier": -1,
"is_key": false
},
{
"name": "created_at",
"type_oid": 1184,
"type_modifier": -1,
"is_key": false
},
{
"name": "updated_at",
"type_oid": 1184,
"type_modifier": -1,
"is_key": false
}
]
} |
| 0/15FCA68 | Insert | public.parcels: id=1, tracking_code=SC-240001, recipient_name=Mahmudul Karim, recipient_phone=+8801719722233, district=Chattogram …bytes and decoded fields49 00 00 40 a4 4e 00 0c 74 00 00 00 01 31 74 00 00 00 09 53 43 2d 32 34 30 30 30 31 74 00 00 00 0e 4d 61 68 6d 75 64 75 … 222 bytes{
"relation_oid": 16548,
"new": [
"1",
"SC-240001",
"Mahmudul Karim",
"+8801719722233",
"Chattogram",
"1250.00",
"booked",
"{cod}",
null,
"{\"fragile\": false, \"weight_kg\": 5.0}",
"2026-11-04 05:31:01.87525+00",
"2026-11-04 05:31:01.87525+00"
]
} |
| 0/15FCD00 | Relation | public.outbox: 6 columns, key (id), replica identity defaultbytes and decoded fields52 00 00 40 be 70 75 62 6c 69 63 00 6f 75 74 62 6f 78 00 64 00 06 01 69 64 00 00 00 00 14 ff ff ff ff 00 61 67 67 72 65 … 137 bytes{
"oid": 16574,
"namespace": "public",
"name": "outbox",
"replica_identity": "default",
"columns": [
{
"name": "id",
"type_oid": 20,
"type_modifier": -1,
"is_key": true
},
{
"name": "aggregate_type",
"type_oid": 25,
"type_modifier": -1,
"is_key": false
},
{
"name": "aggregate_id",
"type_oid": 25,
"type_modifier": -1,
"is_key": false
},
{
"name": "event_type",
"type_oid": 25,
"type_modifier": -1,
"is_key": false
},
{
"name": "payload",
"type_oid": 3802,
"type_modifier": -1,
"is_key": false
},
{
"name": "created_at",
"type_oid": 1184,
"type_modifier": -1,
"is_key": false
}
]
} |
| 0/15FCD00 | Insert | public.outbox: id=1, aggregate_type=parcel, aggregate_id=SC-240001, event_type=ParcelBooked, payload={"district": "Chattogram", "cod… …bytes and decoded fields49 00 00 40 be 4e 00 06 74 00 00 00 01 31 74 00 00 00 06 70 61 72 63 65 6c 74 00 00 00 09 53 43 2d 32 34 30 30 30 31 74 … 175 bytes{
"relation_oid": 16574,
"new": [
"1",
"parcel",
"SC-240001",
"ParcelBooked",
"{\"district\": \"Chattogram\", \"cod_amount\": \"1250.00\", \"tracking_code\": \"SC-240001\"}",
"2026-11-04 05:31:01.87525+00"
]
} |
| 0/15FCE90 | Commit | end 0/15FCE90: the relay may confirm up to here once deliveredbytes and decoded fields43 00 00 00 00 00 01 5f ce 60 00 00 00 00 01 5f ce 90 00 03 02 6b 74 0c db 8b{
"flags": 0,
"commit_lsn": 23055968,
"end_lsn": 23056016,
"commit_ts": "2026-11-04T05:31:01.887883Z"
} |
| 0/15FCE90 | Begin | xid 846, commits at 0/15FD0F0bytes and decoded fields42 00 00 00 00 01 5f d0 f0 00 03 02 6b 74 0d 33 db 00 00 03 4e{
"final_lsn": 23056624,
"commit_ts": "2026-11-04T05:31:01.910491Z",
"xid": 846
} |
| 0/15FCE90 | Insert | public.parcels: id=2, tracking_code=SC-240002, recipient_name=Tanvir Hasan, recipient_phone=+8801778106871, district=Sylhet …bytes and decoded fields49 00 00 40 a4 4e 00 0c 74 00 00 00 01 32 74 00 00 00 09 53 43 2d 32 34 30 30 30 32 74 00 00 00 0c 54 61 6e 76 69 72 20 … 217 bytes{
"relation_oid": 16548,
"new": [
"2",
"SC-240002",
"Tanvir Hasan",
"+8801778106871",
"Sylhet",
"2300.00",
"booked",
"{cod}",
null,
"{\"fragile\": true, \"weight_kg\": 1.4}",
"2026-11-04 05:31:01.908132+00",
"2026-11-04 05:31:01.908132+00"
]
} |
| 0/15FCFF8 | Insert | public.outbox: id=2, aggregate_type=parcel, aggregate_id=SC-240002, event_type=ParcelBooked, payload={"district": "Sylhet", "cod_amo… …bytes and decoded fields49 00 00 40 be 4e 00 06 74 00 00 00 01 32 74 00 00 00 06 70 61 72 63 65 6c 74 00 00 00 09 53 43 2d 32 34 30 30 30 32 74 … 172 bytes{
"relation_oid": 16574,
"new": [
"2",
"parcel",
"SC-240002",
"ParcelBooked",
"{\"district\": \"Sylhet\", \"cod_amount\": \"2300.00\", \"tracking_code\": \"SC-240002\"}",
"2026-11-04 05:31:01.908132+00"
]
} |
| 0/15FD120 | Commit | end 0/15FD120: the relay may confirm up to here once deliveredbytes and decoded fields43 00 00 00 00 00 01 5f d0 f0 00 00 00 00 01 5f d1 20 00 03 02 6b 74 0d 33 db{
"flags": 0,
"commit_lsn": 23056624,
"end_lsn": 23056672,
"commit_ts": "2026-11-04T05:31:01.910491Z"
} |
| 0/15FD120 | Begin | xid 847, commits at 0/15FD380bytes and decoded fields42 00 00 00 00 01 5f d3 80 00 03 02 6b 74 0d 89 bf 00 00 03 4f{
"final_lsn": 23057280,
"commit_ts": "2026-11-04T05:31:01.932479Z",
"xid": 847
} |
| 0/15FD120 | Insert | public.parcels: id=3, tracking_code=SC-240003, recipient_name=Tanvir Hasan, recipient_phone=+8801722175294, district=Khulna …bytes and decoded fields49 00 00 40 a4 4e 00 0c 74 00 00 00 01 33 74 00 00 00 09 53 43 2d 32 34 30 30 30 33 74 00 00 00 0c 54 61 6e 76 69 72 20 … 217 bytes{
"relation_oid": 16548,
"new": [
"3",
"SC-240003",
"Tanvir Hasan",
"+8801722175294",
"Khulna",
"1250.00",
"booked",
"{cod}",
null,
"{\"fragile\": true, \"weight_kg\": 3.4}",
"2026-11-04 05:31:01.930258+00",
"2026-11-04 05:31:01.930258+00"
]
} |
| 0/15FD288 | Insert | public.outbox: id=3, aggregate_type=parcel, aggregate_id=SC-240003, event_type=ParcelBooked, payload={"district": "Khulna", "cod_amo… …bytes and decoded fields49 00 00 40 be 4e 00 06 74 00 00 00 01 33 74 00 00 00 06 70 61 72 63 65 6c 74 00 00 00 09 53 43 2d 32 34 30 30 30 33 74 … 172 bytes{
"relation_oid": 16574,
"new": [
"3",
"parcel",
"SC-240003",
"ParcelBooked",
"{\"district\": \"Khulna\", \"cod_amount\": \"1250.00\", \"tracking_code\": \"SC-240003\"}",
"2026-11-04 05:31:01.930258+00"
]
} |
| 0/15FD3B0 | Commit | end 0/15FD3B0: the relay may confirm up to here once deliveredbytes and decoded fields43 00 00 00 00 00 01 5f d3 80 00 00 00 00 01 5f d3 b0 00 03 02 6b 74 0d 89 bf{
"flags": 0,
"commit_lsn": 23057280,
"end_lsn": 23057328,
"commit_ts": "2026-11-04T05:31:01.932479Z"
} |
| 0/15FD3B0 | Begin | xid 848, commits at 0/15FD590bytes and decoded fields42 00 00 00 00 01 5f d5 90 00 03 02 6b 74 0d e3 50 00 00 03 50{
"final_lsn": 23057808,
"commit_ts": "2026-11-04T05:31:01.955408Z",
"xid": 848
} |
| 0/15FD3B0 | Update | public.parcels: id=1, tracking_code=SC-240001, recipient_name=Mahmudul Karim, recipient_phone=+8801719722233, district=Chattogram …bytes and decoded fields55 00 00 40 a4 4e 00 0c 74 00 00 00 01 31 74 00 00 00 09 53 43 2d 32 34 30 30 30 31 74 00 00 00 0e 4d 61 68 6d 75 64 75 … 226 bytes{
"relation_oid": 16548,
"new": [
"1",
"SC-240001",
"Mahmudul Karim",
"+8801719722233",
"Chattogram",
"1250.00",
"picked_up",
"{cod}",
null,
"{\"fragile\": false, \"weight_kg\": 5.0}",
"2026-11-04 05:31:01.87525+00",
"2026-11-04 05:31:01.952393+00"
],
"old_kind": null,
"old": null
} |
| 0/15FD4A8 | Insert | public.outbox: id=4, aggregate_type=parcel, aggregate_id=SC-240001, event_type=ParcelStatusChanged, payload={"status": "picked_up", "tracki… …bytes and decoded fields49 00 00 40 be 4e 00 06 74 00 00 00 01 34 74 00 00 00 06 70 61 72 63 65 6c 74 00 00 00 09 53 43 2d 32 34 30 30 30 31 74 … 155 bytes{
"relation_oid": 16574,
"new": [
"4",
"parcel",
"SC-240001",
"ParcelStatusChanged",
"{\"status\": \"picked_up\", \"tracking_code\": \"SC-240001\"}",
"2026-11-04 05:31:01.952393+00"
]
} |
| 0/15FD5C0 | Commit | end 0/15FD5C0: the relay may confirm up to here once deliveredbytes and decoded fields43 00 00 00 00 00 01 5f d5 90 00 00 00 00 01 5f d5 c0 00 03 02 6b 74 0d e3 50{
"flags": 0,
"commit_lsn": 23057808,
"end_lsn": 23057856,
"commit_ts": "2026-11-04T05:31:01.955408Z"
} |
| 0/15FD5C0 | Begin | xid 849, commits at 0/15FD7A0bytes and decoded fields42 00 00 00 00 01 5f d7 a0 00 03 02 6b 74 0e 38 a4 00 00 03 51{
"final_lsn": 23058336,
"commit_ts": "2026-11-04T05:31:01.977252Z",
"xid": 849
} |
| 0/15FD5C0 | Update | public.parcels: id=1, tracking_code=SC-240001, recipient_name=Mahmudul Karim, recipient_phone=+8801719722233, district=Chattogram …bytes and decoded fields55 00 00 40 a4 4e 00 0c 74 00 00 00 01 31 74 00 00 00 09 53 43 2d 32 34 30 30 30 31 74 00 00 00 0e 4d 61 68 6d 75 64 75 … 227 bytes{
"relation_oid": 16548,
"new": [
"1",
"SC-240001",
"Mahmudul Karim",
"+8801719722233",
"Chattogram",
"1250.00",
"in_transit",
"{cod}",
null,
"{\"fragile\": false, \"weight_kg\": 5.0}",
"2026-11-04 05:31:01.87525+00",
"2026-11-04 05:31:01.974826+00"
],
"old_kind": null,
"old": null
} |
| 0/15FD6B8 | Insert | public.outbox: id=5, aggregate_type=parcel, aggregate_id=SC-240001, event_type=ParcelStatusChanged, payload={"status": "in_transit", "track… …bytes and decoded fields49 00 00 40 be 4e 00 06 74 00 00 00 01 35 74 00 00 00 06 70 61 72 63 65 6c 74 00 00 00 09 53 43 2d 32 34 30 30 30 31 74 … 156 bytes{
"relation_oid": 16574,
"new": [
"5",
"parcel",
"SC-240001",
"ParcelStatusChanged",
"{\"status\": \"in_transit\", \"tracking_code\": \"SC-240001\"}",
"2026-11-04 05:31:01.974826+00"
]
} |
| 0/15FD7D0 | Commit | end 0/15FD7D0: the relay may confirm up to here once deliveredbytes and decoded fields43 00 00 00 00 00 01 5f d7 a0 00 00 00 00 01 5f d7 d0 00 03 02 6b 74 0e 38 a4{
"flags": 0,
"commit_lsn": 23058336,
"end_lsn": 23058384,
"commit_ts": "2026-11-04T05:31:01.977252Z"
} |
| 0/1600B20 | Begin | xid 850, commits at 0/1600C18bytes and decoded fields42 00 00 00 00 01 60 0c 18 00 03 02 6b 74 0e e9 07 00 00 03 52{
"final_lsn": 23071768,
"commit_ts": "2026-11-04T05:31:02.022407Z",
"xid": 850
} |
| 0/1600B20 | Update | public.parcels: id=2, tracking_code=SC-240002, recipient_name=Tanvir Hasan, recipient_phone=+8801778106871, district=Sylhet …bytes and decoded fields55 00 00 40 a4 4e 00 0c 74 00 00 00 01 32 74 00 00 00 09 53 43 2d 32 34 30 30 30 32 74 00 00 00 0c 54 61 6e 76 69 72 20 … 12234 bytes{
"relation_oid": 16548,
"new": [
"2",
"SC-240002",
"Tanvir Hasan",
"+8801778106871",
"Sylhet",
"2300.00",
"booked",
"{cod}",
"Delivery log 1371c17149d439536b3216fdaeeb975729fae923d5a4fd12aabfe228f219e9cb0eb53f16947ccf25ec84d8dbc74254770f58904dba41ecccc3fc1626e53a13043b026c48bbf33feff9243a8f506b40928b5b7a767c76fb008f86bebb2737f6a6f0fb23c6f5da2cec255404e4fb440034d6608697a8d41bed440e50454f31af3176813e02ea68ef786e4d3cea27d26934b484e73cf575dcad6ba2b0aee0ca923732881584d8c4fa2815d2802827283e0ad84173581569969e58b081006f7e3dfc967a64cb14028d512c9791e558e08baa7196b50ac2f86702824c1c099724caf4941d4072014b3ce107f80e222f828767efc2f91624a8940f1f836f99eee3692f09e2e8c662248b483b7ffc050fec94dbca3a0aac36098b2cc2bd818319478da6bd0c621de49f145fda9988c79fc35526f7eaed46725a2a7b860dcd6c8a1f8b46287cced9041dff02cee737443e210471948d33296c87009e8a7f770d9106fd287db7f1adbc60926f6967e7893f57fd14c1604d115cea325a65e19cbae530282bd36cb9d21f6be6abf0d7c1c1e21862ab8a18a8902073fec8df4f50947aaeb26c57d21fa5d328263dfe574de739988b886e7577496a2c8773e130f7eb19731662b5e803b61ba4168160adb59261ff2d3c425c8d99d19bdd0b6cc60d5d32cbe54014c2b54b95523cf6941fa1c257c6f561c5cb347611a3ce9d97dcbee500fe7ee5fc324bdb2e1142a21c402364f9572b85a8e48f687ab165c58ac5831be38cb8cb4ba2e751989a01749ddb14f71010b93b7d946bf54074e3248c801bef750110c57513064d6d59291f0cde2e5738713a818d8962058765a6ca7cff00d796c25410335b400141212b62c376631129f34369aad80b891baf90d0d3bf16295d06910bf3f5fb85967f532f3ab3cc2d0b698d5c7e41ba4ea5ee874ae7689447ab57a683536c4499d863386ce10cd79e048c07dd7753eda83d7c58dfe0d5a0cf318656b3e6f0bade65c3b188cc102ddb8379c7ce65426f74bde94fb78c8d5f08b79affd2b49c12a4b0062983475eb46c5296f62e338d74ff1fe4f7f505aef9ebdd25b001a3ff416d4a3baf69dad8199bfca8b6f3a6a9421cc1c93016f1c4261e5351d30b49895d1a0d1f13dce20c4fd32f640d0032634f087e51b429fe8110102c995f1abef543b5dfce8a981a049d7ccc7e90a88d519448fb2fc6791ce680ce2b27c8af6666259bbc471fb3be24a0b80316f688d3e481a65c2011bef2c328a72c5e5b77518b1018f134a069e3fab8c3bfc5e740e61572b4e3c02eaa7f3b4a715e4e48dd74089a58f3aef3416f9386bd8773c9d51940ea4e095bd1d6854575622f856469602d1ba9f20df4875b15b0be23b7ac193fe04072755398003680e7e3b35183ef8333c4774ec50cd1c1bac7adac1a4b7d0b352ad6074dce1118813830d71939b53182e4e349d98729e7c6be9ff907a76cc0b57aaf89691052be1ceb374dab4683f84d30d3fc4d83cee9b9bcca0fce9594dc72aa7a6d0018f99ddceb1be0273dbc46dfcea25bab29539ad5966d513b1d00909c30065f846d34530325fed10a47b851832b6ec017c1e1777155a0e9d8f27c7d9cf07255bc509cb3acac23db7c6e9b7d180a4742684ee75bb6cc69f67e48eb7c64328c0490c257a632b96292794c9bce4850bbd0e7cb3593871c15d694c1957f8db03911731a6b2dc782bdeae16d4f6185578715bbd26944ff770e4b9447a3d54ec6390bf61189639e35aeeb95210ef2a83fdf6a0b29872400c49b5539ac5ba7b4b87113c16fdf5924754ec21ef66b01d4921da2e055c90eb6f2aed4c21a9dbf49a067e24bdb7ec83756378368f7e732d2e433ec56f24b1c71b106e934d263b5ba0837bbf1b3ba3178b6e0e30f328549c488e00a4ff1125cf5ec72ba694165beaecba0afa707e1448c828b4136d3b97429ab7bca1aafb77b4460ecec9524998a26259bebd2fa5880587061ce6936714122a40680a06aa0fca51d12afc8e00aa1da5204642bbdb4a78f19e8b8480f3b47c20431658b4550b7ef6bce6a0302cb17cdc70808d77b6ad89f65f84992a0f75ae616b1e5d490340494b35ec2daca1760147d301a233f4d05743bf2b672850882161db80a1e9ad8cdadc4ccd4078c763211caeae0ffac7cb2c8a2788fbf742b65b754e51acbd3d48c3bb9e28c9e3ef5404bf7bac806081598a878e2f264d9b1ecb19dd8b7c46b26a22eccdf03eeddf52ecf4076c19ace327203f26e16af1d4d14aa605882ac89cd1997cd896416bef4ba6e1a02da187e966ece6615d3142f505f7965463e3621d78ed41415e97a498a647c1ac49726e45dac31b3629fb0f26f89264f879130b64915abef7ab5392e335ce1113d4db2b5b52a0f94833734f83ae7518b69c64773031f6725480dc3932677172a31659a2e50add127454b4667a20f1fa2261bd2b5ff4891e5dc9328776e7f1ccacc27ad909f03fdd9e4a62bce19a285ed7361c5c8a4b57bc9fa65c00537e8b3c48d2ae89b9c1ffb013ce94e1af408461c58790dd2cfb8a5f1b461595919cb589f6aec38bcacf836ed5a148fd28cbc938e019bb8723d39553ccaccfab54d946a2d207dc684477391c94c8286793b2b023a60e4e81e11e3f79aa766907508db2823ccd71ba82f4dee6a63c59620e66869002b6d08b5ab9315bd0e3a34bff2aaf438c6b8068dc5d44036c002e162aaef6076bc3346eee21f5c7ff43fc2770c7173601e1c771d814e0f33545a3c0202219ec0605e636d32b32732b89994fa6022136ced620104d159e8489b0ac35e5fa870d0a7ba07a2531adab23e5617d266908d35e59c7a80268422c922202b243f8e5389cd5e3eaa60c736ba80622598514f31c827129084bb54b8bb53759c0767cb7f8013cb790fef33ef2c3ff57de13628bef7a127f6c31d175a632f8ee42ea368b23ff8500f17f4b4ca1b570e2e619e469a62c050bf72fbf666f69e87a1d5ad0b57048efc48738d444a157d52ed8748d31d3092954d2c93e7fb6d28c587db821f6a0efa5ea7d26dc47bbcfb4768314cd2feabbda5f05cb39676b9852e160d80205270575870032264fa2ba9df8a1285822184aaf4614dc90792f3246ee72fd40663e78da1070796e656984517ea9ca91a291a7457e06a3bf9232cdf287eafdbea13e284142e192ad24c3119432a5d575cdab37e328cf759ec646f3a708f4aa5a6d107b0811a7a8b9bbcc9370d715498acd947a1b5a41eafe6ab7233a007b22f16ec9fc9fab9b32fed0766bb31ed04d259b3717bd5c2d6a9a5f04c5503b11606e4644e0d4887d6e120a578757563e68d1f0e22d4ae56ad7675dbd9956e246a395dfeff8f6f4572bc2c3bdabc4e01fbcd9504bca7a5c59340afef8b0baf3a8c80bc2b08a9f5c02661449771d833424d61fcd25491215310a53e5356b6b3dacd8e7f05554b1e1e0ee0ac414f5c500bd6cdaf5ac6860aa8a5f82f14d2d9d0243c83de82eb31f96288b6d8eacf314914bc781ef02216ef29a54358a557f78817592ce63dfa1c7ef6853ac54fff8b3fa5a3bc34f9ac5a0a6e39ebbf65b669972d0626373936081d28a0db506573638acc02d384db001dc5bb4bb84554433593fde017d4707b72fcdaf171e7156282a2a2d92e7459da3d51f35191a136c576d8e27e07c36d29ba78a71cdd24221683cf863fe92f442fd405123a7178b5bd85ee5042d74833c27041b29ae696fa4bb7840dd51983ebf7c99c18fa6eb9eb2b67d8b081abd1d97aaf35f3b68f14ade9d4a455b817a151dd64b338ec80cc5c0b3aa41660793677fa31a2e376e9db073ac7d7a7c198ffe01ce75fc538e29e602225b0dde9bb53f3b967cba892b3ba4a3a5d0b7c056ebc875e5b10c7ac1ff65255845a94f3489967ea4bfe513214825007e2e756aa04ab22031598926e8019792f4cece6788749c1736ebebf0bc65bfc54d5f667b388b3f9c6ad09844593dedd634d54a7dc843565f6ef306e13d6975bb3f2594831167628828f5809e7b7d3703a3ef076b1acdc79d2edf85dd616e732bd008f56f49d64c090cea7a24129199532290b5cd33e9fec3d7c6afcc831e864ec8b45d48730d21e9e233c90cb4f20047226249de87a13d9133d268f95d09ea9823fa7b3a99b7d87de86440285b86ce53935fd16ccd6b9ccc6c4ae12725b8efa9b555246fa3447a99286c0d7ce0ec037c8703ed27e961b130f4c4e8bc562ad69a1b31a888deeeea35374646fa6aef1515e22e00fd2d741d7a9fdc10a1d67a0031dffb3ca0c8d2fc3f3c3fd03f91d80f7bec391a97c0de4f91904a170587c7a437ecb4e59b08f1350c2aa24c4913e4f3649701835ea45ac4e8854b47036909a39e5e32bc556202c247e1de30ca67dbeb4c29d9936dae96f9c23e2ed8f8c375d60fcac32c49d49aee9f4580d08fb6d0ed62279c6dbedbc37293edbd57da8cafe1f6151b9267f9ed212562c49b24ad7312fa1c8be785e55eb4c269b873ac7a00edb9f7796bfbc200caf6d6f1f6af0894e69f569ca039b645d93b4398d8e9a807a7a6d8a0990846b3ba35d82ef9b1ad85ffa47837771674fbfb167df61a128b3f4534c496af2fac6b0ff663e73a436ab2d319cef8a906f526bd622140fe880d8184e6674084fdb0dd13f1c4ff54c4d88273eb356402a7a731d512ff6d964ef51b6a36e33a4180fd14add2d7bc4d8b92e0a3cfe53b170419ea177e8fec375b3be41d62ef430dd737ea6a2e5a2a038d5a1e3a6594888e498e656e46a5c9cfc4b1d85a6c844be645a80d5282639fa798b1310582d67fae1983cb936a9882712cb5da875953507bf4de51b20a401549935d49a54e5ec549c4a7cb2ae33834aad0335d8a1483bba4ee1a9a3a1bcbbe842926d1195d24734e0717074c45cf807a9f1bd4e4a0f40afcb0f13f22ca78e2ee9bf6d2d3b4d67777a0c8910d9c95fee9c13ea50f578b3a0bbc3aaa94502ea730b6d8a8028b2c80bd0980b117e3a28b342ee758af8d62014ea5dd9d602448e500ba01d8773e6273773e3adaf5cf5ace533ef327b42dffc4df5e935ab777ecfd467ba2293f5ee0c21d6046bda6b68607a119030cdeb0e415ea8e09ab022e0d3f2380c27c73a0d5025775aac1bd4f6906ad6e791ac7dc223393f1216147dc78b4ae5e8e1967f9b04237405f508bc6f087a4d8baa409f072fe6f43e30a56c2069235eb36c868c3d78cd3d5548446f56754c2fba27200323b7dabcd519665ce7df72fdd89d8f1efb0f5993ff225eebf8ac4e02b94baadf0446b7cac4e17a1429bdf9cb6877f85f36f2d8233bf7f2fb84f4156f47f8e03c8793918574e4f046b991ae27c8e483476e53aeac5548c0f322d573771a22cb3143fea2a23c3a1781ab3f7f366404002588633a7056d1337512398ccbf172e1bdecd51af0408afe2938407cf7ba849b792009ae895cb72e336819ffdf0b91e1fc0ab620fb752c0bc311ce041b325628eda45b032e3a5a4e16432cbf2a54fa897e8d97559fbc28f189323f4a1df652f4993ef4c0bc182b5f79e3589780dbb28fde21b241f871a0a8633b923e7b81726cd9bba602f26bf0661a54b4b6e5a2af69f111ea25bcb26ee8f4642cd11d4148d3eddac8164b6b1bb59d6a38fda97ebdd293f4b55a7775e4822fde2bfb322c2b9b806427be5d046b98ad4d4f8638d981264a124f6c596176412fb3fac1d1cb195c161450c0573d50df16f263c2e71e5cf2d9e1cb78f134a0fec9d6107e3421724bd0b3de5d53e2fbb325be6f4f56a7ed9fc0dc7fdfbf06b9956226b42418a596e73302e955d5242d19e082c8f245f50ab146211568036ba2f4be3f25f27556a376a0a2bb2b9b7c84790482a0ff2488f657eb08803ff9e25f4983c028716eca5cf68f5a8250e9d6be1298e419d48dbeb03208d3276a2127a74ae5427f2013e484ba1c899da3539bb23f8cae4e99853074b0a99f27608f43a24331f793c2f13b7413d49f7cf6c51a6f8866e0c461ee001d38da9b6f9e79ba59c3a4fdebbedcb5b4016aa5ff4d77a0a806987c4007129d427557721266512942542c9309a11346c863441e850681fbe05b4def16fd6ac0796e74263ce5f2b305c944446288f9c2910a29d223a6457d4b5cd02d1034539a70366c12fb15220c37b80e8d9c1c2d43c8c0c16770659b3023b2e016aa4020cd5b685aede37285fbfef70961ca8d4bd4b6fada164e125c4db18767a03fda0bdfa6a57afbf3d70f3ecf23b51d68fb548aaa0729a3671fd653e7d43942f04e6869e61a01f345d0186fab38a2171b7429ef3038e8abd8ed7ba1c9660584ae2a4f4d8c49312ce04407857f0f1f2ca74d343a8dc171a1aac90b5fc89ccf4a734d08c296ea027a457f48aa482df9cb07f0f5eefb37e6a198c9f921b5c4b7c5e92003d9f44d7be2d4f409454129039aa0929ba7cb76def94f73c8dbb4c50a9b0419e90b0af24f5dfafffa6cc03cbd1926bc1ed3646febfedf7571ca96bf38709027cfcce7bd9ba4d615294cf783e50b8511a8b6c612dd0ddb7d505d4f696831398a5e92b2ab491df341aa28435cd12b1eafc9cbbadc62b6f79373f677f79a8ce6ef2c69f16cf8f8917fb2233fed3a62e38e1076e5233612a5c70345aeae08b2104c5e53a224f43ad1f4c1831864596b72d3b994d8192419bd3a93c3e0c563c293acd6d05dba10914843a5298dfe19f96171d34b5c0c2e3213b6e3549fd2bd4b25e4f3a16d3466c5fc7ac1fd03e9cef1d2ca6a428ab6a14f4c118d5930a2bdaa35e854b0be33daded451748a2b8ea8d456d455901fc2fa05b434cbf26cbfc8a93830dccee320a9642c2707d6140968ec5d59be7d8515b17cf1b35428736d6a1a62bcea795caee3af29f5d8cfdd2a58efee070ce909ce114438ce9e5e20d37090bfb3328b2ec3f826b79dc31436da81bbdcbb7ea5ebb5de8b5ca6277c44219d7ab31ca0dd91b6bed40fc8db9cd0340efee9030f1faf1797d293d976088f501ed322baff52e005cde4eda40551931a5c537de3e34ba7483e76e3624713248d1c791e3ebc149d4f5fc98d669d798dbf7ab95e0e78c72cdba5e3d874de49e391a4bdacc64abea0eef60241eda6ddadb6e0bbf7de37789810779955d257bc29b54d7977405f676c36ad37bf675fe49700d6dc8cff6403ab9dbc742d8d76174cb707ed14555de164aeb01b8d53dd404b775e405ddda35869814d5987036d8851fad4f932c8e7d2b7e19313cd4f9ad33c89d5f3dbb0dd70d65a4a7d1d47c561bbccb9b9f8f906e0b32a1031a827df29e201ebb73846ceadae85b88852d9a03e908eb9993a5386ca6b0005d06fa0f6fe51fb27d257ae6aa0c368ac4daabd6c2dbb73215a9892bdfc0fb356422911d237e90d9384cb7b1e38c1d9da7fa276a0845378bdc251610990dafd6a28e2fbff79bf7995dd5d48f2367115f1d02141be8a4ca2a87d0c78c5026c72c9cfa015c85171597d6b25a98f403739c6acbdfd389b5686239a5ef4b7b4b9757d2566f327f07ce85b721d9d4fa716e32aa7cd8b9d5399eee94929cc708c81ad0c41f083ac574eb632a3d436e6f7dcc6e695973ce8cccdaec774ef73f35b82cac2e6a4debdabefdce30fc952ffd670cbcea772a18cde049ac8b3a235c912396e743c2ea7b9b8699c15ea400c412baa0423fe2ed717c0978499eec902bd4159152729899aa6d306c86e08733edb9d1ca4e82f97e03272c116add52a45d7112338b538e2c37cc785db14e778a224b045a994d777d74d76d5bb687389f5031464f50bb228459ff9f46e3aee8b7f02df7cc7407d5d80a4b5e8f2a6de535be93ab620cc4f22409d5b836465e72a3b224fa5fa211e8c463f468a503f8c45100913102c16e7b84266ee83db6dd4d0d3ce178d074056e69fca75c495a316a8b1b9175fc6aa487d278a0781ec600b52d1791548588b5fb4582781a81a9e0dcd6f3115a106df06244e156bf4a2a58049d345627f0b8a6ee907c13433295a723c9d988606e28760f0b21016bb262a14937157a81fae83d54b1989fea7be4e573c9ce573dc40fdd69f1986b7933520570a5e140885c8708a73ca3304f51b9766884a8987e45ceb530363ed85cce030807e90ccd240dc842c71b9fa2d7d6457589ddce1aa31efeff01ba94e8e4512fadb8ee2f24401c3e04a0ac134965cb77665674677d17e47f8dd65b1a2f06819f69cda1b5546dac3562ff8ea6815bb982658f71e757571e8d2d871c0647c8587bfe5fb75e667bb9ecfec8b7cec86808348b72cc2de8b97cc7980e4893460cf4c48158ca93a08971105d89cec587363a6990953b62092aa7efb5a912e03e64526271965624f25f5d4a25fc909b2e45ae6a23b61b5636a00d66953fa6a654334337badf6d48dc870c892e0d67cc5fd9d1dc9eb74ff0ee0645ff911a2b34476820fbc77e8f16b5f10127ed398fe37c9056e17ae7bfadabf59c370beb303d448d084caa1267fca426a86a4abcce7a96f1ca91e6ec7755ad92820e5856d854e2ec5",
"{\"fragile\": true, \"weight_kg\": 1.4}",
"2026-11-04 05:31:01.908132+00",
"2026-11-04 05:31:01.908132+00"
],
"old_kind": null,
"old": null
} |
| 0/1600C48 | Commit | end 0/1600C48: the relay may confirm up to here once deliveredbytes and decoded fields43 00 00 00 00 00 01 60 0c 18 00 00 00 00 01 60 0c 48 00 03 02 6b 74 0e e9 07{
"flags": 0,
"commit_lsn": 23071768,
"end_lsn": 23071816,
"commit_ts": "2026-11-04T05:31:02.022407Z"
} |
| 0/1600C80 | Begin | xid 851, commits at 0/1600D78bytes and decoded fields42 00 00 00 00 01 60 0d 78 00 03 02 6b 74 0f 36 9d 00 00 03 53{
"final_lsn": 23072120,
"commit_ts": "2026-11-04T05:31:02.042269Z",
"xid": 851
} |
| 0/1600C80 | Update | public.parcels: id=2, tracking_code=SC-240002, recipient_name=Tanvir Hasan, recipient_phone=+8801778106871, district=Sylhet …bytes and decoded fields55 00 00 40 a4 4e 00 0c 74 00 00 00 01 32 74 00 00 00 09 53 43 2d 32 34 30 30 30 32 74 00 00 00 0c 54 61 6e 76 69 72 20 … 217 bytes{
"relation_oid": 16548,
"new": [
"2",
"SC-240002",
"Tanvir Hasan",
"+8801778106871",
"Sylhet",
"2300.00",
"on_hold",
"{cod}",
"<unchanged toast>",
"{\"fragile\": true, \"weight_kg\": 1.4}",
"2026-11-04 05:31:01.908132+00",
"2026-11-04 05:31:02.04135+00"
],
"old_kind": null,
"old": null
} |
| 0/1600DA8 | Commit | end 0/1600DA8: the relay may confirm up to here once deliveredbytes and decoded fields43 00 00 00 00 00 01 60 0d 78 00 00 00 00 01 60 0d a8 00 03 02 6b 74 0f 36 9d{
"flags": 0,
"commit_lsn": 23072120,
"end_lsn": 23072168,
"commit_ts": "2026-11-04T05:31:02.042269Z"
} |
| 0/1600DA8 | Begin | xid 852, commits at 0/1600F80bytes and decoded fields42 00 00 00 00 01 60 0f 80 00 03 02 6b 74 0f 8f 2f 00 00 03 54{
"final_lsn": 23072640,
"commit_ts": "2026-11-04T05:31:02.064943Z",
"xid": 852
} |
| 0/1600DA8 | Update | public.parcels: id=1, tracking_code=SC-240001, recipient_name=Mahmudul Karim, recipient_phone=+8801719722233, district=Chattogram …bytes and decoded fields55 00 00 40 a4 4e 00 0c 74 00 00 00 01 31 74 00 00 00 09 53 43 2d 32 34 30 30 30 31 74 00 00 00 0e 4d 61 68 6d 75 64 75 … 242 bytes{
"relation_oid": 16548,
"new": [
"1",
"SC-240001",
"Mahmudul Karim",
"+8801719722233",
"Chattogram",
"1250.00",
"in_transit",
"{cod}",
null,
"{\"fragile\": false, \"rider_id\": 1, \"weight_kg\": 5.0}",
"2026-11-04 05:31:01.87525+00",
"2026-11-04 05:31:01.974826+00"
],
"old_kind": null,
"old": null
} |
| 0/1600FB0 | Commit | end 0/1600FB0: the relay may confirm up to here once deliveredbytes and decoded fields43 00 00 00 00 00 01 60 0f 80 00 00 00 00 01 60 0f b0 00 03 02 6b 74 0f 8f 2f{
"flags": 0,
"commit_lsn": 23072640,
"end_lsn": 23072688,
"commit_ts": "2026-11-04T05:31:02.064943Z"
} |
| 0/16011D8 | Begin | xid 854, commits at 0/16012F8bytes and decoded fields42 00 00 00 00 01 60 12 f8 00 03 02 6b 74 0f e8 be 00 00 03 56{
"final_lsn": 23073528,
"commit_ts": "2026-11-04T05:31:02.087870Z",
"xid": 854
} |
| 0/16011D8 | Delete | public.parcels: old key (id=3)bytes and decoded fields44 00 00 40 a4 4b 00 0c 74 00 00 00 01 33 6e 6e 6e 6e 6e 6e 6e 6e 6e 6e 6e{
"relation_oid": 16548,
"old_kind": "K",
"old": [
"3",
null,
null,
null,
null,
null,
null,
null,
null,
null,
null,
null
]
} |
| 0/1601228 | Insert | public.outbox: id=7, aggregate_type=parcel, aggregate_id=SC-240003, event_type=ParcelCancelled, payload={"tracking_code": "SC-240003"} …bytes and decoded fields49 00 00 40 be 4e 00 06 74 00 00 00 01 37 74 00 00 00 06 70 61 72 63 65 6c 74 00 00 00 09 53 43 2d 32 34 30 30 30 33 74 … 128 bytes{
"relation_oid": 16574,
"new": [
"7",
"parcel",
"SC-240003",
"ParcelCancelled",
"{\"tracking_code\": \"SC-240003\"}",
"2026-11-04 05:31:02.086909+00"
]
} |
| 0/1601328 | Commit | end 0/1601328: the relay may confirm up to here once deliveredbytes and decoded fields43 00 00 00 00 00 01 60 12 f8 00 00 00 00 01 60 13 28 00 03 02 6b 74 0f e8 be{
"flags": 0,
"commit_lsn": 23073528,
"end_lsn": 23073576,
"commit_ts": "2026-11-04T05:31:02.087870Z"
} |
| 0/1601390 | Begin | xid 855, commits at 0/1601478bytes and decoded fields42 00 00 00 00 01 60 14 78 00 03 02 6b 74 10 40 07 00 00 03 57{
"final_lsn": 23073912,
"commit_ts": "2026-11-04T05:31:02.110215Z",
"xid": 855
} |
| 0/1601390 | Relation | public.sync_scratch: 2 columns, key (id), replica identity defaultbytes and decoded fields52 00 00 40 c8 70 75 62 6c 69 63 00 73 79 6e 63 5f 73 63 72 61 74 63 68 00 64 00 02 01 69 64 00 00 00 00 17 ff ff ff ff … 54 bytes{
"oid": 16584,
"namespace": "public",
"name": "sync_scratch",
"replica_identity": "default",
"columns": [
{
"name": "id",
"type_oid": 23,
"type_modifier": -1,
"is_key": true
},
{
"name": "note",
"type_oid": 25,
"type_modifier": -1,
"is_key": false
}
]
} |
| 0/1601390 | Insert | public.sync_scratch: id=1, note=nightly syncbytes and decoded fields49 00 00 40 c8 4e 00 02 74 00 00 00 01 31 74 00 00 00 0c 6e 69 67 68 74 6c 79 20 73 79 6e 63{
"relation_oid": 16584,
"new": [
"1",
"nightly sync"
]
} |
| 0/16014A8 | Commit | end 0/16014A8: the relay may confirm up to here once deliveredbytes and decoded fields43 00 00 00 00 00 01 60 14 78 00 00 00 00 01 60 14 a8 00 03 02 6b 74 10 40 07{
"flags": 0,
"commit_lsn": 23073912,
"end_lsn": 23073960,
"commit_ts": "2026-11-04T05:31:02.110215Z"
} |
| 0/16024F8 | Begin | xid 856, commits at 0/1602578bytes and decoded fields42 00 00 00 00 01 60 25 78 00 03 02 6b 74 13 32 aa 00 00 03 58{
"final_lsn": 23078264,
"commit_ts": "2026-11-04T05:31:02.303402Z",
"xid": 856
} |
| 0/16024F8 | Relation | public.sync_scratch: 2 columns, key (id), replica identity defaultbytes and decoded fields52 00 00 40 c8 70 75 62 6c 69 63 00 73 79 6e 63 5f 73 63 72 61 74 63 68 00 64 00 02 01 69 64 00 00 00 00 17 ff ff ff ff … 54 bytes{
"oid": 16584,
"namespace": "public",
"name": "sync_scratch",
"replica_identity": "default",
"columns": [
{
"name": "id",
"type_oid": 23,
"type_modifier": -1,
"is_key": true
},
{
"name": "note",
"type_oid": 25,
"type_modifier": -1,
"is_key": false
}
]
} |
| 0/16024F8 | Truncate | public.sync_scratch, restart identitybytes and decoded fields54 00 00 00 01 02 00 00 40 c8{
"relation_oids": [
16584
],
"cascade": false,
"restart_identity": true
} |
| 0/1602720 | Commit | end 0/1602720: the relay may confirm up to here once deliveredbytes and decoded fields43 00 00 00 00 00 01 60 25 78 00 00 00 00 01 60 27 20 00 03 02 6b 74 13 32 aa{
"flags": 0,
"commit_lsn": 23078264,
"end_lsn": 23078688,
"commit_ts": "2026-11-04T05:31:02.303402Z"
} |
What the relay delivered
Table changes go to swift.cdc.<table> with notes dropped and phone numbers HMAC-masked. Outbox events go to swift.events.<aggregate_type> keyed by aggregate id. sync_scratch is excluded, and the outbox table's own rows are not republished. Ids are <commit LSN>:<position> and are stable across redelivery.
| id | topic | key | value |
|---|---|---|---|
| 0/15FAAC0:0 | swift.cdc.riders | {"id":1} | {"id": "0/15FAAC0:0", "op": "insert", "key": {"id": 1}, "before": null, "after"…{
"id": "0/15FAAC0:0",
"op": "insert",
"key": {
"id": 1
},
"before": null,
"after": {
"id": 1,
"name": "Kamal Mia",
"phone": "hmac:eb3aa18e9d3de24e",
"zone": "Mirpur"
},
"source": {
"lsn": "0/15FAAC0",
"xid": 844,
"commit_ts": "2026-11-04T05:31:01.849187Z",
"schema": "public",
"table": "riders"
}
} |
| 0/15FAAC0:1 | swift.cdc.riders | {"id":2} | {"id": "0/15FAAC0:1", "op": "insert", "key": {"id": 2}, "before": null, "after"…{
"id": "0/15FAAC0:1",
"op": "insert",
"key": {
"id": 2
},
"before": null,
"after": {
"id": 2,
"name": "Shafiq Ahmed",
"phone": "hmac:1223ea829c96e535",
"zone": "Uttara"
},
"source": {
"lsn": "0/15FAAC0",
"xid": 844,
"commit_ts": "2026-11-04T05:31:01.849187Z",
"schema": "public",
"table": "riders"
}
} |
| 0/15FAAC0:2 | swift.cdc.riders | {"id":3} | {"id": "0/15FAAC0:2", "op": "insert", "key": {"id": 3}, "before": null, "after"…{
"id": "0/15FAAC0:2",
"op": "insert",
"key": {
"id": 3
},
"before": null,
"after": {
"id": 3,
"name": "Rina Begum",
"phone": "hmac:96df658649909a76",
"zone": "Dhanmondi"
},
"source": {
"lsn": "0/15FAAC0",
"xid": 844,
"commit_ts": "2026-11-04T05:31:01.849187Z",
"schema": "public",
"table": "riders"
}
} |
| 0/15FCE60:0 | swift.cdc.parcels | {"id":1} | {"id": "0/15FCE60:0", "op": "insert", "key": {"id": 1}, "before": null, "after"…{
"id": "0/15FCE60:0",
"op": "insert",
"key": {
"id": 1
},
"before": null,
"after": {
"id": 1,
"tracking_code": "SC-240001",
"recipient_name": "Mahmudul Karim",
"recipient_phone": "hmac:47034cdceff7b8ca",
"district": "Chattogram",
"cod_amount": "1250.00",
"status": "booked",
"tags": [
"cod"
],
"meta": {
"fragile": false,
"weight_kg": 5.0
},
"created_at": "2026-11-04T05:31:01.875250Z",
"updated_at": "2026-11-04T05:31:01.875250Z"
},
"source": {
"lsn": "0/15FCE60",
"xid": 845,
"commit_ts": "2026-11-04T05:31:01.887883Z",
"schema": "public",
"table": "parcels"
}
} |
| 0/15FCE60:1 | swift.events.parcel | SC-240001 | {"district": "Chattogram", "cod_amount": "1250.00", "tracking_code": "SC-240001…{
"district": "Chattogram",
"cod_amount": "1250.00",
"tracking_code": "SC-240001"
} |
| 0/15FD0F0:0 | swift.cdc.parcels | {"id":2} | {"id": "0/15FD0F0:0", "op": "insert", "key": {"id": 2}, "before": null, "after"…{
"id": "0/15FD0F0:0",
"op": "insert",
"key": {
"id": 2
},
"before": null,
"after": {
"id": 2,
"tracking_code": "SC-240002",
"recipient_name": "Tanvir Hasan",
"recipient_phone": "hmac:ec9443b5092c3d04",
"district": "Sylhet",
"cod_amount": "2300.00",
"status": "booked",
"tags": [
"cod"
],
"meta": {
"fragile": true,
"weight_kg": 1.4
},
"created_at": "2026-11-04T05:31:01.908132Z",
"updated_at": "2026-11-04T05:31:01.908132Z"
},
"source": {
"lsn": "0/15FD0F0",
"xid": 846,
"commit_ts": "2026-11-04T05:31:01.910491Z",
"schema": "public",
"table": "parcels"
}
} |
| 0/15FD0F0:1 | swift.events.parcel | SC-240002 | {"district": "Sylhet", "cod_amount": "2300.00", "tracking_code": "SC-240002"}{
"district": "Sylhet",
"cod_amount": "2300.00",
"tracking_code": "SC-240002"
} |
| 0/15FD380:0 | swift.cdc.parcels | {"id":3} | {"id": "0/15FD380:0", "op": "insert", "key": {"id": 3}, "before": null, "after"…{
"id": "0/15FD380:0",
"op": "insert",
"key": {
"id": 3
},
"before": null,
"after": {
"id": 3,
"tracking_code": "SC-240003",
"recipient_name": "Tanvir Hasan",
"recipient_phone": "hmac:3136a5312c4c0393",
"district": "Khulna",
"cod_amount": "1250.00",
"status": "booked",
"tags": [
"cod"
],
"meta": {
"fragile": true,
"weight_kg": 3.4
},
"created_at": "2026-11-04T05:31:01.930258Z",
"updated_at": "2026-11-04T05:31:01.930258Z"
},
"source": {
"lsn": "0/15FD380",
"xid": 847,
"commit_ts": "2026-11-04T05:31:01.932479Z",
"schema": "public",
"table": "parcels"
}
} |
| 0/15FD380:1 | swift.events.parcel | SC-240003 | {"district": "Khulna", "cod_amount": "1250.00", "tracking_code": "SC-240003"}{
"district": "Khulna",
"cod_amount": "1250.00",
"tracking_code": "SC-240003"
} |
| 0/15FD590:0 | swift.cdc.parcels | {"id":1} | {"id": "0/15FD590:0", "op": "update", "key": {"id": 1}, "before": null, "after"…{
"id": "0/15FD590:0",
"op": "update",
"key": {
"id": 1
},
"before": null,
"after": {
"id": 1,
"tracking_code": "SC-240001",
"recipient_name": "Mahmudul Karim",
"recipient_phone": "hmac:47034cdceff7b8ca",
"district": "Chattogram",
"cod_amount": "1250.00",
"status": "picked_up",
"tags": [
"cod"
],
"meta": {
"fragile": false,
"weight_kg": 5.0
},
"created_at": "2026-11-04T05:31:01.875250Z",
"updated_at": "2026-11-04T05:31:01.952393Z"
},
"source": {
"lsn": "0/15FD590",
"xid": 848,
"commit_ts": "2026-11-04T05:31:01.955408Z",
"schema": "public",
"table": "parcels"
}
} |
| 0/15FD590:1 | swift.events.parcel | SC-240001 | {"status": "picked_up", "tracking_code": "SC-240001"}{
"status": "picked_up",
"tracking_code": "SC-240001"
} |
| 0/15FD7A0:0 | swift.cdc.parcels | {"id":1} | {"id": "0/15FD7A0:0", "op": "update", "key": {"id": 1}, "before": null, "after"…{
"id": "0/15FD7A0:0",
"op": "update",
"key": {
"id": 1
},
"before": null,
"after": {
"id": 1,
"tracking_code": "SC-240001",
"recipient_name": "Mahmudul Karim",
"recipient_phone": "hmac:47034cdceff7b8ca",
"district": "Chattogram",
"cod_amount": "1250.00",
"status": "in_transit",
"tags": [
"cod"
],
"meta": {
"fragile": false,
"weight_kg": 5.0
},
"created_at": "2026-11-04T05:31:01.875250Z",
"updated_at": "2026-11-04T05:31:01.974826Z"
},
"source": {
"lsn": "0/15FD7A0",
"xid": 849,
"commit_ts": "2026-11-04T05:31:01.977252Z",
"schema": "public",
"table": "parcels"
}
} |
| 0/15FD7A0:1 | swift.events.parcel | SC-240001 | {"status": "in_transit", "tracking_code": "SC-240001"}{
"status": "in_transit",
"tracking_code": "SC-240001"
} |
| 0/1600C18:0 | swift.cdc.parcels | {"id":2} | {"id": "0/1600C18:0", "op": "update", "key": {"id": 2}, "before": null, "after"…{
"id": "0/1600C18:0",
"op": "update",
"key": {
"id": 2
},
"before": null,
"after": {
"id": 2,
"tracking_code": "SC-240002",
"recipient_name": "Tanvir Hasan",
"recipient_phone": "hmac:ec9443b5092c3d04",
"district": "Sylhet",
"cod_amount": "2300.00",
"status": "booked",
"tags": [
"cod"
],
"meta": {
"fragile": true,
"weight_kg": 1.4
},
"created_at": "2026-11-04T05:31:01.908132Z",
"updated_at": "2026-11-04T05:31:01.908132Z"
},
"source": {
"lsn": "0/1600C18",
"xid": 850,
"commit_ts": "2026-11-04T05:31:02.022407Z",
"schema": "public",
"table": "parcels"
}
} |
| 0/1600D78:0 | swift.cdc.parcels | {"id":2} | {"id": "0/1600D78:0", "op": "update", "key": {"id": 2}, "before": null, "after"…{
"id": "0/1600D78:0",
"op": "update",
"key": {
"id": 2
},
"before": null,
"after": {
"id": 2,
"tracking_code": "SC-240002",
"recipient_name": "Tanvir Hasan",
"recipient_phone": "hmac:ec9443b5092c3d04",
"district": "Sylhet",
"cod_amount": "2300.00",
"status": "on_hold",
"tags": [
"cod"
],
"meta": {
"fragile": true,
"weight_kg": 1.4
},
"created_at": "2026-11-04T05:31:01.908132Z",
"updated_at": "2026-11-04T05:31:02.041350Z"
},
"unchanged_toast": [
"notes"
],
"source": {
"lsn": "0/1600D78",
"xid": 851,
"commit_ts": "2026-11-04T05:31:02.042269Z",
"schema": "public",
"table": "parcels"
}
} |
| 0/1600F80:0 | swift.cdc.parcels | {"id":1} | {"id": "0/1600F80:0", "op": "update", "key": {"id": 1}, "before": null, "after"…{
"id": "0/1600F80:0",
"op": "update",
"key": {
"id": 1
},
"before": null,
"after": {
"id": 1,
"tracking_code": "SC-240001",
"recipient_name": "Mahmudul Karim",
"recipient_phone": "hmac:47034cdceff7b8ca",
"district": "Chattogram",
"cod_amount": "1250.00",
"status": "in_transit",
"tags": [
"cod"
],
"meta": {
"fragile": false,
"rider_id": 1,
"weight_kg": 5.0
},
"created_at": "2026-11-04T05:31:01.875250Z",
"updated_at": "2026-11-04T05:31:01.974826Z"
},
"source": {
"lsn": "0/1600F80",
"xid": 852,
"commit_ts": "2026-11-04T05:31:02.064943Z",
"schema": "public",
"table": "parcels"
}
} |
| 0/1600F80:1 | swift.events.rider | 1 | {"tracking_code": "SC-240001", "rider_id": 1}{
"tracking_code": "SC-240001",
"rider_id": 1
} |
| 0/16012F8:0 | swift.cdc.parcels | {"id":3} | {"id": "0/16012F8:0", "op": "delete", "key": {"id": 3}, "before": {"id": 3}, "a…{
"id": "0/16012F8:0",
"op": "delete",
"key": {
"id": 3
},
"before": {
"id": 3
},
"after": null,
"source": {
"lsn": "0/16012F8",
"xid": 854,
"commit_ts": "2026-11-04T05:31:02.087870Z",
"schema": "public",
"table": "parcels"
}
} |
| 0/16012F8:1 | swift.events.parcel | SC-240003 | {"tracking_code": "SC-240003"}{
"tracking_code": "SC-240003"
} |
| 0/1602577:0 | messages.heartbeat | {"id": "0/1602577:0", "op": "message", "prefix": "heartbeat", "transactional": …{
"id": "0/1602577:0",
"op": "message",
"prefix": "heartbeat",
"transactional": false,
"content": "swift-courier",
"source": {
"lsn": "0/1602577",
"xid": null,
"commit_ts": null
}
} |
Routing config
# Example relay config for the Swift Courier demo schema (cdc_relay/demo.py).
# Every key is optional; environment variables (CDC_DSN, CDC_WEBHOOK_SECRET, ...) override it.
dsn: postgresql://postgres:postgres@localhost:5432/postgres
slot: cdc_relay
publication: cdc_relay
publication_tables: [public.parcels, public.riders, public.outbox, public.sync_scratch]
checkpoint_path: state/relay.checkpoint.json
dead_letter_path: state/deadletter.jsonl
batch_max_records: 500
batch_max_wait: 0.5
sink:
type: stdout # stdout | file | webhook | redis
# url: https://hooks.example.com/cdc
# secret: set CDC_WEBHOOK_SECRET instead of committing it
# redis_url: redis://localhost:6379/0
# stream_template: "cdc:{topic}"
routing:
include: ["public.*"]
exclude: ["public.sync_*"]
topic_template: "swift.cdc.{table}"
drop_columns:
public.parcels: [notes]
mask_columns:
public.parcels: [recipient_phone]
public.riders: [phone]
mask_salt: demo-salt-change-me # CDC_MASK_SALT in real deployments
message_prefixes: [heartbeat]
outbox:
table: public.outbox
message_prefix: outbox
topic_prefix: "swift.events."