Shift git commit timestamps out of work hours so your side project stays secret
Project description
secretside
Shift git commit timestamps out of work hours so your side project stays secret.
If you committed at 10:47 on a Wednesday, secretside moves it to 17:47 (or later). It also catches identity leaks — commits made with your real name or work email when you meant to use a pseudonym.
Install
pip install secretside
Or with uv:
uv tool install secretside
Note: libgit2 1.9 headers are required.
Quick start
secretside init
secretside clean --dry-run
secretside check # quick validate for use in a git hook
Commands
secretside init [repo] [--country XX] [--force] — Generate secretside.toml with jittered defaults so every project's config looks slightly different.
secretside clean [repo] [--dry-run] — Preview and apply timestamp shifts. Only touches your most recent contiguous commits. With local_only = true in your config (the default), only unpushed commits are considered/modified.
secretside inspect [repo] — Show commit time distribution and list all work-hour commits.
secretside check [repo] — Validate that no commits fall in work hours and no banned identities appear. Designed for CI or pre-push hooks.
Config
secretside init creates a secretside.toml in your repo:
holidays = "CA"
work_days = "mon-fri"
work_hours = "08:47..17:52"
night_hours = "23:12..05:44"
local_only = true
banned = [
# ["Your Real Name", "real@email.com"],
# ["Your Real Name", "work@company.com"],
]
pto = [
# "2025-02-07",
# "2025-12-24..2025-12-31",
]
| Key | Description |
|---|---|
holidays |
Country code for public holidays ("CA", "US", "GB", etc.) |
work_days |
Which days are work days ("mon-fri", "mon-thu", "mon-wed,fri") |
work_hours |
Commits in this range on work days get shifted past work_end |
night_hours |
Shifted commits avoid landing here (organic night commits are left alone) |
local_only |
Only shift commits that haven't been pushed to any remote |
banned |
Name/email pairs to flag in check — keep your real identity out of the repo |
pto |
Dates (or start..end ranges) to treat as days off |
How it works
- Only the contiguous tail of your commits is touched — other people's commits are never modified
- Weekend, holiday, and PTO commits are left alone — already safe - unless they need shifting due to overflow from a work day
- Organic night commits (you actually coded at 1am) stay put
- Chronological order is always preserved, with original time gaps maintained where possible
- History rewriting uses git-filter-repo under the hood
Development
Requires Python 3.11+ and uv.
uv sync
bin/test
uv run secretside <command>
Project details
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 secretside-0.2.2.tar.gz.
File metadata
- Download URL: secretside-0.2.2.tar.gz
- Upload date:
- Size: 13.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.1 {"installer":{"name":"uv","version":"0.11.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
85013443d03ced55920a2dee57d244863af1c70a62bd11f1e9508b9abe8da432
|
|
| MD5 |
980ed1ae56ff2bd1e4f7c16c12861963
|
|
| BLAKE2b-256 |
09e4bc68d0476077de0ae8a241091b83c0ac81d4cbf29946dc21c2850b3d6d9c
|
File details
Details for the file secretside-0.2.2-py3-none-any.whl.
File metadata
- Download URL: secretside-0.2.2-py3-none-any.whl
- Upload date:
- Size: 18.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.1 {"installer":{"name":"uv","version":"0.11.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4c2f08a8a49417b5e362183be610c9d7aebbf746d0167a632c2a14af9cfcecc7
|
|
| MD5 |
bde85a1940b6fc0557621578fb1f2c22
|
|
| BLAKE2b-256 |
587c11dfc9a83497966f90f9e51161002ef7a1c02e58105f7a9e7bcfb122a120
|