Coming Back to GitHub
March 26, 2026 · 588 words · 3 min read
Six years on GitLab, a lot of principle, and a migration that was easier than I expected.
Back in 2019 I deleted my GitHub account. Microsoft had just acquired the platform, they were not exactly winning people over, and the mood in certain corners of the internet (HN) was one of principled exodus. I deeply disliked the direction things were heading so I joined in, migrated everything to GitLab, and felt good about it for about two moments, before getting back to whatever I was supposed to be doing.
And I used GitLab for six years. It's a fine platform. The CI/CD is truly powerful, the self-hosting was nice even on a cheap DigitalOcean droplet, and for a while it felt like it had more going on for itself. But the UI is a maze, new features sit in menus you'd never navigate to by instinct, and it stinks of software built by people who stopped caring whether anyone would enjoy using it. Meh, it gets the job done. It never felt good to use, though.
So I came back. My opinionated stance aged the way these attitudes tend to, the platform evolved and I only have so many evenings to spend on tooling.
The thing that really won me over is the CLI. gh is a tool that earns its place immediately. I can create a repo, open a pull request, check run status without leaving the terminal. Sounds like a small thing but it removes a surprising amount of friction. I've started reaching for it instinctively after just a few hours, I never did that with GitLab's equivalent.
The rest of it is more complicated. GitHub Actions is fine but I find myself fighting with the YAML, it just makes me miss how GitLab handles pipelines. The concepts mostly map, but there's a lot of bullshit to go through for simple things, and the marketplace is a graveyard of actions last updated in 2021 that you have to use anyway because they're the top result. The runner speeds are also just slow, which I've fixed by routing jobs through Blacksmith. The whole integration is a single line change per job, which I really appreciate.
jobs:
build:
runs-on: blacksmith-2vcpu-ubuntu-2404 # was: ubuntu-latestThat's it! Things run noticeably faster.
Copilot is also everywhere, shoehorned into every surface whether it belongs there or not. I get that it's the product now, and I understand why, but it gives the whole platform a slightly pushy feeling. It's like a shop assistant who follows you around just in case. I use Copilot, I like it, but I don't need it reminding me of that every time I open a PR or write a commit message.
The code review experience I've been supplementing with Graphite, which handles stacked PRs properly and has a PR inbox that actually makes sense. The gt CLI is the interesting part. You create branches, commit, and submit PRs without touching the GitHub UI at all.
gt create --all --message "feat: add thing"
gt submitStack a second PR on top while the first is in review, push both at once with gt submit --stack, address feedback anywhere in the stack with gt modify, and sync everything back up with gt sync. For personal projects it's overkill, but I use it at work and having the same tool everywhere removes a context switch I didn't realise was bothering me.
The migration itself was the --mirror flag and an evening. Clone from GitLab, push to GitHub, done.
git clone --mirror git@gitlab.com:username/repo.git
cd repo.git
git remote add github git@github.com:username/repo.git
git push github --mirrorAbout ninety repos, all across. The GitLab account is still sitting there with forwarding READMEs in case Claude tries to pull stuff from there. I'll delete it eventually.
GitHub is good and slightly annoying and I'm glad to be back. We'll see.