gnhf README

The project's README from github.com/kunchenguid/gnhf. As one markdown file: README.md.

Before I go to bed, I tell my agents:

good night, have fun

npm CI Release Platform X Discord

gnhf - Good Night, Have Fun

Never wake up empty-handed.

gnhf is a ralph, autoresearch-style orchestrator that keeps your agents running while you sleep - each iteration makes one small, committed, documented change towards an objective. You wake up to a branch full of clean work and a log of everything that happened.

Quick Start

$ gnhf "reduce complexity of the codebase without changing functionality"
# have a good sleep
$ gnhf "reduce complexity of the codebase without changing functionality" \
    --max-iterations 10 \
    --max-tokens 5000000
# have a good nap
# Run multiple agents on the same repo simultaneously using worktrees
$ gnhf --worktree "implement feature X" &
$ gnhf --worktree "add tests for module Y" &
$ gnhf --worktree "refactor the API layer" &
# Commit directly on the current branch and push after each successful iteration
$ gnhf --current-branch --push "keep improving this app"

Run gnhf from inside a Git repository with a clean working tree. If you are starting from a plain directory, run git init first. gnhf supports macOS, Linux, and Windows.

Install

npm

npm install -g gnhf

From source

git clone https://github.com/kunchenguid/gnhf.git
cd gnhf
corepack enable
pnpm install
pnpm run build
pnpm link --global

Agent Skill

The npm package includes an agent-facing skill at skills/gnhf/SKILL.md. Agents that support local skills can copy or reference this file to learn how to run GNHF in Hands-Off mode for bounded overnight work, or Companion mode when the outer agent should steer and review a long-running GNHF run.

After installing from npm, the skill is available under the installed package directory. From a source checkout, use skills/gnhf/SKILL.md directly.

How It Works

                    ┌─────────────┐
                    │  gnhf start │
                    └──────┬──────┘
                           ▼
                ┌──────────────────────┐
                │  validate clean git  │
                │  create or use branch │
                │  write prompt.md     │
                └──────────┬───────────┘
                           ▼
              ┌────────────────────────────┐
              │  build iteration prompt    │◄──────────────┐
              │  (inject notes.md context) │               │
              └────────────┬───────────────┘               │
                           ▼                               │
              ┌────────────────────────────┐               │
              │  invoke your agent         │               │
              │  (non-interactive mode)    │               │
              └────────────┬───────────────┘               │
                           ▼                               │
                    ┌─────────────┐                        │
                    │  success?   │                        │
                    └──┬──────┬───┘                        │
                  yes  │      │  no                        │
                       ▼      ▼                            │
              ┌──────────┐  ┌───────────┐                  │
              │  commit  │  │ reset or  │                  │
              │  append  │  │  repair   │                  │
              │ notes.md │  │           │                  │
              │maybe wait│  │ maybe wait│                  │
              └────┬─────┘  └─────┬─────┘                  │
                   │              │                        │
                   │   ┌──────────┘                        │
                   ▼   ▼                                   │
              ┌────────────┐    yes   ┌──────────┐         │
              │ 3 consec.  ├─────────►│  abort   │         │
              │ failures   │          └────▲─────┘         │
              │ or perm.   ├───────────────┘               │
              │ error?     │                               │
              └─────┬──────┘                               │
                 no │                                      │
                    └──────────────────────────────────────┘

Live Branch Mode

Pass --current-branch to run on the branch you are already on instead of creating a gnhf/ branch. Pass --push to push the current branch after each successful iteration. Together, --current-branch --push is useful for loose projects where you want a deployed or locally watched branch to update throughout the run.

Worktree Mode

Pass --worktree to run each agent in an isolated git worktree. This lets you launch multiple agents on the same repo simultaneously - each gets its own working directory and branch without interfering with the others or your main checkout.

<repo>/                              ← your repo (unchanged)
<repo>-gnhf-worktrees/
  ├── <run-slug-1>/                  ← worktree for agent 1
  └── <run-slug-2>/                  ← worktree for agent 2

CLI Reference

Command Description
gnhf "<prompt>" Start a new run with the given objective
gnhf Resume a run (when on an existing gnhf/ branch)
echo "<prompt>" | gnhf Pipe prompt via stdin
cat prd.md | gnhf Pipe a large spec or PRD via stdin

If you run gnhf on an existing gnhf/ branch with a different prompt, gnhf asks whether to update prompt.md and continue the existing run history, start a new branch, or quit. When the prompt came from stdin, that confirmation is read from the controlling terminal, so it must be available.

Flags

Flag Description Default
--agent <agent> Agent to use: a native agent name or acp:<target-or-command>; see Agents config file (claude)
--model <model> Model for the agent; overrides agentModel.<agent> from the config file config file
--max-iterations <n> Abort after n total iterations unlimited
--max-tokens <n> Abort after n total input+output+cache tokens unlimited
--max-rate-limit-wait <duration> Abort after this much total Claude usage-limit wait (30m, 2h, or 0) 24h safety cap
--stop-when <cond> End when the agent reports this condition, after any commit-failure repair; persists across resume unlimited
--prevent-sleep <mode> Prevent system sleep during the run (on/off or true/false) config file (on)
--worktree Run in a separate git worktree (enables multiple agents concurrently) false
--current-branch Run on the current branch instead of creating a gnhf/ branch false
--push Push the current branch after each successful iteration false
--meteor-frequency <n> Set TUI meteor frequency from 0 to 5 (0 disables meteors) 3
--version Show version

