Notes

64 total

Astro is joining Cloudflare. I always had a feeling Astro would be acquired — and now it’s happening. Astro has been my favorite framework for building static websites, and it’s my choice for my personal websites now. It reminds me of when I first discovered static site generators like Jekylljust basic build-time templating and composition, making creating a blog very easy. Features like content collections and islands are genuinely innovative. I hope it stays productive and keeps its simplicity.

#24 Link Jan 17, 2026

Ralph Wiggum as a “software engineer”. The AI field is evolving so fast like your math classes in high school, that if you miss a week, you’re suddenly lost. For me recently, it’s Ralph, a new pattern for coding agents that pushes them to a higher automation level.

Its name comes from a character called Ralph Wiggum in the show The Simpsons, who somehow captures the spirit of this technique.

To get familiar with Ralph, I skimmed (and watched) these materials, in addition to the original post by Geoffery Huntley:

In short, Ralph is a technique that runs your coding agent sessions in a loop. It pushes the typical coding agent workflow — you give it a task, watch it work, and then a new task based on its output — forward by making the agent itself assess the outputs and decide what’s next. Back in 2025, we’ve got the agreement that an “agent” is simply an AI program running tools in a loop to achieve a goal1. Ralph extends that idea naively: It’s a bash script running agent sessions in a loop to achieve a goal.

To run agents the Ralph way, you basically need the following harnesses:

  • A bash script that simply runs your coding agent in a for loop
  • A PRD file that lists and tracks the tasks, commonly organized as prd.json
  • A progress note that the agent appends to when completing tasks, providing relevant context to the next agent session, commonly organized as progress.txt

These elements reveal what’s truly valuable about the Ralph idea: It formalizes a context engineering approach when tackling large scale development requirements. And that’s why Ralph differs from just using a single agent session for all tasks. Every time the session completes a task, it checks the tasks in prd.json, appends notes to progress.txt, and usually makes a git commit. Then a new agent session starts with the context window cleared, so the files the last session updated serve as the only memory of the Ralph loop.

Rough notes here. If you’re interested in the details, check the materials above. It’s indeed a new idea in the field and the community will explore it further to see if it’ll truly stand out.

  1. Simon Willison’s well-known article: I think “agent” may finally have a widely enough agreed upon definition to be useful jargon now

#23 Link Jan 14, 2026

Last weekend, I reorganized my personal websites. Here’s the new structure:

WebsiteURLDescription
Personal landing pagehttps://zlliang.meBrief introduction and navigation
Zilong’s Tech Noteshttps://tech.zlliang.meMy tech exploration journal (English)
Zilong’s Dayshttps://days.zlliang.meMy life reflection journal (Chinese)

In this post, I explain my motivation for splitting the sites. After this change, I’m ready to mark version 1.0 of my writing framework. The permalinks will be stable, and I’m excited to share more technical and personal topics in these spaces.

Update Mar 30, 2026: In late March, I renamed my two journal websites. Zilong’s Tech Notes became Hack at https://hack.zlliang.me, and Zilong’s Days became Muse at https://muse.zlliang.me. The previous domains now redirect to the new ones. I wrote a note about this branding change: Renamed the two journal websites to Hack and Muse.

Today I spent a day trying to add i18n support to the website. I brainstormed ideas and documented them in a GitHub issue. I also tried to design and implement a translation key system and a new routing system, and wrote a lot of code.

In the end, I realized it makes both the site and my writing workflow more complicated than I’d like. Direct i18n support doesn’t feel like the right move right now — it adds friction and mental overhead, and I want to be able to just start writing when an idea comes up.

Since the website’s structure is entirely under my control, I want to design a content organization that genuinely fits my own writing habits while still being open and readable to different audiences. I don’t want to add structural complexity to the site just to satisfy a sense of “everything must be unified.”

So I’m going to park this issue for now. The site will stay focused on technical writing and public English content. Anything that doesn’t fit yet will live in my private Notion workspace, and I’ll revisit it later when it makes sense.

#21 Regular Jan 5, 2026

Paul Graham’s post on X about taste. Another interesting post from Paul Graham1 — what struck me is how his posts spark real discussion. All the comments are worth reading. I’m following him now.

Oddly enough, I first learned about Paul Graham through his essays, and only later realized he co-founded Y Combinator and is such a central figure in Silicon Valley.

  1. My previous note: Paul Graham’s post on X about writing

#20 Link Jan 4, 2026

I just updated the license of this website. Now it’s dual-licensed: code under MIT, content under CC BY 4.0. Previously I used CC BY-NC-SA 4.0 for content, but decided to go more open — fewer restrictions, more sharing.

Here’s the commit: zlliang/zlliang@af99933.

#19 Regular Jan 4, 2026

I just noticed a gap between what I’m thinking and what I write. Ideally I’d write down everything, but sometimes a voice in my head whispers, “This thought isn’t worth it.” No. Go write it.

