All Articles

Field notes from software work to everyday decisions

Articles grounded in projects, measurements, and public records. Browse by topic, find the answer first, then follow the original sources to verify it.

Latest

New

JBoss EAP 09: understand Spring XML and verify Java configuration behavior

Compare XML, Java configuration, and ImportResource with one service and shared tests.

Read article

AI Development in Practice

Methods, frameworks, and hard-won lessons from putting AI into a real development workflow — from knowledge management to tooling.

Will WebMCP replace Playwright? Turning “guess the button” into tools the website provides

No. Playwright is a browser automation and testing tool. WebMCP lets a cooperating website declare capabilities hidden behind its interface as structured tools. They solve problems at different layers.

Read article

How to validate AI-generated code: five layers in this site’s build

A source-based walkthrough of bilingual article checks, initial HTML validation, and advertising scope, separating enforced checks from recommendations and human review.

Read article

Running AI agents on a schedule: three pitfalls, starting with "exit 0 does not mean success"

An AI agent script that passed a hundred manual runs died on its first night under launchd. And not the noisy kind of death — the kind that prints an error message and then returns exit 0.

Read article

Avoiding wrong answers in browser automation: reliability checks for a NotebookLM integration

Use kof-notebooklm-mcp to examine stale replies, interrupted streams, and UI contamination, while distinguishing enterprise APIs from this browser integration.

Read article

Feeding YouTube links straight to Gemini: one API call, and four things the docs will not tell you

To turn a YouTube video into structured notes, the intuitive pipeline is: scrape the transcript, feed it to a model. You do not need any of that — Gemini's fileData accepts a YouTube URL directly, and the model watches the video itself, subtitles or not.

Read article

An AI mistake is manageable. A mistake that looks ready to ship is not

When AI returns an empty response, times out, or breaks the expected format, a product knows to stop. The harder case is a fluent, valid response that drops a constraint or makes the wrong judgment.

Read article

The evolution of AI development: From prompt and context to harness, loop, and graph

AI development began as an exercise in asking better questions: refine the prompt, add examples, and specify the output. Once models started reading repositories, using tools, and working for longer, the true unit of engineering was no longer a single instruction.

Read article

Why I stopped asking AI to build the whole app

When I first used AI to build apps, my most common instruction was: "Finish this feature for me." Sometimes it worked so quickly that I thought I had found a new way to build software.

Read article

From zero to PyPI: making NotebookLM programmable

kof-notebooklm-mcp connects NotebookLM web interactions to an MCP workflow. Follow the package’s setup steps and distinguish installation from successful authenticated operation.

Read article

AI Tools & Models

First-hand testing of models and tools: which one fits where in your workflow.

llms.txt vs AGENTS.md vs OKF: three kinds of "markdown for AI" that solve different problems

Lately there is a pile of "markdown for AI": llms.txt, AGENTS.md, CLAUDE.md, OKF. They keep getting lumped together, so people ask "if I have one, do I still need the others?"

Read article

I gave my repo a memory so my AI agents would stop forgetting. It almost made me miss a bug.

I built this site piece by piece with Claude Code and Codex. Every session starts cold, so they do not know what came before. I used Google’s Open Knowledge Format (OKF) to turn the repo’s "brain" into a structured Markdown knowledge base.

Read article

OKF vs RAG vs vector databases: what differs, and when to use each

The phrase "OKF replaces the vector database" is confusing because it pits three things from different layers against each other. OKF is a format for knowledge, RAG is a workflow for using it, and a vector database is one retrieval infrastructure.

Read article

Diagnosing RAG errors: chunks, similarity, versions and scope

A hypothetical retention-policy case separates similarity ranking, environment filters and version synchronization, with a runnable model-free example.

Read article

How to write an OKF bundle: one directory, three rules, one minimal example

The OKF spec is deliberately tiny: a directory of markdown, YAML frontmatter, three rules — that is it. This piece walks through a minimal, runnable bundle.

Read article

