
Security News
Feross on the 10 Minutes or Less Podcast: Nobody Reads the Code
Socket CEO Feross Aboukhadijeh joins 10 Minutes or Less, a podcast by Ali Rohde, to discuss the recent surge in open source supply chain attacks.
Early alpha — functional but not production ready. Feedback welcome!
Simple version control for humans. Undo anything.
undu save "login working" # Save your work
undu back # Go back one step
undu history # See your timeline
No staging. No branches. No merge conflicts. Just save and undo.
$ undu
undu │ my-project
────────────────────────────────────────
2 files changed since "Login working"
M src/auth.ts
A src/utils.ts
Quick actions:
undu save "..." Save these changes
undu back Discard changes
undu diff See what changed
$ undu history
Your Timeline
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
◆ Now (unsaved changes)
│
● "Added greet function and config" ─── 2 min ago
│
◆ "Added README and updated app" ────── 5 min ago (current)
│
○ Auto-save ─────────────────────────── 10 min ago
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
$ undu save "Login feature complete"
✓ Saved checkpoint: "Login feature complete"
ID: d7be73504005ea56
Files: 12
$ undu back
✓ Restored to: "Added README and updated app"
5 minutes ago
Git is powerful but complex. It was designed for coordinating thousands of Linux kernel developers. Most of us just want to:
undu does exactly that. Nothing more, nothing less.
npm install -g undu
Works on Windows, macOS, and Linux — no additional runtime required.
Download from GitHub Releases:
undu-win.exe — Windows x64undu-linux — Linux x64undu-macos — macOS ARM64git clone https://github.com/bdekraker/undu.git
cd undu
bun install
bun run build:win # or build:linux, build:macos
┌─────────────┐ undu init ┌─────────────┐
│ Your Project│ ─────────────────▶ │ Initialized │
└─────────────┘ └──────┬──────┘
│
┌─────────────────────┘
▼
┌───────────────────┐
│ Make changes │◀─────────────────┐
└─────────┬─────────┘ │
│ │
▼ undu save "..." │
┌───────────────────┐ │
│ ● Checkpoint │ │
└─────────┬─────────┘ │
│ │
▼ │
┌───────────────────┐ │
│ More changes │ │
└─────────┬─────────┘ │
│ │
▼ something broke! │
┌───────────────────┐ undu back │
│ What now? │──────────────────┘
└───────────────────┘
# Initialize in your project
cd my-project
undu init
# Make some changes, then save
undu save "added user authentication"
# See your timeline
undu history
# Something broke? Go back
undu back
# Jump to a specific checkpoint
undu goto "added user authentication"
| Command | Alias | Description |
|---|---|---|
undu | Show status (default) | |
undu init | undu i | Initialize repository |
undu save "msg" | undu s "msg" | Create checkpoint |
undu back [n] | undu b [n] | Go back n steps |
undu goto "name" | undu g "name" | Jump to checkpoint |
undu history | undu h | Show timeline |
undu diff | undu d | Show changes |
undu peek "name" | undu p "name" | Preview checkpoint |
undu watch | undu w | Auto-save on changes |
Forget branches and staging areas. undu has just one concept: a timeline.
┌─────────────────────────────────────────────────────────────┐
│ │
│ Your Timeline │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
│ │
│ ◆ Now (unsaved changes) │
│ │ │
│ ● "Login working!" ─────────────────────── 10 min ago │
│ │ │
│ ● "Before refactor" ────────────────────── 1 hour ago │
│ │ │
│ ● "First working version" ──────────────── yesterday │
│ │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
│ │
└─────────────────────────────────────────────────────────────┘
That's it. Save checkpoints. Go back when needed.
╔══════════════════════════════════╗ ╔═══════════════════════════╗
║ GIT ║ ║ UNDU ║
╠══════════════════════════════════╣ ╠═══════════════════════════╣
║ ║ ║ ║
║ Working Directory ║ ║ Now ║
║ │ ║ ║ │ ║
║ ▼ ║ ║ ▼ ║
║ Staging Area ║ ║ ● Checkpoint ║
║ │ ║ ║ │ ║
║ ▼ ║ ║ ▼ ║
║ Local Commits ◀─┐ ║ ║ ● Checkpoint ║
║ │ │ │ │ merge ║ ║ │ ║
║ ▼ ▼ ▼ │ ║ ║ ▼ ║
║ main feat-1 feat-2 ║ ║ ● Checkpoint ║
║ │ ║ ║ ║
║ ▼ ║ ║ ║
║ Remote ║ ║ That's it. ║
║ ║ ║ ║
╚══════════════════════════════════╝ ╚═══════════════════════════╝
undu includes an MCP server for Claude Code integration. Claude can directly interact with your timeline:
┌─────────┐ ┌─────────┐ ┌─────────┐
│ You │ │ Claude │ │ undu │
└────┬────┘ └────┬────┘ └────┬────┘
│ │ │
│ "something broke in │ │
│ the last hour" │ │
│ ───────────────────────────▶│ │
│ │ │
│ │ undu_history │
│ │ ────────────────────────────▶│
│ │ │
│ │ [checkpoints] │
│ │ ◀────────────────────────────│
│ │ │
│ │ undu_diff │
│ │ ────────────────────────────▶│
│ │ │
│ │ [changes] │
│ │ ◀────────────────────────────│
│ │ │
│ "Found it! auth.py │ │
│ line 23 changed" │ │
│ ◀───────────────────────────│ │
│ │ │
│ "restore it" │ │
│ ───────────────────────────▶│ │
│ │ │
│ │ undu_goto │
│ │ ────────────────────────────▶│
│ │ │
│ │ ✓ restored │
│ │ ◀────────────────────────────│
│ │ │
│ "Done! Restored." │ │
│ ◀───────────────────────────│ │
│ │ │
─────┴──────────────────────────────┴──────────────────────────────┴─────
Add to your Claude Code MCP settings:
{
"mcpServers": {
"undu": {
"command": "bun",
"args": ["run", "/path/to/undu/src/mcp/server.ts"]
}
}
}
--json Output as JSON (for scripts/AI)
--help Show help
--version Show version
┌─────────────────────────────────────────────────────────────────────┐
│ Your Project .undu/ │
│ ───────────── ────── │
│ │
│ ┌──────────────┐ ┌────────────────────────────┐ │
│ │ file1.ts │ ───────┐ │ undu.db (SQLite) │ │
│ └──────────────┘ │ │ ┌──────────────────────┐ │ │
│ │ hash │ │ checkpoints │ │ │
│ ┌──────────────┐ │ │ │ files │ │ │
│ │ file2.ts │ ───────┼─────────▶│ │ timestamps │ │ │
│ └──────────────┘ │ │ └──────────────────────┘ │ │
│ │ └────────────────────────────┘ │
│ ┌──────────────┐ │ │
│ │ config.json │ ───────┘ ┌────────────────────────────┐ │
│ └──────────────┘ │ objects/ │ │
│ │ ├── a1/ │ │
│ │ │ └── b2c3d4e5... │ │
│ Same content? │ └── f7/ │ │
│ Stored once! ─────────────────│ └── 89abcdef... │ │
│ (deduplication) └────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
Storage Structure:
.undu/
├── undu.db # SQLite database (metadata, timeline)
├── objects/ # Content-addressed file storage
└── config.toml # Settings
By default, undu ignores:
.git, .undu, node_modulesdist, build, .next, .cache.env, .env.local*.pyc, __pycache__, *.logEdit .undu/config.toml to customize.
┌────────────────────┬─────────────────────────────────┬──────────────────┐
│ Task │ Git │ undu │
├────────────────────┼─────────────────────────────────┼──────────────────┤
│ Save work │ git add -A && git commit -m "." │ undu save "..." │
│ Go back │ git checkout HEAD~3 │ undu back 3 │
│ See history │ git log --oneline │ undu history │
│ What changed? │ git diff HEAD~1 │ undu diff │
└────────────────────┴─────────────────────────────────┴──────────────────┘
Never lose work again. Run undu watch and undu will automatically save your changes:
$ undu watch
undu watching: my-project
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Auto-saving every 30 seconds of inactivity
Press Ctrl+C to stop (your work is still safe)
○ Auto-saved at 2:34:15 PM (3 files)
○ Auto-saved at 2:35:02 PM (1 files)
Auto-saves appear in your timeline as ○ (vs ● for manual checkpoints). They're pruned automatically to save space while keeping recent history dense.
MIT
Benjamin DeKraker (@bdekraker)
Built for humans who just want to code.
FAQs
Simple version control for humans. Undo anything.
The npm package undu receives a total of 5 weekly downloads. As such, undu popularity was classified as not popular.
We found that undu demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Socket CEO Feross Aboukhadijeh joins 10 Minutes or Less, a podcast by Ali Rohde, to discuss the recent surge in open source supply chain attacks.

Research
/Security News
Campaign of 108 extensions harvests identities, steals sessions, and adds backdoors to browsers, all tied to the same C2 infrastructure.

Security News
OpenAI rotated macOS signing certificates after a malicious Axios package reached its CI pipeline in a broader software supply chain attack.