The Confusion

I built a bulk session archive feature for Hermes Desktop. To contribute it back to the project, I needed to create a pull request to NousResearch/hermes-agent.

But GitHub said: “There isn’t anything to compare.”

I had a repo called nurazhardotcom/hermes-agent with the code, the branch, and the commits. It should work, right?

Wrong. My repo was not a fork. It was a standalone copy.

I didn’t understand what a GitHub fork actually was. Here’s what I learned.

Traditional Fork vs GitHub Fork

When I hear “fork,” I think of real divergences — projects that split and became independent. Let me show you three examples.

Linux Distributions

Ubuntu forked Debian. They went separate ways — different package managers (apt vs dpkg directly), different release cycles, different communities. The fork created two independent projects that never merge back.

Bitcoin

Critical correction: The common narrative says “BTC = Bitcoin’s whitepaper.” That’s wrong.

Satoshi’s famous quote: “The design supports a tremendous variety of possible transaction types… the system is not secure if fully anonymous, but the original Bitcoin software is.” BSV follows this. BTC moved to a different vision.

BSV is not a departure from Bitcoin. BSV is Bitcoin — the protocol as originally designed.

The Pattern

Every traditional fork follows this pattern: 1. Split — copy the code, go your own way 2. Diverge — different features, different direction 3. Independent — no merging back, no communication

That’s what I thought a GitHub fork was. And that’s why I didn’t want one. I didn’t want to be Bitcoin Cash. I wanted to contribute to Bitcoin.

What a GitHub Fork Actually Is

A GitHub fork is the opposite of a divergence. It’s a link that points back to the original.

A GitHub fork is like a branch that lives in your own namespace. You can push to it freely, but the original project can still see it and accept changes from it.

The key difference: GitHub knows the two repos are connected.

What I Actually Did

I created a standalone repo and pushed code to it. From the outside, it looked the same. But GitHub saw this:

GitHub had no idea these two repos were related. Same commits, same code — but no link. When I tried to open a PR from my repo to upstream, GitHub said:

“There isn’t anything to compare. We couldn’t figure out how to compare these references.”

Because GitHub’s PR system works by comparing branches across linked repos. No link = no comparison = no PR.

The Three Ways This Can Go

Option 1: Delete & Re-Fork (Cleanest)

Delete nurazhardotcom/hermes-agent. Then use GitHub’s “Fork” button on NousResearch/hermes-agent to create a proper linked fork with the same name. Push your feature branch. Open the PR.

Pros: Clean. Same repo name. PR works natively. Cons: Lose the existing repo (stars, watchers, any history — though you have none on this one).

Option 2: Rename & Re-Fork (Safely)

Rename your current repo to nurazhardotcom/hermes-agent-backup. Fork NousResearch/hermes-agent into the now-free nurazhardotcom/hermes-agent name. Push your branch. Open the PR.

Pros: Keep your old repo around. Cons: Two repos to manage.

Option 3: Keep As-Is (No Upstream)

Leave everything where it is. Your feature lives in your repo only.

Pros: Nothing to fix. Cons: You can’t contribute to upstream. No PR possible.

The Difference in One Table

Concept Traditional Fork (Ubuntu, BCH) GitHub Fork
Mechanism | Copy code, diverge permanently | GitHub “Fork” button creates linked copy |
Relationship | Becomes independent immediately | Stays connected to parent (“forked from…”) |
Direction | One-way departure | Two-way: pull from upstream, PR back |
Merging back | Never re-merges | Designed for PRs back to original |
Communication | Ceases after fork | “Fetch upstream” keeps you synced |

****Network effect****

Concept Traditional Fork (Ubuntu, BCH) GitHub Fork
Network effect | Fragmented — N isolated projects | Consolidated — contributors cluster on one upstream |
Goal | Become your own project | Contribute to the original |
Real examples | Ubuntu, BCH, BSV, CentOS — all diverged permanently | Your fork of NousResearch/hermes-agent |
Bitcoin analogy | BTC added SegWit/Taproot (drifted from whitepaper). BSV restored the original protocol. Neither merges back. | You fork, you contribute back via PR. The whole point is re-merging. |
Metaphor | Bitcoin Cash leaving Bitcoin — permanent departure | A branch on a different remote — designed to merge back |

A GitHub fork is really a branch that lives in your own namespace. Not a departure.

What “Fetch Upstream” Means

On a proper GitHub fork, GitHub shows a “Fetch upstream” button:

This syncs the latest changes from the original project into your fork. Your fork stays up-to-date with upstream while you work on your feature branch. This is why a GitHub fork is “contribute” not “diverge.”

What I’ll Do

Option 1. Delete the standalone. Create a proper fork. Push the feature branch. Open the PR.

The bulk archive feature is 3 files, 106 lines, tests included. It’s a contribution worth making properly.


Next post: the actual PR workflow — creating the issue, implementing the feature, and getting it merged.