Reputifly  /  Schedules
Prototype
Ready

Scheduled tasks

A schedule is just a prompt sent automatically. Same queue, same agent, same chat — the only difference is that a clock sent it instead of you. Everything below is clickable, with realistic data.

Simulator
Jump the clock to Saturday 09:07 and watch the Pestco routine fire.
Wed 03 Sep · 15:41 SGT
Active
6
4 yours · 2 the agent's own
Next fire
2d 17h
Pestco SEO follow-up · Sat 09:07
Last 30 days
41 runs
39 ok · 1 retried · 1 failed · 0 lost

Yours

SEO follow-up — Pestco YouActive
/seo-followup {property:"pestco.reputifly.cloud", focus:"service pages"}
Every other Saturday, 09:07 SGT · next Sat 6 Sep, 09:07 · run 3 of 8
Social batch — Karen Lim YouApproval gate
/social-batch {weeks:4, days:["Mon","Thu"], images:"codex"}
Monthly, 1st at 08:23 SGT · next Wed 1 Oct, 08:23 · queues 8 posts into Facebook's own scheduler
Fortnightly fleet report YouActive
/fleet-digest {scope:"all", format:"telegram"}
Every 14 days from 20 Aug · next Wed 17 Sep, 07:11 · runs until cancelled
GSC depth export — Elementary Swimming YouLast run failed
/gsc-export {property:"elementaryswimminglessons.com", mode:"browser"}
Weekly Mondays 06:41 · Mon 1 Sep — Search Console moved its export button
Trend pass still succeeded via API, so the report shipped thinner rather than not at all. Retried once, then paused itself.

Created by the agent Self-scheduled

Re-check revision — Bespoke Blooms AgentAttempt 3 / 6
/revisions check {client:"bespokeblooms", awaiting:"client photo"}
Backoff 5m → 15m → 45m → 2h → 6h → give up · next 15:52 today · hard stop 18:00
Reason logged: "item 4 of 4 still pending — client hasn't uploaded the hero photo"
Confirm DNS propagation — cci.sg AgentAttempt 1 / 4
/migration verify {domain:"cci.sg", expect:"reputifly NS"}
Next Thu 4 Sep, 09:15 · hard deadline Sat 6 Sep, then escalates to you
Chase invoice — Ristoire AgentCompleted
Resolved on attempt 2 · closed itself 29 Aug · auto-deletes in 5 days
Why the agent's are listed separately. You always see what it armed for itself, why, which attempt it's on, and when it gives up. Nothing self-schedules invisibly, and every agent row carries a hard deadline — it can never poll forever.

You describe it. The agent writes the cron.

You said you're not typing cron expressions. Type it how you'd say it, and it shows exactly what it understood before anything is armed. Edit the sentence below — the parse updates live.

Agent understood
Skill/seo-followup
Arguments{ property: "pestco.reputifly.cloud" }
CadenceEvery 2 weeks · Saturday
Cron (SGT)7 9 * * 6
Repeat8 times, then auto-delete
First runSat 6 Sep 2026, 09:07
Tell me when it runs
One-line Telegram receipt each time it fires.
Require my approval before anything goes out
Agent prepares, then waits. Mandatory for anything posted publicly.
Alert me if a run fails or is missed
Dead-man's switch — silence stops meaning "fine".
Why minute :07 and not :00. Everyone who asks for "9am" gets 0 9, so the whole planet's jobs land on the same instant. The agent nudges to an odd minute unless you name an exact time — you never notice, the infrastructure does.

Relative timers, not just calendars

You say
"check this in 45 minutes"
→ one-shot, fires once, auto-deletes
You say
"every week from today, 4 times"
→ 7-day interval, bounded run count
You say
"first Monday monthly, forever"
→ recurring, no end, cancel any time

Setting one up, in the chat you already use

No new surface to learn. You type it in the composer like anything else.

Pestco Singapore
Ready
/schedule every other saturday morning do the SEO follow up for pestco. 8 times then stop
⏱Parsed your cadenceevery 2 weeks, Satok
🗂Checked the skill exists/seo-followup v2ok
💾Armed the routinesch_7f2aok
Armed as sch_7f2a.

Every other Saturday at 09:07 SGT, running /seo-followup against pestco.reputifly.cloud, focused on service pages. 8 runs, then it deletes itself.

Next five: 6 Sep · 20 Sep · 4 Oct · 18 Oct · 1 Nov.

I used 09:07 rather than 09:00 — everyone's "9am" jobs land on the same instant, so an odd minute is kinder to the API. Say the word if you want it exactly on the hour.

It's read-only: reads Search Console, writes a report. Nothing reaches the client, so I've left the approval gate off. Turn it on if you'd rather see each one first.
2.4s3 toolssch_7f2a
make it monthly instead
✎Updated sch_7f2acadence changedok
Done — now first Saturday monthly, 09:07. Next: 6 Sep · 4 Oct · 1 Nov.

