diff --git a/blog/src/_data/media.json b/blog/src/_data/media.json index e1c7d2131b..f9010e904a 100644 --- a/blog/src/_data/media.json +++ b/blog/src/_data/media.json @@ -3332,6 +3332,17 @@ }, "inline": {} }, + "antigravity-alternatives": { + "title": "Antigravity Alternatives: 6 Picks by Why You Are Leaving (Nov 2026)", + "category": "comparisons", + "hero": { + "file": "assets/media/antigravity-alternatives/hero.png", + "alt": "Title card on white. A pill reading Alternatives, the title Antigravity alternatives, the line 6 picks by why you are leaving and a Checked 4 Nov 2026 line. Six small tiles named Claude Code, Munder Difflin, Codex, Cursor, Cline and Zed slide in under a grey tile labelled Antigravity.", + "prompt": "Title card: the hero scene in assets/media/antigravity-alternatives/motion.js, shot at 1600 by 900.", + "status": "ready" + }, + "inline": {} + }, "the-hook-shim-pattern": { "title": "The Hook Shim Pattern: Wiring Agent Hooks to a Live Process", "category": "internals", diff --git a/blog/src/assets/media/antigravity-alternatives/calendar.png b/blog/src/assets/media/antigravity-alternatives/calendar.png new file mode 100644 index 0000000000..0624d8c28e Binary files /dev/null and b/blog/src/assets/media/antigravity-alternatives/calendar.png differ diff --git a/blog/src/assets/media/antigravity-alternatives/hero.png b/blog/src/assets/media/antigravity-alternatives/hero.png new file mode 100644 index 0000000000..d6067a41e0 Binary files /dev/null and b/blog/src/assets/media/antigravity-alternatives/hero.png differ diff --git a/blog/src/assets/media/antigravity-alternatives/motion.css b/blog/src/assets/media/antigravity-alternatives/motion.css new file mode 100644 index 0000000000..e2d54f64b5 --- /dev/null +++ b/blog/src/assets/media/antigravity-alternatives/motion.css @@ -0,0 +1,13 @@ +/* Bright coded scenes for "Antigravity 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/antigravity-alternatives/motion.js b/blog/src/assets/media/antigravity-alternatives/motion.js new file mode 100644 index 0000000000..0470dbaec3 --- /dev/null +++ b/blog/src/assets/media/antigravity-alternatives/motion.js @@ -0,0 +1,237 @@ +/* Bright coded scenes for "Antigravity 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", GREY = "#DCD6E2"; + 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 = {}; + + /* ---- 1. a desk calendar flips to November 18 and a note lands ---- */ + SC.calendar = { + dur: 4.2, + build(svg, api) { + const X = 200, Y = 110, W = 400, H = 420, FL = [0.4, 0.95, 1.5, 2.05], FD = 0.5; + const cal = el("g", {}, svg); + el("rect", { x: X - 28, y: Y - 34, width: W + 56, height: H + 62, rx: 24, fill: "#fff", "fill-opacity": 0, class: "mg-ring", stroke: INK, "stroke-width": 2.5, "stroke-dasharray": "4 8" }, cal); + el("rect", { x: X - 60, y: Y + H + 8, width: W + 120, height: 34, rx: 17, fill: BLUE, stroke: INK, "stroke-width": 3 }, cal); + el("rect", { x: X - 16, y: Y - 22, width: W + 32, height: H + 36, rx: 18, fill: LIL, stroke: INK, "stroke-width": 3 }, cal); + const HEAD = [SKY, MINT, LIL, BLUE]; + const face = (i) => { + const g = el("g", {}, cal); + el("rect", { x: X, y: Y, width: W, height: H, rx: 12, fill: "#fff", stroke: INK, "stroke-width": 3 }, g); + if (i < 4) { + el("rect", { x: X, y: Y, width: W, height: 74, rx: 12, fill: HEAD[i], stroke: INK, "stroke-width": 3 }, g); + for (let r = 0; r < 4; r++) for (let c = 0; c < 5; c++) el("rect", { x: X + 34 + c * 70, y: Y + 110 + r * 72, width: 52, height: 52, rx: 10, fill: SOFT }, g); + } else { + el("rect", { x: X, y: Y, width: W, height: 74, rx: 12, fill: YEL, stroke: INK, "stroke-width": 3 }, g); + txt(g, X + W / 2, Y + 50, "November", { "text-anchor": "middle", "font-size": 34, "font-weight": 700 }); + txt(g, X + W / 2, Y + 236, "18", { "text-anchor": "middle", "font-size": 150, "font-weight": 700 }); + } + return g; + }; + const under = [0, 1, 2, 3, 4].map(face); + const flip = el("g", {}, cal); + const flipFace = [0, 1, 2, 3].map((i) => { const f = face(i); flip.appendChild(f); return f; }); + const back = el("rect", { x: X, y: Y, width: W, height: H, rx: 12, fill: SOFT, stroke: INK, "stroke-width": 3 }, flip); + for (let i = 0; i < 8; i++) { + const x = X + 40 + i * 45; + el("rect", { x: x - 6, y: Y - 18, width: 12, height: 34, rx: 6, fill: "#fff", stroke: INK, "stroke-width": 3 }, cal); + } + const note = el("g", {}, cal); + el("rect", { x: -130, y: -64, width: 260, height: 128, rx: 8, fill: YEL, stroke: INK, "stroke-width": 3 }, note); + ["Claude 4.6 and", "GPT OSS 120b", "leave Antigravity"].forEach((s, i) => txt(note, 0, -22 + i * 32, s, { "text-anchor": "middle", "font-size": 23, "font-weight": 700 })); + button(cal, "Calendar: flip the pages again", () => api.seek(0)); + return (t) => { + const n = FL.filter((s) => t >= s).length, cur = n - 1, p = n ? seg(t, FL[cur], FL[cur] + FD) : 1; + const show = n === 0 ? 0 : p < 1 ? cur + 1 : n; + under.forEach((g, i) => g.setAttribute("display", i === show || (n === 0 && i === 0) ? "inline" : "none")); + if (n === 0 || p >= 1) flip.setAttribute("display", "none"); + else { + const s = 1 - 1.25 * io(p); + flip.setAttribute("display", "inline"); + flip.setAttribute("transform", `translate(0 ${Y}) scale(1 ${Math.abs(s) < 0.01 ? 0.01 : s}) translate(0 ${-Y})`); + flipFace.forEach((f, i) => f.setAttribute("display", i === cur && s > 0 ? "inline" : "none")); + back.setAttribute("display", s > 0 ? "none" : "inline"); + } + const k = seg(t, 2.8, 3.4), d = ob(k); + tf(note, 460, 440 - 260 * (1 - d), 1.25 - 0.25 * oc(k), -4 + 10 * (1 - oc(k))); + note.setAttribute("opacity", k <= 0 ? 0 : cl(k * 4)); + }; + }, + }; + + /* ---- 2. a vending machine with six snacks, each card says where it runs ---- */ + SC.vending = { + dur: 3, + build(svg, api) { + const NAMES = ["Claude Code", "Munder Difflin", "Codex", "Cursor", "Cline", "Zed"]; + const RUNS = ["Terminal, IDE, desktop, web", "Your computer", "CLI, IDE, desktop app, web", "Desktop, CLI, cloud agents", "VS Code, JetBrains, terminal, desktop", "Your computer"]; + const COL = [YEL, MINT, LIL, SKY, YEL, MINT]; + const WX = 116, WY = 50, WW = 568, WH = 240, slot = WW / 6, cx = (i) => WX + slot * (i + 0.5); + let pick = 1; + el("rect", { x: 90, y: 24, width: 620, height: 556, rx: 28, fill: BLUE, stroke: INK, "stroke-width": 4 }, svg); + el("rect", { x: WX, y: WY, width: WW, height: WH, rx: 16, fill: "#fff", stroke: INK, "stroke-width": 3 }, svg); + const clip = el("clipPath", { id: "mgv-win" }, el("defs", {}, svg)); + el("rect", { x: WX + 2, y: WY + 2, width: WW - 4, height: 206 - WY - 3, rx: 14 }, clip); + el("path", { d: `M${WX} 206 H${WX + WW}`, stroke: INK, "stroke-width": 3 }, svg); + NAMES.forEach((s, i) => { + const w = s.split(" "); + w.forEach((p, j) => txt(svg, cx(i), (w.length > 1 ? 238 : 250) + j * 24, p, { "text-anchor": "middle", "font-family": MONO, "font-size": 16, "font-weight": 700 })); + }); + const win = el("g", { "clip-path": "url(#mgv-win)" }, svg); + const items = NAMES.map((s, i) => { + const coil = el("circle", { cx: 0, cy: 0, r: 38, fill: "none", stroke: INK, "stroke-width": 3, "stroke-dasharray": "190 49", "stroke-linecap": "round" }, win); + tf(coil, cx(i), 140); + const snack = el("g", {}, win); + el("rect", { x: -30, y: -44, width: 60, height: 88, rx: 8, fill: COL[i], stroke: INK, "stroke-width": 3 }, snack); + el("rect", { x: -34, y: -54, width: 68, height: 14, rx: 4, fill: COL[i], stroke: INK, "stroke-width": 3 }, snack); + el("rect", { x: -34, y: 40, width: 68, height: 14, rx: 4, fill: COL[i], stroke: INK, "stroke-width": 3 }, snack); + el("circle", { cx: 0, cy: 0, r: 13, fill: "#fff", stroke: INK, "stroke-width": 2.5 }, snack); + return { coil, snack }; + }); + el("rect", { x: WX, y: 316, width: WW, height: 56, rx: 28, fill: SOFT, stroke: INK, "stroke-width": 3 }, svg); + const btns = NAMES.map((s, i) => { + const g = el("g", {}, svg); + el("circle", { r: 31, fill: "#fff", "fill-opacity": 0, class: "mg-ring", stroke: INK, "stroke-width": 2.5 }, g); + const face = el("circle", { r: 19, fill: YEL, stroke: INK, "stroke-width": 3 }, g); + el("path", { d: "M-7 -3 L0 5 L7 -3", stroke: INK, "stroke-width": 3, fill: "none", "stroke-linecap": "round", "stroke-linejoin": "round" }, g); + tf(g, cx(i), 344); + button(g, `${s}: ${RUNS[i]}`, () => { pick = i; api.seek(0); }); + return face; + }); + el("rect", { x: 140, y: 400, width: 520, height: 152, rx: 20, fill: SOFT, stroke: INK, "stroke-width": 3 }, svg); + const tclip = el("clipPath", { id: "mgv-tray" }, el("defs", {}, svg)); + el("rect", { x: 142, y: 402, width: 516, height: 148, rx: 18 }, tclip); + const card = el("g", {}, el("g", { "clip-path": "url(#mgv-tray)" }, svg)); + el("rect", { x: 160, y: 424, width: 480, height: 108, rx: 14, fill: "#fff", stroke: INK, "stroke-width": 3 }, card); + const cName = txt(card, 400, 462, "", { "text-anchor": "middle", "font-family": MONO, "font-size": 17, "font-weight": 700, fill: MUTE }); + const cRun = txt(card, 400, 504, "", { "text-anchor": "middle", "font-size": 24, "font-weight": 700 }); + return (t) => { + items.forEach((it, i) => { + const on = i === pick, r = on ? 360 * io(seg(t, 0.2, 1.2)) : 0, f = on ? seg(t, 1.0, 1.6) : 0; + tf(it.coil, cx(i), 140, 1, r - 40); + tf(it.snack, cx(i), 140 + 230 * f * f); + it.snack.setAttribute("opacity", 1 - seg(f, 0.75, 1)); + btns[i].setAttribute("fill", on ? MINT : YEL); + }); + cName.textContent = NAMES[pick]; cRun.textContent = RUNS[pick]; + card.setAttribute("transform", `translate(0 ${140 * (1 - ob(seg(t, 1.7, 2.4)))})`); + }; + }, + }; + + /* ---- 3. a wallet opens and three keys slide up ---- */ + SC.wallet = { + dur: 4.4, start: 1.2, + build(svg, api) { + const HX = 400, T = 290, B = 540, PW = 270, LABEL = ["Anthropic key", "OpenAI key", "Google key"], COL = [YEL, LIL, MINT], TOP = [104, 160, 216]; + const wal = el("g", { transform: "translate(0 -36)" }, svg); + el("rect", { x: HX - PW - 24, y: 80, width: 2 * PW + 48, height: B - 56, rx: 26, fill: "#fff", "fill-opacity": 0, class: "mg-ring", stroke: INK, "stroke-width": 2.5, "stroke-dasharray": "4 8" }, wal); + el("rect", { x: HX, y: T, width: PW, height: B - T, rx: 20, fill: BLUE, stroke: INK, "stroke-width": 4 }, wal); + const cards = LABEL.map((s, i) => { + const g = el("g", {}, wal); + el("rect", { x: HX + 24, y: 0, width: PW - 48, height: 150, rx: 14, fill: COL[i], stroke: INK, "stroke-width": 3 }, g); + txt(g, HX + 44, 38, s, { "font-size": 23, "font-weight": 700 }); + return g; + }); + el("rect", { x: HX, y: 336, width: PW, height: B - 336, rx: 20, fill: SKY, stroke: INK, "stroke-width": 4 }, wal); + el("path", { d: `M${HX + 18} 356 H${HX + PW - 18}`, stroke: INK, "stroke-width": 2, "stroke-dasharray": "6 7", "stroke-linecap": "round" }, wal); + const flap = el("g", {}, wal); + const inside = el("g", {}, flap); + el("rect", { x: -PW, y: T, width: PW, height: B - T, rx: 20, fill: LIL, stroke: INK, "stroke-width": 4 }, inside); + el("rect", { x: -PW + 30, y: T + 34, width: PW - 60, height: 172, rx: 10, fill: "#fff", stroke: INK, "stroke-width": 3 }, inside); + ["Free for", "individual", "developers"].forEach((s, i) => txt(inside, -PW / 2, T + 92 + i * 42, s, { "text-anchor": "middle", "font-size": 29, "font-weight": 700 })); + const outside = el("g", {}, flap); + el("rect", { x: -PW, y: T, width: PW, height: B - T, rx: 20, fill: BLUE, stroke: INK, "stroke-width": 4 }, outside); + el("rect", { x: -PW + 16, y: T + 16, width: PW - 32, height: B - T - 32, rx: 12, fill: "none", stroke: INK, "stroke-width": 2, "stroke-dasharray": "6 7" }, outside); + button(wal, "Wallet: close it and open it again", () => api.seek(0)); + return (t) => { + const fk = t < 1.1 ? 1 - io(seg(t, 0.4, 1.0)) : io(seg(t, 1.4, 2.2)), sx = -1 + 2 * fk; + flap.setAttribute("transform", `translate(${HX} 0) scale(${Math.abs(sx) < 0.01 ? 0.01 : sx} 1)`); + inside.setAttribute("display", sx > 0 ? "inline" : "none"); outside.setAttribute("display", sx > 0 ? "none" : "inline"); + cards.forEach((g, i) => { + const k = t < 1.1 ? 1 - io(seg(t, 0, 0.5)) : ob(seg(t, 2.4 + 0.5 * i, 2.9 + 0.5 * i)); + g.setAttribute("transform", `translate(0 ${350 + (TOP[i] - 350) * k})`); + }); + }; + }, + }; + + /* ---- title card, 16 by 9 ---- */ + SC.hero = { + w: 960, h: 540, dur: 3.6, + build(svg) { + el("rect", { x: 64, y: 44, width: 150, height: 38, rx: 19, fill: LIL, stroke: INK, "stroke-width": 2.5 }, svg); + txt(svg, 139, 69, "Alternatives", { "text-anchor": "middle", "font-size": 18, "font-weight": 700 }); + txt(svg, 64, 158, "Antigravity alternatives", { "font-size": 62, "font-weight": 700 }); + el("path", { d: "M66 182 H420", stroke: YEL, "stroke-width": 12, "stroke-linecap": "round" }, svg); + txt(svg, 64, 230, "6 picks by why you are leaving", { "font-size": 27, "font-weight": 500, fill: MUTE }); + txt(svg, 64, 266, "Checked 4 Nov 2026", { "font-family": MONO, "font-size": 17, "font-weight": 700, fill: MUTE }); + const NAMES = ["Claude Code", "Munder Difflin", "Codex", "Cursor", "Cline", "Zed"], COL = [YEL, MINT, LIL, SKY, YEL, MINT]; + const TW = 132, GAP = (832 - 6 * TW) / 5, tx = (i) => 64 + i * (TW + GAP); + el("rect", { x: 380, y: 300, width: 200, height: 52, rx: 14, fill: GREY, stroke: INK, "stroke-width": 2.5 }, svg); + txt(svg, 480, 333, "Antigravity", { "text-anchor": "middle", "font-family": MONO, "font-size": 19, "font-weight": 700, fill: MUTE }); + const wire = el("path", { d: `M480 352 V386 M${tx(0) + TW / 2} 386 H${tx(5) + TW / 2}`, stroke: INK, "stroke-width": 2.5, fill: "none", "stroke-linecap": "round" }, svg); + const tiles = NAMES.map((s, i) => { + const g = el("g", {}, svg); + el("path", { d: `M${tx(i) + TW / 2} 386 V420`, stroke: INK, "stroke-width": 2.5, "stroke-linecap": "round" }, g); + el("rect", { x: tx(i), y: 420, width: TW, height: 56, rx: 14, fill: COL[i], stroke: INK, "stroke-width": 2.5 }, g); + txt(g, tx(i) + TW / 2, 454, s, { "text-anchor": "middle", "font-family": MONO, "font-size": 13.5, "font-weight": 700 }); + return g; + }); + return (t) => { + wire.setAttribute("opacity", oc(seg(t, 0.2, 0.6))); + tiles.forEach((g, i) => { const k = seg(t, 0.5 + i * 0.35, 1.1 + i * 0.35); g.setAttribute("transform", `translate(0 ${50 * (1 - ob(k))})`); g.setAttribute("opacity", oc(k)); }); + }; + }, + }; + + /* ---- player: each scene plays once when it comes into view, then rests on its final frame ---- */ + 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, still = sc.still != null ? sc.still : sc.dur, t0 = sc.start || 0; + 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, begun = false; + const base = performance.now(), clock = () => (performance.now() - base) / 1000; + let draw = () => {}; + const pos = () => Math.min(clock() + off, sc.dur); + const frame = () => draw(calm ? still : pos(), clock()); + const tick = () => { cancelAnimationFrame(raf); frame(); if (seen && !calm && clock() + off < sc.dur) raf = requestAnimationFrame(tick); }; + const api = { now: clock, seek: (s) => { off = s - clock(); tick(); }, poke: () => tick() }; + draw = sc.build(svg, api); + if (frozen) { draw(isNaN(fixed) ? still : fixed, 0); return; } + new IntersectionObserver(([e]) => { + seen = e.isIntersecting; + if (seen) { + if (!begun) { begun = true; api.seek(t0); } else 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 }); } }); + draw(calm ? still : t0, 0); + }; + 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/antigravity-alternatives/vending.png b/blog/src/assets/media/antigravity-alternatives/vending.png new file mode 100644 index 0000000000..3550933172 Binary files /dev/null and b/blog/src/assets/media/antigravity-alternatives/vending.png differ diff --git a/blog/src/assets/media/antigravity-alternatives/wallet.png b/blog/src/assets/media/antigravity-alternatives/wallet.png new file mode 100644 index 0000000000..73095b631e Binary files /dev/null and b/blog/src/assets/media/antigravity-alternatives/wallet.png differ diff --git a/blog/src/posts/antigravity-alternatives.md b/blog/src/posts/antigravity-alternatives.md new file mode 100644 index 0000000000..9b4e8985b2 --- /dev/null +++ b/blog/src/posts/antigravity-alternatives.md @@ -0,0 +1,90 @@ +--- +title: "Antigravity Alternatives: 6 Picks by Why You Are Leaving (Nov 2026)" +seoTitle: "6 Google Antigravity Alternatives (Nov 2026): Models and Prices" +description: "Antigravity has no bring your own key option for more rate limits and drops Claude 4.6 on 18 Nov. Six alternatives, prices checked 4 Nov 2026." +date: 2026-11-04 +category: comparisons +categoryLabel: Comparisons +type: Technical +primaryKeyword: "antigravity alternatives" +secondaryKeywords: ["antigravity alternative", "google antigravity alternatives", "is google antigravity free", "antigravity bring your own key", "open source antigravity alternative", "antigravity vs cursor"] +tags: ["Comparisons", "Antigravity", "Claude Code", "IDE", "Open Source", "Tools"] +faq: + - q: "Is Google Antigravity free?" + a: "Yes, with limits. Google's pricing page, read 4 Nov 2026, lists the Individual plan at $0 a month with basic weekly rate limits. Google's plans post of 19 May 2026 puts Google AI Pro at $20 a month and Google AI Ultra at $100 or $200 a month for higher limits." + - q: "Can I use my own API key in Antigravity?" + a: "Not for the app's rate limits. Google's plans docs, read 4 Nov 2026, say there is currently no support for \"Bring-your-own-key (BYOK) or bring-your-own-endpoint for additional rate limits\". The Antigravity SDK does take a Gemini API key. If your own keys matter, Cline is built around them." + - q: "Which Claude models does Antigravity have?" + a: "Google's models page, read 4 Nov 2026, lists Claude Sonnet 5.5 and Claude Opus 5.5 (thinking) on paid Google AI Pro, Ultra and Enterprise. Claude Sonnet 4.6 and Opus 4.6 are on Free and Pro, with a note that they will be removed on 18 Nov 2026." + - q: "Can Antigravity agents keep working with my computer off?" + a: "On Google AI Pro and Ultra, as remote agents roll out. Google's remote agents page, read 4 Nov 2026, says they run in a Google managed environment, need no local machine to stay on, and are for Google AI Pro and Ultra subscribers, not the free plan." + - q: "What is the best open source Antigravity alternative?" + a: "Our view: Cline, if you want a coding agent that takes your own API keys. Munder Difflin is free and open source too, if you want a team of agents on your computer. Zed and the Codex CLI are open source as well. Checked 4 Nov 2026." +--- + +Our view: Claude Code is the first Google Antigravity alternative to try, because it gets Anthropic's newest models such as Fable 5.1, which Antigravity's models page doesn't list. If price or your own API keys are why you're leaving, the open source picks below fit better. Checked 4 Nov 2026. + +[Munder Difflin](https://harnessmd.com/download) is free and open source: a desktop app that runs a team of AI agents for all kinds of knowledge work, coding included, on your own computer. For the head to head, read [Claude Code vs Antigravity](/blog/claude-code-vs-antigravity/). More pages like this are in our [Comparisons hub](/blog/topics/comparisons/). + +## What is Google Antigravity? + +Google Antigravity is Google's agent platform for building software, sold as a desktop app, a CLI, an IDE, IDE extensions and an SDK. That is five surfaces, which is more than most of us have monitors. Its [homepage](https://antigravity.google), read 4 Nov 2026, calls it "our agentic development platform" and the app "Your command center to manage multiple local agents in parallel". It is "Available on macOS, Windows, Linux, and Googlebook". + +The [changelog](https://antigravity.google/docs/changelog) shows App v2.29.0 on 3 Nov 2026, which starts rolling out remote agents to Google AI Ultra and Pro subscribers. The [remote agents page](https://antigravity.google/docs/remote-agents) says they aren't available on the free plan. + +## Which models does Antigravity use, and what does it cost? + +Gemini first, with Claude on paid plans. Google's [models page](https://antigravity.google/docs/models), read 4 Nov 2026, gives every plan Gemini 3.8 Flash. Gemini 4 Argon, Claude Sonnet 5.5 and Claude Opus 5.5 need a paid Google AI Pro plan or higher (Argon also comes on some trials). Claude Sonnet 4.6, Claude Opus 4.6 and GPT-OSS-120b carry a note: "Will be removed on November 18, 2026." + +
Animation. On a white background, a desk calendar flips its pages and stops on November 18. A sticky note on the page reads Claude 4.6 and GPT OSS 120b leave Antigravity. Tapping the calendar flips the pages again and the note lands once more.
Google's models page, read 4 Nov 2026: Claude 4.6 models and GPT-OSS-120b will be removed on 18 Nov 2026.
+ +The [pricing page](https://antigravity.google/pricing), read 4 Nov 2026, lists the Individual plan at "$0/month" with "Basic weekly rate limits". Google's [plans post of 19 May 2026](https://antigravity.google/blog/changes-to-antigravity-plans) puts Google AI Pro at $20 a month and Ultra at $100 or $200, with 5X and 20X Pro's tokens. The [plans docs](https://antigravity.google/docs/plans) say "Usage limits for this service are subject to modification" and list no support for "Bring-your-own-key (BYOK)". Our view: that last line is the strongest reason to look elsewhere. + +## What are the best Antigravity alternatives? + +Six, sorted by why you would leave. Every page below was read on 4 Nov 2026. + +| Alternative | What it is | Where it runs | Price or licence, 4 Nov 2026 | +| --- | --- | --- | --- | +| Claude Code | Anthropic's coding agent | Terminal, IDE, desktop, web | Not in Claude Free. Pro from $17 a month. | +| Munder Difflin | A team of AI agents for knowledge work, coding included | Your computer | Free and open source. | +| Codex | OpenAI's coding agent | CLI, IDE, desktop app, web | Apache 2.0 CLI. Plus $20 a month, or API pricing. | +| Cursor | Coding agent and editor | Desktop, CLI, cloud agents | Free plan. Premium $30 a month. | +| Cline | Open source coding agent | VS Code, JetBrains, terminal, desktop | Apache 2.0. Free; you pay for inference. | +| Zed | Open source code editor with AI | Your computer | Mostly GPL 3.0 or later. Personal $0, Pro $10 a month. | + +
Animation. On a white background, a vending machine holds six snacks in a row, each labelled: Claude Code, Munder Difflin, Codex, Cursor, Cline, Zed. A coil turns, one snack drops, and a card slides out of the tray that reads where it runs, such as Your computer. Tapping a button drops that snack and shows its card.
Six Antigravity alternatives, from each vendor's own pages, read 4 Nov 2026.
+ +## 1. Claude Code: if you want Anthropic's newest models + +Our view: Claude Code is the pick if Claude was why you used Antigravity. Its [model docs](https://code.claude.com/docs/en/model-config), read 4 Nov 2026, map `opus` to Opus 5.5 on Anthropic's API and the `fable` alias to Fable 5.1, which Antigravity's list doesn't show. The [overview](https://code.claude.com/docs/en/overview) says it runs on "the terminal, IDE extensions, a desktop app, and the web". + +[Claude's pricing page](https://claude.com/pricing), read 4 Nov 2026, leaves Claude Code out of Free and includes it in Pro at $17 a month billed annually or $20 monthly, then Max at $100 and Ultra at $200. More in [what Claude Code costs](/blog/how-much-does-claude-code-cost/). + +## 2. Munder Difflin: if the work is more than code + +[Munder Difflin](https://harnessmd.com/download) is what we make. Pick it if research, writing and ops sit next to the coding on your list. The catch: agents run while your computer runs. A Cloud Office and a mobile app are coming soon. Setup is in [how to install and use Munder Difflin](/blog/how-to-install-and-use-munder-difflin/). + +## 3. Codex: if you already pay for ChatGPT + +Your ChatGPT plan may already include Codex. [OpenAI's Codex pricing page](https://developers.openai.com/codex/pricing), read 4 Nov 2026, lists Free and Go ($8 a month) with GPT-6 Luna "in the desktop app, subject to rollout". Plus at $20 a month adds "Codex on the web, in the CLI, in the IDE extension, and on iOS" with GPT-6.1 Sol and GPT-6 Luna, and Pro starts at $100. With an API key you pay API pricing. The CLI is Apache 2.0 per its [GitHub repo](https://github.com/openai/codex), with rust-v0.166.0 released on 29 Oct 2026. See [Codex pricing](/blog/codex-pricing/). + +## 4. Cursor: if you want an editor with cloud agents + +Cursor fits if you want one vendor for the editor, the CLI and cloud agents, but read its plans first. Its [pricing page](https://cursor.com/pricing), read 4 Nov 2026, lists Free at $0 with "Limited agent requests", Plus at $8 a month where "Only Grok models are available on this plan", and Premium at $30 a month with cloud agents and "Third-party models at API list price". The [models docs](https://cursor.com/docs/models) say Claude, GPT and Gemini "aren't part of the included pool". See [Cursor pricing](/blog/cursor-pricing/). + +## 5. Cline: if you want your own API keys + +We think Cline is the closest answer to Antigravity's missing BYOK. Its [README](https://github.com/cline/cline) lists a CLI, a VS Code extension, a JetBrains plugin and "a native app for macOS and Windows". It's Apache 2.0 and shipped v4.1.26 on 26 Oct 2026. The [pricing page](https://cline.bot/pricing), read 4 Nov 2026, says "Cline is free for individual developers" and that you can "bring your own API keys from providers like OpenAI, Anthropic, Google, and others." + +
Animation. On a white background, a wallet opens and three cards slide up one by one: Anthropic key, OpenAI key, Google key. A note on the flap reads Free for individual developers. Tapping the wallet closes it and opens it again so the cards slide up once more.
Cline's pricing page, read 4 Nov 2026: free for individual developers, with your own API keys.
+ +## 6. Zed: if you want local control + +Zed is an open source editor where AI is optional and local models are on the menu. Its [pricing page](https://zed.dev/pricing), read 4 Nov 2026, lists Personal at "$0 forever" with "Unlimited use with your API keys or external agents like Claude Agent, Codex CLI, and more", and Pro at $10 a month. The same page names Ollama and LM Studio among its providers. The [README](https://github.com/zed-industries/zed) says Zed is "licensed primarily under GPL-3.0-or-later", and v1.26.2 shipped on 28 Oct 2026. + +## When should you stay on Antigravity? + +Stay if Gemini is your main model and the free limits are enough. Google's plans docs give every plan "Access to all product features, such as scheduled tasks and the CLI". Stay too if you want agents in Google's cloud on Pro or Ultra: the remote agents page says they keep working "even when you close your browser, put your laptop to sleep, or switch between desktop and mobile devices." + + diff --git a/blog/src/posts/claude-code-vs-antigravity.md b/blog/src/posts/claude-code-vs-antigravity.md index 428371596b..907c933afa 100644 --- a/blog/src/posts/claude-code-vs-antigravity.md +++ b/blog/src/posts/claude-code-vs-antigravity.md @@ -63,7 +63,7 @@ An Antigravity agent launches `agy`, and auto mode adds `--dangerously-skip-perm ## Which should you pick, Claude Code or Antigravity? -Pick Antigravity for a free start and visual, browser heavy work; pick Claude Code for terminal and CI work on the newest Claude models. +Pick Antigravity for a free start and visual, browser heavy work; pick Claude Code for terminal and CI work on the newest Claude models. If you are leaving Antigravity for something else entirely, our [Antigravity alternatives](/blog/antigravity-alternatives/) page sorts six options by why you would switch. * **No budget, or just curious about agents:** Antigravity. Google's plans docs include the CLI and scheduled tasks on every plan. * **Frontend work you want to watch:** Antigravity 2.0 or the IDE, where a built in browser subagent runs interactive browser tests. Claude Code has a Chrome integration too. diff --git a/blog/src/posts/opencode-vs-claude-code.md b/blog/src/posts/opencode-vs-claude-code.md index 83ff3fea19..93df43885b 100644 --- a/blog/src/posts/opencode-vs-claude-code.md +++ b/blog/src/posts/opencode-vs-claude-code.md @@ -3,6 +3,7 @@ title: "OpenCode vs Claude Code: Licence, Price and Models Compared" seoTitle: "OpenCode vs Claude Code (Oct 2026): Price, Models, Licence" description: "OpenCode vs Claude Code, checked 6 Oct 2026: licence, price to start, models, where each runs, and whether a Claude subscription works in OpenCode." date: 2026-10-06 +updated: 2026-11-04 category: comparisons categoryLabel: Comparisons type: Non-technical @@ -13,7 +14,7 @@ faq: - q: "Is OpenCode better than Claude Code?" a: "Neither wins outright. We think OpenCode is the better fit if you want open source code and a free choice of model, and Claude Code is the better fit if you already pay for a Claude plan. On 6 Oct 2026 OpenCode was MIT licensed and Claude Code's licence file said all rights reserved." - q: "Can I use my Claude subscription in OpenCode?" - a: "Not in a way either vendor supports. On 6 Oct 2026 OpenCode's providers page said plugins for Claude Pro and Max exist, that Anthropic explicitly prohibits this, and that OpenCode stopped bundling them as of 1.3.0. Anthropic's legal page says third party developers may not route requests through Free, Pro or Max plan credentials." + a: "OpenCode's providers page, read 4 Nov 2026, says of plugins for Claude Pro/Max models \"Anthropic explicitly prohibits this\", and OpenCode dropped them in 1.3.0. Its 2.2.3 notes (30 Oct 2026) add a Claude Agent provider using your Claude Code login. An Anthropic API key works, billed per token." - q: "Can I use Claude models in OpenCode?" a: "Yes, with a key you pay for by the token. The Anthropic section of OpenCode's providers page shows a Manually enter API Key option. OpenCode Zen also lists Claude models: Claude Opus 5.5 was $4.00 per 1M input tokens and $20.00 per 1M output tokens on 6 Oct 2026." - q: "Does OpenCode have free models?" @@ -38,7 +39,7 @@ OpenCode is open and model neutral, and Claude Code is closed and built around C | Price to start (6 Oct 2026) | Free models; Go, $10 a month | Claude Pro, $20 a month | | Models | 75+ providers, local models included | Claude models | | Runs in | Terminal, desktop app, IDE extension | Terminal, IDE, desktop app, web | -| Claude Pro or Max login | No | Yes | +| Claude Pro or Max login | Through the Claude Agent provider (2.2.3, 30 Oct 2026), which uses your Claude Code login | Yes | | Anthropic API key | Yes | Yes | Sources: [opencode.ai](https://opencode.ai/), the [OpenCode repo](https://github.com/sst/opencode) (which GitHub now serves as anomalyco/opencode), [Anthropic's pricing page](https://claude.com/pricing), the [Claude Code docs](https://code.claude.com/docs/en/overview) and the [Claude Code repo](https://github.com/anthropics/claude-code). @@ -78,13 +79,15 @@ OpenCode has model choice and open code. Claude Code has cloud features tied to ## Can you use a Claude subscription in OpenCode? -No, not in a way either vendor supports. OpenCode's [providers page](https://opencode.ai/docs/providers/) said on 6 Oct 2026: "There are plugins that allow you to use your Claude Pro/Max models with OpenCode. Anthropic explicitly prohibits this." It adds that older versions bundled those plugins, "but that is no longer the case as of 1.3.0". +OpenCode's [providers page](https://opencode.ai/docs/providers/), read 4 Nov 2026, says: "There are plugins that allow you to use your Claude Pro/Max models with OpenCode. Anthropic explicitly prohibits this." It adds that older versions bundled those plugins, "but that is no longer the case as of 1.3.0". -Anthropic's [legal page](https://code.claude.com/docs/en/legal-and-compliance) says it "does not permit third-party developers to offer Claude.ai login into their own applications, or to route requests through Free, Pro, or Max plan credentials on behalf of their users". +Anthropic's [legal page](https://code.claude.com/docs/en/legal-and-compliance), read 4 Nov 2026, says it "does not permit third-party developers to offer Claude.ai login into their own applications, or to route requests through Free, Pro, Max, or Ultra plan credentials on behalf of their users", though this does not prevent "an end user from signing in to the unmodified Claude Code binary with their own Claude subscription". + +OpenCode's [v2.2.3 notes](https://github.com/anomalyco/opencode/releases/tag/v2.2.3) of 30 Oct 2026 add a built in Claude Agent provider: install Claude Code, run `claude auth login`, and pick Claude Agent in `/connect` "to use your Claude Code login and models". Anthropic's page does not name OpenCode. An Anthropic API key does work. The auth menu on the providers page shows "Manually enter API Key". Zen sells Claude too: on 6 Oct 2026 Claude Opus 5.5 was $4.00 per 1M input tokens and $20.00 per 1M output tokens. The key still cuts fine. The lock was changed. -
Animation. Three labelled keys take turns at a padlock marked OpenCode. The key labelled API key turns and the padlock opens. The key labelled ChatGPT Plus turns and it opens again. The key labelled Claude Pro and Max does not fit and swings back to its place.
What OpenCode's providers page said about logins on 6 Oct 2026.
+
Animation. Three labelled keys take turns at a padlock marked OpenCode. The key labelled API key turns and the padlock opens. The key labelled ChatGPT Plus turns and it opens again. The key labelled Claude Pro and Max does not fit and swings back to its place.
What OpenCode's providers page said about logins on 6 Oct 2026, before the 2.2.3 Claude Agent provider.
## OpenCode vs Codex diff --git a/docs/blog/agent-desktop-alternatives/index.html b/docs/blog/agent-desktop-alternatives/index.html index d69e14811d..3314c36bc8 100644 --- a/docs/blog/agent-desktop-alternatives/index.html +++ b/docs/blog/agent-desktop-alternatives/index.html @@ -332,50 +332,50 @@

FAQ

Related in Comparisons

- +
- + 5 min
-

T3 Code Alternatives: 6 Picks by Why You Are Leaving (Nov 2026)

-

T3 Code is free but very early by its own account. Six alternatives sorted by why you would leave, with agents and prices checked 3 Nov 2026.

+

Worktrunk Alternatives: 6 Picks for Parallel AI Agents (Nov 2026)

+

Worktrunk alternatives checked 4 Nov 2026: plain git worktree, Munder Difflin, Claude Squad, Orca, Emdash and Conductor, sorted by why you would leave.

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

DeepSeek Harness Alternatives: 6 Picks by Why You Are Leaving (Nov 2026)

-

DeepSeek Harness is a developer preview with breaking changes coming. Six alternatives by reason for leaving, with models and prices checked 2 Nov 2026.

+

T3 Code Alternatives: 6 Picks by Why You Are Leaving (Nov 2026)

+

T3 Code is free but very early by its own account. Six alternatives sorted by why you would leave, with agents and prices checked 3 Nov 2026.

Comparisons - Read → + Read →
diff --git a/docs/blog/agent-tools-today-2026-11-04/index.html b/docs/blog/agent-tools-today-2026-11-04/index.html index 5c7477f17d..a551dfe065 100644 --- a/docs/blog/agent-tools-today-2026-11-04/index.html +++ b/docs/blog/agent-tools-today-2026-11-04/index.html @@ -233,7 +233,7 @@

How this list is built

- +
5 min
-

Worktrunk Alternatives: 6 Picks for Parallel AI Agents (Nov 2026)

-

Worktrunk alternatives checked 4 Nov 2026: plain git worktree, Munder Difflin, Claude Squad, Orca, Emdash and Conductor, sorted by why you would leave.

+

Antigravity Alternatives: 6 Picks by Why You Are Leaving (Nov 2026)

+

Antigravity has no bring your own key option for more rate limits and drops Claude 4.6 on 18 Nov. Six alternatives, prices checked 4 Nov 2026.

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

T3 Code Alternatives: 6 Picks by Why You Are Leaving (Nov 2026)

-

T3 Code is free but very early by its own account. Six alternatives sorted by why you would leave, with agents and prices checked 3 Nov 2026.

+

Worktrunk Alternatives: 6 Picks for Parallel AI Agents (Nov 2026)

+

Worktrunk alternatives checked 4 Nov 2026: plain git worktree, Munder Difflin, Claude Squad, Orca, Emdash and Conductor, sorted by why you would leave.

Comparisons - Read → + Read →
diff --git a/docs/blog/aider-vs-claude-code/index.html b/docs/blog/aider-vs-claude-code/index.html index 64fe9c63e6..ee9cb6ab01 100644 --- a/docs/blog/aider-vs-claude-code/index.html +++ b/docs/blog/aider-vs-claude-code/index.html @@ -307,34 +307,34 @@

agent-desktop Alternatives: 6 Pi
- +
- + 5 min
-

T3 Code Alternatives: 6 Picks by Why You Are Leaving (Nov 2026)

-

T3 Code is free but very early by its own account. Six alternatives sorted by why you would leave, with agents and prices checked 3 Nov 2026.

+

Worktrunk Alternatives: 6 Picks for Parallel AI Agents (Nov 2026)

+

Worktrunk alternatives checked 4 Nov 2026: plain git worktree, Munder Difflin, Claude Squad, Orca, Emdash and Conductor, sorted by why you would leave.

Comparisons - Read → + Read →
diff --git a/docs/blog/antigravity-alternatives/index.html b/docs/blog/antigravity-alternatives/index.html new file mode 100644 index 0000000000..bd7a3fc2f1 --- /dev/null +++ b/docs/blog/antigravity-alternatives/index.html @@ -0,0 +1,438 @@ + + + + + + + + +6 Google Antigravity Alternatives (Nov 2026): Models and Prices + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +

Antigravity Alternatives: 6 Picks by Why You Are Leaving (Nov 2026)

+

Antigravity has no bring your own key option for more rate limits and drops Claude 4.6 on 18 Nov. Six alternatives, prices checked 4 Nov 2026.

+ +
+ +
Title card on white. A pill reading Alternatives, the title Antigravity alternatives, the line 6 picks by why you are leaving and a Checked 4 Nov 2026 line. Six small tiles named Claude Code, Munder Difflin, Codex, Cursor, Cline and Zed slide in under a grey tile labelled Antigravity.
+ +
+
+

Our view: Claude Code is the first Google Antigravity alternative to try, because it gets Anthropic’s newest models such as Fable 5.1, which Antigravity’s models page doesn’t list. If price or your own API keys are why you’re leaving, the open source picks below fit better. Checked 4 Nov 2026.

+

Munder Difflin is free and open source: a desktop app that runs a team of AI agents for all kinds of knowledge work, coding included, on your own computer. For the head to head, read Claude Code vs Antigravity. More pages like this are in our Comparisons hub.

+

What is Google Antigravity?

+

Google Antigravity is Google’s agent platform for building software, sold as a desktop app, a CLI, an IDE, IDE extensions and an SDK. That is five surfaces, which is more than most of us have monitors. Its homepage, read 4 Nov 2026, calls it “our agentic development platform” and the app “Your command center to manage multiple local agents in parallel”. It is “Available on macOS, Windows, Linux, and Googlebook”.

+

The changelog shows App v2.29.0 on 3 Nov 2026, which starts rolling out remote agents to Google AI Ultra and Pro subscribers. The remote agents page says they aren’t available on the free plan.

+

Which models does Antigravity use, and what does it cost?

+

Gemini first, with Claude on paid plans. Google’s models page, read 4 Nov 2026, gives every plan Gemini 3.8 Flash. Gemini 4 Argon, Claude Sonnet 5.5 and Claude Opus 5.5 need a paid Google AI Pro plan or higher (Argon also comes on some trials). Claude Sonnet 4.6, Claude Opus 4.6 and GPT-OSS-120b carry a note: “Will be removed on November 18, 2026.”

+
Animation. On a white background, a desk calendar flips its pages and stops on November 18. A sticky note on the page reads Claude 4.6 and GPT OSS 120b leave Antigravity. Tapping the calendar flips the pages again and the note lands once more.
Google's models page, read 4 Nov 2026: Claude 4.6 models and GPT-OSS-120b will be removed on 18 Nov 2026.
+

The pricing page, read 4 Nov 2026, lists the Individual plan at “$0/month” with “Basic weekly rate limits”. Google’s plans post of 19 May 2026 puts Google AI Pro at $20 a month and Ultra at $100 or $200, with 5X and 20X Pro’s tokens. The plans docs say “Usage limits for this service are subject to modification” and list no support for “Bring-your-own-key (BYOK)”. Our view: that last line is the strongest reason to look elsewhere.

+

What are the best Antigravity alternatives?

+

Six, sorted by why you would leave. Every page below was read on 4 Nov 2026.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AlternativeWhat it isWhere it runsPrice or licence, 4 Nov 2026
Claude CodeAnthropic’s coding agentTerminal, IDE, desktop, webNot in Claude Free. Pro from $17 a month.
Munder DifflinA team of AI agents for knowledge work, coding includedYour computerFree and open source.
CodexOpenAI’s coding agentCLI, IDE, desktop app, webApache 2.0 CLI. Plus $20 a month, or API pricing.
CursorCoding agent and editorDesktop, CLI, cloud agentsFree plan. Premium $30 a month.
ClineOpen source coding agentVS Code, JetBrains, terminal, desktopApache 2.0. Free; you pay for inference.
ZedOpen source code editor with AIYour computerMostly GPL 3.0 or later. Personal $0, Pro $10 a month.
+
+
Animation. On a white background, a vending machine holds six snacks in a row, each labelled: Claude Code, Munder Difflin, Codex, Cursor, Cline, Zed. A coil turns, one snack drops, and a card slides out of the tray that reads where it runs, such as Your computer. Tapping a button drops that snack and shows its card.
Six Antigravity alternatives, from each vendor's own pages, read 4 Nov 2026.
+

1. Claude Code: if you want Anthropic’s newest models

+

Our view: Claude Code is the pick if Claude was why you used Antigravity. Its model docs, read 4 Nov 2026, map opus to Opus 5.5 on Anthropic’s API and the fable alias to Fable 5.1, which Antigravity’s list doesn’t show. The overview says it runs on “the terminal, IDE extensions, a desktop app, and the web”.

+

Claude’s pricing page, read 4 Nov 2026, leaves Claude Code out of Free and includes it in Pro at $17 a month billed annually or $20 monthly, then Max at $100 and Ultra at $200. More in what Claude Code costs.

+

2. Munder Difflin: if the work is more than code

+

Munder Difflin is what we make. Pick it if research, writing and ops sit next to the coding on your list. The catch: agents run while your computer runs. A Cloud Office and a mobile app are coming soon. Setup is in how to install and use Munder Difflin.

+

3. Codex: if you already pay for ChatGPT

+

Your ChatGPT plan may already include Codex. OpenAI’s Codex pricing page, read 4 Nov 2026, lists Free and Go ($8 a month) with GPT-6 Luna “in the desktop app, subject to rollout”. Plus at $20 a month adds “Codex on the web, in the CLI, in the IDE extension, and on iOS” with GPT-6.1 Sol and GPT-6 Luna, and Pro starts at $100. With an API key you pay API pricing. The CLI is Apache 2.0 per its GitHub repo, with rust-v0.166.0 released on 29 Oct 2026. See Codex pricing.

+

4. Cursor: if you want an editor with cloud agents

+

Cursor fits if you want one vendor for the editor, the CLI and cloud agents, but read its plans first. Its pricing page, read 4 Nov 2026, lists Free at $0 with “Limited agent requests”, Plus at $8 a month where “Only Grok models are available on this plan”, and Premium at $30 a month with cloud agents and “Third-party models at API list price”. The models docs say Claude, GPT and Gemini “aren’t part of the included pool”. See Cursor pricing.

+

5. Cline: if you want your own API keys

+

We think Cline is the closest answer to Antigravity’s missing BYOK. Its README lists a CLI, a VS Code extension, a JetBrains plugin and “a native app for macOS and Windows”. It’s Apache 2.0 and shipped v4.1.26 on 26 Oct 2026. The pricing page, read 4 Nov 2026, says “Cline is free for individual developers” and that you can “bring your own API keys from providers like OpenAI, Anthropic, Google, and others.”

+
Animation. On a white background, a wallet opens and three cards slide up one by one: Anthropic key, OpenAI key, Google key. A note on the flap reads Free for individual developers. Tapping the wallet closes it and opens it again so the cards slide up once more.
Cline's pricing page, read 4 Nov 2026: free for individual developers, with your own API keys.
+

6. Zed: if you want local control

+

Zed is an open source editor where AI is optional and local models are on the menu. Its pricing page, read 4 Nov 2026, lists Personal at “$0 forever” with “Unlimited use with your API keys or external agents like Claude Agent, Codex CLI, and more”, and Pro at $10 a month. The same page names Ollama and LM Studio among its providers. The README says Zed is “licensed primarily under GPL-3.0-or-later”, and v1.26.2 shipped on 28 Oct 2026.

+

When should you stay on Antigravity?

+

Stay if Gemini is your main model and the free limits are enough. Google’s plans docs give every plan “Access to all product features, such as scheduled tasks and the CLI”. Stay too if you want agents in Google’s cloud on Pro or Ultra: the remote agents page says they keep working “even when you close your browser, put your laptop to sleep, or switch between desktop and mobile devices.”

+ + + + +
+

FAQ

+ +
+

Is Google Antigravity free?

+

Yes, with limits. Google's pricing page, read 4 Nov 2026, lists the Individual plan at $0 a month with basic weekly rate limits. Google's plans post of 19 May 2026 puts Google AI Pro at $20 a month and Google AI Ultra at $100 or $200 a month for higher limits.

+
+ +
+

Can I use my own API key in Antigravity?

+

Not for the app's rate limits. Google's plans docs, read 4 Nov 2026, say there is currently no support for "Bring-your-own-key (BYOK) or bring-your-own-endpoint for additional rate limits". The Antigravity SDK does take a Gemini API key. If your own keys matter, Cline is built around them.

+
+ +
+

Which Claude models does Antigravity have?

+

Google's models page, read 4 Nov 2026, lists Claude Sonnet 5.5 and Claude Opus 5.5 (thinking) on paid Google AI Pro, Ultra and Enterprise. Claude Sonnet 4.6 and Opus 4.6 are on Free and Pro, with a note that they will be removed on 18 Nov 2026.

+
+ +
+

Can Antigravity agents keep working with my computer off?

+

On Google AI Pro and Ultra, as remote agents roll out. Google's remote agents page, read 4 Nov 2026, says they run in a Google managed environment, need no local machine to stay on, and are for Google AI Pro and Ultra subscribers, not the free plan.

+
+ +
+

What is the best open source Antigravity alternative?

+

Our view: Cline, if you want a coding agent that takes your own API keys. Munder Difflin is free and open source too, if you want a team of agents on your computer. Zed and the Codex CLI are open source as well. Checked 4 Nov 2026.

+
+ +
+ + + +
+ + +
+ + + + +
+ + +
+ +
+ + + + + + diff --git a/docs/blog/assets/media/antigravity-alternatives/calendar.png b/docs/blog/assets/media/antigravity-alternatives/calendar.png new file mode 100644 index 0000000000..0624d8c28e Binary files /dev/null and b/docs/blog/assets/media/antigravity-alternatives/calendar.png differ diff --git a/docs/blog/assets/media/antigravity-alternatives/hero.png b/docs/blog/assets/media/antigravity-alternatives/hero.png new file mode 100644 index 0000000000..d6067a41e0 Binary files /dev/null and b/docs/blog/assets/media/antigravity-alternatives/hero.png differ diff --git a/docs/blog/assets/media/antigravity-alternatives/motion.css b/docs/blog/assets/media/antigravity-alternatives/motion.css new file mode 100644 index 0000000000..e2d54f64b5 --- /dev/null +++ b/docs/blog/assets/media/antigravity-alternatives/motion.css @@ -0,0 +1,13 @@ +/* Bright coded scenes for "Antigravity 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/antigravity-alternatives/motion.js b/docs/blog/assets/media/antigravity-alternatives/motion.js new file mode 100644 index 0000000000..0470dbaec3 --- /dev/null +++ b/docs/blog/assets/media/antigravity-alternatives/motion.js @@ -0,0 +1,237 @@ +/* Bright coded scenes for "Antigravity 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", GREY = "#DCD6E2"; + 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 = {}; + + /* ---- 1. a desk calendar flips to November 18 and a note lands ---- */ + SC.calendar = { + dur: 4.2, + build(svg, api) { + const X = 200, Y = 110, W = 400, H = 420, FL = [0.4, 0.95, 1.5, 2.05], FD = 0.5; + const cal = el("g", {}, svg); + el("rect", { x: X - 28, y: Y - 34, width: W + 56, height: H + 62, rx: 24, fill: "#fff", "fill-opacity": 0, class: "mg-ring", stroke: INK, "stroke-width": 2.5, "stroke-dasharray": "4 8" }, cal); + el("rect", { x: X - 60, y: Y + H + 8, width: W + 120, height: 34, rx: 17, fill: BLUE, stroke: INK, "stroke-width": 3 }, cal); + el("rect", { x: X - 16, y: Y - 22, width: W + 32, height: H + 36, rx: 18, fill: LIL, stroke: INK, "stroke-width": 3 }, cal); + const HEAD = [SKY, MINT, LIL, BLUE]; + const face = (i) => { + const g = el("g", {}, cal); + el("rect", { x: X, y: Y, width: W, height: H, rx: 12, fill: "#fff", stroke: INK, "stroke-width": 3 }, g); + if (i < 4) { + el("rect", { x: X, y: Y, width: W, height: 74, rx: 12, fill: HEAD[i], stroke: INK, "stroke-width": 3 }, g); + for (let r = 0; r < 4; r++) for (let c = 0; c < 5; c++) el("rect", { x: X + 34 + c * 70, y: Y + 110 + r * 72, width: 52, height: 52, rx: 10, fill: SOFT }, g); + } else { + el("rect", { x: X, y: Y, width: W, height: 74, rx: 12, fill: YEL, stroke: INK, "stroke-width": 3 }, g); + txt(g, X + W / 2, Y + 50, "November", { "text-anchor": "middle", "font-size": 34, "font-weight": 700 }); + txt(g, X + W / 2, Y + 236, "18", { "text-anchor": "middle", "font-size": 150, "font-weight": 700 }); + } + return g; + }; + const under = [0, 1, 2, 3, 4].map(face); + const flip = el("g", {}, cal); + const flipFace = [0, 1, 2, 3].map((i) => { const f = face(i); flip.appendChild(f); return f; }); + const back = el("rect", { x: X, y: Y, width: W, height: H, rx: 12, fill: SOFT, stroke: INK, "stroke-width": 3 }, flip); + for (let i = 0; i < 8; i++) { + const x = X + 40 + i * 45; + el("rect", { x: x - 6, y: Y - 18, width: 12, height: 34, rx: 6, fill: "#fff", stroke: INK, "stroke-width": 3 }, cal); + } + const note = el("g", {}, cal); + el("rect", { x: -130, y: -64, width: 260, height: 128, rx: 8, fill: YEL, stroke: INK, "stroke-width": 3 }, note); + ["Claude 4.6 and", "GPT OSS 120b", "leave Antigravity"].forEach((s, i) => txt(note, 0, -22 + i * 32, s, { "text-anchor": "middle", "font-size": 23, "font-weight": 700 })); + button(cal, "Calendar: flip the pages again", () => api.seek(0)); + return (t) => { + const n = FL.filter((s) => t >= s).length, cur = n - 1, p = n ? seg(t, FL[cur], FL[cur] + FD) : 1; + const show = n === 0 ? 0 : p < 1 ? cur + 1 : n; + under.forEach((g, i) => g.setAttribute("display", i === show || (n === 0 && i === 0) ? "inline" : "none")); + if (n === 0 || p >= 1) flip.setAttribute("display", "none"); + else { + const s = 1 - 1.25 * io(p); + flip.setAttribute("display", "inline"); + flip.setAttribute("transform", `translate(0 ${Y}) scale(1 ${Math.abs(s) < 0.01 ? 0.01 : s}) translate(0 ${-Y})`); + flipFace.forEach((f, i) => f.setAttribute("display", i === cur && s > 0 ? "inline" : "none")); + back.setAttribute("display", s > 0 ? "none" : "inline"); + } + const k = seg(t, 2.8, 3.4), d = ob(k); + tf(note, 460, 440 - 260 * (1 - d), 1.25 - 0.25 * oc(k), -4 + 10 * (1 - oc(k))); + note.setAttribute("opacity", k <= 0 ? 0 : cl(k * 4)); + }; + }, + }; + + /* ---- 2. a vending machine with six snacks, each card says where it runs ---- */ + SC.vending = { + dur: 3, + build(svg, api) { + const NAMES = ["Claude Code", "Munder Difflin", "Codex", "Cursor", "Cline", "Zed"]; + const RUNS = ["Terminal, IDE, desktop, web", "Your computer", "CLI, IDE, desktop app, web", "Desktop, CLI, cloud agents", "VS Code, JetBrains, terminal, desktop", "Your computer"]; + const COL = [YEL, MINT, LIL, SKY, YEL, MINT]; + const WX = 116, WY = 50, WW = 568, WH = 240, slot = WW / 6, cx = (i) => WX + slot * (i + 0.5); + let pick = 1; + el("rect", { x: 90, y: 24, width: 620, height: 556, rx: 28, fill: BLUE, stroke: INK, "stroke-width": 4 }, svg); + el("rect", { x: WX, y: WY, width: WW, height: WH, rx: 16, fill: "#fff", stroke: INK, "stroke-width": 3 }, svg); + const clip = el("clipPath", { id: "mgv-win" }, el("defs", {}, svg)); + el("rect", { x: WX + 2, y: WY + 2, width: WW - 4, height: 206 - WY - 3, rx: 14 }, clip); + el("path", { d: `M${WX} 206 H${WX + WW}`, stroke: INK, "stroke-width": 3 }, svg); + NAMES.forEach((s, i) => { + const w = s.split(" "); + w.forEach((p, j) => txt(svg, cx(i), (w.length > 1 ? 238 : 250) + j * 24, p, { "text-anchor": "middle", "font-family": MONO, "font-size": 16, "font-weight": 700 })); + }); + const win = el("g", { "clip-path": "url(#mgv-win)" }, svg); + const items = NAMES.map((s, i) => { + const coil = el("circle", { cx: 0, cy: 0, r: 38, fill: "none", stroke: INK, "stroke-width": 3, "stroke-dasharray": "190 49", "stroke-linecap": "round" }, win); + tf(coil, cx(i), 140); + const snack = el("g", {}, win); + el("rect", { x: -30, y: -44, width: 60, height: 88, rx: 8, fill: COL[i], stroke: INK, "stroke-width": 3 }, snack); + el("rect", { x: -34, y: -54, width: 68, height: 14, rx: 4, fill: COL[i], stroke: INK, "stroke-width": 3 }, snack); + el("rect", { x: -34, y: 40, width: 68, height: 14, rx: 4, fill: COL[i], stroke: INK, "stroke-width": 3 }, snack); + el("circle", { cx: 0, cy: 0, r: 13, fill: "#fff", stroke: INK, "stroke-width": 2.5 }, snack); + return { coil, snack }; + }); + el("rect", { x: WX, y: 316, width: WW, height: 56, rx: 28, fill: SOFT, stroke: INK, "stroke-width": 3 }, svg); + const btns = NAMES.map((s, i) => { + const g = el("g", {}, svg); + el("circle", { r: 31, fill: "#fff", "fill-opacity": 0, class: "mg-ring", stroke: INK, "stroke-width": 2.5 }, g); + const face = el("circle", { r: 19, fill: YEL, stroke: INK, "stroke-width": 3 }, g); + el("path", { d: "M-7 -3 L0 5 L7 -3", stroke: INK, "stroke-width": 3, fill: "none", "stroke-linecap": "round", "stroke-linejoin": "round" }, g); + tf(g, cx(i), 344); + button(g, `${s}: ${RUNS[i]}`, () => { pick = i; api.seek(0); }); + return face; + }); + el("rect", { x: 140, y: 400, width: 520, height: 152, rx: 20, fill: SOFT, stroke: INK, "stroke-width": 3 }, svg); + const tclip = el("clipPath", { id: "mgv-tray" }, el("defs", {}, svg)); + el("rect", { x: 142, y: 402, width: 516, height: 148, rx: 18 }, tclip); + const card = el("g", {}, el("g", { "clip-path": "url(#mgv-tray)" }, svg)); + el("rect", { x: 160, y: 424, width: 480, height: 108, rx: 14, fill: "#fff", stroke: INK, "stroke-width": 3 }, card); + const cName = txt(card, 400, 462, "", { "text-anchor": "middle", "font-family": MONO, "font-size": 17, "font-weight": 700, fill: MUTE }); + const cRun = txt(card, 400, 504, "", { "text-anchor": "middle", "font-size": 24, "font-weight": 700 }); + return (t) => { + items.forEach((it, i) => { + const on = i === pick, r = on ? 360 * io(seg(t, 0.2, 1.2)) : 0, f = on ? seg(t, 1.0, 1.6) : 0; + tf(it.coil, cx(i), 140, 1, r - 40); + tf(it.snack, cx(i), 140 + 230 * f * f); + it.snack.setAttribute("opacity", 1 - seg(f, 0.75, 1)); + btns[i].setAttribute("fill", on ? MINT : YEL); + }); + cName.textContent = NAMES[pick]; cRun.textContent = RUNS[pick]; + card.setAttribute("transform", `translate(0 ${140 * (1 - ob(seg(t, 1.7, 2.4)))})`); + }; + }, + }; + + /* ---- 3. a wallet opens and three keys slide up ---- */ + SC.wallet = { + dur: 4.4, start: 1.2, + build(svg, api) { + const HX = 400, T = 290, B = 540, PW = 270, LABEL = ["Anthropic key", "OpenAI key", "Google key"], COL = [YEL, LIL, MINT], TOP = [104, 160, 216]; + const wal = el("g", { transform: "translate(0 -36)" }, svg); + el("rect", { x: HX - PW - 24, y: 80, width: 2 * PW + 48, height: B - 56, rx: 26, fill: "#fff", "fill-opacity": 0, class: "mg-ring", stroke: INK, "stroke-width": 2.5, "stroke-dasharray": "4 8" }, wal); + el("rect", { x: HX, y: T, width: PW, height: B - T, rx: 20, fill: BLUE, stroke: INK, "stroke-width": 4 }, wal); + const cards = LABEL.map((s, i) => { + const g = el("g", {}, wal); + el("rect", { x: HX + 24, y: 0, width: PW - 48, height: 150, rx: 14, fill: COL[i], stroke: INK, "stroke-width": 3 }, g); + txt(g, HX + 44, 38, s, { "font-size": 23, "font-weight": 700 }); + return g; + }); + el("rect", { x: HX, y: 336, width: PW, height: B - 336, rx: 20, fill: SKY, stroke: INK, "stroke-width": 4 }, wal); + el("path", { d: `M${HX + 18} 356 H${HX + PW - 18}`, stroke: INK, "stroke-width": 2, "stroke-dasharray": "6 7", "stroke-linecap": "round" }, wal); + const flap = el("g", {}, wal); + const inside = el("g", {}, flap); + el("rect", { x: -PW, y: T, width: PW, height: B - T, rx: 20, fill: LIL, stroke: INK, "stroke-width": 4 }, inside); + el("rect", { x: -PW + 30, y: T + 34, width: PW - 60, height: 172, rx: 10, fill: "#fff", stroke: INK, "stroke-width": 3 }, inside); + ["Free for", "individual", "developers"].forEach((s, i) => txt(inside, -PW / 2, T + 92 + i * 42, s, { "text-anchor": "middle", "font-size": 29, "font-weight": 700 })); + const outside = el("g", {}, flap); + el("rect", { x: -PW, y: T, width: PW, height: B - T, rx: 20, fill: BLUE, stroke: INK, "stroke-width": 4 }, outside); + el("rect", { x: -PW + 16, y: T + 16, width: PW - 32, height: B - T - 32, rx: 12, fill: "none", stroke: INK, "stroke-width": 2, "stroke-dasharray": "6 7" }, outside); + button(wal, "Wallet: close it and open it again", () => api.seek(0)); + return (t) => { + const fk = t < 1.1 ? 1 - io(seg(t, 0.4, 1.0)) : io(seg(t, 1.4, 2.2)), sx = -1 + 2 * fk; + flap.setAttribute("transform", `translate(${HX} 0) scale(${Math.abs(sx) < 0.01 ? 0.01 : sx} 1)`); + inside.setAttribute("display", sx > 0 ? "inline" : "none"); outside.setAttribute("display", sx > 0 ? "none" : "inline"); + cards.forEach((g, i) => { + const k = t < 1.1 ? 1 - io(seg(t, 0, 0.5)) : ob(seg(t, 2.4 + 0.5 * i, 2.9 + 0.5 * i)); + g.setAttribute("transform", `translate(0 ${350 + (TOP[i] - 350) * k})`); + }); + }; + }, + }; + + /* ---- title card, 16 by 9 ---- */ + SC.hero = { + w: 960, h: 540, dur: 3.6, + build(svg) { + el("rect", { x: 64, y: 44, width: 150, height: 38, rx: 19, fill: LIL, stroke: INK, "stroke-width": 2.5 }, svg); + txt(svg, 139, 69, "Alternatives", { "text-anchor": "middle", "font-size": 18, "font-weight": 700 }); + txt(svg, 64, 158, "Antigravity alternatives", { "font-size": 62, "font-weight": 700 }); + el("path", { d: "M66 182 H420", stroke: YEL, "stroke-width": 12, "stroke-linecap": "round" }, svg); + txt(svg, 64, 230, "6 picks by why you are leaving", { "font-size": 27, "font-weight": 500, fill: MUTE }); + txt(svg, 64, 266, "Checked 4 Nov 2026", { "font-family": MONO, "font-size": 17, "font-weight": 700, fill: MUTE }); + const NAMES = ["Claude Code", "Munder Difflin", "Codex", "Cursor", "Cline", "Zed"], COL = [YEL, MINT, LIL, SKY, YEL, MINT]; + const TW = 132, GAP = (832 - 6 * TW) / 5, tx = (i) => 64 + i * (TW + GAP); + el("rect", { x: 380, y: 300, width: 200, height: 52, rx: 14, fill: GREY, stroke: INK, "stroke-width": 2.5 }, svg); + txt(svg, 480, 333, "Antigravity", { "text-anchor": "middle", "font-family": MONO, "font-size": 19, "font-weight": 700, fill: MUTE }); + const wire = el("path", { d: `M480 352 V386 M${tx(0) + TW / 2} 386 H${tx(5) + TW / 2}`, stroke: INK, "stroke-width": 2.5, fill: "none", "stroke-linecap": "round" }, svg); + const tiles = NAMES.map((s, i) => { + const g = el("g", {}, svg); + el("path", { d: `M${tx(i) + TW / 2} 386 V420`, stroke: INK, "stroke-width": 2.5, "stroke-linecap": "round" }, g); + el("rect", { x: tx(i), y: 420, width: TW, height: 56, rx: 14, fill: COL[i], stroke: INK, "stroke-width": 2.5 }, g); + txt(g, tx(i) + TW / 2, 454, s, { "text-anchor": "middle", "font-family": MONO, "font-size": 13.5, "font-weight": 700 }); + return g; + }); + return (t) => { + wire.setAttribute("opacity", oc(seg(t, 0.2, 0.6))); + tiles.forEach((g, i) => { const k = seg(t, 0.5 + i * 0.35, 1.1 + i * 0.35); g.setAttribute("transform", `translate(0 ${50 * (1 - ob(k))})`); g.setAttribute("opacity", oc(k)); }); + }; + }, + }; + + /* ---- player: each scene plays once when it comes into view, then rests on its final frame ---- */ + 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, still = sc.still != null ? sc.still : sc.dur, t0 = sc.start || 0; + 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, begun = false; + const base = performance.now(), clock = () => (performance.now() - base) / 1000; + let draw = () => {}; + const pos = () => Math.min(clock() + off, sc.dur); + const frame = () => draw(calm ? still : pos(), clock()); + const tick = () => { cancelAnimationFrame(raf); frame(); if (seen && !calm && clock() + off < sc.dur) raf = requestAnimationFrame(tick); }; + const api = { now: clock, seek: (s) => { off = s - clock(); tick(); }, poke: () => tick() }; + draw = sc.build(svg, api); + if (frozen) { draw(isNaN(fixed) ? still : fixed, 0); return; } + new IntersectionObserver(([e]) => { + seen = e.isIntersecting; + if (seen) { + if (!begun) { begun = true; api.seek(t0); } else 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 }); } }); + draw(calm ? still : t0, 0); + }; + 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/antigravity-alternatives/vending.png b/docs/blog/assets/media/antigravity-alternatives/vending.png new file mode 100644 index 0000000000..3550933172 Binary files /dev/null and b/docs/blog/assets/media/antigravity-alternatives/vending.png differ diff --git a/docs/blog/assets/media/antigravity-alternatives/wallet.png b/docs/blog/assets/media/antigravity-alternatives/wallet.png new file mode 100644 index 0000000000..73095b631e Binary files /dev/null and b/docs/blog/assets/media/antigravity-alternatives/wallet.png differ diff --git a/docs/blog/best-ai-coding-agents/index.html b/docs/blog/best-ai-coding-agents/index.html index 023c48a8e0..17124184d2 100644 --- a/docs/blog/best-ai-coding-agents/index.html +++ b/docs/blog/best-ai-coding-agents/index.html @@ -484,34 +484,34 @@

