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 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.
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
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.
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.
| Before | After | |
|---|---|---|
| topics | 12 / 80 | 78 / 80 |
| renders code | 37 / 79 | 77 / 79 |
| links onward | 8 / 79 | 78 / 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.
Two small tools that came out of this project, both single-file and dependency-free.