Blog

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.

#ai#productivity#reflection#claude

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.

#mcp#ai#security

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.

#auth#passkeys#security

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.

#ai#context-engineering#opinion

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.

#npm#security#incident

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.

#typescript#compiler#tooling

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.

#ai#tools#checklist

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.

#career#freelance#job-market

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.

#react#frontend#signals

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.

#ai#spec-driven-development#opinion

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.

#security#npm#supply-chain

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.

#ai#automation#browser-agent

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.

#devops#vps#opinion

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.

#career#ai#retrospective

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.

#ai#code-review#workflow

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.

#freelance#career#checklist

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.

#astro#i18n#routing

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.

#self-hosting#vps#devops

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.

#typography#markdown#css

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.

#career#junior-developer#ai

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.

#ai#claude-sonnet#workflow

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.

#git#migration#engineering

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.

#testing#astro#static-site

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.

#tailwindcss#css#frontend

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.

#ai#vibe-coding#opinion

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.

#adsense#blog#monetization

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.

#css#animation#frontend

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.

#career#freelance#stack

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.

#ai#writing#blog

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.

#astro#architecture#i18n

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.

#security#nginx#vps

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.

#portfolio#career#writing

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.

#rss#blog#astro

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.

#seo#astro#static-site

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.

#css#ux#tailwind

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.

#ai#testing#productivity

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.

#devops#backup#vps

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.

#flutter#mobile#native

TypeScript vs JavaScript: Why I Finally Switched for Good

The practical reasons I stopped writing plain JavaScript on new projects.

#typescript#javascript#webdev

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.

#astro#laravel#static-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.

#career#freelance

Being a Remote Software Engineer: What Years of Freelancing Taught Me

A few lessons on discipline, communication, and time management from remote freelance work.

#career#remote#freelance

Deploying Multiple Projects on One VPS: The Nginx Structure I Use

How I host multiple domains/projects on a single server using Nginx.

#devops#nginx#vps

A Simple CI/CD Setup with GitHub Actions for a Static Site

The deploy workflow structure I use for this site — build, sync, done.

#devops#ci-cd#github-actions

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.

#devops#vps

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.

#ai#productivity#tips

The AI Agent Coding Workflow I Use Now

How I integrate an AI coding agent into my everyday development process.

#ai#claude-code#productivity

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.

#ai#agentic-ai#claude-code

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.

#webdev#cms#astro

PostgreSQL vs MySQL: When I Reach for Each

A practical comparison from experience using both across different projects.

#sql#postgresql#mysql

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.

#react#spring-boot#webdev

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.

#astro#webdev#cms

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.

#android#mobile#career

Why Privacy-First Matters for Personal Apps (Istiqomah Case Study)

The reasoning behind Istiqomah's 'no account, no server, no ads' design decisions.

#privacy#mobile#product

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#kotlin#mobile#privacy

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.

#swift#kotlin#mobile

Python vs Go for Internal Backend Tools: My Experience

When I reach for Python, when I reach for Go, for internal tools and automation.

#python#golang#backend

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.

#security#desktop#csharp

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.

#golang#vpn#security

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.

#avalonia#csharp#desktop