agent-desktop Alternatives: 6 Pi
- +
- + 5 min
-

T3 Code Alternatives: 6 Picks by Why You Are Leaving (Nov 2026)

-

T3 Code is free but very early by its own account. Six alternatives sorted by why you would leave, with agents and prices checked 3 Nov 2026.

+

Worktrunk Alternatives: 6 Picks for Parallel AI Agents (Nov 2026)

+

Worktrunk alternatives checked 4 Nov 2026: plain git worktree, Munder Difflin, Claude Squad, Orca, Emdash and Conductor, sorted by why you would leave.

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 69ea1bc9a9..7c67e2b5ce 100644 --- a/docs/blog/best-claude-code-multi-agent-tools/index.html +++ b/docs/blog/best-claude-code-multi-agent-tools/index.html @@ -452,34 +452,34 @@

agent-desktop Alternatives: 6 Pi
- +
- + 5 min
-

T3 Code Alternatives: 6 Picks by Why You Are Leaving (Nov 2026)

-

T3 Code is free but very early by its own account. Six alternatives sorted by why you would leave, with agents and prices checked 3 Nov 2026.

+

Worktrunk Alternatives: 6 Picks for Parallel AI Agents (Nov 2026)

+

Worktrunk alternatives checked 4 Nov 2026: plain git worktree, Munder Difflin, Claude Squad, Orca, Emdash and Conductor, sorted by why you would leave.