Configuration

Config lives at ~/.gnhf/config.yml. If the file does not exist yet, gnhf creates it on first run with its defaults. A supplied --agent is written as the default agent. With the default configuration, it has this exact content:

# Agent to use by default: native agent name or acp:<target-or-command>
agent: claude

# Custom paths to native agent binaries (optional)
# Paths may be absolute, bare executable names on PATH,
# ~-prefixed, or relative to this config directory.
# Note: rovodev overrides must point to an acli-compatible binary.
# agentPathOverride:
#   claude: /path/to/custom-claude
#   codex: /path/to/custom-codex
#   copilot: /path/to/custom-copilot
#   pi: /path/to/custom-pi
#   cursor: /path/to/custom-cursor-agent

# Native agent CLI arg overrides (optional)
# ACP targets do not support path or arg overrides.
# agentArgsOverride:
#   codex:
#     - -m
#     - gpt-5.4
#     - -c
#     - model_reasoning_effort="high"
#     - --full-auto
#   copilot:
#     - --model
#     - gpt-5.4
#   pi:
#     - --provider
#     - openai-codex
#     - --model
#     - gpt-5.5
#     - --thinking
#     - high
#   cursor:
#     - --model
#     - composer-2.5

# Models for supported native agents (optional)
# Values are forwarded to the CLI except opencode, which receives
# its model in the request body.
# agentModel:
#   claude: sonnet
#   codex: gpt-5.4
#   opencode: fireworks-ai/accounts/fireworks/models/qwen3p6-plus

# Custom ACP target commands (optional)
# Maps acp:<target> names to spawn commands. Useful for naming a
# local or beta build of an ACP agent.
# acpRegistryOverrides:
#   my-fork: "/usr/local/bin/my-claude-code-fork --acp"
#   staging: "node /opt/staging/agent.mjs"

# Commit message convention (optional)
# Defaults to: gnhf <iteration>: <summary>
# Use Conventional Commits semantic-release headers:
# commitMessage:
#   preset: conventional

# Abort after this many consecutive failures
maxConsecutiveFailures: 3

# Prevent the machine from sleeping during a run
preventSleep: true

CLI flags override config file values. --prevent-sleep accepts on/off as well as true/false; the config file always uses a boolean. The iteration, token, and rate-limit-wait caps are runtime-only flags and are not persisted in config.yml; --stop-when is persisted per run for resume, but not in config.

`

gnhf (kunchenguid/gnhf)

git-worktrees
Searching Database…

4.2K ·GitHub
What is this?gnhf is an overnight orchestrator for AI coding agents: you give it an objective before bed and it loops autonomously, with each iteration making one small, committed, documented change toward the goal. You wake up to a branch of clean work and a log of everything that happened.
So is this a terminal tool, a background service, or a library?A terminal tool: you install it with npm and start it with one command from your repo. Runs show live status, token totals and commit count in an interactive TUI, and every run ends with a permanent exit summary of elapsed time, iterations, tokens and diff stats.
How do I start a run?Install the package from npm, then run gnhf inside a Git repository with a clean working tree, e.g. gnhf 'fix all failing tests'. A plain directory needs git init first, and large specs can be piped in with cat prd.md | gnhf.
Do I need my own AI coding agent for this to work?Yes — gnhf drives a coding agent CLI, it does not ship a model itself. Claude is the default, other popular coding agent CLIs and any ACP target also work, and you need Node.js 20 or newer plus Git.
Any gotchas before I leave it running overnight?Start from a clean working tree, and note that commits are deliberately unsigned so GPG or SSH prompts can never stall the loop. On Linux a known bug can leave an empty worktree behind after a systemd-inhibit re-exec — remove it manually with git worktree remove.
Will it run on Windows, or is this a Mac-and-Linux thing?All three desktops are covered: gnhf supports macOS, Linux, and Windows. It also tries to keep your machine awake during a run with --prevent-sleep, which is on by default.
What does one iteration actually do?Success is committed as its own unsigned Git commit; a failed iteration is rolled back with git reset --hard. Agents pass context forward through notes.md, which each iteration reads and appends to, so later iterations remember earlier work.
What happens if the agent hits its usage limit in the middle of the night?It waits instead of failing: gnhf reads the reset time from the agent's rate-limit event, sleeps until just after the window resets, then retries the same iteration automatically. --fallback-model can retry a rejected iteration on a different model.
How do I keep it from burning tokens all night?Three runtime caps: --max-iterations stops before the next iteration begins, --max-tokens aborts mid-iteration once reported usage crosses the cap, and --stop-when ends the loop once the agent reports your natural-language condition is met.
Can I run several agents on the same repo at the same time?Yes — pass --worktree and each agent gets an isolated Git worktree with its own branch, without touching your main checkout. Worktrees with commits are preserved afterwards for review or cherry-picking; launch from a normal branch like main.
Size
4.4 MB
Stars
4.2K
Age
6mo
Commits · 90 Days