AI development, AI tools, 3D web, building products, and Java migration. Each article covers settings, measurements, and failures we actually ran into.
Latest
New
A whole floor plan in a URL: serverless share links, measured at 511 to 834 characters, and what one changed character does
Our 3D layout tool has "Copy share link" but no backend. The whole layout is compressed into the part of the URL after #: compact JSON, then deflate-raw, then base64url. Share links for all seven Taiwan templates are 511 to 834 characters long.
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.
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.
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.
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.
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.
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.
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.
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.
kof-notebooklm-mcp connects NotebookLM web interactions to an MCP workflow. Follow the package’s setup steps and distinguish installation from successful authenticated operation.
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?"
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.
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.
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.
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, and the three rules in section 11. This piece walks through a minimal, runnable bundle.
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.
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.
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.
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.
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.
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.
Getting started with Three.js, WebGL, and Blender, alongside playable experiments in the lab.
Your File Stays on Your Device: Parsing PNG, PDF, DXF, and DWG in the Browser to Build a 3D Layout
Part 05 turned a hand-prepared layout into 3D with Three.js. This one handles the plan you already have. It might be a screenshot, a PDF, or a DXF or DWG file from your architect.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
First-hand notes from idea to launch: what got built, why, and what it taught.
A whole floor plan in a URL: serverless share links, measured at 511 to 834 characters, and what one changed character does
Our 3D layout tool has "Copy share link" but no backend. The whole layout is compressed into the part of the URL after #: compact JSON, then deflate-raw, then base64url. Share links for all seven Taiwan templates are 511 to 834 characters long.
Trace KeepOnFirst’s catalog, per-article modules, and loader map, then reproduce the checks that distinguish code splitting from merely hiding content.
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.
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.
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.
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.
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.
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.
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.
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 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.
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.
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.
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.
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.
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.