One thing worth deciding: the run count is still 8, so it now stretches to 8 months instead of 4. Want me to drop it to 4 so it still ends this year?
1.1s1 tool
/schedulearm a recurring or one-off task
/scheduleslist everything armed
/scopewebsite scope of work
/sched
Note what it pushed back on. It didn't silently accept "monthly" — it noticed the run count now stretches to 8 months and asked. That's the difference between a cron job and an agent holding a schedule.

Saturday, 09:07 — it fires on its own

Same chat, three days later. Nobody typed anything.

Pestco Singapore
Working
Saturday 6 September
Scheduled · you armed this · sch_7f2a run 3 of 8
Run /seo-followup for pestco.reputifly.cloud, focus on service pages. Compare against the last run's decisions before recommending anything new.
📖Read last run's decisionsrun 2 · 23 Augok
📊Search Console API — trend14d, 3 pagesok
🌐Browser export — depth pass1,204 rowsok
📄Writing the reportDriverunning
Clicks 214 → 337 (+57%) over the fortnight.

The three pages I flagged last run all moved: /termite-control 14→7, /pest-inspection 22→11, /commercial unchanged at 31.

Not repeating myself: last run I recommended rewriting /commercial. It shipped 28 Aug and hasn't moved, so it's a different problem than I thought — the content is fine, it has no internal links from the service pages. That's the actual fix.

The depth pass found something the API hides: 41 queries about "bed bugs" with impressions and zero clicks. There's no bed bug page at all. That's the biggest single gap on the site.

Two recommendations in the report, both new.
2m 14s4 toolssch_7f2a#3next: 20 Sep
good. build the bed bug page next run
✎Noted on sch_7f2acarried to run 4ok
Noted on the routine, so run 4 opens with it rather than rediscovering it.

That run writes to the live site, unlike the read-only ones so far — so I've switched the approval gate on for run 4 only. You'll see the page before it goes live, then it reverts to ungated.
0.9s1 tool
Two things there are the whole design. "Not repeating myself" is the run ledger — without it, run 3 recommends the same rewrite forever. And it turned the approval gate on by itself because the work changed from reading to writing. Effects are gated, not capabilities.

The agent waking itself up

This is the part that can't work today. "I'll check back in 45 minutes" is a promise the process can't keep — the timer lives in memory owned by a service set to Restart=always.

Bespoke Blooms
Ready
do the bespoke blooms revisions
📥Pulled portal inbox4 itemsok
🚀Deployed 3 changesliveok
⏰Scheduled myself to re-check+5m · attempt 1/6ok
Three of four done and live.

Item 4 needs the hero photo they mentioned, and it isn't uploaded — the portal shows it pending, not submitted.

I've scheduled myself to re-check rather than telling you I'll remember. Attempt 1 of 6, backing off 5m → 15m → 45m → 2h → 6h, hard stop 18:00. If it's still missing then, I escalate to you instead of continuing quietly.

You'll hear from me once — when it's done, or when I give up. Not five times in between.
1m 02s3 toolsarmed sch_b41c
2 hours 41 minutes later — nothing in between
Scheduled · the agent armed this · sch_b41c attempt 4 of 6
Re-check /revisions for bespokeblooms — item 4 was awaiting a client photo.
📥Portal inboxphoto uploadedok
🚀Deployed item 4liveok
✓Closed sch_b41cresolved on 4/6ok
Photo landed at 16:18. All four items are live and the revision is closed.

For the record: attempts 1–3 found nothing and stayed silent by design. Total wait 2h 41m across four checks, not 32 polls.
48s3 toolssch_b41c closed
The guardrail that makes this safe. "If not done, check again" is an infinite loop with a credit card attached. Every self-scheduled routine carries a max attempt count, exponential backoff, and a hard deadline — and on the last attempt it escalates loudly instead of quietly continuing.
TodayWith durable schedules
"I'll check back in 45 min" — lost on the next restart, silentlyRow in sqlite, survives restarts, re-fired on boot
You remember to ask "is that done yet?"It comes back to you once, with the answer
Long tasks stall invisiblyHard deadline forces an escalation you can see

When it breaks — the case that matters most

A scheduled system you can't trust when it fails is worse than no scheduled system, because you stop checking. This is what a failure looks like.

Elementary Swimming Lessons
Ready
Scheduled · you armed this · sch_2d90 run 7
Run /gsc-export for elementaryswimminglessons.com — trend plus browser depth pass.
📊Search Console API — trend14dok
🌐Browser export — depth passselector not founderror
🔁Retried oncesame failureerror
⏸Paused the routinesch_2d90ok
The depth pass broke. Search Console moved its export button — the selector I use isn't on the page any more. Screenshot attached.

