Loading...

What is it?

atproto Latency Fabric is an XRPC proxy draft scheduler for atproto records. Writes go in now, records appear in the feed later — at exactly the time you specify.

Drop it in front of any atproto client: point writes at the proxy instead of directly at the PDS to get scheduled posting, drafts, recurring schedules, and webhook-triggered publishing without changing your data model.

How it works

Client App your existing code
XRPC write + x-scheduled-at / x-trigger: webhook
atproto Latency Fabric transparent proxy · stores draft · schedules recurrences
at scheduled time · on trigger call · on recurrence fire
PDS persists the record
  1. 1 Authorize once — complete a one-time authorization so the proxy can publish records to your PDS on your behalf.
  2. 2 Redirect your writes — point XRPC write calls at the proxy. Add x-scheduled-at to set a time, or x-trigger: webhook to get a one-time publish URL.
  3. 3 Draft stored — the proxy stores the record (and any images) locally. A provisional AT-URI is returned immediately.
  4. 4 Auto-publish — the built-in scheduler wakes up at the scheduled time, or publishes when the trigger URL is called.
  5. 5 Manage drafts — list, reschedule, publish immediately, or cancel via town.roundabout.scheduledPosts.* XRPC methods.

Webhook Triggers

Add x-trigger: webhook to any write request. ALF generates a one-time secret URL and returns it in the response. Anyone with the URL can call POST {triggerUrl} (no auth required) to immediately publish the draft.

The URL is the secret — share it with Zapier, a bot, or any external system. The key is never stored in plaintext: ALF keeps an HMAC-SHA256 hash for O(1) lookup and an AES-256-GCM encrypted copy for retrieval. Calling the URL a second time returns 409 TriggerAlreadyFired.

Recurring Schedules

Create a schedule with a recurrence rule and ALF will automatically create and publish one draft per occurrence. Each fired occurrence is stored as a permanent draft record — full publish history, no data loss.

Schedules support static content (same post every time) or dynamic content via a contentUrl fetched at publish time with ?fireCount=N&scheduledAt=T query params. Pause, resume, or delete schedules at any time. DST transitions are handled automatically using IANA timezone names.

Rule types: once, daily, weekly, monthly on day, monthly last business day, yearly on month/day, quarterly last weekday, and more. Per-occurrence exceptions let you cancel, reschedule, or override the content of any individual firing.