← all demos

42 of my 79 repos looked empty. The code was there the whole time.

August 2026 · on the difference between pushed and visible

I have a lot of small tools on GitHub — offline CLI things for audio, release metadata, studio admin. Each one has a description. Each one built fine locally. I had never once looked at them the way a stranger does.

When I finally did, 42 of my 79 public repositories rendered as completely empty pages. No README, no files, nothing. Not broken — blank.

The code had been pushed. It just wasn’t on the default branch

The agent that built these repos worked the way agents usually do: branch, commit, push. Every project ended up on codex/initial-implementation. What never happened was the last step a human does without thinking — getting that work onto main.

So each repo had a main that was the default branch and had no commits at all, plus a feature branch holding the entire project. Git was happy. The push succeeded. The work was genuinely public — you just had to know to switch branches to see any of it.

Why this hides so well. Your local clone is fine, so nothing feels wrong. GitHub still indexes the repo name, description and topics, so it still turns up in search — and sends people to a blank page. The only way to notice is to open your own repo logged out, which nobody does.

Detecting it across a whole account

The cheap test: ask for the git tree of the default branch. If the branch has no commits, the tree 404s. That is one API call per repo and no cloning.

for r in $(gh api user/repos --paginate -q '.[].name'); do
  d=$(gh api repos/OWNER/$r --jq .default_branch)
  gh api repos/OWNER/$r/git/trees/$d --jq '.tree|length' >/dev/null 2>&1 \
    || echo "EMPTY DEFAULT BRANCH: $r ($d)"
done

The fix is one call, and it is not a merge

Because main has no commits, there is nothing to merge. You are just creating the ref at the tip of the branch that holds the work:

sha=$(gh api repos/OWNER/REPO/commits/codex/initial-implementation --jq .sha)
gh api -X POST repos/OWNER/REPO/git/refs -f ref=refs/heads/main -f sha="$sha"

The feature branch is untouched, so it is reversible. And it exposes nothing new — that branch was already public. All it changes is which branch a visitor lands on.

Two things I found while I was in there

Once the repos rendered, the next question was whether they led anywhere. Only 8 of 79 READMEs linked to anything else I make. Someone finds a loudness checker, likes it, and hits a dead end. And only 12 of 80 repos had topics, which is most of how small tools get found at all.

Automating the topics taught me something worth repeating: I generated them from each repo’s own description with keyword rules, and a dry run caught it tagging a tool called exportheadroom with acoustics — because “headroom” matched room. It also got live-performance from “delivered”. Word boundaries fixed both.

Wrong metadata is worse than none. A missing topic makes a repo invisible. A wrong one makes it visible to exactly the people it will disappoint.

What it actually cost

 BeforeAfter
topics12 / 8078 / 80
renders code37 / 7977 / 79
links onward8 / 7978 / 80

None of this is clever. It is the unglamorous half of shipping: the work existed, was finished, was public, and was reaching nobody. If you have let an agent create repositories for you, the check above takes about a minute.

Free and open source

Two small tools that came out of this project, both single-file and dependency-free.