Issue 036 · June 26, 2026 · currently publishing

$

Notes from a programmer's desk — on agents, serverless, and shipping a product alone.

I'm linxin — an indie full-stack engineer. I build Gentrack.ai: a platform that tracks how a brand shows up across ChatGPT, Perplexity, Claude and Gemini. Next.js on Cloudflare, solo, end to end.

linxin,深圳的独立全栈开发者。在做 Gentrack.ai——追踪品牌在四大 AI 里的可见度。一个人,从产品到认证、计费、prompt 分析,把整座堡垒垒起来。

36
essays published
2.1k
regular readers
2d
since last commit
4
AI oracles tracked
scroll
TypeScript·Next.js·Cloudflare Workers·D1·KV·R2·Clerk·Stripe·Python·Agents·LLM·Linux· TypeScript·Next.js·Cloudflare Workers·D1·KV·R2·Clerk·Stripe·Python·Agents·LLM·Linux·
// recent notes

Latest writing

all posts
01
AI / LLM
06.26.26 — 8 min read

Tracking a Brand Inside the AI Oracles

在 AI 神谕里追踪一个品牌

ChatGPT、Perplexity、Claude、Gemini——品牌在四大 LLM 里到底长什么样?关于 Gentrack.ai 如何度量"被看见"这件事。

read essay
02
Serverless
06.10.26 — 12 min read

A SaaS on Cloudflare Workers, Built by One Pair of Hands

一个人,把 SaaS 跑在 Cloudflare Workers 上

D1 做库,KV 做缓存,R2 存对象,Workers 跑逻辑——全 serverless 的堡垒怎么垒,以及我一路踩过的坑。

read essay
03
Agents
05.28.26 — 9 min read

Prompting as Competitive Intelligence

把 Prompt 当作竞争情报

解析、聚类、对比——从四大 oracle 的回答里,挖出一个品牌在 AI 时代真实的处境与位置。

read essay
// snippet of the week

useTypewriter() — the hook powering this hero.

The blinking greeting at the top of this page isn't a CSS animation — it's a real React hook. Type, pause, delete, advance. Click copy and paste it into your project.

顶部那行会打字、停顿、删除、再前进的问候,不是 CSS 动画,而是一个真正可用的 React hook。点 copy 就能拿走。

  • zero dependencies
  • ~30 lines, fully typed
  • cleanup-safe on unmount
React TypeScript Hooks
useTypewriter.ts
// A self-cleaning typewriter hook. No deps, ~30 lines.
import { useState, useEffect } from 'react';

export function useTypewriter(
  words: string[],
  speed = 80,
  pause = 1800,
) {
  const [text, setText] = useState('');
  const [i, setI] = useState(0);
  const [del, setDel] = useState(false);

  useEffect(() => {
    const word = words[i % words.length];
    const delay = del ? speed / 2 : speed;

    const t = setTimeout(() => {
      setText(del
        ? word.slice(0, text.length - 1)
        : word.slice(0, text.length + 1));
    }, delay);

    if (!del && text === word) {
      const p = setTimeout(() => setDel(true), pause);
      return () => { clearTimeout(t); clearTimeout(p); };
    }
    if (del && text === '') {
      setDel(false);
      setI(i + 1);
    }
    return () => clearTimeout(t);
  }, [text, del, i, words, speed, pause]);

  return text;
}
usage.tsx
function Hero() {
  const greeting = useTypewriter([
    'hello, traveler.',
    '我在深圳,写代码。',
    'console.log(love)',
    'shipping solo, in serverless.',
  ]);

  return <h1>{greeting}</h1>;
}
// the archive

Older posts

36 essays on agents, serverless, and solo shipping — written from Shenzhen over the years. Filtered here by recency; the full index lives in the JSON.

// stay in the loop

Every other Tuesday.

One essay. No tracking, no ads, no "10x" anything. Unsubscribe with a single click — I won't even be offended.

每两周一篇。没有追踪、没有广告、没有"10x"。一键退订——我甚至不会生气。

✓ welcome aboard. 确认邮件已发往你的邮箱。
No spam
One email every two weeks. That's it.
每两周一封,仅此而已。
No tracking
Self-hosted on a $5 box. No analytics.
自托管,无统计代码。
No paywall
Free forever. Or until I run out of coffee.
永久免费——直到咖啡喝完。