Why I Moved gookkis.com from Laravel to Astro

gookkis.com used to run on Laravel 13, PostgreSQL on Supabase, plus an admin panel I built myself for writing blog posts and portfolio entries — complete with an AI content-generation feature I’d built in at the time. Sounded great on paper. In practice? A personal site that only I maintained, squeezed in between client work, came with a server to watch, a database to back up, and a Docker container that occasionally woke me up at 2am because the VPS ran out of memory.
The turning point wasn’t dramatic. One night I just wanted to add a single blog post, and the admin panel was throwing errors because a migration hadn’t run since the last update. Twenty minutes debugging why the login page was 500-ing. For one paragraph. That’s when it hit me: the effort didn’t remotely match a site that’s just writing and a portfolio.
The way I write content had already shifted before I noticed. I was used to brainstorming drafts with AI and then hand-editing them in a plain text editor — not through a rich-text editor in some admin panel. So I was effectively already running a file-based workflow, except the files weren’t sitting in git, they were sitting in a database via an upload form. That was an unnecessary extra step.
Astro won out for three concrete reasons: content collections can read straight from Markdown folders with no database involved (src/content.config.ts defines the schema), the build output is pure static HTML/CSS/JS so there’s no PHP-FPM or container to babysit, and it has built-in i18n routing that’s good enough for this site’s bilingual needs without me having to hand-roll a locale system the way I did in Laravel with a session cookie.
The migration itself took about a week of evening sessions, and most of that time went into moving old content out of the database into Markdown files (a one-off export script), not learning Astro itself — the docs are clear enough and none of the concepts felt unfamiliar if you’ve used a static site generator before.
What changed after the move:
- No more database or CMS. Every post and portfolio entry is a Markdown file under
src/content, split intoid/anden/folders per collection, committed to git like regular code. - No Docker/PHP-FPM for this site anymore. Deploys are now
npm run buildand syncing thedist/folder to the VPS via GitHub Actions — no moving part that can go down in the middle of the night. - Still bilingual, but now via a URL prefix (
/en/...) instead of a session cookie that got confusing whenever a link got shared around.
I didn’t delete the Laravel history — it’s still sitting on the gookkis-web-laravel-old branch in case I ever need to look at it again. But main doesn’t need a single line of it anymore.
If you’re maintaining an overengineered personal site like that too, it’s worth actually counting how many hours a month go into “maintaining infrastructure” versus writing actual content. For me the ratio was completely backwards.