Connecting OKF to RAG: source versions, chunks and query contracts

A source format does not repair retrieval automatically. Start from this site’s knowledge navigation to define index fields, version switching and answer checks.

Read article

Will Google OKF replace RAG and vector databases? Understanding the new knowledge format for AI agents

After Google Cloud introduced the Open Knowledge Format (OKF), claims like “Beyond RAG” and “the vector database is being replaced” spread quickly. The three tools solve problems at different layers.

Read article

The AI model war, round two: Gemini 3.1 Pro, GPT-5.6, Claude Fable 5, Opus 4.8, and Grok 4.5

I had barely finished comparing Gemini 3 Pro, GPT-5.1, and Claude Opus 4.5 when the version numbers jumped again. Google released Gemini 3.1 Pro, OpenAI moved to GPT-5.6, Anthropic introduced Claude Fable 5, and xAI brought Grok 4.5 into the fight.

Read article

I built a local-first AI brain Skill and realized I do not need Notion AI

Notes should be captured when an idea appears. The decisive issue is not how smart the AI is, but whether thinking and recording are forced into separate places.

Read article

A Google AI Pro workflow experiment: January 2026 notes

A January 2026 record of tool roles and manual handoffs, including the unfinished integration. This is not a current quota guide or a measured savings claim.

Read article

Three AI answers to one question: observations and limits of an iteration-speed comparison

A single conversation asked three models to compare anonymous answers. This revised account separates the original observations from missing transcripts, controls, and scoring criteria.

Read article

2025 multi-model work notes: documents, code, and usage limits

A record of my 2025 workflow with GPT, Claude, Codex, and Cursor, including document cleanup and usage limits.

Read article

3D & Interactive Web

Getting started with Three.js, WebGL, and Blender, alongside playable experiments in the lab.

Replaying a game from a share code: seeds, decisions, and version changes

Build reproducible game reports with a frozen career-simulator engine, a runnable 4,096-case check, and a concrete approach to finding replay divergence.

Read article

Checking a Godot 4 web export: threads, file sizes, loading, and audio

Inspect Last Pitch Derby’s actual export settings and files, distinguish compressed transfer size from memory cost, and diagnose startup and audio failures with a repeatable checklist.

Read article

Turning a floor plan into a 3D space you can walk into: the complete Three.js approach

Floor plans are the most universal language of space, and most people cannot actually read them — between that 2D drawing and "what it feels like to live there" sits a translation gap. I turned a real three-bedroom layout into a browser 3D space with orbiting views and draggable furniture.

Read article

I wrote the same BFS twice: once as a quality gate, once as a teacher

My Sokoban game has two solvers. The algorithm is identical — plain breadth-first search — one written in GDScript inside Godot, one in TypeScript running in the browser. This is not wheel reinvention, because they are two entirely different products.

Read article

I did not hand-build 100 levels: reverse generation, BFS, and CI for a Godot Sokoban game

BoxCat launched with 40 levels. For version 1.1.0 I wanted 100, with no unsolvable maps, no invented par scores, and no sudden drops in the difficulty curve.

Read article

The room code is the server address: a real-time multiplayer game with no matchmaking service and no database

A five-player game of Avalon traditionally needs a matchmaking service, a state store, a WebSocket server, and a cleanup job. Built on Cloudflare Durable Objects, those four things collapsed into one call to idFromName and one setAlarm.

Read article

My 3D page shipped 1.9 MB, and 90% of it was never compressed

Opening the network panel on Midnight Run: 1,894 KB transferred, of which 1,714 KB is two GLB models. On the same page three.js is 564 KB on disk and only 142 KB over the wire.

Read article

Turning a real city into a 3D scene: a pipeline from OpenStreetMap through Blender to Three.js

Midnight Run does not use a track I drew. It runs on a real block of Taipei's Xinyi District. The route comes from an OpenStreetMap snapshot, the city is generated in Blender, and what reaches the browser is a 1.3 MB GLB.

Read article

React meets a Chinese IME: why onChange marks Zhuyin as a typo

