EST. 2018.12.30  ·  A SMALL PUBLICATION OF ONE
LATITUDE: WEB · LONGITUDE: TERMINAL
PRICE: FREE · OPEN SOURCE

生鱼

— dispatches on code, craft & the quieter parts of the net.

From the desk of the editor

I make small, stubborn tools for people who prefer the quiet parts of the internet — browser extensions that stay out of the way, macOS apps that feel native, and terminal agents that answer in prose.

Most of what lives in the workshop is for an audience of one (me) or of a few. Occasionally something escapes and finds readers. This journal is where I keep the receipts — fragments of a practice that refuses to scale.

Browse the dispatches for recent thinking, the workshop for the things themselves.

Pen Name
生鱼安乐 · Shēng Yú Ān Lè
Handle
github.com/LCYLYM
Personal site
loli.by
Instruments
Swift · TypeScript · Python · Kotlin · PHP
Currently
A player plugin for 浪前 reader · browser agents · native macOS telemetry
Established
2018 · seven winters in
生鱼安乐 FIG. 01 — THE EDITOR, AT HIS DESK
Feature · 本期专题

On building tools for one — and why the internet still needs small workshops.

There is a class of software that was never meant to scale. It was made for one person, or for two, or for the small room of people who already understood the joke. It has a readme written in a hurry and a license copied from an older project. It does one thing, it does it in an odd way, and it does not apologise for either. I have been making this kind of software for about seven years now, and I have started to believe that it matters — not despite its smallness, but because of it.

The current internet has a very strong opinion about what a tool should look like. It should have a landing page with gradient hero copy. It should have a free tier and a paid tier and an enterprise tier. It should have a roadmap pinned to the top of its repository, a Discord invite, and an ambient anxiety about growth. None of this is wrong, exactly. But it describes only one shape of making, and I suspect it has begun to edit out all the others.

A tool for one is not a failed product. It is a finished sentence — spoken clearly in a small room, and left on the shelf in case someone wants to read it.

My own workshop is full of these sentences. A player plugin that lets me finish a show on the commute. A macOS menu-bar monitor that shows the real wattage of my laptop, because the built-in one kept lying to me. A Chrome extension that clusters my tabs with a local model, because my browser is a library and I am a bad librarian. None of these were built to be products. Most of them will never be. They are, to borrow a phrase from letterpress, job printing — small private editions, printed once, for the people actually in the room.

What I have learned, making them, is that the constraint of the tiny audience is generous. You can choose the odd keyboard shortcut. You can write error messages that sound like you. You can refuse to track anything, refuse to ask for an email, refuse to explain. You can, in other words, make something that feels like a letter rather than an announcement. And sometimes — not always — a letter travels further than an announcement, because it is warm to the touch.

This weekly is a letter of the same kind. I will file it when I have something to say and not when the calendar insists. I will use the word quiet more than is strictly fashionable. And I will continue to publish code into the forest, in case someone is walking there.

Dispatches

Recent entries, in descending order
04 · APRIL · MMXXVI

A week inside an agentic terminal, or: how I stopped writing commands and started writing briefs.

Seven days of Claude Code in the terminal — a field report. Where the seams still show, where the thing genuinely surprised me, and the small rituals (a CLAUDE.md, a few hooks, one skill) that turned an assistant into a coworker.

Read the field report

Frontend, the way I keep writing it — a small manifesto against the framework sprawl.

Semantic HTML first, CSS variables second, a single build step if I must. Notes from 8 years of refusing to redo the work whenever a new framework gets funded.

Continue reading

Real watts, in the menu bar.

How MacoPowerMonitor reads adapter and battery telemetry directly from IOKit — and why the stock reading is a lie most of the time.

Read the teardown

On prompt engineering as engineering.

Versioned prompts, tests for prompts, rollback plans for prompts. If it is load-bearing in production, it deserves a changelog.

Read the note

A markdown pad, in the old style.

mac-markdown-pad: live preview, scroll sync that actually syncs, bilingual UI. 1.3 MB. No sign-in.

See the tool
Title Tongue Description
01 Telegram-Channel-Mirror Worker Using a CloudFlare Worker to mirror a Telegram channel so that it can be read from the mainland — the most unexpectedly useful thing I have ever published. 47
02 mac-markdown-pad Swift A native macOS Markdown editor with live preview, source-aware scroll sync, and a quiet bilingual (中/EN) UI. 1
03 MacoPowerMonitor Swift A menu-bar power monitor that reads the real adapter and battery telemetry — because the stock reading lies. 1
04 lqreadervideosync TypeScript A browser player plugin built for the 浪前 reader — keeps my commute shows in sync across windows. 2
05 ai-tabs-organizer TypeScript A Chrome extension that clusters open tabs with an OpenAI-compatible API or the built-in Chrome AI, locally. 0
06 gemini-ai-conversation-exporter TypeScript Export Gemini conversations cleanly to Markdown — because no model should eat my notes. 3
07 Pixiv-daily-top50-widget PHP A self-updating widget showing the daily Pixiv top 50 — made for a blog sidebar I no longer maintain. 3
08 apktiaozhanbei TypeScript A competition entry — kept here as a record rather than a product. 0
09 hmpc Kotlin A small Kotlin experiment, still half-built, still honest about it. 1
10 bob-in-win-py-wxocr Python A WeChat OCR wrapper for the Bob translator — runs locally, never phones home. 0
11 justatest HTML Exactly what it says on the tin — a sketch file that escaped into the repo list. 0
12 blogsystemforgit HTML A minimal git-backed blog engine — the ghost of the system this page descends from. 0
See the remaining 374 →
is the character above my desk.
It means quiet — a roof over a person, a woman at rest in a house. In my name, paired with , it is a small wish: to be at peace, and to enjoy it.

I do not publish on a schedule. I publish when a thought has finished cooking, which — sometimes — is never. If you want to be notified when the next issue appears, the honest answer is: star the repository and wait.

If something here is useful to you, the only thanks I need is that you do the same, for someone else, quietly.

Signed, at the desk
Vol. VIII · Iss. 046 生鱼安乐