Comparisons - Read → + Read →
diff --git a/docs/blog/chatgpt-dots-alternatives/index.html b/docs/blog/chatgpt-dots-alternatives/index.html index 8945b2dd6f..8c673b8617 100644 --- a/docs/blog/chatgpt-dots-alternatives/index.html +++ b/docs/blog/chatgpt-dots-alternatives/index.html @@ -366,34 +366,34 @@

agent-desktop Alternatives: 6 Pi
- +
- + 5 min
-

T3 Code Alternatives: 6 Picks by Why You Are Leaving (Nov 2026)

-

T3 Code is free but very early by its own account. Six alternatives sorted by why you would leave, with agents and prices checked 3 Nov 2026.

+

Worktrunk Alternatives: 6 Picks for Parallel AI Agents (Nov 2026)

+

Worktrunk alternatives checked 4 Nov 2026: plain git worktree, Munder Difflin, Claude Squad, Orca, Emdash and Conductor, sorted by why you would leave.

Comparisons - Read → + Read →
diff --git a/docs/blog/chatgpt-dots-vs-claude-cowork/index.html b/docs/blog/chatgpt-dots-vs-claude-cowork/index.html index 9e6d609f9a..51c0819ca7 100644 --- a/docs/blog/chatgpt-dots-vs-claude-cowork/index.html +++ b/docs/blog/chatgpt-dots-vs-claude-cowork/index.html @@ -353,34 +353,34 @@

