December 20, 2025 —
I Didn’t Break GitHub. GitHub Broke Me: A Hexo × Reimu × SSH Deployment War Story
If you’ve ever thought
“Bro, it’s just a static blog. How hard can it be?”
Congratulations.
You’ve already lost.
This is the story of how I tried to migrate my blog from Jekyll to Hexo using the Reimu theme… and accidentally speed-ran every possible deployment failure known to mankind.
Phase 1: The Great Migration
It started innocent enough.
Jekyll was getting annoying.
Ruby was acting like Ruby.
I wanted speed, control, and hacker aesthetics.
So I said the magic words:
“Let’s switch to Hexo.”
Then I saw hexo-theme-reimu.
Glassmorphism.
Card layouts.
Anime-inspired but still professional.
Cyberpunk energy without being cringe.
I cloned it.
I installed it.
I ran hexo s.
And immediately got slapped with:
1 | post.cover.startsWith is not a function |
Ah yes. JavaScript’s way of saying:
“Your YAML offended me.”
Phase 2: The Cover Image Conspiracy
Turns out Reimu is very serious about post covers.
Some posts had:
1 | cover: |
Some had:
1 | cover: /assets/img/something.png |
Some had… vibes.
Reimu didn’t like vibes.
It wanted strings, not empty fields.
So I hunted every post like a bug bounty target:
1 | grep -R "cover:" source/_posts |
Fixed empty covers.
Moved images properly.
Watched Windows secretly inject :Zone.Identifier files like malware.
Deleted them.
Again.
And again.
Finally:
“Yeah it works.”
Famous last words.
Phase 3: Cannot GET /friend
Navbar looked clean.
Home.
Archives.
About.
Friend.
Clicked Friend.
1 | Cannot GET /friend |
Classic.
Turns out “friend” pages don’t magically exist just because you believe in them.
So I did what any sane hacker would do:
- Deleted “friend”
- Replaced it with Portfolio
- Linked directly to my actual work
No fake pages.
No broken routes.
No lies.
Phase 4: RSS Is Not an API Key (But Close)
I enabled RSS.
Clicked it.
Browser downloaded atom.xml.
My brain:
“Why is this downloading?”
Reality check:
RSS is not for humans.
It’s for readers, bots, aggregators, and other digital goblins.
Yes — anyone can consume your posts.
No — they can’t edit them.
No — this is not leaking your soul.
RSS is good.
RSS is power.
We keep RSS.
Phase 5: Removing the Shame Footer
You know the one.
Powered by Hexo
Theme Reimu
Look, respect to the devs.
But this is my site.
So:
1 | powered: false |
No fake view counters.
No “0 views” humiliation.
No unnecessary flex.
Clean footer.
Professional energy.
Phase 6: The SSH Key Nightmare
Now comes the boss fight.
I run:
1 | hexo d |
GitHub replies:
1 | Username for 'https://github.com': |
Wait.
Why HTTPS?
I already have SSH.
Test SSH:
1 | ssh -T git@github.com |
GitHub:
Hi ArenRedd! You’ve successfully authenticated.
So why is Hexo acting like it’s 2012?
Answer:
Hexo doesn’t care about your SSH key.
It cares about the repo URL.
And mine was still:
1 | https://github.com/username/repo.git |
So GitHub kept asking for a password I don’t even remember.
I generated keys.
Overwrote keys.
Added wrong filenames.
Tried to ssh-add files that didn’t exist.
Created keys named like homework files.
Chaos.
Finally, the real fix:
1 | repo: git@github.com:ArenRedd/arenredd.github.io.git |
And then the most important command of all:
1 | rm -rf .deploy_git |
Hexo was caching the old HTTPS repo like trauma.
Phase 7: Victory
I ran:
1 | hexo clean |
No username prompt.
No password prompt.
No errors.
Just deployment.
Pages generated.
Assets loaded.
Blog live.
I didn’t break GitHub.
GitHub just wanted me to understand it deeply.
Final Thoughts
This wasn’t “just a blog setup”.
This was:
- Debugging YAML
- Fighting Windows metadata
- Understanding how Hexo actually deploys
- Learning why SSH matters
- Cleaning configs like a SOC analyst
And now?
I own my pipeline.
If you’re reading this while stuck at
“Username for https://github.com”
or
“Cannot GET /about”
You’re not dumb.
You’re just leveling up.