Back to Blog

Why I Moved gookkis.com from Laravel to Astro

#astro#laravel#static-site
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 into id/ and en/ folders per collection, committed to git like regular code.
  • No Docker/PHP-FPM for this site anymore. Deploys are now npm run build and syncing the dist/ 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.