agent-desktop Alternatives: 6 Pi
- +
- + 5 min
-

T3 Code Alternatives: 6 Picks by Why You Are Leaving (Nov 2026)

-

T3 Code is free but very early by its own account. Six alternatives sorted by why you would leave, with agents and prices checked 3 Nov 2026.

+

Worktrunk Alternatives: 6 Picks for Parallel AI Agents (Nov 2026)

+

Worktrunk alternatives checked 4 Nov 2026: plain git worktree, Munder Difflin, Claude Squad, Orca, Emdash and Conductor, sorted by why you would leave.

Comparisons - Read → + Read →
diff --git a/docs/blog/claude-code-alternatives/index.html b/docs/blog/claude-code-alternatives/index.html index 103e7a8fe5..cc35780a83 100644 --- a/docs/blog/claude-code-alternatives/index.html +++ b/docs/blog/claude-code-alternatives/index.html @@ -376,34 +376,34 @@

agent-desktop Alternatives: 6 Pi
- +
- + 5 min
-

T3 Code Alternatives: 6 Picks by Why You Are Leaving (Nov 2026)

-

T3 Code is free but very early by its own account. Six alternatives sorted by why you would leave, with agents and prices checked 3 Nov 2026.

+

Worktrunk Alternatives: 6 Picks for Parallel AI Agents (Nov 2026)

