Blog
Notes on code, products, and things I'm learning.

When an Idea Meets Claude Max
A few days with Claude Max were enough to change how I see execution, scarcity, and what is left of human creative power.

My Checklist Before Connecting a New MCP Server to a Client Codebase
MCP servers are the new plugin ecosystem for AI coding agents, and the security advisories about them this year have been serious. Here's the actual routine I run before wiring one in.

I Tried Shipping Passkey Login on a Client Project: What Actually Happened
Passkeys have full browser and OS support now, but adoption is reportedly stalling. Here's what happened when I actually added them to a real client app instead of a demo.

Context Engineering: Is It Actually Different From Prompt Engineering?
Hot take: some of what's being sold as 'context engineering' this year is a genuinely distinct skill. A good chunk of it is prompt engineering with a rebrand.

The Week a Supply-Chain Worm Actually Showed Up in One of My Dependency Trees
I've written a checklist for these incidents before. This month one of them actually touched a client project, and the checklist got its first real test.

I Migrated a Client Project to TypeScript 7's Native Compiler: What Actually Changed
TypeScript 7.0 shipped with the Go-native compiler this month promising 10x faster builds. I put it on a real client codebase instead of trusting the benchmark posts.

My Checklist Before I Let a New AI Coding Tool Anywhere Near a Client Project
A new agent or IDE gets announced every other week. Here's the concrete checklist I run before adopting one, instead of chasing every launch.

The Job Market Is the Tightest I've Seen — What That Looks Like From the Freelance Side
Everyone's reading the headlines about entry-level hiring drying up. Here's what the same squeeze actually looks like from where I sit as a solo freelancer.

Everyone's Excited About Signals — I'm Not Rewriting My React Stack Yet
Fine-grained reactivity is the frontend hype of the year. Here's why my React + Spring Boot stack isn't moving, and what would actually change my mind.

Spec-Driven Development: Is It Actually Different From Vibe Coding?
I tried writing formal specs before letting an agent touch a client codebase — here's what genuinely changed and what's just vibe coding wearing a suit.

My Checklist for Every New npm Supply-Chain Attack
Not theoretical advice — the concrete steps I actually run across every project whenever a worm or compromised package shows up in the dev news cycle again.

I Tried an AI Browser Agent for the Boring Parts of Freelancing
I handed off a chunk of freelance admin work — the stuff I always put off — to a browser agent. The results were mixed, and that's exactly what makes it interesting.

Everyone's Talking About Edge Computing, I'm Still on a $6/Month VPS — Here's Why
Hot take: for the scale my projects actually run at, edge functions solve a problem I don't have, plus a few new ones I'd have to take on.

Retrospective: The Work Habits That Actually Changed for Me in 2026
Not a prediction about the future of AI and software — just an honest look back at which work habits actually stuck this year and which ones were passing fads for me personally.

A Month With an AI Code Review Bot on My PRs: What Actually Stuck
I put an automated AI reviewer on a few repos for a month. Some of its notes genuinely helped. A lot of it turned into noise I muted.

My Checklist Before Taking On a New Freelance Client
The questions I actually ask before saying yes to a new project, built from a few contracts I wish I'd turned down.

The Language Switcher Just Prefixes /en, It Doesn't Translate Slugs
Why i18n-url.ts can be this simple, why that means Indonesian and English slugs always have to match exactly — and how I once broke that rule myself.

Why I Keep Moving More of My Stack to Self-Hosting
What I've moved off SaaS onto my own VPS this year, and the actual reasons — cost is only one of them.

I Don't Style Markdown by Hand — I Let @tailwindcss/typography Do It
Why blog posts and portfolio case studies render through a prose class instead of manually styled elements.

What I'd Tell a Junior Developer Starting Out Right Now
Looking back at my own path from Android dev to fullstack freelancer, in a job market that looks a lot harder to break into than mine did.

A Month of Daily Coding With Claude Sonnet 5
What actually changed in my day-to-day freelance work after switching my agent workflow over to Claude Sonnet 5.

Why I Didn't Delete the Old Laravel History, Just Moved It to a Branch
Why gookkis-web-laravel-old still exists in this repo even though main doesn't need a single line of it.

This Static Site Has No Test Suite — Here's Why I'm Not Worried Yet
Astro check covers what's most likely to break, and the rest is low-risk at this project's size.

Moving to Tailwind v4: No More tailwind.config.js
Why every color token is now defined straight in CSS with @theme, instead of a separate JS config file like Tailwind v3.

The Vibe-Coding Debt Panic: What I'm Actually Seeing
Everyone's writing about the technical debt crisis from vibe coding — here's what it actually looks like from the freelancer who gets called in to fix it.

What I Prepared Before Applying for Google AdSense
The checklist I used to make sure this blog was ready for review: privacy policy, content, and technical setup.

Building the Site's Signal-Field Background Without an Animation Library
How the drifting grid, floating particles, and cursor-following glow behind every page are built with plain CSS and a few guarded lines of JS.

