A terminal curfewthat feels human.

Curfew helps you protect your quiet hours with clear rules, rounded edges, and just enough friction to keep late-night confidence from making tomorrow more expensive.

$ brew install iamrajjoshi/tap/curfew

Tonight

11:00 pm

Warning window starts at 10:30. Hard stop lands at 1:00.

Check

$ git push

“Still sure? Type the passphrase.”

Mood

Helpful, not smug.

The copy nudges you like a kind teammate.

block risky commandskeep streaks localno background service
Why it exists

Protect the version of you that has good intentions and bad circadian timing.

Curfew is built for the moment when you know you should wind down, but your terminal still looks full of possibility.

Late-night confidence is a liar

Curfew gives you a pause before a sleepy push, deploy, or rabbit-hole session turns into tomorrow's repair job.

The rules stay boring on purpose

Quiet hours, warning windows, hard stops, and first-match-wins command rules are explicit enough to trust at 12:47 a.m.

It feels like a helpful friend

Use gentle prompts, waits, passphrases, math, or harder blocks instead of a one-size-fits-all lockout.

Features

Five colors. Six sharp edges softened on purpose.

Curfew keeps the semantics boring while making the experience approachable enough to actually use.

Local-first

No daemon. No account. No telemetry.

Curfew is one Go binary with managed shell hooks and local storage. The hot path stays fast and predictable.

Everything lives on your machine.

Shell hooks

Thin adapters, real policy in the binary.

The shell hook only forwards `curfew check <cmd>`. Schedule evaluation, rules, friction, and history all stay in Go.

Supports zsh, bash, and fish.

Friction

Soft reminders or a real stop sign.

Choose presets or custom tiers with prompts, waits, passphrases, math, or combined challenges.

Different tiers for warning, curfew, and hard stop.

Rules

First match wins.

Mix exact command words, multi-word prefixes, and trailing `*` prefix patterns without clever parsing.

Allowlist entries always bypass curfew.

History

See what happened after hours.

Curfew records nightly adherence, blocked attempts, snoozes, overrides, and streak-friendly stats in local storage.

SQLite history plus lightweight runtime state.

TUI

Friendly enough to tweak without editing TOML all night.

Jump through Dashboard, Schedule, Rules, Override, History, and Stats from one Bubble Tea interface.

Designed for quick edits and clearer habits.

How it works

Set it once. Let the shell do the checking.

Curfew stays out of the way until your rules, schedule, and current tier say it’s time to slow down.

1

Set your quiet hours

Run Curfew once, then choose your bedtime, wake time, warning window, and how strict you want each tier to feel.

curfew
2

Install the shell hook

Curfew adds a managed block to your shell rc file so interactive commands get checked before they run.

curfew install --shell zsh
3

Let the night unfold locally

During warning and curfew windows, matching commands are allowed, warned, delayed, or blocked according to your config.

curfew status
Configure it

The setup is simple enough to remember half asleep.

Curfew keeps the config shape direct: schedule, grace, override behavior, rules, allowlist, and logging. No mystery toggles hiding somewhere else.

Rules

Match exact commands, multi-word prefixes, or a trailing `*` prefix, then let first match win.

Friction

Move from soft reminders to waits, passphrases, math, or a hard block when it’s time to really go to bed.

~/.config/curfew/config.toml
[schedule]
timezone = "auto"

[schedule.default]
bedtime = "23:00"
wake = "07:00"

[grace]
warning_window = "30m"
hard_stop_after = "01:00"

[override]
preset = "medium"
passphrase = "i am choosing to break my own rule"

[[rules.rule]]
pattern = "git push*"
action = "warn"
Trust

Everything important stays on disk.

Curfew is intentionally small. No telemetry. No accounts. No server to keep alive while you’re trying to sleep.

Config

`config.toml`

Quiet hours, grace periods, override presets, rules, allowlist entries, and retention settings.

Runtime

`runtime.json`

Fast session state for snoozes, disabled nights, and the shell hot path where latency matters.

History

`history.db`

Local SQLite storage for nightly rollups, streaks, blocked attempts, overrides, and after-hours command history.

Get started

Bring a little bedtime structure to your terminal.

Install Curfew, configure your rules, and let the docs walk you through the details without getting preachy about it.

brew install iamrajjoshi/tap/curfew