Overview
To make this trade‑off explicit, you choose whether to keep the existing behavior or turn on newer fixes that slightly change how data is processed. Use theconfig
block in your Sync Rules YAML file to choose the behavior. There are two ways to turn fixes on:
- Set an
edition
to enable the full set of fixes for that edition. This is the recommended approach for new projects. - Toggle individual options for more fine‑grained control.
Configuration
For new projects, it is recommended to enable all current fixes by settingedition: <edition>
:
sync_rules.yaml
sync_rules.yaml
Supported fixes
This table lists all fixes currently supported:Name | Explanation | Added in Service version | Fixed in edition |
---|---|---|---|
timestamps_iso8601 | Link | 1.15.0 | 2 |
versioned_bucket_ids | Link | 1.15.0 | 2 |
fixed_json_extract | Link | 1.15.0 | 2 |
custom_postgres_types | Link. | 1.15.3 | 2 |
timestamps_iso8601
PowerSync is supposed to encode timestamps according to the ISO-8601 standard.
Without this fix, the service encoded timestamps from MongoDB and Postgres source databases incorrectly.
To ensure time values from Postgres compare lexicographically, they’re also padded to six digits of accuracy when encoded.
Since MongoDB only stores values with an accuracy of milliseconds, only three digits of accuracy are used.
For instance, the value 2025-09-22T14:29:30
would be encoded as follows:
- For Postgres:
2025-09-22 14:29:30
without the fix,2025-09-22T14:29:30.000000
with the fix applied. - For MongoDB:
2025-09-22 14:29:30.000
without the fix,2025-09-22T14:29:30.000
with the fix applied.
versioned_bucket_ids
Sync Rules define buckets, which rows to sync are then assigned to. When you run a full defragmentation or
redeploy Sync Rules, the same bucket identifiers are re-used when processing data again.
Because the second iteration uses different checksums for the same bucket ids, clients may sync data
twice before realizing that something is off and starting from scratch.
Applying this fix improves client-side progress estimation and is more efficient, since data would not get
downloaded twice.
fixed_json_extract
This fixes the json_extract
functions as well as the ->
and ->>
operators in sync rules to behave similar
to recent SQLite versions: We only split on .
if the path starts with $.
.
For instance, 'json_extract({"foo.bar": "baz"}', 'foo.bar')
would evaluate to:
baz
with the option enabled.null
with the option disabled.
custom_postgres_types
If you have custom Postgres types in your backend database schema, older versions of the PowerSync Service
would not recognize these values and sync them with the textual wire representation used by Postgres.
This is especially noticeable when defining DOMAIN
types with e.g. a REAL
inner type: The wrapped
DOMAIN
type should get synced as a real value as well, but it would actually get synced as a string.
With this fix applied:
DOMAIN TYPE
s are synced as their inner type.- Array types of custom types get parsed correctly, and sync as a JSON array.
- Custom types get parsed and synced as a JSON object containing their members.
- Ranges sync as a JSON object corresponding to the following TypeScript definition:
- Multi-ranges sync as an array of ranges.