scheduler
Scheduler Skill
You can schedule tasks and manage periodic heartbeat checks.
Cron Jobs (Scheduled Tasks)
Use the alma cron CLI to manage scheduled tasks.
# List all jobs
alma cron list
# Add a one-shot reminder (fires once then auto-deletes)
# Format: alma cron add <name> <at|every|cron> <schedule> [--mode main|isolated] [--prompt "..."] [--deliver-to CHAT_ID]
alma cron add "Meeting reminder" at "20m" --mode main --prompt "Time for the meeting!"
# Add a recurring task with cron expression
alma cron add "AI news digest" cron "0 9 * * *" --mode isolated --prompt "Search and summarize today's most important AI news, concise and clear" --deliver-to CHAT_ID
# Add an interval-based task
alma cron add "Check emails" every "2h" --mode isolated --prompt "Check for important emails" --deliver-to CHAT_ID
# Update an existing job (change prompt, schedule, deliver-to, etc.)
alma cron update <job-id> [--prompt "new prompt"] [--schedule "new schedule"] [--deliver-to CHAT_ID] [--name "new name"]
# Run a job immediately
alma cron run <job-id>
# View run history
alma cron history <job-id>
# Enable/disable
alma cron enable <job-id>
alma cron disable <job-id>
# Remove
alma cron remove <job-id>
Command Format
alma cron add <name> <type> <schedule> [options]
<type>:at(one-shot),every(interval),cron(cron expression)<schedule>: depends on type — "20m"/"2026-02-11T09:00:00" for at, "30m"/"2h" for every, "0 9 * * *" for cron--mode main|isolated: main injects into existing thread, isolated creates temp thread (default: isolated)--prompt "...": the message/task for the AI to execute--deliver-to CHAT_ID: send result to Telegram (use user's chat ID from system context)--thread-id ID: which thread to inject into (for main mode)--model MODEL: model override for this job
Heartbeat (Periodic Awareness)
Heartbeat is a periodic check-in where you "wake up" and look for things that need attention.
Managing Heartbeat Config
alma heartbeat status # Check if enabled and current config
alma heartbeat config # Show current heartbeat config
alma heartbeat enable # Enable heartbeat
alma heartbeat disable # Disable heartbeat
alma heartbeat interval 30 # Set interval to 30 minutes
alma heartbeat patrol enable # Enable group patrol
alma heartbeat patrol disable # Disable group patrol
alma heartbeat patrol config # Show patrol config
Managing HEARTBEAT.md
The heartbeat reads HEARTBEAT.md from the workspace as your checklist. Edit it to change what you check on each heartbeat.
File location: HEARTBEAT.md in the active workspace root.
Example:
# Heartbeat Checklist
- Check for unhandled important messages
- If the user hasn't interacted for over 4 hours, say hello
- Check the weather once every morning
If nothing needs attention, respond with HEARTBEAT_OK (this is suppressed, user won't see it).
When to Use What
| User says | Action |
|---|---|
| "Remind me about the meeting in 20 minutes" | alma cron add "Meeting reminder" at "20m" --prompt "Time for the meeting!" --deliver-to CHAT_ID |
| "Summarize AI news for me every morning at 9am" | alma cron add "AI news" cron "0 1 * * *" --mode isolated --prompt "Search and summarize today's AI news" --deliver-to CHAT_ID (Note: cron uses UTC, 9am GMT+8 = 1am UTC) |
| "Check emails every hour" | alma cron add "Check emails" every "1h" --mode isolated --prompt "Check emails" --deliver-to CHAT_ID |
| "Stop sending me heartbeats" | alma heartbeat disable |
| "Also check the weather during heartbeats" | Edit HEARTBEAT.md, add weather check item |
| "Cancel that daily news task" | alma cron list → alma cron remove <id> |
| "Also @ me for update reminders" | alma cron list → alma cron update <id> --prompt "new prompt with @user" |
| "Change the reminder to once per hour" | alma cron update <id> --schedule "1h" |
Important — deliver-to Target Selection (CRITICAL)
--deliver-todetermines WHERE the cron job result gets sent. Choose the RIGHT target:- If the task is about reminding/notifying a GROUP → use the GROUP's chatId (negative number like -1001886218691)
- If the task is about reminding/notifying the USER personally → use the user's chatId
- If the user says "remind in the group" / "send to the group" → deliver-to MUST be the group chatId, NOT the user's private chatId
- If the user says "remind me" / "tell me" → deliver-to is the user's chatId
- Use
alma group listto find group chatIds if needed - For isolated tasks that should send results somewhere, ALWAYS include
--deliver-to - Cron expressions use UTC unless otherwise noted — adjust for user's timezone
- One-shot
--atjobs auto-delete after running
More from ninehills/skills
file-manager
Find, organize, and manage files on the user's computer. Search by name, type, size, or date. Move, rename, compress, and clean up files.
125self-reflection
Daily self-reflection and personal growth. Triggered by heartbeat at end of day. Review the day's experiences, extract lessons, update personality, and write a diary entry.
124send-file
Send files, photos, audio, or videos to the current chat. MUST use whenever you need to deliver any file to the user. Covers: sending images, selfies, generated art, documents, music, videos, voice messages, screenshots, or ANY file the user asks to see. Triggers: 'send it to me', 'send it over', 'let me see', 'send me', 'show me', 'send photo', 'send file', sharing any file path. NEVER paste raw file paths in text — ALWAYS use this skill to send files.
117news-aggregator-skill
Comprehensive news aggregator that fetches, filters, and deeply analyzes real-time content from 8 major sources: Hacker News, GitHub Trending, Product Hunt, 36Kr, Tencent News, WallStreetCN, V2EX, and Weibo. Best for 'daily scans', 'tech news briefings', 'finance updates', and 'deep interpretations' of hot topics.
99tvscreener
Query TradingView screener data for HK, A-share, A-share ETF, and US symbols with deepentropy/tvscreener. Use for stock lookup, technical indicators (price/change/RSI/MACD/volume), symbol filtering, and custom field/filter-based market queries.
65screenshot
Take screenshots of the screen using macOS screencapture. Use when users ask to see the screen, debug UI, or capture what's displayed. Resize before returning to avoid blowing up model context.
38