Skip to content

Best practice for time-based sync filtering (rolling window)? #444

@mikecfisher

Description

@mikecfisher

Hey team,

I'm building an offline-first app for event management and running into the NOW() limitation in sync rules. My use case is pretty straightforward, I only want to sync events from the last 7 days and next 30 days to mobile devices. Don't want years of old events bloating the local db.

Obviously can't do WHERE starts_at >= NOW() - INTERVAL '7 days' since sync rules need to be deterministic.

I've been looking at two approaches and wondering what you'd recommend:

Option A: Server-side boolean flag

Add a sync_active column and run a daily cron job that flips it based on event dates. Sync rule just does WHERE sync_active = true. Simple but feels hacky and creates unnecessary writes.

Option B: Client parameters with time buckets

Add a generated column like time_bucket_key (ISO week format), then use client params to request specific weeks:

parameters: |
  SELECT value as bucket_id 
  FROM json_each(request.parameters() -> 'time_buckets')

data:
  - SELECT * FROM events WHERE time_bucket_key = bucket.bucket_id

Client calculates which weeks it needs and passes them on connect. Filter locally for the exact date range.

Is option B the recommended pattern here? Any gotchas I should know about?

Also curious if Sync Streams (saw it's in alpha) changes the calculus here at all. The TTL stuff looks interesting for this use case.

Thanks!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions