cd /news/developer-tools/my-first-published-article-links-to-… Β· home β€Ί topics β€Ί developer-tools β€Ί article
[ARTICLE Β· art-87154] src=dev.to β†— pub= topic=developer-tools verified=true sentiment=Β· neutral

My First Published Article Links to a GitHub User That Doesn't Exist. It's Been Live and Broken for 45 Days.

A developer discovered that their second-ever published article on DEV.to has contained a broken GitHub link for 45 days, pointing to a nonexistent user 'enjoy-kumawat' instead of the correct 'enjoykumawat'. The typo, baked into the source markdown, went unnoticed because no pipeline re-checks previously published articles. The developer verified the dead link using 'git ls-remote', which cleanly distinguishes nonexistent repos from GitHub's anti-bot 403 responses.

read6 min views1 publishedAug 5, 2026

Ninety-two articles into this account, every fix I've written up has been about this repo's code β€” a urllib

call with no except block, a path that resolves differently depending on which of two documented install methods you used, a dedup check keyed on the wrong id. What none of the 92 ever did was go back and re-read one of the 92 themselves.

So I did that today, and the account's second-ever article β€” "I Fixed the 'AI Commit Messages' Problem in 20 Lines of Python," published 2026-06-21, still live β€” has had a broken GitHub link in it for 45 days. Nobody caught it because nothing in this repo's pipeline, or in any of the 91 posts published after it, ever re-checks a previously-published article's own body.

The article's closing line:

Full project: [github.com/enjoy-kumawat/my-git-manager](https://github.com/enjoy-kumawat/my-git-manager)

enjoy-kumawat

β€” with a hyphen. My real GitHub username, documented in this repo's own key_facts.md

, is enjoykumawat

β€” no separator at all. This isn't the underscore-vs-no-separator bug this repo already fixed once (bugs.md

, 2026-06-21, "Username Underscore Mismatch" β€” .env

's GITHUB_USERNAME

held the DEV.to-style value enjoy_kumawat

with an underscore, and ADR-003

hardcoded the correct GitHub username as a constant to stop it leaking into API calls). That fix touched exactly one thing: the GITHUB_USERNAME

constant _gh()

builds URLs from in server.py

and publish_devto.py

. It never touched, and had no way to touch, a URL typed directly into an article's prose. This is a third spelling of the same handle β€” not the correct one, not the DEV.to one β€” sitting in a file no code path ever reads.

article_draft.md

, still sitting at the repo root, is the source markdown for that exact article β€” key_facts.md

's own Project Files table says so: "Source for DEV.to article (published 2026-06-21) β€” post_article.py, the script that posted it, was removed 2026-07-16 as a superseded duplicate of publish_devto.py." The typo is baked into the source file itself:

$ grep -n "enjoy-kumawat" article_draft.md
93:Full project: [github.com/enjoy-kumawat/my-git-manager](https://github.com/enjoy-kumawat/my-git-manager)

post_article.py

posted this file back on day one, before publish_devto.py

existed, before there was a tag-truncation rule, before there was a duplicate-title check β€” before basically every hardening pass this account has ever written about. The typo went live with it and has outlived the script that shipped it by seven weeks.

My first instinct was to curl

the URL and check the status code. That's the wrong tool here, and it cost me a false positive later in this same investigation (more on that below) β€” GitHub's anti-bot layer 403s plenty of pages that are completely real, including, as I found out, github.com/modelcontextprotocol/python-sdk

fetched with a browser-style User-Agent. A 403 from curl

proves GitHub is suspicious of the client, not that the repo doesn't exist.

git ls-remote

doesn't have that problem β€” it's the actual protocol a clone uses, and GitHub's response for a genuinely nonexistent (or private-and-inaccessible) repo has a distinct, unambiguous shape:

$ git ls-remote https://github.com/enjoy-kumawat/my-git-manager.git
fatal: could not read Username for 'https://github.com': terminal prompts disabled

$ git ls-remote https://github.com/enjoykumawat/my-git-manager.git
f31350f69d45bcde886043f0e5f42228777d2465    HEAD
f31350f69d45bcde886043f0e5f42228777d2465    refs/heads/main

I ran the hyphenated URL against a control β€” a deliberately made-up repo name (enjoykumawat/definitely-fake-xyz999

) β€” three separate times. All three gave the identical could not read Username

failure, with the identical exit code 128. The real repo, same command, same session, resolves cleanly every time. That's about as close to "verified live" as a dead link gets without an HTTP status code to point at.

The article has a sibling problem I initially thought I'd found too: the account's very first article, "I built an MCP server that lets Claude manage my GitHub profile and DEV.to articles," links to github.com/enjoykumawat/developer-presence-mcp

β€” a repo name this project hasn't gone by since before I started tracking it in key_facts.md

. Same curl

403 pattern I'd just decided not to trust for the first bug. I almost fixed it anyway, on the theory that the repo had been renamed to my-git-manager

and the old link just never got updated β€” that's a plausible story, and it's the kind of thing this account's whole publishing pipeline does elsewhere (README paths, hooks paths, .env

paths all drifted this same way at some point).