What you still got: the API trend pass worked, so the report shipped — just thinner. Clicks 89 → 96, no position changes worth acting on.

What you didn't get: the query-level breakdown, which is the part the API can't give.

I retried once, got the same failure, and paused the routine rather than let it fail silently every Monday. Two options: I re-find the selector, or drop the depth pass for this client and keep the trend-only report. Your call — I haven't guessed.
1m 31s4 toolssch_2d90 paused
Three things it did NOT do. It didn't report success. It didn't silently skip the depth pass and let the report quietly shrink every week. And it didn't retry forever — it stopped after one retry and asked. A schedule that degrades silently is how you end up trusting a number that's been wrong for a month.
Partial failure
Ship what worked
Trend pass succeeded, so the report still went out — labelled as thinner, not passed off as complete.
Silence
Never means fine
A missed run pings you. The dead-man's switch is the whole reason you can stop checking.
Repair
Ask, don't guess
One retry, then pause and surface a decision. Never an infinite loop against a changed UI.

Weekly digest — so nothing runs that you forgot about

The cheapest safety feature in the design. You'd spot a runaway loop in days instead of at the invoice.

Telegram · @reputifly_agent_bot
6 routines armed · 11 runs last week · 1 failure

Yours (4)
· SEO follow-up Pestco — Sat 09:07, run 3/8
· Social batch Karen Lim — 1 Oct, gated, waiting your approval
· Fortnightly fleet report — 17 Sep
· GSC export Elementary — failed Mon, self-paused

The agent's own (2)
· Re-check revision Bespoke Blooms — attempt 3/6, gives up 18:00
· Confirm DNS cci.sg — attempt 1/4, deadline Sat

Worth your eye: the Elementary export broke because Search Console moved its export button. The trend pass still worked, so the report shipped thinner rather than not at all. Fix the selector, or drop the depth pass for that client?
Mon 8 Sep · 08:03 SGT
Runs
11
this week, across 6 routines
Failed
1
surfaced, not swallowed
Awaiting you
1
Karen Lim social batch, gated

Commands

Same verb from the dashboard, Telegram, or inside the agent's own reasoning.

# you, in plain words — the agent writes the cron
/schedule "every other saturday morning, SEO follow-up for Pestco, 8 times"
/schedule "remind me to chase the cci.sg invoice in 3 days"
/schedule "first monday monthly, social batch for Karen — gated"

# managing
/schedules                      list everything armed
/schedules pestco               just this client
/schedule cancel sch_7f2a
/schedule pause  sch_7f2a
/schedule edit   sch_7f2a "make it weekly instead"
/schedule runnow sch_7f2a       fire once, doesn't shift the cadence

# what the AGENT calls mid-task, instead of promising
schedule_followup({
  when:         "+45m",
  skill:        "/revisions check",
  args:         { client: "bespokeblooms" },
  max_attempts: 6,
  backoff:      "exponential",
  deadline:     "+9h",
  reason:       "item 4 pending client photo"
})

The row behind all of it

CREATE TABLE followups (
  id            TEXT PRIMARY KEY,     -- sch_7f2a
  company_id    TEXT NOT NULL,
  created_by    TEXT NOT NULL,        -- 'operator' | 'agent'  ← the provenance badge
  skill         TEXT NOT NULL,
  args          TEXT NOT NULL,        -- json
  cron          TEXT,                 -- null for one-shots
  next_fire_at  INTEGER NOT NULL,
  runs_done     INTEGER DEFAULT 0,
  max_runs      INTEGER,              -- "4 times then stop"
  max_attempts  INTEGER,              -- self-check cap
  deadline_at   INTEGER,              -- hard stop, always set for agent rows
  approval_gate INTEGER DEFAULT 0,
  status        TEXT DEFAULT 'armed',
  idem_key      TEXT UNIQUE,          -- never double-fire
  reason        TEXT                  -- why the agent armed it
);
Sqlite, on disk, next to messages and ingest_keys. Not the in-memory queue — that one is documented as "lost on backend restart", which is exactly the failure that once left a chat silent forever. A row only flips to done when the agent actually picks the work up, and boot re-fires anything left hanging.
Difficulty
50/100
Framework ≈ 2 days. Each browser-driven skill after: 1–2 days, reusable across all 60 clients.
Risk — framework
35/100
Additive. Worst case a schedule doesn't fire — a missing message, not a broken system.
Risk — unattended posting
75/100
Public and irreversible, under a client's name. This is what the approval gate exists for.
Prototype · non-functional · design tokens and chat markup taken verbatim from dashboard/frontend/src/index.css, ToolBubble.tsx, SessionStatusPill.tsx
Every client name, metric and timestamp on this page is invented for the demo.