By the Passage of Time

Susiloharjo

Lately I have been feeling like twenty-four hours is not enough. Not because I have too much work, but because every single hour seems to bring something new I want to learn. A new framework. A new tool. A new piece of research. A new opinion from someone I respect. By the time I close one tab, three more have opened in my head. I catch myself doing the math in the shower — sleep seven, work eight, pray and eat and commute, that leaves maybe three or four hours of focused time. Not a lot when the input keeps multiplying.

GROW coaching framework

And yet most people I know are not running out of time. They are running out of attention. They have all the time in the world, and they spend it on things that, if we are being honest, do not move the needle. Endless scrolling on TikTok. Reels until the battery dies. Mobile games that reset every morning. I am not pointing at anyone else here. I have been that person. Sometimes I still am.

So the question I keep coming back to is simple: how do we handle so much information in an era that keeps producing more of it than any one human can absorb, and how do we make sure the time we do have is spent on things that actually matter?


Read more

The Best Feature I Ever Shipped Was a One-Page Procedure

Susiloharjo

Last year a client asked for an AI agent to automate their customer complaint triage. Forty hours of scoping done, two weeks of build time blocked. I was three days from opening the IDE when I sat next to the customer service team for two hours and watched.

I expected to see overwhelmed agents drowning in tickets. What I saw was three CS staff handling 12 complaints a day each, perfectly fine, with one exception — they refused to escalate anything to the operations team. Not because escalations were hard. Because the SOP for escalation was 11 steps long, contradicted itself in steps 4 and 7, and the last person who escalated “incorrectly” got a written warning.

The complaint volume was not the problem. The fear of escalation was. The triage agent I was about to build would have processed tickets faster into a system the team was already afraid to use.

I killed the project. Rewrote the escalation SOP from 11 steps to 4. Ran a 30-minute training. Two weeks later, complaints were down 60%. Zero lines of code shipped. The client saved 40 hours of dev time and $8K of cloud budget.

Since then I have had the same conversation five more times. Different industry, different “we need an app” request, same ending: a procedure nobody had bothered to write down clearly was doing the work that 200 hours of engineering could not.

This is the part of design thinking nobody talks about. Most of the time, the right output of the empathy stage is not a prototype. It is a one-page procedure that everyone can read, agree on, and follow. The build comes later — if it comes at all.

Read more

One Markdown File Made My AI Agent 23 Points Smarter

Susiloharjo

Last week I read a paper that made me re-evaluate everything I have written about AI agent optimization. Microsoft and three Chinese universities published a method called SkillOpt. The result: a single Markdown file, between 300 and 2,000 tokens, lifted GPT-5.5 by an average of 23 points across six procedural benchmarks. No fine-tuning. No new model. No extra tools. Just a Markdown file that gets fed to the agent as context at inference time.

The skill beats handwritten instructions, one-shot LLM-generated instructions, and four specialized training methods (Trace2Skill, TextGrad, GEPA, EvoSkill). It works in Codex. It works in Claude Code. It transfers across model sizes. A spreadsheet skill trained in the Codex loop lifts Claude Code to the same level as a skill trained directly in Claude Code.

After reading the paper, I stopped adding features to my AI agent for a week. I started writing skill files instead. Five of them. All under 1,000 tokens. All producing measurable improvements in my daily work. This post is the five skills and the pattern I now use by default for any procedural task.

Read more

I Tried GROW Coaching in My 1:1s. It Cut Them in Half.

Susiloharjo

I Tried GROW Coaching in My 1:1s. It Cut Them in Half.

Last week I ran a 1:1 that lasted 12 minutes read more about leadership and delegation. The engineer walked out unblocked, with a clear next step, and didn’t ping me for the rest of the day. A month ago, the same engineer would have walked out of a 45-minute 1:1 with a vague explore one-page procedure for team clarity “I’ll think about it” and pinged me twice before lunch.

The only thing I changed was the questions I asked. I stopped solving problems in the meeting. I started running them through a 30-year-old coaching framework called GROW — Goal, Reality, Options, Way Forward.

Read more

How to Fix Linux Menu Icons for Portable Electron Apps

Linux desktop menu showing an Electron application shortcut with its icon properly rendered beside the system tray

How to Fix Linux Menu Icons for Portable Electron Apps

You downloaded a Linux app as a portable folder or a raw binary — Antigravity IDE, a portable VS Code, a side-loaded Electron tool. You wrote a .desktop file, dropped it in ~/.local/share/applications/, and the app is gone from the menu. The launcher grid shows nothing. The search box finds nothing. You open the .desktop file and the Icon= line points at a perfectly valid PNG discover how 3 bash aliases saved me 10 hours last week, yet the system acts like the icon does not exist learn how to resize your Ubuntu VM disk step by step.

The problem is almost never the icon file. The problem is whitespace in the path.

GNOME, KDE, and most freedesktop-compliant desktop environments parse .desktop files with a config parser that is unusually strict about spaces. A path like /home/ubuntu/Downloads/Antigravity IDE/resources/app/resources/linux/code.png will silently fail to load for two reasons: the unquoted space inside Icon= breaks the parser, and even when the parser survives, the desktop file validator (which runs when update-desktop-database regenerates the cache) treats the entry as malformed and drops it.

I burned an hour on this the first time. The second time I wrote the fix down. This is the four-step version that survives every Electron portable app I have thrown at it.

Read more

I Set 2 Playwright Goals at 4 AM and Both Beat Fajr

Browser window with Python Playwright code on a desk in the dim light of pre-dawn, a closed Quran beside the keyboard

I Set 2 Playwright Goals at 4 AM and Both Beat Fajr

This Saturday morning I woke up at 4 AM with the kind of half-baked idea that only survives a brain that hasn’t fully booted. I wanted to see if I could give an LLM a real browser three AI code review tools I run before every PR, a goal written in two sentences, and walk away. Not a toy. Not a sandbox. LinkedIn. Tokopedia. The real web, with logins and JavaScript and the kind of DOM that makes scrapers cry learn how rogue AI processes can eat your server.

By the time I finished praying Fajr and closed my Quran, both jobs were done. One returned 23 LinkedIn profiles as structured JSON. The other returned 14 G-Shock listings under Rp 1.000.000 from Jakarta sellers offering instant payment. I had not touched the keyboard.

This is the prompt pattern that made it work — and the three things I almost got wrong.

Read more