For git and shiggles. A simple content-addressed VCS.
Project description
Shiggles
Shiggles is a small command-line version control tool for people who want named saves, a simple history, and team sync without learning git.
It is designed for artists, designers, and small teams working on a shared project folder. You snapshot work with plain messages, switch context with tabs, and push or pull from a shared folder or HTTP URL.
Repository: github.com/drLemis/shiggles
Features
- Watches a project folder and stores content-addressed snapshots on save.
- Named saves with author and time on each tab.
- Tabs for parallel work (
mainplus side piles likehotfix). bringlands your current tab into another tab (usuallymain).uploadanddownloadsync the current tab via shared folder or HTTP URL.- Hard-stop collisions: conflicting files are parked in
.shig/collisions/with next-step help. loadrestores an older save and makes it current.undodiscards unsaved edits and reloads the last save.timelineappend-only log of operations (including remote history after sync).- Stdlib only. No git dependency.
How It Works
When you run shig start, Shiggles creates a .shig/ folder next to your project files. Each shig save "message" stores a snapshot of tracked files on the current tab.
Tabs keep separate histories. main is the default shared line. shig tab foobar forks from your current tab and switches you to a side pile.
Team sync copies commit objects, tab refs, tab metadata, and timeline.log to a remote. After download, files and history match what was uploaded from the other machine.
Requirements
- Python 3.9 or newer
- Windows, macOS, or Linux
Optional for HTTP remotes: any host that can serve PUT/GET (or scripts/shig-server.py for local testing).
Installation
Windows (recommended):
.\install.ps1
Restart your terminal, then shig help.
From PyPI (after publish):
pip install shiggles
Developers:
pip install -e ".[dev]"
Usage
- Open a terminal in your project folder.
- Run
shig start. - Run
shig save "first version". - Use
shig changesandshig historyto see what changed. - Use
shig upload <path-or-url>when you want to share with the team.
Basic solo workflow:
shig start
shig save "first version"
shig changes
shig history
Tabs
main- default tab, the shared project linefoobar- your side pile for interrupted work
shig tab foobar # create and switch
shig save "WIP window fix"
shig tab main # switch back
shig tab foobar # resume; files as you left them
Team sync
Shared folder (NAS, network path, USB):
shig download \\NAS\projects\my-game
shig save "updated level"
shig upload
HTTP URL (optional token in .shig/config.json):
shig upload http://backup.example.com/shiggles/my-project
shig download
The remote is remembered in .shig/config.json after the first use.
If someone else saved while you were working, shig save nudges you to download first. Skip with shig save --yes "message".
Bring (landing your tab on main)
shig tab foobar
shig save "fixed shoot.cs"
shig bring main
If someone else changed the same file on main, Shiggles stops and prints next steps. Fix on main, not another bring.
Restoring older work
shig load "message"- put files back to a matching save (becomes current)shig undo- discard unsaved changes and reload the last save on this tab
Crash recovery (auto snapshots)
After shig start, per-file auto snapshots are on by default. A background watcher (one per user, all repos) saves recent versions of each file locally when saves finish writing. Auto data never uploads.
shig auto # list auto-saved files
shig auto project.psd # roll this file back 1 step
shig auto project.psd 2 # roll back 2 steps
shig save "recovered" # promote fix to a named save
Disable for this repo: shig auto off. Re-enable: shig auto on. Disable everywhere: shig auto off --all.
Login autostart is installed on first shig start so snapshots continue after reboot (for registered repos).
Limits: folder must be a Shiggles repo (shig start once). For non-Shiggles folders or visible backup copies elsewhere, use AutoBackup.
Optional faster watcher: pip install shiggles[auto] (watchdog).
Commands
| Command | What it does |
|---|---|
shig start |
Set up this folder |
shig save "..." |
Snapshot current tab |
shig save --yes "..." |
Save even if remote is ahead |
shig load "..." |
Put files back to a save (becomes current) |
shig changes |
What is different since last save |
shig history |
Saves on current tab |
shig tab [name] |
List, switch, or create tabs |
shig untab <name> |
Remove a tab (history kept) |
shig bring <tab> |
Land current tab into another |
shig download [path|url] |
Pull current tab from remote |
shig upload [path|url] |
Push current tab to remote |
shig undo |
Discard unsaved changes; back to last save |
shig timeline |
Operation log |
shig auto |
List per-file auto snapshots (local) |
shig auto <file> [n] |
Roll file back n auto steps |
shig auto off |
Disable auto for this repo |
shig auto on |
Enable auto for this repo |
Ignore files
Edit .shignore (created on shig start). Same idea as .gitignore. Build output, .shig/, and junk stay out of snapshots.
Project structure
shiggles/
shiggles/ Python package (commands, store, remote sync)
scripts/
shig-server.py Minimal HTTP remote for local testing
tests/
test_scenarios.py Scenario walkthrough and unit tests
install.ps1 Windows installer
LICENSE NWSL-1.0
On-disk repo layout:
.shignore
.shig/
objects/
refs/tabs/
tabs/
collisions/
HEAD
config.json
timeline.log
auto/
versions/ # per-file auto snapshot index (local only)
HTTP dev server
python scripts/shig-server.py ./remote-store -p 8765
shig upload http://127.0.0.1:8765
Use the full URL including http://. A bare 127.0.0.1:8765 is not recognized as HTTP.
Tests
python tests/test_scenarios.py # narrated walkthrough
python tests/test_scenarios.py --keep # keep files in tests/_sandbox/
python tests/test_scenarios.py --clean # wipe sandbox
python -m unittest discover -s tests -v # unit tests
Publish to PyPI
pip install build twine
python -m build
twine upload dist/*
Notes
- Shiggles is a simple VCS helper, not a replacement for full backups, cloud sync, or git power workflows.
- Collisions never overwrite your working files; compare copies under
.shig/collisions/. - See ROADMAP.md for philosophy, collision policy, and deferred features.
License
This software is licensed under the NWSL.
Copyright (c) 2026 drLemis.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file shiggles-0.3.0.tar.gz.
File metadata
- Download URL: shiggles-0.3.0.tar.gz
- Upload date:
- Size: 37.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
51285c5f710c6aa4111c3dd2e2f07358220c65bd709d8a8363ae40b0aa24001d
|
|
| MD5 |
34e7eb32c8365090d23f3924e3179feb
|
|
| BLAKE2b-256 |
b9c919a23bbf7caf53cca8d8e62755d5dca8f6b59b0a7f7c392d85399ecf08e2
|
File details
Details for the file shiggles-0.3.0-py3-none-any.whl.
File metadata
- Download URL: shiggles-0.3.0-py3-none-any.whl
- Upload date:
- Size: 33.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
886f0a9dc030565062750e5113f5b0078016d0ca9b21994817bfb4d70028a565
|
|
| MD5 |
38604f95dd0ccf3c248a18937d4deaa2
|
|
| BLAKE2b-256 |
61846f980c27a073d13933dda8b5cd02b901c49e4e645b8fdec89151a3c82034
|