Issue 042 · September 2026 · currently publishing

$

Notes from a programmer's desk — on code, systems, and the strange joy of debugging at 2am.

I'm Maksim Zhabin — software engineer writing about the craft. TypeScript today, Rust tomorrow, assembly for fun. New essay every other Tuesday.

142
essays published
8.2k
regular readers
2d
since last commit
cups of coffee
scroll
JavaScript·TypeScript·Rust·Go·WebAssembly·PostgreSQL·Redis·Docker·Kubernetes·Linux·NeoVim· JavaScript·TypeScript·Rust·Go·WebAssembly·PostgreSQL·Redis·Docker·Kubernetes·Linux·NeoVim·
// recent notes

Latest writing

all posts
01
JavaScript
11.12.24 — 8 min read

On the Quiet Violence of Implicit Conversions

JavaScript will let you add [] to {} and thank you for it. A field guide to footguns.

read essay
02
Compilers
10.28.24 — 14 min read

A Lexer, By Hand, On a Sunday Afternoon

Skip the regex. Skip the generator. Two hundred lines of switch statements and you'll understand something new about every language you've ever used.

read essay
03
Error Handling
10.14.24 — 6 min read

Why I Removed Every Try/Catch From My Codebase

Result types, error channels, and the curious peace of letting things crash loudly in development.

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.

  • 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.',
    'you found /dev/log.',
    'console.log(love)',
  ]);

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

Older posts

142 essays on programming, written over four 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.

Subscriptions are not connected yet. A working form will be available here soon.
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.