Oops - Simple File Versioning for Everyone π―
Oops! Made a mistake? No worries - you can always go back!
A single binary with zero runtime dependencies. No Git installation required.
Installation
go install github.com/iyulab/oops@latest
Or download from GitHub Releases.
Quick Start
oops start essay.txt # π Start versioning
# ... write something ...
oops save "first draft" # πΈ Save a snapshot
# ... edit more ...
oops save "added conclusion" # πΈ Save another
oops history # π View all snapshots
oops oops! # β©οΈ Made a mistake? Go back!
Commands
Friendly Commands (Recommended)
| Command |
Description |
oops start <file> |
π Start versioning a file |
oops save [message] |
πΈ Save a snapshot |
oops back <N> |
βͺ Go back to snapshot #N |
oops oops! |
β©οΈ Undo (restore last saved state) |
oops history |
π View all snapshots |
oops changes |
π See what changed |
oops now |
βΉοΈ Show current status |
oops files |
π List tracked files |
oops done |
ποΈ Stop versioning |
oops config |
βοΈ Manage configuration |
oops gc |
π§Ή Clean up orphaned stores |
Global Flags
| Flag |
Description |
-g, --global |
Use global storage (~/.oops/) |
-l, --local |
Use local storage (.oops/) - overrides config |
-a, --all |
Show both local and global (for files command) |
Developer Aliases
If you're familiar with Git, these work too:
| Friendly |
Git-style |
start |
track |
save |
commit |
back |
checkout |
history |
log |
changes |
diff |
now |
status |
done |
untrack |
Examples
Basic Workflow
oops start notes.md # Snapshot #1 created
# ... write ...
oops save "brain dump" # Snapshot #2
# ... edit ...
oops save "organized thoughts" # Snapshot #3
Oops! Moments
# Accidentally deleted important text?
oops oops! # Restores to last saved state
# Want to see an older version?
oops back 1 # Go to snapshot #1
oops back 3 # Jump back to snapshot #3
See What Changed
oops changes # Unsaved changes vs last snapshot
oops changes 1 # Current vs snapshot #1
oops changes 1 3 # Compare snapshot #1 and #3
Check Status
oops now
# π File: notes.md
# π Snapshot: #3 (latest)
# βοΈ Status: Modified
#
# You have unsaved changes
# oops save Save your changes
# oops oops! Undo changes
How It Works
Oops uses an embedded Git library (go-git) - no external Git installation needed.
Local Storage (Default)
project/
βββ notes.md
βββ .oops/
βββ notes.md.git/ β Version storage (hidden)
Global Storage (-g flag)
Keep your project directory clean by storing versions in your home directory:
oops start -g notes.md # Store in ~/.oops/
oops files -g # List global tracked files
oops gc -g # Clean orphaned global stores
~/.oops/
βββ a1b2c3d4.../ β Hash-based directory
βββ metadata.txt β Original file path
βββ notes.md.git/ β Version storage
Configuration
Set global as default mode:
oops config --default-global # Always use global storage
oops config --default-local # Use local storage (default)
oops config # Show current settings
Features
- Each snapshot = commit + tag (v1, v2, v3...)
- Delta compression for storage efficiency
- Works completely offline, no server needed
.oops/ automatically added to .gitignore
- Cross-platform path handling (Windows/Unix)
Use Cases
Perfect for:
- π Writers - essays, articles, manuscripts
- π Researchers - notes, data files
- βοΈ Config files - when you need quick rollback
- π Any single file you edit frequently
For multi-file projects: Use Git directly
Comparison
| Feature |
Oops |
Git |
| Learning curve |
5 minutes |
Hours |
| Commands to learn |
~5 |
~20+ |
| Single file focus |
β |
Multi-file |
| Server required |
No |
Optional |
| Storage efficiency |
Git-level |
Git |
| Undo mistakes |
oops oops! |
git checkout HEAD -- file |
Why "Oops"?
Because everyone makes mistakes when editing files. With Oops, you can simply say "oops!" and go back to a safe state. No complex commands, no fear of losing work.
License
MIT