+

Worktrunk alternatives checked 4 Nov 2026: plain git worktree, Munder Difflin, Claude Squad, Orca, Emdash and Conductor, sorted by why you would leave.

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 8f44821d04..0ac41f8d4d 100644 --- a/docs/blog/claude-code-orchestration-tools-compared/index.html +++ b/docs/blog/claude-code-orchestration-tools-compared/index.html @@ -350,34 +350,34 @@

agent-desktop Alternatives: 6 Pi
- +
- + 5 min
-

T3 Code Alternatives: 6 Picks by Why You Are Leaving (Nov 2026)

-

T3 Code is free but very early by its own account. Six alternatives sorted by why you would leave, with agents and prices checked 3 Nov 2026.

+

Worktrunk Alternatives: 6 Picks for Parallel AI Agents (Nov 2026)

+

Worktrunk alternatives checked 4 Nov 2026: plain git worktree, Munder Difflin, Claude Squad, Orca, Emdash and Conductor, sorted by why you would leave.

Comparisons - Read → + Read →
diff --git a/docs/blog/claude-code-vs-antigravity/index.html b/docs/blog/claude-code-vs-antigravity/index.html index 57b493bfc6..a813f493ab 100644 --- a/docs/blog/claude-code-vs-antigravity/index.html +++ b/docs/blog/claude-code-vs-antigravity/index.html @@ -210,7 +210,7 @@

