diff --git a/blog/src/_data/media.json b/blog/src/_data/media.json index c443a2a09..a128aaca8 100644 --- a/blog/src/_data/media.json +++ b/blog/src/_data/media.json @@ -5045,5 +5045,39 @@ "status": "ready" }, "inline": {} + }, + "agent-tools-today-2026-10-19": { + "title": "Agent Tools Today, 19 Oct 2026: DeepSeek Search API, Sphinx, OpenClaw 2026.10.5", + "category": "news", + "hero": { + "file": "assets/media/agent-tools-today/hero.png", + "alt": "Hand drawn sketch: a front page with five numbered lines, a clock, and a yellow character reading it out", + "prompt": "Series hero for the Agent Tools Today daily brief, drawn in code (media-src/topic-tiles.html?t=news). Reused by every brief.", + "status": "ready" + }, + "inline": {}, + "youtube": [] + }, + "hermes-agent-alternatives": { + "title": "Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud", + "category": "comparisons", + "hero": { + "file": "assets/media/hermes-agent-alternatives/hero.png", + "alt": "Title card on white. The title Hermes Agent alternatives in large ink type, a 7 picks for chat, code and cloud kicker, a Checked 19 Oct 2026 line and a paper plane trailing a dashed loop.", + "prompt": "Title card: the hero scene in assets/media/hermes-agent-alternatives/motion.js, shot at 1600 by 900.", + "status": "ready" + }, + "inline": {} + }, + "kilo-code-vs-cline": { + "title": "Kilo Code vs Cline: Two Open Source Coding Agents Compared", + "category": "comparisons", + "hero": { + "file": "assets/media/kilo-code-vs-cline/hero.png", + "alt": "Title card on white. The title Kilo Code vs Cline in large ink type, a Two open source coding agents kicker, a Checked 19 Oct 2026 line, and a blue paddle and a lilac paddle trading a ball over a mint table.", + "prompt": "Title card: the hero scene in assets/media/kilo-code-vs-cline/motion.js, shot at 1600 by 900.", + "status": "ready" + }, + "inline": {} } } diff --git a/blog/src/assets/media/agent-tools-today-2026-10-19/motion.css b/blog/src/assets/media/agent-tools-today-2026-10-19/motion.css new file mode 100644 index 000000000..42847f586 --- /dev/null +++ b/blog/src/assets/media/agent-tools-today-2026-10-19/motion.css @@ -0,0 +1,13 @@ +/* Bright coded scenes for "Agent tools today, 19 Oct 2026". Pairs with motion.js. */ +.prose figure.mg { margin: 42px 0; } +.prose figure.mg img, .mg .mg-svg { display: block; width: 100%; height: auto; border: 1px solid #1A1320; border-radius: 18px; background: #fff; } +.mg figcaption { font: 500 13px/1.5 "Space Grotesk", system-ui, sans-serif; color: #6B5878; padding-top: 10px; text-align: center; } +.mg .mg-svg { touch-action: manipulation; -webkit-tap-highlight-color: transparent; } +.mg .mg-svg text { -webkit-user-select: none; user-select: none; pointer-events: none; } +.mg .mg-hit { cursor: pointer; outline: none; } +.mg [role="slider"] { cursor: grab; touch-action: none; } +.mg .mg-ring { stroke-opacity: 0; transition: stroke-opacity 0.15s; } +.mg .mg-hit:focus-visible .mg-ring { stroke-opacity: 1; } +.mg [role="slider"]:focus-visible circle:nth-child(2) { stroke-width: 5; } +@media (hover: hover) { .mg .mg-hit:hover .mg-ring { stroke-opacity: 0.5; } } +@media (prefers-reduced-motion: reduce) { .mg .mg-ring { transition: none; } } diff --git a/blog/src/assets/media/agent-tools-today-2026-10-19/motion.js b/blog/src/assets/media/agent-tools-today-2026-10-19/motion.js new file mode 100644 index 000000000..547622aa4 --- /dev/null +++ b/blog/src/assets/media/agent-tools-today-2026-10-19/motion.js @@ -0,0 +1,229 @@ +/* Bright coded scenes for "Agent tools today, 19 Oct 2026". Vanilla JS, no library. +
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 SC = {}; + + /* ---- a drawbridge: a git push parcel waits, Sphinx asks one question, the answer lowers the bridge ---- */ + SC.today = { + w: 1600, h: 1200, dur: 10, still: 7.7, + build(svg, api) { + const SW = 4, TAU = Math.PI * 2; + const A = (o) => Object.assign({ stroke: INK, "stroke-width": SW, "stroke-linejoin": "round", "stroke-linecap": "round" }, o); + const GY = 880, GL = 590, GR = 1010, LEAF = 432, CX = 800; + const T_ANS = 4.2, T_B0 = 4.8, T_B1 = 6.1, T_R0 = 6.7, T_R1 = 8.7; + const XS = -200, X0 = 330, X1 = 1350, WR = 29, RA = 76; + + /* sky: a sun and two clouds */ + const sun = el("g", {}, svg); + el("circle", A({ r: 50, fill: YEL }), sun); + for (let i = 0; i < 8; i++) { const a = (i * Math.PI) / 4; el("path", A({ d: `M${70 * Math.cos(a)} ${70 * Math.sin(a)} L${92 * Math.cos(a)} ${92 * Math.sin(a)}`, fill: "none" }), sun); } + const clouds = [[190, 490, 0, 1], [610, 470, 4, 0.85], [1430, 150, 2, 1]].map(([x, y, k, z]) => { + const g = el("g", {}, svg), m = (v) => (v * z).toFixed(1); + el("path", A({ d: `M${m(-96)} ${m(34)} A${m(30)} ${m(30)} 0 0 1 ${m(-70)} ${m(-14)} A${m(44)} ${m(44)} 0 0 1 ${m(4)} ${m(-40)} A${m(40)} ${m(40)} 0 0 1 ${m(72)} ${m(-6)} A${m(22)} ${m(22)} 0 0 1 ${m(96)} ${m(34)} Z`, fill: SOFT }), g); + return { g, x, y, k }; + }); + + /* the moat under the gap */ + const water = el("path", A({ fill: SKY }), svg); + + /* two banks with a strip of grass and a few stones */ + [[60, GL], [GR, 1540]].forEach(([a, b]) => { + el("path", A({ d: `M${a} ${GY} H${b} V1120 Q${b} 1140 ${b - 20} 1140 H${a + 20} Q${a} 1140 ${a} 1120 Z`, fill: SOFT }), svg); + el("rect", A({ x: a, y: GY, width: b - a, height: 30, fill: MINT }), svg); + }); + [[110, 960, 96], [250, 1050, 120], [420, 975, 84], [470, 1062, 74], [1090, 990, 90], [1250, 1060, 120], [1400, 970, 96]].forEach(([x, y, w]) => + el("rect", A({ x, y, width: w, height: 44, rx: 20, fill: LIL }), svg)); + + /* the tower that winds the chain */ + const PYX = 1060, PYY = 440; + el("rect", A({ x: PYX - 22, y: PYY, width: 44, height: GY - PYY, rx: 10, fill: LIL }), svg); + const chain = el("path", A({ fill: "none", "stroke-dasharray": "14 9" }), svg); + const pulley = el("g", {}, svg); + el("circle", A({ r: 26, fill: YEL }), pulley); + el("path", A({ d: "M-14 0 H14 M0 -14 V14", fill: "none" }), pulley); + tf(pulley, PYX, PYY); + + /* the bridge leaf, hinged on the far bank */ + const leaf = el("g", {}, svg); + el("rect", A({ x: -LEAF, y: 0, width: LEAF, height: 34, rx: 8, fill: BLUE }), leaf); + for (let x = -LEAF + 54; x < 0; x += 54) el("path", A({ d: `M${x} 0 V34`, fill: "none" }), leaf); + el("circle", A({ cx: GR, cy: GY + 17, r: 13, fill: YEL }), svg); + + /* the flag on the far side */ + const FX = 1522, FY0 = 470, FY1 = 580, FX1 = 1250; + el("rect", A({ x: FX - 8, y: 456, width: 16, height: GY - 456, rx: 6, fill: SOFT }), svg); + el("circle", A({ cx: FX, cy: 446, r: 16, fill: YEL }), svg); + const cloth = el("path", A({ fill: MINT }), svg); + txt(svg, (FX - 8 + FX1) / 2, 537, "origin/main", { "text-anchor": "middle", "font-family": MONO, "font-size": 32, "font-weight": 700 }); + + /* dust where the leaf lands */ + const dust = [[548, 866], [596, 852], [640, 868]].map(([x, y]) => ({ c: el("circle", A({ cx: x, cy: y, r: 0, fill: SOFT, opacity: 0 }), svg) })); + + /* the parcel on two wheels */ + const parcel = el("g", {}, svg); + const speed = [0, 1, 2].map(() => el("path", A({ fill: "none", opacity: 0 }), parcel)); + const body = el("g", {}, parcel); + el("rect", A({ x: -148, y: -270, width: 296, height: 212, rx: 16, fill: YEL }), body); + el("path", A({ d: "M-148 -224 H148", fill: "none" }), body); + el("rect", A({ x: -24, y: -270, width: 48, height: 46, fill: BLUE }), body); + el("rect", A({ x: -118, y: -192, width: 236, height: 88, rx: 14, fill: SOFT }), body); + txt(body, 0, -134, "git push", { "text-anchor": "middle", "font-family": MONO, "font-size": 40, "font-weight": 700 }); + const wheels = [-88, 88].map((x) => { + const w = el("g", {}, parcel); + el("circle", A({ r: WR, fill: SOFT }), w); + el("path", A({ d: "M-17 0 H17 M0 -17 V17", fill: "none" }), w); + return { w, x }; + }); + + /* sparkles when the parcel arrives */ + const sparks = [[1166, 560, YEL], [1140, 700, LIL], [1385, 408, SKY]].map(([x, y, c], i) => { + const g = el("g", { opacity: 0 }, svg); + el("path", A({ d: "M0 -26 Q0 0 26 0 Q0 0 0 26 Q0 0 -26 0 Q0 0 0 -26 Z", fill: c }), g); + return { g, x, y, i }; + }); + + /* the question card from Sphinx: tap it, or press Enter or Space, to answer */ + const card = el("g", { opacity: 0 }, svg); + const cin = el("g", {}, card); + el("rect", { x: 284, y: 66, width: 1032, height: 330, rx: 40, fill: "none", stroke: BLUE, "stroke-width": SW, class: "mg-ring" }, cin); + el("rect", A({ x: 300, y: 82, width: 1000, height: 298, rx: 28, fill: SOFT }), cin); + el("rect", A({ x: 334, y: 110, width: 170, height: 56, rx: 28, fill: LIL }), cin); + txt(cin, 419, 149, "Sphinx", { "text-anchor": "middle", "font-family": MONO, "font-size": 32, "font-weight": 700 }); + txt(cin, CX, 252, "What happens on the retry?", { "text-anchor": "middle", "font-size": 58, "font-weight": 700 }); + const slot = el("rect", A({ x: -160, y: -32, width: 320, height: 64, rx: 32, fill: "none", stroke: MUTE, "stroke-dasharray": "12 12" }), cin); + const pill = el("g", { opacity: 0 }, cin); + el("rect", A({ x: -158, y: -32, width: 316, height: 64, rx: 32, fill: MINT }), pill); + el("circle", A({ cx: -118, cy: 0, r: 20, fill: SOFT }), pill); + const chk = el("path", A({ d: "M-128 0 L-120 8 L-106 -8", fill: "none", "stroke-dasharray": 40, "stroke-dashoffset": 40 }), pill); + txt(pill, -86, 12, "Understood", { "font-size": 34, "font-weight": 700 }); + + let last = 0, lastNow = -99, kick = -99; + button(card, "Answer the question and lower the bridge", () => { + const playing = api.now() - lastNow < 0.25; + kick = api.now(); + if (!playing || last < T_ANS || last > T_R1) api.seek(T_ANS); + }); + + return (t, now = 0) => { + last = t; lastNow = now; + const out = 1 - io(seg(t, 9.4, 9.85)); + + /* sky and water move gently, in step with the loop */ + tf(sun, 170, 190, 1, t * 4.5); + clouds.forEach((c) => tf(c.g, c.x + 12 * Math.sin((TAU * t) / 10 + c.k), c.y)); + let d = `M${GL - 6} 1140`; + for (let x = GL - 6; x <= GR + 6; x += 12) d += ` L${x} ${(1016 + 7 * Math.sin(x / 34 - (TAU * t * 4) / 10)).toFixed(1)}`; + water.setAttribute("d", d + ` L${GR + 6} 1140 Z`); + + /* the bridge: up, then a drop with a small bounce, then back up for the next loop */ + let th = RA; + if (t >= T_B0 && t < T_B1) { const p = seg(t, T_B0, T_B1); th = RA * (1 - p * p); } + else if (t >= T_B1 && t < 9.3) { const u = t - T_B1; th = 6 * Math.abs(Math.sin(u * 9)) * Math.exp(-u * 6); } + else if (t >= 9.3) th = RA * io(seg(t, 9.3, 10)); + leaf.setAttribute("transform", `translate(${GR} ${GY}) rotate(${th})`); + const r = (th * Math.PI) / 180, tx = GR - LEAF * Math.cos(r), ty = GY - LEAF * Math.sin(r); + chain.setAttribute("d", `M${PYX} ${PYY} L${tx.toFixed(1)} ${ty.toFixed(1)}`); + tf(pulley, PYX, PYY, 1, th * 4); + dust.forEach((k, i) => { + const p = seg(t, T_B1 + i * 0.05, T_B1 + 0.6 + i * 0.05); + k.c.setAttribute("r", (20 * Math.sin(Math.PI * p)).toFixed(1)); + k.c.setAttribute("opacity", p > 0 && p < 1 ? 1 : 0); + }); + + /* the flag waves */ + const a = 7 * Math.sin((TAU * t * 8) / 10) + 5 * seg(t, T_R1, 9) * Math.sin((TAU * t * 16) / 10) * out; + const x0 = FX - 8, w3 = (FX1 - x0) / 3; + cloth.setAttribute("d", `M${x0} ${FY0} C${x0 + w3} ${FY0 - a} ${x0 + 2 * w3} ${FY0 + a} ${FX1} ${FY0} L${FX1} ${FY1} C${x0 + 2 * w3} ${FY1 + a} ${x0 + w3} ${FY1 - a} ${x0} ${FY1} Z`); + + /* the parcel rolls in, waits with small hops, then crosses */ + const pin = seg(t, 0, 1), pr = seg(t, T_R0, T_R1); + const px = t < T_R0 ? XS + (X0 - XS) * oc(pin) : X0 + (X1 - X0) * io(pr); + let tilt = 0, hop = 0; + if (t < 1) tilt = 5 * Math.sin(Math.PI * pin); + else if (t < T_R0) { const u = t - 1; tilt = 3 * Math.sin(u * 12) * Math.exp(-u * 5); } + else if (t < T_R1) tilt = -5 * Math.sin(TAU * pr); + else { const u = t - T_R1; tilt = 4 * Math.sin(u * 12) * Math.exp(-u * 5); } + if (t > 1.8 && t < T_B0) hop = 14 * Math.sin(Math.PI * seg(((t - 1.8) % 0.8) / 0.8, 0, 0.3)); + [GL - 12, GR].forEach((s) => wheels.forEach((w) => { hop += 5 * Math.exp(-Math.pow((px + w.x - s) / 14, 2)); })); + tf(parcel, px, GY - hop); + body.setAttribute("transform", `rotate(${tilt.toFixed(2)} 0 -58)`); + wheels.forEach((w) => tf(w.w, w.x, -WR, 1, ((px - XS) / WR) * (180 / Math.PI))); + parcel.setAttribute("opacity", out); + const v = t >= T_R0 && t < T_R1 ? Math.sin(Math.PI * pr) : 0; + speed.forEach((n, i) => { + const y = [-118, -170, -222][i], x = -172 - i * 10, len = 70 * v; + n.setAttribute("d", `M${x} ${y} H${(x - len).toFixed(1)}`); + n.setAttribute("opacity", v > 0.3 ? 1 : 0); + }); + + sparks.forEach((s) => { + const p = seg(t, T_R1 + s.i * 0.12, T_R1 + 0.3 + s.i * 0.12); + tf(s.g, s.x, s.y, ob(p) * out * (0.9 + 0.1 * Math.sin(t * 6 + s.i)), 12 * Math.sin(t * 2 + s.i)); + s.g.setAttribute("opacity", p > 0 ? 1 : 0); + }); + + /* the card drops in, bobs, takes the answer */ + const pc = seg(t, 1, 1.6), lt = now - kick, sq = lt >= 0 && lt < 0.35 ? Math.sin((Math.PI * lt) / 0.35) : 0; + const cs = (0.7 + 0.3 * ob(pc)) * (1 - 0.03 * sq), by = 5 * Math.sin((TAU * t * 4) / 10); + card.setAttribute("transform", `translate(${CX} ${231 + by}) scale(${cs}) translate(${-CX} -231)`); + card.setAttribute("opacity", (pc > 0 ? Math.min(1, pc * 3) : 0) * out); + const ps = seg(t, T_ANS, T_ANS + 0.4); + const pulse = 1 + 0.04 * Math.max(0, Math.sin((TAU * t * 8) / 10)); + slot.setAttribute("transform", `translate(${CX} 322) scale(${ps > 0 ? 1 : pulse})`); + slot.setAttribute("opacity", ps > 0 ? 0 : 1); + pill.setAttribute("transform", `translate(${CX} 322) scale(${cl(ob(ps), 0, 1.2)})`); + pill.setAttribute("opacity", ps > 0 ? 1 : 0); + chk.setAttribute("stroke-dashoffset", (40 * (1 - seg(t, T_ANS + 0.25, T_ANS + 0.55))).toFixed(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/agent-tools-today-2026-10-19/today.png b/blog/src/assets/media/agent-tools-today-2026-10-19/today.png new file mode 100644 index 000000000..1e854e747 Binary files /dev/null and b/blog/src/assets/media/agent-tools-today-2026-10-19/today.png differ diff --git a/blog/src/assets/media/hermes-agent-alternatives/bento.png b/blog/src/assets/media/hermes-agent-alternatives/bento.png new file mode 100644 index 000000000..d49eec83a Binary files /dev/null and b/blog/src/assets/media/hermes-agent-alternatives/bento.png differ diff --git a/blog/src/assets/media/hermes-agent-alternatives/hero.png b/blog/src/assets/media/hermes-agent-alternatives/hero.png new file mode 100644 index 000000000..3b063a5f1 Binary files /dev/null and b/blog/src/assets/media/hermes-agent-alternatives/hero.png differ diff --git a/blog/src/assets/media/hermes-agent-alternatives/lift.png b/blog/src/assets/media/hermes-agent-alternatives/lift.png new file mode 100644 index 000000000..a66bd3c8d Binary files /dev/null and b/blog/src/assets/media/hermes-agent-alternatives/lift.png differ diff --git a/blog/src/assets/media/hermes-agent-alternatives/motion.css b/blog/src/assets/media/hermes-agent-alternatives/motion.css new file mode 100644 index 000000000..2cea74a26 --- /dev/null +++ b/blog/src/assets/media/hermes-agent-alternatives/motion.css @@ -0,0 +1,13 @@ +/* Bright coded scenes for "Hermes Agent alternatives". Pairs with motion.js. */ +.prose figure.mg { margin: 42px 0; } +.prose figure.mg img, .mg .mg-svg { display: block; width: 100%; height: auto; border: 1px solid #1A1320; border-radius: 18px; background: #fff; } +.mg figcaption { font: 500 13px/1.5 "Space Grotesk", system-ui, sans-serif; color: #6B5878; padding-top: 10px; text-align: center; } +.mg .mg-svg { touch-action: manipulation; -webkit-tap-highlight-color: transparent; } +.mg .mg-svg text { -webkit-user-select: none; user-select: none; pointer-events: none; } +.mg .mg-hit { cursor: pointer; outline: none; } +.mg [role="slider"] { cursor: grab; touch-action: none; } +.mg .mg-ring { stroke-opacity: 0; transition: stroke-opacity 0.15s; } +.mg .mg-hit:focus-visible .mg-ring { stroke-opacity: 1; } +.mg [role="slider"]:focus-visible circle:nth-child(2) { stroke-width: 5; } +@media (hover: hover) { .mg .mg-hit:hover .mg-ring { stroke-opacity: 0.5; } } +@media (prefers-reduced-motion: reduce) { .mg .mg-ring { transition: none; } } diff --git a/blog/src/assets/media/hermes-agent-alternatives/motion.js b/blog/src/assets/media/hermes-agent-alternatives/motion.js new file mode 100644 index 000000000..f2c6f0253 --- /dev/null +++ b/blog/src/assets/media/hermes-agent-alternatives/motion.js @@ -0,0 +1,292 @@ +/* Bright coded scenes for "Hermes Agent alternatives". Vanilla JS, no library. +
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 SW = 4; + 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": 36, "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(); } }); + }; + // a pill with centred text, sized to the text + const chip = (p, cx, cy, s, fill, size = 34, a = {}) => { + const g = el("g", {}, p), r = el("rect", { fill, stroke: INK, "stroke-width": SW }, g); + const t = txt(g, cx, cy + size * 0.35, s, Object.assign({ "text-anchor": "middle", "font-size": size, "font-weight": 700 }, a)); + const w = t.getComputedTextLength() + size * 1.3, h = size * 1.8; + r.setAttribute("x", cx - w / 2); r.setAttribute("y", cy - h / 2); r.setAttribute("width", w); r.setAttribute("height", h); r.setAttribute("rx", h / 2); + return g; + }; + + const SC = {}; + + /* ---- 1. a bento box fills one name at a time ---- */ + SC.bento = { + w: 1600, h: 1200, dur: 11, still: 8.6, + build(svg, api) { + txt(svg, 60, 128, "Seven alternatives", { "font-size": 68, "font-weight": 700 }); + const sticks = el("g", {}, svg); + [[0, YEL], [40, MINT]].forEach(([dy, c]) => el("path", { d: `M0 ${dy - 13} L560 ${dy - 7} Q568 ${dy} 560 ${dy + 7} L0 ${dy + 13} Q-10 ${dy} 0 ${dy - 13} Z`, fill: c, stroke: INK, "stroke-width": SW, "stroke-linejoin": "round" }, sticks)); + tf(sticks, 960, 84, 1, 3); + const B = { x: 60, y: 300, w: 1480, h: 840 }, pad = 30, gap = 22, RW = 360; + el("rect", { x: B.x, y: B.y, width: B.w, height: B.h, rx: 44, fill: LIL, stroke: INK, "stroke-width": SW }, svg); + const iy = B.y + pad, ih = B.h - pad * 2, lx = B.x + pad, rx = B.x + B.w - pad - RW, lw = rx - 30 - lx; + const cw = (lw - gap * 2) / 3, ch = (ih - gap) / 2; + const bracket = (x0, x1, label, fill) => { + el("path", { d: `M${x0 + 6} 284 V240 H${x1 - 6} V284`, fill: "none", stroke: INK, "stroke-width": SW, "stroke-linecap": "round", "stroke-linejoin": "round" }, svg); + chip(svg, (x0 + x1) / 2, 240, label, fill, 34); + }; + bracket(lx, lx + lw, "free and open source", MINT); + bracket(rx, rx + RW, "hosted", BLUE); + const ITEMS = [ + ["OpenClaw", "MIT", YEL], ["Munder|Difflin", "MIT", MINT], ["NanoClaw", "MIT", SKY], + ["ZeroClaw", "MIT or Apache 2.0", SKY], ["nanobot", "MIT", YEL], ["Goose", "Apache 2.0", MINT], + ["Claude", "Proprietary", BLUE], + ]; + const parts = ITEMS.map(([name, lic, col], i) => { + const big = i === 6; + const x = big ? rx : lx + (i % 3) * (cw + gap), y = big ? iy : iy + Math.floor(i / 3) * (ch + gap), w = big ? RW : cw, h = big ? ih : ch; + const cx = x + w / 2, cy = y + h / 2, pw = big ? 290 : 270, ph = big ? 520 : 210; + const g = el("g", {}, svg); + el("rect", { x, y, width: w, height: h, rx: 24, fill: "#fff", stroke: INK, "stroke-width": SW }, g); + el("rect", { x: x - 9, y: y - 9, width: w + 18, height: h + 18, rx: 30, fill: "none", stroke: INK, "stroke-width": SW, "stroke-dasharray": "6 8", class: "mg-ring" }, g); + const ly = big ? cy + 215 : cy + 62; + const licT = txt(g, cx, ly, lic, { "text-anchor": "middle", "font-size": 32, "font-weight": 600, fill: MUTE, opacity: 0 }); + const piece = el("g", {}, g); + el("rect", { x: -pw / 2, y: -ph / 2, width: pw, height: ph, rx: 36, fill: col, stroke: INK, "stroke-width": SW }, piece); + [[-pw / 2 + 36, -ph / 2 + 32], [-pw / 2 + 64, -ph / 2 + 26], [-pw / 2 + 52, -ph / 2 + 52]].forEach(([dx, dy]) => el("ellipse", { cx: dx, cy: dy, rx: 10, ry: 6.5, fill: "#fff", stroke: INK, "stroke-width": SW }, piece)); + const lines = name.split("|"); + lines.forEach((s, j) => txt(piece, 0, 15 + (j - (lines.length - 1) / 2) * 50, s, { "text-anchor": "middle", "font-size": big ? 48 : 42, "font-weight": 700 })); + const st = { on: false, at: -9 }; + button(g, `${lines.join(" ")}: ${lic}`, () => { st.on = !st.on; st.at = api.now(); api.poke(); }); + return { piece, licT, cx, cy, lift: big ? 130 : 112, st, d: 0.5 + i * 0.85 }; + }); + return (t, now) => { + const out = io(seg(t, 9.9, 10.7)); + parts.forEach((p) => { + const k = seg(t, p.d, p.d + 0.6), drop = ob(k); + const m = oc(seg(now - p.st.at, 0, 0.35)), lift = p.st.on ? m : 1 - m; + p.licT.setAttribute("opacity", lift); tf(p.piece, p.cx, p.cy - 260 * (1 - drop) - p.lift * lift - 40 * out, 1, -5 * lift); + p.piece.setAttribute("opacity", k <= 0 ? 0 : Math.min(1, k * 4) * (1 - out)); + }); + }; + }, + }; + + /* ---- 2. a lift call panel: pick a floor, see who runs there ---- */ + SC.lift = { + w: 1600, h: 1200, dur: 10.5, still: 2.4, + build(svg, api) { + const P = 3.5; + txt(svg, 60, 128, "Pick by whose computer does the work", { "font-size": 58, "font-weight": 700 }); + // lift doors behind the cards + el("rect", { x: 780, y: 190, width: 760, height: 950, rx: 28, fill: "#fff", stroke: INK, "stroke-width": SW }, svg); + el("rect", { x: 806, y: 216, width: 342, height: 924, rx: 10, fill: SOFT, stroke: INK, "stroke-width": SW }, svg); + el("rect", { x: 1172, y: 216, width: 342, height: 924, rx: 10, fill: SOFT, stroke: INK, "stroke-width": SW }, svg); + const FL = [ + ["your computer", ["OpenClaw", "Munder Difflin", "NanoClaw", "ZeroClaw", "Goose", "Hermes Agent", "nanobot"]], + ["a server", ["Hermes Agent", "nanobot"]], + ["Anthropic's servers", ["Claude"]], + ]; + const DOTC = [YEL, MINT, SKY, LIL, BLUE]; + const clip = el("clipPath", { id: "mg-lift-clip" }, el("defs", {}, svg)); + el("rect", { x: 744, y: 0, width: 900, height: 1200 }, clip); + const deck = el("g", { "clip-path": "url(#mg-lift-clip)" }, svg); + const cards = FL.map(([label, picks]) => { + const h = 150 + picks.length * 106 + 20, oy = Math.round(678 - h / 2) - 250, g = el("g", {}, deck), gi = el("g", { transform: `translate(0 ${oy})` }, g); + el("rect", { x: 830, y: 250, width: 660, height: h, rx: 30, fill: "#fff", stroke: INK, "stroke-width": SW }, gi); + chip(gi, 1160, 326, label, YEL, 40); + el("path", { d: "M870 392 H1450", stroke: INK, "stroke-width": SW, "stroke-dasharray": "2 12", "stroke-linecap": "round" }, gi); + picks.forEach((s, j) => { + const y = 410 + j * 106; + el("rect", { x: 880, y: y + 26, width: 44, height: 44, rx: 12, fill: DOTC[j % 5], stroke: INK, "stroke-width": SW }, gi); + txt(gi, 952, y + 64, s, { "font-size": 46, "font-weight": 700 }); + }); + return g; + }); + // the call panel + el("rect", { x: 60, y: 190, width: 660, height: 950, rx: 36, fill: SOFT, stroke: INK, "stroke-width": SW }, svg); + [[96, 226], [684, 226], [96, 1104], [684, 1104]].forEach(([x, y]) => { el("circle", { cx: x, cy: y, r: 10, fill: "#fff", stroke: INK, "stroke-width": SW }, svg); el("path", { d: `M${x - 5} ${y} H${x + 5}`, stroke: INK, "stroke-width": SW, "stroke-linecap": "round" }, svg); }); + el("rect", { x: 150, y: 250, width: 480, height: 120, rx: 22, fill: "#fff", stroke: INK, "stroke-width": SW }, svg); + const lamps = [0, 1, 2].map((i) => el("circle", { cx: 440 + i * 56, cy: 310, r: 16, fill: "#fff", stroke: INK, "stroke-width": SW }, svg)); + const arrowClip = el("clipPath", { id: "mg-lift-arrow" }, el("defs", {}, svg)); + el("rect", { x: 170, y: 262, width: 200, height: 96 }, arrowClip); + const aw = el("g", { "clip-path": "url(#mg-lift-arrow)" }, svg), arrow = el("path", { d: "M0 -30 L34 10 H14 V30 H-14 V10 H-34 Z", fill: BLUE, stroke: INK, "stroke-width": SW, "stroke-linejoin": "round" }, aw); + const ICON = [ + (g) => { el("rect", { x: -32, y: -28, width: 64, height: 42, rx: 6, fill: "#fff", stroke: INK, "stroke-width": SW }, g); el("path", { d: "M-42 22 H42 L36 30 H-36 Z", fill: "#fff", stroke: INK, "stroke-width": SW, "stroke-linejoin": "round" }, g); }, + (g) => { [-24, 4].forEach((y) => { el("rect", { x: -32, y, width: 64, height: 24, rx: 5, fill: "#fff", stroke: INK, "stroke-width": SW }, g); el("circle", { cx: 18, cy: y + 12, r: 4, fill: INK }, g); el("path", { d: `M-20 ${y + 12} H2`, stroke: INK, "stroke-width": SW, "stroke-linecap": "round" }, g); }); }, + (g) => { el("path", { d: "M-30 20 Q-46 20 -46 6 Q-46 -10 -28 -10 Q-24 -30 -2 -30 Q20 -30 24 -10 Q44 -10 44 6 Q44 20 28 20 Z", fill: "#fff", stroke: INK, "stroke-width": SW, "stroke-linejoin": "round" }, g); }, + ]; + const btns = FL.map(([label], i) => { + const cy = 520 + i * 220, g = el("g", {}, svg); + el("rect", { x: 92, y: cy - 92, width: 596, height: 184, rx: 30, fill: "#fff", "fill-opacity": 0, stroke: INK, "stroke-width": SW, "stroke-dasharray": "6 8", class: "mg-ring" }, g); + const glow = el("circle", { cx: 180, cy, r: 84, fill: YEL, "fill-opacity": 0.4 }, g); + const face = el("g", {}, g), disc = el("circle", { r: 64, fill: "#fff", stroke: INK, "stroke-width": SW }, face); + ICON[i](el("g", {}, face)); + tf(face, 180, cy); + txt(g, 276, cy + 13, label, { "font-size": 37, "font-weight": 700 }); + button(g, `${label}: ${FL[i][1].join(", ")}`, () => api.seek(i * P + 0.01)); + return { glow, face, disc, cy }; + }); + txt(svg, 390, 1078, "Tap a button to change floors.", { "text-anchor": "middle", "font-size": 31, "font-weight": 500, fill: MUTE }); + return (t) => { + const i = Math.floor(t / P) % 3, u = (t % P) / P, prev = (i + 2) % 3; + btns.forEach((b, j) => { + const on = j === i, press = on ? Math.sin(Math.PI * seg(u, 0, 0.09)) : 0; + b.disc.setAttribute("fill", on ? YEL : "#fff"); b.glow.setAttribute("fill-opacity", on ? 0.4 * oc(seg(u, 0.03, 0.12)) : 0); + tf(b.face, 180, b.cy, 1 - 0.1 * press); + }); + lamps.forEach((l, j) => l.setAttribute("fill", j === i ? YEL : "#fff")); + const up = i > prev, m = io(seg(u, 0.02, 0.3)); + tf(arrow, 270, 310 + (up ? 1 : -1) * (90 - 90 * m), 1, up ? 0 : 180); + cards.forEach((c, j) => { + const k = j === i ? oc(seg(u, 0.1, 0.26)) * (1 - io(seg(u, 0.88, 1))) : 0; + c.setAttribute("transform", `translate(${-760 * (1 - k)} 0)`); c.setAttribute("opacity", k <= 0 ? 0 : 1); + }); + }; + }, + }; + + /* ---- 3. two taps: the software pours free, the model fills its own glass ---- */ + SC.taps = { + w: 1600, h: 1200, dur: 10, still: 6.5, + build(svg) { + txt(svg, 60, 128, "The software costs nothing", { "font-size": 68, "font-weight": 700 }); + el("rect", { x: 60, y: 180, width: 1480, height: 600, rx: 28, fill: SOFT }, svg); + for (let x = 160; x < 1540; x += 100) el("path", { d: `M${x} 180 V780`, stroke: "#fff", "stroke-width": SW }, svg); + for (let y = 280; y < 780; y += 100) el("path", { d: `M60 ${y} H1540`, stroke: "#fff", "stroke-width": SW }, svg); + el("rect", { x: 60, y: 180, width: 1480, height: 600, rx: 28, fill: "none", stroke: INK, "stroke-width": SW }, svg); + // counter and basin + el("path", { d: "M230 800 V1060 Q230 1120 290 1120 H1310 Q1370 1120 1370 1060 V800", fill: "#fff", stroke: INK, "stroke-width": SW }, svg); + el("rect", { x: 60, y: 760, width: 1480, height: 56, rx: 14, fill: YEL, stroke: INK, "stroke-width": SW }, svg); + el("ellipse", { cx: 800, cy: 1098, rx: 38, ry: 9, fill: SOFT, stroke: INK, "stroke-width": SW }, svg); + const G = [ + { cx: 470, wt: 300, wb: 256, top: 640, bot: 1090, tap: 300, label: "software", col: MINT, sw: 40, fill: [0.7, 3.0], full: 1, sticker: ["free"], fs: 66 }, + { cx: 1130, wt: 420, wb: 372, top: 640, bot: 1090, tap: 960, label: "model", col: LIL, sw: 16, fill: [1.4, 6.2], full: 0.8, sticker: ["your API key,", "your plan", "or a local model"], fs: 34 }, + ]; + const defs = el("defs", {}, svg); + const run = G.map((g, gi) => { + const L = g.cx - g.wt / 2, R = g.cx + g.wt / 2, l = g.cx - g.wb / 2, r = g.cx + g.wb / 2; + const shape = `M${L} ${g.top} L${l} ${g.bot - 22} Q${l} ${g.bot} ${l + 22} ${g.bot} H${r - 22} Q${r} ${g.bot} ${r} ${g.bot - 22} L${R} ${g.top} Z`; + const cp = el("clipPath", { id: `mg-glass-${gi}` }, defs); el("path", { d: shape }, cp); + el("path", { d: shape, fill: "#fff" }, svg); + const wg = el("g", { "clip-path": `url(#mg-glass-${gi})` }, svg); + const water = el("rect", { x: L - 10, width: g.wt + 20, y: g.bot, height: 0, fill: SKY }, wg); + const bubbles = Array.from({ length: 7 }, (_, j) => el("circle", { r: 7 + (j % 3) * 3, fill: "#fff" }, wg)); + // the tap + const ny = 470, nx = g.cx; + const stream = el("rect", { x: nx - g.sw / 2, y: ny, width: g.sw, height: 0, rx: g.sw / 2, fill: SKY, stroke: INK, "stroke-width": SW }, svg); + el("rect", { x: g.tap - 46, y: 330, width: 92, height: 120, rx: 22, fill: "#fff", stroke: INK, "stroke-width": SW }, svg); + el("path", { d: `M${g.tap} 366 H${nx + 6} Q${nx + 34} 366 ${nx + 34} 394 V470 H${nx - 34} V418 H${g.tap} Z`, fill: "#fff", stroke: INK, "stroke-width": SW, "stroke-linejoin": "round" }, svg); + el("rect", { x: nx - 40, y: 458, width: 80, height: 24, rx: 8, fill: "#fff", stroke: INK, "stroke-width": SW }, svg); + const hx = g.tap + 70; + el("rect", { x: hx - 12, y: 300, width: 24, height: 68, fill: "#fff", stroke: INK, "stroke-width": SW }, svg); + const lever = el("g", {}, svg); + el("rect", { x: -16, y: -18, width: 150, height: 36, rx: 18, fill: g.col, stroke: INK, "stroke-width": SW }, lever); + el("circle", { r: 26, fill: g.col, stroke: INK, "stroke-width": SW }, lever); + chip(svg, hx + 160, 240, g.label, g.col, 40); + // glass outline and sticker + el("path", { d: shape, fill: "none", stroke: INK, "stroke-width": SW, "stroke-linejoin": "round" }, svg); + el("path", { d: `M${L + 24} ${g.top + 40} L${l + 26} ${g.bot - 60}`, stroke: "#fff", "stroke-width": SW * 2, "stroke-linecap": "round", opacity: 0.9 }, svg); + const sh = g.sticker.length * g.fs * 1.25 + 44, sw = g.sticker.length > 1 ? 350 : 210, sy = 880 - sh / 2; + el("rect", { x: g.cx - sw / 2, y: sy, width: sw, height: sh, rx: 22, fill: "#fff", stroke: INK, "stroke-width": SW }, svg); + g.sticker.forEach((s, j) => txt(svg, g.cx, sy + 22 + g.fs * 0.95 + j * g.fs * 1.25, s, { "text-anchor": "middle", "font-size": g.fs, "font-weight": 700 })); + const drops = Array.from({ length: gi ? 3 : 6 }, () => el("circle", { r: gi ? 9 : 12, fill: SKY, stroke: INK, "stroke-width": SW }, svg)); + const spill = gi ? [] : Array.from({ length: 4 }, () => el("ellipse", { rx: 11, ry: 15, fill: SKY, stroke: INK, "stroke-width": SW }, svg)); + return { g, water, bubbles, stream, lever, hx, drops, spill, ny, L, R }; + }); + return (t) => { + run.forEach((o, gi) => { + const g = o.g, open = seg(t, g.fill[0] - 0.5, g.fill[0] - 0.1) * (1 - seg(t, 8.0, 8.3)); + tf(o.lever, o.hx, 300, 1, 180 + 32 * open); + const span = g.bot - g.top - 30, lv = g.full * oc(seg(t, g.fill[0], g.fill[1])) * (1 - io(seg(t, 8.4, 9.6))); + const surf = g.bot - span * lv; + o.water.setAttribute("y", surf); o.water.setAttribute("height", g.bot - surf + 10); + const on = t > g.fill[0] - 0.15 && t < 8.3, head = Math.min(surf, o.ny + (t - (g.fill[0] - 0.15)) * 2600); + const tail = t < 8.0 ? o.ny : o.ny + (t - 8.0) * 2600; + o.stream.setAttribute("y", tail); o.stream.setAttribute("height", on ? Math.max(0, head - tail) : 0); + o.bubbles.forEach((b, j) => { + const ph = (t * (0.5 + (j % 3) * 0.17) + j * 0.37) % 1, by = g.bot - 20 - ph * (g.bot - surf - 20); + b.setAttribute("cx", g.cx - g.wb / 2 + 40 + ((j * 71) % (g.wb - 80))); b.setAttribute("cy", by); + b.setAttribute("opacity", lv > 0.05 && by > surf + 12 ? 1 : 0); + }); + o.drops.forEach((d, j) => { + const ph = (t * 1.6 + j / o.drops.length) % 1, side = j % 2 ? 1 : -1, dx = side * (30 + j * 9) * ph; + d.setAttribute("cx", g.cx + dx); d.setAttribute("cy", surf - 70 * ph + 120 * ph * ph); + d.setAttribute("r", (gi ? 9 : 12) * (1 - 0.6 * ph)); d.setAttribute("opacity", on && head >= surf - 1 && ph < 0.85 ? 1 : 0); + }); + o.spill.forEach((s, j) => { + const ph = (t * 0.9 + j * 0.25) % 1, side = j % 2 ? 1 : -1, x = side > 0 ? o.R + 6 - 22 * ph : o.L - 6 + 22 * ph; + s.setAttribute("cx", x); s.setAttribute("cy", g.top + 6 + ph * (g.bot - g.top - 10)); + s.setAttribute("opacity", lv > 0.99 && on && ph < 0.92 ? 1 : 0); + }); + }); + }; + }, + }; + + /* ---- title card, 16 by 9 ---- */ + SC.hero = { + w: 1600, h: 900, dur: 1, still: 0, + build(svg) { + txt(svg, 84, 196, "7 picks for chat, code and cloud", { "font-family": MONO, "font-size": 34, "font-weight": 700, fill: MUTE }); + txt(svg, 78, 360, "Hermes Agent", { "font-size": 132, "font-weight": 700 }); + txt(svg, 78, 512, "alternatives", { "font-size": 132, "font-weight": 700 }); + el("rect", { x: 84, y: 548, width: 760, height: 20, rx: 10, fill: YEL }, svg); + const ck = el("g", {}, svg); el("circle", { r: 24, fill: MINT, stroke: INK, "stroke-width": SW }, ck); el("path", { d: "M-11 1 L-3 9 L12 -8", fill: "none", stroke: INK, "stroke-width": SW, "stroke-linecap": "round", "stroke-linejoin": "round" }, ck); tf(ck, 108, 650); + txt(svg, 150, 664, "Checked 19 Oct 2026", { "font-size": 40, "font-weight": 600 }); + const trail = "M90 800 C420 860 700 760 900 760 C1080 760 1150 700 1110 640 C1070 580 990 620 1010 680 C1030 740 1120 700 1168 616"; + el("path", { d: trail, stroke: SOFT, "stroke-width": 26, fill: "none", "stroke-linecap": "round" }, svg); + el("path", { d: trail, stroke: INK, "stroke-width": SW, fill: "none", "stroke-dasharray": "2 16", "stroke-linecap": "round" }, svg); + const plane = el("g", {}, svg); + el("path", { d: "M170 0 L-150 -110 L-40 4 Z", fill: SKY, stroke: INK, "stroke-width": SW, "stroke-linejoin": "round" }, plane); + el("path", { d: "M170 0 L-40 4 L-90 92 Z", fill: BLUE, stroke: INK, "stroke-width": SW, "stroke-linejoin": "round" }, plane); + el("path", { d: "M170 0 L-40 4 L-150 40 Z", fill: "#fff", stroke: INK, "stroke-width": SW, "stroke-linejoin": "round" }, plane); + tf(plane, 1320, 470, 1.25, -28); + const star = (x, y, s, c) => { const g = el("g", {}, svg); el("path", { d: "M0 -22 Q4 -4 22 0 Q4 4 0 22 Q-4 4 -22 0 Q-4 -4 0 -22 Z", fill: c, stroke: INK, "stroke-width": SW, "stroke-linejoin": "round" }, g); tf(g, x, y, s); }; + star(1470, 190, 1.4, YEL); star(1160, 230, 1, LIL); star(1500, 690, 1.1, MINT); star(1300, 790, 0.9, YEL); + return () => {}; + }, + }; + + /* ---- 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/hermes-agent-alternatives/taps.png b/blog/src/assets/media/hermes-agent-alternatives/taps.png new file mode 100644 index 000000000..c3e21d318 Binary files /dev/null and b/blog/src/assets/media/hermes-agent-alternatives/taps.png differ diff --git a/blog/src/assets/media/kilo-code-vs-cline/belts.png b/blog/src/assets/media/kilo-code-vs-cline/belts.png new file mode 100644 index 000000000..5a75af0a9 Binary files /dev/null and b/blog/src/assets/media/kilo-code-vs-cline/belts.png differ diff --git a/blog/src/assets/media/kilo-code-vs-cline/hero.png b/blog/src/assets/media/kilo-code-vs-cline/hero.png new file mode 100644 index 000000000..6bc842d35 Binary files /dev/null and b/blog/src/assets/media/kilo-code-vs-cline/hero.png differ diff --git a/blog/src/assets/media/kilo-code-vs-cline/motion.css b/blog/src/assets/media/kilo-code-vs-cline/motion.css new file mode 100644 index 000000000..36fc49a3d --- /dev/null +++ b/blog/src/assets/media/kilo-code-vs-cline/motion.css @@ -0,0 +1,13 @@ +/* Bright coded scenes for "Kilo Code vs Cline". Pairs with motion.js. */ +.prose figure.mg { margin: 42px 0; } +.prose figure.mg img, .mg .mg-svg { display: block; width: 100%; height: auto; border: 1px solid #1A1320; border-radius: 18px; background: #fff; } +.mg figcaption { font: 500 13px/1.5 "Space Grotesk", system-ui, sans-serif; color: #6B5878; padding-top: 10px; text-align: center; } +.mg .mg-svg { touch-action: manipulation; -webkit-tap-highlight-color: transparent; } +.mg .mg-svg text { -webkit-user-select: none; user-select: none; pointer-events: none; } +.mg .mg-hit { cursor: pointer; outline: none; } +.mg [role="slider"] { cursor: grab; touch-action: none; } +.mg .mg-ring { stroke-opacity: 0; transition: stroke-opacity 0.15s; } +.mg .mg-hit:focus-visible .mg-ring { stroke-opacity: 1; } +.mg [role="slider"]:focus-visible circle:nth-child(2) { stroke-width: 5; } +@media (hover: hover) { .mg .mg-hit:hover .mg-ring { stroke-opacity: 0.5; } } +@media (prefers-reduced-motion: reduce) { .mg .mg-ring { transition: none; } } diff --git a/blog/src/assets/media/kilo-code-vs-cline/motion.js b/blog/src/assets/media/kilo-code-vs-cline/motion.js new file mode 100644 index 000000000..c0f5351fd --- /dev/null +++ b/blog/src/assets/media/kilo-code-vs-cline/motion.js @@ -0,0 +1,338 @@ +/* Bright coded scenes for "Kilo Code vs Cline". Vanilla JS, no library. +
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": 34, "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(); } }); + }; + /* shrink a label until it fits, never below 30 units in a 1600 wide drawing */ + const fit = (n, max, min = 30) => { let s = parseFloat(n.getAttribute("font-size")); try { while (n.getComputedTextLength() > max && s > min) { s -= 1; n.setAttribute("font-size", s); } } catch (e) {} return n; }; + /* a shape drawn three times: soft base, a colour layer that fades in, then the ink outline */ + const layered = (tag, a, p, base, col, sw = 4) => { + el(tag, Object.assign({}, a, { fill: base }), p); + const top = el(tag, Object.assign({}, a, { fill: col, opacity: 0 }), p); + el(tag, Object.assign({}, a, { fill: "none", stroke: INK, "stroke-width": sw, "stroke-linejoin": "round" }), p); + return top; + }; + + const SC = {}; + + /* ---- 1. two tool belts, pouches fill one by one ---- */ + const TOOLS = [ + (g, c) => { // screwdriver handle + el("rect", { x: -6, y: -40, width: 12, height: 80, fill: "#fff", stroke: INK, "stroke-width": 4 }, g); + el("rect", { x: -18, y: -104, width: 36, height: 72, rx: 14, fill: c, stroke: INK, "stroke-width": 4 }, g); + el("path", { d: "M-18 -56 H18", stroke: INK, "stroke-width": 4 }, g); + }, + (g, c) => { // wrench + el("rect", { x: -10, y: -76, width: 20, height: 120, rx: 8, fill: c, stroke: INK, "stroke-width": 4 }, g); + el("circle", { cx: 0, cy: -90, r: 26, fill: c, stroke: INK, "stroke-width": 4 }, g); + el("rect", { x: -9, y: -122, width: 18, height: 28, fill: "#fff" }, g); + el("path", { d: "M-9 -114 V-96 H9 V-114", fill: "none", stroke: INK, "stroke-width": 4, "stroke-linejoin": "round" }, g); + }, + (g, c) => { // pencil + el("rect", { x: -15, y: -96, width: 30, height: 140, fill: c, stroke: INK, "stroke-width": 4 }, g); + el("path", { d: "M-15 -96 L0 -126 L15 -96 Z", fill: "#fff", stroke: INK, "stroke-width": 4, "stroke-linejoin": "round" }, g); + el("path", { d: "M-5 -116 L0 -126 L5 -116 Z", fill: INK }, g); + }, + (g, c) => { // ruler + el("rect", { x: -22, y: -100, width: 44, height: 150, rx: 5, fill: c, stroke: INK, "stroke-width": 4 }, g); + el("path", { d: "M-22 -84 H-6 M-22 -68 H-12 M-22 -52 H-6 M-22 -36 H-12", stroke: INK, "stroke-width": 4 }, g); + }, + (g, c) => { // hammer + el("rect", { x: -8, y: -86, width: 16, height: 130, rx: 6, fill: "#fff", stroke: INK, "stroke-width": 4 }, g); + el("rect", { x: -42, y: -116, width: 84, height: 34, rx: 10, fill: c, stroke: INK, "stroke-width": 4 }, g); + }, + ]; + SC.belts = { + w: 1600, h: 1200, dur: 11, still: 7.5, + build(svg) { + txt(svg, 60, 122, "Where each one runs", { "font-size": 58, "font-weight": 700 }); + const note = txt(svg, 1540, 120, "", { "text-anchor": "end", "font-size": 36, "font-weight": 600 }); + const dot = el("circle", { r: 13, cy: 108, stroke: INK, "stroke-width": 4 }, svg); + const SHARED = { "VS Code": 1, JetBrains: 1, CLI: 1 }; + const AT = { "VS Code": 0.8, JetBrains: 1.6, CLI: 2.4, cloud: 3.6, "desktop app": 4.4, SDK: 5.2 }; + const rows = [ + { name: "Kilo Code", oy: 0, items: ["VS Code", "JetBrains", "CLI", "cloud"] }, + { name: "Cline", oy: 486, items: ["VS Code", "JetBrains", "CLI", "desktop app", "SDK"] }, + ]; + const pouches = []; + let tk = 0; + rows.forEach((r) => { + const oy = r.oy, n = r.items.length, gap = 26, pw = (1340 - gap * (n - 1)) / n, top = 368 + oy, h = 250; + txt(svg, 60, 216 + oy, r.name, { "font-size": 52, "font-weight": 700 }); + el("rect", { x: 60, y: 350 + oy, width: 1480, height: 60, rx: 16, fill: BLUE, stroke: INK, "stroke-width": 4 }, svg); + el("path", { d: `M180 ${363 + oy} H1526 M180 ${397 + oy} H1526`, stroke: INK, "stroke-width": 3, "stroke-dasharray": "12 10", fill: "none" }, svg); + el("rect", { x: 66, y: 334 + oy, width: 98, height: 92, rx: 16, fill: YEL, stroke: INK, "stroke-width": 4 }, svg); + el("rect", { x: 88, y: 356 + oy, width: 54, height: 48, rx: 8, fill: BLUE, stroke: INK, "stroke-width": 4 }, svg); + el("path", { d: `M88 ${380 + oy} H156`, stroke: INK, "stroke-width": 4, "stroke-linecap": "round" }, svg); + r.items.forEach((it, i) => { + const px = 190 + i * (pw + gap), cx = px + pw / 2, col = SHARED[it] ? MINT : YEL; + const tool = el("g", {}, svg); + TOOLS[tk++ % TOOLS.length](tool, col === YEL ? BLUE : [LIL, SKY, YEL][i % 3]); + const pg = el("g", {}, svg); + const d = `M${px} ${top} H${px + pw} V${top + h - 54} Q${px + pw} ${top + h} ${px + pw - 54} ${top + h} H${px + 54} Q${px} ${top + h} ${px} ${top + h - 54} Z`; + const fillL = layered("path", { d }, pg, SOFT, col); + el("path", { d: `M${px + 18} ${top + 36} H${px + pw - 18}`, stroke: INK, "stroke-width": 3, "stroke-dasharray": "12 9" }, pg); + [px + 24, px + pw - 24].forEach((x) => el("circle", { cx: x, cy: top + 18, r: 7, fill: "#fff", stroke: INK, "stroke-width": 3 }, pg)); + const lg = el("g", {}, pg); + const one = txt(lg, 0, 14, it, { "text-anchor": "middle", "font-size": 42, "font-weight": 700 }); + let wide = false; try { wide = one.getComputedTextLength() > pw - 40; } catch (e) {} + if (wide && it.includes(" ")) { // two lines instead of a smaller font + const [a, b] = it.split(" "); one.textContent = a; one.setAttribute("y", -10); + txt(lg, 0, 38, b, { "text-anchor": "middle", "font-size": 42, "font-weight": 700 }); + } else fit(one, pw - 40, 32); + pouches.push({ tool, pg, fillL, lg, cx, top, ly: top + 142, at: AT[it] }); + }); + }); + return (t) => { + const out = seg(t, 9.8, 10.5); + pouches.forEach((p) => { + const d = seg(t, p.at - 0.15, p.at + 0.35), k = oc(seg(t, p.at, p.at + 0.45)) * (1 - out); + tf(p.tool, p.cx, p.top - 190 * (1 - ob(d)) - 120 * out); + p.tool.setAttribute("opacity", d <= 0 ? 0 : 1 - out); + const w = seg(t, p.at + 0.25, p.at + 1.0); + p.pg.setAttribute("transform", `rotate(${Math.sin(w * Math.PI * 3) * 2.2 * (1 - w)} ${p.cx} ${p.top})`); + p.fillL.setAttribute("opacity", k); + p.lg.setAttribute("opacity", k); + tf(p.lg, p.cx, p.ly, 0.7 + 0.3 * ob(seg(t, p.at + 0.1, p.at + 0.5))); + }); + const s = t < 0.8 || out >= 1 ? 0 : t < 3.4 ? 1 : 2; + note.textContent = s === 1 ? "Both cover the same core" : s === 2 ? "After that they split" : ""; + note.setAttribute("opacity", 1 - out); + let nw = 0; try { nw = s ? note.getComputedTextLength() : 0; } catch (e) {} + dot.setAttribute("cx", 1540 - nw - 28); dot.setAttribute("fill", s === 1 ? MINT : YEL); dot.setAttribute("opacity", s ? 1 - out : 0); + }; + }, + }; + + /* ---- 2. two fuel pumps, tap one to light its nozzles ---- */ + const NOZZLE = (g, s) => { + const w = 4 / s; + el("path", { d: "M34 -4 C62 -4 66 40 42 46", stroke: INK, "stroke-width": w + 1 / s, fill: "none", "stroke-linecap": "round" }, g); + el("circle", { cx: 42, cy: 46, r: 7, fill: INK }, g); + el("path", { d: "M-14 -18 L-52 -8 Q-58 -6 -55 0 L-14 -4 Z", fill: "#fff", stroke: INK, "stroke-width": w, "stroke-linejoin": "round" }, g); + el("path", { d: "M-2 8 V26 Q-2 34 6 34 H28 Q36 34 36 26 V8", fill: "none", stroke: INK, "stroke-width": w }, g); + el("path", { d: "M8 8 L14 22", stroke: INK, "stroke-width": w, "stroke-linecap": "round" }, g); + const body = el("rect", { x: -16, y: -26, width: 58, height: 36, rx: 12, fill: "#fff", stroke: INK, "stroke-width": w }, g); + const rays = el("path", { d: "M-64 -14 L-78 -22 M-66 0 L-82 2 M-62 12 L-74 24", stroke: INK, "stroke-width": w, "stroke-linecap": "round" }, g); + return { body, rays }; + }; + SC.pumps = { + w: 1600, h: 1200, dur: 11, still: 8, + build(svg, api) { + txt(svg, 60, 122, "How you pay for the model", { "font-size": 58, "font-weight": 700 }); + txt(svg, 1540, 120, "tap a pump", { "text-anchor": "end", "font-size": 34, "font-weight": 500, fill: MUTE }); + el("rect", { x: 60, y: 1070, width: 1480, height: 44, rx: 22, fill: SOFT }, svg); + const P = [ + { name: "Kilo Code", X: 170, side: -1, col: SKY, sum: "five ways to pay", items: ["free models", "local models", "BYOK", "Kilo Gateway", "Kilo Pass"], at0: 0.8 }, + { name: "Cline", X: 870, side: 1, col: LIL, sum: "two ways to pay", items: ["at cost", "BYOK"], at0: 3.9 }, + ]; + let pin = -1, pinAt = 0; + const pumps = P.map((p, pi) => { + const g = el("g", {}, svg), X = p.X, n = p.items.length, big = n < 3, BL = X + 20, BR = X + 540; + el("rect", { x: p.side < 0 ? X - 100 : X - 20, y: 150, width: 680, height: 940, rx: 40, fill: "#fff", "fill-opacity": 0, stroke: INK, "stroke-width": 3, "stroke-dasharray": "8 10", class: "mg-ring" }, g); + /* the big hose and the nozzle that hangs on the outer side */ + const hx = p.side < 0 ? BL : BR, cx = hx + p.side * 62, cy = 720; + const hose = `M${cx} ${cy - 50} C${cx + p.side * 30} ${cy - 190} ${hx + p.side * 70} ${cy - 250} ${hx} ${cy - 262}`; + el("path", { d: hose, stroke: INK, "stroke-width": 24, fill: "none", "stroke-linecap": "round" }, g); + el("path", { d: hose, stroke: p.col, "stroke-width": 16, fill: "none", "stroke-linecap": "round" }, g); + el("rect", { x: BL, y: 270, width: 520, height: 770, rx: 30, fill: "#fff", stroke: INK, "stroke-width": 4 }, g); + const hang = el("g", { transform: `translate(${cx} ${cy}) scale(${-p.side} 1)` }, g); + el("path", { d: "M26 -26 H52 Q62 -26 62 -16 V18 Q62 28 52 28 H26", fill: "none", stroke: INK, "stroke-width": 4 }, hang); + el("path", { d: "M-10 36 L-18 112 Q-19 122 -10 122 L6 36 Z", fill: "#fff", stroke: INK, "stroke-width": 4, "stroke-linejoin": "round" }, hang); + el("rect", { x: -28, y: -52, width: 56, height: 92, rx: 16, fill: p.col, stroke: INK, "stroke-width": 4 }, hang); + el("path", { d: "M-14 -30 H14 M-14 -14 H14", stroke: INK, "stroke-width": 4, "stroke-linecap": "round" }, hang); + el("rect", { x: X, y: 1022, width: 560, height: 48, rx: 16, fill: p.col, stroke: INK, "stroke-width": 4 }, g); + el("rect", { x: X, y: 170, width: 560, height: 112, rx: 26, fill: p.col, stroke: INK, "stroke-width": 4 }, g); + txt(g, X + 280, 246, p.name, { "text-anchor": "middle", "font-size": 60, "font-weight": 700 }); + el("rect", { x: BL + 40, y: 320, width: 440, height: 106, rx: 20, fill: SOFT, stroke: INK, "stroke-width": 4 }, g); + const screen = txt(g, X + 280, 388, p.sum, { "text-anchor": "middle", "font-family": MONO, "font-size": 40, "font-weight": 700 }); + const top = 456, H = 556, rh = H / n, s = big ? 1.5 : 1.1; + const rows = p.items.map((it, i) => { + const cy = top + rh * (i + 0.5), nx = BL + (big ? 142 : 112), ny = cy - (big ? 12 : 8); + const ng = el("g", {}, g); tf(ng, nx, ny, s); + const nz = NOZZLE(ng, s); + const pw = big ? 240 : 292, ph = big ? 124 : 80, px = BR - 28 - pw; + const pill = layered("rect", { x: px, y: cy - ph / 2, width: pw, height: ph, rx: ph / 2 }, g, "#fff", p.col); + const lab = fit(txt(g, px + pw / 2, cy + (big ? 18 : 13), it, { "text-anchor": "middle", "font-size": big ? 52 : 38, "font-weight": 700 }), pw - 36, 32); + return { ng, nz, nx, ny, pill, lab }; + }); + button(g, `${p.name}: ${p.items.join(", ")}`, () => { if (pin === pi) { pin = -1; api.seek(0); } else { pin = pi; pinAt = api.now(); api.poke(); } }); + return { g, p, rows, screen, s }; + }); + return (t, now) => { + const out = seg(t, 9.8, 10.4); + pumps.forEach((u, pi) => { + let last = -1, done = false; + u.rows.forEach((r, i) => { + let k, pop; + if (pin >= 0) { const e = now - pinAt; k = pin === pi ? seg(e, 0.1 + i * 0.2, 0.4 + i * 0.2) : 0; pop = pin === pi ? seg(e, 0.1 + i * 0.2, 0.6 + i * 0.2) : 0; } + else { const a = u.p.at0 + i * 0.55; k = seg(t, a, a + 0.3) * (1 - out); pop = seg(t, a, a + 0.5); } + if (k > 0.5) last = i; + r.pill.setAttribute("opacity", k); + r.lab.setAttribute("fill", k > 0.5 ? INK : MUTE); + r.nz.body.setAttribute("fill", k > 0.5 ? YEL : "#fff"); + r.nz.rays.setAttribute("opacity", k); + tf(r.ng, r.nx, r.ny - 10 * Math.sin(pop * Math.PI), u.s, -8 * Math.sin(pop * Math.PI)); + }); + const n = u.rows.length; + if (pin >= 0) done = pin === pi && now - pinAt > 0.9 + n * 0.2; + else done = t > u.p.at0 + (n - 1) * 0.55 + 0.9; + const showing = last >= 0 && !done ? u.p.items[last] : u.p.sum; + u.screen.textContent = showing; + u.screen.setAttribute("fill", last >= 0 ? INK : MUTE); + u.g.setAttribute("aria-pressed", pin === pi ? "true" : "false"); + }); + }; + }, + }; + + /* ---- 3. cinema seats, a slider lights more Kilo Code seats ---- */ + SC.seats = { + w: 1600, h: 1200, dur: 11.5, still: 7.5, + build(svg, api) { + txt(svg, 60, 122, "Team plans", { "font-size": 58, "font-weight": 700 }); + const N = 5, SX = (i) => 80 + i * 288 + 19; + const arms = (y) => { for (let i = 0; i <= N; i++) el("rect", { x: SX(i) - 32, y: y + 148, width: 26, height: 112, rx: 13, fill: SOFT, stroke: INK, "stroke-width": 4 }, svg); }; + const seat = (x, y, tag) => { + const g = el("g", {}, svg); tf(g, x, y); + el("rect", { x: 56, y: 252, width: 138, height: 32, rx: 10, fill: SOFT, stroke: INK, "stroke-width": 4 }, g); + const back = layered("rect", { x: 10, y: 0, width: 230, height: 222, rx: 36 }, g, SOFT, BLUE); + const cush = layered("rect", { x: 0, y: 196, width: 250, height: 64, rx: 26 }, g, SOFT, LIL); + if (!tag) return { g }; + const tg = el("g", {}, g); + const tagL = layered("rect", { x: 26, y: 22, width: 198, height: 168, rx: 20 }, tg, "#fff", YEL, 4); + el("circle", { cx: 125, cy: 42, r: 7, fill: "#fff", stroke: INK, "stroke-width": 3 }, tg); + txt(tg, 125, 104, "$15", { "text-anchor": "middle", "font-size": 56, "font-weight": 700 }); + fit(txt(tg, 125, 140, "per user", { "text-anchor": "middle", "font-size": 33, "font-weight": 600 }), 170, 30); + fit(txt(tg, 125, 174, "per month", { "text-anchor": "middle", "font-size": 33, "font-weight": 600 }), 170, 30); + return { g, back, cush, tg, tagL, x, y }; + }; + txt(svg, 60, 214, "Kilo Code", { "font-size": 52, "font-weight": 700 }); + const kilo = Array.from({ length: N }, (_, i) => seat(SX(i), 244, true)); + arms(244); + el("rect", { x: 60, y: 528, width: 1480, height: 22, rx: 11, fill: SOFT }, svg); + txt(svg, 60, 640, "Cline", { "font-size": 52, "font-weight": 700 }); + Array.from({ length: N }, (_, i) => seat(SX(i), 670, false)); + arms(670); + el("rect", { x: 60, y: 954, width: 1480, height: 22, rx: 11, fill: SOFT }, svg); + const sign = el("g", {}, svg); + [600, 978].forEach((x) => el("rect", { x, y: 880, width: 22, height: 76, fill: "#fff", stroke: INK, "stroke-width": 4 }, sign)); + el("rect", { x: 450, y: 700, width: 700, height: 196, rx: 28, fill: YEL, stroke: INK, "stroke-width": 4 }, sign); + txt(sign, 800, 786, "Enterprise,", { "text-anchor": "middle", "font-size": 64, "font-weight": 700 }); + txt(sign, 800, 862, "contact sales", { "text-anchor": "middle", "font-size": 64, "font-weight": 700 }); + const A = 560, B = 1500, Y = 1074; + txt(svg, 60, Y + 11, "drag to light more seats", { "font-size": 32, "font-weight": 500, fill: MUTE }); + const hit = el("rect", { x: A - 30, y: Y - 44, width: B - A + 60, height: 88, fill: "#fff", "fill-opacity": 0 }, svg); + el("path", { d: `M${A} ${Y} H${B}`, stroke: SOFT, "stroke-width": 24, "stroke-linecap": "round" }, svg); + const fill = el("path", { d: `M${A} ${Y} H${A}`, stroke: YEL, "stroke-width": 24, "stroke-linecap": "round" }, svg); + const knob = el("g", { role: "slider", tabindex: "0", "aria-label": "Light more Kilo Code seats", "aria-valuemin": 1, "aria-valuemax": N, class: "mg-hit" }, svg); + el("circle", { r: 46, fill: "#fff", "fill-opacity": 0 }, knob); + el("circle", { r: 30, fill: "#fff", stroke: INK, "stroke-width": 4 }, knob); + el("path", { d: "M-8 -9 L-16 0 L-8 9 M8 -9 L16 0 L8 9", stroke: INK, "stroke-width": 4, fill: "none", "stroke-linecap": "round", "stroke-linejoin": "round" }, knob); + let user = null, down = false; + const set = (e) => { const r = svg.getBoundingClientRect(); user = cl(((e.clientX - r.left) / r.width * 1600 - A) / (B - A)); api.poke(); }; + [knob, hit].forEach((n) => { + n.addEventListener("pointerdown", (e) => { down = true; knob.setPointerCapture(e.pointerId); set(e); knob.focus && knob.focus({ preventScroll: true }); }); + }); + knob.addEventListener("pointermove", (e) => { if (down) set(e); }); + knob.addEventListener("pointerup", () => { down = false; }); + knob.addEventListener("pointercancel", () => { down = false; }); + knob.addEventListener("keydown", (e) => { + const step = 1 / (N - 1), cur = user == null ? 1 : user; + const v = e.key === "ArrowRight" || e.key === "ArrowUp" ? cur + step : e.key === "ArrowLeft" || e.key === "ArrowDown" ? cur - step : e.key === "Home" ? 0 : e.key === "End" ? 1 : null; + if (v != null) { e.preventDefault(); user = cl(Math.round(v / step) * step); api.poke(); } + }); + return (t) => { + const v = user != null ? user : io(seg(t, 0.8, 5.2)) - io(seg(t, 9.6, 10.9)); + const L = 1 + v * (N - 1); + tf(knob, A + (B - A) * v, Y); fill.setAttribute("d", `M${A} ${Y} H${A + (B - A) * v}`); + knob.setAttribute("aria-valuenow", Math.round(L)); + kilo.forEach((s, i) => { + const k = cl(L - i); + s.back.setAttribute("opacity", k); s.cush.setAttribute("opacity", k); s.tagL.setAttribute("opacity", k); + s.tg.setAttribute("opacity", 0.4 + 0.6 * k); + tf(s.g, s.x, s.y - 12 * Math.sin(k * Math.PI)); + }); + }; + }, + }; + + /* ---- title card, 16 by 9: a rally over a ping pong table ---- */ + SC.hero = { + w: 1600, h: 900, dur: 2.4, still: 1.6, + build(svg) { + txt(svg, 96, 214, "TWO OPEN SOURCE CODING AGENTS", { "font-family": MONO, "font-size": 32, "font-weight": 700, fill: MUTE, "letter-spacing": 2 }); + txt(svg, 88, 384, "Kilo Code", { "font-size": 150, "font-weight": 700 }); + txt(svg, 88, 548, "vs Cline", { "font-size": 150, "font-weight": 700 }); + el("path", { d: "M98 592 H600", stroke: YEL, "stroke-width": 18, "stroke-linecap": "round" }, svg); + txt(svg, 96, 690, "Checked 19 Oct 2026", { "font-family": MONO, "font-size": 38, "font-weight": 700, fill: INK }); + [[1010, 668], [1470, 668]].forEach(([x, y]) => el("rect", { x: x - 10, y, width: 20, height: 150, rx: 6, fill: "#fff", stroke: INK, "stroke-width": 4 }, svg)); + el("rect", { x: 940, y: 820, width: 600, height: 20, rx: 10, fill: SOFT }, svg); + el("rect", { x: 950, y: 640, width: 580, height: 30, rx: 10, fill: MINT, stroke: INK, "stroke-width": 4 }, svg); + el("path", { d: "M1240 644 V666", stroke: "#fff", "stroke-width": 4 }, svg); + el("rect", { x: 1196, y: 576, width: 88, height: 64, rx: 4, fill: "#fff", stroke: INK, "stroke-width": 4 }, svg); + el("path", { d: "M1218 576 V640 M1240 576 V640 M1262 576 V640 M1196 597 H1284 M1196 618 H1284", stroke: INK, "stroke-width": 2 }, svg); + const A = [1100, 392], B = [1360, 392], AP = 160; + el("path", { d: `M${A[0]} ${A[1]} Q1240 ${2 * AP - A[1]} ${B[0]} ${B[1]}`, stroke: MUTE, "stroke-width": 4, "stroke-dasharray": "2 16", "stroke-linecap": "round", fill: "none" }, svg); + const paddle = (col) => { const g = el("g", {}, svg); el("rect", { x: -17, y: 70, width: 34, height: 112, rx: 14, fill: YEL, stroke: INK, "stroke-width": 4 }, g); el("circle", { r: 86, fill: col, stroke: INK, "stroke-width": 4 }, g); el("circle", { r: 62, fill: "none", stroke: INK, "stroke-width": 3, "stroke-dasharray": "3 14", "stroke-linecap": "round" }, g); return g; }; + const L = paddle(BLUE), R = paddle(LIL); + const conf = [[960, 200, SKY], [1520, 230, YEL], [1450, 120, LIL], [1080, 120, MINT]].map(([x, y, c], i) => el(i % 2 ? "circle" : "rect", i % 2 ? { cx: x, cy: y, r: 11, fill: c, stroke: INK, "stroke-width": 3 } : { x: x - 10, y: y - 10, width: 20, height: 20, rx: 4, fill: c, stroke: INK, "stroke-width": 3 }, svg)); + const ball = el("circle", { r: 20, fill: "#fff", stroke: INK, "stroke-width": 4 }, svg); + return (t) => { + const u = ((t % 2.4) + 2.4) % 2.4 / 2.4, half = u < 0.5, p = io(half ? u * 2 : (u - 0.5) * 2), f = half ? p : 1 - p; + const x = A[0] + (B[0] - A[0]) * f, y = A[1] - (A[1] - AP) * 4 * f * (1 - f); + ball.setAttribute("cx", x); ball.setAttribute("cy", y); + const hitL = Math.max(0, 1 - Math.min(u, 1 - u) * 8), hitR = Math.max(0, 1 - Math.abs(u - 0.5) * 8); + tf(L, 1012, 420, 1, -18 + 14 * hitL); + tf(R, 1448, 420, 1, 18 - 14 * hitR); + conf.forEach((n, i) => n.setAttribute("transform", `translate(0 ${Math.sin(t * 2.6 + i * 1.7) * 6})`)); + }; + }, + }; + + /* ---- 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/kilo-code-vs-cline/pumps.png b/blog/src/assets/media/kilo-code-vs-cline/pumps.png new file mode 100644 index 000000000..05144fed6 Binary files /dev/null and b/blog/src/assets/media/kilo-code-vs-cline/pumps.png differ diff --git a/blog/src/assets/media/kilo-code-vs-cline/seats.png b/blog/src/assets/media/kilo-code-vs-cline/seats.png new file mode 100644 index 000000000..6fae39368 Binary files /dev/null and b/blog/src/assets/media/kilo-code-vs-cline/seats.png differ diff --git a/blog/src/posts/agent-tools-today-2026-10-19.md b/blog/src/posts/agent-tools-today-2026-10-19.md new file mode 100644 index 000000000..06bbd7237 --- /dev/null +++ b/blog/src/posts/agent-tools-today-2026-10-19.md @@ -0,0 +1,57 @@ +--- +title: "Agent Tools Today, 19 Oct 2026: DeepSeek Search API, Sphinx, OpenClaw 2026.10.5" +seoTitle: "Agent Tools Today (19 Oct 2026): Launches, Skills, MCP Servers" +description: "The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 19 Oct 2026, each with its source." +date: 2026-10-19 +category: news +categoryLabel: News +type: Non-technical +series: agent-tools-today +primaryKeyword: "agent tools today 19 oct 2026" +secondaryKeywords: ["deepseek search api", "deepseek fetch api", "sphinx git hook", "openclaw 2026.10.5", "huashu motion"] +tags: ["Daily Brief", "Claude Code", "MCP", "Open Source"] +--- + +Agent tools today, 19 Oct 2026, in one line: DeepSeek opened its own web search to agents at $0.75 per 1,000 successful requests, a Git hook now quizzes you on your agent's code before a push, and OpenClaw's new release resumes interrupted turns after a Gateway restart. Every number was checked on 19 Oct. The last edition is [18 Oct](/blog/agent-tools-today-2026-10-18/). + +[Munder Difflin](https://harnessmd.com/download) 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. It shipped no release in the last 24 hours, so it is not in the lists below. + +
Animation. On a white background, a parcel labelled git push waits in front of a raised drawbridge. A card from Sphinx asks: What happens on the retry? When a check marked Understood appears, the bridge lowers and the parcel rolls across to a flag marked origin/main.
How Sphinx pauses a push on a protected branch and asks one question about the diff, from the Sphinx site on 19 Oct 2026.
+ +## Top 3 launches + +1. **DeepSeek Search and Fetch API.** DeepSeek's change log, dated 17 Oct, opens the search engine behind its own web and API search to developers. The Search API finds pages for a query and returns structured results; the Fetch API returns one page as Markdown. Each costs $0.75 per 1,000 successful requests, and "Failed requests, empty search results, and timeouts are not billed." When you use the DeepSeek API through Claude Code or Codex, its own search calls are free until billing starts on 1 Nov 2026, Beijing time. More than 550 points on Hacker News on 19 Oct. See [DeepSeek V4.1 Flash 1017](/blog/deepseek-v4-1-flash-1017/). [Source](https://api-docs.deepseek.com/guides/search/) +2. **Sphinx.** A Git hook that pauses a push on the branches you protect and asks you one question about what the diff does when things go wrong. Get it wrong and it explains why and tries a new scenario; get it right and the push continues. The site says it works with Codex, Claude Code, Cursor, OpenCode and Pi, or plain Git, and that "Your answers never reach the coding agent". Created 14 Oct. MIT, more than 110 stars and more than 240 points on Hacker News on 19 Oct. [Source](https://sphinx-six-theta.vercel.app/) +3. **huashu-motion.** A skill that has a coding agent such as Claude Code or Codex make a product launch video from one request. The README says the agent reads your product, offers three directions, writes the film and its own music, then opens an editor in the browser where you click on a frame to change only that part. Created 18 Oct. MIT, more than 460 stars on 19 Oct. [Source](https://github.com/alchaincyf/huashu-motion) + +## Top 3 skills, MCP servers and plugins + +1. **Audio Studio MCP.** It gives Claude Code, Claude Desktop, Cursor and other MCP clients "a sound studio that runs on your own Mac or Windows PC": you ask for background music or a sound effect in plain language and Stable Audio 3 generates it. Every file gets a JSON sidecar "with its prompt, seed and settings". Created 18 Oct. MIT, more than 100 stars on 19 Oct. [Source](https://github.com/kanaworksai-hue/audio-studio-mcp) +2. **orchestrator.** "A Claude Code skill that turns your main session into a dispatcher that never blocks." Every task goes to a background subagent while the main session only plans, dispatches, tracks and reports, and a small ledger file tracks every agent and "survives context compaction". Created 17 Oct. MIT, more than 45 stars on 19 Oct. See [the Claude Code orchestration guide](/blog/claude-code-orchestration-guide/). [Source](https://github.com/olivieropinotti/orchestrator-skill) +3. **CVE Intel.** A security tool written in Rust that ships as a "Desktop app, CLI, MCP server and REST API in one executable". It gathers sources such as NVD, EPSS and CISA KEV so an agent or a person can decide whether a CVE needs a fix now. Created 18 Oct. GitHub lists the licence as Apache 2.0; more than 45 stars on 19 Oct. [Source](https://github.com/Fazmin/cve-intel) + +## Top 3 moves from multi agent tools + +1. **OpenClaw v2026.10.5.** Published 18 Oct. Interrupted turns, subagent work and deferred tasks now "resume after a Gateway restart", `openclaw update` finishes and recovers on its own, a new channel plugin answers X mentions, and Google adds Gemini 4 Argon and Gemini 3.8 Flash to the model pickers. See [OpenClaw alternatives](/blog/openclaw-alternatives/). [Source](https://github.com/openclaw/openclaw/releases/tag/v2026.10.5) +2. **LiteLLM v1.106.0.** Published 18 Oct. A new Docker quickstart starts the gateway, Postgres and the admin UI with one command, and a second quickstart covers Windows in PowerShell. [Source](https://github.com/BerriAI/litellm/releases/tag/v1.106.0) +3. **OpenAI Python SDK v3.35.0.** Published 17 Oct. It adds an "ultrafast service tier for Agents" and typed Live sideband events; v3.35.1 followed on 18 Oct with a fix for byte reads on websockets 13. [Source](https://github.com/openai/openai-python/releases/tag/v3.35.0) + +## Top 3 rising repos + +1. **tv-vibehack.** "Your TV, minus the ads." It strips the bloatware from an Android TV or Google TV over WiFi and replaces the home screen with a clean launcher, with "No root, no cable, nothing uninstalled". The README says it was done with Claude Code talking to the real TV, and the prompt is in the repo. Created 17 Oct. More than 2,200 stars on 19 Oct; GitHub lists the licence as Other. [Source](https://github.com/Gathin23/tv-vibehack) +2. **Athenaion.** An ancient Greek world built in `three.js` with no external assets: "every mesh, texture, shader, tree, statue and waterfall is generated procedurally". The README says Claude Code (Opus 5.5) built it over about 2 days to match 9 reference images. Created 17 Oct. MIT, more than 130 stars on 19 Oct. [Source](https://github.com/Leonxlnx/athenaion) +3. **tsc-ts.** Vercel Labs' experimental TypeScript port of the TypeScript 7.0.2 compiler (TypeScript-Go), compiled to native code with scriptc. Created 7 Oct. Apache 2.0, more than 330 stars on 19 Oct. [Source](https://github.com/vercel-labs/tsc-ts) + +New repos can gain stars quickly for reasons other than use, so treat these as names to watch, not recommendations. + +## Top 3 things people are arguing about + +1. **Junior hiring at Anthropic.** Anthropic's report on how employment is changing inside the company says the share of junior employees in technical departments "slipped from 21% to 14% since early 2025" and junior technical hires fell "from 27% to 9%", while by August interactive AI agent hours outnumbered employees six to one. More than 100 points on Hacker News on 19 Oct. [Source](https://www.anthropic.com/research/employment-at-anthropic) +2. **A golden age or a dark age.** A guest post by the mathematician Francesco Maggi on Terence Tao's blog asks whether LLMs will bring a golden age or a dark age for mathematics and science. It says "The golden age scenario is achievable" and names steps such as access to frontier LLMs for researchers and reproducibility and disclosure standards. More than 120 points on Hacker News on 19 Oct. [Source](https://terrytao.wordpress.com/2026/10/18/will-it-be-a-golden-age-or-a-dark-age-for-mathematics-and-science/) +3. **Codex Desktop crash dumps.** An open GitHub issue, filed on 2 June, says Codex Desktop on macOS keeps writing Crashpad dump files while the app stays usable; on the reporter's Mac the folder "grew to `4.9G` and `54,504` files in one day". It had more than 160 points on Hacker News on 19 Oct. See [what is Codex](/blog/what-is-codex/). [Source](https://github.com/openai/codex/issues/25921) + +## How this list is built + +Each day our agents read GitHub releases and new repos, vendor posts and the Hacker News front page about coding agents. A name only makes a list with a link that was opened and a signal that can be shown: points, stars or a dated release. Repos are checked against the GitHub API before they appear, and a claim that exists only as a social post is left out. New here? Start with the [install guide](/blog/how-to-install-and-use-munder-difflin/). + + diff --git a/blog/src/posts/cline-vs-munder-difflin.md b/blog/src/posts/cline-vs-munder-difflin.md index 0e9256b63..75e1e16e8 100644 --- a/blog/src/posts/cline-vs-munder-difflin.md +++ b/blog/src/posts/cline-vs-munder-difflin.md @@ -74,7 +74,7 @@ Pick Cline when one capable agent is enough and you want it close to your code. * **You want to choose your own model.** Cline takes keys from many providers, and Ollama or LM Studio if you want local models. * **You want one tool in many places.** The same engine runs in the editor, the terminal, CI, the desktop app and your own code through the SDK. -If those cover you, Cline is the more direct fit. For other tools in this space, see our [OpenCode alternatives](/blog/opencode-alternatives/) and [Claude Code alternatives](/blog/claude-code-alternatives/). +If those cover you, Cline is the more direct fit. Weighing it against a similar editor agent? Read [Kilo Code vs Cline](/blog/kilo-code-vs-cline/). For other tools in this space, see our [OpenCode alternatives](/blog/opencode-alternatives/) and [Claude Code alternatives](/blog/claude-code-alternatives/). ## When should you pick Munder Difflin? diff --git a/blog/src/posts/hermes-agent-alternatives.md b/blog/src/posts/hermes-agent-alternatives.md new file mode 100644 index 000000000..d4db0393e --- /dev/null +++ b/blog/src/posts/hermes-agent-alternatives.md @@ -0,0 +1,104 @@ +--- +title: "Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud" +seoTitle: "7 Hermes Agent Alternatives in 2026: Free, Open Source and Hosted" +description: "Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026." +date: 2026-10-19 +category: comparisons +categoryLabel: Comparisons +type: Non-technical +primaryKeyword: "hermes agent alternatives" +secondaryKeywords: ["hermes agent alternative", "best hermes agent alternative", "open source hermes agent alternative", "hermes agent vs openclaw", "apps like hermes agent"] +tags: ["Comparisons", "AI Agents", "Open Source", "Local-First"] +ogImage: "https://munderdiffl.in/blog/assets/media/hermes-agent-alternatives/hero.png" +faq: + - q: "What is the best Hermes Agent alternative?" + a: "OpenClaw, if you want the same job: a personal assistant in your chat apps that you host yourself. It is MIT licensed, has the most stars of any agent here, and shipped v2026.10.5 on 18 Oct 2026. If your real work is code, Munder Difflin fits better." + - q: "Is there a free Hermes Agent alternative?" + a: "Yes. OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot and Goose are all free and open source, checked on 19 Oct 2026. You still bring a model: an API key, a subscription you already pay for, or a local model." + - q: "Is there a Hermes Agent alternative for coding?" + a: "Goose handles code as one general agent with a desktop app and a CLI. Munder Difflin is built for it: a desktop app that runs a team of coding agents such as Claude Code, Codex and Gemini CLI on your own computer." + - q: "Is there a hosted Hermes Agent alternative?" + a: "Claude is the hosted pick. Anthropic's help page says Cowork runs tasks in the cloud (in beta on Team and Enterprise plans) and that scheduled tasks do not need your computer to be awake. It needs a paid plan: Pro is $20 a month billed monthly." + - q: "Can I move from OpenClaw to Hermes Agent?" + a: "Yes. The Hermes Agent README lists `hermes claw migrate` for people coming from OpenClaw. The move it documents goes from OpenClaw to Hermes Agent, not the other way." +thumb: "/blog/assets/media/hermes-agent-alternatives/hero.png" +--- + +The best Hermes Agent alternative is OpenClaw if you want the same job done, a personal assistant in your chat apps, and [Munder Difflin](https://harnessmd.com/download) if your real work is code. NanoClaw, ZeroClaw, nanobot, Goose and Claude cover containers, one Rust binary, a Python core, a desktop app and a hosted option. Checked 19 Oct 2026. + +
Animation. A bento box with seven compartments fills one name at a time. Six names sit in the larger part of the box marked free and open source, and Claude sits alone in a compartment marked hosted.
Seven alternatives. Six are free and open source, one is hosted.
+ +This guide sits in our [Comparisons hub](/blog/topics/comparisons/), next to [OpenClaw alternatives](/blog/openclaw-alternatives/) and the wider list of [open source AI agents](/blog/open-source-ai-agents/). + +## What is Hermes Agent, and why would you look elsewhere? + +Hermes Agent is Nous Research's MIT licensed personal agent. Its README says it creates skills from experience and improves them during use; it also keeps memory between sessions, runs a cron scheduler, and answers on "Telegram, Discord, Slack, WhatsApp, Signal, and CLI" from one gateway process. GitHub showed 254,983 stars and release v0.22.2 (15 Oct 2026) on 19 Oct 2026. Our [Hermes Agent explainer](/blog/what-is-hermes-agent/) covers the install. + +It costs nothing, so price is rarely the reason to switch. The reasons are about the job: + +- **It is one personal agent, not a team.** If your work is a codebase, you may want several coding agents working side by side. +- **You run it.** It installs on your computer or a server, with seven terminal backends from local and Docker to Modal and Daytona. +- **You may want harder walls.** Some picks below run each agent in its own container or ask before medium risk actions by default. + +## Seven Hermes Agent alternatives, by job + +**1. OpenClaw.** [OpenClaw](https://github.com/openclaw/openclaw) is the closest swap and the biggest project here: 392,413 stars on 19 Oct 2026, MIT licensed. Its README names Discord, iMessage, Slack, Teams, Telegram and WhatsApp "and 20+ more", with native apps for macOS, iOS, Android, Windows and Linux. Release v2026.10.5 (18 Oct) resumes interrupted turns "after a Gateway restart". The README also warns that "Tools run on the host for the main session unless you configure sandboxing". Best for: the same job, with more channels. + +**2. Munder Difflin.** This is what we make, and 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. The limits: it is for coding work, it does not answer your Telegram or run errands, and agents work while your computer is on. The [install guide](/blog/how-to-install-and-use-munder-difflin/) takes you from download to a first agent. Best for: people who used Hermes Agent mostly to get code written. + +**3. NanoClaw.** [NanoClaw](https://github.com/nanocoai/nanoclaw) (MIT) says agents "run in their own Linux containers with filesystem isolation, not merely behind permission checks". Its setup script installs Node, pnpm and Docker if they are missing and registers your Anthropic credential with a credential gateway. Chat channels such as Discord, Slack, Telegram and WhatsApp live on a separate branch. Our [NanoClaw explainer](/blog/what-is-nanoclaw/) covers setup. Best for: isolation first. + +**4. ZeroClaw.** [ZeroClaw](https://github.com/zeroclaw-labs/zeroclaw) is "a single Rust binary you configure and run", dual licensed MIT or Apache 2.0 according to its README badge. It reaches "30+ channels", and its default autonomy is `supervised`, where medium risk operations need your approval and high risk ones are blocked. It also drives hardware such as a Raspberry Pi. Release v0.8.6 came out on 18 Oct. Our [ZeroClaw explainer](/blog/what-is-zeroclaw/) has the details. Best for: an always on service in one binary. + +**5. nanobot.** [nanobot](https://github.com/HKUDS/nanobot) (MIT) is a personal agent framework for Python 3.11 or newer. It runs in a browser WebUI or a terminal and connects to Telegram, Discord, Slack, WeChat, Email and other channels. Best for: Python people who want to read the core. + +**6. Goose.** [Goose](https://github.com/aaif-goose/goose) (Apache 2.0) is a general agent with "A native desktop app for macOS, Linux, and Windows", a CLI and an API. It works with 15+ providers and can use an existing Claude, ChatGPT or Gemini subscription. It is part of the Agentic AI Foundation at the Linux Foundation. Best for: a desktop app first. + +**7. Claude.** The one hosted pick. Anthropic's [help page](https://support.claude.com/en/articles/13345190-get-started-with-cowork) says Cowork runs your tasks in the cloud (in beta on Team and Enterprise plans) and that scheduled tasks "don't need your computer to be awake". The page also notes that "Claude Cowork is now just Claude", rolling out gradually to Pro and Max plans. Best for: no server to run. + +## Hermes Agent alternatives compared, checked 19 Oct 2026 + +| Tool | What it is | Licence | Price | Runs where | +| --- | --- | --- | --- | --- | +| Hermes Agent | Personal agent that learns | MIT | Free. | Your computer, a server, Docker or serverless backends | +| OpenClaw | Personal assistant in your chats | MIT | Free. | Your own devices | +| Munder Difflin | Team of coding agents | MIT | Free and open source. | Your own computer | +| NanoClaw | Assistant in containers | MIT | Free. | Docker on your machine | +| ZeroClaw | Agent runtime, one Rust binary | MIT or Apache 2.0 | Free. | Your machine, or boards such as a Raspberry Pi | +| nanobot | Python agent framework | MIT | Free. | Your computer or a server | +| Goose | General agent, desktop and CLI | Apache 2.0 | Free. | macOS, Linux, Windows | +| Claude | Hosted agent | Proprietary | Pro: $20 a month, billed monthly (19 Oct 2026). | Anthropic's servers | + +Licences come from each repo and the Claude price from [claude.com/pricing](https://claude.com/pricing), all checked on 19 Oct 2026. + +## What is the best Hermes Agent alternative? + +OpenClaw, if you like what Hermes Agent does. It does the same job under the same licence, with more channels and native phone apps. Hermes Agent still has the stronger learning story: skills it writes and improves from use, and a documented import from `~/.openclaw` through `hermes claw migrate`. That command moves people toward Hermes Agent, not away from it. + +
Animation. A lift panel with three buttons: your computer, a server and Anthropic's servers. Each press lights a button and a card slides out with the picks for that floor.
Pick by whose computer does the work. Tap a button to change floors.
+ +If your agent only needs to answer you on Telegram and remember things, stay with Hermes Agent. + +## Is there a free Hermes Agent alternative? + +Yes: six of the seven are free and open source, and so is Hermes Agent. The software costs nothing. The model does, unless you run a local one or reuse a plan you already pay for. + +
Animation. A sink with two taps. The tap marked software pours freely into a glass marked free, and the tap marked model fills a glass marked your API key, your plan or a local model.
The software is free. The model is what you pay for.
+ +Claude is the one pick here where the agent work starts on a paid plan: on 19 Oct 2026, Pro is $20 a month billed monthly, and Max is listed "From $100". + +## Who should pick what? + +Pick by the job first, then by whose computer does the work. + +- **OpenClaw** if you want Hermes Agent's job with more channels and native phone apps. +- **Munder Difflin** if the work is code and you want several agents on it at once. +- **NanoClaw** if every agent should sit in its own container. +- **ZeroClaw** if you want one Rust binary running as a service. +- **nanobot** if you live in Python. +- **Goose** if you want a desktop app first. +- **Claude** if you would rather pay than host. + +For the two closest projects side by side, read [Hermes Agent vs OpenClaw](/blog/hermes-agent-vs-openclaw/). + + diff --git a/blog/src/posts/kilo-code-vs-cline.md b/blog/src/posts/kilo-code-vs-cline.md new file mode 100644 index 000000000..a1186a36c --- /dev/null +++ b/blog/src/posts/kilo-code-vs-cline.md @@ -0,0 +1,91 @@ +--- +title: "Kilo Code vs Cline: Two Open Source Coding Agents Compared" +seoTitle: "Kilo Code vs Cline (Oct 2026): Pricing, Models, Where Each Runs" +description: "Kilo Code vs Cline, checked 19 Oct 2026: licences, where each runs, how you pay for models, team prices and which one to pick." +date: 2026-10-19 +category: comparisons +categoryLabel: Comparisons +type: Non-technical +primaryKeyword: "kilo code vs cline" +secondaryKeywords: ["cline vs kilo code", "kilo code or cline", "kilo code pricing", "cline pricing", "kilo code alternatives"] +tags: ["Comparisons", "Open Source", "IDE Agents"] +ogImage: "https://munderdiffl.in/blog/assets/media/kilo-code-vs-cline/hero.png" +faq: + - q: "Is Kilo Code better than Cline?" + a: "Neither wins outright. Kilo Code fits people who want 500+ models through one account and $15 team seats. Cline fits people who want the Apache 2.0 licence, a desktop app and an SDK. Both are free for individuals." + - q: "Are Kilo Code and Cline free?" + a: "Yes, for individuals. Kilo Code's Free plan says usage is billed separately, and Cline's pricing page says you pay only for AI inference on a usage basis. Bring your own key and you pay your model provider directly. Checked 19 Oct 2026." + - q: "Which is open source, Kilo Code or Cline?" + a: "Both. Kilo Code is MIT licensed and Cline is Apache 2.0, according to the GitHub API on 19 Oct 2026. Kilo's README says its CLI is a fork of OpenCode." + - q: "Do Kilo Code and Cline work in JetBrains?" + a: "Both list a JetBrains plugin next to the VS Code extension and a CLI. Cline's pricing page lists the JetBrains extension under its Enterprise plan, so check that page before you plan a team rollout." + - q: "Can Kilo Code or Cline run in the cloud?" + a: "Kilo Code runs from the web at app.kilo.ai/cloud. Cline extension v4.1.25 (16 Oct 2026) added Cline Cloud sessions, rolling out gradually, which run a task in a hosted sandbox on a GitHub repo and branch you pick." +thumb: "/blog/assets/media/kilo-code-vs-cline/hero.png" +--- + +Kilo Code and Cline are free, open source coding agents that live in your editor and terminal. Pick Kilo Code for 500+ models through one account and $15 team seats (19 Oct 2026). Pick Cline for the Apache 2.0 licence, a desktop app and an SDK, with model use at cost or on your own key. Checked 19 Oct 2026. + +
Animation. Two tool belts, one above the other. The Kilo Code belt fills its pouches with VS Code, JetBrains, CLI and cloud; the Cline belt fills VS Code, JetBrains, CLI, desktop app and SDK.
Where each one runs, from each README on 19 Oct 2026.
+ +If you would rather run several agents at once than one in your editor, [Munder Difflin](https://harnessmd.com/download) 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. More picks in our [Comparisons hub](/blog/topics/comparisons/). + +## What are Kilo Code and Cline? + +**Kilo Code** calls itself "an AI coding agent that meets you everywhere you work": VS Code, JetBrains and the CLI. Its README says you pick from 500+ models and can switch models in the middle of a task. It ships agents named Code, Plan, Ask and Debug, and you can build your own. The Kilo Marketplace adds agents, skills, MCP servers and plugins. The README also says "Kilo CLI is a fork of OpenCode". MIT licensed, 27,654 stars and VS Code release v7.8.12 (15 Oct) on 19 Oct 2026. + +**Cline** calls itself "The open source coding agent in your IDE, terminal, & desktop." It runs as a CLI that also works headless for CI and scripts, a desktop app for macOS and Windows, a VS Code extension, a JetBrains plugin and an SDK for building your own agents. By default it asks for your approval before it acts. Apache 2.0, 70,527 stars on 19 Oct 2026. Our [Cline vs Munder Difflin](/blog/cline-vs-munder-difflin/) page has more on Cline's own releases. + +## Kilo Code vs Cline at a glance, checked 19 Oct 2026 + +| | Kilo Code | Cline | +| --- | --- | --- | +| Licence | MIT | Apache 2.0 | +| Editors | VS Code, JetBrains | VS Code; JetBrains on Enterprise | +| Terminal | Kilo CLI (a fork of OpenCode) | Cline CLI, also headless | +| Other places | Web at app.kilo.ai/cloud | Desktop app (macOS, Windows), SDK, Cline Cloud sessions (rolling out) | +| Models | 500+ through one account, or your own key | At cost through Cline, or your own key | +| Individual price | Free, usage billed separately (19 Oct 2026) | Free, pay for inference (19 Oct 2026) | +| Team price | Teams $15 per user per month; Enterprise custom (19 Oct 2026) | Enterprise, contact sales (19 Oct 2026) | +| Latest release | v7.8.12 (VS Code and CLI), 15 Oct 2026 | Extension v4.1.25, 16 Oct 2026; CLI v3.0.73, 17 Oct 2026 | + +Licences and releases come from the GitHub API, prices from [kilo.ai/pricing](https://kilo.ai/pricing) and [cline.bot/pricing](https://cline.bot/pricing), all read on 19 Oct 2026. + +## Where does each one run? + +Both list a VS Code extension, a JetBrains plugin and a CLI, though Cline's pricing page puts JetBrains under Enterprise. After that they split. + +- **Kilo Code** adds the web. Its README says you can run Kilo "from the web, no local machine needed" at app.kilo.ai/cloud, and set up automated code reviews on pull requests. +- **Cline** adds a desktop app and an SDK. The desktop app runs agent sessions in any folder and schedules routines. Extension v4.1.25 (16 Oct 2026) added Cline Cloud sessions, "rolling out gradually", which run a task in a hosted sandbox on a GitHub repo and branch you pick. + +## How do you pay for models? + +Neither charges for the agent itself if you work alone. You pay for the model, plus Kilo's cloud compute if you use it. + +
Animation. Two fuel pumps stand side by side. The Kilo Code pump has nozzles for free models, local models, BYOK, Kilo Gateway and Kilo Pass; the Cline pump has nozzles for at cost and BYOK.
How you pay for the model, from each pricing page on 19 Oct 2026. Tap a pump to light its options.
+ +- **Kilo Code**: its pricing page says "Choose free models, local models, BYOK, Kilo Gateway, or Kilo Pass." BYOK means bring your own key: you pay your model provider directly. +- **Cline**: its pricing page says "Pay only for AI inference on a usage basis", and lists model inference "at Cost or BYOK". + +Kilo Code's page names five ways to pay, and Cline's names two. On Kilo, Kilo Pass starts at $19 a month with up to 50% bonus credits, and credit purchases carry a 5% processing fee (19 Oct 2026). + +## What do teams pay? + +This is where they differ most. + +
Animation. Two rows of cinema seats. Seats in the Kilo Code row light up one by one, each with a tag of 15 dollars per user per month; the Cline row has a single sign that reads Enterprise, contact sales.
Team plans on 19 Oct 2026. Drag the slider to light more seats.
+ +- **Kilo Code** lists Teams at "$15/user/month" on 19 Oct 2026, with a 14 day Enterprise trial, and Enterprise at a custom price with SSO, audit logs and an SLA. +- **Cline** lists two plans: the free open source plan, and Enterprise at a custom price with SSO, an SLA and dedicated support. Its pricing page lists the JetBrains extension under Enterprise. + +## Which should you pick? + +Pick by where you work and who pays for the model. + +- **Pick Kilo Code** if you want one account for 500+ models, a per seat team plan, or a browser option without waiting for a rollout. +- **Pick Cline** if you want the Apache 2.0 licence, a desktop app, or an SDK to build on. +- **Pick neither** if you want different agents, such as Claude Code and Codex, working one job side by side: see [best Claude Code multi agent tools](/blog/best-claude-code-multi-agent-tools/). + +Both ship releases every few days, so recheck the prices before you commit a team. New to running agents side by side? Start with the [Munder Difflin install guide](/blog/how-to-install-and-use-munder-difflin/). + + diff --git a/blog/src/posts/openclaw-alternatives.md b/blog/src/posts/openclaw-alternatives.md index a5cb59d92..42333c568 100644 --- a/blog/src/posts/openclaw-alternatives.md +++ b/blog/src/posts/openclaw-alternatives.md @@ -44,7 +44,7 @@ So nobody leaves over price. From OpenClaw's own README, the reasons are these: Two of the seven kept the claw in the name. Nobody said naming was easy. -**1. Hermes Agent.** [Hermes Agent](https://github.com/NousResearch/hermes-agent) from Nous Research is the closest swap. It is MIT licensed, creates skills from experience, has a cron scheduler, and answers on Telegram, Discord, Slack, WhatsApp and Signal. `hermes claw migrate` imports your OpenClaw settings, memories, skills and API keys. Our [Hermes Agent explainer](/blog/what-is-hermes-agent/) covers the install. Best for: the same job, with memory that grows. +**1. Hermes Agent.** [Hermes Agent](https://github.com/NousResearch/hermes-agent) from Nous Research is the closest swap. It is MIT licensed, creates skills from experience, has a cron scheduler, and answers on Telegram, Discord, Slack, WhatsApp and Signal. `hermes claw migrate` imports your OpenClaw settings, memories, skills and API keys. Our [Hermes Agent explainer](/blog/what-is-hermes-agent/) covers the install, and [Hermes Agent alternatives](/blog/hermes-agent-alternatives/) runs the list the other way. Best for: the same job, with memory that grows. **2. Munder Difflin.** This is what we make, and 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. Each agent is a real CLI in a real terminal, with a role, shared memory and messages to the others. It runs on macOS, Windows and Linux. The limits: it is for coding work, it does not run personal errands or answer your WhatsApp, and agents work while your computer is on. The [install guide](/blog/how-to-install-and-use-munder-difflin/) takes you from download to a first agent. Best for: people who used OpenClaw mostly to get code written. diff --git a/blog/src/posts/what-is-hermes-agent.md b/blog/src/posts/what-is-hermes-agent.md index 2d99cfd22..1ca40f0d6 100644 --- a/blog/src/posts/what-is-hermes-agent.md +++ b/blog/src/posts/what-is-hermes-agent.md @@ -94,7 +94,7 @@ Zero assets is expected: the installer pulls from git, so the release is a tag a ## Hermes Agent vs OpenClaw, Munder Difflin, Claude Code and Pi: which should you use? -Hermes or OpenClaw if you want a personal assistant in your chat apps, the other three if the job is code. Our [OpenClaw alternatives](/blog/openclaw-alternatives/) list has more picks. Head to head: [Hermes Agent vs OpenClaw](/blog/hermes-agent-vs-openclaw/). Licences and releases read from each repo through `gh api` on 3 Oct 2026, dates in UTC: +Hermes or OpenClaw if you want a personal assistant in your chat apps, the other three if the job is code. Our [OpenClaw alternatives](/blog/openclaw-alternatives/) and [Hermes Agent alternatives](/blog/hermes-agent-alternatives/) lists have more picks. Head to head: [Hermes Agent vs OpenClaw](/blog/hermes-agent-vs-openclaw/). Licences and releases read from each repo through `gh api` on 3 Oct 2026, dates in UTC: | | Licence | Where it runs | What it is for | Latest release | | --- | --- | --- | --- | --- | diff --git a/docs/blog/agent-tools-today-2026-10-03/index.html b/docs/blog/agent-tools-today-2026-10-03/index.html index a1a2724fd..548864869 100644 --- a/docs/blog/agent-tools-today-2026-10-03/index.html +++ b/docs/blog/agent-tools-today-2026-10-03/index.html @@ -249,50 +249,50 @@

How this list is built
- +
- + 5 min
-

Agent Tools Today, 18 Oct 2026: LeanREA Takes On REA, FLUX 3 Image Klein, Hy Memory

-

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 18 Oct 2026, each with its source.

+

Agent Tools Today, 19 Oct 2026: DeepSeek Search API, Sphinx, OpenClaw 2026.10.5

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 19 Oct 2026, each with its source.

News - Read → + Read →
- +
- + 5 min
-

Agent Tools Today, 17 Oct 2026: Muse Spark Open on Mac Studio, StarSkirmish, Claude Design Closes

-

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 17 Oct 2026, each with its source.

+

Agent Tools Today, 18 Oct 2026: LeanREA Takes On REA, FLUX 3 Image Klein, Hy Memory

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 18 Oct 2026, each with its source.

News - Read → + Read →
- +
- + - 4 min + 5 min
-

Agent Tools Today, 16 Oct 2026: Muse Spark Open, Tiny Little Office, OpenCode Ends Sharing

-

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 16 Oct 2026, each with its source.

+

Agent Tools Today, 17 Oct 2026: Muse Spark Open on Mac Studio, StarSkirmish, Claude Design Closes

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 17 Oct 2026, each with its source.

News - Read → + Read →
diff --git a/docs/blog/agent-tools-today-2026-10-04/index.html b/docs/blog/agent-tools-today-2026-10-04/index.html index fd1ea4b49..ea57bce21 100644 --- a/docs/blog/agent-tools-today-2026-10-04/index.html +++ b/docs/blog/agent-tools-today-2026-10-04/index.html @@ -248,50 +248,50 @@

How this list is built
- +
- + 5 min
-

Agent Tools Today, 18 Oct 2026: LeanREA Takes On REA, FLUX 3 Image Klein, Hy Memory

-

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 18 Oct 2026, each with its source.

+

Agent Tools Today, 19 Oct 2026: DeepSeek Search API, Sphinx, OpenClaw 2026.10.5

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 19 Oct 2026, each with its source.

News - Read → + Read →
- +
- + 5 min
-

Agent Tools Today, 17 Oct 2026: Muse Spark Open on Mac Studio, StarSkirmish, Claude Design Closes

-

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 17 Oct 2026, each with its source.

+

Agent Tools Today, 18 Oct 2026: LeanREA Takes On REA, FLUX 3 Image Klein, Hy Memory

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 18 Oct 2026, each with its source.

News - Read → + Read →
- +
- + - 4 min + 5 min
-

Agent Tools Today, 16 Oct 2026: Muse Spark Open, Tiny Little Office, OpenCode Ends Sharing

-

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 16 Oct 2026, each with its source.

+

Agent Tools Today, 17 Oct 2026: Muse Spark Open on Mac Studio, StarSkirmish, Claude Design Closes

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 17 Oct 2026, each with its source.

News - Read → + Read →
diff --git a/docs/blog/agent-tools-today-2026-10-05/index.html b/docs/blog/agent-tools-today-2026-10-05/index.html index 8a4cd89b4..76af56f52 100644 --- a/docs/blog/agent-tools-today-2026-10-05/index.html +++ b/docs/blog/agent-tools-today-2026-10-05/index.html @@ -246,50 +246,50 @@

How this list is built
- +
- + 5 min
-

Agent Tools Today, 18 Oct 2026: LeanREA Takes On REA, FLUX 3 Image Klein, Hy Memory

-

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 18 Oct 2026, each with its source.

+

Agent Tools Today, 19 Oct 2026: DeepSeek Search API, Sphinx, OpenClaw 2026.10.5

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 19 Oct 2026, each with its source.

News - Read → + Read →
- +
- + 5 min
-

Agent Tools Today, 17 Oct 2026: Muse Spark Open on Mac Studio, StarSkirmish, Claude Design Closes

-

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 17 Oct 2026, each with its source.

+

Agent Tools Today, 18 Oct 2026: LeanREA Takes On REA, FLUX 3 Image Klein, Hy Memory

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 18 Oct 2026, each with its source.

News - Read → + Read →
- +
- + - 4 min + 5 min
-

Agent Tools Today, 16 Oct 2026: Muse Spark Open, Tiny Little Office, OpenCode Ends Sharing

-

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 16 Oct 2026, each with its source.

+

Agent Tools Today, 17 Oct 2026: Muse Spark Open on Mac Studio, StarSkirmish, Claude Design Closes

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 17 Oct 2026, each with its source.

News - Read → + Read →
diff --git a/docs/blog/agent-tools-today-2026-10-06/index.html b/docs/blog/agent-tools-today-2026-10-06/index.html index cdcf54ab2..356b39644 100644 --- a/docs/blog/agent-tools-today-2026-10-06/index.html +++ b/docs/blog/agent-tools-today-2026-10-06/index.html @@ -247,50 +247,50 @@

How this list is built
- +
- + 5 min
-

Agent Tools Today, 18 Oct 2026: LeanREA Takes On REA, FLUX 3 Image Klein, Hy Memory

-

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 18 Oct 2026, each with its source.

+

Agent Tools Today, 19 Oct 2026: DeepSeek Search API, Sphinx, OpenClaw 2026.10.5

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 19 Oct 2026, each with its source.

News - Read → + Read →
- +
- + 5 min
-

Agent Tools Today, 17 Oct 2026: Muse Spark Open on Mac Studio, StarSkirmish, Claude Design Closes

-

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 17 Oct 2026, each with its source.

+

Agent Tools Today, 18 Oct 2026: LeanREA Takes On REA, FLUX 3 Image Klein, Hy Memory

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 18 Oct 2026, each with its source.

News - Read → + Read →
- +
- + - 4 min + 5 min
-

Agent Tools Today, 16 Oct 2026: Muse Spark Open, Tiny Little Office, OpenCode Ends Sharing

-

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 16 Oct 2026, each with its source.

+

Agent Tools Today, 17 Oct 2026: Muse Spark Open on Mac Studio, StarSkirmish, Claude Design Closes

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 17 Oct 2026, each with its source.

News - Read → + Read →
diff --git a/docs/blog/agent-tools-today-2026-10-07/index.html b/docs/blog/agent-tools-today-2026-10-07/index.html index 468c2bb75..a3a3680d6 100644 --- a/docs/blog/agent-tools-today-2026-10-07/index.html +++ b/docs/blog/agent-tools-today-2026-10-07/index.html @@ -247,50 +247,50 @@

How this list is built
- +
- + 5 min
-

Agent Tools Today, 18 Oct 2026: LeanREA Takes On REA, FLUX 3 Image Klein, Hy Memory

-

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 18 Oct 2026, each with its source.

+

Agent Tools Today, 19 Oct 2026: DeepSeek Search API, Sphinx, OpenClaw 2026.10.5

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 19 Oct 2026, each with its source.

News - Read → + Read →
- +
- + 5 min
-

Agent Tools Today, 17 Oct 2026: Muse Spark Open on Mac Studio, StarSkirmish, Claude Design Closes

-

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 17 Oct 2026, each with its source.

+

Agent Tools Today, 18 Oct 2026: LeanREA Takes On REA, FLUX 3 Image Klein, Hy Memory

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 18 Oct 2026, each with its source.

News - Read → + Read →
- +
- + - 4 min + 5 min
-

Agent Tools Today, 16 Oct 2026: Muse Spark Open, Tiny Little Office, OpenCode Ends Sharing

-

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 16 Oct 2026, each with its source.

+

Agent Tools Today, 17 Oct 2026: Muse Spark Open on Mac Studio, StarSkirmish, Claude Design Closes

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 17 Oct 2026, each with its source.

News - Read → + Read →
diff --git a/docs/blog/agent-tools-today-2026-10-08/index.html b/docs/blog/agent-tools-today-2026-10-08/index.html index 5432cecf2..e029e68b8 100644 --- a/docs/blog/agent-tools-today-2026-10-08/index.html +++ b/docs/blog/agent-tools-today-2026-10-08/index.html @@ -246,50 +246,50 @@

How this list is built
- +
- + 5 min
-

Agent Tools Today, 18 Oct 2026: LeanREA Takes On REA, FLUX 3 Image Klein, Hy Memory

-

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 18 Oct 2026, each with its source.

+

Agent Tools Today, 19 Oct 2026: DeepSeek Search API, Sphinx, OpenClaw 2026.10.5

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 19 Oct 2026, each with its source.

News - Read → + Read →
- +
- + 5 min
-

Agent Tools Today, 17 Oct 2026: Muse Spark Open on Mac Studio, StarSkirmish, Claude Design Closes

-

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 17 Oct 2026, each with its source.

+

Agent Tools Today, 18 Oct 2026: LeanREA Takes On REA, FLUX 3 Image Klein, Hy Memory

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 18 Oct 2026, each with its source.

News - Read → + Read →
- +
- + - 4 min + 5 min
-

Agent Tools Today, 16 Oct 2026: Muse Spark Open, Tiny Little Office, OpenCode Ends Sharing

-

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 16 Oct 2026, each with its source.

+

Agent Tools Today, 17 Oct 2026: Muse Spark Open on Mac Studio, StarSkirmish, Claude Design Closes

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 17 Oct 2026, each with its source.

News - Read → + Read →
diff --git a/docs/blog/agent-tools-today-2026-10-09/index.html b/docs/blog/agent-tools-today-2026-10-09/index.html index 8f2e47f1a..3b9305ae2 100644 --- a/docs/blog/agent-tools-today-2026-10-09/index.html +++ b/docs/blog/agent-tools-today-2026-10-09/index.html @@ -247,50 +247,50 @@

How this list is built
- +
- + 5 min
-

Agent Tools Today, 18 Oct 2026: LeanREA Takes On REA, FLUX 3 Image Klein, Hy Memory

-

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 18 Oct 2026, each with its source.

+

Agent Tools Today, 19 Oct 2026: DeepSeek Search API, Sphinx, OpenClaw 2026.10.5

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 19 Oct 2026, each with its source.

News - Read → + Read →
- +
- + 5 min
-

Agent Tools Today, 17 Oct 2026: Muse Spark Open on Mac Studio, StarSkirmish, Claude Design Closes

-

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 17 Oct 2026, each with its source.

+

Agent Tools Today, 18 Oct 2026: LeanREA Takes On REA, FLUX 3 Image Klein, Hy Memory

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 18 Oct 2026, each with its source.

News - Read → + Read →
- +
- + - 4 min + 5 min
-

Agent Tools Today, 16 Oct 2026: Muse Spark Open, Tiny Little Office, OpenCode Ends Sharing

-

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 16 Oct 2026, each with its source.

+

Agent Tools Today, 17 Oct 2026: Muse Spark Open on Mac Studio, StarSkirmish, Claude Design Closes

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 17 Oct 2026, each with its source.

News - Read → + Read →
diff --git a/docs/blog/agent-tools-today-2026-10-10/index.html b/docs/blog/agent-tools-today-2026-10-10/index.html index da968b9b5..d013dc413 100644 --- a/docs/blog/agent-tools-today-2026-10-10/index.html +++ b/docs/blog/agent-tools-today-2026-10-10/index.html @@ -247,50 +247,50 @@

How this list is built
- +
- + 5 min
-

Agent Tools Today, 18 Oct 2026: LeanREA Takes On REA, FLUX 3 Image Klein, Hy Memory

-

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 18 Oct 2026, each with its source.

+

Agent Tools Today, 19 Oct 2026: DeepSeek Search API, Sphinx, OpenClaw 2026.10.5

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 19 Oct 2026, each with its source.

News - Read → + Read →
- +
- + 5 min
-

Agent Tools Today, 17 Oct 2026: Muse Spark Open on Mac Studio, StarSkirmish, Claude Design Closes

-

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 17 Oct 2026, each with its source.

+

Agent Tools Today, 18 Oct 2026: LeanREA Takes On REA, FLUX 3 Image Klein, Hy Memory

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 18 Oct 2026, each with its source.

News - Read → + Read →
- +
- + - 4 min + 5 min
-

Agent Tools Today, 16 Oct 2026: Muse Spark Open, Tiny Little Office, OpenCode Ends Sharing

-

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 16 Oct 2026, each with its source.

+

Agent Tools Today, 17 Oct 2026: Muse Spark Open on Mac Studio, StarSkirmish, Claude Design Closes

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 17 Oct 2026, each with its source.

News - Read → + Read →
diff --git a/docs/blog/agent-tools-today-2026-10-11/index.html b/docs/blog/agent-tools-today-2026-10-11/index.html index db016bf4d..2b81da835 100644 --- a/docs/blog/agent-tools-today-2026-10-11/index.html +++ b/docs/blog/agent-tools-today-2026-10-11/index.html @@ -245,50 +245,50 @@

How this list is built
- +
- + 5 min
-

Agent Tools Today, 18 Oct 2026: LeanREA Takes On REA, FLUX 3 Image Klein, Hy Memory

-

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 18 Oct 2026, each with its source.

+

Agent Tools Today, 19 Oct 2026: DeepSeek Search API, Sphinx, OpenClaw 2026.10.5

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 19 Oct 2026, each with its source.

News - Read → + Read →
- +
- + 5 min
-

Agent Tools Today, 17 Oct 2026: Muse Spark Open on Mac Studio, StarSkirmish, Claude Design Closes

-

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 17 Oct 2026, each with its source.

+

Agent Tools Today, 18 Oct 2026: LeanREA Takes On REA, FLUX 3 Image Klein, Hy Memory

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 18 Oct 2026, each with its source.

News - Read → + Read →
- +
- + - 4 min + 5 min
-

Agent Tools Today, 16 Oct 2026: Muse Spark Open, Tiny Little Office, OpenCode Ends Sharing

-

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 16 Oct 2026, each with its source.

+

Agent Tools Today, 17 Oct 2026: Muse Spark Open on Mac Studio, StarSkirmish, Claude Design Closes

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 17 Oct 2026, each with its source.

News - Read → + Read →
diff --git a/docs/blog/agent-tools-today-2026-10-12/index.html b/docs/blog/agent-tools-today-2026-10-12/index.html index 9e4f57469..dfeb21d04 100644 --- a/docs/blog/agent-tools-today-2026-10-12/index.html +++ b/docs/blog/agent-tools-today-2026-10-12/index.html @@ -243,50 +243,50 @@

How this list is built
- +
- + 5 min
-

Agent Tools Today, 18 Oct 2026: LeanREA Takes On REA, FLUX 3 Image Klein, Hy Memory

-

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 18 Oct 2026, each with its source.

+

Agent Tools Today, 19 Oct 2026: DeepSeek Search API, Sphinx, OpenClaw 2026.10.5

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 19 Oct 2026, each with its source.

News - Read → + Read →
- +
- + 5 min
-

Agent Tools Today, 17 Oct 2026: Muse Spark Open on Mac Studio, StarSkirmish, Claude Design Closes

-

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 17 Oct 2026, each with its source.

+

Agent Tools Today, 18 Oct 2026: LeanREA Takes On REA, FLUX 3 Image Klein, Hy Memory

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 18 Oct 2026, each with its source.

News - Read → + Read →
- +
- + - 4 min + 5 min
-

Agent Tools Today, 16 Oct 2026: Muse Spark Open, Tiny Little Office, OpenCode Ends Sharing

-

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 16 Oct 2026, each with its source.

+

Agent Tools Today, 17 Oct 2026: Muse Spark Open on Mac Studio, StarSkirmish, Claude Design Closes

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 17 Oct 2026, each with its source.

News - Read → + Read →
diff --git a/docs/blog/agent-tools-today-2026-10-13/index.html b/docs/blog/agent-tools-today-2026-10-13/index.html index 0318e92f0..2ad4800a4 100644 --- a/docs/blog/agent-tools-today-2026-10-13/index.html +++ b/docs/blog/agent-tools-today-2026-10-13/index.html @@ -243,50 +243,50 @@

How this list is built
- +
- + 5 min
-

Agent Tools Today, 18 Oct 2026: LeanREA Takes On REA, FLUX 3 Image Klein, Hy Memory

-

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 18 Oct 2026, each with its source.

+

Agent Tools Today, 19 Oct 2026: DeepSeek Search API, Sphinx, OpenClaw 2026.10.5

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 19 Oct 2026, each with its source.

News - Read → + Read →
- +
- + 5 min
-

Agent Tools Today, 17 Oct 2026: Muse Spark Open on Mac Studio, StarSkirmish, Claude Design Closes

-

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 17 Oct 2026, each with its source.

+

Agent Tools Today, 18 Oct 2026: LeanREA Takes On REA, FLUX 3 Image Klein, Hy Memory

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 18 Oct 2026, each with its source.

News - Read → + Read →
- +
- + - 4 min + 5 min
-

Agent Tools Today, 16 Oct 2026: Muse Spark Open, Tiny Little Office, OpenCode Ends Sharing

-

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 16 Oct 2026, each with its source.

+

Agent Tools Today, 17 Oct 2026: Muse Spark Open on Mac Studio, StarSkirmish, Claude Design Closes

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 17 Oct 2026, each with its source.

News - Read → + Read →
diff --git a/docs/blog/agent-tools-today-2026-10-15/index.html b/docs/blog/agent-tools-today-2026-10-15/index.html index bf2679882..5aefbc892 100644 --- a/docs/blog/agent-tools-today-2026-10-15/index.html +++ b/docs/blog/agent-tools-today-2026-10-15/index.html @@ -242,50 +242,50 @@

How this list is built
- +
- + 5 min
-

Agent Tools Today, 18 Oct 2026: LeanREA Takes On REA, FLUX 3 Image Klein, Hy Memory

-

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 18 Oct 2026, each with its source.

+

Agent Tools Today, 19 Oct 2026: DeepSeek Search API, Sphinx, OpenClaw 2026.10.5

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 19 Oct 2026, each with its source.

News - Read → + Read →
- +
- + 5 min
-

Agent Tools Today, 17 Oct 2026: Muse Spark Open on Mac Studio, StarSkirmish, Claude Design Closes

-

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 17 Oct 2026, each with its source.

+

Agent Tools Today, 18 Oct 2026: LeanREA Takes On REA, FLUX 3 Image Klein, Hy Memory

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 18 Oct 2026, each with its source.

News - Read → + Read →
- +
- + - 4 min + 5 min
-

Agent Tools Today, 16 Oct 2026: Muse Spark Open, Tiny Little Office, OpenCode Ends Sharing

-

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 16 Oct 2026, each with its source.

+

Agent Tools Today, 17 Oct 2026: Muse Spark Open on Mac Studio, StarSkirmish, Claude Design Closes

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 17 Oct 2026, each with its source.

News - Read → + Read →
diff --git a/docs/blog/agent-tools-today-2026-10-16/index.html b/docs/blog/agent-tools-today-2026-10-16/index.html index b784aaf2f..3019d8664 100644 --- a/docs/blog/agent-tools-today-2026-10-16/index.html +++ b/docs/blog/agent-tools-today-2026-10-16/index.html @@ -241,50 +241,50 @@

How this list is built
- +
- + 5 min
-

Agent Tools Today, 18 Oct 2026: LeanREA Takes On REA, FLUX 3 Image Klein, Hy Memory

-

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 18 Oct 2026, each with its source.

+

Agent Tools Today, 19 Oct 2026: DeepSeek Search API, Sphinx, OpenClaw 2026.10.5

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 19 Oct 2026, each with its source.

News - Read → + Read →
- +
- + 5 min
-

Agent Tools Today, 17 Oct 2026: Muse Spark Open on Mac Studio, StarSkirmish, Claude Design Closes

-

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 17 Oct 2026, each with its source.

+

Agent Tools Today, 18 Oct 2026: LeanREA Takes On REA, FLUX 3 Image Klein, Hy Memory

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 18 Oct 2026, each with its source.

News - Read → + Read →
- +
- + 5 min
-

Agent Tools Today, 15 Oct 2026: OpenCode 2.0, Hermes Agent v0.22.0, a Lost TV Season

-

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 15 Oct 2026, each with its source.

+

Agent Tools Today, 17 Oct 2026: Muse Spark Open on Mac Studio, StarSkirmish, Claude Design Closes

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 17 Oct 2026, each with its source.

News - Read → + Read →
diff --git a/docs/blog/agent-tools-today-2026-10-17/index.html b/docs/blog/agent-tools-today-2026-10-17/index.html index 35fb33650..d321a7c9e 100644 --- a/docs/blog/agent-tools-today-2026-10-17/index.html +++ b/docs/blog/agent-tools-today-2026-10-17/index.html @@ -240,6 +240,22 @@

How this list is built + - diff --git a/docs/blog/agent-tools-today-2026-10-18/index.html b/docs/blog/agent-tools-today-2026-10-18/index.html index ffb9459f1..f08ea0d87 100644 --- a/docs/blog/agent-tools-today-2026-10-18/index.html +++ b/docs/blog/agent-tools-today-2026-10-18/index.html @@ -234,12 +234,28 @@

How this list is built diff --git a/docs/blog/agent-tools-today-2026-10-19/index.html b/docs/blog/agent-tools-today-2026-10-19/index.html new file mode 100644 index 000000000..5efea5ea3 --- /dev/null +++ b/docs/blog/agent-tools-today-2026-10-19/index.html @@ -0,0 +1,349 @@ + + + + + + + + +Agent Tools Today (19 Oct 2026): Launches, Skills, MCP Servers + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +

Agent Tools Today, 19 Oct 2026: DeepSeek Search API, Sphinx, OpenClaw 2026.10.5

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 19 Oct 2026, each with its source.

+ +
+ +
Hand drawn sketch: a front page with five numbered lines, a clock, and a yellow character reading it out
+ +
+
+

Agent tools today, 19 Oct 2026, in one line: DeepSeek opened its own web search to agents at $0.75 per 1,000 successful requests, a Git hook now quizzes you on your agent’s code before a push, and OpenClaw’s new release resumes interrupted turns after a Gateway restart. Every number was checked on 19 Oct. The last edition is 18 Oct.

+

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. It shipped no release in the last 24 hours, so it is not in the lists below.

+
Animation. On a white background, a parcel labelled git push waits in front of a raised drawbridge. A card from Sphinx asks: What happens on the retry? When a check marked Understood appears, the bridge lowers and the parcel rolls across to a flag marked origin/main.
How Sphinx pauses a push on a protected branch and asks one question about the diff, from the Sphinx site on 19 Oct 2026.
+

Top 3 launches

+
    +
  1. DeepSeek Search and Fetch API. DeepSeek’s change log, dated 17 Oct, opens the search engine behind its own web and API search to developers. The Search API finds pages for a query and returns structured results; the Fetch API returns one page as Markdown. Each costs $0.75 per 1,000 successful requests, and “Failed requests, empty search results, and timeouts are not billed.” When you use the DeepSeek API through Claude Code or Codex, its own search calls are free until billing starts on 1 Nov 2026, Beijing time. More than 550 points on Hacker News on 19 Oct. See DeepSeek V4.1 Flash 1017. Source
  2. +
  3. Sphinx. A Git hook that pauses a push on the branches you protect and asks you one question about what the diff does when things go wrong. Get it wrong and it explains why and tries a new scenario; get it right and the push continues. The site says it works with Codex, Claude Code, Cursor, OpenCode and Pi, or plain Git, and that “Your answers never reach the coding agent”. Created 14 Oct. MIT, more than 110 stars and more than 240 points on Hacker News on 19 Oct. Source
  4. +
  5. huashu-motion. A skill that has a coding agent such as Claude Code or Codex make a product launch video from one request. The README says the agent reads your product, offers three directions, writes the film and its own music, then opens an editor in the browser where you click on a frame to change only that part. Created 18 Oct. MIT, more than 460 stars on 19 Oct. Source
  6. +
+

Top 3 skills, MCP servers and plugins

+
    +
  1. Audio Studio MCP. It gives Claude Code, Claude Desktop, Cursor and other MCP clients “a sound studio that runs on your own Mac or Windows PC”: you ask for background music or a sound effect in plain language and Stable Audio 3 generates it. Every file gets a JSON sidecar “with its prompt, seed and settings”. Created 18 Oct. MIT, more than 100 stars on 19 Oct. Source
  2. +
  3. orchestrator. “A Claude Code skill that turns your main session into a dispatcher that never blocks.” Every task goes to a background subagent while the main session only plans, dispatches, tracks and reports, and a small ledger file tracks every agent and “survives context compaction”. Created 17 Oct. MIT, more than 45 stars on 19 Oct. See the Claude Code orchestration guide. Source
  4. +
  5. CVE Intel. A security tool written in Rust that ships as a “Desktop app, CLI, MCP server and REST API in one executable”. It gathers sources such as NVD, EPSS and CISA KEV so an agent or a person can decide whether a CVE needs a fix now. Created 18 Oct. GitHub lists the licence as Apache 2.0; more than 45 stars on 19 Oct. Source
  6. +
+

Top 3 moves from multi agent tools

+
    +
  1. OpenClaw v2026.10.5. Published 18 Oct. Interrupted turns, subagent work and deferred tasks now “resume after a Gateway restart”, openclaw update finishes and recovers on its own, a new channel plugin answers X mentions, and Google adds Gemini 4 Argon and Gemini 3.8 Flash to the model pickers. See OpenClaw alternatives. Source
  2. +
  3. LiteLLM v1.106.0. Published 18 Oct. A new Docker quickstart starts the gateway, Postgres and the admin UI with one command, and a second quickstart covers Windows in PowerShell. Source
  4. +
  5. OpenAI Python SDK v3.35.0. Published 17 Oct. It adds an “ultrafast service tier for Agents” and typed Live sideband events; v3.35.1 followed on 18 Oct with a fix for byte reads on websockets 13. Source
  6. +
+

Top 3 rising repos

+
    +
  1. tv-vibehack. “Your TV, minus the ads.” It strips the bloatware from an Android TV or Google TV over WiFi and replaces the home screen with a clean launcher, with “No root, no cable, nothing uninstalled”. The README says it was done with Claude Code talking to the real TV, and the prompt is in the repo. Created 17 Oct. More than 2,200 stars on 19 Oct; GitHub lists the licence as Other. Source
  2. +
  3. Athenaion. An ancient Greek world built in three.js with no external assets: “every mesh, texture, shader, tree, statue and waterfall is generated procedurally”. The README says Claude Code (Opus 5.5) built it over about 2 days to match 9 reference images. Created 17 Oct. MIT, more than 130 stars on 19 Oct. Source
  4. +
  5. tsc-ts. Vercel Labs’ experimental TypeScript port of the TypeScript 7.0.2 compiler (TypeScript-Go), compiled to native code with scriptc. Created 7 Oct. Apache 2.0, more than 330 stars on 19 Oct. Source
  6. +
+

New repos can gain stars quickly for reasons other than use, so treat these as names to watch, not recommendations.

+

Top 3 things people are arguing about

+
    +
  1. Junior hiring at Anthropic. Anthropic’s report on how employment is changing inside the company says the share of junior employees in technical departments “slipped from 21% to 14% since early 2025” and junior technical hires fell “from 27% to 9%”, while by August interactive AI agent hours outnumbered employees six to one. More than 100 points on Hacker News on 19 Oct. Source
  2. +
  3. A golden age or a dark age. A guest post by the mathematician Francesco Maggi on Terence Tao’s blog asks whether LLMs will bring a golden age or a dark age for mathematics and science. It says “The golden age scenario is achievable” and names steps such as access to frontier LLMs for researchers and reproducibility and disclosure standards. More than 120 points on Hacker News on 19 Oct. Source
  4. +
  5. Codex Desktop crash dumps. An open GitHub issue, filed on 2 June, says Codex Desktop on macOS keeps writing Crashpad dump files while the app stays usable; on the reporter’s Mac the folder “grew to 4.9G and 54,504 files in one day”. It had more than 160 points on Hacker News on 19 Oct. See what is Codex. Source
  6. +
+

How this list is built

+

Each day our agents read GitHub releases and new repos, vendor posts and the Hacker News front page about coding agents. A name only makes a list with a link that was opened and a signal that can be shown: points, stars or a dated release. Repos are checked against the GitHub API before they appear, and a claim that exists only as a social post is left out. New here? Start with the install guide.

+ + + + + + +
+ + +
+ + + + +
+ + +
+ +
+ + + + + + diff --git a/docs/blog/aider-vs-claude-code/index.html b/docs/blog/aider-vs-claude-code/index.html index 53b2719da..8cbfda47a 100644 --- a/docs/blog/aider-vs-claude-code/index.html +++ b/docs/blog/aider-vs-claude-code/index.html @@ -291,50 +291,50 @@

FAQ

Related in Comparisons

- +
- + 5 min
-

OpenCode Alternatives: 7 Coding Agents to Switch To

-

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.

+

Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

+

Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

Comparisons - Read → + Read →
- +
- + - 4 min + 5 min
-

Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

-

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.

+

OpenCode Alternatives: 7 Coding Agents to Switch To

+

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.

Comparisons - Read → + Read →
diff --git a/docs/blog/assets/media/agent-tools-today-2026-10-19/motion.css b/docs/blog/assets/media/agent-tools-today-2026-10-19/motion.css new file mode 100644 index 000000000..42847f586 --- /dev/null +++ b/docs/blog/assets/media/agent-tools-today-2026-10-19/motion.css @@ -0,0 +1,13 @@ +/* Bright coded scenes for "Agent tools today, 19 Oct 2026". Pairs with motion.js. */ +.prose figure.mg { margin: 42px 0; } +.prose figure.mg img, .mg .mg-svg { display: block; width: 100%; height: auto; border: 1px solid #1A1320; border-radius: 18px; background: #fff; } +.mg figcaption { font: 500 13px/1.5 "Space Grotesk", system-ui, sans-serif; color: #6B5878; padding-top: 10px; text-align: center; } +.mg .mg-svg { touch-action: manipulation; -webkit-tap-highlight-color: transparent; } +.mg .mg-svg text { -webkit-user-select: none; user-select: none; pointer-events: none; } +.mg .mg-hit { cursor: pointer; outline: none; } +.mg [role="slider"] { cursor: grab; touch-action: none; } +.mg .mg-ring { stroke-opacity: 0; transition: stroke-opacity 0.15s; } +.mg .mg-hit:focus-visible .mg-ring { stroke-opacity: 1; } +.mg [role="slider"]:focus-visible circle:nth-child(2) { stroke-width: 5; } +@media (hover: hover) { .mg .mg-hit:hover .mg-ring { stroke-opacity: 0.5; } } +@media (prefers-reduced-motion: reduce) { .mg .mg-ring { transition: none; } } diff --git a/docs/blog/assets/media/agent-tools-today-2026-10-19/motion.js b/docs/blog/assets/media/agent-tools-today-2026-10-19/motion.js new file mode 100644 index 000000000..547622aa4 --- /dev/null +++ b/docs/blog/assets/media/agent-tools-today-2026-10-19/motion.js @@ -0,0 +1,229 @@ +/* Bright coded scenes for "Agent tools today, 19 Oct 2026". Vanilla JS, no library. +
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 SC = {}; + + /* ---- a drawbridge: a git push parcel waits, Sphinx asks one question, the answer lowers the bridge ---- */ + SC.today = { + w: 1600, h: 1200, dur: 10, still: 7.7, + build(svg, api) { + const SW = 4, TAU = Math.PI * 2; + const A = (o) => Object.assign({ stroke: INK, "stroke-width": SW, "stroke-linejoin": "round", "stroke-linecap": "round" }, o); + const GY = 880, GL = 590, GR = 1010, LEAF = 432, CX = 800; + const T_ANS = 4.2, T_B0 = 4.8, T_B1 = 6.1, T_R0 = 6.7, T_R1 = 8.7; + const XS = -200, X0 = 330, X1 = 1350, WR = 29, RA = 76; + + /* sky: a sun and two clouds */ + const sun = el("g", {}, svg); + el("circle", A({ r: 50, fill: YEL }), sun); + for (let i = 0; i < 8; i++) { const a = (i * Math.PI) / 4; el("path", A({ d: `M${70 * Math.cos(a)} ${70 * Math.sin(a)} L${92 * Math.cos(a)} ${92 * Math.sin(a)}`, fill: "none" }), sun); } + const clouds = [[190, 490, 0, 1], [610, 470, 4, 0.85], [1430, 150, 2, 1]].map(([x, y, k, z]) => { + const g = el("g", {}, svg), m = (v) => (v * z).toFixed(1); + el("path", A({ d: `M${m(-96)} ${m(34)} A${m(30)} ${m(30)} 0 0 1 ${m(-70)} ${m(-14)} A${m(44)} ${m(44)} 0 0 1 ${m(4)} ${m(-40)} A${m(40)} ${m(40)} 0 0 1 ${m(72)} ${m(-6)} A${m(22)} ${m(22)} 0 0 1 ${m(96)} ${m(34)} Z`, fill: SOFT }), g); + return { g, x, y, k }; + }); + + /* the moat under the gap */ + const water = el("path", A({ fill: SKY }), svg); + + /* two banks with a strip of grass and a few stones */ + [[60, GL], [GR, 1540]].forEach(([a, b]) => { + el("path", A({ d: `M${a} ${GY} H${b} V1120 Q${b} 1140 ${b - 20} 1140 H${a + 20} Q${a} 1140 ${a} 1120 Z`, fill: SOFT }), svg); + el("rect", A({ x: a, y: GY, width: b - a, height: 30, fill: MINT }), svg); + }); + [[110, 960, 96], [250, 1050, 120], [420, 975, 84], [470, 1062, 74], [1090, 990, 90], [1250, 1060, 120], [1400, 970, 96]].forEach(([x, y, w]) => + el("rect", A({ x, y, width: w, height: 44, rx: 20, fill: LIL }), svg)); + + /* the tower that winds the chain */ + const PYX = 1060, PYY = 440; + el("rect", A({ x: PYX - 22, y: PYY, width: 44, height: GY - PYY, rx: 10, fill: LIL }), svg); + const chain = el("path", A({ fill: "none", "stroke-dasharray": "14 9" }), svg); + const pulley = el("g", {}, svg); + el("circle", A({ r: 26, fill: YEL }), pulley); + el("path", A({ d: "M-14 0 H14 M0 -14 V14", fill: "none" }), pulley); + tf(pulley, PYX, PYY); + + /* the bridge leaf, hinged on the far bank */ + const leaf = el("g", {}, svg); + el("rect", A({ x: -LEAF, y: 0, width: LEAF, height: 34, rx: 8, fill: BLUE }), leaf); + for (let x = -LEAF + 54; x < 0; x += 54) el("path", A({ d: `M${x} 0 V34`, fill: "none" }), leaf); + el("circle", A({ cx: GR, cy: GY + 17, r: 13, fill: YEL }), svg); + + /* the flag on the far side */ + const FX = 1522, FY0 = 470, FY1 = 580, FX1 = 1250; + el("rect", A({ x: FX - 8, y: 456, width: 16, height: GY - 456, rx: 6, fill: SOFT }), svg); + el("circle", A({ cx: FX, cy: 446, r: 16, fill: YEL }), svg); + const cloth = el("path", A({ fill: MINT }), svg); + txt(svg, (FX - 8 + FX1) / 2, 537, "origin/main", { "text-anchor": "middle", "font-family": MONO, "font-size": 32, "font-weight": 700 }); + + /* dust where the leaf lands */ + const dust = [[548, 866], [596, 852], [640, 868]].map(([x, y]) => ({ c: el("circle", A({ cx: x, cy: y, r: 0, fill: SOFT, opacity: 0 }), svg) })); + + /* the parcel on two wheels */ + const parcel = el("g", {}, svg); + const speed = [0, 1, 2].map(() => el("path", A({ fill: "none", opacity: 0 }), parcel)); + const body = el("g", {}, parcel); + el("rect", A({ x: -148, y: -270, width: 296, height: 212, rx: 16, fill: YEL }), body); + el("path", A({ d: "M-148 -224 H148", fill: "none" }), body); + el("rect", A({ x: -24, y: -270, width: 48, height: 46, fill: BLUE }), body); + el("rect", A({ x: -118, y: -192, width: 236, height: 88, rx: 14, fill: SOFT }), body); + txt(body, 0, -134, "git push", { "text-anchor": "middle", "font-family": MONO, "font-size": 40, "font-weight": 700 }); + const wheels = [-88, 88].map((x) => { + const w = el("g", {}, parcel); + el("circle", A({ r: WR, fill: SOFT }), w); + el("path", A({ d: "M-17 0 H17 M0 -17 V17", fill: "none" }), w); + return { w, x }; + }); + + /* sparkles when the parcel arrives */ + const sparks = [[1166, 560, YEL], [1140, 700, LIL], [1385, 408, SKY]].map(([x, y, c], i) => { + const g = el("g", { opacity: 0 }, svg); + el("path", A({ d: "M0 -26 Q0 0 26 0 Q0 0 0 26 Q0 0 -26 0 Q0 0 0 -26 Z", fill: c }), g); + return { g, x, y, i }; + }); + + /* the question card from Sphinx: tap it, or press Enter or Space, to answer */ + const card = el("g", { opacity: 0 }, svg); + const cin = el("g", {}, card); + el("rect", { x: 284, y: 66, width: 1032, height: 330, rx: 40, fill: "none", stroke: BLUE, "stroke-width": SW, class: "mg-ring" }, cin); + el("rect", A({ x: 300, y: 82, width: 1000, height: 298, rx: 28, fill: SOFT }), cin); + el("rect", A({ x: 334, y: 110, width: 170, height: 56, rx: 28, fill: LIL }), cin); + txt(cin, 419, 149, "Sphinx", { "text-anchor": "middle", "font-family": MONO, "font-size": 32, "font-weight": 700 }); + txt(cin, CX, 252, "What happens on the retry?", { "text-anchor": "middle", "font-size": 58, "font-weight": 700 }); + const slot = el("rect", A({ x: -160, y: -32, width: 320, height: 64, rx: 32, fill: "none", stroke: MUTE, "stroke-dasharray": "12 12" }), cin); + const pill = el("g", { opacity: 0 }, cin); + el("rect", A({ x: -158, y: -32, width: 316, height: 64, rx: 32, fill: MINT }), pill); + el("circle", A({ cx: -118, cy: 0, r: 20, fill: SOFT }), pill); + const chk = el("path", A({ d: "M-128 0 L-120 8 L-106 -8", fill: "none", "stroke-dasharray": 40, "stroke-dashoffset": 40 }), pill); + txt(pill, -86, 12, "Understood", { "font-size": 34, "font-weight": 700 }); + + let last = 0, lastNow = -99, kick = -99; + button(card, "Answer the question and lower the bridge", () => { + const playing = api.now() - lastNow < 0.25; + kick = api.now(); + if (!playing || last < T_ANS || last > T_R1) api.seek(T_ANS); + }); + + return (t, now = 0) => { + last = t; lastNow = now; + const out = 1 - io(seg(t, 9.4, 9.85)); + + /* sky and water move gently, in step with the loop */ + tf(sun, 170, 190, 1, t * 4.5); + clouds.forEach((c) => tf(c.g, c.x + 12 * Math.sin((TAU * t) / 10 + c.k), c.y)); + let d = `M${GL - 6} 1140`; + for (let x = GL - 6; x <= GR + 6; x += 12) d += ` L${x} ${(1016 + 7 * Math.sin(x / 34 - (TAU * t * 4) / 10)).toFixed(1)}`; + water.setAttribute("d", d + ` L${GR + 6} 1140 Z`); + + /* the bridge: up, then a drop with a small bounce, then back up for the next loop */ + let th = RA; + if (t >= T_B0 && t < T_B1) { const p = seg(t, T_B0, T_B1); th = RA * (1 - p * p); } + else if (t >= T_B1 && t < 9.3) { const u = t - T_B1; th = 6 * Math.abs(Math.sin(u * 9)) * Math.exp(-u * 6); } + else if (t >= 9.3) th = RA * io(seg(t, 9.3, 10)); + leaf.setAttribute("transform", `translate(${GR} ${GY}) rotate(${th})`); + const r = (th * Math.PI) / 180, tx = GR - LEAF * Math.cos(r), ty = GY - LEAF * Math.sin(r); + chain.setAttribute("d", `M${PYX} ${PYY} L${tx.toFixed(1)} ${ty.toFixed(1)}`); + tf(pulley, PYX, PYY, 1, th * 4); + dust.forEach((k, i) => { + const p = seg(t, T_B1 + i * 0.05, T_B1 + 0.6 + i * 0.05); + k.c.setAttribute("r", (20 * Math.sin(Math.PI * p)).toFixed(1)); + k.c.setAttribute("opacity", p > 0 && p < 1 ? 1 : 0); + }); + + /* the flag waves */ + const a = 7 * Math.sin((TAU * t * 8) / 10) + 5 * seg(t, T_R1, 9) * Math.sin((TAU * t * 16) / 10) * out; + const x0 = FX - 8, w3 = (FX1 - x0) / 3; + cloth.setAttribute("d", `M${x0} ${FY0} C${x0 + w3} ${FY0 - a} ${x0 + 2 * w3} ${FY0 + a} ${FX1} ${FY0} L${FX1} ${FY1} C${x0 + 2 * w3} ${FY1 + a} ${x0 + w3} ${FY1 - a} ${x0} ${FY1} Z`); + + /* the parcel rolls in, waits with small hops, then crosses */ + const pin = seg(t, 0, 1), pr = seg(t, T_R0, T_R1); + const px = t < T_R0 ? XS + (X0 - XS) * oc(pin) : X0 + (X1 - X0) * io(pr); + let tilt = 0, hop = 0; + if (t < 1) tilt = 5 * Math.sin(Math.PI * pin); + else if (t < T_R0) { const u = t - 1; tilt = 3 * Math.sin(u * 12) * Math.exp(-u * 5); } + else if (t < T_R1) tilt = -5 * Math.sin(TAU * pr); + else { const u = t - T_R1; tilt = 4 * Math.sin(u * 12) * Math.exp(-u * 5); } + if (t > 1.8 && t < T_B0) hop = 14 * Math.sin(Math.PI * seg(((t - 1.8) % 0.8) / 0.8, 0, 0.3)); + [GL - 12, GR].forEach((s) => wheels.forEach((w) => { hop += 5 * Math.exp(-Math.pow((px + w.x - s) / 14, 2)); })); + tf(parcel, px, GY - hop); + body.setAttribute("transform", `rotate(${tilt.toFixed(2)} 0 -58)`); + wheels.forEach((w) => tf(w.w, w.x, -WR, 1, ((px - XS) / WR) * (180 / Math.PI))); + parcel.setAttribute("opacity", out); + const v = t >= T_R0 && t < T_R1 ? Math.sin(Math.PI * pr) : 0; + speed.forEach((n, i) => { + const y = [-118, -170, -222][i], x = -172 - i * 10, len = 70 * v; + n.setAttribute("d", `M${x} ${y} H${(x - len).toFixed(1)}`); + n.setAttribute("opacity", v > 0.3 ? 1 : 0); + }); + + sparks.forEach((s) => { + const p = seg(t, T_R1 + s.i * 0.12, T_R1 + 0.3 + s.i * 0.12); + tf(s.g, s.x, s.y, ob(p) * out * (0.9 + 0.1 * Math.sin(t * 6 + s.i)), 12 * Math.sin(t * 2 + s.i)); + s.g.setAttribute("opacity", p > 0 ? 1 : 0); + }); + + /* the card drops in, bobs, takes the answer */ + const pc = seg(t, 1, 1.6), lt = now - kick, sq = lt >= 0 && lt < 0.35 ? Math.sin((Math.PI * lt) / 0.35) : 0; + const cs = (0.7 + 0.3 * ob(pc)) * (1 - 0.03 * sq), by = 5 * Math.sin((TAU * t * 4) / 10); + card.setAttribute("transform", `translate(${CX} ${231 + by}) scale(${cs}) translate(${-CX} -231)`); + card.setAttribute("opacity", (pc > 0 ? Math.min(1, pc * 3) : 0) * out); + const ps = seg(t, T_ANS, T_ANS + 0.4); + const pulse = 1 + 0.04 * Math.max(0, Math.sin((TAU * t * 8) / 10)); + slot.setAttribute("transform", `translate(${CX} 322) scale(${ps > 0 ? 1 : pulse})`); + slot.setAttribute("opacity", ps > 0 ? 0 : 1); + pill.setAttribute("transform", `translate(${CX} 322) scale(${cl(ob(ps), 0, 1.2)})`); + pill.setAttribute("opacity", ps > 0 ? 1 : 0); + chk.setAttribute("stroke-dashoffset", (40 * (1 - seg(t, T_ANS + 0.25, T_ANS + 0.55))).toFixed(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/docs/blog/assets/media/agent-tools-today-2026-10-19/today.png b/docs/blog/assets/media/agent-tools-today-2026-10-19/today.png new file mode 100644 index 000000000..1e854e747 Binary files /dev/null and b/docs/blog/assets/media/agent-tools-today-2026-10-19/today.png differ diff --git a/docs/blog/assets/media/hermes-agent-alternatives/bento.png b/docs/blog/assets/media/hermes-agent-alternatives/bento.png new file mode 100644 index 000000000..d49eec83a Binary files /dev/null and b/docs/blog/assets/media/hermes-agent-alternatives/bento.png differ diff --git a/docs/blog/assets/media/hermes-agent-alternatives/hero.png b/docs/blog/assets/media/hermes-agent-alternatives/hero.png new file mode 100644 index 000000000..3b063a5f1 Binary files /dev/null and b/docs/blog/assets/media/hermes-agent-alternatives/hero.png differ diff --git a/docs/blog/assets/media/hermes-agent-alternatives/lift.png b/docs/blog/assets/media/hermes-agent-alternatives/lift.png new file mode 100644 index 000000000..a66bd3c8d Binary files /dev/null and b/docs/blog/assets/media/hermes-agent-alternatives/lift.png differ diff --git a/docs/blog/assets/media/hermes-agent-alternatives/motion.css b/docs/blog/assets/media/hermes-agent-alternatives/motion.css new file mode 100644 index 000000000..2cea74a26 --- /dev/null +++ b/docs/blog/assets/media/hermes-agent-alternatives/motion.css @@ -0,0 +1,13 @@ +/* Bright coded scenes for "Hermes Agent alternatives". Pairs with motion.js. */ +.prose figure.mg { margin: 42px 0; } +.prose figure.mg img, .mg .mg-svg { display: block; width: 100%; height: auto; border: 1px solid #1A1320; border-radius: 18px; background: #fff; } +.mg figcaption { font: 500 13px/1.5 "Space Grotesk", system-ui, sans-serif; color: #6B5878; padding-top: 10px; text-align: center; } +.mg .mg-svg { touch-action: manipulation; -webkit-tap-highlight-color: transparent; } +.mg .mg-svg text { -webkit-user-select: none; user-select: none; pointer-events: none; } +.mg .mg-hit { cursor: pointer; outline: none; } +.mg [role="slider"] { cursor: grab; touch-action: none; } +.mg .mg-ring { stroke-opacity: 0; transition: stroke-opacity 0.15s; } +.mg .mg-hit:focus-visible .mg-ring { stroke-opacity: 1; } +.mg [role="slider"]:focus-visible circle:nth-child(2) { stroke-width: 5; } +@media (hover: hover) { .mg .mg-hit:hover .mg-ring { stroke-opacity: 0.5; } } +@media (prefers-reduced-motion: reduce) { .mg .mg-ring { transition: none; } } diff --git a/docs/blog/assets/media/hermes-agent-alternatives/motion.js b/docs/blog/assets/media/hermes-agent-alternatives/motion.js new file mode 100644 index 000000000..f2c6f0253 --- /dev/null +++ b/docs/blog/assets/media/hermes-agent-alternatives/motion.js @@ -0,0 +1,292 @@ +/* Bright coded scenes for "Hermes Agent alternatives". Vanilla JS, no library. +
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 SW = 4; + 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": 36, "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(); } }); + }; + // a pill with centred text, sized to the text + const chip = (p, cx, cy, s, fill, size = 34, a = {}) => { + const g = el("g", {}, p), r = el("rect", { fill, stroke: INK, "stroke-width": SW }, g); + const t = txt(g, cx, cy + size * 0.35, s, Object.assign({ "text-anchor": "middle", "font-size": size, "font-weight": 700 }, a)); + const w = t.getComputedTextLength() + size * 1.3, h = size * 1.8; + r.setAttribute("x", cx - w / 2); r.setAttribute("y", cy - h / 2); r.setAttribute("width", w); r.setAttribute("height", h); r.setAttribute("rx", h / 2); + return g; + }; + + const SC = {}; + + /* ---- 1. a bento box fills one name at a time ---- */ + SC.bento = { + w: 1600, h: 1200, dur: 11, still: 8.6, + build(svg, api) { + txt(svg, 60, 128, "Seven alternatives", { "font-size": 68, "font-weight": 700 }); + const sticks = el("g", {}, svg); + [[0, YEL], [40, MINT]].forEach(([dy, c]) => el("path", { d: `M0 ${dy - 13} L560 ${dy - 7} Q568 ${dy} 560 ${dy + 7} L0 ${dy + 13} Q-10 ${dy} 0 ${dy - 13} Z`, fill: c, stroke: INK, "stroke-width": SW, "stroke-linejoin": "round" }, sticks)); + tf(sticks, 960, 84, 1, 3); + const B = { x: 60, y: 300, w: 1480, h: 840 }, pad = 30, gap = 22, RW = 360; + el("rect", { x: B.x, y: B.y, width: B.w, height: B.h, rx: 44, fill: LIL, stroke: INK, "stroke-width": SW }, svg); + const iy = B.y + pad, ih = B.h - pad * 2, lx = B.x + pad, rx = B.x + B.w - pad - RW, lw = rx - 30 - lx; + const cw = (lw - gap * 2) / 3, ch = (ih - gap) / 2; + const bracket = (x0, x1, label, fill) => { + el("path", { d: `M${x0 + 6} 284 V240 H${x1 - 6} V284`, fill: "none", stroke: INK, "stroke-width": SW, "stroke-linecap": "round", "stroke-linejoin": "round" }, svg); + chip(svg, (x0 + x1) / 2, 240, label, fill, 34); + }; + bracket(lx, lx + lw, "free and open source", MINT); + bracket(rx, rx + RW, "hosted", BLUE); + const ITEMS = [ + ["OpenClaw", "MIT", YEL], ["Munder|Difflin", "MIT", MINT], ["NanoClaw", "MIT", SKY], + ["ZeroClaw", "MIT or Apache 2.0", SKY], ["nanobot", "MIT", YEL], ["Goose", "Apache 2.0", MINT], + ["Claude", "Proprietary", BLUE], + ]; + const parts = ITEMS.map(([name, lic, col], i) => { + const big = i === 6; + const x = big ? rx : lx + (i % 3) * (cw + gap), y = big ? iy : iy + Math.floor(i / 3) * (ch + gap), w = big ? RW : cw, h = big ? ih : ch; + const cx = x + w / 2, cy = y + h / 2, pw = big ? 290 : 270, ph = big ? 520 : 210; + const g = el("g", {}, svg); + el("rect", { x, y, width: w, height: h, rx: 24, fill: "#fff", stroke: INK, "stroke-width": SW }, g); + el("rect", { x: x - 9, y: y - 9, width: w + 18, height: h + 18, rx: 30, fill: "none", stroke: INK, "stroke-width": SW, "stroke-dasharray": "6 8", class: "mg-ring" }, g); + const ly = big ? cy + 215 : cy + 62; + const licT = txt(g, cx, ly, lic, { "text-anchor": "middle", "font-size": 32, "font-weight": 600, fill: MUTE, opacity: 0 }); + const piece = el("g", {}, g); + el("rect", { x: -pw / 2, y: -ph / 2, width: pw, height: ph, rx: 36, fill: col, stroke: INK, "stroke-width": SW }, piece); + [[-pw / 2 + 36, -ph / 2 + 32], [-pw / 2 + 64, -ph / 2 + 26], [-pw / 2 + 52, -ph / 2 + 52]].forEach(([dx, dy]) => el("ellipse", { cx: dx, cy: dy, rx: 10, ry: 6.5, fill: "#fff", stroke: INK, "stroke-width": SW }, piece)); + const lines = name.split("|"); + lines.forEach((s, j) => txt(piece, 0, 15 + (j - (lines.length - 1) / 2) * 50, s, { "text-anchor": "middle", "font-size": big ? 48 : 42, "font-weight": 700 })); + const st = { on: false, at: -9 }; + button(g, `${lines.join(" ")}: ${lic}`, () => { st.on = !st.on; st.at = api.now(); api.poke(); }); + return { piece, licT, cx, cy, lift: big ? 130 : 112, st, d: 0.5 + i * 0.85 }; + }); + return (t, now) => { + const out = io(seg(t, 9.9, 10.7)); + parts.forEach((p) => { + const k = seg(t, p.d, p.d + 0.6), drop = ob(k); + const m = oc(seg(now - p.st.at, 0, 0.35)), lift = p.st.on ? m : 1 - m; + p.licT.setAttribute("opacity", lift); tf(p.piece, p.cx, p.cy - 260 * (1 - drop) - p.lift * lift - 40 * out, 1, -5 * lift); + p.piece.setAttribute("opacity", k <= 0 ? 0 : Math.min(1, k * 4) * (1 - out)); + }); + }; + }, + }; + + /* ---- 2. a lift call panel: pick a floor, see who runs there ---- */ + SC.lift = { + w: 1600, h: 1200, dur: 10.5, still: 2.4, + build(svg, api) { + const P = 3.5; + txt(svg, 60, 128, "Pick by whose computer does the work", { "font-size": 58, "font-weight": 700 }); + // lift doors behind the cards + el("rect", { x: 780, y: 190, width: 760, height: 950, rx: 28, fill: "#fff", stroke: INK, "stroke-width": SW }, svg); + el("rect", { x: 806, y: 216, width: 342, height: 924, rx: 10, fill: SOFT, stroke: INK, "stroke-width": SW }, svg); + el("rect", { x: 1172, y: 216, width: 342, height: 924, rx: 10, fill: SOFT, stroke: INK, "stroke-width": SW }, svg); + const FL = [ + ["your computer", ["OpenClaw", "Munder Difflin", "NanoClaw", "ZeroClaw", "Goose", "Hermes Agent", "nanobot"]], + ["a server", ["Hermes Agent", "nanobot"]], + ["Anthropic's servers", ["Claude"]], + ]; + const DOTC = [YEL, MINT, SKY, LIL, BLUE]; + const clip = el("clipPath", { id: "mg-lift-clip" }, el("defs", {}, svg)); + el("rect", { x: 744, y: 0, width: 900, height: 1200 }, clip); + const deck = el("g", { "clip-path": "url(#mg-lift-clip)" }, svg); + const cards = FL.map(([label, picks]) => { + const h = 150 + picks.length * 106 + 20, oy = Math.round(678 - h / 2) - 250, g = el("g", {}, deck), gi = el("g", { transform: `translate(0 ${oy})` }, g); + el("rect", { x: 830, y: 250, width: 660, height: h, rx: 30, fill: "#fff", stroke: INK, "stroke-width": SW }, gi); + chip(gi, 1160, 326, label, YEL, 40); + el("path", { d: "M870 392 H1450", stroke: INK, "stroke-width": SW, "stroke-dasharray": "2 12", "stroke-linecap": "round" }, gi); + picks.forEach((s, j) => { + const y = 410 + j * 106; + el("rect", { x: 880, y: y + 26, width: 44, height: 44, rx: 12, fill: DOTC[j % 5], stroke: INK, "stroke-width": SW }, gi); + txt(gi, 952, y + 64, s, { "font-size": 46, "font-weight": 700 }); + }); + return g; + }); + // the call panel + el("rect", { x: 60, y: 190, width: 660, height: 950, rx: 36, fill: SOFT, stroke: INK, "stroke-width": SW }, svg); + [[96, 226], [684, 226], [96, 1104], [684, 1104]].forEach(([x, y]) => { el("circle", { cx: x, cy: y, r: 10, fill: "#fff", stroke: INK, "stroke-width": SW }, svg); el("path", { d: `M${x - 5} ${y} H${x + 5}`, stroke: INK, "stroke-width": SW, "stroke-linecap": "round" }, svg); }); + el("rect", { x: 150, y: 250, width: 480, height: 120, rx: 22, fill: "#fff", stroke: INK, "stroke-width": SW }, svg); + const lamps = [0, 1, 2].map((i) => el("circle", { cx: 440 + i * 56, cy: 310, r: 16, fill: "#fff", stroke: INK, "stroke-width": SW }, svg)); + const arrowClip = el("clipPath", { id: "mg-lift-arrow" }, el("defs", {}, svg)); + el("rect", { x: 170, y: 262, width: 200, height: 96 }, arrowClip); + const aw = el("g", { "clip-path": "url(#mg-lift-arrow)" }, svg), arrow = el("path", { d: "M0 -30 L34 10 H14 V30 H-14 V10 H-34 Z", fill: BLUE, stroke: INK, "stroke-width": SW, "stroke-linejoin": "round" }, aw); + const ICON = [ + (g) => { el("rect", { x: -32, y: -28, width: 64, height: 42, rx: 6, fill: "#fff", stroke: INK, "stroke-width": SW }, g); el("path", { d: "M-42 22 H42 L36 30 H-36 Z", fill: "#fff", stroke: INK, "stroke-width": SW, "stroke-linejoin": "round" }, g); }, + (g) => { [-24, 4].forEach((y) => { el("rect", { x: -32, y, width: 64, height: 24, rx: 5, fill: "#fff", stroke: INK, "stroke-width": SW }, g); el("circle", { cx: 18, cy: y + 12, r: 4, fill: INK }, g); el("path", { d: `M-20 ${y + 12} H2`, stroke: INK, "stroke-width": SW, "stroke-linecap": "round" }, g); }); }, + (g) => { el("path", { d: "M-30 20 Q-46 20 -46 6 Q-46 -10 -28 -10 Q-24 -30 -2 -30 Q20 -30 24 -10 Q44 -10 44 6 Q44 20 28 20 Z", fill: "#fff", stroke: INK, "stroke-width": SW, "stroke-linejoin": "round" }, g); }, + ]; + const btns = FL.map(([label], i) => { + const cy = 520 + i * 220, g = el("g", {}, svg); + el("rect", { x: 92, y: cy - 92, width: 596, height: 184, rx: 30, fill: "#fff", "fill-opacity": 0, stroke: INK, "stroke-width": SW, "stroke-dasharray": "6 8", class: "mg-ring" }, g); + const glow = el("circle", { cx: 180, cy, r: 84, fill: YEL, "fill-opacity": 0.4 }, g); + const face = el("g", {}, g), disc = el("circle", { r: 64, fill: "#fff", stroke: INK, "stroke-width": SW }, face); + ICON[i](el("g", {}, face)); + tf(face, 180, cy); + txt(g, 276, cy + 13, label, { "font-size": 37, "font-weight": 700 }); + button(g, `${label}: ${FL[i][1].join(", ")}`, () => api.seek(i * P + 0.01)); + return { glow, face, disc, cy }; + }); + txt(svg, 390, 1078, "Tap a button to change floors.", { "text-anchor": "middle", "font-size": 31, "font-weight": 500, fill: MUTE }); + return (t) => { + const i = Math.floor(t / P) % 3, u = (t % P) / P, prev = (i + 2) % 3; + btns.forEach((b, j) => { + const on = j === i, press = on ? Math.sin(Math.PI * seg(u, 0, 0.09)) : 0; + b.disc.setAttribute("fill", on ? YEL : "#fff"); b.glow.setAttribute("fill-opacity", on ? 0.4 * oc(seg(u, 0.03, 0.12)) : 0); + tf(b.face, 180, b.cy, 1 - 0.1 * press); + }); + lamps.forEach((l, j) => l.setAttribute("fill", j === i ? YEL : "#fff")); + const up = i > prev, m = io(seg(u, 0.02, 0.3)); + tf(arrow, 270, 310 + (up ? 1 : -1) * (90 - 90 * m), 1, up ? 0 : 180); + cards.forEach((c, j) => { + const k = j === i ? oc(seg(u, 0.1, 0.26)) * (1 - io(seg(u, 0.88, 1))) : 0; + c.setAttribute("transform", `translate(${-760 * (1 - k)} 0)`); c.setAttribute("opacity", k <= 0 ? 0 : 1); + }); + }; + }, + }; + + /* ---- 3. two taps: the software pours free, the model fills its own glass ---- */ + SC.taps = { + w: 1600, h: 1200, dur: 10, still: 6.5, + build(svg) { + txt(svg, 60, 128, "The software costs nothing", { "font-size": 68, "font-weight": 700 }); + el("rect", { x: 60, y: 180, width: 1480, height: 600, rx: 28, fill: SOFT }, svg); + for (let x = 160; x < 1540; x += 100) el("path", { d: `M${x} 180 V780`, stroke: "#fff", "stroke-width": SW }, svg); + for (let y = 280; y < 780; y += 100) el("path", { d: `M60 ${y} H1540`, stroke: "#fff", "stroke-width": SW }, svg); + el("rect", { x: 60, y: 180, width: 1480, height: 600, rx: 28, fill: "none", stroke: INK, "stroke-width": SW }, svg); + // counter and basin + el("path", { d: "M230 800 V1060 Q230 1120 290 1120 H1310 Q1370 1120 1370 1060 V800", fill: "#fff", stroke: INK, "stroke-width": SW }, svg); + el("rect", { x: 60, y: 760, width: 1480, height: 56, rx: 14, fill: YEL, stroke: INK, "stroke-width": SW }, svg); + el("ellipse", { cx: 800, cy: 1098, rx: 38, ry: 9, fill: SOFT, stroke: INK, "stroke-width": SW }, svg); + const G = [ + { cx: 470, wt: 300, wb: 256, top: 640, bot: 1090, tap: 300, label: "software", col: MINT, sw: 40, fill: [0.7, 3.0], full: 1, sticker: ["free"], fs: 66 }, + { cx: 1130, wt: 420, wb: 372, top: 640, bot: 1090, tap: 960, label: "model", col: LIL, sw: 16, fill: [1.4, 6.2], full: 0.8, sticker: ["your API key,", "your plan", "or a local model"], fs: 34 }, + ]; + const defs = el("defs", {}, svg); + const run = G.map((g, gi) => { + const L = g.cx - g.wt / 2, R = g.cx + g.wt / 2, l = g.cx - g.wb / 2, r = g.cx + g.wb / 2; + const shape = `M${L} ${g.top} L${l} ${g.bot - 22} Q${l} ${g.bot} ${l + 22} ${g.bot} H${r - 22} Q${r} ${g.bot} ${r} ${g.bot - 22} L${R} ${g.top} Z`; + const cp = el("clipPath", { id: `mg-glass-${gi}` }, defs); el("path", { d: shape }, cp); + el("path", { d: shape, fill: "#fff" }, svg); + const wg = el("g", { "clip-path": `url(#mg-glass-${gi})` }, svg); + const water = el("rect", { x: L - 10, width: g.wt + 20, y: g.bot, height: 0, fill: SKY }, wg); + const bubbles = Array.from({ length: 7 }, (_, j) => el("circle", { r: 7 + (j % 3) * 3, fill: "#fff" }, wg)); + // the tap + const ny = 470, nx = g.cx; + const stream = el("rect", { x: nx - g.sw / 2, y: ny, width: g.sw, height: 0, rx: g.sw / 2, fill: SKY, stroke: INK, "stroke-width": SW }, svg); + el("rect", { x: g.tap - 46, y: 330, width: 92, height: 120, rx: 22, fill: "#fff", stroke: INK, "stroke-width": SW }, svg); + el("path", { d: `M${g.tap} 366 H${nx + 6} Q${nx + 34} 366 ${nx + 34} 394 V470 H${nx - 34} V418 H${g.tap} Z`, fill: "#fff", stroke: INK, "stroke-width": SW, "stroke-linejoin": "round" }, svg); + el("rect", { x: nx - 40, y: 458, width: 80, height: 24, rx: 8, fill: "#fff", stroke: INK, "stroke-width": SW }, svg); + const hx = g.tap + 70; + el("rect", { x: hx - 12, y: 300, width: 24, height: 68, fill: "#fff", stroke: INK, "stroke-width": SW }, svg); + const lever = el("g", {}, svg); + el("rect", { x: -16, y: -18, width: 150, height: 36, rx: 18, fill: g.col, stroke: INK, "stroke-width": SW }, lever); + el("circle", { r: 26, fill: g.col, stroke: INK, "stroke-width": SW }, lever); + chip(svg, hx + 160, 240, g.label, g.col, 40); + // glass outline and sticker + el("path", { d: shape, fill: "none", stroke: INK, "stroke-width": SW, "stroke-linejoin": "round" }, svg); + el("path", { d: `M${L + 24} ${g.top + 40} L${l + 26} ${g.bot - 60}`, stroke: "#fff", "stroke-width": SW * 2, "stroke-linecap": "round", opacity: 0.9 }, svg); + const sh = g.sticker.length * g.fs * 1.25 + 44, sw = g.sticker.length > 1 ? 350 : 210, sy = 880 - sh / 2; + el("rect", { x: g.cx - sw / 2, y: sy, width: sw, height: sh, rx: 22, fill: "#fff", stroke: INK, "stroke-width": SW }, svg); + g.sticker.forEach((s, j) => txt(svg, g.cx, sy + 22 + g.fs * 0.95 + j * g.fs * 1.25, s, { "text-anchor": "middle", "font-size": g.fs, "font-weight": 700 })); + const drops = Array.from({ length: gi ? 3 : 6 }, () => el("circle", { r: gi ? 9 : 12, fill: SKY, stroke: INK, "stroke-width": SW }, svg)); + const spill = gi ? [] : Array.from({ length: 4 }, () => el("ellipse", { rx: 11, ry: 15, fill: SKY, stroke: INK, "stroke-width": SW }, svg)); + return { g, water, bubbles, stream, lever, hx, drops, spill, ny, L, R }; + }); + return (t) => { + run.forEach((o, gi) => { + const g = o.g, open = seg(t, g.fill[0] - 0.5, g.fill[0] - 0.1) * (1 - seg(t, 8.0, 8.3)); + tf(o.lever, o.hx, 300, 1, 180 + 32 * open); + const span = g.bot - g.top - 30, lv = g.full * oc(seg(t, g.fill[0], g.fill[1])) * (1 - io(seg(t, 8.4, 9.6))); + const surf = g.bot - span * lv; + o.water.setAttribute("y", surf); o.water.setAttribute("height", g.bot - surf + 10); + const on = t > g.fill[0] - 0.15 && t < 8.3, head = Math.min(surf, o.ny + (t - (g.fill[0] - 0.15)) * 2600); + const tail = t < 8.0 ? o.ny : o.ny + (t - 8.0) * 2600; + o.stream.setAttribute("y", tail); o.stream.setAttribute("height", on ? Math.max(0, head - tail) : 0); + o.bubbles.forEach((b, j) => { + const ph = (t * (0.5 + (j % 3) * 0.17) + j * 0.37) % 1, by = g.bot - 20 - ph * (g.bot - surf - 20); + b.setAttribute("cx", g.cx - g.wb / 2 + 40 + ((j * 71) % (g.wb - 80))); b.setAttribute("cy", by); + b.setAttribute("opacity", lv > 0.05 && by > surf + 12 ? 1 : 0); + }); + o.drops.forEach((d, j) => { + const ph = (t * 1.6 + j / o.drops.length) % 1, side = j % 2 ? 1 : -1, dx = side * (30 + j * 9) * ph; + d.setAttribute("cx", g.cx + dx); d.setAttribute("cy", surf - 70 * ph + 120 * ph * ph); + d.setAttribute("r", (gi ? 9 : 12) * (1 - 0.6 * ph)); d.setAttribute("opacity", on && head >= surf - 1 && ph < 0.85 ? 1 : 0); + }); + o.spill.forEach((s, j) => { + const ph = (t * 0.9 + j * 0.25) % 1, side = j % 2 ? 1 : -1, x = side > 0 ? o.R + 6 - 22 * ph : o.L - 6 + 22 * ph; + s.setAttribute("cx", x); s.setAttribute("cy", g.top + 6 + ph * (g.bot - g.top - 10)); + s.setAttribute("opacity", lv > 0.99 && on && ph < 0.92 ? 1 : 0); + }); + }); + }; + }, + }; + + /* ---- title card, 16 by 9 ---- */ + SC.hero = { + w: 1600, h: 900, dur: 1, still: 0, + build(svg) { + txt(svg, 84, 196, "7 picks for chat, code and cloud", { "font-family": MONO, "font-size": 34, "font-weight": 700, fill: MUTE }); + txt(svg, 78, 360, "Hermes Agent", { "font-size": 132, "font-weight": 700 }); + txt(svg, 78, 512, "alternatives", { "font-size": 132, "font-weight": 700 }); + el("rect", { x: 84, y: 548, width: 760, height: 20, rx: 10, fill: YEL }, svg); + const ck = el("g", {}, svg); el("circle", { r: 24, fill: MINT, stroke: INK, "stroke-width": SW }, ck); el("path", { d: "M-11 1 L-3 9 L12 -8", fill: "none", stroke: INK, "stroke-width": SW, "stroke-linecap": "round", "stroke-linejoin": "round" }, ck); tf(ck, 108, 650); + txt(svg, 150, 664, "Checked 19 Oct 2026", { "font-size": 40, "font-weight": 600 }); + const trail = "M90 800 C420 860 700 760 900 760 C1080 760 1150 700 1110 640 C1070 580 990 620 1010 680 C1030 740 1120 700 1168 616"; + el("path", { d: trail, stroke: SOFT, "stroke-width": 26, fill: "none", "stroke-linecap": "round" }, svg); + el("path", { d: trail, stroke: INK, "stroke-width": SW, fill: "none", "stroke-dasharray": "2 16", "stroke-linecap": "round" }, svg); + const plane = el("g", {}, svg); + el("path", { d: "M170 0 L-150 -110 L-40 4 Z", fill: SKY, stroke: INK, "stroke-width": SW, "stroke-linejoin": "round" }, plane); + el("path", { d: "M170 0 L-40 4 L-90 92 Z", fill: BLUE, stroke: INK, "stroke-width": SW, "stroke-linejoin": "round" }, plane); + el("path", { d: "M170 0 L-40 4 L-150 40 Z", fill: "#fff", stroke: INK, "stroke-width": SW, "stroke-linejoin": "round" }, plane); + tf(plane, 1320, 470, 1.25, -28); + const star = (x, y, s, c) => { const g = el("g", {}, svg); el("path", { d: "M0 -22 Q4 -4 22 0 Q4 4 0 22 Q-4 4 -22 0 Q-4 -4 0 -22 Z", fill: c, stroke: INK, "stroke-width": SW, "stroke-linejoin": "round" }, g); tf(g, x, y, s); }; + star(1470, 190, 1.4, YEL); star(1160, 230, 1, LIL); star(1500, 690, 1.1, MINT); star(1300, 790, 0.9, YEL); + return () => {}; + }, + }; + + /* ---- 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/docs/blog/assets/media/hermes-agent-alternatives/taps.png b/docs/blog/assets/media/hermes-agent-alternatives/taps.png new file mode 100644 index 000000000..c3e21d318 Binary files /dev/null and b/docs/blog/assets/media/hermes-agent-alternatives/taps.png differ diff --git a/docs/blog/assets/media/kilo-code-vs-cline/belts.png b/docs/blog/assets/media/kilo-code-vs-cline/belts.png new file mode 100644 index 000000000..5a75af0a9 Binary files /dev/null and b/docs/blog/assets/media/kilo-code-vs-cline/belts.png differ diff --git a/docs/blog/assets/media/kilo-code-vs-cline/hero.png b/docs/blog/assets/media/kilo-code-vs-cline/hero.png new file mode 100644 index 000000000..6bc842d35 Binary files /dev/null and b/docs/blog/assets/media/kilo-code-vs-cline/hero.png differ diff --git a/docs/blog/assets/media/kilo-code-vs-cline/motion.css b/docs/blog/assets/media/kilo-code-vs-cline/motion.css new file mode 100644 index 000000000..36fc49a3d --- /dev/null +++ b/docs/blog/assets/media/kilo-code-vs-cline/motion.css @@ -0,0 +1,13 @@ +/* Bright coded scenes for "Kilo Code vs Cline". Pairs with motion.js. */ +.prose figure.mg { margin: 42px 0; } +.prose figure.mg img, .mg .mg-svg { display: block; width: 100%; height: auto; border: 1px solid #1A1320; border-radius: 18px; background: #fff; } +.mg figcaption { font: 500 13px/1.5 "Space Grotesk", system-ui, sans-serif; color: #6B5878; padding-top: 10px; text-align: center; } +.mg .mg-svg { touch-action: manipulation; -webkit-tap-highlight-color: transparent; } +.mg .mg-svg text { -webkit-user-select: none; user-select: none; pointer-events: none; } +.mg .mg-hit { cursor: pointer; outline: none; } +.mg [role="slider"] { cursor: grab; touch-action: none; } +.mg .mg-ring { stroke-opacity: 0; transition: stroke-opacity 0.15s; } +.mg .mg-hit:focus-visible .mg-ring { stroke-opacity: 1; } +.mg [role="slider"]:focus-visible circle:nth-child(2) { stroke-width: 5; } +@media (hover: hover) { .mg .mg-hit:hover .mg-ring { stroke-opacity: 0.5; } } +@media (prefers-reduced-motion: reduce) { .mg .mg-ring { transition: none; } } diff --git a/docs/blog/assets/media/kilo-code-vs-cline/motion.js b/docs/blog/assets/media/kilo-code-vs-cline/motion.js new file mode 100644 index 000000000..c0f5351fd --- /dev/null +++ b/docs/blog/assets/media/kilo-code-vs-cline/motion.js @@ -0,0 +1,338 @@ +/* Bright coded scenes for "Kilo Code vs Cline". Vanilla JS, no library. +
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": 34, "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(); } }); + }; + /* shrink a label until it fits, never below 30 units in a 1600 wide drawing */ + const fit = (n, max, min = 30) => { let s = parseFloat(n.getAttribute("font-size")); try { while (n.getComputedTextLength() > max && s > min) { s -= 1; n.setAttribute("font-size", s); } } catch (e) {} return n; }; + /* a shape drawn three times: soft base, a colour layer that fades in, then the ink outline */ + const layered = (tag, a, p, base, col, sw = 4) => { + el(tag, Object.assign({}, a, { fill: base }), p); + const top = el(tag, Object.assign({}, a, { fill: col, opacity: 0 }), p); + el(tag, Object.assign({}, a, { fill: "none", stroke: INK, "stroke-width": sw, "stroke-linejoin": "round" }), p); + return top; + }; + + const SC = {}; + + /* ---- 1. two tool belts, pouches fill one by one ---- */ + const TOOLS = [ + (g, c) => { // screwdriver handle + el("rect", { x: -6, y: -40, width: 12, height: 80, fill: "#fff", stroke: INK, "stroke-width": 4 }, g); + el("rect", { x: -18, y: -104, width: 36, height: 72, rx: 14, fill: c, stroke: INK, "stroke-width": 4 }, g); + el("path", { d: "M-18 -56 H18", stroke: INK, "stroke-width": 4 }, g); + }, + (g, c) => { // wrench + el("rect", { x: -10, y: -76, width: 20, height: 120, rx: 8, fill: c, stroke: INK, "stroke-width": 4 }, g); + el("circle", { cx: 0, cy: -90, r: 26, fill: c, stroke: INK, "stroke-width": 4 }, g); + el("rect", { x: -9, y: -122, width: 18, height: 28, fill: "#fff" }, g); + el("path", { d: "M-9 -114 V-96 H9 V-114", fill: "none", stroke: INK, "stroke-width": 4, "stroke-linejoin": "round" }, g); + }, + (g, c) => { // pencil + el("rect", { x: -15, y: -96, width: 30, height: 140, fill: c, stroke: INK, "stroke-width": 4 }, g); + el("path", { d: "M-15 -96 L0 -126 L15 -96 Z", fill: "#fff", stroke: INK, "stroke-width": 4, "stroke-linejoin": "round" }, g); + el("path", { d: "M-5 -116 L0 -126 L5 -116 Z", fill: INK }, g); + }, + (g, c) => { // ruler + el("rect", { x: -22, y: -100, width: 44, height: 150, rx: 5, fill: c, stroke: INK, "stroke-width": 4 }, g); + el("path", { d: "M-22 -84 H-6 M-22 -68 H-12 M-22 -52 H-6 M-22 -36 H-12", stroke: INK, "stroke-width": 4 }, g); + }, + (g, c) => { // hammer + el("rect", { x: -8, y: -86, width: 16, height: 130, rx: 6, fill: "#fff", stroke: INK, "stroke-width": 4 }, g); + el("rect", { x: -42, y: -116, width: 84, height: 34, rx: 10, fill: c, stroke: INK, "stroke-width": 4 }, g); + }, + ]; + SC.belts = { + w: 1600, h: 1200, dur: 11, still: 7.5, + build(svg) { + txt(svg, 60, 122, "Where each one runs", { "font-size": 58, "font-weight": 700 }); + const note = txt(svg, 1540, 120, "", { "text-anchor": "end", "font-size": 36, "font-weight": 600 }); + const dot = el("circle", { r: 13, cy: 108, stroke: INK, "stroke-width": 4 }, svg); + const SHARED = { "VS Code": 1, JetBrains: 1, CLI: 1 }; + const AT = { "VS Code": 0.8, JetBrains: 1.6, CLI: 2.4, cloud: 3.6, "desktop app": 4.4, SDK: 5.2 }; + const rows = [ + { name: "Kilo Code", oy: 0, items: ["VS Code", "JetBrains", "CLI", "cloud"] }, + { name: "Cline", oy: 486, items: ["VS Code", "JetBrains", "CLI", "desktop app", "SDK"] }, + ]; + const pouches = []; + let tk = 0; + rows.forEach((r) => { + const oy = r.oy, n = r.items.length, gap = 26, pw = (1340 - gap * (n - 1)) / n, top = 368 + oy, h = 250; + txt(svg, 60, 216 + oy, r.name, { "font-size": 52, "font-weight": 700 }); + el("rect", { x: 60, y: 350 + oy, width: 1480, height: 60, rx: 16, fill: BLUE, stroke: INK, "stroke-width": 4 }, svg); + el("path", { d: `M180 ${363 + oy} H1526 M180 ${397 + oy} H1526`, stroke: INK, "stroke-width": 3, "stroke-dasharray": "12 10", fill: "none" }, svg); + el("rect", { x: 66, y: 334 + oy, width: 98, height: 92, rx: 16, fill: YEL, stroke: INK, "stroke-width": 4 }, svg); + el("rect", { x: 88, y: 356 + oy, width: 54, height: 48, rx: 8, fill: BLUE, stroke: INK, "stroke-width": 4 }, svg); + el("path", { d: `M88 ${380 + oy} H156`, stroke: INK, "stroke-width": 4, "stroke-linecap": "round" }, svg); + r.items.forEach((it, i) => { + const px = 190 + i * (pw + gap), cx = px + pw / 2, col = SHARED[it] ? MINT : YEL; + const tool = el("g", {}, svg); + TOOLS[tk++ % TOOLS.length](tool, col === YEL ? BLUE : [LIL, SKY, YEL][i % 3]); + const pg = el("g", {}, svg); + const d = `M${px} ${top} H${px + pw} V${top + h - 54} Q${px + pw} ${top + h} ${px + pw - 54} ${top + h} H${px + 54} Q${px} ${top + h} ${px} ${top + h - 54} Z`; + const fillL = layered("path", { d }, pg, SOFT, col); + el("path", { d: `M${px + 18} ${top + 36} H${px + pw - 18}`, stroke: INK, "stroke-width": 3, "stroke-dasharray": "12 9" }, pg); + [px + 24, px + pw - 24].forEach((x) => el("circle", { cx: x, cy: top + 18, r: 7, fill: "#fff", stroke: INK, "stroke-width": 3 }, pg)); + const lg = el("g", {}, pg); + const one = txt(lg, 0, 14, it, { "text-anchor": "middle", "font-size": 42, "font-weight": 700 }); + let wide = false; try { wide = one.getComputedTextLength() > pw - 40; } catch (e) {} + if (wide && it.includes(" ")) { // two lines instead of a smaller font + const [a, b] = it.split(" "); one.textContent = a; one.setAttribute("y", -10); + txt(lg, 0, 38, b, { "text-anchor": "middle", "font-size": 42, "font-weight": 700 }); + } else fit(one, pw - 40, 32); + pouches.push({ tool, pg, fillL, lg, cx, top, ly: top + 142, at: AT[it] }); + }); + }); + return (t) => { + const out = seg(t, 9.8, 10.5); + pouches.forEach((p) => { + const d = seg(t, p.at - 0.15, p.at + 0.35), k = oc(seg(t, p.at, p.at + 0.45)) * (1 - out); + tf(p.tool, p.cx, p.top - 190 * (1 - ob(d)) - 120 * out); + p.tool.setAttribute("opacity", d <= 0 ? 0 : 1 - out); + const w = seg(t, p.at + 0.25, p.at + 1.0); + p.pg.setAttribute("transform", `rotate(${Math.sin(w * Math.PI * 3) * 2.2 * (1 - w)} ${p.cx} ${p.top})`); + p.fillL.setAttribute("opacity", k); + p.lg.setAttribute("opacity", k); + tf(p.lg, p.cx, p.ly, 0.7 + 0.3 * ob(seg(t, p.at + 0.1, p.at + 0.5))); + }); + const s = t < 0.8 || out >= 1 ? 0 : t < 3.4 ? 1 : 2; + note.textContent = s === 1 ? "Both cover the same core" : s === 2 ? "After that they split" : ""; + note.setAttribute("opacity", 1 - out); + let nw = 0; try { nw = s ? note.getComputedTextLength() : 0; } catch (e) {} + dot.setAttribute("cx", 1540 - nw - 28); dot.setAttribute("fill", s === 1 ? MINT : YEL); dot.setAttribute("opacity", s ? 1 - out : 0); + }; + }, + }; + + /* ---- 2. two fuel pumps, tap one to light its nozzles ---- */ + const NOZZLE = (g, s) => { + const w = 4 / s; + el("path", { d: "M34 -4 C62 -4 66 40 42 46", stroke: INK, "stroke-width": w + 1 / s, fill: "none", "stroke-linecap": "round" }, g); + el("circle", { cx: 42, cy: 46, r: 7, fill: INK }, g); + el("path", { d: "M-14 -18 L-52 -8 Q-58 -6 -55 0 L-14 -4 Z", fill: "#fff", stroke: INK, "stroke-width": w, "stroke-linejoin": "round" }, g); + el("path", { d: "M-2 8 V26 Q-2 34 6 34 H28 Q36 34 36 26 V8", fill: "none", stroke: INK, "stroke-width": w }, g); + el("path", { d: "M8 8 L14 22", stroke: INK, "stroke-width": w, "stroke-linecap": "round" }, g); + const body = el("rect", { x: -16, y: -26, width: 58, height: 36, rx: 12, fill: "#fff", stroke: INK, "stroke-width": w }, g); + const rays = el("path", { d: "M-64 -14 L-78 -22 M-66 0 L-82 2 M-62 12 L-74 24", stroke: INK, "stroke-width": w, "stroke-linecap": "round" }, g); + return { body, rays }; + }; + SC.pumps = { + w: 1600, h: 1200, dur: 11, still: 8, + build(svg, api) { + txt(svg, 60, 122, "How you pay for the model", { "font-size": 58, "font-weight": 700 }); + txt(svg, 1540, 120, "tap a pump", { "text-anchor": "end", "font-size": 34, "font-weight": 500, fill: MUTE }); + el("rect", { x: 60, y: 1070, width: 1480, height: 44, rx: 22, fill: SOFT }, svg); + const P = [ + { name: "Kilo Code", X: 170, side: -1, col: SKY, sum: "five ways to pay", items: ["free models", "local models", "BYOK", "Kilo Gateway", "Kilo Pass"], at0: 0.8 }, + { name: "Cline", X: 870, side: 1, col: LIL, sum: "two ways to pay", items: ["at cost", "BYOK"], at0: 3.9 }, + ]; + let pin = -1, pinAt = 0; + const pumps = P.map((p, pi) => { + const g = el("g", {}, svg), X = p.X, n = p.items.length, big = n < 3, BL = X + 20, BR = X + 540; + el("rect", { x: p.side < 0 ? X - 100 : X - 20, y: 150, width: 680, height: 940, rx: 40, fill: "#fff", "fill-opacity": 0, stroke: INK, "stroke-width": 3, "stroke-dasharray": "8 10", class: "mg-ring" }, g); + /* the big hose and the nozzle that hangs on the outer side */ + const hx = p.side < 0 ? BL : BR, cx = hx + p.side * 62, cy = 720; + const hose = `M${cx} ${cy - 50} C${cx + p.side * 30} ${cy - 190} ${hx + p.side * 70} ${cy - 250} ${hx} ${cy - 262}`; + el("path", { d: hose, stroke: INK, "stroke-width": 24, fill: "none", "stroke-linecap": "round" }, g); + el("path", { d: hose, stroke: p.col, "stroke-width": 16, fill: "none", "stroke-linecap": "round" }, g); + el("rect", { x: BL, y: 270, width: 520, height: 770, rx: 30, fill: "#fff", stroke: INK, "stroke-width": 4 }, g); + const hang = el("g", { transform: `translate(${cx} ${cy}) scale(${-p.side} 1)` }, g); + el("path", { d: "M26 -26 H52 Q62 -26 62 -16 V18 Q62 28 52 28 H26", fill: "none", stroke: INK, "stroke-width": 4 }, hang); + el("path", { d: "M-10 36 L-18 112 Q-19 122 -10 122 L6 36 Z", fill: "#fff", stroke: INK, "stroke-width": 4, "stroke-linejoin": "round" }, hang); + el("rect", { x: -28, y: -52, width: 56, height: 92, rx: 16, fill: p.col, stroke: INK, "stroke-width": 4 }, hang); + el("path", { d: "M-14 -30 H14 M-14 -14 H14", stroke: INK, "stroke-width": 4, "stroke-linecap": "round" }, hang); + el("rect", { x: X, y: 1022, width: 560, height: 48, rx: 16, fill: p.col, stroke: INK, "stroke-width": 4 }, g); + el("rect", { x: X, y: 170, width: 560, height: 112, rx: 26, fill: p.col, stroke: INK, "stroke-width": 4 }, g); + txt(g, X + 280, 246, p.name, { "text-anchor": "middle", "font-size": 60, "font-weight": 700 }); + el("rect", { x: BL + 40, y: 320, width: 440, height: 106, rx: 20, fill: SOFT, stroke: INK, "stroke-width": 4 }, g); + const screen = txt(g, X + 280, 388, p.sum, { "text-anchor": "middle", "font-family": MONO, "font-size": 40, "font-weight": 700 }); + const top = 456, H = 556, rh = H / n, s = big ? 1.5 : 1.1; + const rows = p.items.map((it, i) => { + const cy = top + rh * (i + 0.5), nx = BL + (big ? 142 : 112), ny = cy - (big ? 12 : 8); + const ng = el("g", {}, g); tf(ng, nx, ny, s); + const nz = NOZZLE(ng, s); + const pw = big ? 240 : 292, ph = big ? 124 : 80, px = BR - 28 - pw; + const pill = layered("rect", { x: px, y: cy - ph / 2, width: pw, height: ph, rx: ph / 2 }, g, "#fff", p.col); + const lab = fit(txt(g, px + pw / 2, cy + (big ? 18 : 13), it, { "text-anchor": "middle", "font-size": big ? 52 : 38, "font-weight": 700 }), pw - 36, 32); + return { ng, nz, nx, ny, pill, lab }; + }); + button(g, `${p.name}: ${p.items.join(", ")}`, () => { if (pin === pi) { pin = -1; api.seek(0); } else { pin = pi; pinAt = api.now(); api.poke(); } }); + return { g, p, rows, screen, s }; + }); + return (t, now) => { + const out = seg(t, 9.8, 10.4); + pumps.forEach((u, pi) => { + let last = -1, done = false; + u.rows.forEach((r, i) => { + let k, pop; + if (pin >= 0) { const e = now - pinAt; k = pin === pi ? seg(e, 0.1 + i * 0.2, 0.4 + i * 0.2) : 0; pop = pin === pi ? seg(e, 0.1 + i * 0.2, 0.6 + i * 0.2) : 0; } + else { const a = u.p.at0 + i * 0.55; k = seg(t, a, a + 0.3) * (1 - out); pop = seg(t, a, a + 0.5); } + if (k > 0.5) last = i; + r.pill.setAttribute("opacity", k); + r.lab.setAttribute("fill", k > 0.5 ? INK : MUTE); + r.nz.body.setAttribute("fill", k > 0.5 ? YEL : "#fff"); + r.nz.rays.setAttribute("opacity", k); + tf(r.ng, r.nx, r.ny - 10 * Math.sin(pop * Math.PI), u.s, -8 * Math.sin(pop * Math.PI)); + }); + const n = u.rows.length; + if (pin >= 0) done = pin === pi && now - pinAt > 0.9 + n * 0.2; + else done = t > u.p.at0 + (n - 1) * 0.55 + 0.9; + const showing = last >= 0 && !done ? u.p.items[last] : u.p.sum; + u.screen.textContent = showing; + u.screen.setAttribute("fill", last >= 0 ? INK : MUTE); + u.g.setAttribute("aria-pressed", pin === pi ? "true" : "false"); + }); + }; + }, + }; + + /* ---- 3. cinema seats, a slider lights more Kilo Code seats ---- */ + SC.seats = { + w: 1600, h: 1200, dur: 11.5, still: 7.5, + build(svg, api) { + txt(svg, 60, 122, "Team plans", { "font-size": 58, "font-weight": 700 }); + const N = 5, SX = (i) => 80 + i * 288 + 19; + const arms = (y) => { for (let i = 0; i <= N; i++) el("rect", { x: SX(i) - 32, y: y + 148, width: 26, height: 112, rx: 13, fill: SOFT, stroke: INK, "stroke-width": 4 }, svg); }; + const seat = (x, y, tag) => { + const g = el("g", {}, svg); tf(g, x, y); + el("rect", { x: 56, y: 252, width: 138, height: 32, rx: 10, fill: SOFT, stroke: INK, "stroke-width": 4 }, g); + const back = layered("rect", { x: 10, y: 0, width: 230, height: 222, rx: 36 }, g, SOFT, BLUE); + const cush = layered("rect", { x: 0, y: 196, width: 250, height: 64, rx: 26 }, g, SOFT, LIL); + if (!tag) return { g }; + const tg = el("g", {}, g); + const tagL = layered("rect", { x: 26, y: 22, width: 198, height: 168, rx: 20 }, tg, "#fff", YEL, 4); + el("circle", { cx: 125, cy: 42, r: 7, fill: "#fff", stroke: INK, "stroke-width": 3 }, tg); + txt(tg, 125, 104, "$15", { "text-anchor": "middle", "font-size": 56, "font-weight": 700 }); + fit(txt(tg, 125, 140, "per user", { "text-anchor": "middle", "font-size": 33, "font-weight": 600 }), 170, 30); + fit(txt(tg, 125, 174, "per month", { "text-anchor": "middle", "font-size": 33, "font-weight": 600 }), 170, 30); + return { g, back, cush, tg, tagL, x, y }; + }; + txt(svg, 60, 214, "Kilo Code", { "font-size": 52, "font-weight": 700 }); + const kilo = Array.from({ length: N }, (_, i) => seat(SX(i), 244, true)); + arms(244); + el("rect", { x: 60, y: 528, width: 1480, height: 22, rx: 11, fill: SOFT }, svg); + txt(svg, 60, 640, "Cline", { "font-size": 52, "font-weight": 700 }); + Array.from({ length: N }, (_, i) => seat(SX(i), 670, false)); + arms(670); + el("rect", { x: 60, y: 954, width: 1480, height: 22, rx: 11, fill: SOFT }, svg); + const sign = el("g", {}, svg); + [600, 978].forEach((x) => el("rect", { x, y: 880, width: 22, height: 76, fill: "#fff", stroke: INK, "stroke-width": 4 }, sign)); + el("rect", { x: 450, y: 700, width: 700, height: 196, rx: 28, fill: YEL, stroke: INK, "stroke-width": 4 }, sign); + txt(sign, 800, 786, "Enterprise,", { "text-anchor": "middle", "font-size": 64, "font-weight": 700 }); + txt(sign, 800, 862, "contact sales", { "text-anchor": "middle", "font-size": 64, "font-weight": 700 }); + const A = 560, B = 1500, Y = 1074; + txt(svg, 60, Y + 11, "drag to light more seats", { "font-size": 32, "font-weight": 500, fill: MUTE }); + const hit = el("rect", { x: A - 30, y: Y - 44, width: B - A + 60, height: 88, fill: "#fff", "fill-opacity": 0 }, svg); + el("path", { d: `M${A} ${Y} H${B}`, stroke: SOFT, "stroke-width": 24, "stroke-linecap": "round" }, svg); + const fill = el("path", { d: `M${A} ${Y} H${A}`, stroke: YEL, "stroke-width": 24, "stroke-linecap": "round" }, svg); + const knob = el("g", { role: "slider", tabindex: "0", "aria-label": "Light more Kilo Code seats", "aria-valuemin": 1, "aria-valuemax": N, class: "mg-hit" }, svg); + el("circle", { r: 46, fill: "#fff", "fill-opacity": 0 }, knob); + el("circle", { r: 30, fill: "#fff", stroke: INK, "stroke-width": 4 }, knob); + el("path", { d: "M-8 -9 L-16 0 L-8 9 M8 -9 L16 0 L8 9", stroke: INK, "stroke-width": 4, fill: "none", "stroke-linecap": "round", "stroke-linejoin": "round" }, knob); + let user = null, down = false; + const set = (e) => { const r = svg.getBoundingClientRect(); user = cl(((e.clientX - r.left) / r.width * 1600 - A) / (B - A)); api.poke(); }; + [knob, hit].forEach((n) => { + n.addEventListener("pointerdown", (e) => { down = true; knob.setPointerCapture(e.pointerId); set(e); knob.focus && knob.focus({ preventScroll: true }); }); + }); + knob.addEventListener("pointermove", (e) => { if (down) set(e); }); + knob.addEventListener("pointerup", () => { down = false; }); + knob.addEventListener("pointercancel", () => { down = false; }); + knob.addEventListener("keydown", (e) => { + const step = 1 / (N - 1), cur = user == null ? 1 : user; + const v = e.key === "ArrowRight" || e.key === "ArrowUp" ? cur + step : e.key === "ArrowLeft" || e.key === "ArrowDown" ? cur - step : e.key === "Home" ? 0 : e.key === "End" ? 1 : null; + if (v != null) { e.preventDefault(); user = cl(Math.round(v / step) * step); api.poke(); } + }); + return (t) => { + const v = user != null ? user : io(seg(t, 0.8, 5.2)) - io(seg(t, 9.6, 10.9)); + const L = 1 + v * (N - 1); + tf(knob, A + (B - A) * v, Y); fill.setAttribute("d", `M${A} ${Y} H${A + (B - A) * v}`); + knob.setAttribute("aria-valuenow", Math.round(L)); + kilo.forEach((s, i) => { + const k = cl(L - i); + s.back.setAttribute("opacity", k); s.cush.setAttribute("opacity", k); s.tagL.setAttribute("opacity", k); + s.tg.setAttribute("opacity", 0.4 + 0.6 * k); + tf(s.g, s.x, s.y - 12 * Math.sin(k * Math.PI)); + }); + }; + }, + }; + + /* ---- title card, 16 by 9: a rally over a ping pong table ---- */ + SC.hero = { + w: 1600, h: 900, dur: 2.4, still: 1.6, + build(svg) { + txt(svg, 96, 214, "TWO OPEN SOURCE CODING AGENTS", { "font-family": MONO, "font-size": 32, "font-weight": 700, fill: MUTE, "letter-spacing": 2 }); + txt(svg, 88, 384, "Kilo Code", { "font-size": 150, "font-weight": 700 }); + txt(svg, 88, 548, "vs Cline", { "font-size": 150, "font-weight": 700 }); + el("path", { d: "M98 592 H600", stroke: YEL, "stroke-width": 18, "stroke-linecap": "round" }, svg); + txt(svg, 96, 690, "Checked 19 Oct 2026", { "font-family": MONO, "font-size": 38, "font-weight": 700, fill: INK }); + [[1010, 668], [1470, 668]].forEach(([x, y]) => el("rect", { x: x - 10, y, width: 20, height: 150, rx: 6, fill: "#fff", stroke: INK, "stroke-width": 4 }, svg)); + el("rect", { x: 940, y: 820, width: 600, height: 20, rx: 10, fill: SOFT }, svg); + el("rect", { x: 950, y: 640, width: 580, height: 30, rx: 10, fill: MINT, stroke: INK, "stroke-width": 4 }, svg); + el("path", { d: "M1240 644 V666", stroke: "#fff", "stroke-width": 4 }, svg); + el("rect", { x: 1196, y: 576, width: 88, height: 64, rx: 4, fill: "#fff", stroke: INK, "stroke-width": 4 }, svg); + el("path", { d: "M1218 576 V640 M1240 576 V640 M1262 576 V640 M1196 597 H1284 M1196 618 H1284", stroke: INK, "stroke-width": 2 }, svg); + const A = [1100, 392], B = [1360, 392], AP = 160; + el("path", { d: `M${A[0]} ${A[1]} Q1240 ${2 * AP - A[1]} ${B[0]} ${B[1]}`, stroke: MUTE, "stroke-width": 4, "stroke-dasharray": "2 16", "stroke-linecap": "round", fill: "none" }, svg); + const paddle = (col) => { const g = el("g", {}, svg); el("rect", { x: -17, y: 70, width: 34, height: 112, rx: 14, fill: YEL, stroke: INK, "stroke-width": 4 }, g); el("circle", { r: 86, fill: col, stroke: INK, "stroke-width": 4 }, g); el("circle", { r: 62, fill: "none", stroke: INK, "stroke-width": 3, "stroke-dasharray": "3 14", "stroke-linecap": "round" }, g); return g; }; + const L = paddle(BLUE), R = paddle(LIL); + const conf = [[960, 200, SKY], [1520, 230, YEL], [1450, 120, LIL], [1080, 120, MINT]].map(([x, y, c], i) => el(i % 2 ? "circle" : "rect", i % 2 ? { cx: x, cy: y, r: 11, fill: c, stroke: INK, "stroke-width": 3 } : { x: x - 10, y: y - 10, width: 20, height: 20, rx: 4, fill: c, stroke: INK, "stroke-width": 3 }, svg)); + const ball = el("circle", { r: 20, fill: "#fff", stroke: INK, "stroke-width": 4 }, svg); + return (t) => { + const u = ((t % 2.4) + 2.4) % 2.4 / 2.4, half = u < 0.5, p = io(half ? u * 2 : (u - 0.5) * 2), f = half ? p : 1 - p; + const x = A[0] + (B[0] - A[0]) * f, y = A[1] - (A[1] - AP) * 4 * f * (1 - f); + ball.setAttribute("cx", x); ball.setAttribute("cy", y); + const hitL = Math.max(0, 1 - Math.min(u, 1 - u) * 8), hitR = Math.max(0, 1 - Math.abs(u - 0.5) * 8); + tf(L, 1012, 420, 1, -18 + 14 * hitL); + tf(R, 1448, 420, 1, 18 - 14 * hitR); + conf.forEach((n, i) => n.setAttribute("transform", `translate(0 ${Math.sin(t * 2.6 + i * 1.7) * 6})`)); + }; + }, + }; + + /* ---- 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/docs/blog/assets/media/kilo-code-vs-cline/pumps.png b/docs/blog/assets/media/kilo-code-vs-cline/pumps.png new file mode 100644 index 000000000..05144fed6 Binary files /dev/null and b/docs/blog/assets/media/kilo-code-vs-cline/pumps.png differ diff --git a/docs/blog/assets/media/kilo-code-vs-cline/seats.png b/docs/blog/assets/media/kilo-code-vs-cline/seats.png new file mode 100644 index 000000000..6fae39368 Binary files /dev/null and b/docs/blog/assets/media/kilo-code-vs-cline/seats.png differ diff --git a/docs/blog/best-ai-coding-agents/index.html b/docs/blog/best-ai-coding-agents/index.html index ecb3730b2..3f5035d61 100644 --- a/docs/blog/best-ai-coding-agents/index.html +++ b/docs/blog/best-ai-coding-agents/index.html @@ -468,50 +468,50 @@

FAQ

Related in Comparisons

- +
- + 5 min
-

OpenCode Alternatives: 7 Coding Agents to Switch To

-

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.

+

Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

+

Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

Comparisons - Read → + Read →
- +
- + - 4 min + 5 min
-

Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

-

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.

+

OpenCode Alternatives: 7 Coding Agents to Switch To

+

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.

Comparisons - Read → + Read →
diff --git a/docs/blog/best-claude-code-multi-agent-tools/index.html b/docs/blog/best-claude-code-multi-agent-tools/index.html index c039c5a90..ab27766fe 100644 --- a/docs/blog/best-claude-code-multi-agent-tools/index.html +++ b/docs/blog/best-claude-code-multi-agent-tools/index.html @@ -436,50 +436,50 @@

FAQ

Related in Comparisons

- +
- + 5 min
-

OpenCode Alternatives: 7 Coding Agents to Switch To

-

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.

+

Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

+

Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

Comparisons - Read → + Read →
- +
- + - 4 min + 5 min
-

Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

-

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.

+

OpenCode Alternatives: 7 Coding Agents to Switch To

+

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.

Comparisons - Read → + Read →
diff --git a/docs/blog/chatgpt-dots-alternatives/index.html b/docs/blog/chatgpt-dots-alternatives/index.html index b864d6e75..eaacea883 100644 --- a/docs/blog/chatgpt-dots-alternatives/index.html +++ b/docs/blog/chatgpt-dots-alternatives/index.html @@ -350,50 +350,50 @@

FAQ

Related in Comparisons

- +
- + 5 min
-

OpenCode Alternatives: 7 Coding Agents to Switch To

-

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.

+

Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

+

Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

Comparisons - Read → + Read →
- +
- + - 4 min + 5 min
-

Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

-

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.

+

OpenCode Alternatives: 7 Coding Agents to Switch To

+

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.

Comparisons - Read → + Read →
diff --git a/docs/blog/claude-code-alternatives/index.html b/docs/blog/claude-code-alternatives/index.html index 641a7d6c8..0a080c7b6 100644 --- a/docs/blog/claude-code-alternatives/index.html +++ b/docs/blog/claude-code-alternatives/index.html @@ -360,50 +360,50 @@

FAQ

Related in Comparisons

- +
- + 5 min
-

OpenCode Alternatives: 7 Coding Agents to Switch To

-

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.

+

Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

+

Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

Comparisons - Read → + Read →
- +
- + - 4 min + 5 min
-

Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

-

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.

+

OpenCode Alternatives: 7 Coding Agents to Switch To

+

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.

Comparisons - Read → + Read →
diff --git a/docs/blog/claude-code-orchestration-tools-compared/index.html b/docs/blog/claude-code-orchestration-tools-compared/index.html index 4e9bf58fc..42ebf427e 100644 --- a/docs/blog/claude-code-orchestration-tools-compared/index.html +++ b/docs/blog/claude-code-orchestration-tools-compared/index.html @@ -334,50 +334,50 @@

Matching tools to priorities

Related in Comparisons

- +
- + 5 min
-

OpenCode Alternatives: 7 Coding Agents to Switch To

-

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.

+

Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

+

Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

Comparisons - Read → + Read →
- +
- + - 4 min + 5 min
-

Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

-

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.

+

OpenCode Alternatives: 7 Coding Agents to Switch To

+

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.

Comparisons - Read → + Read →
diff --git a/docs/blog/claude-code-vs-antigravity/index.html b/docs/blog/claude-code-vs-antigravity/index.html index 10922213c..1fba4049a 100644 --- a/docs/blog/claude-code-vs-antigravity/index.html +++ b/docs/blog/claude-code-vs-antigravity/index.html @@ -275,50 +275,50 @@

FAQ

Related in Comparisons

- +
- + 5 min
-

OpenCode Alternatives: 7 Coding Agents to Switch To

-

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.

+

Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

+

Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

Comparisons - Read → + Read →
- +
- + - 4 min + 5 min
-

Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

-

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.

+

OpenCode Alternatives: 7 Coding Agents to Switch To

+

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.

Comparisons - Read → + Read →
diff --git a/docs/blog/claude-code-vs-cursor/index.html b/docs/blog/claude-code-vs-cursor/index.html index e882144a2..b9afc5263 100644 --- a/docs/blog/claude-code-vs-cursor/index.html +++ b/docs/blog/claude-code-vs-cursor/index.html @@ -353,50 +353,50 @@

FAQ

Related in Comparisons

- +
- + 5 min
-

OpenCode Alternatives: 7 Coding Agents to Switch To

-

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.

+

Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

+

Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

Comparisons - Read → + Read →
- +
- + - 4 min + 5 min
-

Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

-

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.

+

OpenCode Alternatives: 7 Coding Agents to Switch To

+

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.

Comparisons - Read → + Read →
diff --git a/docs/blog/claude-cowork-vs-claude-code/index.html b/docs/blog/claude-cowork-vs-claude-code/index.html index 49026d2ce..a38d8495c 100644 --- a/docs/blog/claude-cowork-vs-claude-code/index.html +++ b/docs/blog/claude-cowork-vs-claude-code/index.html @@ -346,50 +346,50 @@

FAQ

Related in Comparisons

- +
- + 5 min
-

OpenCode Alternatives: 7 Coding Agents to Switch To

-

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.

+

Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

+

Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

Comparisons - Read → + Read →
- +
- + - 4 min + 5 min
-

Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

-

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.

+

OpenCode Alternatives: 7 Coding Agents to Switch To

+

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.

Comparisons - Read → + Read →
diff --git a/docs/blog/claude-squad-alternative/index.html b/docs/blog/claude-squad-alternative/index.html index 78ddbb605..4101e79bf 100644 --- a/docs/blog/claude-squad-alternative/index.html +++ b/docs/blog/claude-squad-alternative/index.html @@ -270,50 +270,50 @@

Which should you pick?
- +
- + 5 min
-

OpenCode Alternatives: 7 Coding Agents to Switch To

-

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.

+

Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

+

Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

Comparisons - Read → + Read →
- +
- + - 4 min + 5 min
-

Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

-

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.

+

OpenCode Alternatives: 7 Coding Agents to Switch To

+

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.

Comparisons - Read → + Read →
diff --git a/docs/blog/claude-squad-vs-munder-difflin/index.html b/docs/blog/claude-squad-vs-munder-difflin/index.html index b77a46923..35e118a79 100644 --- a/docs/blog/claude-squad-vs-munder-difflin/index.html +++ b/docs/blog/claude-squad-vs-munder-difflin/index.html @@ -359,50 +359,50 @@

FAQ

Related in Comparisons

- +
- + 5 min
-

OpenCode Alternatives: 7 Coding Agents to Switch To

-

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.

+

Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

+

Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

Comparisons - Read → + Read →
- +
- + - 4 min + 5 min
-

Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

-

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.

+

OpenCode Alternatives: 7 Coding Agents to Switch To

+

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.

Comparisons - Read → + Read →
diff --git a/docs/blog/cline-vs-munder-difflin/index.html b/docs/blog/cline-vs-munder-difflin/index.html index 3ed3c9f4b..d252f93fc 100644 --- a/docs/blog/cline-vs-munder-difflin/index.html +++ b/docs/blog/cline-vs-munder-difflin/index.html @@ -257,7 +257,7 @@

When should you pick Cline? You want to choose your own model. Cline takes keys from many providers, and Ollama or LM Studio if you want local models.
  • You want one tool in many places. The same engine runs in the editor, the terminal, CI, the desktop app and your own code through the SDK.
  • -

    If those cover you, Cline is the more direct fit. For other tools in this space, see our OpenCode alternatives and Claude Code alternatives.

    +

    If those cover you, Cline is the more direct fit. Weighing it against a similar editor agent? Read Kilo Code vs Cline. For other tools in this space, see our OpenCode alternatives and Claude Code alternatives.

    When should you pick Munder Difflin?

    Pick Munder Difflin when the job is big enough to split, or when you want different agents on it.

      @@ -326,50 +326,50 @@

      FAQ

      Related in Comparisons

      - +
      - + 5 min
      -

      OpenCode Alternatives: 7 Coding Agents to Switch To

      -

      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.

      +

      Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

      +

      Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

      Comparisons - Read → + Read →
      - +
      - + - 4 min + 5 min
      -

      Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

      -

      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.

      +

      OpenCode Alternatives: 7 Coding Agents to Switch To

      +

      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.

      Comparisons - Read → + Read →
      diff --git a/docs/blog/codex-cli-vs-claude-code/index.html b/docs/blog/codex-cli-vs-claude-code/index.html index 0dd1e4158..91c65718f 100644 --- a/docs/blog/codex-cli-vs-claude-code/index.html +++ b/docs/blog/codex-cli-vs-claude-code/index.html @@ -407,50 +407,50 @@

      FAQ

      Related in Comparisons

      - +
      - + 5 min
      -

      OpenCode Alternatives: 7 Coding Agents to Switch To

      -

      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.

      +

      Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

      +

      Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

      Comparisons - Read → + Read →
      - +
      - + - 4 min + 5 min
      -

      Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

      -

      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.

      +

      OpenCode Alternatives: 7 Coding Agents to Switch To

      +

      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.

      Comparisons - Read → + Read →
      diff --git a/docs/blog/codex-vs-claude-code-usage-limits/index.html b/docs/blog/codex-vs-claude-code-usage-limits/index.html index 67e303a73..31125dd8c 100644 --- a/docs/blog/codex-vs-claude-code-usage-limits/index.html +++ b/docs/blog/codex-vs-claude-code-usage-limits/index.html @@ -341,50 +341,50 @@

      FAQ

      Related in Comparisons

      - +
      - + 5 min
      -

      OpenCode Alternatives: 7 Coding Agents to Switch To

      -

      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.

      +

      Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

      +

      Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

      Comparisons - Read → + Read →
      - +
      - + - 4 min + 5 min
      -

      Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

      -

      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.

      +

      OpenCode Alternatives: 7 Coding Agents to Switch To

      +

      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.

      Comparisons - Read → + Read →
      diff --git a/docs/blog/codex-vs-cursor/index.html b/docs/blog/codex-vs-cursor/index.html index 467c42434..d4c6e3bc3 100644 --- a/docs/blog/codex-vs-cursor/index.html +++ b/docs/blog/codex-vs-cursor/index.html @@ -347,50 +347,50 @@

      FAQ

      Related in Comparisons

      - +
      - + 5 min
      -

      OpenCode Alternatives: 7 Coding Agents to Switch To

      -

      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.

      +

      Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

      +

      Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

      Comparisons - Read → + Read →
      - +
      - + - 4 min + 5 min
      -

      Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

      -

      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.

      +

      OpenCode Alternatives: 7 Coding Agents to Switch To

      +

      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.

      Comparisons - Read → + Read →
      diff --git a/docs/blog/conductor-claude-code-alternative/index.html b/docs/blog/conductor-claude-code-alternative/index.html index 25f525a7e..cce9b2157 100644 --- a/docs/blog/conductor-claude-code-alternative/index.html +++ b/docs/blog/conductor-claude-code-alternative/index.html @@ -272,50 +272,50 @@

      Conductor vs an orchest

      Related in Comparisons

      - +
      - + 5 min
      -

      OpenCode Alternatives: 7 Coding Agents to Switch To

      -

      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.

      +

      Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

      +

      Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

      Comparisons - Read → + Read →
      - +
      - + - 4 min + 5 min
      -

      Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

      -

      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.

      +

      OpenCode Alternatives: 7 Coding Agents to Switch To

      +

      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.

      Comparisons - Read → + Read →
      diff --git a/docs/blog/crewai-autogen-vs-a-local-agent-harness/index.html b/docs/blog/crewai-autogen-vs-a-local-agent-harness/index.html index 8bb5b7b58..afbdcf3b0 100644 --- a/docs/blog/crewai-autogen-vs-a-local-agent-harness/index.html +++ b/docs/blog/crewai-autogen-vs-a-local-agent-harness/index.html @@ -296,50 +296,50 @@

      FAQ

      Related in Comparisons

      - +
      - + 5 min
      -

      OpenCode Alternatives: 7 Coding Agents to Switch To

      -

      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.

      +

      Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

      +

      Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

      Comparisons - Read → + Read →
      - +
      - + - 4 min + 5 min
      -

      Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

      -

      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.

      +

      OpenCode Alternatives: 7 Coding Agents to Switch To

      +

      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.

      Comparisons - Read → + Read →
      diff --git a/docs/blog/crystal-claude-code-alternative/index.html b/docs/blog/crystal-claude-code-alternative/index.html index 568431477..463e5dcc6 100644 --- a/docs/blog/crystal-claude-code-alternative/index.html +++ b/docs/blog/crystal-claude-code-alternative/index.html @@ -268,50 +268,50 @@

      Crystal vs a memory-backe

      Related in Comparisons

      - +
      - + 5 min
      -

      OpenCode Alternatives: 7 Coding Agents to Switch To

      -

      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.

      +

      Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

      +

      Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

      Comparisons - Read → + Read →
      - +
      - + - 4 min + 5 min
      -

      Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

      -

      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.

      +

      OpenCode Alternatives: 7 Coding Agents to Switch To

      +

      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.

      Comparisons - Read → + Read →
      diff --git a/docs/blog/cursor-alternatives/index.html b/docs/blog/cursor-alternatives/index.html index f2625cb37..231a4dfcd 100644 --- a/docs/blog/cursor-alternatives/index.html +++ b/docs/blog/cursor-alternatives/index.html @@ -367,50 +367,50 @@

      FAQ

      Related in Comparisons

      - +
      - + 5 min
      -

      OpenCode Alternatives: 7 Coding Agents to Switch To

      -

      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.

      +

      Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

      +

      Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

      Comparisons - Read → + Read →
      - +
      - + - 4 min + 5 min
      -

      Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

      -

      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.

      +

      OpenCode Alternatives: 7 Coding Agents to Switch To

      +

      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.

      Comparisons - Read → + Read →
      diff --git a/docs/blog/feed.xml b/docs/blog/feed.xml index ef17acffd..788d97911 100644 --- a/docs/blog/feed.xml +++ b/docs/blog/feed.xml @@ -4,9 +4,33 @@ Guides, deep dives, and comparisons on running multi-agent Claude Code: orchestration, agent memory, automation, and the tooling landscape. - 2026-10-18T00:00:00.000Z + 2026-10-19T00:00:00.000Z https://munderdiffl.in/blog/ Chaitanya Girihttps://munderdiffl.in + + Agent Tools Today, 19 Oct 2026: DeepSeek Search API, Sphinx, OpenClaw 2026.10.5 + + https://munderdiffl.in/blog/agent-tools-today-2026-10-19/ + 2026-10-19T00:00:00.000Z + 2026-10-19T00:00:00.000Z + The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 19 Oct 2026, each with its source. + + + Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud + + https://munderdiffl.in/blog/hermes-agent-alternatives/ + 2026-10-19T00:00:00.000Z + 2026-10-19T00:00:00.000Z + Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026. + + + Kilo Code vs Cline: Two Open Source Coding Agents Compared + + https://munderdiffl.in/blog/kilo-code-vs-cline/ + 2026-10-19T00:00:00.000Z + 2026-10-19T00:00:00.000Z + Kilo Code vs Cline, checked 19 Oct 2026: licences, where each runs, how you pay for models, team prices and which one to pick. + Agent Tools Today, 18 Oct 2026: LeanREA Takes On REA, FLUX 3 Image Klein, Hy Memory @@ -463,28 +487,4 @@ 2026-10-03T00:00:00.000Z 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/ - 2026-10-03T00:00:00.000Z - 2026-10-03T00:00:00.000Z - 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/ - 2026-10-03T00:00:00.000Z - 2026-10-03T00:00:00.000Z - 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, Its Free Plan and Models - - https://munderdiffl.in/blog/what-is-codex/ - 2026-10-02T00:00:00.000Z - 2026-10-15T00:00:00.000Z - Codex is OpenAI's coding agent for your terminal, editor, desktop app and cloud. ChatGPT Free, Go, Plus and Pro include it. Plans and models, 15 Oct 2026. - diff --git a/docs/blog/gemini-4-argon-vs-claude-opus-5-5/index.html b/docs/blog/gemini-4-argon-vs-claude-opus-5-5/index.html index 2f8d07553..7ef68c037 100644 --- a/docs/blog/gemini-4-argon-vs-claude-opus-5-5/index.html +++ b/docs/blog/gemini-4-argon-vs-claude-opus-5-5/index.html @@ -452,50 +452,50 @@

      FAQ

      Related in Comparisons

      - +
      - + 5 min
      -

      OpenCode Alternatives: 7 Coding Agents to Switch To

      -

      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.

      +

      Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

      +

      Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

      Comparisons - Read → + Read →
      diff --git a/docs/blog/gemini-cli-vs-claude-code/index.html b/docs/blog/gemini-cli-vs-claude-code/index.html index 2018ee044..e2f114772 100644 --- a/docs/blog/gemini-cli-vs-claude-code/index.html +++ b/docs/blog/gemini-cli-vs-claude-code/index.html @@ -335,50 +335,50 @@

      FAQ

      Related in Comparisons

      - +
      - + 5 min
      -

      OpenCode Alternatives: 7 Coding Agents to Switch To

      -

      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.

      +

      Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

      +

      Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

      Comparisons - Read → + Read →
      - +
      - + - 4 min + 5 min
      -

      Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

      -

      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.

      +

      OpenCode Alternatives: 7 Coding Agents to Switch To

      +

      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.

      Comparisons - Read → + Read →
      diff --git a/docs/blog/github-copilot-cli-vs-claude-code-for-hive-work/index.html b/docs/blog/github-copilot-cli-vs-claude-code-for-hive-work/index.html index 51de43349..19436d1ba 100644 --- a/docs/blog/github-copilot-cli-vs-claude-code-for-hive-work/index.html +++ b/docs/blog/github-copilot-cli-vs-claude-code-for-hive-work/index.html @@ -397,50 +397,50 @@

      FAQ

      Related in Comparisons

      - +
      - + 5 min
      -

      OpenCode Alternatives: 7 Coding Agents to Switch To

      -

      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.

      +

      Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

      +

      Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

      Comparisons - Read → + Read →
      - +
      - + - 4 min + 5 min
      -

      Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

      -

      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.

      +

      OpenCode Alternatives: 7 Coding Agents to Switch To

      +

      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.

      Comparisons - Read → + Read →
      diff --git a/docs/blog/grok-bot-alternatives/index.html b/docs/blog/grok-bot-alternatives/index.html index a9c373a56..2006b0f21 100644 --- a/docs/blog/grok-bot-alternatives/index.html +++ b/docs/blog/grok-bot-alternatives/index.html @@ -387,50 +387,50 @@

      FAQ

      Related in Comparisons

      - +
      - + 5 min
      -

      OpenCode Alternatives: 7 Coding Agents to Switch To

      -

      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.

      +

      Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

      +

      Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

      Comparisons - Read → + Read →
      - +
      - + - 4 min + 5 min
      -

      Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

      -

      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.

      +

      OpenCode Alternatives: 7 Coding Agents to Switch To

      +

      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.

      Comparisons - Read → + Read →
      diff --git a/docs/blog/grok-bot-pricing/index.html b/docs/blog/grok-bot-pricing/index.html index 69fd2b62c..5865a3f3b 100644 --- a/docs/blog/grok-bot-pricing/index.html +++ b/docs/blog/grok-bot-pricing/index.html @@ -370,50 +370,50 @@

      FAQ

      Related in Comparisons

      - +
      - + 5 min
      -

      OpenCode Alternatives: 7 Coding Agents to Switch To

      -

      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.

      +

      Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

      +

      Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

      Comparisons - Read → + Read →
      - +
      - + - 4 min + 5 min
      -

      Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

      -

      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.

      +

      OpenCode Alternatives: 7 Coding Agents to Switch To

      +

      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.

      Comparisons - Read → + Read →
      diff --git a/docs/blog/herdr-alternatives/index.html b/docs/blog/herdr-alternatives/index.html index cbd19c443..66370747a 100644 --- a/docs/blog/herdr-alternatives/index.html +++ b/docs/blog/herdr-alternatives/index.html @@ -286,50 +286,50 @@

      FAQ

      Related in Comparisons

      - +
      - + 5 min
      -

      OpenCode Alternatives: 7 Coding Agents to Switch To

      -

      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.

      +

      Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

      +

      Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

      Comparisons - Read → + Read →
      - +
      - + - 4 min + 5 min
      -

      Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

      -

      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.

      +

      OpenCode Alternatives: 7 Coding Agents to Switch To

      +

      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.

      Comparisons - Read → + Read →
      diff --git a/docs/blog/hermes-agent-alternatives/index.html b/docs/blog/hermes-agent-alternatives/index.html new file mode 100644 index 000000000..48603977c --- /dev/null +++ b/docs/blog/hermes-agent-alternatives/index.html @@ -0,0 +1,466 @@ + + + + + + + + +7 Hermes Agent Alternatives in 2026: Free, Open Source and Hosted + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +
      +
      + +

      Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

      +

      Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

      + +
      + +
      Title card on white. The title Hermes Agent alternatives in large ink type, a 7 picks for chat, code and cloud kicker, a Checked 19 Oct 2026 line and a paper plane trailing a dashed loop.
      + +
      +
      +

      The best Hermes Agent alternative is OpenClaw if you want the same job done, a personal assistant in your chat apps, and Munder Difflin if your real work is code. NanoClaw, ZeroClaw, nanobot, Goose and Claude cover containers, one Rust binary, a Python core, a desktop app and a hosted option. Checked 19 Oct 2026.

      +
      Animation. A bento box with seven compartments fills one name at a time. Six names sit in the larger part of the box marked free and open source, and Claude sits alone in a compartment marked hosted.
      Seven alternatives. Six are free and open source, one is hosted.
      +

      This guide sits in our Comparisons hub, next to OpenClaw alternatives and the wider list of open source AI agents.

      +

      What is Hermes Agent, and why would you look elsewhere?

      +

      Hermes Agent is Nous Research’s MIT licensed personal agent. Its README says it creates skills from experience and improves them during use; it also keeps memory between sessions, runs a cron scheduler, and answers on “Telegram, Discord, Slack, WhatsApp, Signal, and CLI” from one gateway process. GitHub showed 254,983 stars and release v0.22.2 (15 Oct 2026) on 19 Oct 2026. Our Hermes Agent explainer covers the install.

      +

      It costs nothing, so price is rarely the reason to switch. The reasons are about the job:

      +
        +
      • It is one personal agent, not a team. If your work is a codebase, you may want several coding agents working side by side.
      • +
      • You run it. It installs on your computer or a server, with seven terminal backends from local and Docker to Modal and Daytona.
      • +
      • You may want harder walls. Some picks below run each agent in its own container or ask before medium risk actions by default.
      • +
      +

      Seven Hermes Agent alternatives, by job

      +

      1. OpenClaw. OpenClaw is the closest swap and the biggest project here: 392,413 stars on 19 Oct 2026, MIT licensed. Its README names Discord, iMessage, Slack, Teams, Telegram and WhatsApp “and 20+ more”, with native apps for macOS, iOS, Android, Windows and Linux. Release v2026.10.5 (18 Oct) resumes interrupted turns “after a Gateway restart”. The README also warns that “Tools run on the host for the main session unless you configure sandboxing”. Best for: the same job, with more channels.

      +

      2. Munder Difflin. This is what we make, and 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. The limits: it is for coding work, it does not answer your Telegram or run errands, and agents work while your computer is on. The install guide takes you from download to a first agent. Best for: people who used Hermes Agent mostly to get code written.

      +

      3. NanoClaw. NanoClaw (MIT) says agents “run in their own Linux containers with filesystem isolation, not merely behind permission checks”. Its setup script installs Node, pnpm and Docker if they are missing and registers your Anthropic credential with a credential gateway. Chat channels such as Discord, Slack, Telegram and WhatsApp live on a separate branch. Our NanoClaw explainer covers setup. Best for: isolation first.

      +

      4. ZeroClaw. ZeroClaw is “a single Rust binary you configure and run”, dual licensed MIT or Apache 2.0 according to its README badge. It reaches “30+ channels”, and its default autonomy is supervised, where medium risk operations need your approval and high risk ones are blocked. It also drives hardware such as a Raspberry Pi. Release v0.8.6 came out on 18 Oct. Our ZeroClaw explainer has the details. Best for: an always on service in one binary.

      +

      5. nanobot. nanobot (MIT) is a personal agent framework for Python 3.11 or newer. It runs in a browser WebUI or a terminal and connects to Telegram, Discord, Slack, WeChat, Email and other channels. Best for: Python people who want to read the core.

      +

      6. Goose. Goose (Apache 2.0) is a general agent with “A native desktop app for macOS, Linux, and Windows”, a CLI and an API. It works with 15+ providers and can use an existing Claude, ChatGPT or Gemini subscription. It is part of the Agentic AI Foundation at the Linux Foundation. Best for: a desktop app first.

      +

      7. Claude. The one hosted pick. Anthropic’s help page says Cowork runs your tasks in the cloud (in beta on Team and Enterprise plans) and that scheduled tasks “don’t need your computer to be awake”. The page also notes that “Claude Cowork is now just Claude”, rolling out gradually to Pro and Max plans. Best for: no server to run.

      +

      Hermes Agent alternatives compared, checked 19 Oct 2026

      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      ToolWhat it isLicencePriceRuns where
      Hermes AgentPersonal agent that learnsMITFree.Your computer, a server, Docker or serverless backends
      OpenClawPersonal assistant in your chatsMITFree.Your own devices
      Munder DifflinTeam of coding agentsMITFree and open source.Your own computer
      NanoClawAssistant in containersMITFree.Docker on your machine
      ZeroClawAgent runtime, one Rust binaryMIT or Apache 2.0Free.Your machine, or boards such as a Raspberry Pi
      nanobotPython agent frameworkMITFree.Your computer or a server
      GooseGeneral agent, desktop and CLIApache 2.0Free.macOS, Linux, Windows
      ClaudeHosted agentProprietaryPro: $20 a month, billed monthly (19 Oct 2026).Anthropic’s servers
      +
      +

      Licences come from each repo and the Claude price from claude.com/pricing, all checked on 19 Oct 2026.

      +

      What is the best Hermes Agent alternative?

      +

      OpenClaw, if you like what Hermes Agent does. It does the same job under the same licence, with more channels and native phone apps. Hermes Agent still has the stronger learning story: skills it writes and improves from use, and a documented import from ~/.openclaw through hermes claw migrate. That command moves people toward Hermes Agent, not away from it.

      +
      Animation. A lift panel with three buttons: your computer, a server and Anthropic's servers. Each press lights a button and a card slides out with the picks for that floor.
      Pick by whose computer does the work. Tap a button to change floors.
      +

      If your agent only needs to answer you on Telegram and remember things, stay with Hermes Agent.

      +

      Is there a free Hermes Agent alternative?

      +

      Yes: six of the seven are free and open source, and so is Hermes Agent. The software costs nothing. The model does, unless you run a local one or reuse a plan you already pay for.

      +
      Animation. A sink with two taps. The tap marked software pours freely into a glass marked free, and the tap marked model fills a glass marked your API key, your plan or a local model.
      The software is free. The model is what you pay for.
      +

      Claude is the one pick here where the agent work starts on a paid plan: on 19 Oct 2026, Pro is $20 a month billed monthly, and Max is listed “From $100”.

      +

      Who should pick what?

      +

      Pick by the job first, then by whose computer does the work.

      +
        +
      • OpenClaw if you want Hermes Agent’s job with more channels and native phone apps.
      • +
      • Munder Difflin if the work is code and you want several agents on it at once.
      • +
      • NanoClaw if every agent should sit in its own container.
      • +
      • ZeroClaw if you want one Rust binary running as a service.
      • +
      • nanobot if you live in Python.
      • +
      • Goose if you want a desktop app first.
      • +
      • Claude if you would rather pay than host.
      • +
      +

      For the two closest projects side by side, read Hermes Agent vs OpenClaw.

      + + + + +
      +

      FAQ

      + +
      +

      What is the best Hermes Agent alternative?

      +

      OpenClaw, if you want the same job: a personal assistant in your chat apps that you host yourself. It is MIT licensed, has the most stars of any agent here, and shipped v2026.10.5 on 18 Oct 2026. If your real work is code, Munder Difflin fits better.

      +
      + +
      +

      Is there a free Hermes Agent alternative?

      +

      Yes. OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot and Goose are all free and open source, checked on 19 Oct 2026. You still bring a model: an API key, a subscription you already pay for, or a local model.

      +
      + +
      +

      Is there a Hermes Agent alternative for coding?

      +

      Goose handles code as one general agent with a desktop app and a CLI. Munder Difflin is built for it: a desktop app that runs a team of coding agents such as Claude Code, Codex and Gemini CLI on your own computer.

      +
      + +
      +

      Is there a hosted Hermes Agent alternative?

      +

      Claude is the hosted pick. Anthropic's help page says Cowork runs tasks in the cloud (in beta on Team and Enterprise plans) and that scheduled tasks do not need your computer to be awake. It needs a paid plan: Pro is $20 a month billed monthly.

      +
      + +
      +

      Can I move from OpenClaw to Hermes Agent?

      +

      Yes. The Hermes Agent README lists `hermes claw migrate` for people coming from OpenClaw. The move it documents goes from OpenClaw to Hermes Agent, not the other way.

      +
      + +
      + + + +
      + + +
      + + + + +
      + + +
      + +
      + + + + + + diff --git a/docs/blog/hermes-agent-vs-openclaw/index.html b/docs/blog/hermes-agent-vs-openclaw/index.html index 3dcb73f5f..aa6592968 100644 --- a/docs/blog/hermes-agent-vs-openclaw/index.html +++ b/docs/blog/hermes-agent-vs-openclaw/index.html @@ -353,50 +353,50 @@

      FAQ

      Related in Comparisons

      - +
      - + 5 min
      -

      OpenCode Alternatives: 7 Coding Agents to Switch To

      -

      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.

      +

      Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

      +

      Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

      Comparisons - Read → + Read →
      - +
      - + - 4 min + 5 min
      -

      Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

      -

      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.

      +

      OpenCode Alternatives: 7 Coding Agents to Switch To

      +

      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.

      Comparisons - Read → + Read →
      diff --git a/docs/blog/how-ai-answer-engines-choose-sources/index.html b/docs/blog/how-ai-answer-engines-choose-sources/index.html index 6a49ff64e..4d1212d5e 100644 --- a/docs/blog/how-ai-answer-engines-choose-sources/index.html +++ b/docs/blog/how-ai-answer-engines-choose-sources/index.html @@ -322,50 +322,50 @@

      FAQ

      Related in Comparisons

      - +
      - + 5 min
      -

      OpenCode Alternatives: 7 Coding Agents to Switch To

      -

      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.

      +

      Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

      +

      Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

      Comparisons - Read → + Read →
      - +
      - + - 4 min + 5 min
      -

      Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

      -

      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.

      +

      OpenCode Alternatives: 7 Coding Agents to Switch To

      +

      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.

      Comparisons - Read → + Read →
      diff --git a/docs/blog/how-to-choose-a-multi-agent-tool/index.html b/docs/blog/how-to-choose-a-multi-agent-tool/index.html index 51a07b136..08fcdb4b0 100644 --- a/docs/blog/how-to-choose-a-multi-agent-tool/index.html +++ b/docs/blog/how-to-choose-a-multi-agent-tool/index.html @@ -337,50 +337,50 @@

      Run the checklist Related in Comparisons

      - +
      - + 5 min
      -

      OpenCode Alternatives: 7 Coding Agents to Switch To

      -

      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.

      +

      Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

      +

      Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

      Comparisons - Read → + Read →
      - +
      - + - 4 min + 5 min
      -

      Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

      -

      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.

      +

      OpenCode Alternatives: 7 Coding Agents to Switch To

      +

      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.

      Comparisons - Read → + Read →
      diff --git a/docs/blog/index.html b/docs/blog/index.html index 96c2dff1e..bb9f31312 100644 --- a/docs/blog/index.html +++ b/docs/blog/index.html @@ -135,19 +135,19 @@

      The Munder Difflin Blog.

      building a self-coordinating hive of agents with a GOD orchestrator you talk to.

      + + + + + + + + +
      +
      + - -
      -
      - - - - - - - -
      -
      -
      +
      diff --git a/docs/blog/indian-open-source-ai-projects-vs-big-tech/index.html b/docs/blog/indian-open-source-ai-projects-vs-big-tech/index.html index 667bd476d..280288c2c 100644 --- a/docs/blog/indian-open-source-ai-projects-vs-big-tech/index.html +++ b/docs/blog/indian-open-source-ai-projects-vs-big-tech/index.html @@ -628,50 +628,50 @@

      FAQ

      Related in Comparisons

      - +
      - + 5 min
      -

      OpenCode Alternatives: 7 Coding Agents to Switch To

      -

      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.

      +

      Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

      +

      Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

      Comparisons - Read → + Read →
      - +
      - + - 4 min + 5 min
      -

      Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

      -

      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.

      +

      OpenCode Alternatives: 7 Coding Agents to Switch To

      +

      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.

      Comparisons - Read → + Read →
      diff --git a/docs/blog/kilo-code-vs-cline/index.html b/docs/blog/kilo-code-vs-cline/index.html new file mode 100644 index 000000000..f307b6c3f --- /dev/null +++ b/docs/blog/kilo-code-vs-cline/index.html @@ -0,0 +1,443 @@ + + + + + + + + +Kilo Code vs Cline (Oct 2026): Pricing, Models, Where Each Runs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +
      +
      + +

      Kilo Code vs Cline: Two Open Source Coding Agents Compared

      +

      Kilo Code vs Cline, checked 19 Oct 2026: licences, where each runs, how you pay for models, team prices and which one to pick.

      + +
      + +
      Title card on white. The title Kilo Code vs Cline in large ink type, a Two open source coding agents kicker, a Checked 19 Oct 2026 line, and a blue paddle and a lilac paddle trading a ball over a mint table.
      + +
      +
      +

      Kilo Code and Cline are free, open source coding agents that live in your editor and terminal. Pick Kilo Code for 500+ models through one account and $15 team seats (19 Oct 2026). Pick Cline for the Apache 2.0 licence, a desktop app and an SDK, with model use at cost or on your own key. Checked 19 Oct 2026.

      +
      Animation. Two tool belts, one above the other. The Kilo Code belt fills its pouches with VS Code, JetBrains, CLI and cloud; the Cline belt fills VS Code, JetBrains, CLI, desktop app and SDK.
      Where each one runs, from each README on 19 Oct 2026.
      +

      If you would rather run several agents at once than one in your editor, 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. More picks in our Comparisons hub.

      +

      What are Kilo Code and Cline?

      +

      Kilo Code calls itself “an AI coding agent that meets you everywhere you work”: VS Code, JetBrains and the CLI. Its README says you pick from 500+ models and can switch models in the middle of a task. It ships agents named Code, Plan, Ask and Debug, and you can build your own. The Kilo Marketplace adds agents, skills, MCP servers and plugins. The README also says “Kilo CLI is a fork of OpenCode”. MIT licensed, 27,654 stars and VS Code release v7.8.12 (15 Oct) on 19 Oct 2026.

      +

      Cline calls itself “The open source coding agent in your IDE, terminal, & desktop.” It runs as a CLI that also works headless for CI and scripts, a desktop app for macOS and Windows, a VS Code extension, a JetBrains plugin and an SDK for building your own agents. By default it asks for your approval before it acts. Apache 2.0, 70,527 stars on 19 Oct 2026. Our Cline vs Munder Difflin page has more on Cline’s own releases.

      +

      Kilo Code vs Cline at a glance, checked 19 Oct 2026

      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Kilo CodeCline
      LicenceMITApache 2.0
      EditorsVS Code, JetBrainsVS Code; JetBrains on Enterprise
      TerminalKilo CLI (a fork of OpenCode)Cline CLI, also headless
      Other placesWeb at app.kilo.ai/cloudDesktop app (macOS, Windows), SDK, Cline Cloud sessions (rolling out)
      Models500+ through one account, or your own keyAt cost through Cline, or your own key
      Individual priceFree, usage billed separately (19 Oct 2026)Free, pay for inference (19 Oct 2026)
      Team priceTeams $15 per user per month; Enterprise custom (19 Oct 2026)Enterprise, contact sales (19 Oct 2026)
      Latest releasev7.8.12 (VS Code and CLI), 15 Oct 2026Extension v4.1.25, 16 Oct 2026; CLI v3.0.73, 17 Oct 2026
      +
      +

      Licences and releases come from the GitHub API, prices from kilo.ai/pricing and cline.bot/pricing, all read on 19 Oct 2026.

      +

      Where does each one run?

      +

      Both list a VS Code extension, a JetBrains plugin and a CLI, though Cline’s pricing page puts JetBrains under Enterprise. After that they split.

      +
        +
      • Kilo Code adds the web. Its README says you can run Kilo “from the web, no local machine needed” at app.kilo.ai/cloud, and set up automated code reviews on pull requests.
      • +
      • Cline adds a desktop app and an SDK. The desktop app runs agent sessions in any folder and schedules routines. Extension v4.1.25 (16 Oct 2026) added Cline Cloud sessions, “rolling out gradually”, which run a task in a hosted sandbox on a GitHub repo and branch you pick.
      • +
      +

      How do you pay for models?

      +

      Neither charges for the agent itself if you work alone. You pay for the model, plus Kilo’s cloud compute if you use it.

      +
      Animation. Two fuel pumps stand side by side. The Kilo Code pump has nozzles for free models, local models, BYOK, Kilo Gateway and Kilo Pass; the Cline pump has nozzles for at cost and BYOK.
      How you pay for the model, from each pricing page on 19 Oct 2026. Tap a pump to light its options.
      +
        +
      • Kilo Code: its pricing page says “Choose free models, local models, BYOK, Kilo Gateway, or Kilo Pass.” BYOK means bring your own key: you pay your model provider directly.
      • +
      • Cline: its pricing page says “Pay only for AI inference on a usage basis”, and lists model inference “at Cost or BYOK”.
      • +
      +

      Kilo Code’s page names five ways to pay, and Cline’s names two. On Kilo, Kilo Pass starts at $19 a month with up to 50% bonus credits, and credit purchases carry a 5% processing fee (19 Oct 2026).

      +

      What do teams pay?

      +

      This is where they differ most.

      +
      Animation. Two rows of cinema seats. Seats in the Kilo Code row light up one by one, each with a tag of 15 dollars per user per month; the Cline row has a single sign that reads Enterprise, contact sales.
      Team plans on 19 Oct 2026. Drag the slider to light more seats.
      +
        +
      • Kilo Code lists Teams at “$15/user/month” on 19 Oct 2026, with a 14 day Enterprise trial, and Enterprise at a custom price with SSO, audit logs and an SLA.
      • +
      • Cline lists two plans: the free open source plan, and Enterprise at a custom price with SSO, an SLA and dedicated support. Its pricing page lists the JetBrains extension under Enterprise.
      • +
      +

      Which should you pick?

      +

      Pick by where you work and who pays for the model.

      +
        +
      • Pick Kilo Code if you want one account for 500+ models, a per seat team plan, or a browser option without waiting for a rollout.
      • +
      • Pick Cline if you want the Apache 2.0 licence, a desktop app, or an SDK to build on.
      • +
      • Pick neither if you want different agents, such as Claude Code and Codex, working one job side by side: see best Claude Code multi agent tools.
      • +
      +

      Both ship releases every few days, so recheck the prices before you commit a team. New to running agents side by side? Start with the Munder Difflin install guide.

      + + + + +
      +

      FAQ

      + +
      +

      Is Kilo Code better than Cline?

      +

      Neither wins outright. Kilo Code fits people who want 500+ models through one account and $15 team seats. Cline fits people who want the Apache 2.0 licence, a desktop app and an SDK. Both are free for individuals.

      +
      + +
      +

      Are Kilo Code and Cline free?

      +

      Yes, for individuals. Kilo Code's Free plan says usage is billed separately, and Cline's pricing page says you pay only for AI inference on a usage basis. Bring your own key and you pay your model provider directly. Checked 19 Oct 2026.

      +
      + +
      +

      Which is open source, Kilo Code or Cline?

      +

      Both. Kilo Code is MIT licensed and Cline is Apache 2.0, according to the GitHub API on 19 Oct 2026. Kilo's README says its CLI is a fork of OpenCode.

      +
      + +
      +

      Do Kilo Code and Cline work in JetBrains?

      +

      Both list a JetBrains plugin next to the VS Code extension and a CLI. Cline's pricing page lists the JetBrains extension under its Enterprise plan, so check that page before you plan a team rollout.

      +
      + +
      +

      Can Kilo Code or Cline run in the cloud?

      +

      Kilo Code runs from the web at app.kilo.ai/cloud. Cline extension v4.1.25 (16 Oct 2026) added Cline Cloud sessions, rolling out gradually, which run a task in a hosted sandbox on a GitHub repo and branch you pick.

      +
      + +
      + + + +
      + + +
      + + + + +
      + + +
      + +
      + + + + + + diff --git a/docs/blog/local-first-vs-cloud-agent-sdks/index.html b/docs/blog/local-first-vs-cloud-agent-sdks/index.html index d25e14cc1..844f9297c 100644 --- a/docs/blog/local-first-vs-cloud-agent-sdks/index.html +++ b/docs/blog/local-first-vs-cloud-agent-sdks/index.html @@ -368,50 +368,50 @@

      FAQ

      Related in Comparisons

      - +
      - + 5 min
      -

      OpenCode Alternatives: 7 Coding Agents to Switch To

      -

      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.

      +

      Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

      +

      Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

      Comparisons - Read → + Read →
      - +
      - + - 4 min + 5 min
      -

      Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

      -

      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.

      +

      OpenCode Alternatives: 7 Coding Agents to Switch To

      +

      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.

      Comparisons - Read → + Read →
      diff --git a/docs/blog/meta-muse-alternatives/index.html b/docs/blog/meta-muse-alternatives/index.html index 75f6666cb..026fe95ce 100644 --- a/docs/blog/meta-muse-alternatives/index.html +++ b/docs/blog/meta-muse-alternatives/index.html @@ -345,50 +345,50 @@

      FAQ

      Related in Comparisons

      - +
      - + 5 min
      -

      OpenCode Alternatives: 7 Coding Agents to Switch To

      -

      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.

      +

      Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

      +

      Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

      Comparisons - Read → + Read →
      - +
      - + - 4 min + 5 min
      -

      Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

      -

      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.

      +

      OpenCode Alternatives: 7 Coding Agents to Switch To

      +

      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.

      Comparisons - Read → + Read →
      diff --git a/docs/blog/meta-muse-grok-bot-privacy/index.html b/docs/blog/meta-muse-grok-bot-privacy/index.html index 6a7477258..4f5b050ca 100644 --- a/docs/blog/meta-muse-grok-bot-privacy/index.html +++ b/docs/blog/meta-muse-grok-bot-privacy/index.html @@ -332,50 +332,50 @@

      FAQ

      Related in Comparisons

      - +
      - + 5 min
      -

      OpenCode Alternatives: 7 Coding Agents to Switch To

      -

      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.

      +

      Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

      +

      Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

      Comparisons - Read → + Read →
      - +
      - + - 4 min + 5 min
      -

      Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

      -

      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.

      +

      OpenCode Alternatives: 7 Coding Agents to Switch To

      +

      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.

      Comparisons - Read → + Read →
      diff --git a/docs/blog/meta-muse-vs-grok-bot/index.html b/docs/blog/meta-muse-vs-grok-bot/index.html index be64a89cd..907866aa9 100644 --- a/docs/blog/meta-muse-vs-grok-bot/index.html +++ b/docs/blog/meta-muse-vs-grok-bot/index.html @@ -336,50 +336,50 @@

      FAQ

      Related in Comparisons

      - +
      - + 5 min
      -

      OpenCode Alternatives: 7 Coding Agents to Switch To

      -

      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.

      +

      Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

      +

      Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

      Comparisons - Read → + Read →
      - +
      - + - 4 min + 5 min
      -

      Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

      -

      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.

      +

      OpenCode Alternatives: 7 Coding Agents to Switch To

      +

      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.

      Comparisons - Read → + Read →
      diff --git a/docs/blog/munder-difflin-vs-chatgpt-dots/index.html b/docs/blog/munder-difflin-vs-chatgpt-dots/index.html index 72e5cc555..d7d273bf8 100644 --- a/docs/blog/munder-difflin-vs-chatgpt-dots/index.html +++ b/docs/blog/munder-difflin-vs-chatgpt-dots/index.html @@ -358,50 +358,50 @@

      FAQ

      Related in Comparisons

      - +
      - + 5 min
      -

      OpenCode Alternatives: 7 Coding Agents to Switch To

      -

      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.

      +

      Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

      +

      Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

      Comparisons - Read → + Read →
      - +
      - + - 4 min + 5 min
      -

      Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

      -

      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.

      +

      OpenCode Alternatives: 7 Coding Agents to Switch To

      +

      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.

      Comparisons - Read → + Read →
      diff --git a/docs/blog/muse-code-vs-claude-code/index.html b/docs/blog/muse-code-vs-claude-code/index.html index 61bb57a0d..8eed2a026 100644 --- a/docs/blog/muse-code-vs-claude-code/index.html +++ b/docs/blog/muse-code-vs-claude-code/index.html @@ -331,50 +331,50 @@

      FAQ

      Related in Comparisons

      - +
      - + 5 min
      -

      OpenCode Alternatives: 7 Coding Agents to Switch To

      -

      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.

      +

      Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

      +

      Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

      Comparisons - Read → + Read →
      - +
      - + 4 min
      -

      Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

      -

      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.

      +

      Kilo Code vs Cline: Two Open Source Coding Agents Compared

      +

      Kilo Code vs Cline, checked 19 Oct 2026: licences, where each runs, how you pay for models, team prices and which one to pick.

      Comparisons - Read → + Read →
      diff --git a/docs/blog/omniagent-alternatives/index.html b/docs/blog/omniagent-alternatives/index.html index 7f1502b5c..5bcbfd7de 100644 --- a/docs/blog/omniagent-alternatives/index.html +++ b/docs/blog/omniagent-alternatives/index.html @@ -307,50 +307,50 @@

      FAQ

      Related in Comparisons

      - +
      - + 5 min
      -

      OpenCode Alternatives: 7 Coding Agents to Switch To

      -

      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.

      +

      Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

      +

      Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

      Comparisons - Read → + Read →
      - +
      - + - 4 min + 5 min
      -

      Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

      -

      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.

      +

      OpenCode Alternatives: 7 Coding Agents to Switch To

      +

      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.

      Comparisons - Read → + Read →
      diff --git a/docs/blog/open-source-ai-agents/index.html b/docs/blog/open-source-ai-agents/index.html index c2917939d..d6f675325 100644 --- a/docs/blog/open-source-ai-agents/index.html +++ b/docs/blog/open-source-ai-agents/index.html @@ -374,50 +374,50 @@

      FAQ

      Related in Comparisons

      - +
      - + 5 min
      -

      OpenCode Alternatives: 7 Coding Agents to Switch To

      -

      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.

      +

      Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

      +

      Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

      Comparisons - Read → + Read →
      - +
      - + - 4 min + 5 min
      -

      Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

      -

      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.

      +

      OpenCode Alternatives: 7 Coding Agents to Switch To

      +

      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.

      Comparisons - Read → + Read →
      diff --git a/docs/blog/openclaw-alternatives/index.html b/docs/blog/openclaw-alternatives/index.html index ef4ccf9a6..79205c240 100644 --- a/docs/blog/openclaw-alternatives/index.html +++ b/docs/blog/openclaw-alternatives/index.html @@ -196,7 +196,7 @@

      What is OpenC

    Seven OpenClaw alternatives, by job

    Two of the seven kept the claw in the name. Nobody said naming was easy.

    -

    1. Hermes Agent. Hermes Agent from Nous Research is the closest swap. It is MIT licensed, creates skills from experience, has a cron scheduler, and answers on Telegram, Discord, Slack, WhatsApp and Signal. hermes claw migrate imports your OpenClaw settings, memories, skills and API keys. Our Hermes Agent explainer covers the install. Best for: the same job, with memory that grows.

    +

    1. Hermes Agent. Hermes Agent from Nous Research is the closest swap. It is MIT licensed, creates skills from experience, has a cron scheduler, and answers on Telegram, Discord, Slack, WhatsApp and Signal. hermes claw migrate imports your OpenClaw settings, memories, skills and API keys. Our Hermes Agent explainer covers the install, and Hermes Agent alternatives runs the list the other way. Best for: the same job, with memory that grows.

    2. Munder Difflin. This is what we make, and 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. Each agent is a real CLI in a real terminal, with a role, shared memory and messages to the others. It runs on macOS, Windows and Linux. The limits: it is for coding work, it does not run personal errands or answer your WhatsApp, and agents work while your computer is on. The install guide takes you from download to a first agent. Best for: people who used OpenClaw mostly to get code written.

    3. NanoClaw. NanoClaw (MIT) is described on its repo as “a lightweight alternative to OpenClaw that runs in containers for security”. It runs on Anthropic’s Agents SDK by default, and its README lists Codex, OpenCode and Ollama as add-on providers. Each agent runs in its own Linux container and sees only what you mount. It needs Docker, on macOS, Linux or Windows through WSL2. Our NanoClaw explainer covers setup, models and chat apps. Best for: isolation first.

    4. ZeroClaw. ZeroClaw is a single Rust binary, dual licensed MIT or Apache 2.0. Its README lists 30+ channels and a default autonomy level called supervised, where medium risk operations need your approval. It also drives hardware such as a Raspberry Pi. Our ZeroClaw explainer covers install and providers. Best for: a small always on service.

    @@ -359,50 +359,50 @@

    FAQ

    Related in Comparisons

    - +
    - + 5 min
    -

    OpenCode Alternatives: 7 Coding Agents to Switch To

    -

    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.

    +

    Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

    +

    Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

    Comparisons - Read → + Read →
    - +
    - + - 4 min + 5 min
    -

    Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

    -

    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.

    +

    OpenCode Alternatives: 7 Coding Agents to Switch To

    +

    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.

    Comparisons - Read → + Read →
    diff --git a/docs/blog/opencode-alternatives/index.html b/docs/blog/opencode-alternatives/index.html index a94842b2f..94f7dd729 100644 --- a/docs/blog/opencode-alternatives/index.html +++ b/docs/blog/opencode-alternatives/index.html @@ -359,50 +359,50 @@

    FAQ

    Related in Comparisons

    - +
    - + - 4 min + 5 min
    -

    Muse Code vs Claude Code: Plans, Prices, Models and Where They Run

    -

    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.

    +

    Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

    +

    Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

    Comparisons - Read → + Read →
    - +
    - + 4 min
    -

    Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

    -

    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.

    +

    Kilo Code vs Cline: Two Open Source Coding Agents Compared

    +

    Kilo Code vs Cline, checked 19 Oct 2026: licences, where each runs, how you pay for models, team prices and which one to pick.

    Comparisons - Read → + Read →
    - +
    - + - 5 min + 4 min
    -

    Codex Usage Limits vs Claude Code: What Each Plan Gives You

    -

    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.

    +

    Muse Code vs Claude Code: Plans, Prices, Models and Where They Run

    +

    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.

    Comparisons - Read → + Read →
    diff --git a/docs/blog/opencode-vs-claude-code/index.html b/docs/blog/opencode-vs-claude-code/index.html index 3a78dac71..bca0f99d0 100644 --- a/docs/blog/opencode-vs-claude-code/index.html +++ b/docs/blog/opencode-vs-claude-code/index.html @@ -341,50 +341,50 @@

    FAQ

    Related in Comparisons

    - +
    - + 5 min
    -

    OpenCode Alternatives: 7 Coding Agents to Switch To

    -

    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.

    +

    Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

    +

    Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

    Comparisons - Read → + Read →
    - +
    - + - 4 min + 5 min
    -

    Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

    -

    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.

    +

    OpenCode Alternatives: 7 Coding Agents to Switch To

    +

    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.

    Comparisons - Read → + Read →
    diff --git a/docs/blog/orca-vs-munder-difflin/index.html b/docs/blog/orca-vs-munder-difflin/index.html index 1310073a1..7a79ffb33 100644 --- a/docs/blog/orca-vs-munder-difflin/index.html +++ b/docs/blog/orca-vs-munder-difflin/index.html @@ -346,50 +346,50 @@

    FAQ

    Related in Comparisons

    - +
    - + 5 min
    -

    OpenCode Alternatives: 7 Coding Agents to Switch To

    -

    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.

    +

    Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

    +

    Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

    Comparisons - Read → + Read →
    - +
    - + - 4 min + 5 min
    -

    Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

    -

    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.

    +

    OpenCode Alternatives: 7 Coding Agents to Switch To

    +

    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.

    Comparisons - Read → + Read →
    diff --git a/docs/blog/qm-vs-munder-difflin/index.html b/docs/blog/qm-vs-munder-difflin/index.html index 32dcc70b9..f15def55e 100644 --- a/docs/blog/qm-vs-munder-difflin/index.html +++ b/docs/blog/qm-vs-munder-difflin/index.html @@ -357,50 +357,50 @@

    FAQ

    Related in Comparisons

    - +
    - + 5 min
    -

    OpenCode Alternatives: 7 Coding Agents to Switch To

    -

    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.

    +

    Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

    +

    Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

    Comparisons - Read → + Read →
    - +
    - + - 4 min + 5 min
    -

    Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

    -

    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.

    +

    OpenCode Alternatives: 7 Coding Agents to Switch To

    +

    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.

    Comparisons - Read → + Read →
    diff --git a/docs/blog/tags/ai-agents/index.html b/docs/blog/tags/ai-agents/index.html index 472e20558..d49fdde82 100644 --- a/docs/blog/tags/ai-agents/index.html +++ b/docs/blog/tags/ai-agents/index.html @@ -105,11 +105,27 @@

    Tag

    #AI Agents

    -

    32 posts tagged AI Agents.

    +

    33 posts tagged AI Agents.

    -
    + +
    diff --git a/docs/blog/tags/claude-code/index.html b/docs/blog/tags/claude-code/index.html index d7eba78ae..8e15748a3 100644 --- a/docs/blog/tags/claude-code/index.html +++ b/docs/blog/tags/claude-code/index.html @@ -105,11 +105,27 @@

    Tag

    #Claude Code

    -

    94 posts tagged Claude Code.

    +

    95 posts tagged Claude Code.

    +
    diff --git a/docs/blog/tags/comparisons/index.html b/docs/blog/tags/comparisons/index.html index ba2c35187..e94020ac7 100644 --- a/docs/blog/tags/comparisons/index.html +++ b/docs/blog/tags/comparisons/index.html @@ -105,11 +105,43 @@

    Tag

    #Comparisons

    -

    44 posts tagged Comparisons.

    +

    46 posts tagged Comparisons.

    + +
    diff --git a/docs/blog/tags/daily-brief/index.html b/docs/blog/tags/daily-brief/index.html index 604101c64..1378c1100 100644 --- a/docs/blog/tags/daily-brief/index.html +++ b/docs/blog/tags/daily-brief/index.html @@ -105,11 +105,27 @@

    Tag

    #Daily Brief

    -

    15 posts tagged Daily Brief.

    +

    16 posts tagged Daily Brief.

    +
    diff --git a/docs/blog/tags/ide-agents/index.html b/docs/blog/tags/ide-agents/index.html new file mode 100644 index 000000000..87b1aa47b --- /dev/null +++ b/docs/blog/tags/ide-agents/index.html @@ -0,0 +1,185 @@ + + + + + + + + +IDE Agents — Munder Difflin Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +

    Tag

    +

    #IDE Agents

    +

    1 post tagged IDE Agents.

    +
    +
    +
    + + +
    +
    + + +
    + + + + + + diff --git a/docs/blog/tags/local-first/index.html b/docs/blog/tags/local-first/index.html index c0d8ad82f..7cef17a96 100644 --- a/docs/blog/tags/local-first/index.html +++ b/docs/blog/tags/local-first/index.html @@ -105,11 +105,27 @@

    Tag

    #Local-First

    -

    22 posts tagged Local-First.

    +

    23 posts tagged Local-First.

    +
    diff --git a/docs/blog/tags/mcp/index.html b/docs/blog/tags/mcp/index.html index f1625df89..879a3411d 100644 --- a/docs/blog/tags/mcp/index.html +++ b/docs/blog/tags/mcp/index.html @@ -105,11 +105,27 @@

    Tag

    #MCP

    -

    11 posts tagged MCP.

    +

    12 posts tagged MCP.

    +
    diff --git a/docs/blog/tags/open-source/index.html b/docs/blog/tags/open-source/index.html index 4c0c465ba..50476a8d1 100644 --- a/docs/blog/tags/open-source/index.html +++ b/docs/blog/tags/open-source/index.html @@ -105,11 +105,59 @@

    Tag

    #Open Source

    -

    73 posts tagged Open Source.

    +

    76 posts tagged Open Source.

    + + +
    diff --git a/docs/blog/tmux-and-scripts-vs-an-agent-harness/index.html b/docs/blog/tmux-and-scripts-vs-an-agent-harness/index.html index 7605b89b9..8c31db717 100644 --- a/docs/blog/tmux-and-scripts-vs-an-agent-harness/index.html +++ b/docs/blog/tmux-and-scripts-vs-an-agent-harness/index.html @@ -283,50 +283,50 @@

    FAQ

    Related in Comparisons

    - +
    - + 5 min
    -

    OpenCode Alternatives: 7 Coding Agents to Switch To

    -

    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.

    +

    Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

    +

    Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

    Comparisons - Read → + Read →
    - +
    - + - 4 min + 5 min
    -

    Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

    -

    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.

    +

    OpenCode Alternatives: 7 Coding Agents to Switch To

    +

    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.

    Comparisons - Read → + Read →
    diff --git a/docs/blog/topics/comparisons/index.html b/docs/blog/topics/comparisons/index.html index 98f8d18a4..dc83793d2 100644 --- a/docs/blog/topics/comparisons/index.html +++ b/docs/blog/topics/comparisons/index.html @@ -118,13 +118,13 @@

    comparisons

    Honest side-by-sides with the other ways to guides52 - comparisons44 + comparisons46 internals19 story19 - news15 + news16 orchestration9 @@ -185,6 +185,38 @@

    OmniAgent Alternatives: What to Use

    + +
    diff --git a/docs/blog/topics/concepts/index.html b/docs/blog/topics/concepts/index.html index 472a28993..b8c56e93b 100644 --- a/docs/blog/topics/concepts/index.html +++ b/docs/blog/topics/concepts/index.html @@ -118,13 +118,13 @@

    concepts

    The ideas underneath the product — harnesses, guides52 - comparisons44 + comparisons46 internals19 story19 - news15 + news16 orchestration9 diff --git a/docs/blog/topics/guides/index.html b/docs/blog/topics/guides/index.html index 329961758..cdfa669aa 100644 --- a/docs/blog/topics/guides/index.html +++ b/docs/blog/topics/guides/index.html @@ -118,13 +118,13 @@

    guides

    Step-by-step walkthroughs you can follow today guides52 - comparisons44 + comparisons46 internals19 story19 - news15 + news16 orchestration9 diff --git a/docs/blog/topics/index.html b/docs/blog/topics/index.html index b2a9fc425..89bd3b302 100644 --- a/docs/blog/topics/index.html +++ b/docs/blog/topics/index.html @@ -135,7 +135,7 @@

    guides

    comparisons

    -

    44 posts.

    +

    46 posts.

    View topic →
    @@ -162,7 +162,7 @@

    story

    news

    -

    15 posts.

    +

    16 posts.

    View topic →
    @@ -200,25 +200,25 @@

    memory

    diff --git a/docs/blog/topics/internals/index.html b/docs/blog/topics/internals/index.html index df6eaa6ac..433480bef 100644 --- a/docs/blog/topics/internals/index.html +++ b/docs/blog/topics/internals/index.html @@ -118,13 +118,13 @@

    internals

    How the machine actually works: postmortems, a guides52 - comparisons44 + comparisons46 internals19 story19 - news15 + news16 orchestration9 diff --git a/docs/blog/topics/memory/index.html b/docs/blog/topics/memory/index.html index a48038d2e..d6fa931bc 100644 --- a/docs/blog/topics/memory/index.html +++ b/docs/blog/topics/memory/index.html @@ -118,13 +118,13 @@

    memory

    How agents remember across sessions — and how a guides52 - comparisons44 + comparisons46 internals19 story19 - news15 + news16 orchestration9 diff --git a/docs/blog/topics/news/index.html b/docs/blog/topics/news/index.html index 0a3b7af90..3b2a0a7e6 100644 --- a/docs/blog/topics/news/index.html +++ b/docs/blog/topics/news/index.html @@ -118,13 +118,13 @@

    news

    Agent Tools Today: a daily brief of the top five la guides52 - comparisons44 + comparisons46 internals19 story19 - news15 + news16 orchestration9 @@ -138,6 +138,22 @@

    news

    Agent Tools Today: a daily brief of the top five la

    +
    diff --git a/docs/blog/topics/orchestration/index.html b/docs/blog/topics/orchestration/index.html index a8e3353fa..aa77925cf 100644 --- a/docs/blog/topics/orchestration/index.html +++ b/docs/blog/topics/orchestration/index.html @@ -118,13 +118,13 @@

    orchestration

    Patterns for making one boss agent run a f guides52 - comparisons44 + comparisons46 internals19 story19 - news15 + news16 orchestration9 diff --git a/docs/blog/topics/story/index.html b/docs/blog/topics/story/index.html index 9c42165a8..2cc8bd43f 100644 --- a/docs/blog/topics/story/index.html +++ b/docs/blog/topics/story/index.html @@ -118,13 +118,13 @@

    story

    Launches, releases, and the occasional confession guides52 - comparisons44 + comparisons46 internals19 story19 - news15 + news16 orchestration9 diff --git a/docs/blog/topics/use-cases/index.html b/docs/blog/topics/use-cases/index.html index ed1dda54d..91f21b6fc 100644 --- a/docs/blog/topics/use-cases/index.html +++ b/docs/blog/topics/use-cases/index.html @@ -118,13 +118,13 @@

    use-cases

    Real workflows the hive actually runs — writ guides52 - comparisons44 + comparisons46 internals19 story19 - news15 + news16 orchestration9 diff --git a/docs/blog/vibe-kanban-alternative/index.html b/docs/blog/vibe-kanban-alternative/index.html index 1a2d1f294..b52be29bb 100644 --- a/docs/blog/vibe-kanban-alternative/index.html +++ b/docs/blog/vibe-kanban-alternative/index.html @@ -273,50 +273,50 @@

    Board or hive? How to choose

    Related in Comparisons

    - +
    - + 5 min
    -

    OpenCode Alternatives: 7 Coding Agents to Switch To

    -

    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.

    +

    Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud

    +

    Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026.

    Comparisons - Read → + Read →
    - +
    - + - 4 min + 5 min
    -

    Gemini 4 Argon vs Claude Opus 5.5 vs GPT-6 Astra: Google Published a Table It Does Not Fully Win

    -

    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.

    +

    OpenCode Alternatives: 7 Coding Agents to Switch To

    +

    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.

    Comparisons - Read → + Read →
    diff --git a/docs/blog/what-is-hermes-agent/index.html b/docs/blog/what-is-hermes-agent/index.html index c1e94ec05..c420cfda8 100644 --- a/docs/blog/what-is-hermes-agent/index.html +++ b/docs/blog/what-is-hermes-agent/index.html @@ -277,7 +277,7 @@

    What is the lates

    Zero assets is expected: the installer pulls from git, so the release is a tag and notes, with no binaries attached. Releases use a date tag and a version name, and the list shows five in September alone. The v0.21.5 notes call it a patch release rolling up about 460 merged pull requests since v0.21.4, and defer the full write up to v0.22.0.

    Hermes Agent vs OpenClaw, Munder Difflin, Claude Code and Pi: which should you use?

    -

    Hermes or OpenClaw if you want a personal assistant in your chat apps, the other three if the job is code. Our OpenClaw alternatives list has more picks. Head to head: Hermes Agent vs OpenClaw. Licences and releases read from each repo through gh api on 3 Oct 2026, dates in UTC:

    +

    Hermes or OpenClaw if you want a personal assistant in your chat apps, the other three if the job is code. Our OpenClaw alternatives and Hermes Agent alternatives lists have more picks. Head to head: Hermes Agent vs OpenClaw. Licences and releases read from each repo through gh api on 3 Oct 2026, dates in UTC:

    diff --git a/docs/llms.txt b/docs/llms.txt index 0af3cde3d..3e5321611 100644 --- a/docs/llms.txt +++ b/docs/llms.txt @@ -68,7 +68,7 @@ Saturday 24 October 2026. ## Blog -227 posts, grouped by topic, newest first in each topic. Topic hubs: https://munderdiffl.in/blog/topics/ +230 posts, grouped by topic, newest first in each topic. Topic hubs: https://munderdiffl.in/blog/topics/ ### concepts @@ -188,6 +188,8 @@ Saturday 24 October 2026. - [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. +- [Hermes Agent Alternatives: 7 Picks for Chat, Code and Cloud](https://munderdiffl.in/blog/hermes-agent-alternatives/): Seven Hermes Agent alternatives sorted by job: OpenClaw, Munder Difflin, NanoClaw, ZeroClaw, nanobot, Goose and Claude. Licences and prices checked 19 Oct 2026. +- [Kilo Code vs Cline: Two Open Source Coding Agents Compared](https://munderdiffl.in/blog/kilo-code-vs-cline/): Kilo Code vs Cline, checked 19 Oct 2026: licences, where each runs, how you pay for models, team prices and which one to pick. - [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. @@ -276,6 +278,7 @@ Saturday 24 October 2026. ### news +- [Agent Tools Today, 19 Oct 2026: DeepSeek Search API, Sphinx, OpenClaw 2026.10.5](https://munderdiffl.in/blog/agent-tools-today-2026-10-19/): The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 19 Oct 2026, each with its source. - [Agent Tools Today, 18 Oct 2026: LeanREA Takes On REA, FLUX 3 Image Klein, Hy Memory](https://munderdiffl.in/blog/agent-tools-today-2026-10-18/): The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 18 Oct 2026, each with its source. - [Agent Tools Today, 17 Oct 2026: Muse Spark Open on Mac Studio, StarSkirmish, Claude Design Closes](https://munderdiffl.in/blog/agent-tools-today-2026-10-17/): The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 17 Oct 2026, each with its source. - [Agent Tools Today, 16 Oct 2026: Muse Spark Open, Tiny Little Office, OpenCode Ends Sharing](https://munderdiffl.in/blog/agent-tools-today-2026-10-16/): The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 16 Oct 2026, each with its source. diff --git a/docs/sitemap.xml b/docs/sitemap.xml index fc8f8bad9..c7a382fda 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -10,7 +10,7 @@ https://munderdiffl.in/ - 2026-10-18 + 2026-10-19 weekly 1.0 @@ -21,6 +21,24 @@ https://munderdiffl.in/blog/daily0.9 https://munderdiffl.in/blog/topics/weekly0.6 https://munderdiffl.in/blog/about/monthly0.4 + + https://munderdiffl.in/blog/agent-tools-today-2026-10-19/ + 2026-10-19 + monthly + 0.8 + + + https://munderdiffl.in/blog/hermes-agent-alternatives/ + 2026-10-19 + monthly + 0.8 + + + https://munderdiffl.in/blog/kilo-code-vs-cline/ + 2026-10-19 + monthly + 0.8 + https://munderdiffl.in/blog/agent-tools-today-2026-10-18/ 2026-10-18