The day I finished my typing test I ran it once myself. Speed, accuracy, passage changes — all fine. The next morning I switched back to Zhuyin and the screen turned red. I pressed ㄐ and the app immediately decided ㄐ was not 今. I had missed it the day before because I had tested in English.

Read article

What is WebGL? How browsers draw real-time 2D and 3D without plug-ins

WebGL is a low-level graphics API built into the browser. Through a canvas, JavaScript can send vertices, colors, textures, and shaders to the GPU to draw real-time 2D and 3D without Flash or another plug-in.

Read article

What is Three.js? From WebGL to 3D worlds in the browser

Three.js lets a website become more than a flat page. It wraps low-level WebGL in approachable ideas such as scenes, cameras, materials, and lights, making it practical to build 3D product views, data visualizations, games, and interactive stories with JavaScript.

Read article

What is Blender? From an in-house tool to an open 3D creation platform

Blender is a free and open-source 3D creation suite. Modeling, sculpting, materials, animation, simulation, rendering, compositing, and video editing can all happen in one application. It can also become an automated asset factory for the web.

Read article
See interactive work in the lab →

Building Products

First-hand notes from idea to launch: what got built, why, and what it taught.

Keep article bodies out of the homepage bundle

Trace KeepOnFirst’s catalog, per-article modules, and loader map, then reproduce the checks that distinguish code splitting from merely hiding content.

Read article

Why downloads break on English pages: routes versus static files

Trace an /en/downloads routing failure through localization, native anchors, prerendering, and SPA fallback, with concrete checks for the actual returned file.

Read article

Does Deleting iPhone Photos Delete Them from iCloud? Find Your Separate Copy First

With iCloud Photos enabled, deletions sync too. Distinguish device storage from cloud storage, then locate a usable independent copy before removing photos.

Read article

Where Does “Learn More” Go? Writing Clear Link Text

Link text should tell readers what they will find next. Concrete examples cover registration, downloads, and references, including what to keep short and what to explain alongside the link.

Read article

Turn YouTube videos into study cards: a demo, checks, and limits

I have a row of "watch later" YouTube talks, each one easily half an hour, each one still unopened. Saving is quick; turning it into something in my head is the cost I keep deferring.

Read article

Apple has no global chart: what I found by sampling paid rankings across 51 markets

The "chart" you see in the App Store is your country's chart. The United States, Japan, and Taiwan each have their own — not translations of one ranking, but three independent lists. Apple has never offered a global chart at all.

Read article

I paid, and the app still calls me a free user: designing two-path subscription sync

The most damaging moment in a subscription product: the user pays, returns to the app, and the screen still says Free. The money moved; the entitlement did not. This is not a purchase-flow bug — it is a state synchronization problem.

Read article

To crawlers, every page on my site was 46 characters: three stages of SPA prerendering, no framework migration

I curled my own article page, stripped the scripts, and counted what was left: 46 characters. The title. Not one character of body text. All 34 article pages looked like this — to anything that does not execute JavaScript, the site was nearly blank.

Read article

My product has no PM, so every feature competes for the same person’s time

A solo product has no PM to set priorities, but the product-management work does not disappear. Who needs a feature, why it matters now, and when to stop all return to the same person.

Read article

Read later is the most polite way to delete something

When an article looks important but there is no time to read it, saving it for later feels reasonable. Nothing is discarded, and we do not have to admit that we may never return.

Read article

Features are not a product: Using an Outcome Contract to rethink KOFNote

KofAI Note 1.0.0 is now on the App Store. Its current promise can be compressed into one line: “Capture in one tap, and let AI read it for you.” That explains what the product does without defining what the user ultimately gains.

Read article

A summary is not knowledge: How AI decides whether an idea should be saved, researched, or turned into a product

A summary makes material shorter without deciding what should happen next. A convincing idea may deserve only a saved source, further investigation, a public article, or a product experiment.

Read article

Why I built BabyDay

