{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "cactus",
  "description": "What's new on Cactus",
  "home_page_url": "https://denismoulin.com",
  "feed_url": "https://denismoulin.com/feeds/cactus.json",
  "language": "en",
  "items": [
    {
      "id": "https://denismoulin.com/posts/cactus-time-limits",
      "url": "https://denismoulin.com/posts/cactus-time-limits",
      "title": "Time limits, baking",
      "content_html": "<p>I&#39;m working on a fourth kind of rule: <strong>time limits</strong>. You give an app thirty minutes a day, and when they&#39;re spent, the shield comes down until midnight. It&#39;s only on my phone for now. Counting minutes reliably on iOS is trickier than I expected, and I&#39;d rather let it bake.</p>\n",
      "date_published": "2026-08-13T00:00:00.000Z",
      "summary": "A fourth kind of rule is in the oven: block an app after N minutes of use.",
      "tags": [
        "cactus"
      ]
    },
    {
      "id": "https://denismoulin.com/posts/cactus-quotes",
      "url": "https://denismoulin.com/posts/cactus-quotes",
      "title": "Borrowed quotes",
      "content_html": "<p>When Cactus asks you to type a quote to unlock a rule, the words used to be mine. They aren&#39;t anymore.</p>\n<p>I swapped them for nine lines about attention, silence, and the present moment, from Woolf, Thoreau, Pascal, Weil, Marcus Aurelius, Dillard, and Rilke. Each one is credited under the line as you type.</p>\n",
      "date_published": "2026-08-05T00:00:00.000Z",
      "summary": "The quotes you type to unlock a rule are no longer mine.",
      "tags": [
        "cactus"
      ]
    },
    {
      "id": "https://denismoulin.com/posts/cactus-set-in-stone",
      "url": "https://denismoulin.com/posts/cactus-set-in-stone",
      "title": "Set in stone",
      "content_html": "<p>I added a toggle called <strong>Set in stone</strong>, for the rules I know I&#39;ll try to talk my way out of.</p>\n<p>Flip it, save, and the rule is sealed until its end date. You can&#39;t edit it, can&#39;t delete it, can&#39;t remove apps from it. Adding more is the only change allowed. Breaks still work, because a rule with no way out isn&#39;t a rule, it&#39;s a trap.</p>\n",
      "date_published": "2026-08-04T00:00:00.000Z",
      "summary": "A new toggle for the rules you don't trust yourself with.",
      "tags": [
        "cactus"
      ]
    },
    {
      "id": "https://denismoulin.com/posts/cactus-share-extension",
      "url": "https://denismoulin.com/posts/cactus-share-extension",
      "title": "Block a website from Safari",
      "content_html": "<p>Cactus can now block websites, straight from the page you&#39;re trying to escape.</p>\n<p>Share from Safari, tap Cactus, pick a rule, done. If the rule is running, the site is blocked before you can refresh it. Share it again to remove it, unless the rule is active, in which case no. That&#39;s the point.</p>\n<p>If you&#39;d rather type, the rule form takes websites directly, with a folded-away list of the usual suspects.</p>\n",
      "date_published": "2026-08-01T00:00:00.000Z",
      "summary": "Cactus can now block websites, straight from the page you're trying to escape.",
      "tags": [
        "cactus"
      ]
    },
    {
      "id": "https://denismoulin.com/posts/cactus-emergency",
      "url": "https://denismoulin.com/posts/cactus-emergency",
      "title": "Emergency mode",
      "content_html": "<p>I&#39;ve built a new mode. I call it emergency mode for now. I thought it&#39;d be cool to stop the phone altogether.</p>\n<p>Emergency mode locks everything except a few apps you choose ahead of time: Messages, Maps, whatever you actually need. One tap in.</p>\n<p>I originally built it to only block what your rules already covered, and when I tried it on my own phone it felt broken. Everything else was still right there. So I flipped it: block it all, let a few things through.</p>\n",
      "date_published": "2026-07-26T00:00:00.000Z",
      "summary": "Some days call for more than rules. Emergency mode locks the whole phone.",
      "tags": [
        "cactus"
      ]
    },
    {
      "id": "https://denismoulin.com/posts/cactus-friction",
      "url": "https://denismoulin.com/posts/cactus-friction",
      "title": "Graduated friction",
      "content_html": "<p>I noticed I was taking breaks a little too easily, so I made them cost something.</p>\n<p>The first break of the day is a tap. The second asks you to type part of a quote. From the third on, the whole thing. Each rule counts its own breaks, and everything resets at midnight.</p>\n",
      "date_published": "2026-07-19T00:00:00.000Z",
      "summary": "Breaks in Cactus now get a little harder each time you take one.",
      "tags": [
        "cactus"
      ]
    },
    {
      "id": "https://denismoulin.com/posts/cactus-shield",
      "url": "https://denismoulin.com/posts/cactus-shield",
      "title": "Frosted glass",
      "content_html": "<p>The blocking screen used to be a solid sheet of color. Now it&#39;s frosted glass. The app you tried to open is right there behind it, blurred, with the message on top.</p>\n<p>The lock icon got redrawn too. It was being scaled up from a small image and arrived soft, and now it&#39;s crisp.</p>\n",
      "date_published": "2026-07-09T00:00:00.000Z",
      "summary": "The blocking screen now lets you see the app you can't have.",
      "tags": [
        "cactus"
      ]
    },
    {
      "id": "https://denismoulin.com/posts/cactus-vacation",
      "url": "https://denismoulin.com/posts/cactus-vacation",
      "title": "Vacation mode",
      "content_html": "<p>Sometimes you don&#39;t want a rule forever, just until the end of the trip.</p>\n<p>So rules can now carry an end date. Set it before you leave, pick the day you&#39;re back, and the rule retires itself when the trip is over. It wears a little rainbow glow while it runs, and the blocking screen tells you when it ends.</p>\n",
      "date_published": "2026-06-26T00:00:00.000Z",
      "summary": "Sometimes you don't want a rule forever, just until the end of the trip.",
      "tags": [
        "cactus"
      ]
    },
    {
      "id": "https://denismoulin.com/posts/cactus-always-on",
      "url": "https://denismoulin.com/posts/cactus-always-on",
      "title": "Always on",
      "content_html": "<p>Cactus rules used to live on a schedule: these apps, these hours. Now a rule can simply be <strong>always on</strong>, blocked all the time until you take a break or delete the rule.</p>\n<p>It&#39;s the mode I use for the apps I don&#39;t want a schedule for. I just don&#39;t want them.</p>\n",
      "date_published": "2026-05-17T00:00:00.000Z",
      "summary": "Cactus rules used to live on a schedule. Now a rule can simply be always on.",
      "tags": [
        "cactus"
      ]
    },
    {
      "id": "https://denismoulin.com/posts/cactus-first-rule-flow",
      "url": "https://denismoulin.com/posts/cactus-first-rule-flow",
      "title": "Step by step",
      "content_html": "<p>Setting your first rule used to drop you into the full rule form, every option at once. It&#39;s now a flow with one question per screen: which apps, then when, then how much of a break budget you get.</p>\n<p>Existing rules keep the regular form. The flow is only for the first one.</p>\n",
      "date_published": "2026-05-17T00:00:00.000Z",
      "summary": "The first rule is now a flow, one question per screen.",
      "tags": [
        "cactus"
      ]
    },
    {
      "id": "https://denismoulin.com/posts/cactus-fifteen-minutes",
      "url": "https://denismoulin.com/posts/cactus-fifteen-minutes",
      "title": "The fifteen minute floor",
      "content_html": "<p>You can&#39;t block an app for five minutes. Apple&#39;s scheduling framework rejects any window shorter than fifteen, and Cactus used to let you save one anyway.</p>\n<p>The form now stops you with &quot;Must be at least 15 minutes long&quot;.</p>\n",
      "date_published": "2026-04-19T00:00:00.000Z",
      "summary": "Apple won't schedule a block shorter than fifteen minutes, so the form says so now.",
      "tags": [
        "cactus"
      ]
    },
    {
      "id": "https://denismoulin.com/posts/cactus-icons",
      "url": "https://denismoulin.com/posts/cactus-icons",
      "title": "A choice of icons",
      "content_html": "<p>Cactus can change its icon now. Alongside the default spark there are two alternates, one called Grow and one called Plant, and a sheet in the app to pick from.</p>\n",
      "date_published": "2026-04-19T00:00:00.000Z",
      "summary": "The spark now has company.",
      "tags": [
        "cactus"
      ]
    },
    {
      "id": "https://denismoulin.com/posts/cactus-countdown",
      "url": "https://denismoulin.com/posts/cactus-countdown",
      "title": "A ticking card",
      "content_html": "<p>Rule cards tick now. Each one counts down to its next change, the moment a block starts or lifts, live to the second.</p>\n<p>Past 24 hours the countdown gives up on hours and just says &quot;3 days&quot;.</p>\n",
      "date_published": "2026-04-15T00:00:00.000Z",
      "summary": "Rule cards now count down to their next change.",
      "tags": [
        "cactus"
      ]
    },
    {
      "id": "https://denismoulin.com/posts/cactus-midnight",
      "url": "https://denismoulin.com/posts/cactus-midnight",
      "title": "The midnight bug",
      "content_html": "<p>A rule that runs overnight crosses midnight, and Cactus treated each day it touched as a separate block. When the first one ended, the shields came down in the middle of the night, hours before the rule was done.</p>\n<p>Consecutive days now merge into one continuous block. A rule set for Friday and Saturday, 7pm to 6:55pm, is one block instead of two, and the shields stay up until it actually ends.</p>\n",
      "date_published": "2026-03-29T00:00:00.000Z",
      "summary": "Rules that cross midnight used to lose their shields halfway through.",
      "tags": [
        "cactus"
      ]
    },
    {
      "id": "https://denismoulin.com/posts/cactus-tips",
      "url": "https://denismoulin.com/posts/cactus-tips",
      "title": "Tips instead of a manual",
      "content_html": "<p>I don&#39;t want a help section, so Cactus explains itself in passing. The first time you create a rule, pause one, or come back from a pause, a small sheet tells you what just happened. Each tip shows once and never again.</p>\n",
      "date_published": "2026-03-14T00:00:00.000Z",
      "summary": "Cactus explains itself in passing, one small sheet at a time.",
      "tags": [
        "cactus"
      ]
    },
    {
      "id": "https://denismoulin.com/posts/cactus-hello",
      "url": "https://denismoulin.com/posts/cactus-hello",
      "title": "Meet Cactus",
      "content_html": "<p>The screen time app I&#39;ve been prototyping has a name now: <strong>Cactus</strong>.</p>\n<p>I built it because I didn&#39;t want streaks or guilt or another subscription. Just something small and prickly between me and the apps I asked it to guard.</p>\n",
      "date_published": "2026-03-09T00:00:00.000Z",
      "summary": "The screen time app I've been prototyping has a name now: Cactus.",
      "tags": [
        "cactus"
      ]
    },
    {
      "id": "https://denismoulin.com/posts/cactus-more-rules",
      "url": "https://denismoulin.com/posts/cactus-more-rules",
      "title": "More than one rule",
      "content_html": "<p>The prototype had a single hardcoded rule. Now rules are a list, each with a name and its own schedule, running independently of the others.</p>\n<p>The old single rule migrates over on its own the first time you open the new version.</p>\n",
      "date_published": "2026-03-07T00:00:00.000Z",
      "summary": "Rules are a list now, each with a name and its own schedule.",
      "tags": [
        "cactus"
      ]
    },
    {
      "id": "https://denismoulin.com/posts/cactus-reboot",
      "url": "https://denismoulin.com/posts/cactus-reboot",
      "title": "Surviving a reboot",
      "content_html": "<p>Three days in, I found the first hole in the wall: restarting the phone. iOS clears every shield on reboot, and the schedule won&#39;t fire again for a window that&#39;s already underway, so a block you were in the middle of never came back.</p>\n<p>Cactus now checks on launch whether a rule should be active and puts the shields back itself.</p>\n",
      "date_published": "2026-03-07T00:00:00.000Z",
      "summary": "Restarting the phone used to lift every block.",
      "tags": [
        "cactus"
      ]
    },
    {
      "id": "https://denismoulin.com/posts/cactus-quiet",
      "url": "https://denismoulin.com/posts/cactus-quiet",
      "title": "Before the name",
      "content_html": "<p>Before Cactus was Cactus it was a project called <strong>Quiet</strong>, and it did exactly one thing. You picked apps and a window of hours, and iOS put a shield over them until the window closed.</p>\n<p>There was one rule, and only one. I wanted to know if Apple&#39;s Screen Time APIs would actually let me build the blocking part before building anything around it. The form for a second rule came three days later.</p>\n",
      "date_published": "2026-03-04T00:00:00.000Z",
      "summary": "The first version of Cactus was a project called Quiet, and it did exactly one thing.",
      "tags": [
        "cactus"
      ]
    }
  ]
}