Limits and defaults
Protocol limits (LIMITS, from @skm/core)
Section titled “Protocol limits (LIMITS, from @skm/core)”| limit | value | what it bounds |
|---|---|---|
maxRecordBytes |
512 KiB | plaintext record, before sealing |
maxCiphertextChars |
700,000 | base64url ciphertext of one record |
maxOpsPerPush |
200 | records in one push |
maxPushBytes |
8 MiB | one push body |
maxPullLimit |
500 | records in one pull page |
maxBlobBytes |
25 MiB | one blob |
maxKindChars |
64 | a kind metadata value |
maxShardChars |
64 | a shard metadata value |
maxRevSkewMs |
5 min | how far ahead a revision may be stamped |
A relay may be configured stricter. It may never be looser: a client that respects these must never be rejected for it.
Engine defaults
Section titled “Engine defaults”| option | default |
|---|---|
autoGrant |
true |
sign |
true |
requireSignatures |
true |
pushDebounceMs |
250 |
retry |
{attempts: 4, baseMs: 250, maxMs: 8000} |
startAutoSync |
30_000 when called with no argument |
metadata |
none — partial sync is opt-in |
What it costs
Section titled “What it costs”Measured with npm run bench and npm run bench:client at 20,000 records.
Both scripts assert a bound, so a change of shape fails the build.
| per record | what it is | |
|---|---|---|
| write (queue locally) | ~17µs | a store write; the app never waits for more |
| write (push) | ~550µs | canonical JSON + one ECDSA signature + one AES seal |
| receive (pull) | ~540µs | one AES open + one ECDSA verification |
| relay push, 200 records | ~4ms | flat from an empty graph to 100,000 |
| relay pull page, 500 records | ~5ms | flat |
Interactive use never notices. A bulk import of a hundred thousand records is a minute, not a moment.