<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>AI Agents · Qijun Han</title><link>https://sergiudm.github.io/tags/ai-agents/</link><description>Qijun Han, first-year PhD student in the VLAA Lab at UC Santa Cruz, working on computer-use agents and multimodal models.</description><generator>Hugo</generator><language>en-US</language><managingEditor>Qijun Han</managingEditor><lastBuildDate>Tue, 10 Nov 2026 09:00:00 +0000</lastBuildDate><atom:link href="https://sergiudm.github.io/tags/ai-agents/index.xml" rel="self" type="application/rss+xml"/><item><title>Time Management, Revisited</title><link>https://sergiudm.github.io/p/time-management/</link><pubDate>Tue, 10 Nov 2026 09:00:00 +0000</pubDate><guid>https://sergiudm.github.io/p/time-management/</guid><description>&lt;p class="lead"&gt;Last December I wrote about a small Python daemon that nagged me through the day. The idea behind it still holds: if your schedule is a set of plain files, you can automate the boring parts without giving up control. Almost everything else has been rebuilt. &lt;strong&gt;&lt;a href="https://github.com/AutoPhd-org/schedule-everything" rel="noopener"&gt;Schedule Everything&lt;/a&gt;&lt;/strong&gt; is now one Rust binary called &lt;code&gt;rmd&lt;/code&gt;, it has a browser workspace, and the most tedious part of planning, turning a messy week into a schedule, is something I now hand to my AI agent. This is the post rewritten to match.&lt;/p&gt;&#10;&lt;h2 id="the-problems-havent-changed"&gt;The problems haven&amp;rsquo;t changed&lt;a class="anchor" href="#the-problems-havent-changed" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Last time I listed what kept going wrong when I tried to plan. Every item is still true, so here is the same list next to what the tool does about each one today.&lt;/p&gt;&#10;&lt;div class="table-wrap"&gt;&#10;&lt;table&gt;&#10; &lt;thead&gt;&#10; &lt;tr&gt;&#10; &lt;th&gt;What kept going wrong&lt;/th&gt;&#10; &lt;th&gt;What Schedule Everything does now&lt;/th&gt;&#10; &lt;/tr&gt;&#10; &lt;/thead&gt;&#10; &lt;tbody&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;Too many deadlines and small tasks to remember&lt;/td&gt;&#10; &lt;td&gt;Tasks with an importance from 1 to 10, deadlines on a year calendar, and fixed times each day when urgent work is checked and announced&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;Deciding what to do next instead of doing it&lt;/td&gt;&#10; &lt;td&gt;My agent assigns tasks to today&amp;rsquo;s focus blocks, and the alarm at the start of each block says which task it is for&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;Planned versus actual progress&lt;/td&gt;&#10; &lt;td&gt;Everything I finish, cancel, or give up lands in &lt;strong&gt;Activity&lt;/strong&gt;, and weekly and monthly reports summarise it&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;Unexpected work wrecking the whole plan&lt;/td&gt;&#10; &lt;td&gt;A plan only ever changes &lt;em&gt;today&lt;/em&gt;, and &lt;strong&gt;P mode&lt;/strong&gt; turns the day into a task board without the clock&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;Unfinished tasks piling up until I abandon the system&lt;/td&gt;&#10; &lt;td&gt;A &lt;strong&gt;workload&lt;/strong&gt; number that shows how heavy the pile really is, postponement, and an honest way to give up on a task&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;I also wanted three things. Habit tracking is a &lt;code&gt;habits.toml&lt;/code&gt; file, &lt;code&gt;rmd track&lt;/code&gt;, and a check-in prompt every night. Reviews are a weekly overview in the browser plus PDF reports that generate themselves on Sunday evening and on the first of the month. And the reminders are still the kind you can&amp;rsquo;t swipe away: a sound that repeats every few seconds and a dialog that stays up until you answer it.&lt;/p&gt;&#10;&lt;h2 id="what-changed-in-a-year"&gt;What changed in a year&lt;a class="anchor" href="#what-changed-in-a-year" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;div class="stats "&gt;&#10; &#10;&lt;div class="stat stat--blue"&gt;&#10; &lt;div class="stat__value" data-count&gt;1&lt;/div&gt;&#10; &lt;div class="stat__label"&gt;binary&lt;/div&gt;&lt;div class="stat__note"&gt;CLI, reminder service, browser workspace, PDF reports&lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="stat stat--purple"&gt;&#10; &lt;div class="stat__value" data-count&gt;3&lt;/div&gt;&#10; &lt;div class="stat__label"&gt;agent skills&lt;/div&gt;&lt;div class="stat__note"&gt;build-schedule, plan-day, suggest-tasks&lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="stat stat--green"&gt;&#10; &lt;div class="stat__value" data-count&gt;5&lt;/div&gt;&#10; &lt;div class="stat__label"&gt;workspace pages&lt;/div&gt;&lt;div class="stat__note"&gt;Overview, Schedule, Routines &amp;amp; deadlines, Activity, Settings&lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="stat stat--amber"&gt;&#10; &lt;div class="stat__value" data-count&gt;0&lt;/div&gt;&#10; &lt;div class="stat__label"&gt;AI calls made by the app&lt;/div&gt;&lt;div class="stat__note"&gt;your agent talks to its own model provider&lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;The Python implementation is gone. Before I deleted it, I recorded its behaviour as golden test cases (CLI output, browser API responses, and the data files it writes), and the Rust port replays them on every &lt;code&gt;cargo test&lt;/code&gt;.&lt;span class="sidenote-wrap"&gt;&lt;label for="sn-1" class="sidenote-ref" aria-label="Show note"&gt;&lt;/label&gt;&lt;input type="checkbox" id="sn-1" class="sidenote-toggle"&gt;&lt;span class="sidenote" role="note"&gt;So the rewrite isn&amp;rsquo;t &amp;ldquo;inspired by&amp;rdquo; the old tool; it is checked against it, down to the column widths of the task table.&lt;/span&gt;&lt;/span&gt; Everything stays local: the routine is TOML, tasks and history are JSON, and there is no account and no server.&lt;/p&gt;&#10;&lt;h2 id="how-it-works-now"&gt;How it works now&lt;a class="anchor" href="#how-it-works-now" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;figure class="figure wide"&gt;&lt;img src="https://sergiudm.github.io/p/time-management/how-it-works.svg" alt="You ask your AI coding agent; the Schedule Everything plugin runs rmd commands; rmd validates and writes local files that drive reminders and the browser workspace" loading="lazy" decoding="async" data-zoom="/p/time-management/how-it-works.svg"&gt;&lt;figcaption&gt;The agent does the thinking, &lt;code&gt;rmd&lt;/code&gt; does the deterministic work, and local files drive everything else.&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;The most important design decision is the split of labour. The agent plugin&amp;rsquo;s skills ask questions and make judgment calls. &lt;code&gt;rmd&lt;/code&gt; does the parts that must be exactly right: &lt;code&gt;rmd check&lt;/code&gt; validates a configuration and reports where its files live, &lt;code&gt;rmd sync --json&lt;/code&gt; describes today&amp;rsquo;s focus blocks and open tasks, and &lt;code&gt;rmd sync --apply&lt;/code&gt; saves a plan. The reminder service, started at login, checks the schedule every minute and turns the files into alarms, and &lt;code&gt;rmd web&lt;/code&gt; shows the same files in a browser.&lt;/p&gt;&#10;&lt;p&gt;Here is what happens when I ask for a plan in the morning:&lt;/p&gt;&#10;&lt;figure class="diagram wide"&gt;&#10; &lt;div class="mermaid" data-source="sequenceDiagram&#10; actor Me&#10; participant Agent as AI agent · plan-day&#10; participant rmd&#10; participant Service as Reminder service&#10; Me-&amp;gt;&amp;gt;Agent: Plan my focus blocks for today&#10; Agent-&amp;gt;&amp;gt;rmd: rmd sync --json&#10; rmd--&amp;gt;&amp;gt;Agent: free slots, open tasks, deadlines&#10; Agent-&amp;gt;&amp;gt;Me: Proposed plan, ordered by time&#10; Me-&amp;gt;&amp;gt;Agent: Swap the 14:00 and 15:00 blocks&#10; Agent-&amp;gt;&amp;gt;rmd: rmd sync --apply -&#10; rmd-&amp;gt;&amp;gt;rmd: save today&amp;#39;s plan (an overlay file)&#10; rmd--&amp;gt;&amp;gt;Service: picked up without a restart&#10; Service-&amp;gt;&amp;gt;Me: 14:00 alarm names the block&amp;#39;s task" role="img" aria-label="Sequence diagram: I ask the agent to plan my day; it reads rmd sync --json, proposes a plan, I adjust it, it saves the plan with rmd sync --apply, and the reminder service announces each block&amp;#39;s task."&gt;&lt;pre class="mermaid__fallback"&gt;sequenceDiagram&#10; actor Me&#10; participant Agent as AI agent · plan-day&#10; participant rmd&#10; participant Service as Reminder service&#10; Me-&amp;gt;&amp;gt;Agent: Plan my focus blocks for today&#10; Agent-&amp;gt;&amp;gt;rmd: rmd sync --json&#10; rmd--&amp;gt;&amp;gt;Agent: free slots, open tasks, deadlines&#10; Agent-&amp;gt;&amp;gt;Me: Proposed plan, ordered by time&#10; Me-&amp;gt;&amp;gt;Agent: Swap the 14:00 and 15:00 blocks&#10; Agent-&amp;gt;&amp;gt;rmd: rmd sync --apply -&#10; rmd-&amp;gt;&amp;gt;rmd: save today&amp;#39;s plan (an overlay file)&#10; rmd--&amp;gt;&amp;gt;Service: picked up without a restart&#10; Service-&amp;gt;&amp;gt;Me: 14:00 alarm names the block&amp;#39;s task&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;The plan-day skill, end to end. The agent proposes; nothing is saved until I agree.&lt;/figcaption&gt;&#10;&lt;/figure&gt;&#10;&lt;h2 id="my-week-is-still-a-file"&gt;My week is still a file&lt;a class="anchor" href="#my-week-is-still-a-file" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;The building blocks are the same as last year, and they are still the core of the system. In &lt;code&gt;settings.toml&lt;/code&gt;, a &lt;strong&gt;time block&lt;/strong&gt; is a reusable length of time with an alarm at the start and at the end, and a &lt;strong&gt;time point&lt;/strong&gt; is a single reminder with a message:&lt;/p&gt;&#10;&lt;div class="codeblock" data-lang="toml"&gt;&#10; &lt;div class="codeblock__bar"&gt;&#10; &lt;span class="codeblock__label"&gt;&lt;svg class="icon icon--code" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M8 7l-5 5 5 5M16 7l5 5-5 5M13.5 4l-3 16"/&gt;&lt;/svg&gt;settings.toml (excerpt)&lt;/span&gt;&#10; &lt;button class="copy-btn" type="button" aria-label="Copy code"&gt;&lt;svg class="icon icon--copy" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;rect x="9" y="9" width="11" height="11" rx="2"/&gt;&lt;path d="M5 15V6a2 2 0 0 1 2-2h8"/&gt;&lt;/svg&gt;&lt;span&gt;Copy&lt;/span&gt;&lt;/button&gt;&#10; &lt;/div&gt;&#10; &lt;div class="highlight" title="settings.toml (excerpt)"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;alarm_interval&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="c"&gt;# seconds between repeats of the alarm sound&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;max_alarm_duration&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt; &lt;span class="c"&gt;# stop ringing after five minutes&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;skip_days&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;sunday&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;language&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;en&amp;#34;&lt;/span&gt; &lt;span class="c"&gt;# also &amp;#34;zh&amp;#34;, &amp;#34;es&amp;#34;, or &amp;#34;ko&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;time_blocks&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c"&gt;# minutes&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;pomodoro&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;potato&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;meeting&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;time_points&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c"&gt;# one reminder each&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;lunch_time&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Lunch 🍱&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;go_to_bed&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Time for bed 😴&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c"&gt;# fixed daily checks and reviews&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;daily_urgent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;08:31&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;14:01&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;17:31&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;21:31&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;ddl_urgent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;08:32&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;14:02&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;17:32&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;22:32&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;habit_prompt&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;23:50&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;weekly_review&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;sunday 20:00&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;The week lives in two files, &lt;code&gt;odd_weeks.toml&lt;/code&gt; and &lt;code&gt;even_weeks.toml&lt;/code&gt;, picked by ISO week number so that alternating timetables just work. A &lt;code&gt;[common]&lt;/code&gt; section applies to every day, and a weekday entry at the same time wins. A block can carry its own title:&lt;/p&gt;&#10;&lt;div class="codeblock" data-lang="toml"&gt;&#10; &lt;div class="codeblock__bar"&gt;&#10; &lt;span class="codeblock__label"&gt;&lt;svg class="icon icon--code" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M8 7l-5 5 5 5M16 7l5 5-5 5M13.5 4l-3 16"/&gt;&lt;/svg&gt;odd_weeks.toml&lt;/span&gt;&#10; &lt;button class="copy-btn" type="button" aria-label="Copy code"&gt;&lt;svg class="icon icon--copy" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;rect x="9" y="9" width="11" height="11" rx="2"/&gt;&lt;path d="M5 15V6a2 2 0 0 1 2-2h8"/&gt;&lt;/svg&gt;&lt;span&gt;Copy&lt;/span&gt;&lt;/button&gt;&#10; &lt;/div&gt;&#10; &lt;div class="highlight" title="odd_weeks.toml"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;wednesday&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;09:00&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;pomodoro&amp;#34;&lt;/span&gt; &lt;span class="c"&gt;# alarms at 09:00 and 09:25&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;14:00&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;block&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;meeting&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Advisor 1:1&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;common&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c"&gt;# every day&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;12:30&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;lunch_time&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;20:00&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;potato&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Untitled &lt;code&gt;pomodoro&lt;/code&gt; and &lt;code&gt;potato&lt;/code&gt; blocks&lt;span class="sidenote-wrap"&gt;&lt;label for="sn-2" class="sidenote-ref" aria-label="Show note"&gt;&lt;/label&gt;&lt;input type="checkbox" id="sn-2" class="sidenote-toggle"&gt;&lt;span class="sidenote" role="note"&gt;In my config a &lt;em&gt;potato&lt;/em&gt; is a 50-minute block, the pomodoro&amp;rsquo;s bigger sibling.&lt;/span&gt;&lt;/span&gt; are the interesting ones: they are focus slots, and a daily plan fills them with real tasks. The plan is an overlay for today only. My weekly files never change.&lt;/p&gt;&#10;&lt;figure class="figure wide"&gt;&lt;img src="https://sergiudm.github.io/p/time-management/todays-schedule.svg" alt="How today’s schedule is built: this week’s file is chosen by ISO week, merged with the common entries, and today’s plan adds task titles to untitled focus blocks" loading="lazy" decoding="async" data-zoom="/p/time-management/todays-schedule.svg"&gt;&lt;figcaption&gt;How today&amp;rsquo;s schedule is built: this week&amp;rsquo;s file, plus &lt;code&gt;[common]&lt;/code&gt;, plus today&amp;rsquo;s plan.&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Put together, a Tuesday from the template configuration looks like this, with three blocks planned:&lt;/p&gt;&#10;&lt;figure class="timeline wide"&gt;&lt;p class="timeline__title"&gt;A Tuesday: open and planned focus blocks, one-off reminders, and fixed checks&lt;/p&gt;&#10; &lt;div class="timeline__grid"&gt;&#10; &lt;div class="timeline__lines" aria-hidden="true"&gt;&lt;span style="left: 0.000%"&gt;&lt;/span&gt;&lt;span style="left: 12.500%"&gt;&lt;/span&gt;&lt;span style="left: 25.000%"&gt;&lt;/span&gt;&lt;span style="left: 37.500%"&gt;&lt;/span&gt;&lt;span style="left: 50.000%"&gt;&lt;/span&gt;&lt;span style="left: 62.500%"&gt;&lt;/span&gt;&lt;span style="left: 75.000%"&gt;&lt;/span&gt;&lt;span style="left: 87.500%"&gt;&lt;/span&gt;&lt;span style="left: 100.000%"&gt;&lt;/span&gt;&lt;/div&gt;&#10; &lt;div class="timeline__row" style="--c: var(--series-1)"&gt;&#10; &lt;span class="timeline__kind"&gt;open blocks&lt;/span&gt;&#10; &lt;div class="timeline__track"&gt;&#10; &lt;span class="timeline__bar" tabindex="0" style="left: 3.125%; width: 5.208%" data-tip="08:30–09:20 · potato"&gt;&lt;span&gt;potato&lt;/span&gt;&lt;/span&gt;&#10; &lt;span class="timeline__bar" tabindex="0" style="left: 9.375%; width: 5.208%" data-tip="09:30–10:20 · potato"&gt;&lt;span&gt;potato&lt;/span&gt;&lt;/span&gt;&#10; &lt;span class="timeline__bar" tabindex="0" style="left: 15.625%; width: 5.208%" data-tip="10:30–11:20 · potato"&gt;&lt;span&gt;potato&lt;/span&gt;&lt;/span&gt;&#10; &lt;span class="timeline__bar" tabindex="0" style="left: 21.875%; width: 5.208%" data-tip="11:30–12:20 · potato"&gt;&lt;span&gt;potato&lt;/span&gt;&lt;/span&gt;&#10; &lt;span class="timeline__bar" tabindex="0" style="left: 50.000%; width: 5.208%" data-tip="16:00–16:50 · potato"&gt;&lt;span&gt;potato&lt;/span&gt;&lt;/span&gt;&#10; &lt;span class="timeline__bar" tabindex="0" style="left: 56.250%; width: 5.208%" data-tip="17:00–17:50 · potato"&gt;&lt;span&gt;potato&lt;/span&gt;&lt;/span&gt;&#10; &lt;span class="timeline__bar" tabindex="0" style="left: 78.125%; width: 2.604%" data-tip="20:30–20:55 · pomodoro"&gt;&lt;span&gt;pomodoro&lt;/span&gt;&lt;/span&gt;&#10; &lt;span class="timeline__bar" tabindex="0" style="left: 84.375%; width: 2.604%" data-tip="21:30–21:55 · pomodoro"&gt;&lt;span&gt;pomodoro&lt;/span&gt;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="timeline__row" style="--c: var(--series-2)"&gt;&#10; &lt;span class="timeline__kind"&gt;planned&lt;/span&gt;&#10; &lt;div class="timeline__track"&gt;&#10; &lt;span class="timeline__bar" tabindex="0" style="left: 37.500%; width: 5.208%" data-tip="14:00–14:50 · Rerun the OSWorld ablation"&gt;&lt;span&gt;Rerun the OSWorld ablation&lt;/span&gt;&lt;/span&gt;&#10; &lt;span class="timeline__bar" tabindex="0" style="left: 43.750%; width: 5.208%" data-tip="15:00–15:50 · Draft the related-work section"&gt;&lt;span&gt;Draft the related-work section&lt;/span&gt;&lt;/span&gt;&#10; &lt;span class="timeline__bar" tabindex="0" style="left: 71.875%; width: 5.208%" data-tip="19:30–20:20 · Leg day"&gt;&lt;span&gt;Leg day&lt;/span&gt;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="timeline__row" style="--c: var(--series-3)"&gt;&#10; &lt;span class="timeline__kind"&gt;reminders&lt;/span&gt;&#10; &lt;div class="timeline__track"&gt;&#10; &lt;span class="timeline__point" tabindex="0" style="left: 33.333%" data-tip="13:20 · Nap time"&gt;&lt;/span&gt;&#10; &lt;span class="timeline__point" tabindex="0" style="left: 98.438%" data-tip="23:45 · Wrap up the day"&gt;&lt;/span&gt;&#10; &lt;span class="timeline__point" tabindex="0" style="left: 99.479%" data-tip="23:55 · Time for bed"&gt;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="timeline__row" style="--c: var(--series-4)"&gt;&#10; &lt;span class="timeline__kind"&gt;checks&lt;/span&gt;&#10; &lt;div class="timeline__track"&gt;&#10; &lt;span class="timeline__point" tabindex="0" style="left: 3.229%" data-tip="08:31 · Urgent tasks"&gt;&lt;/span&gt;&#10; &lt;span class="timeline__point" tabindex="0" style="left: 37.604%" data-tip="14:01 · Urgent tasks"&gt;&lt;/span&gt;&#10; &lt;span class="timeline__point" tabindex="0" style="left: 59.479%" data-tip="17:31 · Urgent tasks"&gt;&lt;/span&gt;&#10; &lt;span class="timeline__point" tabindex="0" style="left: 84.479%" data-tip="21:31 · Urgent tasks"&gt;&lt;/span&gt;&#10; &lt;span class="timeline__point" tabindex="0" style="left: 3.333%" data-tip="08:32 · Deadlines"&gt;&lt;/span&gt;&#10; &lt;span class="timeline__point" tabindex="0" style="left: 37.708%" data-tip="14:02 · Deadlines"&gt;&lt;/span&gt;&#10; &lt;span class="timeline__point" tabindex="0" style="left: 59.583%" data-tip="17:32 · Deadlines"&gt;&lt;/span&gt;&#10; &lt;span class="timeline__point" tabindex="0" style="left: 90.833%" data-tip="22:32 · Deadlines"&gt;&lt;/span&gt;&#10; &lt;span class="timeline__point" tabindex="0" style="left: 97.396%" data-tip="23:35 · Daily summary"&gt;&lt;/span&gt;&#10; &lt;span class="timeline__point" tabindex="0" style="left: 98.958%" data-tip="23:50 · Habit check-in"&gt;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="timeline__axis" aria-hidden="true"&gt;&#10; &lt;span class="timeline__kind"&gt;&lt;/span&gt;&#10; &lt;div class="timeline__track"&gt;&#10; &lt;span class="timeline__tick" style="left: 0.000%"&gt;08:00&lt;/span&gt;&#10; &lt;span class="timeline__tick" style="left: 12.500%"&gt;10:00&lt;/span&gt;&#10; &lt;span class="timeline__tick" style="left: 25.000%"&gt;12:00&lt;/span&gt;&#10; &lt;span class="timeline__tick" style="left: 37.500%"&gt;14:00&lt;/span&gt;&#10; &lt;span class="timeline__tick" style="left: 50.000%"&gt;16:00&lt;/span&gt;&#10; &lt;span class="timeline__tick" style="left: 62.500%"&gt;18:00&lt;/span&gt;&#10; &lt;span class="timeline__tick" style="left: 75.000%"&gt;20:00&lt;/span&gt;&#10; &lt;span class="timeline__tick" style="left: 87.500%"&gt;22:00&lt;/span&gt;&#10; &lt;span class="timeline__tick" style="left: 100.000%"&gt;24:00&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;/div&gt;&lt;figcaption&gt;Hover or tab through the bars and markers for times. Focus blocks are 50-minute &lt;em&gt;potatoes&lt;/em&gt; and 25-minute &lt;em&gt;pomodoros&lt;/em&gt;; the checks are the &lt;code&gt;[tasks]&lt;/code&gt; times from &lt;code&gt;settings.toml&lt;/code&gt;.&lt;/figcaption&gt;&#10;&lt;/figure&gt;&#10;&#10;&lt;p&gt;Every change to the routine becomes a new version. The config root holds &lt;code&gt;user_config_0&lt;/code&gt;, &lt;code&gt;user_config_1&lt;/code&gt;, and so on, and &lt;code&gt;rmd switch &amp;lt;n&amp;gt;&lt;/code&gt; activates one and reloads the reminders. Earlier versions stay put.&lt;/p&gt;&#10;&lt;aside class="callout callout--tip"&gt;&#10; &lt;p class="callout__title"&gt;&lt;svg class="icon icon--tip" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M9 18h6M10 21h4"/&gt;&lt;path d="M12 3a6 6 0 0 0-3.6 10.8c.7.6 1.1 1.3 1.1 2.2h5c0-.9.4-1.6 1.1-2.2A6 6 0 0 0 12 3z"/&gt;&lt;/svg&gt;&lt;span&gt;Rolling back a bad week&lt;/span&gt;&lt;/p&gt;&#10; &lt;div class="callout__body"&gt;&lt;p&gt;Because a change never edits the active version in place, undoing it is one command: &lt;code&gt;rmd switch&lt;/code&gt; with the previous version&amp;rsquo;s number.&lt;/p&gt;&lt;/div&gt;&#10;&lt;/aside&gt;&lt;h2 id="letting-the-agent-write-it"&gt;Letting the agent write it&lt;a class="anchor" href="#letting-the-agent-write-it" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;The slowest part of last year&amp;rsquo;s setup was the first hour: translating a course timetable, a few fixed meetings, and some vague intentions about exercise into TOML. That hour is now a conversation. The &lt;code&gt;schedule-everything&lt;/code&gt; plugin works in Claude Code, OpenAI Codex, and Google Antigravity:&lt;/p&gt;&#10;&lt;div class="tabs" data-group="agent"&gt;&#10; &#10;&lt;section class="tabs__panel" data-label="Claude Code"&gt;&#10; &lt;p class="tabs__fallback-label"&gt;Claude Code&lt;/p&gt;&#10; &lt;div class="codeblock" data-lang="bash"&gt;&#10; &lt;div class="codeblock__bar"&gt;&#10; &lt;span class="codeblock__label"&gt;bash&lt;/span&gt;&#10; &lt;button class="copy-btn" type="button" aria-label="Copy code"&gt;&lt;svg class="icon icon--copy" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;rect x="9" y="9" width="11" height="11" rx="2"/&gt;&lt;path d="M5 15V6a2 2 0 0 1 2-2h8"/&gt;&lt;/svg&gt;&lt;span&gt;Copy&lt;/span&gt;&lt;/button&gt;&#10; &lt;/div&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;claude plugin marketplace add AutoPhd-org/schedule-everything&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;claude plugin install schedule-everything@schedule-everything&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;/section&gt;&#10;&#10;&lt;section class="tabs__panel" data-label="Codex"&gt;&#10; &lt;p class="tabs__fallback-label"&gt;Codex&lt;/p&gt;&#10; &lt;div class="codeblock" data-lang="bash"&gt;&#10; &lt;div class="codeblock__bar"&gt;&#10; &lt;span class="codeblock__label"&gt;bash&lt;/span&gt;&#10; &lt;button class="copy-btn" type="button" aria-label="Copy code"&gt;&lt;svg class="icon icon--copy" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;rect x="9" y="9" width="11" height="11" rx="2"/&gt;&lt;path d="M5 15V6a2 2 0 0 1 2-2h8"/&gt;&lt;/svg&gt;&lt;span&gt;Copy&lt;/span&gt;&lt;/button&gt;&#10; &lt;/div&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;codex plugin marketplace add AutoPhd-org/schedule-everything&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;codex plugin add schedule-everything@schedule-everything&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;/section&gt;&#10;&#10;&lt;section class="tabs__panel" data-label="Antigravity"&gt;&#10; &lt;p class="tabs__fallback-label"&gt;Antigravity&lt;/p&gt;&#10; &lt;div class="codeblock" data-lang="bash"&gt;&#10; &lt;div class="codeblock__bar"&gt;&#10; &lt;span class="codeblock__label"&gt;bash&lt;/span&gt;&#10; &lt;button class="copy-btn" type="button" aria-label="Copy code"&gt;&lt;svg class="icon icon--copy" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;rect x="9" y="9" width="11" height="11" rx="2"/&gt;&lt;path d="M5 15V6a2 2 0 0 1 2-2h8"/&gt;&lt;/svg&gt;&lt;span&gt;Copy&lt;/span&gt;&lt;/button&gt;&#10; &lt;/div&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/AutoPhd-org/schedule-everything.git&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;agy plugin install ./schedule-everything/plugins/schedule-everything&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;/section&gt;&#10;&#10;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;Saying &amp;ldquo;build my weekly schedule&amp;rdquo; starts the &lt;code&gt;build-schedule&lt;/code&gt; skill:&lt;/p&gt;&#10;&lt;div class="steps"&gt;&#10; &lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;It finds my files.&lt;/strong&gt; &lt;code&gt;rmd check --json&lt;/code&gt; reports the config root, the active version, and which files exist.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;It interviews me.&lt;/strong&gt; Wake and sleep times, fixed obligations, goals, habits, when I focus best, and whether odd and even weeks differ. The answers go into &lt;code&gt;profile.md&lt;/code&gt;. If I hand it a timetable file or a screenshot, it reads that and only asks about what is unclear.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;It shows me the week in plain language&lt;/strong&gt; and waits for my confirmation before writing anything.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;It writes and checks.&lt;/strong&gt; It writes &lt;code&gt;settings.toml&lt;/code&gt;, both week files, &lt;code&gt;habits.toml&lt;/code&gt;, and &lt;code&gt;profile.md&lt;/code&gt;, validates them with &lt;code&gt;rmd check&lt;/code&gt;, and reloads the reminders. Changing an existing schedule creates a new version instead of editing the active one.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&#10;&lt;/div&gt;&#10;&#10;&lt;details class="callout callout--note"&gt;&#10; &lt;summary class="callout__title"&gt;&lt;svg class="icon icon--note" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;circle cx="12" cy="12" r="9"/&gt;&lt;path d="M12 11v5M12 8h.01"/&gt;&lt;/svg&gt;&lt;span&gt;Healthy defaults, not just a full calendar&lt;/span&gt;&lt;svg class="icon icon--chevron-down" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M6 9l6 6 6-6"/&gt;&lt;/svg&gt;&lt;/summary&gt;&#10; &lt;div class="callout__body"&gt;&lt;p&gt;When my answers leave gaps, the skill protects a few evidence-informed defaults: at least 7 hours of sleep opportunity with regular sleep and wake times, 150–300 minutes of moderate activity a week with strength work on two or more days, short movement breaks in long sedentary stretches, demanding work in my best-focus window, and daylight early in the day. They are scheduling heuristics, not medical advice, and my real constraints always win.&lt;/p&gt;&#10;&lt;p&gt;Sources: the &lt;a href="https://aasm.org/resources/pdf/pressroom/adult-sleep-duration-consensus.pdf" rel="noopener"&gt;AASM consensus on adult sleep&lt;/a&gt;; Sletten et al., &lt;a href="https://doi.org/10.1016/j.sleh.2023.07.016" rel="noopener"&gt;&lt;em&gt;The importance of sleep regularity&lt;/em&gt;&lt;/a&gt;; the &lt;a href="https://www.who.int/initiatives/behealthy/physical-activity" rel="noopener"&gt;WHO physical activity recommendations&lt;/a&gt;; Albulescu et al., &lt;a href="https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0272460" rel="noopener"&gt;&lt;em&gt;&amp;ldquo;Give me a break!&amp;rdquo;&lt;/em&gt;&lt;/a&gt;; and Figueiro et al., &lt;a href="https://doi.org/10.1016/j.sleh.2017.03.005" rel="noopener"&gt;&lt;em&gt;daytime light exposure in office workers&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/details&gt;&#10;&lt;p&gt;The daily loop is where the agent earns its keep. &amp;ldquo;Plan my focus blocks for today&amp;rdquo; runs &lt;code&gt;plan-day&lt;/code&gt;, which reads today&amp;rsquo;s free blocks, my open tasks, and the nearest deadlines, matches the important work to the blocks, and saves the plan once I agree. Underneath, it is three commands I could type myself:&lt;/p&gt;&#10;&lt;figure class="terminal "&gt;&#10; &lt;div class="terminal__bar"&gt;&#10; &lt;span class="terminal__dots" aria-hidden="true"&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;&#10; &lt;span class="terminal__title"&gt;~ · zsh&lt;/span&gt;&#10; &lt;button class="copy-btn" type="button" data-copy-commands aria-label="Copy commands"&gt;&lt;svg class="icon icon--copy" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;rect x="9" y="9" width="11" height="11" rx="2"/&gt;&lt;path d="M5 15V6a2 2 0 0 1 2-2h8"/&gt;&lt;/svg&gt;&lt;span&gt;Copy&lt;/span&gt;&lt;/button&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="terminal__body"&gt;&lt;code&gt;&lt;span class="term-line term-cmd"&gt;&lt;span class="term-prompt" aria-hidden="true"&gt;$ &lt;/span&gt;&lt;span class="term-input"&gt;rmd sync --json | head -12&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt;{&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt; &amp;#34;date&amp;#34;: &amp;#34;2026-11-10&amp;#34;,&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt; &amp;#34;weekday&amp;#34;: &amp;#34;tuesday&amp;#34;,&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt; &amp;#34;parity&amp;#34;: &amp;#34;even&amp;#34;,&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt; &amp;#34;mode&amp;#34;: &amp;#34;j&amp;#34;,&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt; &amp;#34;skipped&amp;#34;: false,&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt; &amp;#34;slots&amp;#34;: [&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt; {&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt; &amp;#34;time&amp;#34;: &amp;#34;08:30&amp;#34;,&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt; &amp;#34;block&amp;#34;: &amp;#34;potato&amp;#34;,&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt; &amp;#34;minutes&amp;#34;: 50,&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt; &amp;#34;title&amp;#34;: null&lt;/span&gt;&#10;&lt;span class="term-line term-cmd"&gt;&lt;span class="term-prompt" aria-hidden="true"&gt;$ &lt;/span&gt;&lt;span class="term-input"&gt;rmd sync --apply plan.json&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt;Saved today&amp;#39;s plan with 3 focus blocks to ~/.schedule_management/config/synced_schedule.toml.&lt;/span&gt;&#10;&lt;span class="term-line term-cmd"&gt;&lt;span class="term-prompt" aria-hidden="true"&gt;$ &lt;/span&gt;&lt;span class="term-input"&gt;rmd sync&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt; Today&amp;#39;s focus blocks&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt;╭───────┬──────────┬────────────────────────────────╮&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt;│ Time │ Block │ Planned task │&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt;├───────┼──────────┼────────────────────────────────┤&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt;│ 08:30 │ potato │ — │&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt;│ 09:30 │ potato │ — │&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt;│ 10:30 │ potato │ — │&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt;│ 11:30 │ potato │ — │&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt;│ 14:00 │ potato │ Rerun the OSWorld ablation │&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt;│ 15:00 │ potato │ Draft the related-work section │&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt;│ 16:00 │ potato │ — │&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt;│ 17:00 │ potato │ — │&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt;│ 19:30 │ potato │ Leg day │&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt;│ 20:30 │ pomodoro │ — │&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt;│ 21:30 │ pomodoro │ — │&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt;╰───────┴──────────┴────────────────────────────────╯&lt;/span&gt;&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;/figure&gt;&#10;&#10;&lt;p&gt;The plan itself is tiny. Keys are today&amp;rsquo;s slot times, a partial plan is fine, and applying a new one replaces the old:&lt;/p&gt;&#10;&lt;div class="codeblock" data-lang="json"&gt;&#10; &lt;div class="codeblock__bar"&gt;&#10; &lt;span class="codeblock__label"&gt;&lt;svg class="icon icon--code" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M8 7l-5 5 5 5M16 7l5 5-5 5M13.5 4l-3 16"/&gt;&lt;/svg&gt;plan.json&lt;/span&gt;&#10; &lt;button class="copy-btn" type="button" aria-label="Copy code"&gt;&lt;svg class="icon icon--copy" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;rect x="9" y="9" width="11" height="11" rx="2"/&gt;&lt;path d="M5 15V6a2 2 0 0 1 2-2h8"/&gt;&lt;/svg&gt;&lt;span&gt;Copy&lt;/span&gt;&lt;/button&gt;&#10; &lt;/div&gt;&#10; &lt;div class="highlight" title="plan.json"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;date&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2026-11-10&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;assignments&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;14:00&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Rerun the OSWorld ablation&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;15:00&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Draft the related-work section&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;19:30&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Leg day&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;The third skill, &lt;code&gt;suggest-tasks&lt;/code&gt;, reads my connected apps (email, calendar, documents, issue trackers) for work I haven&amp;rsquo;t captured yet: a request waiting for a reply, a form with a date on it, a talk to prepare. It runs well as a scheduled routine every weekday morning.&lt;/p&gt;&#10;&lt;aside class="callout callout--important"&gt;&#10; &lt;p class="callout__title"&gt;&lt;svg class="icon icon--important" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M4 5.5A1.5 1.5 0 0 1 5.5 4h13A1.5 1.5 0 0 1 20 5.5v9a1.5 1.5 0 0 1-1.5 1.5H10l-4.5 4v-4H5.5A1.5 1.5 0 0 1 4 14.5z"/&gt;&lt;path d="M12 7.5v4M12 13.5h.01"/&gt;&lt;/svg&gt;&lt;span&gt;Suggestions are not tasks&lt;/span&gt;&lt;/p&gt;&#10; &lt;div class="callout__body"&gt;&lt;p&gt;The agent never adds a task itself. Its suggestions wait on the task board, dashed and labelled with who suggested them and why, until I click &lt;strong&gt;Add to my tasks&lt;/strong&gt; or &lt;strong&gt;Reject&lt;/strong&gt;. No reminder, count, or statistic includes them. It only reads my apps, treats what it reads as data (an email cannot instruct it), won&amp;rsquo;t re-suggest something I rejected in the last 60 days, and can&amp;rsquo;t have more than 20 suggestions waiting at once.&lt;/p&gt;&lt;/div&gt;&#10;&lt;/aside&gt;&lt;h2 id="reminders-that-stick"&gt;Reminders that stick&lt;a class="anchor" href="#reminders-that-stick" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;This is the part I refused to compromise on, and it has barely changed. At the start and end of every block, the service plays a sound every &lt;code&gt;alarm_interval&lt;/code&gt; seconds and keeps a dialog open until I respond, for up to &lt;code&gt;max_alarm_duration&lt;/code&gt;. With the template settings, it checks for urgent tasks four times a day, checks for deadlines that are getting close four more times, and asks about habits at night.&lt;/p&gt;&#10;&lt;p&gt;Tasks and deadlines are still a few keystrokes away. This is real output, from a fresh config:&lt;/p&gt;&#10;&lt;figure class="terminal "&gt;&#10; &lt;div class="terminal__bar"&gt;&#10; &lt;span class="terminal__dots" aria-hidden="true"&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;&#10; &lt;span class="terminal__title"&gt;~ · zsh&lt;/span&gt;&#10; &lt;button class="copy-btn" type="button" data-copy-commands aria-label="Copy commands"&gt;&lt;svg class="icon icon--copy" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;rect x="9" y="9" width="11" height="11" rx="2"/&gt;&lt;path d="M5 15V6a2 2 0 0 1 2-2h8"/&gt;&lt;/svg&gt;&lt;span&gt;Copy&lt;/span&gt;&lt;/button&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="terminal__body"&gt;&lt;code&gt;&lt;span class="term-line term-cmd"&gt;&lt;span class="term-prompt" aria-hidden="true"&gt;$ &lt;/span&gt;&lt;span class="term-input"&gt;rmd add &amp;#34;Rerun the OSWorld ablation&amp;#34; 9 3&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt;✅ Task &amp;#39;Rerun the OSWorld ablation&amp;#39; added successfully with priority 9!&lt;/span&gt;&#10;&lt;span class="term-line term-cmd"&gt;&lt;span class="term-prompt" aria-hidden="true"&gt;$ &lt;/span&gt;&lt;span class="term-input"&gt;rmd add &amp;#34;Draft the related-work section&amp;#34; 8 1&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt;✅ Task &amp;#39;Draft the related-work section&amp;#39; added successfully with priority 8!&lt;/span&gt;&#10;&lt;span class="term-line term-comment"&gt;# …and two more the same way&lt;/span&gt;&#10;&lt;span class="term-line term-cmd"&gt;&lt;span class="term-prompt" aria-hidden="true"&gt;$ &lt;/span&gt;&lt;span class="term-input"&gt;rmd ls&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt; Current Task List&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt;╭──────────┬─────────────────────────┬─────────────────────────────────────────────────╮&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt;│ ID │ Priority │ Description │&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt;├──────────┼─────────────────────────┼─────────────────────────────────────────────────┤&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt;│ 1 │ █████████░ (9) │ Rerun the OSWorld ablation │&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt;│ 2 │ ████████░░ (8) │ Draft the related-work section │&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt;│ 3 │ ██████░░░░ (6) │ Leg day │&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt;│ 4 │ █████░░░░░ (5) │ Review lab PR │&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt;╰──────────┴─────────────────────────┴─────────────────────────────────────────────────╯&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt;■ read papers ■ gym work ■ coding ■ other&lt;/span&gt;&#10;&lt;span class="term-line term-cmd"&gt;&lt;span class="term-prompt" aria-hidden="true"&gt;$ &lt;/span&gt;&lt;span class="term-input"&gt;rmd ddl add &amp;#34;Rebuttal due&amp;#34; 11.21&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt;✅ Deadline &amp;#39;Rebuttal due&amp;#39; added successfully for 2026-11-21!&lt;/span&gt;&#10;&lt;span class="term-line term-cmd"&gt;&lt;span class="term-prompt" aria-hidden="true"&gt;$ &lt;/span&gt;&lt;span class="term-input"&gt;rmd ddl add &amp;#34;Group meeting slides&amp;#34; 11.12 --repeat weekly&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt;✅ Deadline &amp;#39;Group meeting slides&amp;#39; added successfully for 2026-11-12!&lt;/span&gt;&#10;&lt;span class="term-line term-cmd"&gt;&lt;span class="term-prompt" aria-hidden="true"&gt;$ &lt;/span&gt;&lt;span class="term-input"&gt;rmd ddl&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt; Current Deadlines&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt;╭───────────────────────────────────┬───────────────────┬────────────────┬─────────────╮&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt;│ Event │ Deadline │ Days Left │ Status │&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt;├───────────────────────────────────┼───────────────────┼────────────────┼─────────────┤&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt;│ Group meeting slides ↻ Weekly │ Nov 12, 2026 │ 2 days left │ 🔴 URGENT │&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt;│ Rebuttal due │ Nov 21, 2026 │ 11 days left │ 🟢 OK │&lt;/span&gt;&#10;&lt;span class="term-line term-out"&gt;╰───────────────────────────────────┴───────────────────┴────────────────┴─────────────╯&lt;/span&gt;&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;/figure&gt;&#10;&#10;&lt;p&gt;One small but useful change: there are now three ways to take a task off the list, and they mean different things in the history.&lt;/p&gt;&#10;&lt;div class="table-wrap"&gt;&#10;&lt;table&gt;&#10; &lt;thead&gt;&#10; &lt;tr&gt;&#10; &lt;th&gt;Command&lt;/th&gt;&#10; &lt;th&gt;Use it when&lt;/th&gt;&#10; &lt;th&gt;Counts as done?&lt;/th&gt;&#10; &lt;/tr&gt;&#10; &lt;/thead&gt;&#10; &lt;tbody&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;rmd rm&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;I finished it&lt;/td&gt;&#10; &lt;td&gt;Yes&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;rmd cancel&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;I added it by mistake&lt;/td&gt;&#10; &lt;td&gt;No&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;rmd drop&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;I decided to give up on it&lt;/td&gt;&#10; &lt;td&gt;No&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="j-mode-and-p-mode"&gt;J mode and P mode&lt;a class="anchor" href="#j-mode-and-p-mode" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Not every day deserves a timetable. The &lt;strong&gt;J / P&lt;/strong&gt; switch in the workspace header (or &lt;code&gt;rmd mode j|p&lt;/code&gt;) changes the reminder service and the browser together.&lt;span class="sidenote-wrap"&gt;&lt;label for="sn-9" class="sidenote-ref" aria-label="Show note"&gt;&lt;/label&gt;&lt;input type="checkbox" id="sn-9" class="sidenote-toggle"&gt;&lt;span class="sidenote" role="note"&gt;The letters borrow the judging/perceiving pair from personality-type jargon: J plans ahead, P keeps options open.&lt;/span&gt;&lt;/span&gt; J mode is the structured day: status counts, the current and next block, upcoming deadlines, the task board, and the timeline. P mode pauses alarms for selected events and keeps only the tasks, grouped by type. Drag the handle to compare:&lt;/p&gt;&#10;&lt;figure class="compare-figure wide"&gt;&#10; &lt;div class="compare" style="--pos: 52%"&gt;&#10; &lt;div class="compare__before"&gt;&lt;img src="https://sergiudm.github.io/p/time-management/overview-j_hu_875885c8085989da.webp" srcset="https://sergiudm.github.io/p/time-management/overview-j_hu_3bfe44405f8cf9ea.webp 480w, https://sergiudm.github.io/p/time-management/overview-j_hu_caab321e347e8999.webp 800w, https://sergiudm.github.io/p/time-management/overview-j_hu_875885c8085989da.webp 1200w, https://sergiudm.github.io/p/time-management/overview-j_hu_329c5fe5f27445fd.webp 1800w" sizes="(min-width: 1280px) 1040px, 100vw"&#10; width="2880" height="1800" alt="J mode" loading="lazy" decoding="async" data-nozoom&gt;&lt;/div&gt;&#10; &lt;div class="compare__after" aria-hidden="true"&gt;&lt;img src="https://sergiudm.github.io/p/time-management/overview-p_hu_2356d0f0d1abf83f.webp" srcset="https://sergiudm.github.io/p/time-management/overview-p_hu_f13039850cab6b38.webp 480w, https://sergiudm.github.io/p/time-management/overview-p_hu_bba85ab56da41ab8.webp 800w, https://sergiudm.github.io/p/time-management/overview-p_hu_2356d0f0d1abf83f.webp 1200w, https://sergiudm.github.io/p/time-management/overview-p_hu_3eacf81a18daaf45.webp 1800w" sizes="(min-width: 1280px) 1040px, 100vw"&#10; width="2880" height="1800" alt="P mode" loading="lazy" decoding="async" data-nozoom&gt;&lt;/div&gt;&#10; &lt;span class="compare__label compare__label--before"&gt;J mode&lt;/span&gt;&#10; &lt;span class="compare__label compare__label--after"&gt;P mode&lt;/span&gt;&#10; &lt;input class="compare__range" type="range" min="0" max="100" step="0.5" value="52" aria-label="Drag to compare J mode with P mode"&gt;&#10; &lt;span class="compare__handle" aria-hidden="true"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&#10; &lt;/div&gt;&lt;figcaption&gt;The same workspace in J mode (left) and P mode (right).&lt;/figcaption&gt;&#10;&lt;/figure&gt;&#10;&#10;&lt;h2 id="the-workspace"&gt;The workspace&lt;a class="anchor" href="#the-workspace" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;rmd web&lt;/code&gt; opens a local workspace on &lt;code&gt;127.0.0.1&lt;/code&gt; that reads and writes the same files as the CLI, and only accepts API calls that carry the session token of the tab it opened. It has five pages: &lt;strong&gt;Overview&lt;/strong&gt;, &lt;strong&gt;Schedule&lt;/strong&gt;, &lt;strong&gt;Routines &amp;amp; deadlines&lt;/strong&gt;, &lt;strong&gt;Activity&lt;/strong&gt;, and &lt;strong&gt;Settings&lt;/strong&gt;, and it speaks English, Chinese, Spanish, and Korean.&lt;/p&gt;&#10;&lt;h3 id="workload-how-heavy-is-the-pile"&gt;Workload: how heavy is the pile?&lt;a class="anchor" href="#workload-how-heavy-is-the-pile" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;The most useful number on the Overview is &lt;strong&gt;workload&lt;/strong&gt;. Every open task counts its importance out of 10, times the share of it still left: an importance-8 task counts 0.8 untouched, 0.4 when half done, and nothing when finished. The total falls into one of five levels, and the workspace&amp;rsquo;s colours follow it, from cool greens and blues when the plate is clear to warm oranges and reds when it is heavy. Try it with the four tasks from above:&lt;/p&gt;&#10;&lt;figure class="demo "&gt;&lt;div class="demo__bar"&gt;&lt;span class="demo__badge"&gt;&lt;svg class="icon icon--spark" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M12 3v4M12 17v4M3 12h4M17 12h4M6 6l2.5 2.5M15.5 15.5L18 18M6 18l2.5-2.5M15.5 8.5L18 6"/&gt;&lt;/svg&gt;Interactive&lt;/span&gt;&lt;span class="demo__title"&gt;Workload calculator&lt;/span&gt;&lt;/div&gt;&#10; &lt;div class="demo__body"&gt;&#10;&lt;style&gt;&#10; .wl { display: grid; gap: 14px; }&#10; .wl__rows { display: grid; gap: 8px; }&#10; .wl__row { display: grid; grid-template-columns: minmax(0, 1.5fr) minmax(0, 1fr) minmax(0, 1fr) 46px; gap: 10px 14px; align-items: center; padding: 10px 12px; border: 1px solid var(--border); border-radius: 10px; background: var(--bg); }&#10; .wl__name { min-width: 0; font-weight: 500; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }&#10; .wl__ctl { display: grid; gap: 2px; font-size: 0.75rem; color: var(--muted); }&#10; .wl__ctl span { display: flex; justify-content: space-between; }&#10; .wl__ctl output { color: var(--text); font-weight: 600; font-variant-numeric: tabular-nums; }&#10; .wl__ctl input { width: 100%; accent-color: var(--accent); }&#10; .wl__score { text-align: right; font-weight: 700; font-variant-numeric: tabular-nums; color: var(--text-2); }&#10; .wl__summary { display: flex; flex-wrap: wrap; align-items: baseline; gap: 6px 14px; }&#10; .wl__total { font-size: 2rem; font-weight: 700; letter-spacing: -0.02em; font-variant-numeric: tabular-nums; color: var(--wl, var(--accent)); }&#10; .wl__level { padding: 3px 10px; border-radius: 999px; font-weight: 600; font-size: 0.85rem; color: var(--wl, var(--accent)); background: color-mix(in srgb, var(--wl, var(--accent)) 14%, transparent); }&#10; .wl__hint { color: var(--muted); font-size: 0.85rem; }&#10; .wl__meter { position: relative; height: 12px; border-radius: 999px; background: linear-gradient(90deg, var(--c-tip) 0 20.8%, var(--series-1) 20.8% 45.8%, var(--c-warning) 45.8% 75%, var(--c-caution) 75% 100%); opacity: 0.9; }&#10; .wl__needle { position: absolute; top: -5px; width: 4px; height: 22px; margin-left: -2px; border-radius: 2px; background: var(--text); box-shadow: 0 0 0 2px var(--surface); transition: left 0.25s; }&#10; .wl__scale { position: relative; height: 16px; font-size: 0.7rem; color: var(--faint); }&#10; .wl__scale span { position: absolute; transform: translateX(-50%); }&#10; .wl__actions { display: flex; gap: 8px; }&#10; .wl__actions button { padding: 6px 12px; border: 1px solid var(--border-strong); border-radius: 8px; background: var(--surface); color: var(--text); font: 500 0.82rem/1 var(--font-sans); cursor: pointer; }&#10; .wl__actions button:hover { border-color: var(--accent); color: var(--accent); }&#10; @media (max-width: 640px) { .wl__row { grid-template-columns: 1fr 1fr 40px; } .wl__name { grid-column: 1 / -1; } }&#10;&lt;/style&gt;&#10;&lt;div class="wl" data-wl&gt;&#10; &lt;div class="wl__summary"&gt;&#10; &lt;span&gt;Workload&lt;/span&gt;&#10; &lt;strong class="wl__total" data-wl-total&gt;0.0&lt;/strong&gt;&#10; &lt;span class="wl__level" data-wl-level&gt;All clear&lt;/span&gt;&#10; &lt;span class="wl__hint" data-wl-hint&gt;&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div&gt;&#10; &lt;div class="wl__meter" aria-hidden="true"&gt;&lt;span class="wl__needle" data-wl-needle&gt;&lt;/span&gt;&lt;/div&gt;&#10; &lt;div class="wl__scale" aria-hidden="true"&gt;&lt;span style="left:0%;transform:none"&gt;0&lt;/span&gt;&lt;span style="left:20.8%"&gt;2.5&lt;/span&gt;&lt;span style="left:45.8%"&gt;5.5&lt;/span&gt;&lt;span style="left:75%"&gt;9&lt;/span&gt;&lt;span style="left:100%;transform:translateX(-100%)"&gt;12&lt;/span&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;div class="wl__rows" data-wl-rows&gt;&lt;/div&gt;&#10; &lt;div class="wl__actions"&gt;&lt;button type="button" data-wl-add&gt;Add a task&lt;/button&gt;&lt;button type="button" data-wl-reset&gt;Reset&lt;/button&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;script&gt;&#10;(function () {&#10; var root = document.querySelector('[data-wl]');&#10; if (!root) return;&#10; var start = [&#10; ['Rerun the OSWorld ablation', 9, 0],&#10; ['Draft the related-work section', 8, 50],&#10; ['Leg day', 6, 0],&#10; ['Review lab PR', 5, 0]&#10; ];&#10; var levels = [&#10; { max: 0, name: 'All clear', color: 'var(--c-tip)' },&#10; { max: 2.5, name: 'Light', color: 'var(--c-tip)' },&#10; { max: 5.5, name: 'Steady', color: 'var(--series-1)' },&#10; { max: 9, name: 'Busy', color: 'var(--c-warning)' },&#10; { max: Infinity, name: 'Heavy', color: 'var(--c-caution)' }&#10; ];&#10; var rows = root.querySelector('[data-wl-rows]');&#10; var n = 0;&#10; function level(total) {&#10; if (total &lt;= 0) return levels[0];&#10; for (var i = 1; i &lt; levels.length; i++) if (total &lt; levels[i].max) return levels[i];&#10; return levels[levels.length - 1];&#10; }&#10; function update() {&#10; var total = 0;&#10; rows.querySelectorAll('.wl__row').forEach(function (row) {&#10; var imp = +row.querySelector('[data-imp]').value;&#10; var prog = +row.querySelector('[data-prog]').value;&#10; row.querySelector('[data-imp-out]').textContent = imp;&#10; row.querySelector('[data-prog-out]').textContent = prog + '%';&#10; var s = imp / 10 * (1 - prog / 100);&#10; row.querySelector('.wl__score').textContent = s.toFixed(2);&#10; total += s;&#10; });&#10; var lv = level(total);&#10; root.style.setProperty('--wl', lv.color);&#10; root.querySelector('[data-wl-total]').textContent = total.toFixed(1);&#10; root.querySelector('[data-wl-level]').textContent = lv.name;&#10; root.querySelector('[data-wl-needle]').style.left = Math.min(100, total / 12 * 100) + '%';&#10; var next = levels.filter(function (l) { return l.max &gt; total &amp;&amp; isFinite(l.max) &amp;&amp; l.max &gt; 0; })[0];&#10; root.querySelector('[data-wl-hint]').textContent = next ? (next.max - total).toFixed(1) + ' to ' + levels[levels.indexOf(next) + 1].name : '';&#10; }&#10; function add(name, imp, prog) {&#10; n += 1;&#10; var row = document.createElement('div');&#10; row.className = 'wl__row';&#10; row.innerHTML =&#10; '&lt;span class="wl__name"&gt;&lt;/span&gt;' +&#10; '&lt;label class="wl__ctl"&gt;&lt;span&gt;Importance &lt;output data-imp-out&gt;&lt;/output&gt;&lt;/span&gt;&lt;input type="range" min="1" max="10" step="1" data-imp&gt;&lt;/label&gt;' +&#10; '&lt;label class="wl__ctl"&gt;&lt;span&gt;Done &lt;output data-prog-out&gt;&lt;/output&gt;&lt;/span&gt;&lt;input type="range" min="0" max="100" step="5" data-prog&gt;&lt;/label&gt;' +&#10; '&lt;span class="wl__score"&gt;&lt;/span&gt;';&#10; row.querySelector('.wl__name').textContent = name;&#10; row.querySelector('[data-imp]').value = imp;&#10; row.querySelector('[data-prog]').value = prog;&#10; row.querySelector('[data-imp]').setAttribute('aria-label', 'Importance of ' + name);&#10; row.querySelector('[data-prog]').setAttribute('aria-label', 'Progress on ' + name);&#10; rows.appendChild(row);&#10; }&#10; function reset() { rows.innerHTML = ''; n = 0; start.forEach(function (t) { add(t[0], t[1], t[2]); }); update(); }&#10; rows.addEventListener('input', update);&#10; root.querySelector('[data-wl-add]').addEventListener('click', function () { add('New task ' + (n - start.length + 1), 7, 0); update(); });&#10; root.querySelector('[data-wl-reset]').addEventListener('click', reset);&#10; reset();&#10;})();&#10;&lt;/script&gt;&#10;&lt;/div&gt;&lt;figcaption&gt;The formula and the default level boundaries (2.5, 5.5, 9) are the workspace&amp;rsquo;s own. Settings can move the boundaries.&lt;/figcaption&gt;&#10;&lt;/figure&gt;&#10;&#10;&lt;p&gt;The board itself groups tasks by type. Each task can have a finish-by time, a progress slider, or a checklist of subtasks, and dials above the board count down to whatever is due tonight. A &lt;strong&gt;Glossary&lt;/strong&gt; page explains every number the workspace shows, with the formula, an example, and my own current value.&lt;/p&gt;&#10;&lt;h3 id="schedule-deadlines-and-the-year"&gt;Schedule, deadlines, and the year&lt;a class="anchor" href="#schedule-deadlines-and-the-year" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;figure class="figure wide"&gt;&lt;img src="https://sergiudm.github.io/p/time-management/schedule-agents_hu_a95d53f466333245.webp" srcset="https://sergiudm.github.io/p/time-management/schedule-agents_hu_5b3244266419fa24.webp 480w, https://sergiudm.github.io/p/time-management/schedule-agents_hu_160fa5a26afbd0b1.webp 800w, https://sergiudm.github.io/p/time-management/schedule-agents_hu_a95d53f466333245.webp 1200w, https://sergiudm.github.io/p/time-management/schedule-agents_hu_8b0ff326ebcc7f3a.webp 1800w" sizes="(min-width: 1100px) 760px, (min-width: 760px) 90vw, 100vw"&#10; width="2880" height="1800" alt="The Schedule page with today’s timeline, today’s plan, and tabbed plugin install commands" loading="lazy" decoding="async" data-zoom="/p/time-management/schedule-agents_hu_8b0ff326ebcc7f3a.webp"&gt;&lt;figcaption&gt;The &lt;strong&gt;Schedule&lt;/strong&gt; page shows today&amp;rsquo;s timeline with each block&amp;rsquo;s planned task, plus the plugin install commands with copy buttons.&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Routines &amp;amp; deadlines&lt;/strong&gt; puts every deadline on a year calendar. Deadlines can repeat weekly, every two weeks, or monthly, get one of eight marker colours, and move by dragging their chip to another day. There is also a switch that adds submission deadlines, rebuttal periods, and conference dates for NeurIPS, ICLR, ICML, CVPR, ACL, ICRA, and other major venues, in my time zone. If your year is organised around conference deadlines, that switch saves a lot of copying.&lt;/p&gt;&#10;&lt;figure class="figure " style="--figure-max: 560px"&gt;&lt;img src="https://sergiudm.github.io/p/time-management/calendar_hu_44bee664d53f7edf.webp" srcset="https://sergiudm.github.io/p/time-management/calendar_hu_39023422bb4e2e2.webp 480w, https://sergiudm.github.io/p/time-management/calendar_hu_e359e72b46f068ea.webp 800w, https://sergiudm.github.io/p/time-management/calendar_hu_44bee664d53f7edf.webp 1200w, https://sergiudm.github.io/p/time-management/calendar_hu_4754410ed35435ba.webp 1800w" sizes="(min-width: 1100px) 760px, (min-width: 760px) 90vw, 100vw"&#10; width="2252" height="2468" alt="The year calendar, with a day card open and draggable deadline chips." loading="lazy" decoding="async" data-zoom="/p/time-management/calendar_hu_4754410ed35435ba.webp"&gt;&lt;figcaption&gt;The year calendar, with a day card open and draggable deadline chips.&lt;/figcaption&gt;&lt;/figure&gt;&#10;&#10;&lt;h3 id="activity-little-wins-add-up"&gt;Activity: little wins add up&lt;a class="anchor" href="#activity-little-wins-add-up" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;Everything I finish, cancel, or drop grows along a timeline tree, one lane and colour per task type. There is a gallery view with generated artwork for each finished task, a rhythm grid of completions per day, and a weekly overview that compares this week with last week and my recent average. That overview follows this page&amp;rsquo;s theme: toggle dark mode at the top to see both versions.&lt;/p&gt;&#10;&lt;figure class="figure wide"&gt;&lt;img src="https://sergiudm.github.io/p/time-management/activity-gallery_hu_17380de794397de3.webp" srcset="https://sergiudm.github.io/p/time-management/activity-gallery_hu_fffa29d163035629.webp 480w, https://sergiudm.github.io/p/time-management/activity-gallery_hu_5378fa33c34136e2.webp 800w, https://sergiudm.github.io/p/time-management/activity-gallery_hu_17380de794397de3.webp 1200w, https://sergiudm.github.io/p/time-management/activity-gallery_hu_853611682d1240ce.webp 1800w" sizes="(min-width: 1100px) 760px, (min-width: 760px) 90vw, 100vw"&#10; width="2880" height="2360" alt="The Activity page with the weekly overview card, a rhythm grid, filters, and a gallery of finished tasks" loading="lazy" decoding="async" data-zoom="/p/time-management/activity-gallery_hu_853611682d1240ce.webp"&gt;&lt;figcaption&gt;&lt;strong&gt;Activity&lt;/strong&gt;: a gallery of finished tasks, filterable by outcome and type.&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class="figure " style="--figure-max: 440px"&gt;&lt;img src="https://sergiudm.github.io/p/time-management/weekly_hu_8d195df12de0875.webp" srcset="https://sergiudm.github.io/p/time-management/weekly_hu_4704ff472ac36c06.webp 480w, https://sergiudm.github.io/p/time-management/weekly_hu_58910acc9829b9d5.webp 800w, https://sergiudm.github.io/p/time-management/weekly_hu_8d195df12de0875.webp 1200w, https://sergiudm.github.io/p/time-management/weekly_hu_8fa914f23be7f545.webp 1800w" sizes="(min-width: 1100px) 760px, (min-width: 760px) 90vw, 100vw"&#10; width="2380" height="3484" alt="The weekly overview: tasks completed with an eight-week trend, habit rings, streak, daily rhythm, effort by type, and highlights." loading="lazy" decoding="async" class="only-light" data-zoom="/p/time-management/weekly_hu_8fa914f23be7f545.webp"&gt;&lt;img src="https://sergiudm.github.io/p/time-management/weekly-dark_hu_114dfb80b1e81441.webp" srcset="https://sergiudm.github.io/p/time-management/weekly-dark_hu_777d90a4062ae0d7.webp 480w, https://sergiudm.github.io/p/time-management/weekly-dark_hu_b28facf33d1251dd.webp 800w, https://sergiudm.github.io/p/time-management/weekly-dark_hu_114dfb80b1e81441.webp 1200w, https://sergiudm.github.io/p/time-management/weekly-dark_hu_2714b195fbe20ae1.webp 1800w" sizes="(min-width: 1100px) 760px, (min-width: 760px) 90vw, 100vw"&#10; width="2380" height="3484" alt="The weekly overview: tasks completed with an eight-week trend, habit rings, streak, daily rhythm, effort by type, and highlights." loading="lazy" decoding="async" class="only-dark" data-zoom="/p/time-management/weekly-dark_hu_2714b195fbe20ae1.webp"&gt;&lt;figcaption&gt;The weekly overview: tasks completed with an eight-week trend, habit rings, streak, daily rhythm, effort by type, and highlights.&lt;/figcaption&gt;&lt;/figure&gt;&#10;&#10;&lt;h3 id="plugins-for-things-that-need-more-than-a-list"&gt;Plugins for things that need more than a list&lt;a class="anchor" href="#plugins-for-things-that-need-more-than-a-list" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;A workspace plugin is a task category with its own page and tracking. The built-in &lt;strong&gt;Fitness&lt;/strong&gt; plugin has a body figure that shades each muscle by how many sets worked it this week, a workout builder, a live session with a rest timer, personal records, and body weight. Custom trackers cover practice time, new words, pages read, or anything else, each with weekly goals. A plugin is only visible to my AI agent if I switch that on, in which case &lt;code&gt;suggest-tasks&lt;/code&gt; can propose, say, a leg workout when my legs have rested for a week.&lt;/p&gt;&#10;&lt;h3 id="on-my-phone-too"&gt;On my phone, too&lt;a class="anchor" href="#on-my-phone-too" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;&lt;code&gt;rmd web --phone&lt;/code&gt; prints a pairing code. Scanning it lets my phone use the workspace on my computer: same tasks, same plan, nothing copied or synced. It works on the same Wi-Fi, or from anywhere over Tailscale.&lt;/p&gt;&#10;&lt;figure class="gallery-figure "&gt;&#10; &lt;div class="gallery gallery--keep" style="--cols: 3"&gt;&#10; &lt;figure class="figure "&gt;&lt;img src="https://sergiudm.github.io/p/time-management/mobile-overview_hu_e873df7bad379174.webp" srcset="https://sergiudm.github.io/p/time-management/mobile-overview_hu_48e6b550f291d031.webp 480w, https://sergiudm.github.io/p/time-management/mobile-overview_hu_e873df7bad379174.webp 800w" sizes="(min-width: 1100px) 760px, (min-width: 760px) 90vw, 100vw"&#10; width="1170" height="2532" alt="The J-mode overview on a phone" loading="lazy" decoding="async" data-zoom="/p/time-management/mobile-overview_hu_e873df7bad379174.webp"&gt;&lt;/figure&gt;&lt;figure class="figure "&gt;&lt;img src="https://sergiudm.github.io/p/time-management/mobile-activity_hu_753f0f1a02ce0ad8.webp" srcset="https://sergiudm.github.io/p/time-management/mobile-activity_hu_b6af46e067f402f6.webp 480w, https://sergiudm.github.io/p/time-management/mobile-activity_hu_753f0f1a02ce0ad8.webp 800w" sizes="(min-width: 1100px) 760px, (min-width: 760px) 90vw, 100vw"&#10; width="1170" height="2532" alt="The Activity page on a phone" loading="lazy" decoding="async" data-zoom="/p/time-management/mobile-activity_hu_753f0f1a02ce0ad8.webp"&gt;&lt;/figure&gt;&lt;figure class="figure "&gt;&lt;img src="https://sergiudm.github.io/p/time-management/mobile-overview-p-dark_hu_6928c351091494b6.webp" srcset="https://sergiudm.github.io/p/time-management/mobile-overview-p-dark_hu_ecd65076e37a5b7e.webp 480w, https://sergiudm.github.io/p/time-management/mobile-overview-p-dark_hu_6928c351091494b6.webp 800w" sizes="(min-width: 1100px) 760px, (min-width: 760px) 90vw, 100vw"&#10; width="1170" height="2532" alt="P mode in the dark theme on a phone" loading="lazy" decoding="async" data-zoom="/p/time-management/mobile-overview-p-dark_hu_6928c351091494b6.webp"&gt;&lt;/figure&gt;&#10; &lt;/div&gt;&lt;figcaption&gt;J mode, Activity, and P mode in the dark theme, on a phone.&lt;/figcaption&gt;&#10;&lt;/figure&gt;&#10;&#10;&lt;aside class="callout callout--warning"&gt;&#10; &lt;p class="callout__title"&gt;&lt;svg class="icon icon--warning" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;path d="M10.3 3.9L2.4 17.6A2 2 0 0 0 4.1 20.6h15.8a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0z"/&gt;&lt;path d="M12 9v4.5M12 17h.01"/&gt;&lt;/svg&gt;&lt;span&gt;Warning&lt;/span&gt;&lt;/p&gt;&#10; &lt;div class="callout__body"&gt;&lt;p&gt;With phone access on, the workspace also listens on your local network, and the link travels unencrypted over it. Use it on networks you trust or over Tailscale, and turn it off with &lt;code&gt;rmd web --no-phone&lt;/code&gt;, which also signs every phone out.&lt;/p&gt;&lt;/div&gt;&#10;&lt;/aside&gt;&lt;h2 id="principles-revised"&gt;Principles, revised&lt;a class="anchor" href="#principles-revised" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Last year&amp;rsquo;s list held up, with a few additions from a year of living with it:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;Make every task small and specific.&lt;/strong&gt; &amp;ldquo;Refine the introduction of the report&amp;rdquo;, not &amp;ldquo;work on the report&amp;rdquo;. A planned block&amp;rsquo;s title is capped at 120 characters, which turns out to be a useful constraint.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Separate what has a time from what doesn&amp;rsquo;t.&lt;/strong&gt; If something must happen at a time, it gets a block, a time point, or a deadline, and therefore an alarm. Everything else waits on the board for a focus block.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Let something outside your head nag you, and make it hard to dismiss.&lt;/strong&gt; A notification I can swipe away is a suggestion. A dialog that keeps ringing is a commitment.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Let the agent propose; keep the decision.&lt;/strong&gt; &lt;code&gt;build-schedule&lt;/code&gt; waits for my confirmation before writing a file, and suggestions wait until I accept them. Planning got cheaper without my week being decided for me.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Make progress visible.&lt;/strong&gt; A streak and a growing timeline are more motivating than a shorter list.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Be honest in the log.&lt;/strong&gt; Finished, cancelled, and dropped are different things, and the statistics only mean something if I record which one happened.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Anything at importance 8 or above gets done before tomorrow.&lt;/strong&gt; Still my one hard rule.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Sleep beats one more block.&lt;/strong&gt; The agent&amp;rsquo;s defaults put sleep first, and so should I.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="try-it"&gt;Try it&lt;a class="anchor" href="#try-it" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;You need &lt;a href="https://rustup.rs" rel="noopener"&gt;Rust&lt;/a&gt; installed, because the installer builds &lt;code&gt;rmd&lt;/code&gt; from source (the first build takes a few minutes):&lt;/p&gt;&#10;&lt;figure class="terminal "&gt;&#10; &lt;div class="terminal__bar"&gt;&#10; &lt;span class="terminal__dots" aria-hidden="true"&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;&#10; &lt;span class="terminal__title"&gt;~ · zsh&lt;/span&gt;&#10; &lt;button class="copy-btn" type="button" data-copy-commands aria-label="Copy commands"&gt;&lt;svg class="icon icon--copy" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"&gt;&lt;rect x="9" y="9" width="11" height="11" rx="2"/&gt;&lt;path d="M5 15V6a2 2 0 0 1 2-2h8"/&gt;&lt;/svg&gt;&lt;span&gt;Copy&lt;/span&gt;&lt;/button&gt;&#10; &lt;/div&gt;&#10; &lt;pre class="terminal__body"&gt;&lt;code&gt;&lt;span class="term-line term-cmd"&gt;&lt;span class="term-prompt" aria-hidden="true"&gt;$ &lt;/span&gt;&lt;span class="term-input"&gt;curl -fsSL https://raw.githubusercontent.com/AutoPhd-org/schedule-everything/main/install.sh | bash&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="term-line term-cmd"&gt;&lt;span class="term-prompt" aria-hidden="true"&gt;$ &lt;/span&gt;&lt;span class="term-input"&gt;rmd check&lt;/span&gt;&lt;/span&gt;&#10;&lt;span class="term-line term-cmd"&gt;&lt;span class="term-prompt" aria-hidden="true"&gt;$ &lt;/span&gt;&lt;span class="term-input"&gt;rmd web&lt;/span&gt;&lt;/span&gt;&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;/figure&gt;&#10;&#10;&lt;p&gt;The installer puts &lt;code&gt;rmd&lt;/code&gt; in &lt;code&gt;~/SCHEDULE_MANAGEMENT&lt;/code&gt;, creates the config root in &lt;code&gt;~/.schedule_management/config&lt;/code&gt; with a first &lt;code&gt;user_config_0&lt;/code&gt;, and registers the reminder service as a LaunchAgent on macOS or a systemd user service on Linux. It never overwrites existing configuration, so running it again is also how you update. Then add the plugin to your agent and say &amp;ldquo;build my weekly schedule&amp;rdquo;. The &lt;a href="https://autophd-org.github.io/schedule-everything/" rel="noopener"&gt;documentation&lt;/a&gt; covers the rest.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;Last year I ended with &amp;ldquo;your schedule is code&amp;rdquo;. It still is. What changed is who writes most of it: I describe my week, the agent writes the TOML, &lt;code&gt;rmd check&lt;/code&gt; keeps it honest, and an alarm that won&amp;rsquo;t go away makes sure I actually show up.&lt;/p&gt;&#10;</description></item></channel></rss>