#18 Regular Jan 3, 2026

I now use ChatGPT and Amp in a very simple way: I just create new threads and leave them as-is.

Previously for ChatGPT, I created several projects, and when I wanted to talk to it, I’d find and continue a relevant existing thread or create a new one in a project. I’d organize them periodically. Turns out it just looked neat but didn’t actually help. Now I just start a new chat when I think I need to. ChatGPT memorizes context automatically, which is sufficient.

Similarly for Amp, I used to organize my threads very carefully. After the labels feature shipped1, I started to label every thread manually after I completed one. I finally realized this practice doesn’t help — for now. So I deleted all the labels. And when to make a thread public? When I find I need to.

When you start using a tool, use it with the least friction and in the most intuitive way. Any feature that forces redundant manual work isn’t worth the hassle. Only use a feature if you find you need to.

  1. Amp news: Thread Labels

#17 Regular Jan 3, 2026

Happy New Year! Here’s a quick recap of my New Year’s break:

I finished watching The King of Internet Writing, a video podcast by David Perell about what we can learn from Paul Graham’s writing. I’m ready to write more, and better, in 2026.

On New Year’s Eve, I was traveling with my partner in Chongqing. We ate spicy hotpot and walked through the hilly streets!

Chongqing's cityscape on New Year's EveChongqing's cityscape on New Year's Eve

I’m planning to add new features to this website. I created two GitHub issues, following Simon Willison’s approach to building features1:

  1. Simon Willison’s blog post: How I build a feature

#16 Regular Jan 3, 2026

Andrew Kelley's growth curveAndrew Kelley's growth curve

I’m just reminded of the growth curve Andrew Kelley showed in his talk A Practical Guide to Applying Data Oriented Design. I watched it several days ago and realized I’m now at a plateau of my own. Back in university, I built a solid foundation in web frontend and landed a job in it. Now I’ve hit another bottleneck, eager to jump to the next stage. Andrew found his trigger in a book; I’m still looking for mine. But two strategies are already in my mind: writing and starting my own projects. I bet that producing and creating will push me to evolve.

#15 Regular Dec 29, 2025

Paul Graham’s post on X about writing. I started writing recently (as you can probably tell), so I’ve been reading a lot about it. What’s interesting are the comments under this post. People are sharing their own thoughts on writing, and many are surprisingly inspiring. Reading them makes me feel less alone in my writing journey.

#14 Link Dec 28, 2025

I just added a new note type called “quote notes”. Quote notes share quotes from books, articles, and other sources, sometimes with my own commentary.

Here’s the commit: zlliang/zlliang@4a7ee22. I also updated the relevant descriptions in Starting a Tech Blog at the End of 2025.

#13 Regular Dec 28, 2025

I don’t know what still newer marvels will make writing twice as easy in the next 30 years. But I do know they won’t make writing twice as good. That will still require plain old hard thinking.

— William Zinsser, On Writing Well

William wrote this in 2006. Nearly 20 years later, LLMs have made producing text easier than ever — yet concerns about AI-generated junk are growing too. Good writing remains rare and precious. It still needs to be written and rewritten, again and again, by humans.

#12 Quote Dec 28, 2025

How uv got so fast1. I haven’t followed the Python ecosystem for maybe five years. But I know uv has taken off. I have it on my Mac, and it’s my go-to when I occasionally want to play with Python. It feels like pnpm or Cargo — fast and modern.

I assumed Rust was the main reason uv is so fast. Turns out, that’s actually the least important factor. Years of PEP standards made uv possible in the first place. Intentionally limited compatibility with pip, plus smart language-agnostic optimizations, did most of the heavy lifting. It’s the design choices, not the language choice, that really matter.

  1. Discussion on Hacker News

#11 Link Dec 27, 2025

I just added pagination to note pages like /notes and /notes/types/link, as the number of notes grows. Each page now shows up to 20 notes, and a tiny pagination indicator lets you navigate between pages without scrolling endlessly. I used Astro’s built-in pagination feature. Here’s the commit: zlliang/zlliang@649a5df.

Pagination indicator on the notes pagePagination indicator on the notes page

Pagination indicator on the index page, guiding you to the second page of notesPagination indicator on the index page, guiding you to the second page of notes

#10 Regular Dec 26, 2025

Happy holidays! At the end of 2025, I’m starting a blog. I’ve already written several entries and feel confident I can keep it going.

Here I talk about my past attempts, the writers who inspired me, the motivation, the topics to cover, and the approach I’m taking. It’s my version of a blogging manifesto.

I gradually realized that a unified formatting rule set is needed when working with multiple AI chatbots and agents.

Output formatting styles vary from model to model. For technical topics, I’ve found that Claude tends to output responses like complete documents, starting with an h1 heading and loves to use horizontal rules to separate sections; Gemini usually skips to h3 headings directly without h2 ones, which in my opinion is not a good practice.

