Hack ReplayPush an existing local git history to GitHub, commit by commit - keeping the dates and authors you choose, on a schedule you control. You built something locally over days or weeks. You have a real commit history: dozens of commits,
each with its own message, files and timestamp. You never pushed it. Now you want it on GitHub -
but Hack Replay gives you the third option. It reads your local history, shows it as a graph, and lets you pick commits and recreate each one on a GitHub repository as its own commit - with the original message, the original files, and whatever author and timestamp you decide. Your local repository is never modified. No rewriting, no rebasing, no branch changes, no touching your working directory. Contents
How it worksFor every commit you select, Hack Replay:
Because it replays snapshots rather than patches, nothing can conflict and nothing can be applied in the wrong order. A commit that deleted a file produces a commit that deletes that file, because the snapshot simply doesn't contain it.
Quick startRequirements: VS Code 1.85+,
A first run against a throwaway repository is a good idea. Create one from the SETUP tab, replay a handful of commits, and look at the result on GitHub before doing the real thing. Core conceptsSelection is the queueThere is no separate "add to queue" step. Clicking a commit on the REEL puts it in the queue; clicking it again takes it out. The right-hand rail updates as you click. Commits that have already been pushed, failed, or are pushing right now stay in the queue as a record of what happened, whether or not they're still selected. The six statesEvery commit is in exactly one state, and the state is always written as a word, never just a colour:
Two independent clocksThis is the central idea of the tool, and the part worth understanding before your first run. Every commit has two separate time settings:
They are deliberately unlinked. You can push a commit at 3:15 PM today and have it carry a timestamp from three weeks ago. Or push commits over the next four hours while all of them carry today's date. Set them on the QUEUE tab, per commit. The panel, tab by tabREEL - your historyA vertical commit graph, newest first, with lanes and connectors for branches and merges. Each row shows:
Click a row to cue it. Click the The toolbar has a search box (message, SHA or author) and filter chips for each state plus merges. Filtering only hides rows - the graph's lane layout is always computed from your full history, so what you see stays accurate. The green bar at the bottom summarises what's showing and how many commits sit in each state. QUEUE - timing
One wide card per cued commit, numbered in the order they'll be pushed and colour-coded by state. Each card sets that commit's commit date and push time independently, and shows a live countdown of when it will fire.
SETUP - target, author and defaults
LOG - what actually happened
Every commit that landed or failed, newest first, with the local SHA, the SHA it became on the remote, the date it was stamped with, and when it was pushed. Failed rows can be retried here. Scheduling in depthPush time modes
The first commit in the queue has nothing to be relative to, so it always starts the run immediately. Its relative offset is ignored rather than rewritten, which means dragging it out of first place restores the gap it had. Pushes always run one at a time, in queue order. Two commits that come due simultaneously will not race each other. When a run is interruptedScheduled pushes are timers inside VS Code, not a background service. The queue is saved to disk every time it changes, with absolute timestamps, so:
While anything is armed or pushing, the status bar shows it (for example When a push failsA failed push stops the run rather than pushing on regardless - replaying the rest of a history
on top of a broken commit usually makes things worse. The failing commit is marked The local commit created for a failed push is rolled back inside the temporary clone, so a retry can't produce duplicates. Authorship and how GitHub reads itSet once on the SETUP tab, applied to every commit in the run:
Author and committer are always set to the same person. Git records two identities per commit, and when they differ GitHub shows both ("A and B"). Hack Replay sets both, so a commit shows one name - never the name of this tool. GitHub matches commits to accounts by email address. If the email belongs to a GitHub account, the commit links to that profile and shows their avatar. If it doesn't, the commit still shows the name you set, just without a profile link. This also determines whether a commit appears on someone's contribution graph - along with GitHub's own rules, which require the commit to be on the repository's default branch and the email to be verified on the account. SOMEONE needs both a name and a valid email. An incomplete entry is flagged in the card, blocks the ON AIR button, and is refused by the replay engine, so a run can't start and then fail halfway. What it does to your machineYour repository is read-onlyHack Replay never writes to your repository's history, branches or working directory. To read a
commit's files it adds a detached The header's TREE CLEAN / TREE DIRTY indicator is there as a reminder: uncommitted changes in your working directory are never included in a replay, because only committed snapshots are ever read. Files ignored by the source commit's CredentialsAuthentication uses VS Code's built-in GitHub sign-in ( Data and telemetryHack Replay collects nothing and sends nothing anywhere. It talks to exactly two places: the GitHub API (to list repositories and check your target), and your target repository over HTTPS (to push). Your queue and preferences are stored locally by VS Code. Settings
Commands
Troubleshooting"No git repository found in this workspace."
Open a folder that is (or is inside) a git repository. Hack Replay searches upward from each
workspace folder for a "git was not found on your PATH."
Install git, or make sure the The push was rejected because the remote has commits this replay does not. The target branch has moved ahead of the clone Hack Replay made. Push to an empty repository or a fresh branch, or bring the target up to date, then retry the failed commit. "TARGET UNREACHABLE". The repository doesn't exist under that name, or your signed-in account can't push to it. Check spelling and access. For an organisation repository, confirm you have write permission. GitHub rejected the push / authentication failed.
Sign out and back in from the SETUP tab so VS Code issues a fresh token with the "No git identity is configured."
You chose ME as the author but have no A scheduled push didn't fire. VS Code was closed or the window was reloaded at the moment it came due. Reopen VS Code - you'll be asked whether to replay the missed pushes, reschedule them, or leave them paused. Something failed and I want to see why. Use DETAILS on the failed card for the full git error, OPEN TEMP FOLDER to inspect the working state that produced it, or open the Hack Replay output channel (View → Output → Hack Replay) for a log of every operation. FAQDoes this rewrite or damage my local history? No. Your repository is only ever read from. All work happens in a temporary clone. Are these "fake" commits? The content is real: each replayed commit carries the exact files, message and (optionally) date and author of a commit you actually made. What's new is the commit object itself, because a commit created on a different remote at a different time is necessarily a different object. If you keep the original dates and authors, the result is a faithful copy of your history. Will the commits show up on my GitHub contribution graph? That's GitHub's decision, not this extension's. GitHub counts a commit when its email matches a verified email on your account and the commit is on the repository's default branch, among other rules it can change at any time. Hack Replay's job is to set the dates and identity you asked for. Can I replay into a repository that already has commits? Yes. New commits are added on top of the target branch. If the branch moves ahead of Hack Replay's clone mid-run, the push is rejected and the run pauses. What happens to merge commits?
They're replayed as ordinary single-parent commits carrying the merged snapshot. The graph still
draws them properly and tags them Can I replay the same commits twice? Yes, and you'll get a second set of commits on the remote. Hack Replay doesn't deduplicate against the target. Does it handle submodules or Git LFS? Not specially. Submodules are replayed as the gitlink entries they are in the snapshot, and LFS pointer files are replayed as files. Neither has been extensively tested. Does it work with GitLab, Bitbucket or a self-hosted remote? Pushing uses plain HTTPS git and may work, but sign-in and the repository picker are GitHub-only, and the tool is only tested against GitHub. Using this responsiblyHack Replay writes whatever author and date you tell it to. That's the point - it exists so that history you genuinely wrote can reach GitHub looking the way it actually happened. The same capability can be used to misrepresent things: to claim work you didn't do, to attribute commits to someone who didn't write them, or to manufacture activity that never occurred. Please don't. Commit metadata is used by real people to evaluate real contributions. Limitations
Development
Press F5 to launch an Extension Development Host, then run Hack Replay: Open. Layout
ArchitectureAll git and network work happens in the extension host. The webview renders and posts typed
messages; it never runs git. The message protocol is the The scheduler is the only stateful piece: it owns the queue, persists it to Two constraints to know before editing the UI:
LicenseMIT - see LICENSE.md. |



