Scheduled-PR

Documentation

Commands

Comment on a pull request. You need write access to the repository — a comment from anyone else is refused.

CommandEffect
/schedule friday 18:00Merge at that time, in your timezone
/schedule 2026-08-20 18:00 Europe/BerlinExplicit date and zone
/schedule 2026-08-20T16:00ZAn absolute instant
/schedule in 3 hoursRelative to now
/schedule friday 18:00 squashChoose the merge method
/reschedule tomorrow 09:00Move an existing schedule
/unscheduleCancel it
/schedule statusShow the current schedule
/schedule helpThis table, on the pull request

A bare time is read in your own timezone, learned from the dashboard or from any command where you named one. Failing that, the repository’s configured zone. Commands inside code fences are ignored, so you can write about them without triggering them.

Repository configuration

.scheduled-pr.yml

Optional. Commit it to the root of your repository, on the default branch. Every key has a default, so a file with one line is valid. An invalid file does not disable scheduling — the defaults apply and the pull request comment says what was wrong.

version: 1
timezone: Europe/Berlin
default_merge_method: squash      # merge | squash | rebase

on_failure: retry                 # retry | fail | wait-for-checks
retry:
  max_attempts: 10
  backoff: exponential          # exponential | fixed
  give_up_after: 2h

on_new_commits: keep              # keep | cancel

# Merges happen only inside these. Declare none and any time is allowed.
allowed:
  - { days: [mon, tue, wed, thu], from: "18:00", to: "22:00" }

# Applied on top. Blocked always beats allowed.
blackout:
  - { days: [fri], after: "15:00" }
  - { days: [sat, sun] }

require:
  checks_green: true
  approvals: 1
  no_changes_requested: true

max_lead_time: 90d
KeyDefaultWhat it does
timezoneUTCZone for bare times, when the person has none of their own
default_merge_methodmergeUsed when a command names no method. Must be one the repository allows
on_failureretryretry backs off; fail gives up at once; wait-for-checks waits for a check suite to finish
retry.max_attempts10Attempts before giving up and saying why
retry.give_up_after2hWall-clock limit, whichever comes first
on_new_commitskeepkeep follows the new head; cancel drops the schedule when commits land
allowedany timeMerges happen only inside these windows. Both bounds required; a window may run past midnight
blackoutnoneApplied on top of allowed. Blocked always beats allowed
require.checks_greentrueRefuse to merge while checks are red or running
require.approvals0Minimum approving reviews
require.no_changes_requestedtrueRefuse while a reviewer has requested changes
max_lead_time90dHow far ahead a merge may be scheduled

The file is re-read every few minutes, so a change takes effect without reinstalling anything.

What happens at the scheduled time

  1. The pull request is read again from GitHub. Nothing cached is trusted.
  2. It must be open, not a draft, free of conflicts, passing whatever you require, and outside any blackout window.
  3. The merge is pinned to the current commit, so a push landing mid-merge is rejected rather than merged unseen.
  4. If it cannot merge, the comment is edited with the reason in GitHub’s own words, the next attempt time, and when it will stop trying.

A closed or already-merged pull request cancels the schedule quietly. Conflicts, red required checks, and a merge method the repository forbids all stop it immediately — retrying those would never succeed.

What counts against your plan

One unique pull request scheduled within a calendar month. Rescheduling the same pull request as often as you like still counts once. Cancelling does not give the unit back — otherwise the free plan would be unlimited to anyone willing to schedule and cancel.

Scheduled-PR — merge pull requests on your schedule