Here are examples I tried on OpenRouter, prompting “Explain the Python programming language.”

GPT-5.2, starting with an introductory paragraph and followed by sectionsGPT-5.2, starting with an introductory paragraph and followed by sections

Claude Opus 4.5, a document-like output with an h1 heading at the top and multiple horizontal rulesClaude Opus 4.5, a document-like output with an h1 heading at the top and multiple horizontal rules

Gemini 3 Flash, using h3 headings directlyGemini 3 Flash, using h3 headings directly

Kimi K2 Thinking, also a document-like oneKimi K2 Thinking, also a document-like one

Even worse, from my experience, outputs from different versions of the same model series (e.g. GPT-5 and GPT-5.2) can vary greatly in terms of formatting.

To address this issue, and to unify output styles of different tools I’m using (ChatGPT as my daily driver, Gemini for work, and Amp as my coding agent), I drafted a minimal formatting guide as follows:

The following formatting rules MUST BE FOLLOWED.

Shared formatting rules:

  • Use consistent formatting within the same response
  • Insert spaces between English words and CJK characters
  • Always specify the language for syntax highlighting when using fenced code blocks
  • Never number headings (e.g., ## About me, not ## 1. About me)
  • Never horizontal dividers (<hr> or ---) unless they add clear structural value, especially not directly before headings
  • For list items, do not use a period at the end unless the item is a complete sentence

For chat responses:

  • Use “Sentence case” for chat names (auto-generated chat titles) and all section headings (capitalize the first word only), never use “Title Case” in such circumstances
  • Use heading levels sequentially (h2, then h3, etc), never skip levels; Introductory paragraphs may be needed before the first heading in chat responses; Never use h1 for chat responses
  • Avoid filler, praise, or conversational padding (for example “Good question”, “You’re absolutely right”)

For document generation and editing:

  • Use “Title Case” for top-level headings (e.g. h1), typically only once in a document, and “Sentence case” for section headings (capitalize the first word only)
  • Use heading levels sequentially (h2, then h3, etc), never skip levels

I apply these rules to the custom instructions setting in ChatGPT and to AGENTS.md for my coding agent.

Custom instructions setting in ChatGPTCustom instructions setting in ChatGPT

Update Jan 18, 2026: Slightly revised the formatting rules for clarity. See this commit: zlliang/dotfiles@fa13ab1.

#8 Regular Dec 24, 2025

GLM 4.7 and MiniMax M2.1. Chinese AI labs first caught the world’s attention with the DeepSeek models in late 2024. Then in the second half of 2025, we saw a wave of Chinese open-source models like GLM 4.6, MiniMax M2, and Kimi K2. People like these models for their low price, open weights, and solid performance — just slightly below state-of-the-art proprietary models1.

Today, the updated GLM 4.7 and MiniMax M2.1 dropped on the same day. As public holidays approach in the US, Chinese AI labs keep pushing forward, making good use of the time 😉

AI is a rapidly changing field. I’m not one to chase every new model release, though I do find myself following this topic more recently. I’m still learning these concepts and trying to find a pragmatic way to use AI tools. I use ChatGPT as my daily driver, Gemini for work (my company subscribes to it), and Amp as my coding agent.

I may not post about every model release in the future, but here are the models on my radar:

  1. For example: Vercel CEO Guillermo Rauch’s post on X, T3 Chat creator Theo’s post on X

#7 Link Dec 23, 2025

Since Zig hasn’t hit 1.0 and is still evolving rapidly, following the master branch is common practice for trying out new features and tracking where the language is heading. Even its release notes say “working on a non-trivial project using Zig may require participating in the development process.”

However, nightly master builds quietly stopped on November 26, 2025, when the Zig team announced the migration from GitHub to Codeberg. I assumed the builds were provided by some automation tied to GitHub.

Today, I found that nightly master builds have resumed! The download index JSON used by version managers like ZVM is now being updated again, though the download page hasn’t caught up yet.

Nevertheless, good news! I’m looking forward to trying out exciting follow-ups on the new async I/O.

Zig download pageZig download page

Update Dec 23, 2025: The download page is now updating again!

#6 Regular Dec 22, 2025

TIL: When editing Markdown files in VS Code, you can paste URLs as formatted links via the markdown.editor.pasteUrlAsFormattedLink.enabled setting.

This setting was first introduced in June 2023, with the release of VS Code 1.80.

This is a nice quality-of-life feature. I used to type brackets, parentheses, and URLs manually, always wishing for a simpler way. I’m now using the smart option, which “smartly creates Markdown links by default when not pasting into a code block or other special element.”

Here’s a quick demo:

Paste URLs demoPaste URLs demo

#5 TIL (Today I Learned) Dec 22, 2025
Page 3 / 4