H

A Claude Code agent launches claude. Auto mode, when switched on, adds --permission-mode bypassPermissions. Only Claude Code takes the office’s identity through --append-system-prompt and hooks through --settings, and if claude is missing the app installs it with npm or Anthropic’s native installer.

An Antigravity agent launches agy, and auto mode adds --dangerously-skip-permissions, which agy --help describes as “Auto-approve all tool permission requests without prompting”. Its brief arrives as the first turn through agy -i, and a restart resumes with --conversation. For live status and message delivery the app writes a munder-hive hook group to both ~/.gemini/config/hooks.json and ~/.gemini/antigravity-cli/hooks.json, because agy loads hooks from one file and fires them from the other. The hook script does nothing without an agent ID, so your own agy sessions are left alone. Two limits: 0.5.2 has no bundled installer for agy, so a missing CLI gets a manual install message, and the app drives the CLI, not the Antigravity 2.0 app or the IDE.

Which should you pick, Claude Code or Antigravity?

-

Pick Antigravity for a free start and visual, browser heavy work; pick Claude Code for terminal and CI work on the newest Claude models.

+

Pick Antigravity for a free start and visual, browser heavy work; pick Claude Code for terminal and CI work on the newest Claude models. If you are leaving Antigravity for something else entirely, our Antigravity alternatives page sorts six options by why you would switch.

