The pattern
I clone a repo, mostly by pushing a fresh git init to a new remote instead of forking. I keep working. Something breaks or I want to reset history or I mistyped the name. I push again to a slightly different name. The old one sits there. GitHub does not tell me the two are related. Six months later I open my repos list and there are pairs of names that only differ by one letter.
This post is a walk through the ones I know about, what the winning name was, and what the losing name cost me.
swapgifts, swapsgifts, swapgift
November 25, 2025. I was building a Secret Santa app called SwapGifts. I made two repos eighteen seconds apart, swapsgifts then swapgifts, and (two days later) swapgift. The first two both came from StackBlitz exports, which auto-name based on the project slug you type in the StackBlitz UI. I typed the slug wrong the first time, hit push, then re-typed it and hit push again. That is how the mistake actually happens. It is not deliberation, it is muscle memory hitting the wrong key.
swapsgifts is empty. Zero commits. GitHub returns 409 on the commits API. swapgifts has real commits: add revenuecat, a BlogPostPage, then the trail goes cold. swapgift (the singular) is the one that stuck. Its log shows what an app actually being built looks like: add scraping code, Updated ParticipantOnboardingPage.tsx, Updated GeoLocationCheck.tsx, add everythingwithus. That is the live one.
The cost of the other two: if I clone swapgifts on a new machine expecting my project I get a stale copy from March 2026. I have done this to myself more than once.
Passvault and passval
April 4, 2024, about seven minutes apart. Both have a single "Initial commit" and nothing else. This is the purest version of the pattern: I wanted to start a project, typed the name, pushed the empty scaffold, closed the tab, and forgot which one I picked. The next day I never went back to either.
I do not remember which name I preferred. I do not remember what the project was for. The commits do not tell me. This is the worst class of graveyard repo, the ones where even I cannot reconstruct what I was thinking.
Atomix and Atomixe
February 18, 2026, and April 7, 2026. Atomix is the documentary agent I have already written about separately, a full pipeline with Docker, Kaggle datasets, a Dockerfile, docker-compose, a frontend directory, credentials in a creds.txt I later wanted to nuke from history. Atomixe is the sequel that never was. I wanted to rewrite Atomix from a clean base without the git history that had leaked secrets, so I made Atomixe (with an e), pushed a first commit, and then went back to editing the real one instead. The e I added was the least deliberate rename of any of these. I typed too fast.
Atomixe now has commits like Delete test_output.mp4, Delete final_output.mp4 (big video files I had committed and then had to purge), and the earlier Add GitHub token to creds.txt which is the reason I wanted to start over in the first place. The rename impulse was correct. The execution never happened.
MMI-Multimedia-Indexer and MI-Multimedia-Indexer
April 27, 2025, thirteen minutes apart. This was a college-era project called the Multimedia Indexer, a small Python app that indexes files on disk into a SQLite database and lets you search across them. MMI was the first upload with the zipped Big Data Indexing.zip and a VersionControl.py. MI is the cleaned-up version with an actual README.md, screenshots, a Recording 2022-08-26 at 16.11.24.gif, a Preprocessing/ folder, and separate Readers/ and SQLReader/ directories. MI is the presentable one. MMI is the raw dump.
I dropped the extra M because MMI meant nothing. Multimedia Indexer is already MI. The extra M was a college folder name I had used at the time. I have kept both because MMI still has the zipped submission that I originally handed in and I do not want to delete a coursework artifact.
AgenticDockerTest and AgenticDockerTester
February 8, 2026. AgenticDockerTester is empty. AgenticDockerTest has exactly two commits: Initial commit and Update README.md. The rename impulse ran ahead of the project. I made a repo, changed my mind on the name within an hour, made a second, then did not build the thing at either address. This is the second-cheapest kind of graveyard entry: two empty repos and no working directory anywhere.
hackerrank-orchestrate-RAG and hackerrank-orchestrate-may26
May 1, 2026. This one is different. The May 26 repo is a HackerRank challenge submission with a support-ticket RAG system: HFInferenceEmbedder for bge-large-en-v1.5, an LLMClient abstraction, few-shot examples wired into the message list, a grounding verifier that strips ungrounded URLs and phone numbers from responses, RRF fusion with an md5 identity hash to avoid collisions, vector similarity threshold at 0.15. The commit log reads like a real project.
The RAG repo has a LinkedIn card commit with concrete numbers: RRF k=60, x0.3 to x1.3 hand-tuned source priors. This is the polished writeup version. The may26 repo is the submission dated at the challenge deadline. Both are the same code base at different maturity stages.
Cost here is different. If a recruiter opens my profile they see two hackerrank repos. Now I have to decide which one is the canonical link and I have not, so I paste different URLs on different days.
What it actually costs
Four costs, honestly counted.
First, disambiguation. Every time I look at my repo list I have to read past the dupes to find the live one. Cursor autocomplete in a shell will pick the wrong one if I do not type enough letters.
Second, clone confusion. If I clone on a new machine and pick the older name, I get a project I have to close and re-clone. This has cost me maybe fifteen minutes total across all the pairs, which sounds small until you notice how many pairs there are.
Third, external link decay. If I ever pasted the old repo URL somewhere (a blog draft, a resume, a hackathon submission), the link goes to a dead version. GitHub does not redirect if the repo still exists at the old name.
Fourth, the biggest one, secret hygiene. Atomix had a creds.txt with a GitHub token committed. The reason I made Atomixe was to escape that history. I did not follow through. The reflex to fix the problem by making a new name instead of rewriting history is how secrets accumulate across my account.
What I am going to do
For each pair in this post I am going to pick one and delete or archive the other before I close this MDX file. The rule for future collisions: if the new name is a keystroke away from the old one, do not push, rename the local remote and force it. If the reason for the rename is history rewriting (like Atomix and Atomixe), do the history rewrite in place.
The whole point of this graveyard is that avoiding a two-minute cleanup at the point of the mistake turned into a two-hour walk through the graves a year later.