holds a still image; this script swaps in a live SVG.
+ Plays only in view, honours reduced motion, "?mgstill" freezes each scene on its still frame. */
+(() => {
+ const NS = "http://www.w3.org/2000/svg";
+ const INK = "#1A1320", YEL = "#FFCA54", BLUE = "#6C8EF5", LIL = "#B69CFF", MINT = "#7FD8AE", SKY = "#9AD8FF", SOFT = "#F1ECF9", MUTE = "#7A6A88";
+ const SANS = '"Space Grotesk", system-ui, sans-serif', MONO = '"JetBrains Mono", ui-monospace, monospace';
+ const el = (t, a = {}, p) => { const n = document.createElementNS(NS, t); for (const k in a) n.setAttribute(k, a[k]); if (p) p.appendChild(n); return n; };
+ const txt = (p, x, y, s, a = {}) => { const n = el("text", Object.assign({ x, y, "font-family": SANS, "font-size": 24, "font-weight": 600, fill: INK }, a), p); n.textContent = s; return n; };
+ const cl = (v, a = 0, b = 1) => Math.max(a, Math.min(b, v));
+ const seg = (t, a, b) => cl((t - a) / (b - a));
+ const oc = (x) => 1 - Math.pow(1 - x, 3);
+ const ob = (x) => { const c = 1.70158; return 1 + (c + 1) * Math.pow(x - 1, 3) + c * Math.pow(x - 1, 2); };
+ const io = (x) => (x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2);
+ const tf = (n, x, y, s = 1, r = 0) => n.setAttribute("transform", `translate(${x} ${y}) rotate(${r}) scale(${s})`);
+ const button = (g, label, fn) => {
+ g.setAttribute("role", "button"); g.setAttribute("tabindex", "0"); g.setAttribute("aria-label", label); g.classList.add("mg-hit");
+ g.addEventListener("click", fn);
+ g.addEventListener("keydown", (e) => { if (e.key === "Enter" || e.key === " ") { e.preventDefault(); fn(); } });
+ };
+ const strip = (svg, y, w = 680) => {
+ el("rect", { x: (800 - w) / 2, y, width: w, height: 48, rx: 24, fill: SOFT }, svg);
+ return txt(svg, 400, y + 32, "", { "text-anchor": "middle", "font-size": 22, "font-weight": 600 });
+ };
+ const lerp = (a, b, k) => a + (b - a) * k;
+
+ const SC = {};
+
+ /* ---- 1. a glass revolving door: OpenCode goes in on the left, seven alternatives come round on the right ---- */
+ SC.door = {
+ dur: 12, still: 10.4,
+ build(svg, api) {
+ txt(svg, 40, 62, "Why look for an OpenCode alternative now?", { "font-size": 30, "font-weight": 700 });
+ const DX = 332, R = 146, RY = 30, RT = 12, TOP = 170, BOT = 440, CY = 316, W = Math.PI / 4;
+ const pyT = (a) => TOP - RT * Math.sin(a), pyB = (a) => BOT + RY * Math.sin(a);
+ const poly = (a0, a1, f) => { let d = ""; for (let i = 0; i <= 16; i++) { const a = ((a0 + ((a1 - a0) * i) / 16) * Math.PI) / 180; d += `${i ? "L" : ""}${(DX + R * Math.cos(a)).toFixed(1)} ${f(a).toFixed(1)} `; } return d; };
+ el("path", { d: `M30 ${BOT + 36} H770`, stroke: INK, "stroke-width": 3, "stroke-linecap": "round" }, svg);
+ /* the ghost of the card that went in */
+ const ghost = el("g", { transform: `translate(104 ${CY})` }, svg);
+ el("rect", { x: -72, y: -22, width: 144, height: 44, rx: 10, fill: "#fff", stroke: LIL, "stroke-width": 3, "stroke-dasharray": "6 8", "stroke-linecap": "round" }, ghost);
+ txt(ghost, 0, 8, "OpenCode", { "text-anchor": "middle", "font-size": 23, "font-weight": 700, fill: MUTE });
+ const door = el("g", {}, svg);
+ const CR = R + 14, CH = 38;
+ el("ellipse", { cx: DX, cy: BOT, rx: CR, ry: RY + 5, fill: SOFT, stroke: INK, "stroke-width": 3 }, door);
+ el("ellipse", { cx: DX, cy: TOP, rx: CR, ry: RT + 3, fill: SOFT, stroke: INK, "stroke-width": 3 }, door);
+ el("path", { d: `M${poly(225, 315, pyT)}L${poly(315, 225, pyB)}Z`, fill: SKY, "fill-opacity": 0.22 }, door);
+ el("path", { d: `M${poly(200, 340, pyB)}`, fill: "none", stroke: LIL, "stroke-width": 2.5, "stroke-linecap": "round" }, door);
+ const back = el("g", {}, door);
+ el("rect", { x: DX - 7, y: TOP - 4, width: 14, height: BOT - TOP + 4, rx: 7, fill: BLUE, stroke: INK, "stroke-width": 3 }, door);
+ const cards = el("g", { "pointer-events": "none" }, door);
+ const front = el("g", {}, door);
+ /* the canopy, seen from just below */
+ el("path", { d: `M${DX - CR} ${TOP - CH} A${CR} ${RT + 3} 0 0 1 ${DX + CR} ${TOP - CH} V${TOP} A${CR} ${RT + 3} 0 0 0 ${DX - CR} ${TOP} Z`, fill: YEL, stroke: INK, "stroke-width": 3, "stroke-linejoin": "round" }, door);
+ const wings = [0, 1, 2, 3].map(() => {
+ const g = el("g", {});
+ const pane = el("path", { fill: SKY, "fill-opacity": 0.34, stroke: INK, "stroke-width": 3, "stroke-linejoin": "round" }, g);
+ const edge = [el("path", { stroke: INK, "stroke-width": 11, "stroke-linecap": "round" }, g), el("path", { stroke: BLUE, "stroke-width": 5, "stroke-linecap": "round" }, g)];
+ return { g, pane, edge };
+ });
+ el("rect", { x: DX - CR - 12, y: TOP - CH - RT - 16, width: 2 * CR + 24, height: BOT + RY + 22 - (TOP - CH - RT - 16), rx: 24, fill: "#fff", "fill-opacity": 0, stroke: INK, "stroke-width": 2, class: "mg-ring" }, door);
+ let pushes = 0, lastPush = -99;
+ button(door, "Push the revolving door round", () => { pushes++; lastPush = api.now(); api.poke(); });
+ /* the cards */
+ const card = (s, fill, w) => {
+ const g = el("g", {}, cards);
+ el("rect", { x: -w / 2, y: -21, width: w, height: 42, rx: 10, fill, stroke: INK, "stroke-width": 3 }, g);
+ txt(g, 0, 8, s, { "text-anchor": "middle", "font-size": 23, "font-weight": 700 });
+ return g;
+ };
+ const oc0 = card("OpenCode", LIL, 144);
+ const ALT = [["Claude Code", YEL], ["Codex CLI", SKY], ["Gemini CLI", MINT], ["Kilo Code", LIL], ["Crush", YEL], ["Pi", SKY], ["Goose", MINT]];
+ const SX = 628, SY0 = 120, SP = 54;
+ const alts = ALT.map(([s, col], i) => ({ g: card(s, col, 210), t0: 2.4 + i * 1.0, y: SY0 + i * SP }));
+ const cap = strip(svg, 514, 700);
+ return (t, now) => {
+ const out = seg(t, 11.4, 11.9);
+ const pk = seg(now - lastPush, 0, 0.8), push = pushes ? (pushes - 1 + oc(pk)) * (Math.PI / 2) : 0;
+ const th = W * t + push + 0.35;
+ wings.forEach((w, i) => {
+ const ang = th + (i * Math.PI) / 2, c = Math.cos(ang), s = Math.sin(ang);
+ const xe = DX + R * c, yt = TOP - RT * s, yb = BOT + RY * s;
+ w.pane.setAttribute("d", `M${DX} ${TOP} L${xe.toFixed(1)} ${yt.toFixed(1)} L${xe.toFixed(1)} ${yb.toFixed(1)} L${DX} ${BOT} Z`);
+ const ed = `M${xe.toFixed(1)} ${(yt + 4).toFixed(1)} V${(yb - 4).toFixed(1)}`;
+ w.edge.forEach((p) => p.setAttribute("d", ed));
+ (s > 0 ? front : back).appendChild(w.g);
+ });
+ /* OpenCode walks in on the left */
+ const k = io(seg(t, 0.6, 2.1));
+ tf(oc0, lerp(104, DX, k), CY, 1 - 0.25 * k);
+ oc0.setAttribute("opacity", seg(t, 0, 0.3) * (1 - seg(k, 0.55, 0.95)));
+ ghost.setAttribute("opacity", seg(t, 1.2, 1.8) * (1 - out));
+ /* the alternatives come round one at a time */
+ alts.forEach((c) => {
+ const a = seg(t, c.t0, c.t0 + 0.45), b = io(seg(t, c.t0 + 0.4, c.t0 + 0.95));
+ const x0 = lerp(DX, DX + R + 46, oc(a)), x = lerp(x0, SX, b), y = lerp(CY, c.y, b) - 34 * Math.sin(Math.PI * b);
+ tf(c.g, x, y, 0.72 + 0.28 * oc(a));
+ c.g.setAttribute("opacity", seg(t, c.t0, c.t0 + 0.25) * (1 - out));
+ });
+ cap.textContent = t < 2.4 || t >= 11.4 ? "OpenCode 2.0: “1.0 plugins will not work in 2.0”" : "Seven alternatives, checked 15 Oct 2026";
+ };
+ },
+ };
+
+ /* ---- 2. a vending machine: eight buttons, and the licence box each one drops into the tray ---- */
+ SC.vending = {
+ dur: 12, still: 10.3,
+ build(svg, api) {
+ txt(svg, 40, 58, "Which OpenCode alternatives are open source?", { "font-size": 28, "font-weight": 700 });
+ const TOOLS = [["OpenCode", "MIT"], ["Claude Code", "All rights reserved"], ["Codex CLI", "Apache 2.0"], ["Gemini CLI", "Apache 2.0"], ["Kilo Code", "MIT"], ["Crush", "FSL 1.1, MIT future licence"], ["Pi", "MIT"], ["Goose", "Apache 2.0"]];
+ const COL = { MIT: MINT, "Apache 2.0": SKY, "All rights reserved": LIL, "FSL 1.1, MIT future licence": YEL };
+ const WX = 74, WY = 104, WW = 380, WH = 372, PX = 474, PW = 252, RH = WH / 8, TY = 494, TH = 54;
+ const TCX = WX + WW / 2, TCY = TY + TH / 2;
+ el("rect", { x: 50, y: 82, width: 700, height: 486, rx: 24, fill: BLUE, stroke: INK, "stroke-width": 3 }, svg);
+ el("rect", { x: WX, y: WY, width: WW, height: WH, rx: 14, fill: "#fff", stroke: INK, "stroke-width": 3 }, svg);
+ el("rect", { x: PX, y: WY, width: PW, height: WH, rx: 14, fill: SOFT, stroke: INK, "stroke-width": 3 }, svg);
+ el("rect", { x: WX, y: TY, width: WW, height: TH, rx: 12, fill: SOFT, stroke: INK, "stroke-width": 3 }, svg);
+ el("path", { d: `M${WX + 14} ${TY + 12} H${WX + WW - 14}`, stroke: LIL, "stroke-width": 3, "stroke-linecap": "round" }, svg);
+ el("rect", { x: PX, y: TY, width: PW, height: TH, rx: 12, fill: "#fff", stroke: INK, "stroke-width": 3 }, svg);
+ const read = txt(svg, PX + PW / 2, TY + 35, "", { "text-anchor": "middle", "font-size": 22, "font-weight": 700, "font-family": MONO });
+ const clip = el("clipPath", { id: "mg-oca-vclip" }, el("defs", {}, svg));
+ el("rect", { x: WX + 2, y: WY + 2, width: WW - 4, height: WH - 4, rx: 12 }, clip);
+ el("rect", { x: WX + 2, y: TY + 2, width: WW - 4, height: TH - 4, rx: 10 }, clip);
+ const box = (p, s, fill) => {
+ const g = el("g", {}, p);
+ const r = el("rect", { y: -16, height: 32, rx: 6, fill, stroke: INK, "stroke-width": 3 }, g);
+ const tx = txt(g, 0, 7, s, { "text-anchor": "middle", "font-size": 19, "font-weight": 700 });
+ const w = tx.getComputedTextLength() + 28; r.setAttribute("x", -w / 2); r.setAttribute("width", w);
+ return { g, w };
+ };
+ let user = null;
+ const rows = TOOLS.map(([name, lic], i) => {
+ const top = WY + RH * i, cy = top + 24, col = COL[lic];
+ let d = `M${WX + 12} ${top + RH - 3}`;
+ for (let x = WX + 12; x < WX + WW - 18; x += 12) d += " q3 -7 6 0 t6 0";
+ el("path", { d, stroke: LIL, "stroke-width": 2.5, fill: "none", "stroke-linecap": "round" }, svg);
+ const back = box(svg, lic, col), fr = box(svg, lic, col), bx = WX + 16 + fr.w / 2;
+ tf(back.g, bx + 10, cy - 5); tf(fr.g, bx, cy);
+ const by = WY + RH * i + RH / 2, g = el("g", {}, svg);
+ el("rect", { x: PX + 6, y: by - 22, width: PW - 12, height: 44, rx: 22, fill: "#fff", "fill-opacity": 0, stroke: INK, "stroke-width": 2, class: "mg-ring" }, g);
+ const btn = el("rect", { x: PX + 12, y: by - 18, width: PW - 24, height: 36, rx: 18, fill: "#fff", stroke: INK, "stroke-width": 2.5 }, g);
+ const lamp = el("circle", { cx: PX + 32, cy: by, r: 9, fill: SOFT, stroke: INK, "stroke-width": 2.5 }, g);
+ txt(g, PX + 50, by + 7, name, { "font-size": 19, "font-weight": 700 });
+ button(g, `${name}: ${lic}`, () => { user = { i, t0: api.now() }; api.poke(); });
+ return { btn, lamp, x: bx, y: cy, t0: 1.0 + i * 1.15 };
+ });
+ const fly = el("g", { "clip-path": "url(#mg-oca-vclip)", "pointer-events": "none" }, svg);
+ const drops = TOOLS.map(([, lic]) => box(fly, lic, COL[lic]).g);
+ el("rect", { x: WX, y: WY, width: WW, height: WH, rx: 14, fill: SKY, "fill-opacity": 0.14, "pointer-events": "none" }, svg);
+ el("path", { d: `M${WX + 362} ${WY + 16} L${WX + 326} ${WY + 92} M${WX + 364} ${WY + 52} L${WX + 344} ${WY + 94}`, stroke: "#fff", "stroke-width": 6, "stroke-linecap": "round", opacity: 0.9, "pointer-events": "none" }, svg);
+ const place = (g, r, k) => {
+ if (k < 0) { g.setAttribute("opacity", 0); return; }
+ g.setAttribute("opacity", 1);
+ if (k < 0.25) { tf(g, r.x, r.y, 1 + 0.08 * oc(k / 0.25)); return; }
+ const f = cl((k - 0.25) / 0.5), y = lerp(r.y, TCY, f * f), x = lerp(r.x, TCX, f), bo = k > 0.75 ? -7 * Math.sin(Math.PI * seg(k, 0.75, 0.98)) : 0;
+ tf(g, x, y + bo, 1.08 - 0.08 * f);
+ };
+ return (t, now) => {
+ const out = seg(t, 11.4, 11.9);
+ let cur = -1;
+ rows.forEach((r, i) => { if (t >= r.t0) cur = i; });
+ const pick = user ? user.i : cur;
+ rows.forEach((r, i) => {
+ const lit = user ? i === user.i : i === cur && !out, done = t >= r.t0 && !out;
+ r.btn.setAttribute("fill", lit ? YEL : "#fff");
+ r.lamp.setAttribute("fill", lit ? YEL : done ? MINT : SOFT);
+ });
+ drops.forEach((g, i) => {
+ if (user) { place(g, rows[i], i === user.i ? now - user.t0 : -1); return; }
+ const r = rows[i], nx = rows[i + 1], k = t - r.t0, gone = nx && t >= nx.t0 + 0.75;
+ place(g, r, gone ? -1 : k);
+ if (k >= 0 && !gone) g.setAttribute("opacity", 1 - out);
+ });
+ read.textContent = pick >= 0 && !(out && !user) ? TOOLS[pick][0] : "15 Oct 2026";
+ };
+ },
+ };
+
+ /* ---- 3. a bookshelf fills one book at a time; each latest release slides out on a tag under its spine ---- */
+ SC.shelf = {
+ dur: 12, still: 10,
+ build(svg, api) {
+ txt(svg, 40, 60, "Latest release", { "font-size": 32, "font-weight": 700 });
+ txt(svg, 760, 60, "15 Oct 2026", { "text-anchor": "end", "font-size": 24, "font-weight": 600, fill: MUTE });
+ const B = [["OpenCode", "v1.19.0", "11 Oct", LIL, 68, 230], ["Claude Code", "v2.1.300", "14 Oct", SKY, 74, 214], ["Codex CLI", "rust-v0.162.1", "9 Oct", MINT, 66, 240], ["Gemini CLI", "v0.64.0", "13 Oct", BLUE, 72, 222],
+ ["Kilo Code", "v7.8.12", "15 Oct", YEL, 70, 236], ["Crush", "v0.98.1", "9 Oct", LIL, 64, 206], ["Pi", "v1.2.0", "12 Oct", SKY, 60, 196], ["Goose", "v1.54.0", "8 Oct", MINT, 70, 226]];
+ const SH = 356, BD = SH + 22;
+ el("rect", { x: 58, y: 96, width: 684, height: SH - 96, fill: SOFT }, svg);
+ const tagLayer = el("g", { "clip-path": "url(#mg-oca-tclip)" }, svg);
+ const clip = el("clipPath", { id: "mg-oca-tclip" }, el("defs", {}, svg));
+ el("rect", { x: 0, y: BD, width: 800, height: 600 - BD }, clip);
+ el("rect", { x: 40, y: 80, width: 720, height: 20, rx: 4, fill: YEL, stroke: INK, "stroke-width": 3 }, svg);
+ [40, 740].forEach((x) => el("rect", { x, y: 80, width: 20, height: BD - 80 + 4, rx: 4, fill: YEL, stroke: INK, "stroke-width": 3 }, svg));
+ const books = el("g", {}, svg);
+ el("rect", { x: 40, y: SH, width: 720, height: 22, rx: 4, fill: YEL, stroke: INK, "stroke-width": 3 }, svg);
+ [[120, 367, 60], [420, 368, 80], [640, 366, 50], [250, 90, 70], [560, 89, 60]].forEach(([x, y, w]) => el("path", { d: `M${x} ${y} h${w}`, stroke: INK, "stroke-width": 2, "stroke-linecap": "round", opacity: 0.5 }, svg));
+ let lift = -1, liftT = -99;
+ const items = B.map(([name, ver, date, col, w, h], i) => {
+ const cx = 102.5 + 85 * i, g = el("g", {}, books), inner = el("g", {}, g);
+ el("rect", { x: -w / 2 - 8, y: -h - 8, width: w + 16, height: h + 16, rx: 12, fill: "#fff", "fill-opacity": 0, stroke: INK, "stroke-width": 2, class: "mg-ring" }, inner);
+ el("rect", { x: -w / 2, y: -h, width: w, height: h, rx: 6, fill: col, stroke: INK, "stroke-width": 3 }, inner);
+ el("path", { d: `M${-w / 2 + 3} ${-h + 20} H${w / 2 - 3} M${-w / 2 + 3} -20 H${w / 2 - 3}`, stroke: INK, "stroke-width": 2.5 }, inner);
+ txt(inner, 0, 0, name, { "text-anchor": "middle", "font-size": 21, "font-weight": 700, transform: `translate(8 ${-h / 2}) rotate(-90)` });
+ button(g, `${name}: latest release ${ver}, ${date}`, () => { lift = i; liftT = api.now(); api.poke(); });
+ const L = i % 2 ? 18 : 96, tg = el("g", {}, tagLayer), sw = el("g", {}, tg);
+ el("path", { d: `M0 ${-L - 70} V${L}`, stroke: INK, "stroke-width": 2.5 }, sw);
+ const r = el("rect", { y: L, height: 66, rx: 10, fill: col, stroke: INK, "stroke-width": 3 }, sw);
+ el("circle", { cy: L + 12, r: 5, fill: "#fff", stroke: INK, "stroke-width": 2.5 }, sw);
+ const v = txt(sw, 0, L + 39, ver, { "text-anchor": "middle", "font-size": 18, "font-weight": 700, "font-family": MONO });
+ txt(sw, 0, L + 59, date, { "text-anchor": "middle", "font-size": 18, "font-weight": 600 });
+ const tw = Math.max(v.getComputedTextLength(), 60) + 26; r.setAttribute("x", -tw / 2); r.setAttribute("width", tw);
+ return { g, inner, tg, sw, cx, L, t0: 0.6 + i * 0.95 };
+ });
+ return (t, now) => {
+ const out = seg(t, 11.4, 11.9);
+ items.forEach((b, i) => {
+ const k = seg(t, b.t0, b.t0 + 0.55), e = ob(k);
+ const lw = i === lift ? now - liftT : 99, up = lw >= 0 && lw < 1.4 ? 22 * Math.sin(Math.PI * cl(lw / 1.4)) : 0;
+ tf(b.g, b.cx, SH - 14 * (1 - e) - up, 1.1 - 0.1 * e);
+ b.g.setAttribute("opacity", seg(t, b.t0, b.t0 + 0.15) * (1 - out));
+ const tt = t - b.t0 - 0.5, s = oc(seg(tt, 0, 0.5));
+ const sw0 = tt < 0 ? 0 : 9 * Math.exp(-2.4 * tt) * Math.sin(7 * tt), sw1 = lw >= 0 && lw < 2 ? 12 * Math.exp(-2.2 * lw) * Math.sin(8 * lw) : 0;
+ b.tg.setAttribute("transform", `translate(${b.cx} ${BD - (b.L + 70) * (1 - s)})`);
+ b.sw.setAttribute("transform", `rotate(${sw0 + sw1})`);
+ b.tg.setAttribute("opacity", (tt < 0 ? 0 : 1) * (1 - out));
+ });
+ };
+ },
+ };
+
+ /* ---- title card, 16 by 9: a snow globe ---- */
+ SC.hero = {
+ w: 960, h: 540, dur: 8, still: 4,
+ build(svg) {
+ txt(svg, 64, 116, "7 coding agents to switch to", { "font-size": 27, "font-weight": 500, fill: MUTE });
+ txt(svg, 60, 208, "OpenCode", { "font-size": 82, "font-weight": 700 });
+ txt(svg, 60, 296, "Alternatives", { "font-size": 82, "font-weight": 700 });
+ el("path", { d: "M66 326 H552", stroke: YEL, "stroke-width": 14, "stroke-linecap": "round" }, svg);
+ el("rect", { x: 60, y: 362, width: 316, height: 56, rx: 28, fill: SOFT, stroke: INK, "stroke-width": 3 }, svg);
+ txt(svg, 218, 399, "Checked 15 Oct 2026", { "text-anchor": "middle", "font-size": 25, "font-weight": 700 });
+ el("path", { d: "M72 474 C190 430 300 500 420 462 S560 432 606 416", stroke: LIL, "stroke-width": 5, fill: "none", "stroke-linecap": "round", "stroke-dasharray": "1 16" }, svg);
+ el("circle", { cx: 72, cy: 474, r: 11, fill: MINT, stroke: INK, "stroke-width": 3 }, svg);
+ const GX = 794, GY = 246, GR = 124;
+ const clip = el("clipPath", { id: "mg-oca-gclip" }, el("defs", {}, svg));
+ el("circle", { cx: GX, cy: GY, r: GR - 2 }, clip);
+ el("circle", { cx: GX, cy: GY, r: GR, fill: SKY, "fill-opacity": 0.25 }, svg);
+ const inside = el("g", { "clip-path": "url(#mg-oca-gclip)" }, svg);
+ el("ellipse", { cx: GX, cy: GY + 112, rx: 140, ry: 52, fill: "#fff", stroke: INK, "stroke-width": 3 }, inside);
+ const tree = (x, y, s) => { const g = el("g", { transform: `translate(${x} ${y}) scale(${s})` }, inside); el("rect", { x: -5, y: -6, width: 10, height: 16, fill: YEL, stroke: INK, "stroke-width": 3 }, g); el("path", { d: "M0 -74 L22 -40 H12 L30 -8 H-30 L-12 -40 H-22 Z", fill: MINT, stroke: INK, "stroke-width": 3, "stroke-linejoin": "round" }, g); };
+ tree(GX - 78, GY + 74, 0.9); tree(GX + 84, GY + 70, 0.75);
+ const term = el("g", { transform: `translate(${GX} ${GY + 16})` }, inside);
+ el("rect", { x: -54, y: -44, width: 108, height: 84, rx: 10, fill: "#fff", stroke: INK, "stroke-width": 3 }, term);
+ el("path", { d: "M-54 -24 V-34 a10 10 0 0 1 10 -10 H44 a10 10 0 0 1 10 10 V-24 Z", fill: LIL, stroke: INK, "stroke-width": 3, "stroke-linejoin": "round" }, term);
+ [-40, -28, -16].forEach((x) => el("circle", { cx: x, cy: -34, r: 3.5, fill: "#fff", stroke: INK, "stroke-width": 2 }, term));
+ el("path", { d: "M-34 -6 L-18 6 L-34 18", stroke: INK, "stroke-width": 5, fill: "none", "stroke-linecap": "round", "stroke-linejoin": "round" }, term);
+ const cur = el("path", { d: "M-6 20 H22", stroke: BLUE, "stroke-width": 5, "stroke-linecap": "round" }, term);
+ const flakes = Array.from({ length: 26 }, (_, i) => {
+ const h = (k) => { const v = Math.sin(i * 12.9898 + k * 78.233) * 43758.5453; return v - Math.floor(v); };
+ const x = GX - 106 + h(1) * 212, ph = h(2), sp = [1, 2][i % 2] / 8, r = 4 + (i % 3) * 1.5;
+ const n = el("g", {}, inside);
+ if (i % 2) el("path", { d: `M0 ${-r - 2} V${r + 2} M${-(r + 2) * 0.87} ${-(r + 2) / 2} L${(r + 2) * 0.87} ${(r + 2) / 2} M${-(r + 2) * 0.87} ${(r + 2) / 2} L${(r + 2) * 0.87} ${-(r + 2) / 2}`, stroke: BLUE, "stroke-width": 2, "stroke-linecap": "round" }, n);
+ else el("circle", { r: r * 0.7, fill: "#fff", stroke: LIL, "stroke-width": 1.5 }, n);
+ return { n, x, ph, sp, w: i * 1.7 };
+ });
+ el("circle", { cx: GX, cy: GY, r: GR, fill: "none", stroke: INK, "stroke-width": 3 }, svg);
+ el("path", { d: `M${GX - 92} ${GY - 40} A100 100 0 0 1 ${GX - 40} ${GY - 92}`, stroke: "#fff", "stroke-width": 8, fill: "none", "stroke-linecap": "round" }, svg);
+ el("path", { d: `M${GX - 104} ${GY - 4} A106 106 0 0 1 ${GX - 101} ${GY - 22}`, stroke: "#fff", "stroke-width": 8, fill: "none", "stroke-linecap": "round" }, svg);
+ el("path", { d: `M${GX - 98} ${GY + 104} L${GX + 98} ${GY + 104} L${GX + 124} ${GY + 196} L${GX - 124} ${GY + 196} Z`, fill: BLUE, stroke: INK, "stroke-width": 3, "stroke-linejoin": "round" }, svg);
+ el("path", { d: `M${GX - 107} ${GY + 136} L${GX + 107} ${GY + 136} L${GX + 113} ${GY + 158} L${GX - 113} ${GY + 158} Z`, fill: YEL, stroke: INK, "stroke-width": 3, "stroke-linejoin": "round" }, svg);
+ el("rect", { x: GX - 136, y: GY + 196, width: 272, height: 16, rx: 8, fill: LIL, stroke: INK, "stroke-width": 3 }, svg);
+ [[620, 132, 15, SKY], [918, 112, 14, YEL], [640, 476, 12, MINT]].forEach(([x, y, r, col]) => el("path", { d: `M0 ${-r} Q0 0 ${r} 0 Q0 0 0 ${r} Q0 0 ${-r} 0 Q0 0 0 ${-r} Z`, fill: col, stroke: INK, "stroke-width": 2.5, "stroke-linejoin": "round", transform: `translate(${x} ${y})` }, svg));
+ return (t) => {
+ flakes.forEach((f) => {
+ const p = (f.ph + t * f.sp) % 1, y = GY - GR + 6 + p * (GR * 2 - 30), x = f.x + 7 * Math.sin(t * 0.785 * 2 + f.w);
+ f.n.setAttribute("transform", `translate(${x.toFixed(1)} ${y.toFixed(1)}) rotate(${(t * 45 + f.w * 20) % 360})`);
+ });
+ cur.setAttribute("opacity", Math.floor(t * 2) % 2 ? 0.15 : 1);
+ };
+ },
+ };
+
+ /* ---- player ---- */
+ const q = new URLSearchParams(location.search), frozen = q.has("mgstill"), fixed = parseFloat(q.get("mgstill"));
+ const calm = matchMedia("(prefers-reduced-motion: reduce)").matches;
+ const mount = (fig) => {
+ const sc = SC[fig.dataset.scene], img = fig.querySelector("img"); if (!sc || !img) return;
+ const W = sc.w || 800, H = sc.h || 600;
+ const svg = el("svg", { viewBox: `0 0 ${W} ${H}`, class: "mg-svg", role: "group", "aria-label": img.alt || "" });
+ svg.style.aspectRatio = `${W} / ${H}`;
+ el("rect", { width: W, height: H, fill: "#fff" }, svg);
+ img.replaceWith(svg);
+ let off = 0, raf = 0, seen = false, held = calm;
+ const base = performance.now(), clock = () => (performance.now() - base) / 1000;
+ let draw = () => {};
+ const frame = () => { const now = clock(); draw(held ? sc.still : (((now + off) % sc.dur) + sc.dur) % sc.dur, now); };
+ const tick = () => { cancelAnimationFrame(raf); frame(); if (seen && !held) raf = requestAnimationFrame(tick); };
+ const api = { now: clock, seek: (s) => { off = s - clock(); held = false; tick(); }, poke: () => { held = false; tick(); } };
+ draw = sc.build(svg, api);
+ if (frozen) { draw(isNaN(fixed) ? sc.still : fixed, 0); return; }
+ new IntersectionObserver(([e]) => {
+ seen = e.isIntersecting;
+ if (seen) { tick(); if (!fig.dataset.sent && window.posthog) { fig.dataset.sent = 1; window.posthog.capture("blog_scene_view", { slug: location.pathname.split("/").filter(Boolean).pop(), scene: fig.dataset.scene }); } }
+ else cancelAnimationFrame(raf);
+ }, { threshold: 0.25 }).observe(fig);
+ svg.addEventListener("click", () => { if (!fig.dataset.hit && window.posthog) { fig.dataset.hit = 1; window.posthog.capture("blog_scene_interact", { slug: location.pathname.split("/").filter(Boolean).pop(), scene: fig.dataset.scene }); } });
+ frame();
+ };
+ const go = () => document.querySelectorAll("figure.mg[data-scene]").forEach(mount);
+ const fonts = document.fonts && document.fonts.load ? Promise.all([document.fonts.load('700 32px "Space Grotesk"'), document.fonts.load('500 20px "Space Grotesk"'), document.fonts.load('700 20px "JetBrains Mono"')]).catch(() => {}) : Promise.resolve();
+ const start = () => fonts.then(go, go);
+ if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", start); else start();
+})();
diff --git a/blog/src/assets/media/opencode-alternatives/shelf.png b/blog/src/assets/media/opencode-alternatives/shelf.png
new file mode 100644
index 000000000..fa79be95f
Binary files /dev/null and b/blog/src/assets/media/opencode-alternatives/shelf.png differ
diff --git a/blog/src/assets/media/opencode-alternatives/vending.png b/blog/src/assets/media/opencode-alternatives/vending.png
new file mode 100644
index 000000000..eb8a3e1dd
Binary files /dev/null and b/blog/src/assets/media/opencode-alternatives/vending.png differ
diff --git a/blog/src/posts/claude-code-best-practices.md b/blog/src/posts/claude-code-best-practices.md
new file mode 100644
index 000000000..500914ac7
--- /dev/null
+++ b/blog/src/posts/claude-code-best-practices.md
@@ -0,0 +1,122 @@
+---
+title: "Claude Code Best Practices: 9 Habits From Anthropic's Docs"
+description: "Nine Claude Code best practices from Anthropic's docs, checked 15 Oct 2026: give Claude a check, plan first, keep memory short, clear context, run in parallel."
+date: 2026-10-15
+category: guides
+categoryLabel: Guides
+type: Technical
+primaryKeyword: "claude code best practices"
+secondaryKeywords: ["claude code tips", "claude code tips and tricks", "how to use claude code effectively", "claude code workflow", "claude.md best practices"]
+tags: ["Guides", "Claude Code", "Getting Started"]
+faq:
+ - q: "What are the most important Claude Code best practices?"
+ a: "Anthropic's best practices page opens with giving Claude a way to verify its work, then exploring and planning before coding. It says most best practices are based on one constraint: the context window fills up fast and performance degrades as it fills. So keep `CLAUDE.md` short and run /clear between unrelated tasks."
+ - q: "How long should `CLAUDE.md` be?"
+ a: "Short. Anthropic's memory docs say to target under 200 lines per `CLAUDE.md` file, because longer files consume more context and reduce adherence. The best practices page suggests asking of each line whether removing it would cause Claude to make mistakes, and cutting it if not."
+ - q: "When should I use plan mode in Claude Code?"
+ a: "Anthropic's best practices page says planning is most useful when you are uncertain about the approach, when the change touches multiple files, or when you are unfamiliar with the code. For small, clear fixes it says to ask Claude directly. Its rule of thumb: if you could describe the diff in one sentence, skip the plan."
+ - q: "How do I get fewer permission prompts in Claude Code?"
+ a: "Anthropic's best practices page says to pre-approve the tools you trust with /permissions and let sandboxed commands run without asking with /sandbox. With Claude Code v2.1.283 or later, auto mode is the built-in starting permission mode for interactive terminal and VS Code sessions, per the permission modes docs."
+ - q: "Can I run more than one Claude Code session at once?"
+ a: "Yes. Anthropic's best practices page lists worktrees, the desktop app, cloud sessions, agent view (a research preview) and agent teams (experimental and disabled by default). Munder Difflin is free and open source: a desktop app that runs a team of coding agents such as Claude Code, Codex and Gemini CLI on your own computer."
+---
+
+The core Claude Code best practices, from Anthropic's own docs, are to give Claude a check it can run, plan before coding, keep `CLAUDE.md` short and clear context between unrelated tasks. Checked 15 Oct 2026.
+
+To run several sessions at once, you can also use [Munder Difflin](https://harnessmd.com/download), free and open source: a desktop app that runs a team of coding agents such as Claude Code, Codex and Gemini CLI on your own computer. Our [install guide](/blog/how-to-install-and-use-munder-difflin/) covers it. New to the tool itself? Read [how to use Claude Code](/blog/how-to-use-claude-code/) first, or browse the [Guides hub](/blog/topics/guides/).
+
+Every tip below comes from [Anthropic's best practices page](https://code.claude.com/docs/en/best-practices) unless it names another Anthropic page or says "Our view".
+
+## Why does the context window shape every tip?
+
+Because Claude gets worse as its context fills. Anthropic's best practices page says "Claude's context window fills up fast, and performance degrades as it fills", and calls the context window "the most important resource to manage". Most of the habits below either save context or replace your attention with a check.
+
+## 1. Give Claude a way to verify its work
+
+Give Claude a check it can run: tests, a build, or a screenshot to compare. Anthropic's best practices page puts it as "the difference between a session you watch and one you walk away from." Put the check in the prompt, as in the page's example:
+
+```txt
+write a validateEmail function. example test cases: user@example.com is true, invalid is false, user@.com is false. run the tests after implementing
+```
+
+For harder gates, the same page lists a `/goal` condition, a Stop hook that blocks the turn until the check passes, and a verification subagent. It also says to have Claude show evidence, such as test output, rather than assert success.
+
+A check catches the bad pebbles before you do. Anthropic's best practices page, checked 15 Oct 2026.
+
+## 2. Explore first, then plan, then code
+
+Separate research and planning from implementation, so Claude does not solve the wrong problem. Anthropic's best practices page gives four phases: explore, plan, implement, commit. Enter plan mode by pressing `Shift+Tab` until the status bar shows plan mode on, or start with:
+
+```bash
+claude --permission-mode plan
+```
+
+Press `Ctrl+G` to edit the plan in your text editor before Claude proceeds. The page also says "If you could describe the diff in one sentence, skip the plan." More in our [plan mode guide](/blog/how-to-use-claude-code-plan-mode/).
+
+Draw the route, then walk it: explore, plan, implement, commit, from Anthropic's best practices page.
+
+## 3. Be specific in your prompts
+
+Reference specific files, mention constraints and point to example patterns. Anthropic's best practices page contrasts "fix the login bug" with a prompt that names the symptom, the likely location in `src/auth/` and a failing test to write first. Use `@` to reference files, paste screenshots, or pipe data in:
+
+```bash
+cat error.log | claude -p "explain this error"
+```
+
+## 4. What should go in `CLAUDE.md`?
+
+Only what Claude can't infer from code and needs in every session: Bash commands, code style that differs from defaults, testing instructions, repo etiquette. Run `/init` for a starter file and `/context` to confirm Claude loaded it. For each line, Anthropic's best practices page asks "Would removing this cause Claude to make mistakes?" If not, cut it. Anthropic's [memory docs](https://code.claude.com/docs/en/memory) say to target under 200 lines per file. Our view: a `CLAUDE.md` that reads like a policy manual gets read like one. See [give Claude Code long term memory](/blog/give-claude-code-long-term-memory/).
+
+Short beats long: Anthropic's memory docs say to target under 200 lines per file.
+
+## 5. Set permissions once, not per prompt
+
+Pre-approve the tools you trust with `/permissions` and let sandboxed commands run without asking with `/sandbox`. Anthropic's best practices page notes that with Claude Code v2.1.283 or later, auto mode is the built-in starting permission mode for interactive terminal and VS Code sessions, where a classifier model blocks only what looks risky. On earlier versions that applies only on Pro, Max and Team plans. See [why Claude Code keeps asking for permission](/blog/why-does-claude-code-keep-asking-for-permission/).
+
+## 6. Use hooks for rules with zero exceptions
+
+Use hooks for anything that must happen every time. Anthropic's best practices page says "Unlike `CLAUDE.md` instructions which are advisory, hooks are deterministic and guarantee the action happens." Ask Claude to "Write a hook that runs eslint after every file edit", edit `.claude/settings.json` by hand, and run `/hooks` to see what is set. Our [hooks explainer](/blog/claude-code-hooks-explained/) goes further.
+
+## 7. Send research to subagents
+
+Delegate investigation to subagents so the reading happens outside your main context. Anthropic's best practices page says subagents "run in separate context windows and report back summaries", and suggests prompts like "use subagents to investigate X". Custom subagents live in `.claude/agents/`. The same page suggests a subagent review of the diff in a fresh context before you call a task done.
+
+## 8. Clear context between tasks
+
+Run `/clear` between unrelated tasks. Anthropic's best practices page says that if you have corrected Claude more than twice on the same issue in one session, the context is cluttered with failed approaches, so clear it and write a better prompt. For finer control:
+
+```txt
+/compact Focus on the API changes
+```
+
+`Esc` stops Claude mid action, and `Esc + Esc` or `/rewind` restores earlier code or conversation. Anthropic's best practices page warns that checkpoints are not "a replacement for git".
+
+## 9. Run several sessions side by side
+
+Run several sessions in parallel. Anthropic's best practices page lists worktrees, the desktop app, cloud sessions, agent view (research preview) and agent teams (experimental and disabled by default). It also suggests a Writer and Reviewer pair, because "a fresh context improves code review". Our [multiple sessions guide](/blog/manage-multiple-claude-code-sessions/) covers the setups.
+
+## Claude Code best practices at a glance, from Anthropic's docs, checked 15 Oct 2026
+
+| Practice | What to do | Where in the docs |
+| --- | --- | --- |
+| Verify | Give a test, build or screenshot check | Give Claude a way to verify its work |
+| Plan | `Shift+Tab` to plan mode, then implement | Explore first, then plan, then code |
+| Be specific | Name files, constraints, patterns; use `@` | Provide specific context in your prompts |
+| `CLAUDE.md` | `/init`, then prune; under 200 lines | Write an effective `CLAUDE.md`; memory docs |
+| Permissions | `/permissions` and `/sandbox` | Configure permissions |
+| Hooks | Script what must always happen | Set up hooks |
+| Subagents | "use subagents to investigate X" | Use subagents for investigation |
+| Context | `/clear`, `/compact`, `/rewind` | Manage your session |
+| Parallel | Worktrees, desktop app, agent view | Run multiple Claude sessions |
+
+## What mistakes does Anthropic warn about?
+
+Anthropic's best practices page names five failure patterns:
+
+- **The kitchen sink session:** unrelated tasks in one context. Fix: `/clear`.
+- **Correcting over and over:** after two failed corrections, clear and rewrite the prompt.
+- **The over-specified `CLAUDE.md`:** prune it, or turn a rule into a hook.
+- **The trust-then-verify gap:** "If you can't verify it, don't ship it."
+- **The infinite exploration:** scope investigations narrowly or use subagents.
+
+
diff --git a/blog/src/posts/how-to-use-claude-code.md b/blog/src/posts/how-to-use-claude-code.md
index d31b214b5..9863c21d0 100644
--- a/blog/src/posts/how-to-use-claude-code.md
+++ b/blog/src/posts/how-to-use-claude-code.md
@@ -135,6 +135,8 @@ In our experience, most beginner trouble is a full context window. Everything Cl
* **Shipping what you can't verify.** Give it tests, scripts or screenshots.
* **Treating rewind as version control.** Checkpoints only track edits made through Claude's file editing tools. Commit first.
+The fuller list is in [Claude Code best practices](/blog/claude-code-best-practices/).
+
## Where to go next
Once the basics feel boring, pick one:
diff --git a/blog/src/posts/open-source-ai-agents.md b/blog/src/posts/open-source-ai-agents.md
index d59b80b4f..adc4e580f 100644
--- a/blog/src/posts/open-source-ai-agents.md
+++ b/blog/src/posts/open-source-ai-agents.md
@@ -42,7 +42,7 @@ It is a program that calls a language model in a loop and uses tools to finish a
### Coding agents
-**5. OpenCode.** OpenCode is an MIT terminal coding agent that works with many model providers, local models included. Our [what is OpenCode](/blog/what-is-opencode/) explainer walks through it. Best for: a Claude Code style agent you can fork.
+**5. OpenCode.** OpenCode is an MIT terminal coding agent that works with many model providers, local models included. Our [what is OpenCode](/blog/what-is-opencode/) explainer walks through it. Leaving it? See our [OpenCode alternatives](/blog/opencode-alternatives/). Best for: a Claude Code style agent you can fork.
**6. Cline.** Cline (Apache 2.0) calls itself the open source coding agent in your IDE, terminal and desktop. Best for: working inside your editor.
diff --git a/blog/src/posts/opencode-alternatives.md b/blog/src/posts/opencode-alternatives.md
new file mode 100644
index 000000000..43e46f552
--- /dev/null
+++ b/blog/src/posts/opencode-alternatives.md
@@ -0,0 +1,100 @@
+---
+title: "OpenCode Alternatives: 7 Coding Agents to Switch To"
+seoTitle: "7 OpenCode Alternatives After the 2.0 Plugin Break"
+description: "Seven OpenCode alternatives checked on 15 Oct 2026: Claude Code, Codex CLI, Gemini CLI, Kilo Code, Crush, Pi and Goose, by licence, models and release."
+date: 2026-10-15
+category: comparisons
+categoryLabel: Comparisons
+type: Technical
+primaryKeyword: "opencode alternatives"
+secondaryKeywords: ["opencode alternative", "open source opencode alternative", "tools like opencode", "opencode 2.0 plugins", "opencode vs kilo code"]
+tags: ["Comparisons", "CLI Agents", "Open Source", "Engines"]
+faq:
+ - q: "What is the closest alternative to OpenCode?"
+ a: "Kilo Code, in our view. Kilo's README on GitHub says \"Kilo CLI is a fork of OpenCode, enhanced to work within the Kilo agentic engineering platform.\" It is MIT licensed and also runs in VS Code and JetBrains."
+ - q: "Is there an open source OpenCode alternative?"
+ a: "Yes. On 15 Oct 2026 GitHub listed Codex CLI, Gemini CLI and Goose under Apache 2.0, and Kilo Code and Pi under MIT. Crush uses the Functional Source License with an MIT future licence. Claude Code's licence file says \"All rights reserved\"."
+ - q: "Will my OpenCode 1.x plugins work in OpenCode 2.0?"
+ a: "No. Anomaly's OpenCode 2.0 post lists \"1.0 plugins will not work in 2.0\" as a breaking change. OpenCode's migration guide says to port plugins, because V1 plugin implementations do not run in V2."
+ - q: "Can I use OpenCode and Claude Code together?"
+ a: "Yes. They are separate CLIs, so you can install both. Munder Difflin is free and open source: a desktop app that runs a team of coding agents such as Claude Code, Codex and Gemini CLI on your own computer, and it can start the OpenCode CLI you installed as one of them."
+---
+
+In our view the closest OpenCode alternative is Kilo Code, whose CLI is a fork of OpenCode. Claude Code, Codex CLI and Gemini CLI are the big vendor agents, and Crush, Pi and Goose are agents that take many models. Checked 15 Oct 2026.
+
+This list is for people weighing a move off OpenCode this week. If you are new to it, read [what is OpenCode](/blog/what-is-opencode/) first. The [Comparisons hub](/blog/topics/comparisons/) has the head to head posts.
+
+## Why look for an OpenCode alternative now?
+
+Because OpenCode 2.0 breaks old setups. [Anomaly's OpenCode 2.0 post](https://anoma.ly/notes/opencode-2-0/), dated 12 Oct 2026, lists three breaking changes: "1.0 plugins will not work in 2.0", "Server API is completely different" and the move of the `tui.json` config. The post's upgrade command is `opencode upgrade --major`. OpenCode's [migration guide](https://opencode.ai/v2/docs/migrate-v1/) says "Port plugins, because V1 plugin implementations do not run in V2."
+
+OpenCode 2.0 breaks 1.0 plugins, per Anomaly's OpenCode 2.0 post of 12 Oct 2026.
+
+If your setup has no 1.x plugins, the upgrade may be all you need, and OpenCode is still MIT with more than 213,000 stars on [GitHub](https://github.com/anomalyco/opencode). On 15 Oct 2026 its latest GitHub release was v1.19.0 (11 Oct), while the [@opencode/cli package on npm](https://www.npmjs.com/package/@opencode/cli) was at 2.0.29.
+
+## Seven alternatives, plus a different kind of tool
+
+Here are seven coding agents and one desktop app for running agents; the "Best for" lines are our view. Stars and releases are from each GitHub repo on 15 Oct 2026.
+
+**1. Claude Code.** [Claude Code](https://code.claude.com/docs/en/overview) is, in Anthropic's words, "an agentic coding tool that reads your codebase, edits files, runs commands, and integrates with your development tools". Its [licence file](https://github.com/anthropics/claude-code/blob/main/LICENSE.md) says "All rights reserved", so the code is not open source ([more here](/blog/is-claude-code-open-source/)). Latest release v2.1.300 (14 Oct), more than 151,000 stars. Best for: Claude models. See [OpenCode vs Claude Code](/blog/opencode-vs-claude-code/) and [Claude Code alternatives](/blog/claude-code-alternatives/).
+
+**2. Munder Difflin.** [Munder Difflin](https://harnessmd.com/download) is what we make, and it is not a replacement for OpenCode. It is free and open source: a desktop app that runs a team of coding agents such as Claude Code, Codex and Gemini CLI on your own computer. OpenCode can be one of those agents, because it starts the CLI you installed. Best for: keeping OpenCode and adding others. Start with [how to install and use Munder Difflin](/blog/how-to-install-and-use-munder-difflin/).
+
+**3. Codex CLI.** OpenAI's [README](https://github.com/openai/codex) calls it "a coding agent from OpenAI that runs locally on your computer". It is Apache 2.0. You sign in with ChatGPT to use your Plus, Pro, Business, Edu or Enterprise plan, or use an API key with extra setup. Latest release rust-v0.162.1 (9 Oct), more than 129,000 stars. Best for: OpenAI models.
+
+**4. Gemini CLI.** Google's [README](https://github.com/google-gemini/gemini-cli) says it "brings the power of Gemini directly into your terminal". It is Apache 2.0, and the README lists a free tier of "60 requests/min and 1,000 requests/day with personal Google account". Latest release v0.64.0 (13 Oct), more than 107,000 stars. Best for: a free tier.
+
+**5. Kilo Code.** Kilo's [README](https://github.com/Kilo-Org/kilocode) says "Kilo CLI is a fork of OpenCode, enhanced to work within the Kilo agentic engineering platform." It also runs in VS Code and JetBrains, is MIT, and lists "500+ models". Latest release v7.8.12 (15 Oct), more than 27,000 stars. Best for: OpenCode habits under a different maintainer.
+
+**6. Crush.** Charm's [Crush](https://github.com/charmbracelet/crush) promises "your workflows, wired into your LLM of choice": a wide range of LLMs, or your own through OpenAI or Anthropic compatible APIs. Its [licence](https://github.com/charmbracelet/crush/blob/main/LICENSE.md) is the "Functional Source License, Version 1.1, MIT Future License". Latest release v0.98.1 (9 Oct), more than 28,000 stars. Best for: a polished terminal UI.
+
+**7. Pi.** The [README](https://github.com/earendil-works/pi) says "Pi is a minimal, extensible agent harness that you can make your own", and that it "skips features like sub-agents and plan mode". It is MIT; badlogic/pi-mono now redirects to earendil-works/pi. Latest release v1.2.0 (12 Oct), more than 115,000 stars. Best for: building your own agent.
+
+**8. Goose.** The [README](https://github.com/aaif-goose/goose) says "goose is a general-purpose AI agent that runs on your machine", with a desktop app, a CLI and "15+ providers". It is Apache 2.0 and part of the Agentic AI Foundation at the Linux Foundation; block/goose now redirects there. Latest release v1.54.0 (8 Oct), more than 55,000 stars. Best for: work beyond code.
+
+Eight buttons, eight licences. From each tool's GitHub repo, 15 Oct 2026.
+
+## OpenCode alternatives at a glance, checked 15 Oct 2026
+
+Every cell comes from the tool's GitHub repo, README or docs, opened on 15 Oct 2026.
+
+| Tool | Maker | Licence | Models it can use | Latest release |
+| --- | --- | --- | --- | --- |
+| OpenCode | Anomaly | MIT | 75+ providers, local models | v1.19.0, 11 Oct |
+| Claude Code | Anthropic | All rights reserved | Claude, direct or via cloud providers | v2.1.300, 14 Oct |
+| Munder Difflin | Munder Difflin | Free and open source | Whatever your agents run | See the download page |
+| Codex CLI | OpenAI | Apache 2.0 | OpenAI, ChatGPT sign in or API key | rust-v0.162.1, 9 Oct |
+| Gemini CLI | Google | Apache 2.0 | Gemini | v0.64.0, 13 Oct |
+| Kilo Code | Kilo | MIT | 500+ models | v7.8.12, 15 Oct |
+| Crush | Charm | FSL 1.1, MIT future licence | Many providers, compatible APIs | v0.98.1, 9 Oct |
+| Pi | earendil-works | MIT | OpenAI, Anthropic, Google and more | v1.2.0, 12 Oct |
+| Goose | Part of the Agentic AI Foundation | Apache 2.0 | 15+ providers | v1.54.0, 8 Oct |
+
+OpenCode's model count is from [opencode.ai](https://opencode.ai/), Claude Code's cloud providers from Anthropic's [enterprise deployment page](https://code.claude.com/docs/en/third-party-integrations), and Pi's providers from the README's pi-ai package line.
+
+OpenCode and seven alternatives, with release tags read from GitHub on 15 Oct 2026.
+
+## Which OpenCode alternatives are open source?
+
+Five of the seven carry a standard open source licence on GitHub: Codex CLI, Gemini CLI and Goose under Apache 2.0, and Kilo Code and Pi under MIT. Crush is different. Its licence bars a "Competing Use" and grants MIT "on the second anniversary of the date we make the Software available", so each version turns MIT two years after release. Claude Code is "All rights reserved".
+
+## Which one is closest to OpenCode?
+
+Kilo Code, because its CLI is a fork of OpenCode, per Kilo's README. Our view: that makes it the shortest move. Whether your 1.x plugins carry over is not stated in Kilo's README, so check before you rely on it.
+
+## Who should pick what?
+
+Our view: pick by why you are leaving.
+
+- **You want the shortest move:** Kilo Code.
+- **You want to keep OpenCode and add other agents:** Munder Difflin.
+- **You want Claude models:** Claude Code.
+- **You pay for ChatGPT already:** Codex CLI.
+- **You want a free tier:** Gemini CLI.
+- **You want a terminal UI with LSP context:** Crush.
+- **You want to build your own agent:** Pi.
+- **You want a desktop app for more than code:** Goose.
+
+If none of that applies, run `opencode upgrade --major`, port your plugins and stay put. Switching tools to avoid porting a few plugins is a lot of moving boxes.
+
+
diff --git a/docs/blog/agent-security-and-sandboxing/index.html b/docs/blog/agent-security-and-sandboxing/index.html
index 4a166b17b..c9f32b6a2 100644
--- a/docs/blog/agent-security-and-sandboxing/index.html
+++ b/docs/blog/agent-security-and-sandboxing/index.html
@@ -327,6 +327,22 @@
Nine Claude Code best practices from Anthropic's docs, checked 15 Oct 2026: give Claude a check, plan first, keep memory short, clear context, run in parallel.
Gemini 4 Argon pricing, checked 13 Oct 2026: $2 input and $10 output per 1M tokens through 30 Nov, then $4 and $20. No free tier. Worked examples inside.
Nine Claude Code best practices from Anthropic's docs, checked 15 Oct 2026: give Claude a check, plan first, keep memory short, clear context, run in parallel.
Gemini 4 Argon pricing, checked 13 Oct 2026: $2 input and $10 output per 1M tokens through 30 Nov, then $4 and $20. No free tier. Worked examples inside.
Nine Claude Code best practices from Anthropic's docs, checked 15 Oct 2026: give Claude a check, plan first, keep memory short, clear context, run in parallel.
Gemini 4 Argon pricing, checked 13 Oct 2026: $2 input and $10 output per 1M tokens through 30 Nov, then $4 and $20. No free tier. Worked examples inside.
Nine Claude Code best practices from Anthropic's docs, checked 15 Oct 2026: give Claude a check, plan first, keep memory short, clear context, run in parallel.
Gemini 4 Argon pricing, checked 13 Oct 2026: $2 input and $10 output per 1M tokens through 30 Nov, then $4 and $20. No free tier. Worked examples inside.
Nine Claude Code best practices from Anthropic's docs, checked 15 Oct 2026: give Claude a check, plan first, keep memory short, clear context, run in parallel.
Gemini 4 Argon pricing, checked 13 Oct 2026: $2 input and $10 output per 1M tokens through 30 Nov, then $4 and $20. No free tier. Worked examples inside.
Nine Claude Code best practices from Anthropic's docs, checked 15 Oct 2026: give Claude a check, plan first, keep memory short, clear context, run in parallel.
Gemini 4 Argon pricing, checked 13 Oct 2026: $2 input and $10 output per 1M tokens through 30 Nov, then $4 and $20. No free tier. Worked examples inside.
Nine Claude Code best practices from Anthropic's docs, checked 15 Oct 2026: give Claude a check, plan first, keep memory short, clear context, run in parallel.
Seven OpenCode alternatives checked on 15 Oct 2026: Claude Code, Codex CLI, Gemini CLI, Kilo Code, Crush, Pi and Goose, by licence, models and release.
Seven OpenCode alternatives checked on 15 Oct 2026: Claude Code, Codex CLI, Gemini CLI, Kilo Code, Crush, Pi and Goose, by licence, models and release.
Seven OpenCode alternatives checked on 15 Oct 2026: Claude Code, Codex CLI, Gemini CLI, Kilo Code, Crush, Pi and Goose, by licence, models and release.
Nine Claude Code best practices from Anthropic's docs, checked 15 Oct 2026: give Claude a check, plan first, keep memory short, clear context, run in parallel.
Gemini 4 Argon pricing, checked 13 Oct 2026: $2 input and $10 output per 1M tokens through 30 Nov, then $4 and $20. No free tier. Worked examples inside.
Nine Claude Code best practices from Anthropic's docs, checked 15 Oct 2026: give Claude a check, plan first, keep memory short, clear context, run in parallel.
Gemini 4 Argon pricing, checked 13 Oct 2026: $2 input and $10 output per 1M tokens through 30 Nov, then $4 and $20. No free tier. Worked examples inside.
Nine Claude Code best practices from Anthropic's docs, checked 15 Oct 2026: give Claude a check, plan first, keep memory short, clear context, run in parallel.
Gemini 4 Argon pricing, checked 13 Oct 2026: $2 input and $10 output per 1M tokens through 30 Nov, then $4 and $20. No free tier. Worked examples inside.
Seven OpenCode alternatives checked on 15 Oct 2026: Claude Code, Codex CLI, Gemini CLI, Kilo Code, Crush, Pi and Goose, by licence, models and release.
Seven OpenCode alternatives checked on 15 Oct 2026: Claude Code, Codex CLI, Gemini CLI, Kilo Code, Crush, Pi and Goose, by licence, models and release.
Seven OpenCode alternatives checked on 15 Oct 2026: Claude Code, Codex CLI, Gemini CLI, Kilo Code, Crush, Pi and Goose, by licence, models and release.
Nine Claude Code best practices from Anthropic's docs, checked 15 Oct 2026: give Claude a check, plan first, keep memory short, clear context, run in parallel.
Gemini 4 Argon pricing, checked 13 Oct 2026: $2 input and $10 output per 1M tokens through 30 Nov, then $4 and $20. No free tier. Worked examples inside.
Seven OpenCode alternatives checked on 15 Oct 2026: Claude Code, Codex CLI, Gemini CLI, Kilo Code, Crush, Pi and Goose, by licence, models and release.
Seven OpenCode alternatives checked on 15 Oct 2026: Claude Code, Codex CLI, Gemini CLI, Kilo Code, Crush, Pi and Goose, by licence, models and release.
Seven OpenCode alternatives checked on 15 Oct 2026: Claude Code, Codex CLI, Gemini CLI, Kilo Code, Crush, Pi and Goose, by licence, models and release.
3. Hermes Agent.Hermes Agent from Nous Research is built around a learning loop: it curates its own memory, writes skills after complex tasks and searches its past sessions. It has a built in cron scheduler, talks over Telegram, Slack, Signal and more, and runs on a laptop, a VPS or serverless backends. Best for: a server agent that improves with use. Our Hermes Agent explainer covers the install command, the models it takes and what it costs.
4. NanoClaw.NanoClaw is a lightweight alternative to OpenClaw that runs each agent in its own Linux container, so isolation comes from the operating system rather than permission checks. Its author writes that they couldn’t have slept after giving software they didn’t understand full access to their life, which is a fair review of most agents. Best for: reading every line of the thing that touches your accounts.
5. OpenCode. OpenCode is an MIT terminal coding agent that works with many model providers, local models included. Our what is OpenCode explainer walks through it. Best for: a Claude Code style agent you can fork.
+
5. OpenCode. OpenCode is an MIT terminal coding agent that works with many model providers, local models included. Our what is OpenCode explainer walks through it. Leaving it? See our OpenCode alternatives. Best for: a Claude Code style agent you can fork.
6. Cline. Cline (Apache 2.0) calls itself the open source coding agent in your IDE, terminal and desktop. Best for: working inside your editor.
7. Aider.Aider (Apache 2.0) is AI pair programming in your terminal, with git built into the loop. Its latest release is from August 2025. Best for: a small, proven tool, if slow updates are fine.
One more for the terminal: Pi, Earendil’s MIT licensed agent harness, which leaves out plan mode and subagents on purpose. Our what is Pi agent explainer covers its 1.0 release.
Seven OpenCode alternatives checked on 15 Oct 2026: Claude Code, Codex CLI, Gemini CLI, Kilo Code, Crush, Pi and Goose, by licence, models and release.
Seven OpenCode alternatives checked on 15 Oct 2026: Claude Code, Codex CLI, Gemini CLI, Kilo Code, Crush, Pi and Goose, by licence, models and release.
Nine Claude Code best practices from Anthropic's docs, checked 15 Oct 2026: give Claude a check, plan first, keep memory short, clear context, run in parallel.
Seven OpenCode alternatives checked on 15 Oct 2026: Claude Code, Codex CLI, Gemini CLI, Kilo Code, Crush, Pi and Goose, by licence, models and release.
Seven OpenCode alternatives checked on 15 Oct 2026: Claude Code, Codex CLI, Gemini CLI, Kilo Code, Crush, Pi and Goose, by licence, models and release.
Seven OpenCode alternatives checked on 15 Oct 2026: Claude Code, Codex CLI, Gemini CLI, Kilo Code, Crush, Pi and Goose, by licence, models and release.
Nine Claude Code best practices from Anthropic's docs, checked 15 Oct 2026: give Claude a check, plan first, keep memory short, clear context, run in parallel.
Nine Claude Code best practices from Anthropic's docs, checked 15 Oct 2026: give Claude a check, plan first, keep memory short, clear context, run in parallel.
Seven OpenCode alternatives checked on 15 Oct 2026: Claude Code, Codex CLI, Gemini CLI, Kilo Code, Crush, Pi and Goose, by licence, models and release.
Nine Claude Code best practices from Anthropic's docs, checked 15 Oct 2026: give Claude a check, plan first, keep memory short, clear context, run in parallel.
Gemini 4 Argon pricing, checked 13 Oct 2026: $2 input and $10 output per 1M tokens through 30 Nov, then $4 and $20. No free tier. Worked examples inside.
Nine Claude Code best practices from Anthropic's docs, checked 15 Oct 2026: give Claude a check, plan first, keep memory short, clear context, run in parallel.
Gemini 4 Argon pricing, checked 13 Oct 2026: $2 input and $10 output per 1M tokens through 30 Nov, then $4 and $20. No free tier. Worked examples inside.
Seven OpenCode alternatives checked on 15 Oct 2026: Claude Code, Codex CLI, Gemini CLI, Kilo Code, Crush, Pi and Goose, by licence, models and release.
Seven OpenCode alternatives checked on 15 Oct 2026: Claude Code, Codex CLI, Gemini CLI, Kilo Code, Crush, Pi and Goose, by licence, models and release.
Nine Claude Code best practices from Anthropic's docs, checked 15 Oct 2026: give Claude a check, plan first, keep memory short, clear context, run in parallel.
Nine Claude Code best practices from Anthropic's docs, checked 15 Oct 2026: give Claude a check, plan first, keep memory short, clear context, run in parallel.
Gemini 4 Argon pricing, checked 13 Oct 2026: $2 input and $10 output per 1M tokens through 30 Nov, then $4 and $20. No free tier. Worked examples inside.
Nine Claude Code best practices from Anthropic's docs, checked 15 Oct 2026: give Claude a check, plan first, keep memory short, clear context, run in parallel.
Gemini 4 Argon pricing, checked 13 Oct 2026: $2 input and $10 output per 1M tokens through 30 Nov, then $4 and $20. No free tier. Worked examples inside.
Seven OpenCode alternatives checked on 15 Oct 2026: Claude Code, Codex CLI, Gemini CLI, Kilo Code, Crush, Pi and Goose, by licence, models and release.
Nine Claude Code best practices from Anthropic's docs, checked 15 Oct 2026: give Claude a check, plan first, keep memory short, clear context, run in parallel.
Gemini 4 Argon pricing, checked 13 Oct 2026: $2 input and $10 output per 1M tokens through 30 Nov, then $4 and $20. No free tier. Worked examples inside.
Nine Claude Code best practices from Anthropic's docs, checked 15 Oct 2026: give Claude a check, plan first, keep memory short, clear context, run in parallel.
Gemini 4 Argon pricing, checked 13 Oct 2026: $2 input and $10 output per 1M tokens through 30 Nov, then $4 and $20. No free tier. Worked examples inside.
Nine Claude Code best practices from Anthropic's docs, checked 15 Oct 2026: give Claude a check, plan first, keep memory short, clear context, run in parallel.
Gemini 4 Argon pricing, checked 13 Oct 2026: $2 input and $10 output per 1M tokens through 30 Nov, then $4 and $20. No free tier. Worked examples inside.
diff --git a/docs/llms.txt b/docs/llms.txt
index fba85c99f..225dfe0a9 100644
--- a/docs/llms.txt
+++ b/docs/llms.txt
@@ -68,61 +68,7 @@ Saturday 24 October 2026.
## Blog
-218 posts, grouped by topic, newest first in each topic. Topic hubs: https://munderdiffl.in/blog/topics/
-
-### concepts
-
-- [OpenCode 2.0: what changed and how to upgrade](https://munderdiffl.in/blog/opencode-2-0/): OpenCode 2.0 from Anomaly: the background service, Code Mode, background subagents, the new plugin API and SDK, and how to upgrade. Checked 15 Oct 2026.
-- [Claude Code Router: What It Is, How It Works and How to Install It](https://munderdiffl.in/blog/claude-code-router/): Claude Code Router, checked 14 Oct 2026: what the local gateway does, how to install it, which providers it lists, and what Anthropic says about it.
-- [Google Let Gemini 4 Argon Loose on Its Own Coding Backlog. Here Are the Receipts.](https://munderdiffl.in/blog/gemini-4-argon-inside-google/): Google's own numbers for Gemini 4 Argon on real code: 134 bugs triaged in under 3 hours, 30% fewer rollbacks, a framework tuned overnight. Checked 13 Oct 2026.
-- [Gemini 4 Argon: Google's Flagship Model Shares a Name With a Gas That Barely Reacts](https://munderdiffl.in/blog/gemini-4-argon/): Gemini 4 Argon went on general release on 13 Oct 2026: $2 input and $10 output per 1M tokens through 30 Nov, a 1M token window, and where you can use it.
-- [Muse Wonder and Muse Code: Meta's new models, prices and scores](https://munderdiffl.in/blog/muse-wonder/): Meta's Muse Wonder and Muse Wonder Full: API price, Muse Code plans, context window and Meta's own coding scores, checked 13 Oct 2026.
-- [Claude routines: what they are, triggers, cost and limits](https://munderdiffl.in/blog/claude-code-routines/): Claude routines run a saved Claude Code prompt in the cloud on a schedule, an API call or a GitHub event. Plans, steps and limits, checked 12 Oct 2026.
-- [Claude Code Projects: what they are and who can use them](https://munderdiffl.in/blog/claude-code-projects/): Claude Code Projects, checked 11 Oct 2026: a public beta on Pro and Max where Claude runs your tasks as parallel threads. Access, limits and plan use.
-- [Claude Managed Agents dynamic workflows: limits and cost](https://munderdiffl.in/blog/claude-managed-agents-dynamic-workflows/): Dynamic workflows let a Claude Managed Agents agent write a program that runs many agents. How to turn them on, beta limits and cost, checked 11 Oct 2026.
-- [Claude Code agent teams: what they are, how to use them](https://munderdiffl.in/blog/claude-code-agent-teams/): Claude Code agent teams, checked 8 Oct 2026: what they are, the experimental setting that turns them on, how they differ from subagents, token cost and limits.
-- [Claude Haiku 5.5: price, benchmarks and where it fits](https://munderdiffl.in/blog/claude-haiku-5-5/): Claude Haiku 5.5 is Anthropic's new small model. Its tiered price, Anthropic's own scores and how to pick it in Claude Code, checked 8 Oct 2026.
-- [GPT-6 in ChatGPT: who gets it, when, and Intelligent UI](https://munderdiffl.in/blog/gpt-6-intelligent-ui/): GPT-6 with Intelligent UI in ChatGPT: Plus, Pro, Business and Enterprise from 7 Oct 2026, then Free and Go. Codex models are not changing in this release.
-- [Claude Agent SDK: what it is, languages, cost and limits](https://munderdiffl.in/blog/what-is-claude-agent-sdk/): The Claude Agent SDK is Claude Code as a Python and TypeScript library. Install commands, features, billing, licence and limits, checked 8 Oct 2026.
-- [ZCode: Z.ai's coding agent harness, explained](https://munderdiffl.in/blog/what-is-zcode/): ZCode is Z.ai's Apache-2.0 coding workspace: desktop app, browser view and terminal agent. How to install it, which models it lists, and what it costs.
-- [OpenAI Decisions API: what it is, price and limits](https://munderdiffl.in/blog/openai-decisions-api/): The OpenAI Decisions API is a beta endpoint that returns a probability, a pick or a score. Price, limits and how to call it, checked 7 Oct 2026.
-- [Mistral Large 4 (Le Chonk): size, price, scores and weights](https://munderdiffl.in/blog/mistral-large-4/): Mistral Large 4 is a 1 trillion parameter open weight model in public preview. Context window, API price, Mistral's own scores and weights, checked 6 Oct 2026.
-- [OpenAI text watermarking: textGrain, who gets it, limits](https://munderdiffl.in/blog/openai-text-watermarking/): OpenAI text watermarking (textGrain) is opt in for the API now and is coming to eligible ChatGPT and Codex text in the EU. Limits checked 6 Oct 2026.
-- [Reflection AI Beam: the 501B open weight model, explained](https://munderdiffl.in/blog/reflection-beam/): Reflection AI Beam is a 501B parameter open weight model. Size, Reflection's own scores, licence and when you can get it, checked 6 Oct 2026.
-- [What Is Claude Cowork? Plans, Prices and How to Use It](https://munderdiffl.in/blog/what-is-claude-cowork/): Claude Cowork is Anthropic's agent for multi-step office work. Which plans include it, what it costs, where it runs and how to start, checked 3 Oct 2026.
-- [Gemini Spark: what it is, what it costs and who can get it](https://munderdiffl.in/blog/what-is-gemini-spark/): Gemini Spark is Google's personal AI agent in the Gemini app. Plans, US prices, countries, limits and how it compares with Grok Bot, checked 3 Oct 2026.
-- [Hermes Agent: what it is, how to install it and what it costs](https://munderdiffl.in/blog/what-is-hermes-agent/): Hermes Agent is Nous Research's MIT licensed AI agent with memory, skills and chat channels. Install command, models, pricing and how it compares.
-- [What Is Codex? OpenAI's Coding Agent in the CLI, App and Cloud](https://munderdiffl.in/blog/what-is-codex/): What is Codex? OpenAI's coding agent runs in your terminal, the ChatGPT desktop app, your IDE and the cloud. Which plans include it, checked 2 Oct 2026.
-- [What is Pi agent? The open source coding agent harness, explained](https://munderdiffl.in/blog/what-is-pi-agent/): Pi agent is Earendil's MIT licensed coding agent harness. What it is, how to install it, what Pi 1.0 and Pi Durable add, and how it compares.
-- [What Is ChatGPT Dots? OpenAI's Always On Agents Explained](https://munderdiffl.in/blog/what-is-chatgpt-dots/): A ChatGPT dot is an always on agent with its own cloud computer. Needs Pro (from $100 a month) or Business Premium, not Plus. Not on Pro in the UK or EU.
-- [What Is OpenCode? Free, MIT Licensed, and What You Pay For](https://munderdiffl.in/blog/what-is-opencode/): OpenCode is a free, MIT licensed coding agent from Anomaly. The tool costs nothing; you pay for the model you connect, unless it is local or free.
-- [Is Ollama Good for Coding? Yes, for Scoped Work on the Right Model](https://munderdiffl.in/blog/is-ollama-good-for-coding/): Ollama is good for coding on scoped, private work if the model fits your memory. Which models to pull, how much RAM, and where Claude still wins.
-- [Claude Max Plan: Is It Worth It? Max 5x vs 20x vs Pro](https://munderdiffl.in/blog/is-claude-code-max-worth-it/): Is the Claude Max plan worth it? Max 5x and 20x against Pro, checked 29 Sep 2026: price, five hour and weekly limits, Fable, and the API break even.
-- [Is Claude Code Open Source?](https://munderdiffl.in/blog/is-claude-code-open-source/): No. Claude Code is proprietary under Anthropic's terms. What its GitHub repo holds, what the 2026 leak changed, and which open tools sit around it.
-- [What Is Vibe Coding? Meaning, Risks and Safer Habits](https://munderdiffl.in/blog/what-is-vibe-coding/): Vibe coding means building software from AI prompts without reading the code. Where the term came from, when it is fine, where it bites, and what to check.
-- [What Is an MCP Server?](https://munderdiffl.in/blog/what-is-an-mcp-server/): An MCP server gives an AI agent tools, data and prompts over one open protocol. What it is, the host, client and server roles, and where Claude Code plugs in.
-- [Claude Code Pricing (Sep 2026): Every Plan, and Is It Free?](https://munderdiffl.in/blog/how-much-does-claude-code-cost/): Claude Code pricing checked 29 Sep 2026: Pro, Max, Team, Enterprise and API rates, usage limits, what changed this year, and whether Claude Code is free.
-- [Loop Engineering: Designing Agent Loops That Converge](https://munderdiffl.in/blog/loop-engineering-for-ai-agents/): Everyone engineers the prompt; almost nobody engineers the loop around it. Stop conditions, drain loops, retry with backoff, compaction cycles, breaker escalation, budgets, and human gates — the outer-loop mechanics that make an agent converge instead of run away.
-- [Review Agent Work Where It Happens](https://munderdiffl.in/blog/review-agent-work-where-it-happens/): AI agents produce diffs faster than humans can review them, and alt-tabbing to an external editor breaks supervision flow. The case for review-in-place: Munder Difflin's built-in Monaco IDE puts a CHANGES rail and side-by-side diffs vs HEAD right on the office floor.
-- [Voice Is a Control Plane, Not a Gimmick](https://munderdiffl.in/blog/voice-as-a-control-plane-for-agent-fleets/): Voice is a terrible way to write code and a great way to run a fleet. Why low-bandwidth commands over high-bandwidth work is the right split — with Munder Difflin's Talk mode (echo-back confirmation, spend caps, michael-voice attribution) as the case study.
-- [What Is an Agent Development Environment (ADE)?](https://munderdiffl.in/blog/what-is-an-agent-development-environment/): ADE means two things in 2026: a platform for building agents (Letta's sense) and a workspace for shipping code with fleets of coding agents (Orca's sense). Here's the full tooling map — chat IDEs, agent CLIs, agent IDEs, and agent harnesses — and how to pick.
-- [What Is Harness Engineering?](https://munderdiffl.in/blog/what-is-harness-engineering/): Harness engineering is the discipline of building everything around the model — PTY plumbing, lifecycle hooks, mailboxes, memory, budgets, human gates, observability — because that's where agent reliability actually comes from. A definition, and four case studies from inside Munder Difflin.
-- [Shareable Agent Roles: A Portable Format for Hiring AI Coworkers](https://munderdiffl.in/blog/shareable-agent-roles/): Why agent roles should be portable: what a hire manifest encodes, how one-click hiring stays safe, and how The Hiring Fair turns tacit setup into a shareable artifact.
-- [The Clone Army Is a Trap: Why a Mixed Swarm Beats Ten Identical Agents](https://munderdiffl.in/blog/the-clone-army-trap-mixed-swarm-vs-identical-agents/): Spinning up tens of identical top-tier CLI agents feels powerful and burns tokens on work a cheaper agent could do. A mixed-capability swarm with shared memory wins on cost — and often on quality.
-- [Why CLI Agents Are So Powerful — and How Munder Difflin Spends Fewer Tokens Doing the Same Work](https://munderdiffl.in/blog/why-cli-agents-are-powerful/): CLI agents are powerful because they have terminal-level access: they run builds, tests, and git, and verify their own work by executing it. Here's why that matters — and the concrete ways Munder Difflin cuts token consumption while doing it.
-- [Generative Engine Optimization: The Techniques the Research Backs](https://munderdiffl.in/blog/generative-engine-optimization-techniques/): What the first peer-reviewed GEO study found works to get content cited by AI — statistics, source citations, quotes — and why keyword stuffing backfires.
-- [The Agents Rule of Two: A Simple Safety Rule for Coding Agents](https://munderdiffl.in/blog/agents-rule-of-two/): Meta's Agents Rule of Two for coding agents: don't let one session combine untrusted input, private data, and external reach at once — or supervise.
-- [Can Claude Code Agents Talk to Each Other?](https://munderdiffl.in/blog/can-claude-code-agents-talk-to-each-other/): Can Claude Code agents talk to each other? By default they report to their launcher — but a small coordination layer lets them message peer-to-peer.
-- [Do More With Less: Smart Model Routing Across Agents](https://munderdiffl.in/blog/do-more-with-less-model-routing/): Why a hive of agents shouldn't all run the biggest model — and how routing the right task to the right model cuts cost and latency without losing quality.
-- [How AI Agents Verify Their Own Work (Before Saying 'Done')](https://munderdiffl.in/blog/how-ai-agents-verify-their-own-work/): The discipline that makes an autonomous coding agent trustworthy: prove every claim, reproduce the green, and check the fix — not just the intent.
-- [Long-Running Agents: The 2026 Shift from Minutes to Hours](https://munderdiffl.in/blog/long-running-agents-the-2026-shift/): Agents used to answer in seconds; now they run for hours. The data behind the shift — and why a longer agent is a different problem, not just a bigger one.
-- [Building AI Dev Tools in the Open, On Purpose](https://munderdiffl.in/blog/open-source-ai-tools-on-purpose/): Agents touch your code, keys, and memory. That's why agent tooling should be open source and local-first — so you can verify it, not just trust it.
-- [AEO for Dev Tools: Getting Cited by ChatGPT and Claude](https://munderdiffl.in/blog/what-is-aeo-for-dev-tools/): Answer Engine Optimization for dev tools: how to get cited by ChatGPT, Claude, and Perplexity with the right robots.txt, JSON-LD, and writing patterns.
-- [When Do AI Agents Actually Need an Agent Protocol?](https://munderdiffl.in/blog/when-do-agents-need-an-agent-protocol/): When do AI agents need a protocol like MCP or A2A? Agents you own coordinate fine with file mailboxes; protocols earn their keep across boundaries.
-- [The AI Coding Agent Glossary: Harness, Orchestrator, Hive, Subagent](https://munderdiffl.in/blog/ai-agent-glossary/): Plain-English definitions of the AI coding agent terms everyone trips over — harness, orchestrator, hive, subagent, agent memory — each in one line.
-- [Munder Difflin FAQ: Everything People Ask](https://munderdiffl.in/blog/munder-difflin-faq/): Answers to the top Munder Difflin questions — what it is, is it free, does it run locally, which platforms, and how it differs from many terminals.
-- [What Are Claude Code Agents? And How to Use Many at Once](https://munderdiffl.in/blog/what-are-claude-code-agents/): Claude Code agents explained in plain English — what an agent actually is, how subagents differ, and the leap from one agent to a coordinated team.
-- [What Is an AI Agent Harness? Single vs Multi-Agent Harness Explained](https://munderdiffl.in/blog/what-is-a-multi-agent-harness/): An agent harness is the code around an AI model that runs its tool loop, memory and permissions. Single vs multi-agent harnesses, compared and dated.
+220 posts, grouped by topic, newest first in each topic. Topic hubs: https://munderdiffl.in/blog/topics/
### guides
@@ -131,6 +77,7 @@ Saturday 24 October 2026.
- [AI Agent Use Cases From a Real Company: Every Agent on Our Floor and the Job It Does](https://munderdiffl.in/blog/ai-agent-use-cases-our-office/): We run our company on Munder Difflin. Every seat on our floor: what each AI agent does, how its work starts, what comes out, and how to copy it.
- [How to Get the Most Out of Your Claude Code Max Plan](https://munderdiffl.in/blog/claude-code-max-plan-tips/): Stretch a Claude Code Max plan: model choice, context hygiene, prompt caching, subagents and unattended runs, checked against Anthropic's own pages.
- [How to Make the Most of Your Codex Max Plan](https://munderdiffl.in/blog/codex-max-plan-tips/): There is no Codex Max plan. What ChatGPT Pro 5x and 20x give you in Codex, how the weekly limit works, and how to stretch it.
+- [Claude Code Best Practices: 9 Habits From Anthropic's Docs](https://munderdiffl.in/blog/claude-code-best-practices/): Nine Claude Code best practices from Anthropic's docs, checked 15 Oct 2026: give Claude a check, plan first, keep memory short, clear context, run in parallel.
- [Claude Code Skills: What They Are, Where They Live and How to Write One](https://munderdiffl.in/blog/claude-code-skills/): Claude Code skills, checked 14 Oct 2026: what a skill is, where skill folders live, a first skill file, how Claude picks one and how to share them.
- [Gemini 4 Argon Pricing: Half Price Until 30 November, Then the Real Bill Arrives](https://munderdiffl.in/blog/gemini-4-argon-pricing/): Gemini 4 Argon pricing, checked 13 Oct 2026: $2 input and $10 output per 1M tokens through 30 Nov, then $4 and $20. No free tier. Worked examples inside.
- [How to Use Gemini 4 Argon: Five Ways In, and Free Is Not One of Them](https://munderdiffl.in/blog/how-to-use-gemini-4-argon/): How to use Gemini 4 Argon on 13 Oct 2026: the Gemini app, AI Mode, AI Studio, the API with model ID gemini-4-argon, and Antigravity. What each route needs.
@@ -178,11 +125,66 @@ Saturday 24 October 2026.
- [Set Up a Claude Code Multi-Agent Workflow in 10 Minutes](https://munderdiffl.in/blog/claude-code-multi-agent-setup-tutorial/): A from-zero Claude Code multi-agent setup: install Munder Difflin, onboard, spawn a few agents, and watch the GOD orchestrator route your first task.
- [Claude Code Subagents: How to Create and Use Them (vs Agent Teams)](https://munderdiffl.in/blog/claude-code-subagents-vs-multi-agent-harness/): Claude Code subagents in 2026: the .claude/agents file, built-in Explore and Plan, models, nesting, and when agent teams or a harness fit better.
+### concepts
+
+- [OpenCode 2.0: what changed and how to upgrade](https://munderdiffl.in/blog/opencode-2-0/): OpenCode 2.0 from Anomaly: the background service, Code Mode, background subagents, the new plugin API and SDK, and how to upgrade. Checked 15 Oct 2026.
+- [Claude Code Router: What It Is, How It Works and How to Install It](https://munderdiffl.in/blog/claude-code-router/): Claude Code Router, checked 14 Oct 2026: what the local gateway does, how to install it, which providers it lists, and what Anthropic says about it.
+- [Google Let Gemini 4 Argon Loose on Its Own Coding Backlog. Here Are the Receipts.](https://munderdiffl.in/blog/gemini-4-argon-inside-google/): Google's own numbers for Gemini 4 Argon on real code: 134 bugs triaged in under 3 hours, 30% fewer rollbacks, a framework tuned overnight. Checked 13 Oct 2026.
+- [Gemini 4 Argon: Google's Flagship Model Shares a Name With a Gas That Barely Reacts](https://munderdiffl.in/blog/gemini-4-argon/): Gemini 4 Argon went on general release on 13 Oct 2026: $2 input and $10 output per 1M tokens through 30 Nov, a 1M token window, and where you can use it.
+- [Muse Wonder and Muse Code: Meta's new models, prices and scores](https://munderdiffl.in/blog/muse-wonder/): Meta's Muse Wonder and Muse Wonder Full: API price, Muse Code plans, context window and Meta's own coding scores, checked 13 Oct 2026.
+- [Claude routines: what they are, triggers, cost and limits](https://munderdiffl.in/blog/claude-code-routines/): Claude routines run a saved Claude Code prompt in the cloud on a schedule, an API call or a GitHub event. Plans, steps and limits, checked 12 Oct 2026.
+- [Claude Code Projects: what they are and who can use them](https://munderdiffl.in/blog/claude-code-projects/): Claude Code Projects, checked 11 Oct 2026: a public beta on Pro and Max where Claude runs your tasks as parallel threads. Access, limits and plan use.
+- [Claude Managed Agents dynamic workflows: limits and cost](https://munderdiffl.in/blog/claude-managed-agents-dynamic-workflows/): Dynamic workflows let a Claude Managed Agents agent write a program that runs many agents. How to turn them on, beta limits and cost, checked 11 Oct 2026.
+- [Claude Code agent teams: what they are, how to use them](https://munderdiffl.in/blog/claude-code-agent-teams/): Claude Code agent teams, checked 8 Oct 2026: what they are, the experimental setting that turns them on, how they differ from subagents, token cost and limits.
+- [Claude Haiku 5.5: price, benchmarks and where it fits](https://munderdiffl.in/blog/claude-haiku-5-5/): Claude Haiku 5.5 is Anthropic's new small model. Its tiered price, Anthropic's own scores and how to pick it in Claude Code, checked 8 Oct 2026.
+- [GPT-6 in ChatGPT: who gets it, when, and Intelligent UI](https://munderdiffl.in/blog/gpt-6-intelligent-ui/): GPT-6 with Intelligent UI in ChatGPT: Plus, Pro, Business and Enterprise from 7 Oct 2026, then Free and Go. Codex models are not changing in this release.
+- [Claude Agent SDK: what it is, languages, cost and limits](https://munderdiffl.in/blog/what-is-claude-agent-sdk/): The Claude Agent SDK is Claude Code as a Python and TypeScript library. Install commands, features, billing, licence and limits, checked 8 Oct 2026.
+- [ZCode: Z.ai's coding agent harness, explained](https://munderdiffl.in/blog/what-is-zcode/): ZCode is Z.ai's Apache-2.0 coding workspace: desktop app, browser view and terminal agent. How to install it, which models it lists, and what it costs.
+- [OpenAI Decisions API: what it is, price and limits](https://munderdiffl.in/blog/openai-decisions-api/): The OpenAI Decisions API is a beta endpoint that returns a probability, a pick or a score. Price, limits and how to call it, checked 7 Oct 2026.
+- [Mistral Large 4 (Le Chonk): size, price, scores and weights](https://munderdiffl.in/blog/mistral-large-4/): Mistral Large 4 is a 1 trillion parameter open weight model in public preview. Context window, API price, Mistral's own scores and weights, checked 6 Oct 2026.
+- [OpenAI text watermarking: textGrain, who gets it, limits](https://munderdiffl.in/blog/openai-text-watermarking/): OpenAI text watermarking (textGrain) is opt in for the API now and is coming to eligible ChatGPT and Codex text in the EU. Limits checked 6 Oct 2026.
+- [Reflection AI Beam: the 501B open weight model, explained](https://munderdiffl.in/blog/reflection-beam/): Reflection AI Beam is a 501B parameter open weight model. Size, Reflection's own scores, licence and when you can get it, checked 6 Oct 2026.
+- [What Is Claude Cowork? Plans, Prices and How to Use It](https://munderdiffl.in/blog/what-is-claude-cowork/): Claude Cowork is Anthropic's agent for multi-step office work. Which plans include it, what it costs, where it runs and how to start, checked 3 Oct 2026.
+- [Gemini Spark: what it is, what it costs and who can get it](https://munderdiffl.in/blog/what-is-gemini-spark/): Gemini Spark is Google's personal AI agent in the Gemini app. Plans, US prices, countries, limits and how it compares with Grok Bot, checked 3 Oct 2026.
+- [Hermes Agent: what it is, how to install it and what it costs](https://munderdiffl.in/blog/what-is-hermes-agent/): Hermes Agent is Nous Research's MIT licensed AI agent with memory, skills and chat channels. Install command, models, pricing and how it compares.
+- [What Is Codex? OpenAI's Coding Agent in the CLI, App and Cloud](https://munderdiffl.in/blog/what-is-codex/): What is Codex? OpenAI's coding agent runs in your terminal, the ChatGPT desktop app, your IDE and the cloud. Which plans include it, checked 2 Oct 2026.
+- [What is Pi agent? The open source coding agent harness, explained](https://munderdiffl.in/blog/what-is-pi-agent/): Pi agent is Earendil's MIT licensed coding agent harness. What it is, how to install it, what Pi 1.0 and Pi Durable add, and how it compares.
+- [What Is ChatGPT Dots? OpenAI's Always On Agents Explained](https://munderdiffl.in/blog/what-is-chatgpt-dots/): A ChatGPT dot is an always on agent with its own cloud computer. Needs Pro (from $100 a month) or Business Premium, not Plus. Not on Pro in the UK or EU.
+- [What Is OpenCode? Free, MIT Licensed, and What You Pay For](https://munderdiffl.in/blog/what-is-opencode/): OpenCode is a free, MIT licensed coding agent from Anomaly. The tool costs nothing; you pay for the model you connect, unless it is local or free.
+- [Is Ollama Good for Coding? Yes, for Scoped Work on the Right Model](https://munderdiffl.in/blog/is-ollama-good-for-coding/): Ollama is good for coding on scoped, private work if the model fits your memory. Which models to pull, how much RAM, and where Claude still wins.
+- [Claude Max Plan: Is It Worth It? Max 5x vs 20x vs Pro](https://munderdiffl.in/blog/is-claude-code-max-worth-it/): Is the Claude Max plan worth it? Max 5x and 20x against Pro, checked 29 Sep 2026: price, five hour and weekly limits, Fable, and the API break even.
+- [Is Claude Code Open Source?](https://munderdiffl.in/blog/is-claude-code-open-source/): No. Claude Code is proprietary under Anthropic's terms. What its GitHub repo holds, what the 2026 leak changed, and which open tools sit around it.
+- [What Is Vibe Coding? Meaning, Risks and Safer Habits](https://munderdiffl.in/blog/what-is-vibe-coding/): Vibe coding means building software from AI prompts without reading the code. Where the term came from, when it is fine, where it bites, and what to check.
+- [What Is an MCP Server?](https://munderdiffl.in/blog/what-is-an-mcp-server/): An MCP server gives an AI agent tools, data and prompts over one open protocol. What it is, the host, client and server roles, and where Claude Code plugs in.
+- [Claude Code Pricing (Sep 2026): Every Plan, and Is It Free?](https://munderdiffl.in/blog/how-much-does-claude-code-cost/): Claude Code pricing checked 29 Sep 2026: Pro, Max, Team, Enterprise and API rates, usage limits, what changed this year, and whether Claude Code is free.
+- [Loop Engineering: Designing Agent Loops That Converge](https://munderdiffl.in/blog/loop-engineering-for-ai-agents/): Everyone engineers the prompt; almost nobody engineers the loop around it. Stop conditions, drain loops, retry with backoff, compaction cycles, breaker escalation, budgets, and human gates — the outer-loop mechanics that make an agent converge instead of run away.
+- [Review Agent Work Where It Happens](https://munderdiffl.in/blog/review-agent-work-where-it-happens/): AI agents produce diffs faster than humans can review them, and alt-tabbing to an external editor breaks supervision flow. The case for review-in-place: Munder Difflin's built-in Monaco IDE puts a CHANGES rail and side-by-side diffs vs HEAD right on the office floor.
+- [Voice Is a Control Plane, Not a Gimmick](https://munderdiffl.in/blog/voice-as-a-control-plane-for-agent-fleets/): Voice is a terrible way to write code and a great way to run a fleet. Why low-bandwidth commands over high-bandwidth work is the right split — with Munder Difflin's Talk mode (echo-back confirmation, spend caps, michael-voice attribution) as the case study.
+- [What Is an Agent Development Environment (ADE)?](https://munderdiffl.in/blog/what-is-an-agent-development-environment/): ADE means two things in 2026: a platform for building agents (Letta's sense) and a workspace for shipping code with fleets of coding agents (Orca's sense). Here's the full tooling map — chat IDEs, agent CLIs, agent IDEs, and agent harnesses — and how to pick.
+- [What Is Harness Engineering?](https://munderdiffl.in/blog/what-is-harness-engineering/): Harness engineering is the discipline of building everything around the model — PTY plumbing, lifecycle hooks, mailboxes, memory, budgets, human gates, observability — because that's where agent reliability actually comes from. A definition, and four case studies from inside Munder Difflin.
+- [Shareable Agent Roles: A Portable Format for Hiring AI Coworkers](https://munderdiffl.in/blog/shareable-agent-roles/): Why agent roles should be portable: what a hire manifest encodes, how one-click hiring stays safe, and how The Hiring Fair turns tacit setup into a shareable artifact.
+- [The Clone Army Is a Trap: Why a Mixed Swarm Beats Ten Identical Agents](https://munderdiffl.in/blog/the-clone-army-trap-mixed-swarm-vs-identical-agents/): Spinning up tens of identical top-tier CLI agents feels powerful and burns tokens on work a cheaper agent could do. A mixed-capability swarm with shared memory wins on cost — and often on quality.
+- [Why CLI Agents Are So Powerful — and How Munder Difflin Spends Fewer Tokens Doing the Same Work](https://munderdiffl.in/blog/why-cli-agents-are-powerful/): CLI agents are powerful because they have terminal-level access: they run builds, tests, and git, and verify their own work by executing it. Here's why that matters — and the concrete ways Munder Difflin cuts token consumption while doing it.
+- [Generative Engine Optimization: The Techniques the Research Backs](https://munderdiffl.in/blog/generative-engine-optimization-techniques/): What the first peer-reviewed GEO study found works to get content cited by AI — statistics, source citations, quotes — and why keyword stuffing backfires.
+- [The Agents Rule of Two: A Simple Safety Rule for Coding Agents](https://munderdiffl.in/blog/agents-rule-of-two/): Meta's Agents Rule of Two for coding agents: don't let one session combine untrusted input, private data, and external reach at once — or supervise.
+- [Can Claude Code Agents Talk to Each Other?](https://munderdiffl.in/blog/can-claude-code-agents-talk-to-each-other/): Can Claude Code agents talk to each other? By default they report to their launcher — but a small coordination layer lets them message peer-to-peer.
+- [Do More With Less: Smart Model Routing Across Agents](https://munderdiffl.in/blog/do-more-with-less-model-routing/): Why a hive of agents shouldn't all run the biggest model — and how routing the right task to the right model cuts cost and latency without losing quality.
+- [How AI Agents Verify Their Own Work (Before Saying 'Done')](https://munderdiffl.in/blog/how-ai-agents-verify-their-own-work/): The discipline that makes an autonomous coding agent trustworthy: prove every claim, reproduce the green, and check the fix — not just the intent.
+- [Long-Running Agents: The 2026 Shift from Minutes to Hours](https://munderdiffl.in/blog/long-running-agents-the-2026-shift/): Agents used to answer in seconds; now they run for hours. The data behind the shift — and why a longer agent is a different problem, not just a bigger one.
+- [Building AI Dev Tools in the Open, On Purpose](https://munderdiffl.in/blog/open-source-ai-tools-on-purpose/): Agents touch your code, keys, and memory. That's why agent tooling should be open source and local-first — so you can verify it, not just trust it.
+- [AEO for Dev Tools: Getting Cited by ChatGPT and Claude](https://munderdiffl.in/blog/what-is-aeo-for-dev-tools/): Answer Engine Optimization for dev tools: how to get cited by ChatGPT, Claude, and Perplexity with the right robots.txt, JSON-LD, and writing patterns.
+- [When Do AI Agents Actually Need an Agent Protocol?](https://munderdiffl.in/blog/when-do-agents-need-an-agent-protocol/): When do AI agents need a protocol like MCP or A2A? Agents you own coordinate fine with file mailboxes; protocols earn their keep across boundaries.
+- [The AI Coding Agent Glossary: Harness, Orchestrator, Hive, Subagent](https://munderdiffl.in/blog/ai-agent-glossary/): Plain-English definitions of the AI coding agent terms everyone trips over — harness, orchestrator, hive, subagent, agent memory — each in one line.
+- [Munder Difflin FAQ: Everything People Ask](https://munderdiffl.in/blog/munder-difflin-faq/): Answers to the top Munder Difflin questions — what it is, is it free, does it run locally, which platforms, and how it differs from many terminals.
+- [What Are Claude Code Agents? And How to Use Many at Once](https://munderdiffl.in/blog/what-are-claude-code-agents/): Claude Code agents explained in plain English — what an agent actually is, how subagents differ, and the leap from one agent to a coordinated team.
+- [What Is an AI Agent Harness? Single vs Multi-Agent Harness Explained](https://munderdiffl.in/blog/what-is-a-multi-agent-harness/): An agent harness is the code around an AI model that runs its tool loop, memory and permissions. Single vs multi-agent harnesses, compared and dated.
+
### comparisons
- [Grok Bot Alternatives: 9 Picks, Hosted or on Your Computer](https://munderdiffl.in/blog/grok-bot-alternatives/): Grok Bot runs every Bot on one shared cloud computer in the US. Nine alternatives checked on 30 Sep 2026, from ChatGPT dots to open source agents you run.
- [Herdr Alternatives: What to Pick and Who Each One Fits](https://munderdiffl.in/blog/herdr-alternatives/): Herdr alternatives checked on 14 Sep 2026: tmux, Munder Difflin, Claude Squad, cmux, Orca, Conductor, Superset and Emdash, and who each fits.
- [OmniAgent Alternatives: What to Use Instead of Databricks Omnigent](https://munderdiffl.in/blog/omniagent-alternatives/): OmniAgent is really Omnigent, the open source meta harness from Databricks. Alternatives checked on 14 Sep 2026, and who each one fits.
+- [OpenCode Alternatives: 7 Coding Agents to Switch To](https://munderdiffl.in/blog/opencode-alternatives/): Seven OpenCode alternatives checked on 15 Oct 2026: Claude Code, Codex CLI, Gemini CLI, Kilo Code, Crush, Pi and Goose, by licence, models and release.
- [Muse Code vs Claude Code: Plans, Prices, Models and Where They Run](https://munderdiffl.in/blog/muse-code-vs-claude-code/): Muse Code vs Claude Code, checked 14 Oct 2026: the main plans and monthly prices, the models each runs, where each installs, and which one to pick.
- [Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win](https://munderdiffl.in/blog/gemini-4-argon-vs-claude-opus-5-5/): Google's own table: Gemini 4 Argon tops 13 of 19 rows, GPT-6 Astra 3 and Claude Opus 5.5 2. The coding rows split. List prices compared.
- [Codex Usage Limits vs Claude Code: What Each Plan Gives You](https://munderdiffl.in/blog/codex-vs-claude-code-usage-limits/): Codex usage limits vs Claude Code usage limits, checked 10 Oct 2026: the five hour window, weekly limits, credits and how to check usage on each plan.
diff --git a/docs/sitemap.xml b/docs/sitemap.xml
index ab05f462d..b3d21f4ca 100644
--- a/docs/sitemap.xml
+++ b/docs/sitemap.xml
@@ -27,12 +27,24 @@
monthly0.8
+
+ https://munderdiffl.in/blog/claude-code-best-practices/
+ 2026-10-15
+ monthly
+ 0.8
+ https://munderdiffl.in/blog/opencode-2-0/2026-10-15monthly0.8
+
+ https://munderdiffl.in/blog/opencode-alternatives/
+ 2026-10-15
+ monthly
+ 0.8
+ https://munderdiffl.in/blog/ai-agent-use-cases-our-office/2026-10-14
@@ -1329,8 +1341,8 @@
monthly0.8
- https://munderdiffl.in/blog/topics/concepts/weekly0.5https://munderdiffl.in/blog/topics/guides/weekly0.5
+ https://munderdiffl.in/blog/topics/concepts/weekly0.5https://munderdiffl.in/blog/topics/comparisons/weekly0.5https://munderdiffl.in/blog/topics/internals/weekly0.5https://munderdiffl.in/blog/topics/story/weekly0.5