Can you use a Claude subscription in OpenCode?

-

No, not in a way either vendor supports. OpenCode’s providers page said on 6 Oct 2026: “There are plugins that allow you to use your Claude Pro/Max models with OpenCode. Anthropic explicitly prohibits this.” It adds that older versions bundled those plugins, “but that is no longer the case as of 1.3.0”.

-

Anthropic’s legal page says it “does not permit third-party developers to offer Claude.ai login into their own applications, or to route requests through Free, Pro, or Max plan credentials on behalf of their users”.

+

OpenCode’s providers page, read 4 Nov 2026, says: “There are plugins that allow you to use your Claude Pro/Max models with OpenCode. Anthropic explicitly prohibits this.” It adds that older versions bundled those plugins, “but that is no longer the case as of 1.3.0”.

+

Anthropic’s legal page, read 4 Nov 2026, says it “does not permit third-party developers to offer Claude.ai login into their own applications, or to route requests through Free, Pro, Max, or Ultra plan credentials on behalf of their users”, though this does not prevent “an end user from signing in to the unmodified Claude Code binary with their own Claude subscription”.

+

OpenCode’s v2.2.3 notes of 30 Oct 2026 add a built in Claude Agent provider: install Claude Code, run claude auth login, and pick Claude Agent in /connect “to use your Claude Code login and models”. Anthropic’s page does not name OpenCode.

An Anthropic API key does work. The auth menu on the providers page shows “Manually enter API Key”. Zen sells Claude too: on 6 Oct 2026 Claude Opus 5.5 was $4.00 per 1M input tokens and $20.00 per 1M output tokens. The key still cuts fine. The lock was changed.

-
Animation. Three labelled keys take turns at a padlock marked OpenCode. The key labelled API key turns and the padlock opens. The key labelled ChatGPT Plus turns and it opens again. The key labelled Claude Pro and Max does not fit and swings back to its place.
What OpenCode's providers page said about logins on 6 Oct 2026.
+
Animation. Three labelled keys take turns at a padlock marked OpenCode. The key labelled API key turns and the padlock opens. The key labelled ChatGPT Plus turns and it opens again. The key labelled Claude Pro and Max does not fit and swings back to its place.
What OpenCode's providers page said about logins on 6 Oct 2026, before the 2.2.3 Claude Agent provider.