From Android Freelancer to Full-Stack: How My Stack Evolved
The path my tech stack took from native Android focus to web, backend, and cross-platform desktop apps.

Writing This Blog With AI Help, Grounded in My Own Experience
How I actually write posts for this blog: brainstorming with AI, but the substance stays real — including one time I almost let a claim through that I'd never actually checked.

Thin Route + Shared Component: A Pattern for Bilingual Pages in Astro
The structure I use to avoid duplicating markup between the Indonesian and English versions of every page.

A Minimal TLS and HSTS Checklist for a Self-Managed VPS
The SSL configuration I run in Nginx — not the fanciest setup, but enough for a personal static site — plus the grade it actually got when I scanned it.

Why My Portfolio Case Studies Use a Problem-Solution Format
Why the portfolio schema has problem and solution fields, not just a project title and screenshot.

A Bilingual RSS Feed: Why I Still Keep It Around
In an era where RSS is supposedly dead, here's why I still generate a separate rss.xml per language for this blog.

SEO Checklist for a Static Site: Sitemap, Hreflang, and Schema
Three technical things I fixed to make this static site easier for search engines to crawl and understand.

A Three-Way Theme Toggle: System, Light, Dark — Not Just prefers-color-scheme
Why a single button that cycles through three states turned out to be better than just following the OS preference.

Using AI to Write Tests: What Helps and What I Still Check Manually
How I involve an AI coding agent in the process of writing and reviewing unit tests.

Backup and Disaster Recovery for a Solo Developer: What I Actually Run
The simple backup setup I use so a VPS going down doesn't turn into a panic.

Flutter vs Native: Why I Still Reach for Native on Most Mobile Projects
The tradeoffs I weigh when choosing between Flutter and native development (Swift/Kotlin) — and one incident that made me rethink it.

TypeScript vs JavaScript: Why I Finally Switched for Good
The practical reasons I stopped writing plain JavaScript on new projects.

Why I Moved gookkis.com from Laravel to Astro
The reasoning behind migrating from a Laravel + database CMS to a lighter-to-maintain static Astro site.

Why I Like Working on Multiple Freelance Projects at Once
Why I keep more than one freelance project running at a time, how I manage it without getting overwhelmed, and the point where it once got out of hand.

Being a Remote Software Engineer: What Years of Freelancing Taught Me
A few lessons on discipline, communication, and time management from remote freelance work.

Deploying Multiple Projects on One VPS: The Nginx Structure I Use
How I host multiple domains/projects on a single server using Nginx.

A Simple CI/CD Setup with GitHub Actions for a Static Site
The deploy workflow structure I use for this site — build, sync, done.

Choosing a VPS for a Side Project: What I Weigh
A few factors I check before deciding on a VPS for a side project — written after switching providers twice, for two different reasons.

Save Tokens, Save Time: Practical Tips for Coding Effectively with AI
Not a generic tips list — lessons I picked up from my own communication mistakes with an AI coding assistant, one at a time.

The AI Agent Coding Workflow I Use Now
How I integrate an AI coding agent into my everyday development process.

Agentic AI Experiment: Building dodolanan.com with Claude Code
The story of my experiment researching agentic AI workflows by building and shipping a real project, not just a demo that never leaves the laptop.

Static Site vs Traditional CMS: When Should You Switch?
The considerations I used before deciding to migrate from a database-backed CMS to a static site.

PostgreSQL vs MySQL: When I Reach for Each
A practical comparison from experience using both across different projects.

React + Spring Boot: My Go-To Stack for Internal Applications
Why the combination of React on the frontend and Spring Boot on the backend is my reliable pick for internal web apps.

Astro Content Collections: Managing Content Without a Database
How Astro's content collections let a blog and portfolio run without a CMS or database at all.

Moving from Web to Android Development: What I Learned
A few mindset shifts I had to make when I first seriously got into Android development.

Why Privacy-First Matters for Personal Apps (Istiqomah Case Study)
The reasoning behind Istiqomah's 'no account, no server, no ads' design decisions.

Building Istiqomah: A Habit Tracker App with No Server and No Account
The story behind Istiqomah — a daily worship tracker that runs 100% on-device, including one calculation edge case that sent me back to research.

Swift vs Kotlin: A Comparison from a Developer Who Uses Both
After years working in Android and iOS, here's my honest comparison of Swift and Kotlin.

Python vs Go for Internal Backend Tools: My Experience
When I reach for Python, when I reach for Go, for internal tools and automation.

Learning from Scratch: Building a Remote Desktop Feature with Security in Mind
What I learned about encryption, authentication, and session handling while building a remote desktop feature.

Why Go Is a Good Fit for VPN and Remote Desktop Tools
Go's concurrency model and single-binary deployment make it a natural choice for networking tools — including one head-to-head comparison I tried myself.

Building a Cross-Platform Desktop App with Avalonia UI and C#
Why I moved from WPF to Avalonia for a desktop app that had to run on Windows, macOS, and Linux.