A pgoutput stream, decoded

pg-cdc-relay 0.1.0: change data capture for PostgreSQL over native logical replication.

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.

51messages
12committed transactions
20records delivered
7outbox events

Things to look for:

The stream

BeginCommitRelationlogical message

positionmessagedecoded
0/15FA880Beginxid 844, commits at 0/15FAAC0
bytes 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/15FA880Relationpublic.riders: 4 columns, key (id), replica identity default
bytes 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/15FA880Insertpublic.riders: id=1, name=Kamal Mia, phone=+8801711000101, zone=Mirpur
bytes 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/15FA980Insertpublic.riders: id=2, name=Shafiq Ahmed, phone=+8801811000202, zone=Uttara
bytes 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/15FAA20Insertpublic.riders: id=3, name=Rina Begum, phone=+8801911000303, zone=Dhanmondi
bytes 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/15FCA00Commitend 0/15FCA00: the relay may confirm up to here once delivered
bytes 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/15FCA68Beginxid 845, commits at 0/15FCE60
bytes 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/15FCA68Relationpublic.parcels: 12 columns, key (id), replica identity default
bytes 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/15FCA68Insertpublic.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/15FCD00Relationpublic.outbox: 6 columns, key (id), replica identity default
bytes 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/15FCD00Insertpublic.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/15FCE90Commitend 0/15FCE90: the relay may confirm up to here once delivered
bytes 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/15FCE90Beginxid 846, commits at 0/15FD0F0
bytes 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/15FCE90Insertpublic.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/15FCFF8Insertpublic.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/15FD120Commitend 0/15FD120: the relay may confirm up to here once delivered
bytes 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/15FD120Beginxid 847, commits at 0/15FD380
bytes 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/15FD120Insertpublic.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/15FD288Insertpublic.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/15FD3B0Commitend 0/15FD3B0: the relay may confirm up to here once delivered
bytes 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/15FD3B0Beginxid 848, commits at 0/15FD590
bytes 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/15FD3B0Updatepublic.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/15FD4A8Insertpublic.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/15FD5C0Commitend 0/15FD5C0: the relay may confirm up to here once delivered
bytes 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/15FD5C0Beginxid 849, commits at 0/15FD7A0
bytes 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/15FD5C0Updatepublic.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/15FD6B8Insertpublic.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/15FD7D0Commitend 0/15FD7D0: the relay may confirm up to here once delivered
bytes 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/1600B20Beginxid 850, commits at 0/1600C18
bytes 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/1600B20Updatepublic.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/1600C48Commitend 0/1600C48: the relay may confirm up to here once delivered
bytes 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/1600C80Beginxid 851, commits at 0/1600D78
bytes 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/1600C80Updatepublic.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/1600DA8Commitend 0/1600DA8: the relay may confirm up to here once delivered
bytes 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/1600DA8Beginxid 852, commits at 0/1600F80
bytes 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/1600DA8Updatepublic.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/1600F80LogicalMessageprefix 'outbox', transactional: {"aggregate_type": "rider", "aggregate_id": "1", "event_type": "Rider…
bytes and decoded fields4d 01 00 00 00 00 01 60 0f 80 6f 75 74 62 6f 78 00 00 00 00 89 7b 22 61 67 67 72 65 67 61 74 65 5f 74 79 70 65 22 3a 20 … 158 bytes
{
  "transactional": true,
  "lsn": 23072640,
  "prefix": "outbox",
  "content": "{\"aggregate_type\": \"rider\", \"aggregate_id\": \"1\", \"event_type\": \"RiderAssigned\", \"payload\": {\"tracking_code\": \"SC-240001\", \"rider_id\": 1}}"
}
0/1600FB0Commitend 0/1600FB0: the relay may confirm up to here once delivered
bytes 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/16011D8Beginxid 854, commits at 0/16012F8
bytes 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/16011D8Deletepublic.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/1601228Insertpublic.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/1601328Commitend 0/1601328: the relay may confirm up to here once delivered
bytes 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/1601390Beginxid 855, commits at 0/1601478
bytes 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/1601390Relationpublic.sync_scratch: 2 columns, key (id), replica identity default
bytes 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/1601390Insertpublic.sync_scratch: id=1, note=nightly sync
bytes 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/16014A8Commitend 0/16014A8: the relay may confirm up to here once delivered
bytes 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/1602578LogicalMessageprefix 'heartbeat', non-transactional: swift-courier
bytes and decoded fields4d 00 00 00 00 00 01 60 25 78 68 65 61 72 74 62 65 61 74 00 00 00 00 0d 73 77 69 66 74 2d 63 6f 75 72 69 65 72
{
  "transactional": false,
  "lsn": 23078264,
  "prefix": "heartbeat",
  "content": "swift-courier"
}
0/16024F8Beginxid 856, commits at 0/1602578
bytes 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/16024F8Relationpublic.sync_scratch: 2 columns, key (id), replica identity default
bytes 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/16024F8Truncatepublic.sync_scratch, restart identity
bytes and decoded fields54 00 00 00 01 02 00 00 40 c8
{
  "relation_oids": [
    16584
  ],
  "cascade": false,
  "restart_identity": true
}
0/1602720Commitend 0/1602720: the relay may confirm up to here once delivered
bytes 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.

idtopickeyvalue
0/15FAAC0:0swift.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:1swift.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:2swift.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:0swift.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:1swift.events.parcelSC-240001
{"district": "Chattogram", "cod_amount": "1250.00", "tracking_code": "SC-240001…
{
  "district": "Chattogram",
  "cod_amount": "1250.00",
  "tracking_code": "SC-240001"
}
0/15FD0F0:0swift.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:1swift.events.parcelSC-240002
{"district": "Sylhet", "cod_amount": "2300.00", "tracking_code": "SC-240002"}
{
  "district": "Sylhet",
  "cod_amount": "2300.00",
  "tracking_code": "SC-240002"
}
0/15FD380:0swift.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:1swift.events.parcelSC-240003
{"district": "Khulna", "cod_amount": "1250.00", "tracking_code": "SC-240003"}
{
  "district": "Khulna",
  "cod_amount": "1250.00",
  "tracking_code": "SC-240003"
}
0/15FD590:0swift.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:1swift.events.parcelSC-240001
{"status": "picked_up", "tracking_code": "SC-240001"}
{
  "status": "picked_up",
  "tracking_code": "SC-240001"
}
0/15FD7A0:0swift.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:1swift.events.parcelSC-240001
{"status": "in_transit", "tracking_code": "SC-240001"}
{
  "status": "in_transit",
  "tracking_code": "SC-240001"
}
0/1600C18:0swift.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:0swift.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:0swift.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:1swift.events.rider1
{"tracking_code": "SC-240001", "rider_id": 1}
{
  "tracking_code": "SC-240001",
  "rider_id": 1
}
0/16012F8:0swift.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:1swift.events.parcelSC-240003
{"tracking_code": "SC-240003"}
{
  "tracking_code": "SC-240003"
}
0/1602577:0messages.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."