UNF*

Your AI agent just wiped your workspace. You didn't commit.

UNF* recorded every version. Rewind any file to any second.
No commits required.

Open source · MIT / Apache-2.0 · Star us on GitHub

Install in seconds with one command.

# macOS (universal binary, includes CLI) $ brew install --cask cyrusradfar/unf/unfudged
# macOS + Linux $ brew install cyrusradfar/unf/unf
$ curl -fsSLO https://downloads.unfudged.io/releases/latest/unf_arm64.deb $ sudo dpkg -i unf_arm64.deb
$ curl -fsSLO https://downloads.unfudged.io/releases/latest/unf_amd64.deb $ sudo dpkg -i unf_amd64.deb
# Requires Rust 1.80+ $ git clone https://github.com/cyrusradfar/homebrew-unf.git $ cd homebrew-unf $ cargo build --release $ cp target/release/unf /usr/local/bin/
Read the docs

Files disappear between commits.

An AI agent rewrites 47 files. You weren't watching.
You delete the wrong branch. No backup.
A refactor breaks everything. The working version is gone.
You close the editor. It saved over the good version.

Git can't help. You didn't commit.

Ctrl+Z can't help. You closed the editor.

Time Machine can't help. It runs hourly.

UNF* records continuously. Every save, every second.

If your filesystem saw it, UNF* has it.

$ unf watch Watching /Users/dev/myproject (1,247 files) ... AI agent mass-refactors 47 files ... $ unf log src/main.rs --since 30m 14:32:07 +12 -3 before AI touched it 14:32:45 +89 -67 AI refactor (47 files in burst) 14:33:01 +4 -2 AI follow-up change $ unf restore --at 2h src/main.rs ✓ Restored 47 files to pre-AI state $ unf recap Session: 2h 14m | 847 snapshots | 132 files touched AI Bursts: 2 detected, safety points created

Real commands. Real output.

How it works
01
WATCH

FSEvents on macOS, inotify on Linux. Respects .gitignore. Skips binaries. 3-second smart debounce.

<1% CPU · <100MB RAM

02
STORE

BLAKE3 content hashing. SQLite with ACID guarantees. Content-addressed, so identical files are stored once. Local-only, always.

03
REWIND

Point-in-time restore for any file, any second. Manual pruning with unf prune to reclaim space.

Read the technical deep dive
Commands
unf watchStart recording the current directory
unf unwatchStop recording (history preserved)
unf statusWatcher status + snapshot stats
unf log <file>Timeline of every version of a file
unf log --since / --untilFilter log to a time range
unf diff --at "5m"What changed in the last 5 minutes
unf restore --at TIMERewind files to any point in time
unf cat --at TIMEView file contents at a point in time
unf recapSummarize session activity + context
unf listShow all watched directories
unf pruneClean up old snapshots per retention policy
unf stop / restartControl the background daemon
unf configShow storage location and disk usage
unf config --move-storageMove storage to a new location

Time formats

Relative: 5m 1h 2d

Absolute: ISO 8601 timestamps

Global flags

--json — machine-readable output for all commands

--project <PATH> — operate on any project from anywhere

What gets recorded

All text files, recursively. Respects .gitignore. Skips binaries by magic-number detection.

Storage

Defaults to ~/.unfudged/. Move anywhere with unf config --move-storage. Nothing inside your project directory. Content-deduplicated.

Install
# macOS (universal binary, includes CLI) $ brew install --cask cyrusradfar/unf/unfudged
# macOS + Linux $ brew install cyrusradfar/unf/unf
$ curl -fsSLO https://downloads.unfudged.io/releases/latest/unf_arm64.deb $ sudo dpkg -i unf_arm64.deb
$ curl -fsSLO https://downloads.unfudged.io/releases/latest/unf_amd64.deb $ sudo dpkg -i unf_amd64.deb
# Requires Rust 1.80+ $ git clone https://github.com/cyrusradfar/homebrew-unf.git $ cd homebrew-unf $ cargo build --release $ cp target/release/unf /usr/local/bin/

Then: unf watch. That's it.

Fast <1% CPU. You won't notice it.
Local-first No cloud. Nothing leaves your machine.
Free No subscription. No limits.
Secure No accounts. No telemetry. No network.
Use cases