Schedule posts for future publication with precise date/time control
Schedule posts for future publication directly via URL scheme. Perfect for automation workflows that need to plan content in advance.
statuz://schedule[?parameters]
| Parameter | Type | Description | Required | Example |
|---|---|---|---|---|
text | string | Post content (URL-encoded) | No | Hello%20World |
date | ISO8601 | Schedule date/time | No* | 2024-12-25T10:00:00Z |
timezone | string | Timezone (IANA format) | No | America/New_York |
status | string | draft or queued | No | queued |
media | string | Comma-separated file paths/URLs | No | file:///path/img.png |
files | string | Alias for media when passing raw file paths | No | /Users/me/Desktop/img.png |
thread | boolean | Create thread | No | true |
autosplit | boolean | Auto-split long posts | No | true |
quote | string | URL or ID of post to quote | No | https://x.com/... |
platforms | string | Comma-separated platforms | No | x,bluesky |
postingMode | string | defaults, allEnabled, or specific | No | specific |
xMode | string | Override posting mode for X | No | allEnabled |
blueskyMode | string | Override posting mode for Bluesky | No | defaults |
mastodonMode | string | Override posting mode for Mastodon | No | specific |
xAccounts | string | Comma-separated X account identifiers | No | work,personal |
blueskyAccounts | string | Comma-separated Bluesky account identifiers | No | user.bsky.social |
mastodonAccounts | string | Comma-separated Mastodon identifiers | No | user@fosstodon.org |
xShareWithFollowers | string | true/1/all or comma-separated IDs | No | true |
stealthMode | boolean | Schedule silently without opening UI (default: false) | No | true |
* Date is optional but recommended. If omitted with status=queued, defaults to 1 hour from now.
Saves the post without scheduling automatic publishing. The post appears in your calendar with the specified date, but requires manual publishing.
Schedules the post for automatic publishing at the specified time. If no date is provided, defaults to 1 hour from now.
URL-scheme calls default to stealthMode=false, which opens the scheduling UI. Pass stealthMode=true to insert directly into the queue without showing any windows (ideal for unattended automations).
Schedule a post for a specific date and time:
TEXT="Good morning everyone!"
DATE="2025-01-20T09:00:00Z"
ENCODED=$(printf %s "$TEXT" | jq -sRr @uri)
open "statuz://schedule?text=$ENCODED&date=$DATE&status=queued"Specify a timezone for local scheduling:
TEXT="Lunch announcement"
DATE="2025-01-20T12:00:00"
TZ="America/New_York"
ENCODED=$(printf %s "$TEXT" | jq -sRr @uri)
open "statuz://schedule?text=$ENCODED&date=$DATE&timezone=$TZ&status=queued"Omit the date to schedule 1 hour from now:
TEXT="Quick update"
ENCODED=$(printf %s "$TEXT" | jq -sRr @uri)
open "statuz://schedule?text=$ENCODED&status=queued"Schedule a post as a draft (won't auto-publish):
TEXT="Review this later"
DATE="2025-01-20T14:00:00Z"
ENCODED=$(printf %s "$TEXT" | jq -sRr @uri)
open "statuz://schedule?text=$ENCODED&date=$DATE&status=draft"Schedule a post with attached media:
TEXT="Check out these results"
DATE="2025-01-20T10:00:00Z"
MEDIA="file:///Users/me/Desktop/chart.png"
ENCODED_TEXT=$(printf %s "$TEXT" | jq -sRr @uri)
ENCODED_MEDIA=$(printf %s "$MEDIA" | jq -sRr @uri)
open "statuz://schedule?text=$ENCODED_TEXT&date=$DATE&media=$ENCODED_MEDIA&status=queued"Schedule a multi-post thread:
TEXT="Post 1: Introduction
Post 2: Main content
Post 3: Conclusion"
DATE="2025-01-20T14:00:00Z"
ENCODED=$(printf %s "$TEXT" | jq -sRr @uri)
open "statuz://schedule?text=$ENCODED&date=$DATE&thread=true&status=queued"Target specific platforms:
TEXT="Platform-specific announcement"
DATE="2025-01-20T10:00:00Z"
PLATFORMS="x,bluesky"
ENCODED=$(printf %s "$TEXT" | jq -sRr @uri)
open "statuz://schedule?text=$ENCODED&date=$DATE&platforms=$PLATFORMS&status=queued"#!/bin/bash
# Schedule tomorrow morning's post
TOMORROW=$(date -v+1d -u +"%Y-%m-%dT14:00:00Z") # 9 AM EST
TEXT="Good morning! Daily standup:
β
Yesterday: Shipped features
π Today: Bug fixes
π« Blockers: None"
ENCODED=$(printf %s "$TEXT" | jq -sRr @uri)
open "statuz://schedule?text=$ENCODED&date=$TOMORROW&status=queued"#!/bin/bash
# Schedule Friday afternoon recap
FRIDAY=$(date -v friday -u +"%Y-%m-%dT21:00:00Z") # 4 PM EST
TEXT="π Week in Review
This week we:
- Launched 3 features
- Fixed 12 bugs
- Improved performance by 25%
Have a great weekend!"
ENCODED=$(printf %s "$TEXT" | jq -sRr @uri)
open "statuz://schedule?text=$ENCODED&date=$FRIDAY&status=queued"#!/bin/bash
# Schedule a series of posts
DATES=(
"2025-01-20T09:00:00Z"
"2025-01-20T14:00:00Z"
"2025-01-20T18:00:00Z"
)
TEXTS=(
"Morning update"
"Afternoon check-in"
"Evening wrap-up"
)
for i in ${!DATES[@]}; do
TEXT="${TEXTS[$i]}"
DATE="${DATES[$i]}"
ENCODED=$(printf %s "$TEXT" | jq -sRr @uri)
open "statuz://schedule?text=$ENCODED&date=$DATE&status=queued"
sleep 1 # Avoid race conditions
done#!/bin/bash
# Schedule posts at relative times
schedule_in_hours() {
local text=$1
local hours=$2
local date=$(date -v+${hours}H -u +"%Y-%m-%dT%H:%M:%SZ")
local encoded=$(printf %s "$text" | jq -sRr @uri)
open "statuz://schedule?text=$encoded&date=$date&status=queued"
}
schedule_in_hours "1 hour from now" 1
schedule_in_hours "3 hours from now" 3
schedule_in_hours "Tomorrow same time" 24Statuz accepts ISO 8601 date/time formats:
2025-01-20T10:00:00Z
2025-01-20T10:00:00-05:00 # EST
2025-01-20T10:00:00+01:00 # CET
2025-01-20T10:00:00
Interpreted as local timezone unless timezone parameter is provided.
2025-01-20
Defaults to midnight local time.
Use IANA timezone identifiers:
#!/usr/bin/env python3
from datetime import datetime, timedelta
from urllib.parse import quote
import subprocess
# Schedule for tomorrow at 9 AM
tomorrow = datetime.now() + timedelta(days=1)
schedule_time = tomorrow.replace(hour=9, minute=0, second=0)
iso_time = schedule_time.strftime('%Y-%m-%dT%H:%M:%S')
text = "Daily update: All systems operational β
"
encoded_text = quote(text)
url = f"statuz://schedule?text={encoded_text}&date={iso_time}&timezone=America/New_York&status=queued"
subprocess.run(['open', url])#!/usr/bin/env node
const { exec } = require('child_process');
// Schedule 2 hours from now
const scheduleDate = new Date();
scheduleDate.setHours(scheduleDate.getHours() + 2);
const isoDate = scheduleDate.toISOString();
const text = "Scheduled update from automation";
const encoded = encodeURIComponent(text);
const url = `statuz://schedule?text=${encoded}&date=${isoDate}&status=queued`;
exec(`open "${url}"`);-- Schedule post via AppleScript
set postText to "Automated post from AppleScript"
set scheduleDate to "2025-01-20T14:00:00Z"
set encodedText to do shell script "printf %s " & quoted form of postText & " | jq -sRr @uri"
set theURL to "statuz://schedule?text=" & encodedText & "&date=" & scheduleDate & "&status=queued"
do shell script "open " & quoted form of theURLCommon errors and solutions:
β Error: "Invalid date format"
β
Fix: Use ISO 8601: 2025-01-20T10:00:00Z
β Error: "Schedule date must be in the future"
β
Fix: Verify your date is ahead of current time
β Error: "Unknown timezone"
β
Fix: Use IANA identifiers: America/New_York
β Error: "Text parameter is required"
β
Fix: Always include text parameter
Each platform has scheduling restrictions: