a nuffo guide for builders · 8 minute read

When your AI starts too much.

Claude Code and Cursor can scaffold a new app in the time it takes to say “what if…”. That’s wonderful, and it’s why so many builders now have twelve half-built repos. Here’s how to keep your agent on the projects you’re actually finishing, with or without Nuffo.

Nuffo gently holding back an eager little robot on a leash that is reaching for a pile of new empty boxes

Starting is free now.

A new side project used to cost a weekend of setup. Now it costs one prompt. Agents are also eager: ask for a small feature and you might get a brand-new repo, a fresh framework and a different database than yesterday.

None of that is the agent’s fault. It does what it’s asked, fast. The missing piece is a gentle “wait, is this one of the three?” at the moment a new project is about to begin. You can add that in three layers.

Layer 1: a rules file.

Claude Code reads CLAUDE.md and Cursor reads its rules files. Write your current projects there, with a simple rule about new ones:

## My current projects (max 3)
1. recipe app: launch the beta
2. newsletter: weekly issue every Sunday
3. kitchen reno (not code, but it's taking my evenings)

## Rules
- Only work on these three. If a task looks like a new project, stop and ask me first.
- Never scaffold a new app, repo or package without asking.
- If I bring up a new idea, write it to IDEAS.md with today's date, then get back to the current task.

It’s free and takes two minutes. The weakness: it’s a suggestion. In a long session, or with a persuasive idea, the model may drift.

Layer 2: a hook that asks first.

Claude Code can run a small script before every tool call (a PreToolUse hook). The script gets the command as JSON on standard input and can allow it, deny it, or ask you. Here’s a tiny one that only speaks up when a shell command looks like it starts a new project:

#!/usr/bin/env node
// ~/.claude/hooks/new-project-check.mjs
// Asks before a shell command that starts a new project.
let raw = "";
process.stdin.on("data", (c) => (raw += c));
process.stdin.on("end", () => {
  const cmd = JSON.parse(raw || "{}")?.tool_input?.command ?? "";
  const starts =
    /\b(npm|pnpm|yarn|bun)\s+(create|init)\b|\bnpx\s+create-|\bgit\s+init\b|\bcargo\s+new\b|\brails\s+new\b|\bgh\s+repo\s+create\b/;
  if (!starts.test(cmd)) return; // not a new project: say nothing, carry on
  process.stdout.write(JSON.stringify({
    hookSpecificOutput: {
      hookEventName: "PreToolUse",
      permissionDecision: "ask",
      permissionDecisionReason:
        "This starts a new project. Is it one of my current three? If not, let's write the idea down and finish what's open first.",
    },
  }));
});

Then tell Claude Code to run it before shell commands:

// ~/.claude/settings.json (merge into what's there)
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [{ "type": "command", "command": "node ~/.claude/hooks/new-project-check.mjs", "timeout": 5 }]
      }
    ]
  }
}

Layer 3: let your AI know your three.

The Model Context Protocol (MCP) lets an assistant call tools on a server you connect. A to-do server that exposes your current projects and today’s plan means you can ask “what should I work on?” and get an answer grounded in what you’ve actually committed to, in Claude, ChatGPT or any MCP client.

Nuffo’s MCP server has five tools:

  • dump: add anything to your list (it’s sorted for you; it can never add to today).
  • get_today: today’s three, or Nuffo’s suggestion if you haven’t picked.
  • get_bets: your three projects and their next steps.
  • check_bet: does this new work belong to one of the three?
  • complete: tick something off.

Setup for Claude and ChatGPT is on the connect page.

Or: one command.

If you’d rather not build it yourself, the Nuffo CLI sets up all three layers on your machine:

npx @nuffo/cli connect
  1. 1

    Pairs this machine with your account

    A short code in the browser. No passwords in the terminal.
  2. 2

    Installs the hooks for Claude Code and Cursor

    They check new projects against your three (folders, git remotes, keywords) and ask you when something new begins: add it to one of your three, cool it for 7 days, swap one out, or just this once.
  3. 3

    Adds the MCP server

    So your agent knows your three and today's plan, and can drop new ideas on your list.

npx @nuffo/cli disconnect removes all of it again. Everything fails open: if Nuffo is unreachable, your agent keeps working as normal.

Quick answers

Can Claude Code hooks block a command?

Yes. A PreToolUse hook runs before a tool call such as a shell command. It can allow it, deny it with a reason, or ask you first. The example on this page asks only when a command looks like it starts a new project.

Does this work in Cursor?

Cursor has a similar hook (beforeShellExecution) with its own response format. The Nuffo CLI installs both for you; the do-it-yourself example here is for Claude Code.

Will a hook slow my agent down?

A small local script adds a few milliseconds. If you call a server, keep a short timeout and let the command through if the check fails (fail open), so your work never stops because a check is down.

Is a rules file enough on its own?

It helps a lot, but models don't always follow instructions, especially in long sessions. A hook is the part that can't be talked out of it.

What does Nuffo add?

Your three projects live in one place, across tools. The hook checks new projects against them (folders, repo remotes, keywords), your AI can read your three and today's plan over MCP, and new ideas go to a list that waits a week. Everything an agent adds leaves an undoable receipt.

Your AI starts everything. Nuffo helps you finish.

Three projects, three things a day, and a hook that asks before your agent starts a fourth. Free to start.

Start free