BabyDay did not begin with a product plan. Our second child was on the way, and the records from our first were scattered across LINE, phone notes, and paper. When we tried to look back, none of it lined up.

Read article

Why I built KeepOnFirst Focus

I honestly never planned to build a Pomodoro timer.

Read article

How I started writing on Medium: what I learned from publishing three articles in three days

I had no publishing plan. One experiment became three posts in three days. This is a personal account of choosing topics, finding a writing rhythm, and organizing thoughts in the first few days on Medium.

Read article

AI is changing everyday work. What still needs checking?

AI can organize videos, documents, and code, but a complete-looking answer is different from a completed task.

Read article

Java enterprise migration

Learning paths and migration checks for JBoss EAP and Spring Boot.

JBoss EAP 09: understand Spring XML and verify Java configuration behavior

Compare XML, Java configuration, and ImportResource with one service and shared tests.

Read article

JBoss EAP 10: MDB-to-database failures, redelivery, and duplicate effects

Trace transaction ownership across MQ, adapters, EJB, MDB, and service boundaries, then run an H2 delivery model.

Read article

JBoss EAP, step by step: understand the container, deployment, and transactions

Continue from Spring Boot into JBoss/WildFly/EAP with six foundation lessons and four practical follow-ups.

Read article

JBoss EAP 01: standalone, domains, and management interfaces

Distinguish individual instances, managed domains, profiles, and server groups.

Read article

JBoss EAP 02: WAR, EAR, and the path to a working API

Understand packaging and startup ownership for WARs, EARs, and adapters.

Read article

JBoss EAP 03: JARs, module visibility, and Jakarta migration

Separate build dependencies, packaged files, and runtime visibility.

Read article

JBoss EAP 04: JNDI, data sources, and transaction boundaries

Distinguish pool names, JNDI bindings, drivers, and actual connections.

Read article

JBoss EAP 05: MDBs, resource adapters, and IBM MQ delivery

Trace delivery through MQ, the adapter, the EJB container, and an MDB.

Read article

JBoss EAP 06: diagnose the right layer and verify migration parity

Diagnose JVM, deployment, modules, resources, and application behavior in order.

Read article

JBoss EAP 07: a repeatable lab for HTTP, database, MQ, and log comparison

Compare four evidence surfaces with a downloadable offline tool that distinguishes matches, differences, and missing evidence.

Read article

JBoss EAP 08: package Spring Boot as a WAR and catch a context-root bug

Convert the ticket API to WAR packaging with an external initializer and provided container dependency, then fix a non-root Location.

Read article

Spring Boot, step by step: understand a request and verify a change

For developers taking over legacy Java systems: six lessons and this introduction share one downloadable ticket API.

Read article

Spring Boot 01: how main becomes an HTTP application

Trace pom.xml, main, and a ping endpoint to separate Maven, Spring, and Boot responsibilities.

Read article

Spring Boot 02: who creates beans? Injection and auto-configuration

Follow controller, service, and store constructors to understand the container and dependency injection.

Read article

Spring Boot 03: trace configuration, profiles, and overrides

Follow lab.label through files, profiles, environment variables, and command-line overrides.

Read article

Spring Boot 04: from JSON to services, validation, and errors

Trace a ticket request through JSON conversion, field validation, a controller, and a service.

Read article

Spring Boot 05: database writes, commits, and rollback

Start with DataSource, JdbcClient, and SQL to separate executing a write from committing it.

Read article

Spring Boot 06: what tests prove, from debugging to JAR and WAR

Separate HTTP contracts, database effects, real network calls, and deployment evidence with the ticket API tests.

Read article

JBoss EAP and Spring Boot migration: understand the runtime, then verify behavior

Move from EAP 6.4 and legacy Spring to EAP 8.1 and Boot 3.5 by separating Web, MDB, batch, and Angular boundaries, then comparing HTTP, DB, MQ, and log evidence.

Read article

Need a break? Play a round

The Chinese typing daily challenge — everyone types the same passages today. See where you rank.

Go to games