OpenCode vs Codex

OpenCode is the neutral one, and Codex is OpenAI’s own agent. The Codex repo is Apache 2.0, and its README recommends signing in with a ChatGPT plan. OpenAI’s pricing page listed the CLI from Plus, $20 a month, on 6 Oct 2026. Our view: choose Codex if you only want OpenAI models, and OpenCode if you want to switch. Codex vs Claude Code compares the two lab agents.

Who should pick which?

@@ -293,7 +294,7 @@

FAQ

Can I use my Claude subscription in OpenCode?

-

Not in a way either vendor supports. On 6 Oct 2026 OpenCode's providers page said plugins for Claude Pro and Max exist, that Anthropic explicitly prohibits this, and that OpenCode stopped bundling them as of 1.3.0. Anthropic's legal page says third party developers may not route requests through Free, Pro or Max plan credentials.

+

OpenCode's providers page, read 4 Nov 2026, says of plugins for Claude Pro/Max models "Anthropic explicitly prohibits this", and OpenCode dropped them in 1.3.0. Its 2.2.3 notes (30 Oct 2026) add a Claude Agent provider using your Claude Code login. An Anthropic API key works, billed per token.

@@ -357,34 +358,34 @@

agent-desktop Alternatives: 6 Pi

- +
- + 5 min
-

T3 Code Alternatives: 6 Picks by Why You Are Leaving (Nov 2026)

-

T3 Code is free but very early by its own account. Six alternatives sorted by why you would leave, with agents and prices checked 3 Nov 2026.

+

Worktrunk Alternatives: 6 Picks for Parallel AI Agents (Nov 2026)

+

Worktrunk alternatives checked 4 Nov 2026: plain git worktree, Munder Difflin, Claude Squad, Orca, Emdash and Conductor, sorted by why you would leave.

Comparisons - Read → + Read →
diff --git a/docs/blog/orca-vs-munder-difflin/index.html b/docs/blog/orca-vs-munder-difflin/index.html index fc31d1fa75..2d8b942551 100644 --- a/docs/blog/orca-vs-munder-difflin/index.html +++ b/docs/blog/orca-vs-munder-difflin/index.html @@ -362,34 +362,34 @@

agent-desktop Alternatives: 6 Pi
- +
- + 5 min
-

T3 Code Alternatives: 6 Picks by Why You Are Leaving (Nov 2026)

-

T3 Code is free but very early by its own account. Six alternatives sorted by why you would leave, with agents and prices checked 3 Nov 2026.

+

Worktrunk Alternatives: 6 Picks for Parallel AI Agents (Nov 2026)

+

Worktrunk alternatives checked 4 Nov 2026: plain git worktree, Munder Difflin, Claude Squad, Orca, Emdash and Conductor, sorted by why you would leave.

Comparisons - Read → + Read →
diff --git a/docs/blog/pi-agent-alternatives/index.html b/docs/blog/pi-agent-alternatives/index.html index f483a8c9bb..bfe220b086 100644 --- a/docs/blog/pi-agent-alternatives/index.html +++ b/docs/blog/pi-agent-alternatives/index.html @@ -356,34 +356,34 @@

agent-desktop Alternatives: 6 Pi
- +
- + 5 min
-

T3 Code Alternatives: 6 Picks by Why You Are Leaving (Nov 2026)

-

T3 Code is free but very early by its own account. Six alternatives sorted by why you would leave, with agents and prices checked 3 Nov 2026.

+

Worktrunk Alternatives: 6 Picks for Parallel AI Agents (Nov 2026)

+

Worktrunk alternatives checked 4 Nov 2026: plain git worktree, Munder Difflin, Claude Squad, Orca, Emdash and Conductor, sorted by why you would leave.

Comparisons - Read → + Read →
diff --git a/docs/blog/pi-vs-claude-code/index.html b/docs/blog/pi-vs-claude-code/index.html index 05794fff47..b47a7265a6 100644 --- a/docs/blog/pi-vs-claude-code/index.html +++ b/docs/blog/pi-vs-claude-code/index.html @@ -359,34 +359,34 @@

agent-desktop Alternatives: 6 Pi
- +
- + 5 min
-

T3 Code Alternatives: 6 Picks by Why You Are Leaving (Nov 2026)

-

T3 Code is free but very early by its own account. Six alternatives sorted by why you would leave, with agents and prices checked 3 Nov 2026.

+

Worktrunk Alternatives: 6 Picks for Parallel AI Agents (Nov 2026)

+

Worktrunk alternatives checked 4 Nov 2026: plain git worktree, Munder Difflin, Claude Squad, Orca, Emdash and Conductor, sorted by why you would leave.

Comparisons - Read → + Read →
diff --git a/docs/blog/qm-vs-munder-difflin/index.html b/docs/blog/qm-vs-munder-difflin/index.html index 8535e02d18..7ecb67764d 100644 --- a/docs/blog/qm-vs-munder-difflin/index.html +++ b/docs/blog/qm-vs-munder-difflin/index.html @@ -373,34 +373,34 @@

agent-desktop Alternatives: 6 Pi
- +
- + 5 min
-

T3 Code Alternatives: 6 Picks by Why You Are Leaving (Nov 2026)

-

T3 Code is free but very early by its own account. Six alternatives sorted by why you would leave, with agents and prices checked 3 Nov 2026.

+

Worktrunk Alternatives: 6 Picks for Parallel AI Agents (Nov 2026)

+

Worktrunk alternatives checked 4 Nov 2026: plain git worktree, Munder Difflin, Claude Squad, Orca, Emdash and Conductor, sorted by why you would leave.

Comparisons - Read → + Read →
diff --git a/docs/blog/t3-code-alternatives/index.html b/docs/blog/t3-code-alternatives/index.html index 2e3ac9a9c6..ff70a3f96c 100644 --- a/docs/blog/t3-code-alternatives/index.html +++ b/docs/blog/t3-code-alternatives/index.html @@ -351,34 +351,34 @@

agent-desktop Alternatives: 6 Pi
- +
- + 5 min
-

DeepSeek Harness Alternatives: 6 Picks by Why You Are Leaving (Nov 2026)

-

DeepSeek Harness is a developer preview with breaking changes coming. Six alternatives by reason for leaving, with models and prices checked 2 Nov 2026.

+

Worktrunk Alternatives: 6 Picks for Parallel AI Agents (Nov 2026)

+

Worktrunk alternatives checked 4 Nov 2026: plain git worktree, Munder Difflin, Claude Squad, Orca, Emdash and Conductor, sorted by why you would leave.

Comparisons - Read → + Read →
diff --git a/docs/blog/tags/antigravity/index.html b/docs/blog/tags/antigravity/index.html new file mode 100644 index 0000000000..73417bf0f3 --- /dev/null +++ b/docs/blog/tags/antigravity/index.html @@ -0,0 +1,185 @@ + + + + + + + + +Antigravity — Munder Difflin Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Tag

+

#Antigravity

+

1 post tagged Antigravity.

+
+
+
+ + +
+
+ + +
+ + + + + + diff --git a/docs/blog/tags/claude-code/index.html b/docs/blog/tags/claude-code/index.html index bab8265f14..1bfb141b84 100644 --- a/docs/blog/tags/claude-code/index.html +++ b/docs/blog/tags/claude-code/index.html @@ -105,7 +105,7 @@

Tag

#Claude Code

-

115 posts tagged Claude Code.

+

116 posts tagged Claude Code.

@@ -141,6 +141,22 @@

Agent Tools Today, 4 Nov 2026:

+
diff --git a/docs/blog/tags/comparisons/index.html b/docs/blog/tags/comparisons/index.html index 4ecc5860fd..d777466b08 100644 --- a/docs/blog/tags/comparisons/index.html +++ b/docs/blog/tags/comparisons/index.html @@ -105,7 +105,7 @@

Tag

#Comparisons

-

65 posts tagged Comparisons.

+

66 posts tagged Comparisons.

@@ -125,6 +125,22 @@

agent-desktop Alternatives: 6 Pi

+
diff --git a/docs/blog/tags/ide/index.html b/docs/blog/tags/ide/index.html index 260adc16da..7033d0cea4 100644 --- a/docs/blog/tags/ide/index.html +++ b/docs/blog/tags/ide/index.html @@ -105,11 +105,27 @@

Tag

#IDE

-

7 posts tagged IDE.

+

8 posts tagged IDE.

+
diff --git a/docs/blog/tags/open-source/index.html b/docs/blog/tags/open-source/index.html index 59a1788e65..fb26ccd8c3 100644 --- a/docs/blog/tags/open-source/index.html +++ b/docs/blog/tags/open-source/index.html @@ -105,7 +105,7 @@

Tag

#Open Source

-

101 posts tagged Open Source.

+

102 posts tagged Open Source.

@@ -125,6 +125,22 @@

agent-desktop Alternatives: 6 Pi

+
diff --git a/docs/blog/tags/tools/index.html b/docs/blog/tags/tools/index.html index c0bf51c19f..38961277e7 100644 --- a/docs/blog/tags/tools/index.html +++ b/docs/blog/tags/tools/index.html @@ -105,7 +105,7 @@

Tag

#Tools

-

16 posts tagged Tools.

+

17 posts tagged Tools.

@@ -125,6 +125,22 @@

agent-desktop Alternatives: 6 Pi

+
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 7c8d377df5..662549bb54 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 @@ -299,34 +299,34 @@

agent-desktop Alternatives: 6 Pi

- +
- + 5 min
-

T3 Code Alternatives: 6 Picks by Why You Are Leaving (Nov 2026)

-

T3 Code is free but very early by its own account. Six alternatives sorted by why you would leave, with agents and prices checked 3 Nov 2026.

+

Worktrunk Alternatives: 6 Picks for Parallel AI Agents (Nov 2026)

+

Worktrunk alternatives checked 4 Nov 2026: plain git worktree, Munder Difflin, Claude Squad, Orca, Emdash and Conductor, sorted by why you would leave.

Comparisons - Read → + Read →
diff --git a/docs/blog/topics/comparisons/index.html b/docs/blog/topics/comparisons/index.html index 4980a243c2..6b654d20fb 100644 --- a/docs/blog/topics/comparisons/index.html +++ b/docs/blog/topics/comparisons/index.html @@ -114,7 +114,7 @@

comparisons

Honest side-by-sides with the other ways to

+
diff --git a/docs/blog/topics/concepts/index.html b/docs/blog/topics/concepts/index.html index 3a456b8818..a50097cbf0 100644 --- a/docs/blog/topics/concepts/index.html +++ b/docs/blog/topics/concepts/index.html @@ -114,7 +114,7 @@

concepts

The ideas underneath the product — harnesses,

diff --git a/docs/blog/topics/internals/index.html b/docs/blog/topics/internals/index.html index 24f58d05ee..936743b2f2 100644 --- a/docs/blog/topics/internals/index.html +++ b/docs/blog/topics/internals/index.html @@ -114,7 +114,7 @@

internals

How the machine actually works: postmortems, a