skills/organizer/SKILL.md
Personal planner for reminders, calendar events, and tasks. Use when the user wants to: be reminded of something, plan an event/appointment, or manage personal tasks.
npx skillsauth add cutec-chris/PawLia organizerInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Obsidian-native storage for all time-related and planning operations. The workspace directory functions as an Obsidian vault:
workspace/calendar/<YYYY-MM-DD> <title>.md (Full Calendar plugin format)workspace/tasks.md (Obsidian Tasks emoji format)workspace/tasks.md (scheduled tasks with 🔔 prefix)automations/jobs.json (scheduler-internal, not in vault)Run the script with the appropriate subcommand. The --user-id and --session-dir arguments are automatically provided via environment variables — do NOT pass them manually.
For quick reminders like "remind me in 10 minutes" or "remind me tomorrow at 9".
Reminders are stored as scheduled tasks in tasks.md with a 🔔 prefix.
Add a reminder:
python <scripts_dir>/organizer.py add-reminder --fire-at "<time>" --message "<message>" [--label "<label>"] [--recurrence none|daily|weekly|monthly]
--fire-at: ISO8601 datetime or relative time: "10m", "2h", "1d"--recurrence: optional, for repeating reminders (uses 🔁 emoji)Weekday-specific recurrences (e.g. monday,wednesday, mo,mi, MO/WE, or an RRULE like FREQ=WEEKLY;BYDAY=MO,WE) are not stored as tasks.md reminders — the reminder recurrence engine only knows daily/weekly/monthly and would otherwise fire them daily. Such reminders are automatically redirected to a recurring calendar event (workspace/calendar/) whose reminders fire on every matching weekday. The script reports this with "redirected_to_event": true. For full control over location, end time, or multiple lead-time reminders, use add-event directly with --recurrence weekly --recurrence-days "MO,WE".
List pending reminders:
python <scripts_dir>/organizer.py list-reminders
Delete a reminder:
python <scripts_dir>/organizer.py delete-reminder --reminder-id "<title substring>"
Events are stored as individual Markdown files with Full Calendar compatible YAML frontmatter.
Add an event:
python <scripts_dir>/organizer.py add-event --title "<title>" --start "<ISO8601>" [--end "<ISO8601>"] [--description "<desc>"] [--location "<loc>"] [--reminders '<JSON>'] [--checklist '<JSON>'] [--recurrence none|daily|weekly|monthly|yearly] [--recurrence-days "TU,TH"] [--recurrence-until YYYY-MM-DD] [--recurrence-count N]
Recurring events are first-class calendar events. Use --recurrence weekly for weekly appointments instead of creating scheduler jobs. For weekly events, --recurrence-days accepts RRULE day codes (MO,TU,WE,TH,FR,SA,SU) or German/English weekday names. The event file stores both FullCalendar-compatible frontmatter (type: recurring, daysOfWeek, startRecur, endRecur) and an rrule field for CalDAV/Radicale export.
Use --reminders for normal user-facing event reminders like "40 minutes before Parkour". These are stored in the event frontmatter as reminders and also translated into scheduler-compatible checklist items internally so they actually fire.
Event reminder format:
[
{
"minutes_before": 40,
"message": "In 40 Minuten: Parcours beginnt um 17:00 Uhr.",
"notify": true
}
]
minutes_before: whole minutes before the event startmessage: optional notification textnotify: optional, defaults to trueThe --checklist parameter is for automation and preparation steps stored in frontmatter. Each item can reference a script that the system executes automatically at the right time.
Checklist item format:
[
{
"script": "route_plan.py",
"trigger": "relative",
"trigger_offset": "-90m",
"params": {"from": "home", "to": "Destination"},
"notify": true
},
{
"script": "",
"trigger": "relative",
"trigger_offset": "-1d",
"message": "Morgen: {title} in {location}. Unterlagen vorbereiten!"
}
]
trigger: "relative" (offset from event start), "on_create" (immediately), "absolute" (fixed time)trigger_offset: e.g. "-2h", "-1d", "-30m" (negative = before event)script: path to automation scriptmessage: plain text notification (when no script needed)params: passed to the script as AUTOMATION_PARAMS env var (JSON)notify: whether to send the result to the user (default: true)IMPORTANT:
--reminders.--checklist only for automation/preparation steps or advanced scripted workflows.--reminders for the user notification and --checklist for preparation steps when useful.List events:
python <scripts_dir>/organizer.py list-events [--limit <n>]
Delete an event:
python <scripts_dir>/organizer.py delete-event --event-id "<filename>"
The --event-id is the filename (with or without .md), e.g. "2026-04-10 Teammeeting".
Tasks are stored in Obsidian Tasks emoji format in workspace/tasks.md.
Add a task:
python <scripts_dir>/organizer.py add-task --title "<title>" [--due-date "YYYY-MM-DD"] [--priority highest|high|medium|low|lowest] [--description "<desc>"] [--reminders '<JSON>']
Priority maps to Obsidian Tasks emojis: 🔺 highest, ⏫ high, 🔼 medium, 🔽 low, ⏬ lowest.
The --reminders parameter stores reminder rules in scheduler_state.json (outside the vault). Format:
[
{"offset": "-3d", "message": "In 3 Tagen fällig: {title}"},
{"offset": "-1d", "message": "Morgen fällig: {title}"},
{"offset": "-2h", "message": "In 2 Stunden fällig: {title}"}
]
IMPORTANT: When creating tasks with a due date, ALWAYS add appropriate reminders based on priority:
List tasks:
python <scripts_dir>/organizer.py list-tasks [--status pending|completed|all] [--limit <n>]
Complete a task:
python <scripts_dir>/organizer.py complete-task --task-id "<id or title substring>"
Delete a task:
python <scripts_dir>/organizer.py delete-task --task-id "<id or title substring>"
Jobs are stored in automations/jobs.json (outside the vault) since they are scheduler-internal automation config. Jobs contain natural-language instructions that run through the normal agent/skill dispatcher when due.
Add a job:
python <scripts_dir>/organizer.py add-job --name "<name>" --instruction "<instruction>" --schedule "<schedule>" [--no-notify | --notify-on-error]
--no-notify: kein Output im Feed (stille Jobs)--notify-on-error: Output nur bei Fehler im Feed (z. B. für git-Push-Jobs)Schedule formats:
"16:00" — daily at 16:00"interval:30m" — every 30 minutes"interval:2h" — every 2 hours"weekly:DOW:HH:MM" — weekly on day-of-week (0=Mon)"monthly:DD:HH:MM" — monthly on dayList jobs:
python <scripts_dir>/organizer.py list-jobs
Delete a job:
python <scripts_dir>/organizer.py delete-job --job-id "<id>"
Toggle a job (enable/disable):
python <scripts_dir>/organizer.py toggle-job --job-id "<id>"
The script outputs JSON. Parse it and report the result naturally to the user. On error, report the error field.
tools
Sets up SSH-based git push for the Pawlia workspace, manages the workspace git remote, and creates automation jobs for regular pushes. Use when the user wants to: sync the workspace to an external git repo, set up git push, configure a git remote for the workspace, fix git push errors (SSH key, host key, authentication), check push status. Triggers on phrases like "workspace git", "git push einrichten", "ssh key für git", "workspace remote", "git sync", "push workspace".
development
Create new PawLia skills from scratch, improve or audit existing ones. Also manages credentials for skills — store, check, list and delete API keys and tokens that other skills need at runtime (skills themselves only see the runtime `CRED_*` env vars, never the store). When a skill has bugs or needs changes, delegate the full task here — describe the problem and let the skill-creator autonomously diagnose and fix it. Do not pre-read the skill files yourself. Use when the user wants to: create a new skill, scaffold a skill directory, manage skill credentials, improve or review an existing skill, validate a SKILL.md against the spec, package a skill for distribution. Triggers on phrases like "create a skill", "new skill", "store api key", "add credentials", "improve this skill", "validate skill", "audit skill", "scaffold a skill".
development
Perform web searches using a SearXNG instance. Use when the user asks for web search results, current information, news, or wants to find online resources.
development
Collect web sources into named research projects and answer questions from them. Scrapes URLs (recursive crawl, PDFs, YouTube transcripts) into a project, then answers questions grounded in the gathered sources via semantic/keyword search. Use for "research X", building a sourced dossier on a topic, or querying previously gathered material — as opposed to a one-shot web search (perplexica/searxng). Commands: create, list, add, query, delete, rename (syntax in the skill instructions).