I ran git ls-remote

on it before touching the live article, expecting the same "could not read Username" failure I'd just gotten for the actual bug. Instead:

$ git ls-remote https://github.com/enjoykumawat/developer-presence-mcp.git
729c41d145d0a2a4542de5b76d9ecbc21d7d2958    HEAD
729c41d145d0a2a4542de5b76d9ecbc21d7d2958    refs/heads/main

A real SHA, a real main

branch. Pulling the README off it confirmed it's a genuine, separate, still-live repo β€” an earlier snapshot of this same project under its original name, apparently never deleted when the newer my-git-manager

repo took over. I'd already PUT a "fix" to that article's live body before running this check (swapping developer-presence-mcp

for my-git-manager

everywhere), caught it was wrong, and PUT the original text straight back:

a2 = get_article(3954657)
body2 = a2["body_markdown"]
reverted = body2.replace("my-git-manager", "developer-presence-mcp")
r2 = put_article(3954657, reverted)

Confirmed via a follow-up GET that the article matches its original body exactly. No harm done, but it's a clean illustration of why "the fetch 403'd" isn't evidence of anything on its own β€” it would have replaced one working, correctly-owned link with an unrelated repo, based on a hunch that happened to be wrong, verified by the same shallow check that gave me the false lead in the first place.

For the one link that really is dead, I didn't touch server.py

or publish_devto.py

β€” there's no code bug here, just a stale live document. update_article

's whole reason for existing (bugs.md

, 2026-07-27: "a wrong or hallucinated article_id used to silently overwrite whatever it pointed at with no trace") is exactly the tool for this, so I used the same PUT-with-diff shape it implements, directly against the live article:

a1 = get_article(3954807)
body1 = a1["body_markdown"]
fixed1 = body1.replace("enjoy-kumawat", "enjoykumawat")
r1 = put_article(3954807, fixed1)

Then re-fetched the article and confirmed the string enjoy-kumawat

no longer appears anywhere in the live body, and that git ls-remote

against the corrected URL resolves cleanly. Also fixed the same typo in article_draft.md

, the local source, so a future re-read of that file doesn't reintroduce it.

Before treating this as an isolated typo, I pulled every published article's body (all 92, paginated) and extracted every github.com/...

link across the entire account. After the fix, there are exactly three distinct GitHub links used anywhere in 92 articles β€” this project's repo, the MCP Python SDK, and one OSS PR link β€” and all three now resolve. The hyphenated typo was the only dead one, and it was there from the account's second post onward, never touched by anything published after it.

The pattern here isn't "check your links once." It's that a repo that spends this much effort hardening its own code β€” except blocks, idempotency guards, path resolution across install methods β€” has zero mechanism pointed at the thing it actually ships: the published articles themselves. Ninety-one follow-up posts audited server.py

, reply_comments.py

, publish_devto.py

, three different hook-path arithmetic bugs. Not one re-read what article #2 actually says.

── more in #developer-tools 4 stories Β· sorted by recency
── more on @dev.to 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain β€” perfect for shipping the agent you just read about.

$git push zahid main
β†’ Live at https://your-agent.zahid.host βœ“
Get free account β†’ Pricing
from €0/mo Β· no card required
LIVE [news/my-first-published-a…] indexed:0 read:6min 2026-08-05 Β· β€”