Notes
TIL: You can set IS_DEMO=1 to simplify the welcome screen of Claude Code. There are two types of welcome screens (shown below), and there’s no obvious logic behind which one appears for a given project — I found this annoying. After digging into it, I discovered an undocumented environment variable IS_DEMO1 that forces the simpler one. Run IS_DEMO=1 claude, or set it in Claude Code’s settings.json under the env key.
Type 1
Type 2
-
I found this under a GitHub issue: anthropics/claude-code#2254 ↵
TIL: $TMPDIR is an environment variable set by macOS (not fish-specific) that points to a per-user temporary directory. Its value looks something like:
/var/folders/xx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/T/The path is unique per user and per boot session — macOS generates it under /var/folders/. Files here are:
- Automatically cleaned up by the system. macOS periodically purges files in
/var/folders/that haven’t been accessed recently (typically after 3 days of inactivity, managed by theperiodicdaily scripts). A reboot also clears them. - Not shared across users, since each user gets their own subdirectory.
On Linux, $TMPDIR is often unset; the conventional fallback is /tmp.
Don’t Let AI Write For You1. Nicely distilled essay on writing.
I just renamed my two journal websites. Over the weekend, I spent some time thinking carefully about the positioning and goals of the two sites, and eventually made this decision. The English technical site is now Hack at https://hack.zlliang.me, and the Chinese personal site is now Muse at https://muse.zlliang.me.
This change updates the public branding, site names, workspace paths, and shared references from the earlier tech and days naming. I also updated the Vercel domains, and the old tech and days domains now redirect to the new ones. The commit is zlliang/zlliang@cf59692.
After the rename, I feel more confident that the two sites can grow for longer and on steadier footing.
I just finished a full Git history cleanup for my website monorepo to remove oversized historical image blobs. I used to track full-size images in the repo, which is not sustainable as my blogs grow.
I used sharp with a consistent baseline (size, edge limit, and quality ladder) to optimize images before rewriting history. The result was substantial: the total repo size, including history blobs in .git, dropped from about 500+ MB to 70+ MB (about -86%).
This was a Git history rewrite with git-filter-repo, so all commit hashes changed. I also updated commit references in my existing notes, including links in the zlliang/zlliang@xxxxxxx format and corresponding GitHub commit URLs.
After the migration, I also added a pre-commit hook that automatically optimizes newly added images to the same baseline, so future image growth stays controlled during normal commits. That setup was shipped in zlliang/zlliang@c139c11. At runtime, I still rely on Vercel’s image optimization to serve appropriate image variants for different devices and viewport sizes.
Most of the migration scripting, validation, and cleanup in this round was completed with help from Amp.
Markdown Ate The World1. Recommended reading. Always bet on plain text!
I just added support for post series on both https://tech.zlliang.me and https://days.zlliang.me. There is now a /posts/series index page, each series has its own page, and individual post pages can show the other posts in the same series in the sidebar.
This felt worth adding because some posts are clearly part of a longer thread rather than standalone pieces. On the tech site, Starting a Blog at the End of 2025 and Splitting My Websites and Finalizing My Writing Framework are now grouped under How I Write. On the days site, my January and February monthly posts are now grouped under the Life Monthly series.
The commit is zlliang/zlliang@e858356, which also closed issue #79. Unlike several recent blog infrastructure changes, this one was surprisingly mostly handwritten. I only used a coding agent for a few small parts.
Update Mar 30, 2026: In late March, I renamed my two journal websites. They are now Hack https://hack.zlliang.me and Muse https://muse.zlliang.me. See: Renamed the two journal websites to Hack and Muse.
Some Things Just Take Time1. Recommended reading. About the value of slowing down in this fast-changing world.
Updating the design of Notion pages. Notion is refining the spacing rules across its pages, and that feels like the right direction. I use Notion for private writing and personal databases, so this kind of change could noticeably improve the writing experience for me. I have also spent a long time thinking about spacing while designing my own personal website, so I like that this article treats spacing as a serious design problem. It is a good deep-dive reference.
OpenAI to acquire Astral1. This one is big. uv, Ruff, and ty are all best-in-class tools from Astral that have significantly improved the Python developer experience. After the acquisition, the Astral team will join OpenAI’s Codex team. Given how quickly Codex has been improving recently, this feels like a strong combination for the future of developer tooling.
Here’s the blog post from Astral’s side: Astral to join OpenAI. Here’s the Hacker News discussion.
Another interesting angle is that Anthropic acquired Bun last year. Anthropic now has deep JS/TS tooling expertise, while OpenAI is making a similar move around Python.
Update Mar 20, 2026: Simon Willison published a detailed post on this acquisition: Thoughts on OpenAI acquiring Astral and uv/ruff/ty.
I just finished a fairly big notes-navigation refresh for both https://tech.zlliang.me and https://days.zlliang.me. Archive pages by year, month, and day are now fully in place, and the sidebar now has a “Writing journey” heatmap.
This makes the notes feel much easier to browse as a body of work instead of a flat reverse-chronological list. For example, visit /notes/2026 for notes in 2026, /notes/2026/03 for notes in March 2026, and /notes/2026/03/19 for notes on Mar 19, 2026. Each cell in the heatmap takes you to the archive page for that specific day.
The "Writing journey" heatmap in the sidebar, with links to archive pages by year available from the main /notes archive page
A monthly archive page, where you can switch to other months or jump to a specific day in the current month
The work happened in two commits: zlliang/zlliang@9ed325f and zlliang/zlliang@9786f32. Most of the implementation was done with help from the Codex app and Amp.
Update Mar 30, 2026: In late March, I renamed my two journal websites. They are now Hack https://hack.zlliang.me and Muse https://muse.zlliang.me. See: Renamed the two journal websites to Hack and Muse.
I just removed note tags from both https://tech.zlliang.me and https://days.zlliang.me.
While writing notes, I kept thinking about how tags should be organized. Sometimes I would spend quite a while deciding which tags to use, and that gradually turned them into a writing burden instead of a helpful tool. I found that tags are simply hard to plan well and maintain over the long term. On top of that, after adding search to notes a few days ago, part of the original value of tags was already covered. I would rather leave tags out for now and add them back only after I find a better way to organize notes.
Along the way, I also simplified the sidebar and reworked the /notes/types index page. The sidebar is now flatter and quieter, and the type index uses richer cards with counts and short descriptions.
The refreshed note types page
The main commit is zlliang/zlliang@8381e33, a cleanup and simplification pass across both sites that removed tags, flattened the sidebar, and improved how note types are presented. Most of the code was written with the help of the Codex app.
Update Mar 22, 2026: Removing tags also removed their old URLs, so I later added middleware handling for those legacy routes. Old tag pages now return 410 Gone while the other migrated note URLs keep working through redirects, which should make the cleanup clearer to search engines.
Update Mar 30, 2026: In late March, I renamed my two journal websites. They are now Hack https://hack.zlliang.me and Muse https://muse.zlliang.me. See: Renamed the two journal websites to Hack and Muse.
I have removed the world map from my landing page for now.
When I added it in February, I liked the idea: a compact visual trace of the places I have been, with links to travel posts when I had written one. But after living with it for a while, I kept feeling that the interaction was not good enough. It looked more interesting than it actually felt to use.
So I decided to simplify the page again. I would rather leave something out than keep a feature that feels half-finished. If I come up with a better concept and can polish it properly, I may bring it back in another form.
Introducing GPT-5.4 mini and nano1. OpenAI finally refreshed its smaller and cheaper models. The previous mini/nano release was GPT-5 in August 2025, while GPT-5.1-Codex-Mini in November 2025 was a more coding-specific branch.
It feels like OpenAI is gradually tidying up its model lineup. At least in the GPT-5.4 family, there is no separate “Codex”-suffixed specialized model, and the mini and nano variants seem to be catching up too.
I checked the Codex app this morning and saw that its built-in subagents are already using GPT-5.4 Mini.
Subagents using GPT-5.4 Mini
These days I’ve been working on new features and larger overhauls for my websites. It feels like I’m gradually preparing for the next step of their development. My three sites still share a lot of duplicated logic, including routing, components, and content categorization. Inspired by Starlight, I want to turn the theme into a reusable Astro integration. I created issue #80 to track the plan. This would not only help keep my codebase cleaner, but also make it easier for others to start writing with a minimal but opinionated framework.
Use subagents and custom agents in Codex1. Subagents are now generally available in Codex, after previously being introduced as an experimental feature called “multi-agents”.
In short, you can ask Codex to spawn subagents that run in parallel with one another and with the main agent. They use their own context windows and report back to the main agent when they are done. Subagents can have their own models and instructions. There are built-in agents like explorer, and you can define your own ones with TOML configuration files under .codex/agents.
One fun detail is that Codex picks a random nickname for each subagent. My first try gave me an explorer subagent called “Galileo”.
Galileo explored the repo for my websites
I first learned about subagents through Amp, which ships several curated custom agents like Oracle and Librarian. What I like about Amp’s approach is that it presents subagents as recommended workflows, not just as a feature to try on your own. By pairing carefully designed agents with specific models and tools, it also shows how subagents fit into everyday work. That has been a consistent strength of Amp: it tends to package what it sees as the current best practice, and that is also where I first started to understand the idea of subagents.
Here are other comments on this Codex release:
- Simon Willison’s post
- Vaibhav (VB) Srivastav’s article: You Should Be Using Subagents in Codex!
Now that major coding agents like Claude Code, OpenCode, and Cursor all support subagents in broadly similar ways, will subagents become a standard, like skills?
I just added a search page for notes on both https://tech.zlliang.me and https://days.zlliang.me. There is now a search button in the header, plus a small search form in the sidebar on larger screens and on the home page on mobile. The search indexes note titles and bodies, and for post notes it also includes the full content of the related post. The implementation uses MiniSearch.
Enjoy the search feature!
While doing this, I also reworked note pagination across both sites. Instead of URLs like /notes/2, note archive pages now use query parameters such as /notes?page=2 and /notes/types/link?page=2. I wanted the pagination model to be simpler and closer to common blog conventions, especially after reading Google’s documentation on pagination.
The commit is zlliang/zlliang@5388c6d, which also closed issue #72.
Update Mar 22, 2026: This pagination change also changed note archive URLs, but I later added middleware-based redirects so legacy paths such as /notes/2 still resolve to the new query-parameter URLs. That should also make it easier for search engines to consolidate the old pagination routes.
Update Mar 30, 2026: In late March, I renamed my two journal websites. They are now Hack https://hack.zlliang.me and Muse https://muse.zlliang.me. See: Renamed the two journal websites to Hack and Muse.
Today I learned that Armin Ronacher also keeps two blogs: his well-known tech blog https://lucumr.pocoo.org, and a non-tech one https://dark.ronacher.eu. It made me feel that my approach to splitting writing across two blogs is a reasonable one, not just a personal quirk.
VoidZero, the JavaScript tooling company founded by Evan You, the creator of Vue and Vite, released several notable updates over the past week:
- Vite 8, now powered by Rolldown after several years of work (btw, Astro uses Vite under the hood)
- Vite+ alpha, now open-sourced under the MIT license after an earlier plan to make it a paid product, as mentioned in its initial announcement
- Void, a full-stack framework and deployment platform built on top of Cloudflare’s infrastructure
I’ve liked Vue and Vite since the beginning of my career, so these releases are especially interesting to me. I have already applied for early access to Void. More immediately, I am curious about Vite Plus shipping a global Node.js version manager, vp env, and I want to see whether it could replace nodenv in my setup.
I added support for pinned posts on both https://tech.zlliang.me and https://days.zlliang.me in zlliang/zlliang@c283182, which also closed issue #77. There still are no real pinned posts on either site yet. I added the feature in advance for a post draft I am currently writing.
Over the past few days, I have been doing a series of minor blogging overhauls: reworking tags, adjusting parts of the UI, and cleaning up the agent skills and authoring references that support my blogging workflow. The more I work on both sites, the more I want to extract their highly similar logic into an Astro theme, something like my own small blog system in the spirit of Starlight.
One thing has become increasingly clear as I look back over my recent notes: I am doing noticeably better on the Chinese days site than on the English tech site. Part of that is simple fluency. But a more important part is that my technical notes still do not contain enough of my own thinking. Too often, they are just a pile of things I saw, rather than writing that helps me think or build a narrative of my own.
I want to keep that in mind and keep improving through writing.
Update Mar 30, 2026: In late March, I renamed my two journal websites. They are now Hack https://hack.zlliang.me and Muse https://muse.zlliang.me. See: Renamed the two journal websites to Hack and Muse.
Zilong Liang / Hack