diff --git a/blog/src/_data/media.json b/blog/src/_data/media.json index 1f77259780..b669dc25a5 100644 --- a/blog/src/_data/media.json +++ b/blog/src/_data/media.json @@ -5337,6 +5337,40 @@ }, "inline": {} }, + "agent-tools-today-2026-10-28": { + "title": "Agent Tools Today, 28 Oct 2026: OpenCode 2.2, Entire, Hallmark", + "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": [] + }, + "chatgpt-dots-vs-claude-cowork": { + "title": "ChatGPT Dots vs Claude Cowork: Plans, Price and Safety (Oct 2026)", + "category": "comparisons", + "hero": { + "file": "assets/media/chatgpt-dots-vs-claude-cowork/hero.png", + "alt": "Title card on white. A pill reading Comparisons, the title ChatGPT Dots vs Claude Cowork, the line Ongoing jobs or finished files? and a Checked 28 Oct 2026 line, beside a lilac ribbon bookmark and a yellow index card with a small vs chip between them.", + "prompt": "Title card: the hero scene in assets/media/chatgpt-dots-vs-claude-cowork/motion.js, shot at 1600 by 900.", + "status": "ready" + }, + "inline": {} + }, + "codex-vs-chatgpt": { + "title": "Codex vs ChatGPT: What Is the Difference? (Oct 2026)", + "category": "comparisons", + "hero": { + "file": "assets/media/codex-vs-chatgpt/hero.png", + "alt": "Title card on white. A pill reading Comparisons, the title Codex vs ChatGPT, the line Coding agent or assistant? and a Checked 28 Oct 2026 line, beside two stacked trays labelled ChatGPT and Codex with a small vs chip.", + "prompt": "Title card: the hero scene in assets/media/codex-vs-chatgpt/motion.js, shot at 1600 by 900.", + "status": "ready" + }, + "inline": {} + }, "gpt-6-1-terra": { "title": "GPT-6.1 Terra: Price, Specs and How to Use It in Codex (Oct 2026)", "category": "concepts", diff --git a/blog/src/assets/media/agent-tools-today-2026-10-28/motion.css b/blog/src/assets/media/agent-tools-today-2026-10-28/motion.css new file mode 100644 index 0000000000..e388e721d3 --- /dev/null +++ b/blog/src/assets/media/agent-tools-today-2026-10-28/motion.css @@ -0,0 +1,13 @@ +/* Bright coded scene for "Agent Tools Today, 28 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-28/motion.js b/blog/src/assets/media/agent-tools-today-2026-10-28/motion.js new file mode 100644 index 0000000000..f02e7abcb5 --- /dev/null +++ b/blog/src/assets/media/agent-tools-today-2026-10-28/motion.js @@ -0,0 +1,109 @@ +/* Bright coded scene for "Agent Tools Today, 28 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(); } }); + }; + /* each loop opens on the final frame and eases back to the start in R0 seconds, so the loop has no jump */ + const R0 = 0.6; + const pv = (t, a, b, e = oc) => (t < R0 ? 1 - io(t / R0) : e(seg(t, a, b))); + const hint = (svg, s) => txt(svg, 756, 52, s, { "text-anchor": "end", "font-size": 16, fill: MUTE, "font-weight": 500 }); + const hitbox = (g, a) => el("rect", Object.assign({ fill: "#fff", "fill-opacity": 0 }, a), g); + const ring = (g, a) => el("rect", Object.assign({ fill: "none", stroke: INK, "stroke-width": 2.5, "stroke-dasharray": "6 6", class: "mg-ring" }, a), g); + /* a tap toggles one thing between 0 and 1; under reduced motion it jumps */ + const flipper = (api, D = 0.6) => { + let m = null, last = 0; + return { + v(auto, now) { last = m ? m.f + (m.to - m.f) * io(seg(now, m.at, m.at + (calm ? 1e-3 : D))) : auto; return last; }, + flip() { m = { f: last, to: last > 0.5 ? 0 : 1, at: api.now() }; api.nudge(); }, + }; + }; + let uid = 0; + + const SC = {}; + + /* ---- a three drawer cabinet, seen from the side; each drawer opens on a card and its tag ---- */ + SC.today = { + dur: 7.4, still: 7.4, + build(svg, api) { + hint(svg, "tap a drawer"); + const CX = 60, CW = 320, TOP = 84, ROW = 150, EXT = 306, defs = el("defs", {}, svg); + el("path", { d: "M40 562 H760", stroke: SOFT, "stroke-width": 12, "stroke-linecap": "round" }, svg); + el("rect", { x: CX + 24, y: 546, width: 34, height: 14, rx: 4, fill: INK }, svg); + el("rect", { x: CX + CW - 58, y: 546, width: 34, height: 14, rx: 4, fill: INK }, svg); + el("rect", { x: CX, y: TOP - 8, width: CW, height: 3 * ROW + 20, rx: 12, fill: YEL, stroke: INK, "stroke-width": 3 }, svg); + el("rect", { x: CX - 12, y: TOP - 20, width: CW + 24, height: 18, rx: 7, fill: YEL, stroke: INK, "stroke-width": 3 }, svg); + const items = [["OpenCode 2.2.0", "Desktop plugins", LIL], ["Entire", "Trails", MINT], ["Hallmark", "Design skill", SKY]]; + const rows = items.map(([name, tag, col], i) => { + const y0 = TOP + 6 + i * ROW, id = `mgclip${++uid}`; + el("rect", { x: CX + 18, y: y0 + 6, width: CW - 36, height: 126, rx: 9, fill: "none", stroke: INK, "stroke-width": 2 }, svg); + el("rect", { x: CX + CW + 1, y: 0, width: 800, height: y0 + 138 }, el("clipPath", { id }, defs)); + const g = el("g", {}, svg); + hitbox(g, { x: CX, y: y0 - 4, width: CW + EXT + 54, height: 146 }); + ring(g, { x: CX - 8, y: y0 - 8, width: CW + EXT + 64, height: 154, rx: 14 }); + const body = el("g", {}, el("g", { "clip-path": `url(#${id})` }, g)), card = el("g", {}, body); + el("rect", { x: CX + 30, y: y0 + 6, width: 270, height: 120, rx: 10, fill: "#fff", stroke: INK, "stroke-width": 3 }, card); + txt(card, CX + 48, y0 + 42, name, { "font-family": MONO, "font-size": 24, "font-weight": 700 }); + const chip = el("rect", { x: CX + 48, y: y0 + 52, height: 28, rx: 14, fill: col, stroke: INK, "stroke-width": 2 }, card); + const ct = txt(card, 0, y0 + 71.5, tag, { "text-anchor": "middle", "font-size": 16 }); + const w = ct.getComputedTextLength() + 30; chip.setAttribute("width", w); ct.setAttribute("x", CX + 48 + w / 2); + el("rect", { x: CX + 14, y: y0 + 88, width: CW - 16, height: 50, rx: 6, fill: SOFT, stroke: INK, "stroke-width": 3 }, body); + const front = el("g", {}, g); + el("rect", { x: CX + CW - 4, y: y0, width: 20, height: 138, rx: 6, fill: BLUE, stroke: INK, "stroke-width": 3 }, front); + el("rect", { x: CX + CW + 16, y: y0 + 54, width: 14, height: 30, rx: 6, fill: YEL, stroke: INK, "stroke-width": 3 }, front); + const f = flipper(api, 0.8); + button(g, `Drawer: ${name}, ${tag}`, () => f.flip()); + return { body, card, front, f, a: 1.0 + i * 1.7 }; + }); + return (t, now) => rows.forEach((r) => { + const o = r.f.v(pv(t, r.a, r.a + 1.0, ob), now), k = ob(cl((o - 0.5) / 0.5)); + tf(r.body, EXT * o, 0); tf(r.front, EXT * o, 0); tf(r.card, 0, 90 * (1 - cl(k, 0, 1.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(); }, nudge: () => { if (held) frame(); else 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-28/today.png b/blog/src/assets/media/agent-tools-today-2026-10-28/today.png new file mode 100644 index 0000000000..7ec0fa263c Binary files /dev/null and b/blog/src/assets/media/agent-tools-today-2026-10-28/today.png differ diff --git a/blog/src/assets/media/chatgpt-dots-vs-claude-cowork/bookmark.png b/blog/src/assets/media/chatgpt-dots-vs-claude-cowork/bookmark.png new file mode 100644 index 0000000000..3ce9457d8b Binary files /dev/null and b/blog/src/assets/media/chatgpt-dots-vs-claude-cowork/bookmark.png differ diff --git a/blog/src/assets/media/chatgpt-dots-vs-claude-cowork/hero.png b/blog/src/assets/media/chatgpt-dots-vs-claude-cowork/hero.png new file mode 100644 index 0000000000..35ed7df8a9 Binary files /dev/null and b/blog/src/assets/media/chatgpt-dots-vs-claude-cowork/hero.png differ diff --git a/blog/src/assets/media/chatgpt-dots-vs-claude-cowork/keys.png b/blog/src/assets/media/chatgpt-dots-vs-claude-cowork/keys.png new file mode 100644 index 0000000000..26f65cb7e5 Binary files /dev/null and b/blog/src/assets/media/chatgpt-dots-vs-claude-cowork/keys.png differ diff --git a/blog/src/assets/media/chatgpt-dots-vs-claude-cowork/lunchbox.png b/blog/src/assets/media/chatgpt-dots-vs-claude-cowork/lunchbox.png new file mode 100644 index 0000000000..ca7fc42f76 Binary files /dev/null and b/blog/src/assets/media/chatgpt-dots-vs-claude-cowork/lunchbox.png differ diff --git a/blog/src/assets/media/chatgpt-dots-vs-claude-cowork/motion.css b/blog/src/assets/media/chatgpt-dots-vs-claude-cowork/motion.css new file mode 100644 index 0000000000..cf78c952d2 --- /dev/null +++ b/blog/src/assets/media/chatgpt-dots-vs-claude-cowork/motion.css @@ -0,0 +1,13 @@ +/* Bright coded scenes for "ChatGPT Dots vs Claude Cowork". 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/chatgpt-dots-vs-claude-cowork/motion.js b/blog/src/assets/media/chatgpt-dots-vs-claude-cowork/motion.js new file mode 100644 index 0000000000..5234c75962 --- /dev/null +++ b/blog/src/assets/media/chatgpt-dots-vs-claude-cowork/motion.js @@ -0,0 +1,298 @@ +/* Bright coded scenes for "ChatGPT Dots vs Claude Cowork". 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(); } }); + }; + /* each loop opens on the final frame and eases back to the start in R0 seconds, so the loop has no jump */ + const R0 = 0.6; + const pv = (t, a, b, e = oc) => (t < R0 ? 1 - io(t / R0) : e(seg(t, a, b))); + const hint = (svg, s) => txt(svg, 756, 52, s, { "text-anchor": "end", "font-size": 16, fill: MUTE, "font-weight": 500 }); + const hitbox = (g, a) => el("rect", Object.assign({ fill: "#fff", "fill-opacity": 0 }, a), g); + const ring = (g, a) => el("rect", Object.assign({ fill: "none", stroke: INK, "stroke-width": 2.5, "stroke-dasharray": "6 6", class: "mg-ring" }, a), g); + /* a tap toggles one thing between 0 and 1; under reduced motion it jumps */ + const flipper = (api, D = 0.6) => { + let m = null, last = 0; + return { + v(auto, now) { last = m ? m.f + (m.to - m.f) * io(seg(now, m.at, m.at + (calm ? 1e-3 : D))) : auto; return last; }, + flip() { m = { f: last, to: last > 0.5 ? 0 : 1, at: api.now() }; api.nudge(); }, + }; + }; + let uid = 0; + + const SC = {}; + const CAP = "#6B5878"; + /* shrink a line of text until it fits a width */ + const fit = (n, w) => { const l = n.getComputedTextLength(); if (l > w) n.setAttribute("font-size", (parseFloat(n.getAttribute("font-size")) * w) / l); return n; }; + + /* ---- 1. a book turns its own pages under a ribbon; an index card fills and drops into a finished tray ---- */ + SC.bookmark = { + dur: 7.4, still: 7.4, + build(svg, api) { + hint(svg, "tap the book"); + const SX = 230, PT = 150, PB = 380, PW = 160, F = 0.9, FLIPS = [1.0, 2.5, 4.0]; + const book = el("g", {}, svg); + hitbox(book, { x: SX - PW - 30, y: PT - 34, width: 2 * PW + 60, height: 380 }); + ring(book, { x: SX - PW - 34, y: PT - 38, width: 2 * PW + 68, height: 388, rx: 18 }); + el("rect", { x: SX - PW - 14, y: PT - 10, width: 2 * PW + 28, height: PB - PT + 62, rx: 12, fill: BLUE, stroke: INK, "stroke-width": 3 }, book); + const edges = [-1, 1].map((s) => [7, 6, 5, 4, 3, 2, 1].map((j) => ({ j, n: el("rect", { x: s < 0 ? SX - PW : SX, y: PT + j * 6, width: PW, height: PB - PT, rx: 4, fill: "#fff", stroke: INK, "stroke-width": 2 }, book) }))); + [SX - PW, SX].forEach((x) => el("rect", { x, y: PT, width: PW, height: PB - PT, rx: 4, fill: "#fff", stroke: INK, "stroke-width": 3 }, book)); + el("rect", { x: SX - PW + 24, y: PT + 26, width: 76, height: 12, rx: 6, fill: LIL }, book); + [112, 96, 118, 88, 108, 70].forEach((w, i) => el("rect", { x: SX - PW + 24, y: PT + 62 + i * 26, width: w, height: 6, rx: 3, fill: SKY }, book)); + [104, 118, 92, 114, 100, 116, 64].forEach((w, i) => el("rect", { x: SX + 26, y: PT + 30 + i * 26, width: w, height: 6, rx: 3, fill: SKY }, book)); + el("path", { d: `M${SX} ${PT} V${PB}`, stroke: INK, "stroke-width": 3 }, book); + const turn = el("path", { fill: "#fff", stroke: INK, "stroke-width": 3, "stroke-linejoin": "round" }, book); + const ribI = el("path", { stroke: INK, "stroke-width": 22, fill: "none" }, book), ribO = el("path", { stroke: LIL, "stroke-width": 15, fill: "none" }, book); + const tag = el("g", {}, book), tagR = el("rect", { y: 0, height: 42, rx: 12, fill: "#fff", stroke: INK, "stroke-width": 3 }, tag); + const tagT = txt(tag, 0, 27, "ChatGPT Dots", { "text-anchor": "middle", "font-family": MONO, "font-size": 18, "font-weight": 700 }); + const tw = tagT.getComputedTextLength() + 32; tagR.setAttribute("x", -tw / 2); tagR.setAttribute("width", tw); + const taps = []; + button(book, "Turn a page", () => { taps.push(api.now()); if (taps.length > 12) taps.shift(); api.nudge(); }); + /* the card and the tray */ + el("rect", { x: 488, y: 424, width: 264, height: 30, rx: 8, fill: MINT, stroke: INK, "stroke-width": 3 }, svg); + const card = el("g", {}, svg); + el("rect", { x: 510, y: 150, width: 220, height: 186, rx: 12, fill: YEL, stroke: INK, "stroke-width": 3 }, card); + fit(txt(card, 530, 192, "Claude Cowork", { "font-size": 24, "font-weight": 700 }), 180); + el("path", { d: "M530 208 H710", stroke: INK, "stroke-width": 2.5, "stroke-linecap": "round" }, card); + const LW = [150, 128, 164, 116, 140]; + const lines = LW.map((w, i) => el("rect", { x: 530, y: 228 + i * 20, width: w, height: 8, rx: 4, fill: "#fff", stroke: INK, "stroke-width": 1.5 }, card)); + el("path", { d: "M470 450 H770 L756 522 H484 Z", fill: MINT, stroke: INK, "stroke-width": 3, "stroke-linejoin": "round" }, svg); + txt(svg, 620, 494, "finished", { "text-anchor": "middle", "font-size": 20 }); + return (t, now) => { + /* pages turned so far: three chapters on the timeline, plus taps */ + const auto = t < R0 ? Math.round(3 * (1 - io(t / R0))) : FLIPS.filter((s) => t >= s + F / 2).length; + const D = calm ? 1e-3 : F, man = taps.filter((s) => now >= s + D / 2).length; + const n = Math.round(1.5 * Math.min(4, auto + man)); + edges[0].forEach((e) => e.n.setAttribute("display", e.j <= 1 + n ? "inline" : "none")); + edges[1].forEach((e) => e.n.setAttribute("display", e.j <= 7 - n ? "inline" : "none")); + let k = -1, sw = 0; + const kick = (u) => { if (u >= 0 && u <= 1) { k = u; sw -= 30 * Math.sin(Math.PI * u); } else if (u > 1) { const v = (u - 1) * F; sw += 9 * Math.exp(-3 * v) * Math.sin(9 * v); } }; + if (t >= R0) FLIPS.forEach((s) => kick((t - s) / F)); + if (!calm) taps.forEach((s) => kick((now - s) / F)); + if (k >= 0) { + const xe = SX + PW * Math.cos(Math.PI * k), lift = 22 * Math.sin(Math.PI * k), mx = (SX + xe) / 2; + turn.setAttribute("d", `M${SX} ${PT} Q${mx} ${PT - lift * 1.6} ${xe} ${PT - lift} L${xe} ${PB - lift} Q${mx} ${PB - lift * 0.6} ${SX} ${PB} Z`); + turn.setAttribute("display", "inline"); + } else turn.setAttribute("display", "none"); + const ex = SX + 12 + sw, ey = PB + 82, d = `M${SX + 12} ${PT - 18} C${SX + 12} ${PB - 40} ${SX + 12 + sw * 0.3} ${PB + 30} ${ex} ${ey}`; + ribI.setAttribute("d", d); ribO.setAttribute("d", d); tf(tag, ex, ey - 2, 1, -sw * 0.25); + /* the card: appears, fills line by line, slides into the tray */ + let op = 1, sc = 1, dy = 150; + if (t < R0) { op = 1 - seg(t, 0, 0.35); lines.forEach((l, i) => { l.setAttribute("width", LW[i]); l.setAttribute("display", "inline"); }); } + else { + const a = seg(t, 0.7, 1.1); op = a > 0 ? 1 : 0; sc = 0.6 + 0.4 * ob(a); dy = 150 * io(seg(t, 5.2, 6.0)); + lines.forEach((l, i) => { const w = LW[i] * oc(seg(t, 1.3 + i * 0.7, 1.8 + i * 0.7)); l.setAttribute("width", w); l.setAttribute("display", w > 1 ? "inline" : "none"); }); + } + card.setAttribute("opacity", op); + card.setAttribute("transform", `translate(620 ${243 + dy}) scale(${sc}) translate(-620 -243)`); + }; + }, + }; + + /* ---- 2. two lunchboxes pop open one after the other ---- */ + const sandwich = (g, tag) => { + g = el("g", { transform: "translate(0 -8)" }, g); + el("path", { d: "M-78 0 L0 -92 L78 0 Z", fill: LIL, stroke: INK, "stroke-width": 2.5, "stroke-linejoin": "round", transform: "translate(11 -9)" }, g); + el("path", { d: "M-78 0 L0 -92 L78 0 Z", fill: MINT, stroke: INK, "stroke-width": 2.5, "stroke-linejoin": "round", transform: "translate(5 -4)" }, g); + el("path", { d: "M-70 0 Q-76 0 -72 -6 L-6 -84 Q0 -90 6 -84 L72 -6 Q76 0 70 0 Z", fill: YEL, stroke: INK, "stroke-width": 3, "stroke-linejoin": "round" }, g); + el("path", { d: "M-46 -12 L0 -66 L46 -12 Z", fill: "#fff", stroke: INK, "stroke-width": 2, "stroke-linejoin": "round" }, g); + el("path", { d: "M0 -84 V-112", stroke: INK, "stroke-width": 3, "stroke-linecap": "round" }, g); + const r = el("rect", { x: 0, y: -134, height: 30, rx: 7, fill: "#fff", stroke: INK, "stroke-width": 2.5 }, g); + const n = txt(g, 0, -113, tag, { "font-family": MONO, "font-size": 17, "font-weight": 700 }); + const w = n.getComputedTextLength() + 22; r.setAttribute("width", w); n.setAttribute("x", 11); + return 144; + }; + const snack = (g, tag) => { + const s = el("g", { transform: "rotate(-8 0 -62)" }, g); + el("circle", { cx: 0, cy: -62, r: 58, fill: YEL, stroke: INK, "stroke-width": 3 }, s); + for (let i = 0; i < 10; i++) { const a = (i / 10) * 6.283 + 0.3; el("circle", { cx: Math.cos(a) * 44, cy: -62 + Math.sin(a) * 44, r: 5, fill: BLUE }, s); } + txt(s, 0, -53, tag, { "text-anchor": "middle", "font-family": MONO, "font-size": 26, "font-weight": 700 }); + return 124; + }; + SC.lunchbox = { + dur: 6.4, still: 6.4, + build(svg, api) { + hint(svg, "tap a lunchbox"); + el("path", { d: "M40 534 H760", stroke: SOFT, "stroke-width": 12, "stroke-linecap": "round" }, svg); + const B = [ + { x: 70, w: 260, h: 160, col: SKY, name: "Claude Pro", price: "$20", food: sandwich, tag: "Cowork", at: 1.0, ph: 132 }, + { x: 390, w: 340, h: 220, col: MINT, name: "ChatGPT Pro", price: "from $100", food: snack, tag: "Dots", at: 2.3, ph: 146 }, + ]; + const boxes = B.map((b) => { + const rim = 528 - b.h, cx = b.x + b.w / 2, g = el("g", {}, svg); + hitbox(g, { x: b.x - 10, y: rim - 196, width: b.w + 20, height: b.h + 204 }); + ring(g, { x: b.x - 14, y: rim - 200, width: b.w + 28, height: b.h + 212, rx: 18 }); + const handle = (y) => `M${cx - 40} ${y} V${y - 16} Q${cx - 40} ${y - 32} ${cx - 24} ${y - 32} H${cx + 24} Q${cx + 40} ${y - 32} ${cx + 40} ${y - 16} V${y}`; + const pH = el("path", { stroke: INK, "stroke-width": 10, fill: "none", "stroke-linecap": "round" }, g), pH2 = el("path", { stroke: YEL, "stroke-width": 4, fill: "none", "stroke-linecap": "round" }, g); + const panel = el("rect", { x: b.x + 10, width: b.w - 20, rx: 14, fill: b.col, stroke: INK, "stroke-width": 3 }, g); + el("rect", { x: b.x + 14, y: rim - 9, width: b.w - 28, height: 18, rx: 9, fill: SOFT, stroke: INK, "stroke-width": 2.5 }, g); + const food = el("g", {}, g), fh = b.food(el("g", {}, food), b.tag); + el("rect", { x: b.x, y: rim, width: b.w, height: b.h, rx: 20, fill: b.col, stroke: INK, "stroke-width": 3 }, g); + const sr = el("rect", { y: rim + b.h / 2 - 42, height: 84, rx: 12, fill: "#fff", stroke: INK, "stroke-width": 2.5 }, g); + const t1 = txt(g, cx, rim + b.h / 2 - 8, b.name, { "text-anchor": "middle", "font-size": 22, "font-weight": 700 }); + const t2 = txt(g, cx, rim + b.h / 2 + 26, b.price, { "text-anchor": "middle", "font-family": MONO, "font-size": 22, "font-weight": 700 }); + const sw = Math.max(t1.getComputedTextLength(), t2.getComputedTextLength()) + 44; sr.setAttribute("x", cx - sw / 2); sr.setAttribute("width", sw); + const cap = el("g", {}, g); + el("path", { d: handle(rim - 28), stroke: INK, "stroke-width": 10, fill: "none", "stroke-linecap": "round" }, cap); + el("path", { d: handle(rim - 28), stroke: YEL, "stroke-width": 4, fill: "none", "stroke-linecap": "round" }, cap); + el("rect", { x: b.x - 6, y: rim - 30, width: b.w + 12, height: 40, rx: 14, fill: b.col, stroke: INK, "stroke-width": 3 }, cap); + const f = flipper(api, 0.9); + button(g, `Lunchbox: ${b.name}, ${b.price}`, () => f.flip()); + return { b, rim, cx, pH, pH2, panel, food, cap, f, sink: fh - 4, handle }; + }); + return (t, now) => boxes.forEach((x) => { + const o = x.f.v(pv(t, x.b.at, x.b.at + 1.0), now); + const ck = cl(o / 0.45), pk = cl((o - 0.4) / 0.6), fk = ob(cl((o - 0.45) / 0.55)); + x.cap.setAttribute("display", o < 0.45 ? "inline" : "none"); + x.cap.setAttribute("transform", `translate(0 ${x.rim - 40 * ck}) scale(1 ${1 - 0.7 * ck}) translate(0 ${-x.rim})`); + const show = pk > 0.01 ? "inline" : "none", top = x.rim - 6 - x.b.ph * pk; + [x.panel, x.pH, x.pH2].forEach((n) => n.setAttribute("display", show)); + x.panel.setAttribute("y", top); x.panel.setAttribute("height", x.b.ph * pk + 6); + x.pH.setAttribute("d", x.handle(top + 2)); x.pH2.setAttribute("d", x.handle(top + 2)); + tf(x.food, x.cx, x.rim + 12 + x.sink * (1 - fk)); + }); + }, + }; + + /* ---- 3. a key rack: the second key swings on once the tag flips ---- */ + SC.keys = { + dur: 7.2, still: 7.2, + build(svg, api) { + hint(svg, "tap the Allow access tag"); + el("rect", { x: 70, y: 100, width: 700, height: 60, rx: 14, fill: YEL, stroke: INK, "stroke-width": 3 }, svg); + el("path", { d: "M130 120 H300 M350 142 H520 M560 120 H700", stroke: INK, "stroke-width": 2, "stroke-linecap": "round" }, svg); + [100, 740].forEach((x) => { el("circle", { cx: x, cy: 130, r: 9, fill: SOFT, stroke: INK, "stroke-width": 2.5 }, svg); el("path", { d: `M${x - 5} 130 H${x + 5}`, stroke: INK, "stroke-width": 2.5 }, svg); }); + const key = (g, col, label) => { + el("path", { d: "M8 26 L40 48", stroke: INK, "stroke-width": 3 }, g); + const fob = el("rect", { x: 34, y: 40, height: 46, rx: 12, fill: "#fff", stroke: INK, "stroke-width": 3 }, g); + const ft = txt(g, 0, 70, label, { "text-anchor": "middle", "font-size": 19 }); + const w = ft.getComputedTextLength() + 32; fob.setAttribute("width", w); ft.setAttribute("x", 34 + w / 2); + el("circle", { cx: 0, cy: 16, r: 15, fill: "none", stroke: INK, "stroke-width": 5 }, g); + el("rect", { x: -8, y: 76, width: 16, height: 120, rx: 4, fill: col, stroke: INK, "stroke-width": 3 }, g); + el("path", { d: "M8 150 H22 V162 H8 Z M8 172 H26 V186 H8 Z", fill: col, stroke: INK, "stroke-width": 3, "stroke-linejoin": "round" }, g); + el("circle", { cx: 0, cy: 58, r: 26, fill: col, stroke: INK, "stroke-width": 3 }, g); + el("circle", { cx: 0, cy: 52, r: 7, fill: "#fff", stroke: INK, "stroke-width": 2.5 }, g); + }; + const k1 = el("g", {}, svg); key(k1, SKY, "Cloud computer"); tf(k1, 140, 196); + const k2 = el("g", {}, svg); key(k2, LIL, "Your computer"); + [130, 370].forEach((hx) => el("path", { d: `M${hx} 158 V186 Q${hx} 200 ${hx + 12} 200 Q${hx + 24} 200 ${hx + 24} 188`, stroke: INK, "stroke-width": 6, fill: "none", "stroke-linecap": "round" }, svg)); + /* the tag hangs on a string; front reads Allow access, back is a mint tick */ + el("path", { d: "M690 158 V212", stroke: INK, "stroke-width": 2.5 }, svg); + const tg = el("g", {}, svg); + const fr = el("g", {}, tg), bk = el("g", {}, tg); + const face = (g, fill, ticked) => { + const r = el("rect", { y: 0, height: 56, rx: 12, fill, stroke: INK, "stroke-width": 3 }, g); + const tt = txt(g, 0, 39, "Allow access", { "font-size": 18 }), w = tt.getComputedTextLength() + 74; + r.setAttribute("x", -w / 2); r.setAttribute("width", w); tt.setAttribute("x", -w / 2 + 52); + el("circle", { cx: 0, cy: 9, r: 4, fill: "#fff", stroke: INK, "stroke-width": 2 }, g); + el("rect", { x: -w / 2 + 16, y: 18, width: 24, height: 24, rx: 6, fill: "#fff", stroke: INK, "stroke-width": 2.5 }, g); + if (ticked) { + const d = `M${-w / 2 + 21} 30 L${-w / 2 + 27} 36 L${-w / 2 + 37} 23`; + el("path", { d, stroke: INK, "stroke-width": 8, fill: "none", "stroke-linecap": "round", "stroke-linejoin": "round" }, g); + el("path", { d, stroke: MINT, "stroke-width": 4, fill: "none", "stroke-linecap": "round", "stroke-linejoin": "round" }, g); + } + return w; + }; + const TW = face(fr, LIL, false); face(bk, "#fff", true); + const hit = el("g", {}, svg); + hitbox(hit, { x: 690 - TW / 2 - 8, y: 196, width: TW + 16, height: 80 }); + ring(hit, { x: 690 - TW / 2 - 10, y: 194, width: TW + 20, height: 84, rx: 16 }); + /* the card that sways below */ + el("circle", { cx: 260, cy: 436, r: 6, fill: SOFT, stroke: INK, "stroke-width": 2.5 }, svg); + const dc = el("g", {}, svg); + el("path", { d: "M0 0 L-50 34 M0 0 L50 34", stroke: INK, "stroke-width": 2.5, fill: "none" }, dc); + el("rect", { x: -78, y: 34, width: 156, height: 86, rx: 12, fill: SKY, stroke: INK, "stroke-width": 3 }, dc); + txt(dc, 0, 70, "Delete?", { "text-anchor": "middle", "font-size": 24, "font-weight": 700 }); + txt(dc, 0, 101, "Ask first", { "text-anchor": "middle", "font-size": 20, "font-weight": 500 }); + el("circle", { cx: 0, cy: 0, r: 6, fill: SOFT, stroke: INK, "stroke-width": 2.5 }, dc); + let m = null, lastF = 0, lastK = 0; + const D = (x) => (calm ? 1e-3 : x); + button(hit, "Allow access tag", () => { m = { to: lastF > 0.5 ? 0 : 1, at: api.now(), f0: lastF, k0: lastK }; api.nudge(); }); + return (t, now) => { + let F, K, s; + if (m) { + const u = now - m.at; F = m.f0 + (m.to - m.f0) * io(seg(u, 0, D(0.7))); + if (m.to) { const a = D(0.8), b = D(1.7); K = m.k0 > 0.99 ? 1 : m.k0 + (1 - m.k0) * io(seg(u, a, b)); s = m.k0 > 0.99 ? 99 : u - b; } + else { K = m.k0 * (1 - io(seg(u, 0, D(0.6)))); s = 99; } + } else { F = pv(t, 1.4, 2.1, io); K = pv(t, 2.4, 3.3, io); s = t < R0 ? 99 : t - 3.3; } + lastF = F; lastK = K; + const c = Math.cos(Math.PI * F); + fr.setAttribute("display", c >= 0 ? "inline" : "none"); bk.setAttribute("display", c >= 0 ? "none" : "inline"); + tg.setAttribute("transform", `translate(690 210) scale(${Math.max(0.001, Math.abs(c))} 1)`); + const sway = s > 0 && !calm ? 16 * Math.exp(-2.4 * s) * Math.sin(6 * s) : 0; + k2.setAttribute("display", K > 0.002 ? "inline" : "none"); + tf(k2, 380 + 380 * (1 - K), 196 + 70 * (1 - K) - 90 * Math.sin(Math.PI * K), 1, -35 * (1 - K) + sway); + tf(dc, 260, 436, 1, calm ? 0 : 4 * Math.sin((2 * Math.PI * t) / 2.4)); + }; + }, + }; + + /* ---- title card, 16 by 9 ---- */ + SC.hero = { + w: 960, h: 540, dur: 1, still: 0, + build(svg) { + const pr = el("rect", { x: 64, y: 64, height: 40, rx: 20, fill: SOFT, stroke: INK, "stroke-width": 2 }, svg); + const pt = txt(svg, 84, 91, "Comparisons", { "font-size": 18, "font-weight": 700 }); + pr.setAttribute("width", pt.getComputedTextLength() + 40); + fit(txt(svg, 64, 196, "ChatGPT Dots vs", { "font-size": 62, "font-weight": 700 }), 520); + fit(txt(svg, 64, 270, "Claude Cowork", { "font-size": 62, "font-weight": 700 }), 520); + el("path", { d: "M66 296 H400", stroke: YEL, "stroke-width": 12, "stroke-linecap": "round" }, svg); + txt(svg, 64, 352, "Ongoing jobs or finished files?", { "font-size": 26, "font-weight": 500, fill: MUTE }); + txt(svg, 64, 470, "Checked 28 Oct 2026", { "font-size": 18, "font-weight": 500, fill: CAP }); + el("path", { d: "M628 120 H688 V410 L658 382 L628 410 Z", fill: LIL, stroke: INK, "stroke-width": 3, "stroke-linejoin": "round" }, svg); + el("path", { d: "M640 132 V376 M676 132 V376", stroke: INK, "stroke-width": 1.5, "stroke-dasharray": "5 7" }, svg); + el("circle", { cx: 742, cy: 266, r: 28, fill: "#fff", stroke: INK, "stroke-width": 3 }, svg); + txt(svg, 742, 274, "vs", { "text-anchor": "middle", "font-size": 22, "font-weight": 700 }); + const c = el("g", { transform: "rotate(-4 860 266)" }, svg); + el("rect", { x: 790, y: 212, width: 144, height: 108, rx: 10, fill: YEL, stroke: INK, "stroke-width": 3 }, c); + el("path", { d: "M806 240 H918", stroke: BLUE, "stroke-width": 3, "stroke-linecap": "round" }, c); + el("path", { d: "M806 262 H906 M806 282 H916 M806 302 H884", stroke: INK, "stroke-width": 2, "stroke-linecap": "round" }, c); + 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(); }, nudge: () => { if (held) frame(); else 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/codex-vs-chatgpt/hero.png b/blog/src/assets/media/codex-vs-chatgpt/hero.png new file mode 100644 index 0000000000..48c1c7ebb7 Binary files /dev/null and b/blog/src/assets/media/codex-vs-chatgpt/hero.png differ diff --git a/blog/src/assets/media/codex-vs-chatgpt/ladder.png b/blog/src/assets/media/codex-vs-chatgpt/ladder.png new file mode 100644 index 0000000000..822a04490b Binary files /dev/null and b/blog/src/assets/media/codex-vs-chatgpt/ladder.png differ diff --git a/blog/src/assets/media/codex-vs-chatgpt/motion.css b/blog/src/assets/media/codex-vs-chatgpt/motion.css new file mode 100644 index 0000000000..c5d40b40b4 --- /dev/null +++ b/blog/src/assets/media/codex-vs-chatgpt/motion.css @@ -0,0 +1,13 @@ +/* Bright coded scenes for "Codex vs ChatGPT". 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/codex-vs-chatgpt/motion.js b/blog/src/assets/media/codex-vs-chatgpt/motion.js new file mode 100644 index 0000000000..f33f1661c5 --- /dev/null +++ b/blog/src/assets/media/codex-vs-chatgpt/motion.js @@ -0,0 +1,260 @@ +/* Bright coded scenes for "Codex vs ChatGPT". 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(); } }); + }; + /* each loop opens on the final frame and eases back to the start in R0 seconds, so the loop has no jump */ + const R0 = 0.6; + const pv = (t, a, b, e = oc) => (t < R0 ? 1 - io(t / R0) : e(seg(t, a, b))); + const hint = (svg, s) => txt(svg, 756, 52, s, { "text-anchor": "end", "font-size": 16, fill: MUTE, "font-weight": 500 }); + const hitbox = (g, a) => el("rect", Object.assign({ fill: "#fff", "fill-opacity": 0 }, a), g); + const ring = (g, a) => el("rect", Object.assign({ fill: "none", stroke: INK, "stroke-width": 2.5, "stroke-dasharray": "6 6", class: "mg-ring" }, a), g); + /* a tap toggles one thing between 0 and 1; under reduced motion it jumps */ + const flipper = (api, D = 0.6) => { + let m = null, last = 0; + return { + v(auto, now) { last = m ? m.f + (m.to - m.f) * io(seg(now, m.at, m.at + (calm ? 1e-3 : D))) : auto; return last; }, + flip() { m = { f: last, to: last > 0.5 ? 0 : 1, at: api.now() }; api.nudge(); }, + }; + }; + let uid = 0; + + const SC = {}; + const CAP = "#6B5878"; + /* shrink a line of text until it fits a width */ + const fit = (n, w) => { const l = n.getComputedTextLength(); if (l > w) n.setAttribute("font-size", (parseFloat(n.getAttribute("font-size")) * w) / l); return n; }; + + /* a toolbox tray, 290 by 70, drawn from its top left; what it holds sits in `held`, clipped at the tray floor */ + const tray = (p, col, label, kind, card = true) => { + const g = el("g", {}, p), id = `mgclip${++uid}`; + el("rect", { x: -80, y: -240, width: 450, height: 310 }, el("clipPath", { id }, el("defs", {}, g))); + el("rect", { x: 8, y: -10, width: 274, height: 18, rx: 7, fill: col, stroke: INK, "stroke-width": 2.5 }, g); + const held = el("g", {}, el("g", { "clip-path": `url(#${id})` }, g)); + if (kind === "chat") { + const pad = el("g", { transform: "translate(46 -80) rotate(-6)" }, held); + el("rect", { x: 0, y: 0, width: 86, height: 104, rx: 6, fill: "#fff", stroke: INK, "stroke-width": 3 }, pad); + [0, 1, 2, 3].forEach((i) => el("rect", { x: 14, y: 26 + i * 15, width: [58, 50, 60, 40][i], height: 5, rx: 2.5, fill: SKY }, pad)); + [14, 30, 46, 62, 78].forEach((x) => el("circle", { cx: x, cy: 2, r: 4.5, fill: SOFT, stroke: INK, "stroke-width": 2 }, pad)); + const pen = el("g", { transform: "translate(196 -92) rotate(18)" }, held); + el("rect", { x: -9, y: -16, width: 18, height: 18, rx: 4, fill: LIL, stroke: INK, "stroke-width": 3 }, pen); + el("rect", { x: -9, y: 0, width: 18, height: 100, fill: YEL, stroke: INK, "stroke-width": 3 }, pen); + el("path", { d: "M-9 100 L0 124 L9 100 Z", fill: SOFT, stroke: INK, "stroke-width": 3, "stroke-linejoin": "round" }, pen); + el("path", { d: "M-3.5 115 L0 124 L3.5 115 Z", fill: INK }, pen); + } else { + const w = el("g", { transform: card ? "translate(72 -50) rotate(-30)" : "translate(140 -50) rotate(-60)" }, held); + el("rect", { x: -9, y: 0, width: 18, height: 112, rx: 9, fill: LIL, stroke: INK, "stroke-width": 3 }, w); + el("circle", { cx: 0, cy: -10, r: 24, fill: LIL, stroke: INK, "stroke-width": 3 }, w); + el("rect", { x: -8, y: -38, width: 16, height: 26, rx: 3, fill: "#fff", stroke: INK, "stroke-width": 2.5 }, w); + el("rect", { x: -12, y: -40, width: 24, height: 6, fill: "#fff" }, w); + if (card) { + const c = el("g", { transform: "translate(148 -62)" }, held); + el("rect", { x: 0, y: 0, width: 120, height: 80, rx: 8, fill: "#fff", stroke: INK, "stroke-width": 3 }, c); + txt(c, 60, 32, "terminal", { "text-anchor": "middle", "font-family": MONO, "font-size": 18, "font-weight": 700 }); + } + } + el("rect", { x: 0, y: 0, width: 290, height: 70, rx: 12, fill: col, stroke: INK, "stroke-width": 3 }, g); + txt(g, 145, 45, label, { "text-anchor": "middle", "font-size": 26, "font-weight": 700 }); + return { g, held }; + }; + + /* ---- 1. a cantilever toolbox: the ChatGPT tray slides out, the Codex tray rises ---- */ + SC.toolbox = { + dur: 6.2, still: 6.2, + build(svg, api) { + hint(svg, "tap the toolbox"); + el("path", { d: "M60 534 H740", stroke: SOFT, "stroke-width": 12, "stroke-linecap": "round" }, svg); + const box = el("g", {}, svg); + hitbox(box, { x: 80, y: 60, width: 600, height: 470 }); + ring(box, { x: 76, y: 56, width: 608, height: 478, rx: 20 }); + const arm = () => [el("path", { stroke: INK, "stroke-width": 9, "stroke-linecap": "round" }, box), el("path", { stroke: BLUE, "stroke-width": 3, "stroke-linecap": "round" }, box)]; + const setArm = (a, x1, y1, x2, y2) => a.forEach((n) => n.setAttribute("d", `M${x1} ${y1} L${x2} ${y2}`)); + const cA = [arm(), arm()], gA = [arm(), arm()], codex = tray(box, YEL, "Codex", "codex"); + el("rect", { x: 250, y: 400, width: 310, height: 124, rx: 14, fill: BLUE, stroke: INK, "stroke-width": 3 }, box); + [292, 486].forEach((x) => el("rect", { x, y: 404, width: 32, height: 22, rx: 5, fill: YEL, stroke: INK, "stroke-width": 2.5 }, box)); + const chat = tray(box, SKY, "ChatGPT", "chat"); + const f = flipper(api, 1.4); + button(box, "Toolbox: open or close the trays", () => f.flip()); + return (t, now) => { + const o = f.v(pv(t, 1.0, 3.0, (x) => x), now); + const k1 = io(cl(o / 0.6)), k2 = io(cl((o - 0.4) / 0.6)); + const x1 = 260 - 160 * k1, y1 = 330 - 150 * k1 - 40 * Math.sin(Math.PI * k1); + const x2 = 260 + 100 * k2, y2 = 412 - 102 * k2 - 20 * Math.sin(Math.PI * k2); + tf(chat.g, x1, y1); tf(codex.g, x2, y2); + tf(chat.held, 0, 112 * (1 - ob(cl((k1 - 0.45) / 0.55)))); + tf(codex.held, 0, 112 * (1 - ob(cl((k2 - 0.45) / 0.55)))); + setArm(gA[0], 280, 420, x1 + 30, y1 + 60); setArm(gA[1], 400, 420, x1 + 150, y1 + 60); + setArm(cA[0], 430, 470, x2 + 70, y2 + 60); setArm(cA[1], 540, 470, x2 + 180, y2 + 60); + }; + }, + }; + + /* ---- 2. a ladder of plans; the CLI card climbs and settles on Plus ---- */ + SC.ladder = { + dur: 6.4, still: 6.4, + build(svg, api) { + hint(svg, "tap the ladder"); + el("rect", { x: 568, y: -10, width: 250, height: 570, fill: SOFT }, svg); + el("path", { d: "M568 0 V560", stroke: INK, "stroke-width": 3 }, svg); + el("path", { d: "M30 560 H800", stroke: INK, "stroke-width": 3, "stroke-linecap": "round" }, svg); + const LX = (y) => 430 - 0.44 * (y - 70), RW = 130, YS = [480, 380, 280, 180]; + const lad = el("g", {}, svg); + hitbox(lad, { x: 60, y: 56, width: 512, height: 508 }); + ring(lad, { x: 56, y: 52, width: 520, height: 516, rx: 20 }); + YS.forEach((y) => { const d = `M${LX(y)} ${y} H${LX(y) + RW}`; el("path", { d, stroke: INK, "stroke-width": 14 }, lad); el("path", { d, stroke: YEL, "stroke-width": 8 }, lad); }); + [0, RW].forEach((dx) => { const d = `M${LX(560) + dx} 560 L${LX(70) + dx} 70`; el("path", { d, stroke: INK, "stroke-width": 18, "stroke-linecap": "round" }, lad); el("path", { d, stroke: YEL, "stroke-width": 12, "stroke-linecap": "round" }, lad); }); + const chips = ["Free $0", "Go $8", "Plus $20", "Pro from $100"].map((s, i) => { + const y = YS[i], r = el("rect", { y: y - 19, height: 38, rx: 19, fill: "#fff", stroke: INK, "stroke-width": 2.5 }, lad); + const n = txt(lad, 0, y + 7, s, { "text-anchor": "middle", "font-size": 19 }), w = n.getComputedTextLength() + 34, right = LX(y) - 22; + r.setAttribute("x", right - w); r.setAttribute("width", w); n.setAttribute("x", right - w / 2); + return r; + }); + button(lad, "Ladder: replay the climb", () => api.seek(R0)); + const card = el("g", {}, svg); + el("rect", { x: -38, y: -46, width: 76, height: 46, rx: 9, fill: MINT, stroke: INK, "stroke-width": 3 }, card); + txt(card, 0, -15, "CLI", { "text-anchor": "middle", "font-family": MONO, "font-size": 22, "font-weight": 700 }); + const spot = [[LX(560) + RW / 2, 558], ...YS.slice(0, 3).map((y) => [LX(y) + RW / 2 + 12, y - 7])], HOPS = [1.0, 2.0, 3.0], H = 0.62; + return (t) => { + let x, y, s = 1, r = 0, op = 1; + if (t < R0) { const top = t < 0.3; [x, y] = spot[top ? 3 : 0]; op = top ? 1 - seg(t, 0, 0.3) : seg(t, 0.3, 0.6); } + else { + let j = 0; HOPS.forEach((h) => { if (t >= h + H) j++; }); + [x, y] = spot[j]; + const h = HOPS[j]; + if (j < 3 && t >= h) { + const u = seg(t, h, h + H), [ax, ay] = spot[j], [bx, by] = spot[j + 1], e = io(u); + x = ax + (bx - ax) * e; y = ay + (by - ay) * e - 60 * Math.sin(Math.PI * u); r = 10 * Math.sin(2 * Math.PI * u); + } else if (j > 0) { const v = t - (HOPS[j - 1] + H); s = 1 + 0.12 * Math.exp(-6 * v) * Math.sin(14 * v); } + } + card.setAttribute("transform", `translate(${x} ${y}) rotate(${r}) scale(${2 - s} ${s})`); + card.setAttribute("opacity", op); + const on = t < 0.3 || t >= HOPS[2] + H; + chips.forEach((c, i) => c.setAttribute("fill", i === 2 && on ? YEL : "#fff")); + }; + }, + }; + + /* ---- 3. a tram map: Codex runs four stops, ChatGPT three, both share Desktop app ---- */ + SC.tram = { + dur: 8, still: 8, + build(svg, api) { + hint(svg, "tap a tram line"); + const along = (P, d) => { for (let i = 1; i < P.length; i++) { const [ax, ay] = P[i - 1], [bx, by] = P[i], L = Math.hypot(bx - ax, by - ay); if (d <= L || i === P.length - 1) { const u = cl(d / L); return [ax + (bx - ax) * u, ay + (by - ay) * u]; } d -= L; } }; + const cum = (P) => P.map((p, i) => P.slice(1, i + 1).reduce((s, q, j) => s + Math.hypot(q[0] - P[j][0], q[1] - P[j][1]), 0)); + const LINES = [ + { name: "Codex", col: YEL, P: [[100, 170], [280, 170], [430, 320], [690, 320]], stops: [0, 1, 2, 3], dr: [0.6, 1.8], show: 2.2, moves: [[2.8, 3.4, 0, 1], [3.8, 4.6, 1, 2], [5.0, 5.8, 2, 3]] }, + { name: "ChatGPT", col: SKY, P: [[180, 470], [280, 470], [430, 320], [580, 170]], stops: [0, 2, 3], dr: [1.1, 2.2], show: 2.3, moves: [[2.6, 3.2, 0, 2], [3.5, 4.1, 2, 3]] }, + ]; + let sel = -1; + LINES.forEach((l, i) => { + l.C = cum(l.P); l.L = l.C[l.C.length - 1]; + const d = "M" + l.P.map((p) => p.join(" ")).join(" L"), g = el("g", {}, svg), lj = { fill: "none", "stroke-linejoin": "round", "stroke-linecap": "round", d }; + el("path", Object.assign({ stroke: "#fff", "stroke-opacity": 0, "stroke-width": 44 }, lj), g); + el("path", Object.assign({ stroke: INK, "stroke-width": 42, class: "mg-ring" }, lj), g); + el("path", Object.assign({ stroke: "#fff", "stroke-width": 37, class: "mg-ring" }, lj), g); + l.halo = el("path", Object.assign({ stroke: LIL, "stroke-width": 32 }, lj), g); + l.ink = el("path", Object.assign({ stroke: INK, "stroke-width": 18, "stroke-dasharray": `${l.L + 2} ${l.L + 2}` }, lj), g); + l.fill = el("path", Object.assign({ stroke: l.col, "stroke-width": 11, "stroke-dasharray": `${l.L + 2} ${l.L + 2}` }, lj), g); + button(g, `${l.name} line`, () => { sel = sel === i ? -1 : i; api.nudge(); }); + }); + /* stops and their names, above both lines */ + const NAMES = [["Terminal", 100, 126, "middle"], ["Editor", 280, 126, "middle"], ["Desktop app", 452, 374, "start"], ["Cloud", 690, 364, "middle"], ["Web", 180, 514, "middle"], ["Mobile", 580, 126, "middle"]]; + const STOPS = [[0, 0, 0], [0, 1, 1], [-1, 2, 2], [0, 3, 3], [1, 0, 4], [1, 3, 5]].map(([li, v, ni]) => { + const [x, y] = li < 0 ? [430, 320] : LINES[li].P[v], g = el("g", {}, svg); + el("circle", { cx: 0, cy: 0, r: li < 0 ? 16 : 10, fill: "#fff", stroke: INK, "stroke-width": li < 0 ? 4 : 3 }, g); + const [s, lx, ly, an] = NAMES[ni], n = txt(svg, lx, ly, s, { "text-anchor": an, "font-size": 20 }); + const at = li < 0 ? Math.min(...LINES.map((l) => l.dr[0] + (l.C[2] / l.L) * (l.dr[1] - l.dr[0]))) : LINES[li].dr[0] + (LINES[li].C[v] / LINES[li].L) * (LINES[li].dr[1] - LINES[li].dr[0]); + return { g, n, x, y, at }; + }); + const trams = LINES.map((l) => { + const g = el("g", {}, svg); + el("path", { d: "M-14 -20 L0 -32 L14 -20", stroke: INK, "stroke-width": 2.5, fill: "none", "stroke-linejoin": "round" }, g); + el("rect", { x: -54, y: -20, width: 108, height: 40, rx: 12, fill: l.col, stroke: INK, "stroke-width": 3 }, g); + txt(g, 0, 6, l.name, { "text-anchor": "middle", "font-family": MONO, "font-size": 17, "font-weight": 700 }); + return g; + }); + return (t) => { + LINES.forEach((l, i) => { + const k = t < R0 ? 1 - io(t / R0) : io(seg(t, l.dr[0], l.dr[1])); + [l.ink, l.fill].forEach((n) => n.setAttribute("stroke-dashoffset", (l.L + 2) * (1 - k))); + l.halo.setAttribute("display", sel === i ? "inline" : "none"); + let d = l.C[l.moves[l.moves.length - 1][3]]; + if (t >= R0) { d = 0; l.moves.forEach(([a, b, p, q]) => { if (t >= a) d = l.C[p] + (l.C[q] - l.C[p]) * io(seg(t, a, b)); }); } + const [x, y] = along(l.P, d), pop = t < R0 ? 1 : ob(seg(t, l.show, l.show + 0.4)); + trams[i].setAttribute("transform", `translate(${x} ${y}) scale(${Math.max(0.001, pop)})`); + trams[i].setAttribute("opacity", t < R0 ? 1 - seg(t, 0, 0.3) : t >= l.show ? 1 : 0); + }); + STOPS.forEach((s) => { + const k = t < R0 ? 1 - seg(t, 0, R0) : ob(seg(t, s.at, s.at + 0.35)); + s.g.setAttribute("transform", `translate(${s.x} ${s.y}) scale(${Math.max(0.001, k)})`); + s.n.setAttribute("opacity", cl(k)); + }); + }; + }, + }; + + /* ---- title card, 16 by 9 ---- */ + SC.hero = { + w: 960, h: 540, dur: 1, still: 0, + build(svg) { + const pr = el("rect", { x: 64, y: 64, height: 40, rx: 20, fill: SOFT, stroke: INK, "stroke-width": 2 }, svg); + const pt = txt(svg, 84, 91, "Comparisons", { "font-size": 18, "font-weight": 700 }); + pr.setAttribute("width", pt.getComputedTextLength() + 40); + fit(txt(svg, 64, 200, "Codex vs", { "font-size": 76, "font-weight": 700 }), 440); + fit(txt(svg, 64, 284, "ChatGPT", { "font-size": 76, "font-weight": 700 }), 440); + el("path", { d: "M66 310 H380", stroke: YEL, "stroke-width": 12, "stroke-linecap": "round" }, svg); + txt(svg, 64, 366, "Coding agent or assistant?", { "font-size": 26, "font-weight": 500, fill: MUTE }); + txt(svg, 64, 470, "Checked 28 Oct 2026", { "font-size": 18, "font-weight": 500, fill: CAP }); + const top = tray(svg, SKY, "ChatGPT", "chat"), bot = tray(svg, YEL, "Codex", "codex", false); + tf(top.g, 548, 186); tf(bot.g, 572, 372); + el("circle", { cx: 904, cy: 320, r: 26, fill: "#fff", stroke: INK, "stroke-width": 3 }, svg); + txt(svg, 904, 328, "vs", { "text-anchor": "middle", "font-size": 22, "font-weight": 700 }); + 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(); }, nudge: () => { if (held) frame(); else 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/codex-vs-chatgpt/toolbox.png b/blog/src/assets/media/codex-vs-chatgpt/toolbox.png new file mode 100644 index 0000000000..8caf422cac Binary files /dev/null and b/blog/src/assets/media/codex-vs-chatgpt/toolbox.png differ diff --git a/blog/src/assets/media/codex-vs-chatgpt/tram.png b/blog/src/assets/media/codex-vs-chatgpt/tram.png new file mode 100644 index 0000000000..33614ce84c Binary files /dev/null and b/blog/src/assets/media/codex-vs-chatgpt/tram.png differ diff --git a/blog/src/posts/agent-tools-today-2026-10-28.md b/blog/src/posts/agent-tools-today-2026-10-28.md new file mode 100644 index 0000000000..dd91d68715 --- /dev/null +++ b/blog/src/posts/agent-tools-today-2026-10-28.md @@ -0,0 +1,57 @@ +--- +title: "Agent Tools Today, 28 Oct 2026: OpenCode 2.2, Entire, Hallmark" +seoTitle: "Agent Tools Today (28 Oct 2026): Launches, Skills, MCP Servers" +description: "The top launches, skills, multi agent moves, rising repos and arguments in AI agents from 27 to 28 Oct 2026, each with its source and date." +date: 2026-10-28 +category: news +categoryLabel: News +type: Non-technical +series: agent-tools-today +primaryKeyword: "agent tools today 28 oct 2026" +secondaryKeywords: ["opencode 2.2.0", "entire git forge", "hallmark design skill", "claude code 2.1.312", "codex 0.165.0", "soulgent"] +tags: ["Daily Brief", "Claude Code", "Skills", "Open Source"] +--- + +Agent tools today, 28 Oct 2026, in one line: OpenCode 2.2.0 opened its desktop app to plugins, Entire launched a Git forge where review agents score every push, and the design skill Hallmark gained more than 2,800 stars in a day. It covers 27 to 28 Oct, checked 28 Oct. An earlier edition is [26 Oct](/blog/agent-tools-today-2026-10-26/). + +[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. It is not ranked in the lists below. + +
Animation. On a white background, a small cabinet with three drawers opens one drawer at a time. The top drawer holds a card labelled OpenCode 2.2.0 with a tag Desktop plugins, the middle one a card labelled Entire with a tag Trails, and the bottom one a card labelled Hallmark with a tag Design skill. Tapping a drawer opens or closes it.
The day's three lead items, from OpenCode's release notes, Entire's blog and the Hallmark repo, read 28 Oct 2026.
+ +## Top 3 launches + +1. **OpenCode 2.2.0.** Published 27 Oct. You can now create, install and share desktop plugins, which the release notes mark experimental, and the desktop app was refreshed. Plugins can add keyed session instructions without editing the system prompt, so the prompt cache survives. See [OpenCode alternatives](/blog/opencode-alternatives/). [Source](https://github.com/anomalyco/opencode/releases/tag/v2.2.0) +2. **Entire.** On 26 Oct Entire introduced what it calls "the first Git forge built specifically for agent-human collaboration". In place of a pull request, a Trail shows eval scores that review agents give on every push, and Gates can require human approval and passing CI before a merge. Entire says the review agents use Claude Code and Codex in cloud sandboxes, and that its Git server pushes up to 89x faster than GitHub, which is its own figure. More than 50 points on Hacker News on 28 Oct. [Source](https://entire.com/blog/the-git-forge-for-agent-human-collaboration) +3. **Survival LLM.** A free AI assistant and emergency library that, after setup, needs no internet. It runs on Apple Silicon Macs with macOS 14 or newer and on 64 bit Windows 10 or 11, picks a model that fits your memory, from IBM Granite 4.2 8B for 16 to 31 GB up to NVIDIA Nemotron 3.5 Super for 128 GB or more, and lists the sources behind every answer, including about 930,000 Wikipedia articles. More than 210 points on Hacker News on 28 Oct; repo created 24 Oct, more than 170 stars, and GitHub detects no standard licence. [Source](https://www.brangus.io/survival-llm) + +## Top 3 skills, MCP servers and plugins + +1. **Hallmark.** A design skill for Claude Code, Codex, Cursor and OpenCode, made by Together AI, that its README says "refuses to look AI-generated". Version 2 deals three themes from a catalog of fifty and checks the page in a real browser against signs of machine made design. MIT, more than 39,000 stars, and 2,830 stars in a day on GitHub trending on 28 Oct. [Source](https://github.com/Nutlope/hallmark) +2. **AI Design Skills.** A growing set of design skills for Claude Code, Cursor, Codex, Windsurf and any tool that reads a markdown rules file. The first is `landing-page-design`, which asks intake questions and builds a landing page with its copy and a visual system. MIT, created 29 Jul, more than 9,600 stars, and 1,395 stars in a day on GitHub trending on 28 Oct. [Source](https://github.com/elayadesign/ai-design-skills) +3. **mcp-video-editor.** An MCP server that lets Cursor, Claude Desktop, Codex CLI, Antigravity, OpenCode and KiloCode edit video projects in CapCut and OpenCut over stdio. Its README lists 50 tools, from timeline clips and captions to export, and says all of them default to `dryRun: true`. Created 26 Oct, more than 50 stars on 28 Oct; GitHub detects no licence. [Source](https://github.com/AISEO-VirtualabDigital/mcp-video-editor) + +## Top 3 moves from multi agent tools + +1. **Claude Code v2.1.312.** Published 27 Oct. Claude no longer overwrites a very large `CLAUDE.md`, rules file or included file in a subdirectory after seeing only its start; Write now asks it to read the whole file or edit in place. In fullscreen you can click the hint under a queued message to send it now. See [Claude Code best practices](/blog/claude-code-best-practices/). [Source](https://github.com/anthropics/claude-code/releases/tag/v2.1.312) +2. **Codex 0.165.0.** Published 27 Oct. It adds a built in Google Cloud Vertex AI provider (`model_provider = "gcp"`), puts [GPT-6.1 Terra](/blog/gpt-6-1-terra/) in the model catalogs, turns on memory v2 by default for fresh profiles with import of memories from other agents, and lets you change reasoning effort mid conversation on supported models. [Source](https://github.com/openai/codex/releases/tag/rust-v0.165.0) +3. **OpenClaw 2026.10.8.** Published 27 Oct. A failed post update Doctor check now restarts the Gateway instead of leaving it stopped, an orphaned maintenance worker no longer blocks every CLI command, and updates no longer abort on ACL filesystems or Windows pnpm links. See [OpenClaw alternatives](/blog/openclaw-alternatives/). [Source](https://github.com/openclaw/openclaw/releases/tag/v2026.10.8) + +## Top 3 rising repos + +1. **Soulgent.** A Mac app that turns each Claude Code, Codex and WorkBuddy session into a character with a name, a look and a mood, so you can see at a glance who is working, who is done and who is waiting for your decision. MIT, created 27 Oct, more than 30 stars on 28 Oct. [Source](https://github.com/Ericcc0321/soulgent) +2. **OpenBot.** A desktop workspace for persistent AI teammates that runs Codex and Claude Code, plus Grok CLI, OpenCode, Gemini, Cursor CLI and Cline CLI through ACP, each with its own workspace, queues, file transfer, an embedded browser and agent to agent messages. Its README warns it is a development preview whose agents run with `danger-full-access` and no per action approval. On GitHub trending on 28 Oct, more than 2,500 stars; GitHub detects no standard licence. [Source](https://github.com/nightly-labs/openbot) +3. **agent-purge.** One system prompt for many coding agents, among them Codex, Claude, OpenCode, Grok, Hermes and Pi, with four modes (replace, strict, append, off) and a local web console. MIT, created 25 Oct, more than 650 stars on 28 Oct. [Source](https://github.com/ZiChuanLan/agent-purge) + +Stars can rise for reasons other than use: names to watch, not picks. + +## Top 3 things people are arguing about + +1. **Do agents mean more work, not less?** An engineer writes that with several agents running at once, each needing him "sometimes", he works more than ever, because every answer means switching to another problem. The Hacker News thread had more than 620 points and 610 comments on 28 Oct. [Source](https://oioannou.com/blog/ai-promised-less-work/) +2. **Does Brooks's law hold for agents?** A post revisits The Mythical Man-Month and argues that sequential tasks stay sequential and the overhead moves to you: someone still defines done, reviews the code and stitches the parts together. More than 440 points on Hacker News on 28 Oct. [Source](https://j11g.com/the-mythical-man-month-in-the-age-of-ai) +3. **What does a thumbs up send to Anthropic?** Anthropic's privacy article for its commercial products, dated 18 Aug 2026, says it does not train on their inputs and outputs by default, but feedback through the thumbs up or down button stores the entire related conversation for up to 5 years and may be used to train models. Owners of Team and Enterprise plans can turn the button off with the Rate chats setting. More than 210 points on Hacker News on 28 Oct. [Source](https://privacy.claude.com/en/articles/7996868-is-my-data-used-for-model-training) + +## How this list is built + +For this edition, covering 27 to 28 Oct, we read the GitHub releases of 21 tracked tools, vendor blogs and changelogs, GitHub trending, and the Hacker News front page. We did not read X or Reddit for it. 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. New here? Start with the [install guide](/blog/how-to-install-and-use-munder-difflin/). + + diff --git a/blog/src/posts/chatgpt-dots-vs-claude-cowork.md b/blog/src/posts/chatgpt-dots-vs-claude-cowork.md new file mode 100644 index 0000000000..49bfd94f59 --- /dev/null +++ b/blog/src/posts/chatgpt-dots-vs-claude-cowork.md @@ -0,0 +1,101 @@ +--- +title: "ChatGPT Dots vs Claude Cowork: Plans, Price and Safety (Oct 2026)" +seoTitle: "ChatGPT Dots vs Claude Cowork (2026): Price, Plans, Files" +description: "ChatGPT Dots keeps an ongoing job moving; Claude Cowork hands back finished files. Plans, prices, where each runs and how each asks first, checked 28 Oct 2026." +date: 2026-10-28 +category: comparisons +categoryLabel: Comparisons +type: Non-technical +primaryKeyword: "chatgpt dots vs claude cowork" +secondaryKeywords: ["claude cowork vs chatgpt dots", "chatgpt dots or claude cowork", "dots vs cowork", "chatgpt dots alternative", "claude cowork alternative"] +tags: ["Comparisons", "AI Agents", "Automation", "Cost"] +faq: + - q: "What is the difference between ChatGPT Dots and Claude Cowork?" + a: "The shape of the work. OpenAI's docs describe a dot as an always on agent that keeps track of an ongoing responsibility and follows up between conversations. Anthropic's help page says Cowork lets you describe an outcome, step away and come back to finished work such as documents, organized files and research. Checked 28 Oct 2026." + - q: "Which is cheaper, ChatGPT Dots or Claude Cowork?" + a: "Claude Cowork. On 28 Oct 2026 Anthropic's pricing page listed Claude Pro at $20 if billed monthly, and Cowork is available on Pro. OpenAI's docs list dots for Pro 100, Pro 200 and Pro 500, and its pricing page listed Pro from $100 a month on the same date." + - q: "Can I use ChatGPT Dots in the UK or EU?" + a: "Not on a personal Pro plan. OpenAI's dots page lists Pro for users over 18 outside the European Economic Area, United Kingdom and Switzerland. Business Premium and Enterprise are rolling out worldwide, and Enterprise admins must turn dots on. Checked 28 Oct 2026." + - q: "Do ChatGPT Dots and Claude Cowork keep working when my computer is off?" + a: "Yes, for cloud work. A dot has its own cloud computer and can keep working when your computer is off. Cowork runs on Anthropic's servers, and scheduled tasks run with no device online. Work that needs your own files needs your computer on and the app open." + - q: "Can a ChatGPT dot or Claude Cowork delete my files?" + a: "Cowork asks first: its help page says Claude requires your explicit permission before permanently deleting any files. OpenAI's dots docs give you custom rules such as Hand off to you, and say rules are instructions a dot tries to follow and it can make mistakes. Checked 28 Oct 2026." +--- + +Pick ChatGPT Dots if you want one always on agent that owns an ongoing job and reaches you in Slack, Teams or a call; pick Claude Cowork if you want tasks handed back as finished files. Cowork comes with Claude Pro at $20 billed monthly, Dots with ChatGPT Pro from $100 a month, checked 28 Oct 2026. + +If you want agents on your own machine as well, [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. This sits in our [Comparisons hub](/blog/topics/comparisons/), next to [what is ChatGPT Dots](/blog/what-is-chatgpt-dots/) and [what is Claude Cowork](/blog/what-is-claude-cowork/). + +## ChatGPT Dots vs Claude Cowork at a glance (checked 28 Oct 2026) + +Both are hosted agents that keep working in the cloud; they differ in the job, the plan and the controls. + +| | ChatGPT Dots | Claude Cowork | +| --- | --- | --- | +| Unit of work | An ongoing responsibility | A task with an outcome | +| Where the work runs | Its own cloud computer and browser | Anthropic's servers, in an isolated environment | +| Your computer | Optional, one at a time | Through the desktop app, folders you connect | +| Where you talk to it | ChatGPT apps, Slack, Teams, calls | Claude web, desktop, mobile, Chrome side panel | +| Plans | Pro 100, Pro 200, Pro 500; Business Premium and Enterprise rolling out | Pro, Max, Team, Enterprise | +| Entry price on 28 Oct 2026 | ChatGPT Pro from $100 a month | Claude Pro, $20 billed monthly | +| Approvals | Automatic review, optional custom rules | Manual, Auto or Skip mode | + +## What does each one do? + +A dot keeps track of something over time, while Cowork finishes a task you describe. OpenAI's [dots page](https://learn.chatgpt.com/docs/dots) calls a dot "an always-on agent that keeps work moving across your tools and projects", for when you want it to "keep track of an ongoing responsibility, figure out next steps as things change, and follow up between conversations". It runs on GPT-6 Astra and can hand work to ChatGPT Work or Codex. + +Anthropic's [help page](https://support.claude.com/en/articles/13345190-get-started-with-claude-cowork) says Cowork "brings Claude Code's agentic capabilities to knowledge work beyond coding". You "describe an outcome, step away, and come back to finished work", such as documents, organized files and research. Cowork is also being folded into Claude itself: on 28 Oct 2026 the [pricing page](https://claude.com/pricing) banner read "Claude Cowork is now just Claude", rolling out to Pro and Max first. + +Our view: a dot is a standing assignment, Cowork is a job ticket. + +
Animation. On a white background, a thick book turns its own pages while a ribbon bookmark labelled ChatGPT Dots moves forward chapter by chapter. Beside it a single index card labelled Claude Cowork fills with lines and slides into a finished tray.
A dot follows an ongoing job; Cowork hands back finished work. OpenAI and Anthropic docs, 28 Oct 2026.
+ +## How much do they cost? + +Claude Cowork costs less to start, because it comes with Claude Pro and dots need ChatGPT Pro, Business Premium or Enterprise. On 28 Oct 2026 Anthropic's pricing page listed Pro at $20 if billed monthly, or $17 a month billed annually, and Max from $100 a month. The help page says Cowork "is available on paid plans (Pro, Max, Team, and Enterprise)". + +OpenAI's [pricing page](https://learn.chatgpt.com/docs/pricing) listed Pro on 28 Oct 2026 as "Plans at $100, $200, or $500 USD per month". The dots page lists Pro 100, Pro 200 and Pro 500 "for users over 18 outside the European Economic Area, United Kingdom, and Switzerland". Business Premium and Enterprise are "rolling out worldwide", and Enterprise admins must switch dots on. OpenAI adds that dots are rolling out gradually, so you may not see them yet even on an eligible plan. + +Usage counts differently too. OpenAI says conversations with your dot "don't count toward your ChatGPT usage limits", while tasks it starts in Work or Codex do. Anthropic's [Cowork page](https://claude.com/product/cowork) warns that "Claude Cowork consumes limits faster than Chat." + +
Animation. On a white background, two lunchboxes pop open one after the other. The small one is labelled Claude Pro, 20 dollars, and holds one sandwich marked Cowork. The big one is labelled ChatGPT Pro, from 100 dollars, and holds a round snack marked Dots. Prices from 28 Oct 2026.
Claude Pro at $20 billed monthly, ChatGPT Pro from $100 a month, per Anthropic's and OpenAI's pricing pages on 28 Oct 2026.
+ +## Where do they run and what can they touch? + +Both run in the cloud and reach your own computer through their desktop app. A dot "lives in the cloud and has its own computer and browser" and "can keep working even when your computer is off". You can connect one personal computer at a time, and it must be online with the ChatGPT app open. Its cloud browser "doesn't inherit logins from your personal browser". + +Cowork's help page says "Claude's work runs on Anthropic's servers, in an isolated environment", and "work continues if you close your laptop". Local files, browser use and computer use need the Claude Desktop app for macOS or Windows, open and connected. Claude "can only read and write files in folders you've connected". Anthropic's Cowork page says its built in browser, in the desktop app on Pro, Max and Team, is "Separate from your own browser, logins, and tabs." + +## Which is safer with your files? + +Both check risky actions, but Cowork fixes one rule for files. Its help page says Claude "requires your explicit permission before permanently deleting any files". It offers three modes: Manual asks each time, Auto lets Claude review each action and block unsafe ones, and Skip means "nothing checks its actions automatically". In the new Claude experience the message box offers Auto, the default on Pro, Max and Team, and Manual. Anthropic also states that "Cowork has unique risks due to its agentic nature and internet access." + +OpenAI's [controls page](https://learn.chatgpt.com/docs/dots/controls) says an automatic review checks actions that could affect your accounts or share information. Custom rules offer four choices: "Take action without asking", "Take action when you say so", "Ask before taking action" and "Hand off to you". The page adds that rules are instructions your dot "tries to follow, and it can make mistakes", and that stopping work "doesn't undo completed actions". + +
Animation. On a white background, a wooden key rack has two hooks. A key labelled Cloud computer already hangs on the first hook. A second key labelled Your computer swings onto the empty hook after a tag reading Allow access flips over. A small card reading Delete? Ask first sways below.
A dot reaches your computer after you allow access; Cowork asks before deleting files. OpenAI and Anthropic docs, 28 Oct 2026.
+ +Our view: keep both on the asking setting for anything that sends messages or touches money. + +## Pick ChatGPT Dots if..., pick Claude Cowork if... + +Pick by the shape of the work. + +**Pick ChatGPT Dots if:** +- You pay for ChatGPT Pro outside the EEA, UK and Switzerland, or have Business Premium. +- You want one agent that watches a project and pings you when a decision is due. +- You want to reach it in Slack, Teams or by calling it. + +**Pick Claude Cowork if:** +- You want a finished spreadsheet, deck or report. +- You want to start on a $20 plan (28 Oct 2026) rather than one from $100. +- You want file access fenced to folders you connect. + +More options sit in [ChatGPT Dots alternatives](/blog/chatgpt-dots-alternatives/); [Claude Cowork vs Claude Code](/blog/claude-cowork-vs-claude-code/) covers Anthropic's other agent. + +## Can you run both? + +Yes, but they are separate subscriptions, so you pay OpenAI and Anthropic. + +Munder Difflin fits alongside either when you want agents on your own machine. It runs agents on engines such as Claude Code, Codex and Gemini CLI, takes work in from Slack and webhooks, and connects tools through MCP servers, skills and plugins. Today the agents run on your computer; a Cloud Office and a mobile app are coming soon. [How to install and use Munder Difflin](/blog/how-to-install-and-use-munder-difflin/) covers setup, and [Munder Difflin vs ChatGPT Dots](/blog/munder-difflin-vs-chatgpt-dots/) puts it next to Dots. + + diff --git a/blog/src/posts/claude-cowork-vs-claude-code.md b/blog/src/posts/claude-cowork-vs-claude-code.md index 45f6c8437c..95bfb751fc 100644 --- a/blog/src/posts/claude-cowork-vs-claude-code.md +++ b/blog/src/posts/claude-cowork-vs-claude-code.md @@ -96,6 +96,8 @@ Cowork is hosted and paid, OpenClaw is self-hosted and free. The [OpenClaw READM The trade is control against convenience. OpenClaw's README warns that "Tools run on the host for the main session unless you configure sandboxing". Cowork runs in Anthropic's isolated environment, on Anthropic's terms and plans. GitHub showed OpenClaw release v2026.9.8, dated 3 Oct, when we checked on 6 Oct 2026. Its README says it was built for Molty, a space lobster AI assistant. See [OpenClaw alternatives](/blog/openclaw-alternatives/) for more options. +OpenAI's rival: [ChatGPT Dots vs Claude Cowork](/blog/chatgpt-dots-vs-claude-cowork/). + ## Who should pick which? Pick by what you need handed back. diff --git a/blog/src/posts/codex-vs-chatgpt.md b/blog/src/posts/codex-vs-chatgpt.md new file mode 100644 index 0000000000..c3970c5214 --- /dev/null +++ b/blog/src/posts/codex-vs-chatgpt.md @@ -0,0 +1,110 @@ +--- +title: "Codex vs ChatGPT: What Is the Difference? (Oct 2026)" +seoTitle: "Codex vs ChatGPT (2026): Difference, Plans and Coding" +description: "Codex is OpenAI's coding agent and ChatGPT is its assistant. Which plans include Codex, the limits, where each runs and which to use, checked 28 Oct 2026." +date: 2026-10-28 +category: comparisons +categoryLabel: Comparisons +type: Non-technical +primaryKeyword: "codex vs chatgpt" +secondaryKeywords: ["what is codex", "is codex part of chatgpt", "codex vs chatgpt for coding", "do i need chatgpt plus for codex", "openai codex vs chatgpt"] +tags: ["Comparisons", "Codex", "CLI Agents", "Cost"] +faq: + - q: "Is Codex part of ChatGPT?" + a: "Yes. OpenAI's docs say ChatGPT Work and Codex are included in your ChatGPT Free, Go, Plus, Pro, Business, Edu or Enterprise plan, and the ChatGPT desktop app asks you to choose ChatGPT or Codex. The Codex CLI is also an open source project on GitHub under Apache-2.0. Checked 28 Oct 2026." + - q: "Do I need ChatGPT Plus for Codex?" + a: "Not to try it. On 28 Oct 2026 OpenAI's pricing page listed Free at $0 and Go at $8 a month with GPT-6 Luna in the desktop app, subject to rollout. Plus at $20 a month (28 Oct 2026) is the first card that lists Codex on the web, in the CLI, in the IDE extension and on iOS. An API key works without a plan." + - q: "Is Codex better than ChatGPT for coding?" + a: "For work inside a repository, yes. OpenAI's docs say to use Codex when you want to build, debug, test or review software and work directly with code and developer tools. ChatGPT Work can also run code and review it in the environment you select." + - q: "What are the Codex usage limits on Plus?" + a: "OpenAI publishes estimates, not fixed limits. On 28 Oct 2026 its pricing page estimated 15 to 160 local messages per five hours on GPT-6.1 Sol and 350 to 3,000 on GPT-6 Luna for Plus, said weekly limits may also apply, and said Pro plans currently have no five hour limit." + - q: "Can I use Codex without a ChatGPT account?" + a: "Yes, with an API key. OpenAI's pricing page says an API key gives you Codex in the CLI, SDK or IDE extension, billed at API pricing, with no cloud based features such as GitHub code review or Slack. Checked 28 Oct 2026." +--- + +Pick Codex if you want an agent that works inside a code repository from your terminal, editor or the cloud; pick ChatGPT for answers, drafts and finished documents. ChatGPT Free, Go, Plus, Pro, Business, Edu and Enterprise include Codex, on Free and Go in the desktop app subject to rollout, checked 28 Oct 2026. + +You can also run Codex next to other agents in [Munder Difflin](https://harnessmd.com/download), which 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. This page sits in our [Comparisons hub](/blog/topics/comparisons/). For Codex alone, start with [what is Codex](/blog/what-is-codex/). + +## Codex vs ChatGPT at a glance (checked 28 Oct 2026) + +Codex is the coding agent and ChatGPT is the assistant around it; they share your account and your usage. + +| | Codex | ChatGPT | +| --- | --- | --- | +| What it is | OpenAI's coding agent | OpenAI's assistant: Chat for answers, Work for finished tasks | +| Use it to | Build, debug, test or review software | Ask, draft, research, analyze, create files | +| Where it runs | Desktop app, CLI, IDE extension, Codex Cloud, mobile | Web, desktop app, mobile | +| Sign in | ChatGPT account or API key | ChatGPT account | +| Plans | Free, Go, Plus, Pro, Business, Edu, Enterprise, or an API key | The same ChatGPT plans | +| Usage | Shared with ChatGPT Work | Work uses Codex's pricing, credits and limits | +| Open source | CLI under Apache-2.0 | Not listed on OpenAI's open source page | + +## What is the difference between Codex and ChatGPT? + +The difference is the job: ChatGPT talks and produces documents, Codex works on code with developer tools. OpenAI's [Use ChatGPT page](https://learn.chatgpt.com/docs/use-chatgpt) puts it in one line: "Use Chat for a question or back-and-forth. Turn on Work in the switcher when you want ChatGPT to carry a larger task through to a reviewable result. Select Codex when you want developer views or more technical detail, especially for software development." + +So is Codex part of ChatGPT? Yes. The [desktop app page](https://learn.chatgpt.com/docs/app) tells you to "Choose ChatGPT or Codex" when you send your first message. The [pricing page](https://learn.chatgpt.com/docs/pricing) says "ChatGPT Work usage inside ChatGPT uses the same pricing, credits, and usage limits as Codex." + +Codex also lives outside the app. The [Codex README](https://github.com/openai/codex) says "Codex CLI is a coding agent from OpenAI that runs locally on your computer." GitHub listed the repo under Apache-2.0 on 28 Oct 2026, with release rust-v0.165.0 published on 27 Oct. + +
Animation. On a white background, a toolbox opens and its top tray, labelled ChatGPT, slides out holding a notepad and a pencil. Under it a second tray, labelled Codex, rises with a wrench and a small card that reads terminal.
One app, two trays: you choose ChatGPT or Codex in the desktop app. OpenAI's desktop app docs, 28 Oct 2026.
+ +## Do you need a ChatGPT plan to use Codex? + +No, an API key works too, but a plan decides where you can use Codex. OpenAI's pricing page listed these plans, in US dollars, on 28 Oct 2026: + +- **Free at $0 and Go at $8 a month (28 Oct 2026):** "GPT-6 Luna at Standard speed in the desktop app, subject to rollout". +- **Plus at $20 a month (28 Oct 2026):** "Codex on the web, in the CLI, in the IDE extension, and on iOS", automatic code review and Slack, GPT-6.1 Sol and GPT-6 Luna. +- **Pro from $100 a month (28 Oct 2026):** "Plans at $100, $200, or $500 USD per month", with Ultrafast mode on Pro $500. +- **Business at $20 per user a month (28 Oct 2026):** for two or more users billed annually, or $25 billed monthly. +- **API key:** Codex "in the CLI, SDK, or IDE extension", with "No cloud-based features", billed at API pricing. + +Limits are estimates, not caps. For Plus and Standard Business, the page estimated local messages "per five-hour period": 15 to 160 on GPT-6.1 Sol and 350 to 3,000 on GPT-6 Luna. It adds that "Weekly limits may also apply" and that "Pro plans currently have no five-hour limit." [Codex pricing](/blog/codex-pricing/) has the credit rates. + +
Animation. On a white background, a wooden ladder leans on a wall with rungs labelled Free 0 dollars, Go 8 dollars, Plus 20 dollars and Pro from 100 dollars, as listed on 28 Oct 2026. A small card that reads CLI climbs rung by rung and settles on Plus.
Free and Go list the desktop app; Plus at $20 a month was the first card listing the CLI on OpenAI's pricing page, 28 Oct 2026.
+ +## Where does each one run? + +ChatGPT runs on the web, the desktop app and mobile; Codex adds your terminal, your editor and OpenAI's cloud. The desktop app comes "for macOS or Windows", with a Linux installation guide. + +- **Codex CLI:** the [CLI page](https://learn.chatgpt.com/docs/codex/cli) says Codex can "inspect files, make edits, and run the tools already installed on your machine", and `codex exec` runs it in scripts and CI. +- **IDE extension:** per the [IDE page](https://learn.chatgpt.com/docs/codex/ide), "VS Code and compatible editors use the Codex extension; Xcode and JetBrains IDEs provide their own integrations." +- **Codex Cloud:** each task "has its own workspace and can keep working while your computer is asleep", according to the [cloud page](https://learn.chatgpt.com/docs/cloud). +- **Mobile:** OpenAI's [mobile page](https://learn.chatgpt.com/docs/mobile) says the ChatGPT mobile app can start, guide and approve Codex tasks that run "in the cloud or on a connected computer", with availability depending on rollout and your workspace settings. + +Our [Codex CLI install guide](/blog/how-to-install-codex-cli/) covers the terminal setup. + +
Animation. On a white background, a tram map draws two lines. A tram labelled Codex stops in turn at Terminal, Editor, Desktop app and Cloud. A second tram labelled ChatGPT runs a shorter line through Web, Desktop app and Mobile, and both lines share the Desktop app stop.
Codex runs in the CLI, IDE extension, desktop app and Codex Cloud; both share the desktop app. OpenAI's Codex docs, 28 Oct 2026.
+ +## Which is better for coding? + +Codex, for anything that touches a repository. OpenAI's [dots page](https://learn.chatgpt.com/docs/dots) lists Codex for when you want to "build, debug, test, or review software and work directly with code and developer tools". Model choice differs too: the pricing page says "GPT-6.1 Sol is available in Work and Codex, not Chat." + +ChatGPT Work can still handle some code. The Use ChatGPT page says it can "Run code and shell commands, analyze data, inspect files, review code, and work with repositories your selected environment can access." The [Work page](https://learn.chatgpt.com/docs/get-started-with-work) also says that if you used Codex for non coding work, "you can stay in Codex or use ChatGPT Work instead." + +Our view: Chat to think it through, Codex to change the code, Work for the write up. Same bill, three tabs. + +## Pick Codex if..., pick ChatGPT if... + +Pick by what you need handed back: a diff or a document. + +**Pick Codex if:** +- You want an agent that edits files and runs commands in your repo. +- You want to script it in CI with `codex exec` or an API key. +- You want cloud tasks that keep going while your laptop sleeps. + +**Pick ChatGPT if:** +- You want an answer, a brainstorm or a draft (Chat). +- You want a deck, report or spreadsheet you can review (Work). +- You are on Free or Go and mostly ask questions. + +For other coding agents, see [Codex vs Claude Code](/blog/codex-cli-vs-claude-code/) and [Codex alternatives](/blog/codex-alternatives/). + +## Can you run Codex next to other agents? + +Yes. Codex is one CLI among several, and they can run side by side. + +Munder Difflin is one place to do that. It runs a team of agents for research, writing, ops and coding on engines such as Claude Code, Codex and Gemini CLI, takes work in from Slack and webhooks, and connects tools through MCP servers, skills and plugins. The agents run on your computer today; a Cloud Office and a mobile app are coming soon. [How to install and use Munder Difflin](/blog/how-to-install-and-use-munder-difflin/) walks through setup. + + diff --git a/blog/src/posts/what-is-codex.md b/blog/src/posts/what-is-codex.md index 0f0c6aa2b8..c88266564c 100644 --- a/blog/src/posts/what-is-codex.md +++ b/blog/src/posts/what-is-codex.md @@ -82,6 +82,8 @@ So you can try Codex for nothing, and the cloud integrations start at Plus. Our No: ChatGPT is OpenAI's assistant, and Codex is the coding agent that ships with it. They share your account and the desktop app, and the pricing page says ChatGPT Work uses the same pricing, credits and usage limits as Codex. The difference is the job. ChatGPT answers in a conversation; Codex changes files in a repository. With an API key you can run the CLI without any ChatGPT plan. +The full comparison: [Codex vs ChatGPT](/blog/codex-vs-chatgpt/). + ## How does Codex compare with Claude Code? Codex and Claude Code do the same job; our view is that the plan you already pay for usually decides. Codex's CLI is open source under Apache-2.0 and the Free plan lists Codex in the desktop app. Claude Code is Anthropic's agent and, per Anthropic's [memory docs](https://code.claude.com/docs/en/memory), reads `CLAUDE.md` files and can read `AGENTS.md` too. We think neither wins for every repo. Our [Codex vs Claude Code comparison](/blog/codex-cli-vs-claude-code/) has a dated table, and [Codex vs Cursor](/blog/codex-vs-cursor/) covers the editor side. For seven other agents, see [Codex alternatives](/blog/codex-alternatives/). 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 b681eaae6c..c6f6e18268 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, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

-

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

+

Agent Tools Today, 28 Oct 2026: OpenCode 2.2, Entire, Hallmark

+

The top launches, skills, multi agent moves, rising repos and arguments in AI agents from 27 to 28 Oct 2026, each with its source and date.

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

Agent Tools Today, 23 Oct 2026: Claude Duet, OpenAI CLI, Nvidia OpenShell

-

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

+

Agent Tools Today, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents from 23 to 26 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 b762de707d..99a901407a 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, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

-

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

+

Agent Tools Today, 28 Oct 2026: OpenCode 2.2, Entire, Hallmark

+

The top launches, skills, multi agent moves, rising repos and arguments in AI agents from 27 to 28 Oct 2026, each with its source and date.

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

Agent Tools Today, 23 Oct 2026: Claude Duet, OpenAI CLI, Nvidia OpenShell

-

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

+

Agent Tools Today, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents from 23 to 26 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 169736d437..805890c988 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, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

-

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

+

Agent Tools Today, 28 Oct 2026: OpenCode 2.2, Entire, Hallmark

+

The top launches, skills, multi agent moves, rising repos and arguments in AI agents from 27 to 28 Oct 2026, each with its source and date.

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

Agent Tools Today, 23 Oct 2026: Claude Duet, OpenAI CLI, Nvidia OpenShell

-

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

+

Agent Tools Today, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents from 23 to 26 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 d26b5a44d0..ed890ad4e7 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, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

-

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

+

Agent Tools Today, 28 Oct 2026: OpenCode 2.2, Entire, Hallmark

+

The top launches, skills, multi agent moves, rising repos and arguments in AI agents from 27 to 28 Oct 2026, each with its source and date.

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

Agent Tools Today, 23 Oct 2026: Claude Duet, OpenAI CLI, Nvidia OpenShell

-

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

+

Agent Tools Today, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents from 23 to 26 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 c29d053af7..a43629379e 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, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

-

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

+

Agent Tools Today, 28 Oct 2026: OpenCode 2.2, Entire, Hallmark

+

The top launches, skills, multi agent moves, rising repos and arguments in AI agents from 27 to 28 Oct 2026, each with its source and date.

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

Agent Tools Today, 23 Oct 2026: Claude Duet, OpenAI CLI, Nvidia OpenShell

-

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

+

Agent Tools Today, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents from 23 to 26 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 347a4a6ba5..d03ee6e99a 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, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

-

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

+

Agent Tools Today, 28 Oct 2026: OpenCode 2.2, Entire, Hallmark

+

The top launches, skills, multi agent moves, rising repos and arguments in AI agents from 27 to 28 Oct 2026, each with its source and date.

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

Agent Tools Today, 23 Oct 2026: Claude Duet, OpenAI CLI, Nvidia OpenShell

-

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

+

Agent Tools Today, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents from 23 to 26 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 fedb7651b3..08f418600e 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, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

-

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

+

Agent Tools Today, 28 Oct 2026: OpenCode 2.2, Entire, Hallmark

+

The top launches, skills, multi agent moves, rising repos and arguments in AI agents from 27 to 28 Oct 2026, each with its source and date.

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

Agent Tools Today, 23 Oct 2026: Claude Duet, OpenAI CLI, Nvidia OpenShell

-

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

+

Agent Tools Today, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents from 23 to 26 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 a5c4c53ea7..249e2dac86 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, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

-

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

+

Agent Tools Today, 28 Oct 2026: OpenCode 2.2, Entire, Hallmark

+

The top launches, skills, multi agent moves, rising repos and arguments in AI agents from 27 to 28 Oct 2026, each with its source and date.

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

Agent Tools Today, 23 Oct 2026: Claude Duet, OpenAI CLI, Nvidia OpenShell

-

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

+

Agent Tools Today, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents from 23 to 26 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 1e7c3b9321..c281b5f117 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, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

-

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

+

Agent Tools Today, 28 Oct 2026: OpenCode 2.2, Entire, Hallmark

+

The top launches, skills, multi agent moves, rising repos and arguments in AI agents from 27 to 28 Oct 2026, each with its source and date.

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

Agent Tools Today, 23 Oct 2026: Claude Duet, OpenAI CLI, Nvidia OpenShell

-

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

+

Agent Tools Today, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents from 23 to 26 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 633da03a18..1bd282f154 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, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

-

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

+

Agent Tools Today, 28 Oct 2026: OpenCode 2.2, Entire, Hallmark

+

The top launches, skills, multi agent moves, rising repos and arguments in AI agents from 27 to 28 Oct 2026, each with its source and date.

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

Agent Tools Today, 23 Oct 2026: Claude Duet, OpenAI CLI, Nvidia OpenShell

-

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

+

Agent Tools Today, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents from 23 to 26 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 619a76d622..2d76fafdae 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, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

-

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

+

Agent Tools Today, 28 Oct 2026: OpenCode 2.2, Entire, Hallmark

+

The top launches, skills, multi agent moves, rising repos and arguments in AI agents from 27 to 28 Oct 2026, each with its source and date.

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

Agent Tools Today, 23 Oct 2026: Claude Duet, OpenAI CLI, Nvidia OpenShell

-

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

+

Agent Tools Today, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents from 23 to 26 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 12fc7c7cb4..c7555c769d 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, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

-

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

+

Agent Tools Today, 28 Oct 2026: OpenCode 2.2, Entire, Hallmark

+

The top launches, skills, multi agent moves, rising repos and arguments in AI agents from 27 to 28 Oct 2026, each with its source and date.

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

Agent Tools Today, 23 Oct 2026: Claude Duet, OpenAI CLI, Nvidia OpenShell

-

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

+

Agent Tools Today, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents from 23 to 26 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 88dc97faaa..6a273b4aff 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, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

-

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

+

Agent Tools Today, 28 Oct 2026: OpenCode 2.2, Entire, Hallmark

+

The top launches, skills, multi agent moves, rising repos and arguments in AI agents from 27 to 28 Oct 2026, each with its source and date.

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

Agent Tools Today, 23 Oct 2026: Claude Duet, OpenAI CLI, Nvidia OpenShell

-

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

+

Agent Tools Today, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

+

The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents from 23 to 26 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 c581d1b0a2..217764934a 100644 --- a/docs/blog/agent-tools-today-2026-10-17/index.html +++ b/docs/blog/agent-tools-today-2026-10-17/index.html @@ -240,50 +240,50 @@

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

Agent Tools Today, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

-

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

+

Agent Tools Today, 28 Oct 2026: OpenCode 2.2, Entire, Hallmark

+

The top launches, skills, multi agent moves, rising repos and arguments in AI agents from 27 to 28 Oct 2026, each with its source and date.

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

Agent Tools Today, 23 Oct 2026: Claude Duet, OpenAI CLI, Nvidia OpenShell

-

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

+

Agent Tools Today, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

+

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

News - Read → + Read →
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 6e93748107..9cfdb9947d 100644 --- a/docs/blog/agent-tools-today-2026-10-18/index.html +++ b/docs/blog/agent-tools-today-2026-10-18/index.html @@ -240,50 +240,50 @@

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

Agent Tools Today, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

-

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

+

Agent Tools Today, 28 Oct 2026: OpenCode 2.2, Entire, Hallmark

+

The top launches, skills, multi agent moves, rising repos and arguments in AI agents from 27 to 28 Oct 2026, each with its source and date.

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

Agent Tools Today, 23 Oct 2026: Claude Duet, OpenAI CLI, Nvidia OpenShell

-

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

+

Agent Tools Today, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

+

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

News - Read → + Read →
diff --git a/docs/blog/agent-tools-today-2026-10-19/index.html b/docs/blog/agent-tools-today-2026-10-19/index.html index 263c879411..29062664b6 100644 --- a/docs/blog/agent-tools-today-2026-10-19/index.html +++ b/docs/blog/agent-tools-today-2026-10-19/index.html @@ -240,50 +240,50 @@

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

Agent Tools Today, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

-

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

+

Agent Tools Today, 28 Oct 2026: OpenCode 2.2, Entire, Hallmark

+

The top launches, skills, multi agent moves, rising repos and arguments in AI agents from 27 to 28 Oct 2026, each with its source and date.

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

Agent Tools Today, 23 Oct 2026: Claude Duet, OpenAI CLI, Nvidia OpenShell

-

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

+

Agent Tools Today, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

+

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

News - Read → + Read →
diff --git a/docs/blog/agent-tools-today-2026-10-21/index.html b/docs/blog/agent-tools-today-2026-10-21/index.html index 6d681b9558..fb2e1c9e4e 100644 --- a/docs/blog/agent-tools-today-2026-10-21/index.html +++ b/docs/blog/agent-tools-today-2026-10-21/index.html @@ -240,50 +240,50 @@

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

Agent Tools Today, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

-

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

+

Agent Tools Today, 28 Oct 2026: OpenCode 2.2, Entire, Hallmark

+

The top launches, skills, multi agent moves, rising repos and arguments in AI agents from 27 to 28 Oct 2026, each with its source and date.

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

Agent Tools Today, 23 Oct 2026: Claude Duet, OpenAI CLI, Nvidia OpenShell

-

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

+

Agent Tools Today, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

+

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

News - Read → + Read →
diff --git a/docs/blog/agent-tools-today-2026-10-22/index.html b/docs/blog/agent-tools-today-2026-10-22/index.html index 99e8ecfde5..55fdaf1faa 100644 --- a/docs/blog/agent-tools-today-2026-10-22/index.html +++ b/docs/blog/agent-tools-today-2026-10-22/index.html @@ -240,50 +240,50 @@

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

Agent Tools Today, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

-

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

+

Agent Tools Today, 28 Oct 2026: OpenCode 2.2, Entire, Hallmark

+

The top launches, skills, multi agent moves, rising repos and arguments in AI agents from 27 to 28 Oct 2026, each with its source and date.

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

Agent Tools Today, 23 Oct 2026: Claude Duet, OpenAI CLI, Nvidia OpenShell

-

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

+

Agent Tools Today, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

+

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

News - Read → + Read →
diff --git a/docs/blog/agent-tools-today-2026-10-23/index.html b/docs/blog/agent-tools-today-2026-10-23/index.html index 756c587b69..52e7f50acf 100644 --- a/docs/blog/agent-tools-today-2026-10-23/index.html +++ b/docs/blog/agent-tools-today-2026-10-23/index.html @@ -241,50 +241,50 @@

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

Agent Tools Today, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

-

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

+

Agent Tools Today, 28 Oct 2026: OpenCode 2.2, Entire, Hallmark

+

The top launches, skills, multi agent moves, rising repos and arguments in AI agents from 27 to 28 Oct 2026, each with its source and date.

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

Black October: What PHP2Shell Is and How to Patch (Oct 2026)

-

Black October is the scramble around PHP2Shell, two critical PHP flaws fixed on 21 Oct 2026. Who found them, the fixed versions and how to patch.

+

Agent Tools Today, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

+

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

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

Agent Tools Today, 22 Oct 2026: Claude API 2026-10-21, LayerFS 1.0, PHP2Shell

-

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

+

Black October: What PHP2Shell Is and How to Patch (Oct 2026)

+

Black October is the scramble around PHP2Shell, two critical PHP flaws fixed on 21 Oct 2026. Who found them, the fixed versions and how to patch.

News - Read → + Read →
diff --git a/docs/blog/agent-tools-today-2026-10-26/index.html b/docs/blog/agent-tools-today-2026-10-26/index.html index 9c9050095d..88508b3f69 100644 --- a/docs/blog/agent-tools-today-2026-10-26/index.html +++ b/docs/blog/agent-tools-today-2026-10-26/index.html @@ -241,50 +241,50 @@

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

Agent Tools Today, 22 Oct 2026: Claude API 2026-10-21, LayerFS 1.0, PHP2Shell

-

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

+

Black October: What PHP2Shell Is and How to Patch (Oct 2026)

+

Black October is the scramble around PHP2Shell, two critical PHP flaws fixed on 21 Oct 2026. Who found them, the fixed versions and how to patch.

News - Read → + Read →
diff --git a/docs/blog/agent-tools-today-2026-10-28/index.html b/docs/blog/agent-tools-today-2026-10-28/index.html new file mode 100644 index 0000000000..193aaaadea --- /dev/null +++ b/docs/blog/agent-tools-today-2026-10-28/index.html @@ -0,0 +1,349 @@ + + + + + + + + +Agent Tools Today (28 Oct 2026): Launches, Skills, MCP Servers + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +

Agent Tools Today, 28 Oct 2026: OpenCode 2.2, Entire, Hallmark

+

The top launches, skills, multi agent moves, rising repos and arguments in AI agents from 27 to 28 Oct 2026, each with its source and date.

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

Agent tools today, 28 Oct 2026, in one line: OpenCode 2.2.0 opened its desktop app to plugins, Entire launched a Git forge where review agents score every push, and the design skill Hallmark gained more than 2,800 stars in a day. It covers 27 to 28 Oct, checked 28 Oct. An earlier edition is 26 Oct.

+

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. It is not ranked in the lists below.

+
Animation. On a white background, a small cabinet with three drawers opens one drawer at a time. The top drawer holds a card labelled OpenCode 2.2.0 with a tag Desktop plugins, the middle one a card labelled Entire with a tag Trails, and the bottom one a card labelled Hallmark with a tag Design skill. Tapping a drawer opens or closes it.
The day's three lead items, from OpenCode's release notes, Entire's blog and the Hallmark repo, read 28 Oct 2026.
+

Top 3 launches

+
    +
  1. OpenCode 2.2.0. Published 27 Oct. You can now create, install and share desktop plugins, which the release notes mark experimental, and the desktop app was refreshed. Plugins can add keyed session instructions without editing the system prompt, so the prompt cache survives. See OpenCode alternatives. Source
  2. +
  3. Entire. On 26 Oct Entire introduced what it calls “the first Git forge built specifically for agent-human collaboration”. In place of a pull request, a Trail shows eval scores that review agents give on every push, and Gates can require human approval and passing CI before a merge. Entire says the review agents use Claude Code and Codex in cloud sandboxes, and that its Git server pushes up to 89x faster than GitHub, which is its own figure. More than 50 points on Hacker News on 28 Oct. Source
  4. +
  5. Survival LLM. A free AI assistant and emergency library that, after setup, needs no internet. It runs on Apple Silicon Macs with macOS 14 or newer and on 64 bit Windows 10 or 11, picks a model that fits your memory, from IBM Granite 4.2 8B for 16 to 31 GB up to NVIDIA Nemotron 3.5 Super for 128 GB or more, and lists the sources behind every answer, including about 930,000 Wikipedia articles. More than 210 points on Hacker News on 28 Oct; repo created 24 Oct, more than 170 stars, and GitHub detects no standard licence. Source
  6. +
+

Top 3 skills, MCP servers and plugins

+
    +
  1. Hallmark. A design skill for Claude Code, Codex, Cursor and OpenCode, made by Together AI, that its README says “refuses to look AI-generated”. Version 2 deals three themes from a catalog of fifty and checks the page in a real browser against signs of machine made design. MIT, more than 39,000 stars, and 2,830 stars in a day on GitHub trending on 28 Oct. Source
  2. +
  3. AI Design Skills. A growing set of design skills for Claude Code, Cursor, Codex, Windsurf and any tool that reads a markdown rules file. The first is landing-page-design, which asks intake questions and builds a landing page with its copy and a visual system. MIT, created 29 Jul, more than 9,600 stars, and 1,395 stars in a day on GitHub trending on 28 Oct. Source
  4. +
  5. mcp-video-editor. An MCP server that lets Cursor, Claude Desktop, Codex CLI, Antigravity, OpenCode and KiloCode edit video projects in CapCut and OpenCut over stdio. Its README lists 50 tools, from timeline clips and captions to export, and says all of them default to dryRun: true. Created 26 Oct, more than 50 stars on 28 Oct; GitHub detects no licence. Source
  6. +
+

Top 3 moves from multi agent tools

+
    +
  1. Claude Code v2.1.312. Published 27 Oct. Claude no longer overwrites a very large CLAUDE.md, rules file or included file in a subdirectory after seeing only its start; Write now asks it to read the whole file or edit in place. In fullscreen you can click the hint under a queued message to send it now. See Claude Code best practices. Source
  2. +
  3. Codex 0.165.0. Published 27 Oct. It adds a built in Google Cloud Vertex AI provider (model_provider = "gcp"), puts GPT-6.1 Terra in the model catalogs, turns on memory v2 by default for fresh profiles with import of memories from other agents, and lets you change reasoning effort mid conversation on supported models. Source
  4. +
  5. OpenClaw 2026.10.8. Published 27 Oct. A failed post update Doctor check now restarts the Gateway instead of leaving it stopped, an orphaned maintenance worker no longer blocks every CLI command, and updates no longer abort on ACL filesystems or Windows pnpm links. See OpenClaw alternatives. Source
  6. +
+

Top 3 rising repos

+
    +
  1. Soulgent. A Mac app that turns each Claude Code, Codex and WorkBuddy session into a character with a name, a look and a mood, so you can see at a glance who is working, who is done and who is waiting for your decision. MIT, created 27 Oct, more than 30 stars on 28 Oct. Source
  2. +
  3. OpenBot. A desktop workspace for persistent AI teammates that runs Codex and Claude Code, plus Grok CLI, OpenCode, Gemini, Cursor CLI and Cline CLI through ACP, each with its own workspace, queues, file transfer, an embedded browser and agent to agent messages. Its README warns it is a development preview whose agents run with danger-full-access and no per action approval. On GitHub trending on 28 Oct, more than 2,500 stars; GitHub detects no standard licence. Source
  4. +
  5. agent-purge. One system prompt for many coding agents, among them Codex, Claude, OpenCode, Grok, Hermes and Pi, with four modes (replace, strict, append, off) and a local web console. MIT, created 25 Oct, more than 650 stars on 28 Oct. Source
  6. +
+

Stars can rise for reasons other than use: names to watch, not picks.

+

Top 3 things people are arguing about

+
    +
  1. Do agents mean more work, not less? An engineer writes that with several agents running at once, each needing him “sometimes”, he works more than ever, because every answer means switching to another problem. The Hacker News thread had more than 620 points and 610 comments on 28 Oct. Source
  2. +
  3. Does Brooks’s law hold for agents? A post revisits The Mythical Man-Month and argues that sequential tasks stay sequential and the overhead moves to you: someone still defines done, reviews the code and stitches the parts together. More than 440 points on Hacker News on 28 Oct. Source
  4. +
  5. What does a thumbs up send to Anthropic? Anthropic’s privacy article for its commercial products, dated 18 Aug 2026, says it does not train on their inputs and outputs by default, but feedback through the thumbs up or down button stores the entire related conversation for up to 5 years and may be used to train models. Owners of Team and Enterprise plans can turn the button off with the Rate chats setting. More than 210 points on Hacker News on 28 Oct. Source
  6. +
+

How this list is built

+

For this edition, covering 27 to 28 Oct, we read the GitHub releases of 21 tracked tools, vendor blogs and changelogs, GitHub trending, and the Hacker News front page. We did not read X or Reddit for it. 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. New here? Start with the install guide.

+ + + + + + +
+ + +
+ + + + +
+ + +
+ +
+ + + + + + diff --git a/docs/blog/ai-agent-office-github/index.html b/docs/blog/ai-agent-office-github/index.html index 93dea06d8f..6888527e27 100644 --- a/docs/blog/ai-agent-office-github/index.html +++ b/docs/blog/ai-agent-office-github/index.html @@ -358,50 +358,50 @@

FAQ

Related in Comparisons

- +
- + 5 min
-

Codex Alternatives: 7 Picks Beyond OpenAI's Agent (Oct 2026)

-

Seven Codex alternatives checked 26 Oct 2026: Claude Code, Munder Difflin, Copilot CLI, OpenCode, Goose, Cline and Cursor, with licences and prices.

+

ChatGPT Dots vs Claude Cowork: Plans, Price and Safety (Oct 2026)

+

ChatGPT Dots keeps an ongoing job moving; Claude Cowork hands back finished files. Plans, prices, where each runs and how each asks first, checked 28 Oct 2026.

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

Pi Agent Alternatives: 7 Coding Agents to Try (Oct 2026)

-

Seven Pi agent alternatives checked 26 Oct 2026: OpenCode, Munder Difflin, Claude Code, Codex CLI, Hermes Agent, Goose and Crush, with licences and prices.

+

Codex vs ChatGPT: What Is the Difference? (Oct 2026)

+

Codex is OpenAI's coding agent and ChatGPT is its assistant. Which plans include Codex, the limits, where each runs and which to use, checked 28 Oct 2026.

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

Claude Duet Alternatives: 4 AI Agents You Can Use Today, No Waitlist

-

Claude Duet is waitlisted and US only. Four proactive agents you can run today, sorted by where they run: a vendor's cloud or hardware you control.

+

Codex Alternatives: 7 Picks Beyond OpenAI's Agent (Oct 2026)

+

Seven Codex alternatives checked 26 Oct 2026: Claude Code, Munder Difflin, Copilot CLI, OpenCode, Goose, Cline and Cursor, with licences and prices.

Comparisons - Read → + Read →
diff --git a/docs/blog/aider-vs-claude-code/index.html b/docs/blog/aider-vs-claude-code/index.html index a707aa9852..2a90365830 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
-

Codex Alternatives: 7 Picks Beyond OpenAI's Agent (Oct 2026)

-

Seven Codex alternatives checked 26 Oct 2026: Claude Code, Munder Difflin, Copilot CLI, OpenCode, Goose, Cline and Cursor, with licences and prices.

+

ChatGPT Dots vs Claude Cowork: Plans, Price and Safety (Oct 2026)

+

ChatGPT Dots keeps an ongoing job moving; Claude Cowork hands back finished files. Plans, prices, where each runs and how each asks first, checked 28 Oct 2026.

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

Pi Agent Alternatives: 7 Coding Agents to Try (Oct 2026)

-

Seven Pi agent alternatives checked 26 Oct 2026: OpenCode, Munder Difflin, Claude Code, Codex CLI, Hermes Agent, Goose and Crush, with licences and prices.

+

Codex vs ChatGPT: What Is the Difference? (Oct 2026)

+

Codex is OpenAI's coding agent and ChatGPT is its assistant. Which plans include Codex, the limits, where each runs and which to use, checked 28 Oct 2026.

Comparisons - Read → + Read →
diff --git a/docs/blog/assets/media/agent-tools-today-2026-10-28/motion.css b/docs/blog/assets/media/agent-tools-today-2026-10-28/motion.css new file mode 100644 index 0000000000..e388e721d3 --- /dev/null +++ b/docs/blog/assets/media/agent-tools-today-2026-10-28/motion.css @@ -0,0 +1,13 @@ +/* Bright coded scene for "Agent Tools Today, 28 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-28/motion.js b/docs/blog/assets/media/agent-tools-today-2026-10-28/motion.js new file mode 100644 index 0000000000..f02e7abcb5 --- /dev/null +++ b/docs/blog/assets/media/agent-tools-today-2026-10-28/motion.js @@ -0,0 +1,109 @@ +/* Bright coded scene for "Agent Tools Today, 28 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(); } }); + }; + /* each loop opens on the final frame and eases back to the start in R0 seconds, so the loop has no jump */ + const R0 = 0.6; + const pv = (t, a, b, e = oc) => (t < R0 ? 1 - io(t / R0) : e(seg(t, a, b))); + const hint = (svg, s) => txt(svg, 756, 52, s, { "text-anchor": "end", "font-size": 16, fill: MUTE, "font-weight": 500 }); + const hitbox = (g, a) => el("rect", Object.assign({ fill: "#fff", "fill-opacity": 0 }, a), g); + const ring = (g, a) => el("rect", Object.assign({ fill: "none", stroke: INK, "stroke-width": 2.5, "stroke-dasharray": "6 6", class: "mg-ring" }, a), g); + /* a tap toggles one thing between 0 and 1; under reduced motion it jumps */ + const flipper = (api, D = 0.6) => { + let m = null, last = 0; + return { + v(auto, now) { last = m ? m.f + (m.to - m.f) * io(seg(now, m.at, m.at + (calm ? 1e-3 : D))) : auto; return last; }, + flip() { m = { f: last, to: last > 0.5 ? 0 : 1, at: api.now() }; api.nudge(); }, + }; + }; + let uid = 0; + + const SC = {}; + + /* ---- a three drawer cabinet, seen from the side; each drawer opens on a card and its tag ---- */ + SC.today = { + dur: 7.4, still: 7.4, + build(svg, api) { + hint(svg, "tap a drawer"); + const CX = 60, CW = 320, TOP = 84, ROW = 150, EXT = 306, defs = el("defs", {}, svg); + el("path", { d: "M40 562 H760", stroke: SOFT, "stroke-width": 12, "stroke-linecap": "round" }, svg); + el("rect", { x: CX + 24, y: 546, width: 34, height: 14, rx: 4, fill: INK }, svg); + el("rect", { x: CX + CW - 58, y: 546, width: 34, height: 14, rx: 4, fill: INK }, svg); + el("rect", { x: CX, y: TOP - 8, width: CW, height: 3 * ROW + 20, rx: 12, fill: YEL, stroke: INK, "stroke-width": 3 }, svg); + el("rect", { x: CX - 12, y: TOP - 20, width: CW + 24, height: 18, rx: 7, fill: YEL, stroke: INK, "stroke-width": 3 }, svg); + const items = [["OpenCode 2.2.0", "Desktop plugins", LIL], ["Entire", "Trails", MINT], ["Hallmark", "Design skill", SKY]]; + const rows = items.map(([name, tag, col], i) => { + const y0 = TOP + 6 + i * ROW, id = `mgclip${++uid}`; + el("rect", { x: CX + 18, y: y0 + 6, width: CW - 36, height: 126, rx: 9, fill: "none", stroke: INK, "stroke-width": 2 }, svg); + el("rect", { x: CX + CW + 1, y: 0, width: 800, height: y0 + 138 }, el("clipPath", { id }, defs)); + const g = el("g", {}, svg); + hitbox(g, { x: CX, y: y0 - 4, width: CW + EXT + 54, height: 146 }); + ring(g, { x: CX - 8, y: y0 - 8, width: CW + EXT + 64, height: 154, rx: 14 }); + const body = el("g", {}, el("g", { "clip-path": `url(#${id})` }, g)), card = el("g", {}, body); + el("rect", { x: CX + 30, y: y0 + 6, width: 270, height: 120, rx: 10, fill: "#fff", stroke: INK, "stroke-width": 3 }, card); + txt(card, CX + 48, y0 + 42, name, { "font-family": MONO, "font-size": 24, "font-weight": 700 }); + const chip = el("rect", { x: CX + 48, y: y0 + 52, height: 28, rx: 14, fill: col, stroke: INK, "stroke-width": 2 }, card); + const ct = txt(card, 0, y0 + 71.5, tag, { "text-anchor": "middle", "font-size": 16 }); + const w = ct.getComputedTextLength() + 30; chip.setAttribute("width", w); ct.setAttribute("x", CX + 48 + w / 2); + el("rect", { x: CX + 14, y: y0 + 88, width: CW - 16, height: 50, rx: 6, fill: SOFT, stroke: INK, "stroke-width": 3 }, body); + const front = el("g", {}, g); + el("rect", { x: CX + CW - 4, y: y0, width: 20, height: 138, rx: 6, fill: BLUE, stroke: INK, "stroke-width": 3 }, front); + el("rect", { x: CX + CW + 16, y: y0 + 54, width: 14, height: 30, rx: 6, fill: YEL, stroke: INK, "stroke-width": 3 }, front); + const f = flipper(api, 0.8); + button(g, `Drawer: ${name}, ${tag}`, () => f.flip()); + return { body, card, front, f, a: 1.0 + i * 1.7 }; + }); + return (t, now) => rows.forEach((r) => { + const o = r.f.v(pv(t, r.a, r.a + 1.0, ob), now), k = ob(cl((o - 0.5) / 0.5)); + tf(r.body, EXT * o, 0); tf(r.front, EXT * o, 0); tf(r.card, 0, 90 * (1 - cl(k, 0, 1.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(); }, nudge: () => { if (held) frame(); else 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-28/today.png b/docs/blog/assets/media/agent-tools-today-2026-10-28/today.png new file mode 100644 index 0000000000..7ec0fa263c Binary files /dev/null and b/docs/blog/assets/media/agent-tools-today-2026-10-28/today.png differ diff --git a/docs/blog/assets/media/chatgpt-dots-vs-claude-cowork/bookmark.png b/docs/blog/assets/media/chatgpt-dots-vs-claude-cowork/bookmark.png new file mode 100644 index 0000000000..3ce9457d8b Binary files /dev/null and b/docs/blog/assets/media/chatgpt-dots-vs-claude-cowork/bookmark.png differ diff --git a/docs/blog/assets/media/chatgpt-dots-vs-claude-cowork/hero.png b/docs/blog/assets/media/chatgpt-dots-vs-claude-cowork/hero.png new file mode 100644 index 0000000000..35ed7df8a9 Binary files /dev/null and b/docs/blog/assets/media/chatgpt-dots-vs-claude-cowork/hero.png differ diff --git a/docs/blog/assets/media/chatgpt-dots-vs-claude-cowork/keys.png b/docs/blog/assets/media/chatgpt-dots-vs-claude-cowork/keys.png new file mode 100644 index 0000000000..26f65cb7e5 Binary files /dev/null and b/docs/blog/assets/media/chatgpt-dots-vs-claude-cowork/keys.png differ diff --git a/docs/blog/assets/media/chatgpt-dots-vs-claude-cowork/lunchbox.png b/docs/blog/assets/media/chatgpt-dots-vs-claude-cowork/lunchbox.png new file mode 100644 index 0000000000..ca7fc42f76 Binary files /dev/null and b/docs/blog/assets/media/chatgpt-dots-vs-claude-cowork/lunchbox.png differ diff --git a/docs/blog/assets/media/chatgpt-dots-vs-claude-cowork/motion.css b/docs/blog/assets/media/chatgpt-dots-vs-claude-cowork/motion.css new file mode 100644 index 0000000000..cf78c952d2 --- /dev/null +++ b/docs/blog/assets/media/chatgpt-dots-vs-claude-cowork/motion.css @@ -0,0 +1,13 @@ +/* Bright coded scenes for "ChatGPT Dots vs Claude Cowork". 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/chatgpt-dots-vs-claude-cowork/motion.js b/docs/blog/assets/media/chatgpt-dots-vs-claude-cowork/motion.js new file mode 100644 index 0000000000..5234c75962 --- /dev/null +++ b/docs/blog/assets/media/chatgpt-dots-vs-claude-cowork/motion.js @@ -0,0 +1,298 @@ +/* Bright coded scenes for "ChatGPT Dots vs Claude Cowork". 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(); } }); + }; + /* each loop opens on the final frame and eases back to the start in R0 seconds, so the loop has no jump */ + const R0 = 0.6; + const pv = (t, a, b, e = oc) => (t < R0 ? 1 - io(t / R0) : e(seg(t, a, b))); + const hint = (svg, s) => txt(svg, 756, 52, s, { "text-anchor": "end", "font-size": 16, fill: MUTE, "font-weight": 500 }); + const hitbox = (g, a) => el("rect", Object.assign({ fill: "#fff", "fill-opacity": 0 }, a), g); + const ring = (g, a) => el("rect", Object.assign({ fill: "none", stroke: INK, "stroke-width": 2.5, "stroke-dasharray": "6 6", class: "mg-ring" }, a), g); + /* a tap toggles one thing between 0 and 1; under reduced motion it jumps */ + const flipper = (api, D = 0.6) => { + let m = null, last = 0; + return { + v(auto, now) { last = m ? m.f + (m.to - m.f) * io(seg(now, m.at, m.at + (calm ? 1e-3 : D))) : auto; return last; }, + flip() { m = { f: last, to: last > 0.5 ? 0 : 1, at: api.now() }; api.nudge(); }, + }; + }; + let uid = 0; + + const SC = {}; + const CAP = "#6B5878"; + /* shrink a line of text until it fits a width */ + const fit = (n, w) => { const l = n.getComputedTextLength(); if (l > w) n.setAttribute("font-size", (parseFloat(n.getAttribute("font-size")) * w) / l); return n; }; + + /* ---- 1. a book turns its own pages under a ribbon; an index card fills and drops into a finished tray ---- */ + SC.bookmark = { + dur: 7.4, still: 7.4, + build(svg, api) { + hint(svg, "tap the book"); + const SX = 230, PT = 150, PB = 380, PW = 160, F = 0.9, FLIPS = [1.0, 2.5, 4.0]; + const book = el("g", {}, svg); + hitbox(book, { x: SX - PW - 30, y: PT - 34, width: 2 * PW + 60, height: 380 }); + ring(book, { x: SX - PW - 34, y: PT - 38, width: 2 * PW + 68, height: 388, rx: 18 }); + el("rect", { x: SX - PW - 14, y: PT - 10, width: 2 * PW + 28, height: PB - PT + 62, rx: 12, fill: BLUE, stroke: INK, "stroke-width": 3 }, book); + const edges = [-1, 1].map((s) => [7, 6, 5, 4, 3, 2, 1].map((j) => ({ j, n: el("rect", { x: s < 0 ? SX - PW : SX, y: PT + j * 6, width: PW, height: PB - PT, rx: 4, fill: "#fff", stroke: INK, "stroke-width": 2 }, book) }))); + [SX - PW, SX].forEach((x) => el("rect", { x, y: PT, width: PW, height: PB - PT, rx: 4, fill: "#fff", stroke: INK, "stroke-width": 3 }, book)); + el("rect", { x: SX - PW + 24, y: PT + 26, width: 76, height: 12, rx: 6, fill: LIL }, book); + [112, 96, 118, 88, 108, 70].forEach((w, i) => el("rect", { x: SX - PW + 24, y: PT + 62 + i * 26, width: w, height: 6, rx: 3, fill: SKY }, book)); + [104, 118, 92, 114, 100, 116, 64].forEach((w, i) => el("rect", { x: SX + 26, y: PT + 30 + i * 26, width: w, height: 6, rx: 3, fill: SKY }, book)); + el("path", { d: `M${SX} ${PT} V${PB}`, stroke: INK, "stroke-width": 3 }, book); + const turn = el("path", { fill: "#fff", stroke: INK, "stroke-width": 3, "stroke-linejoin": "round" }, book); + const ribI = el("path", { stroke: INK, "stroke-width": 22, fill: "none" }, book), ribO = el("path", { stroke: LIL, "stroke-width": 15, fill: "none" }, book); + const tag = el("g", {}, book), tagR = el("rect", { y: 0, height: 42, rx: 12, fill: "#fff", stroke: INK, "stroke-width": 3 }, tag); + const tagT = txt(tag, 0, 27, "ChatGPT Dots", { "text-anchor": "middle", "font-family": MONO, "font-size": 18, "font-weight": 700 }); + const tw = tagT.getComputedTextLength() + 32; tagR.setAttribute("x", -tw / 2); tagR.setAttribute("width", tw); + const taps = []; + button(book, "Turn a page", () => { taps.push(api.now()); if (taps.length > 12) taps.shift(); api.nudge(); }); + /* the card and the tray */ + el("rect", { x: 488, y: 424, width: 264, height: 30, rx: 8, fill: MINT, stroke: INK, "stroke-width": 3 }, svg); + const card = el("g", {}, svg); + el("rect", { x: 510, y: 150, width: 220, height: 186, rx: 12, fill: YEL, stroke: INK, "stroke-width": 3 }, card); + fit(txt(card, 530, 192, "Claude Cowork", { "font-size": 24, "font-weight": 700 }), 180); + el("path", { d: "M530 208 H710", stroke: INK, "stroke-width": 2.5, "stroke-linecap": "round" }, card); + const LW = [150, 128, 164, 116, 140]; + const lines = LW.map((w, i) => el("rect", { x: 530, y: 228 + i * 20, width: w, height: 8, rx: 4, fill: "#fff", stroke: INK, "stroke-width": 1.5 }, card)); + el("path", { d: "M470 450 H770 L756 522 H484 Z", fill: MINT, stroke: INK, "stroke-width": 3, "stroke-linejoin": "round" }, svg); + txt(svg, 620, 494, "finished", { "text-anchor": "middle", "font-size": 20 }); + return (t, now) => { + /* pages turned so far: three chapters on the timeline, plus taps */ + const auto = t < R0 ? Math.round(3 * (1 - io(t / R0))) : FLIPS.filter((s) => t >= s + F / 2).length; + const D = calm ? 1e-3 : F, man = taps.filter((s) => now >= s + D / 2).length; + const n = Math.round(1.5 * Math.min(4, auto + man)); + edges[0].forEach((e) => e.n.setAttribute("display", e.j <= 1 + n ? "inline" : "none")); + edges[1].forEach((e) => e.n.setAttribute("display", e.j <= 7 - n ? "inline" : "none")); + let k = -1, sw = 0; + const kick = (u) => { if (u >= 0 && u <= 1) { k = u; sw -= 30 * Math.sin(Math.PI * u); } else if (u > 1) { const v = (u - 1) * F; sw += 9 * Math.exp(-3 * v) * Math.sin(9 * v); } }; + if (t >= R0) FLIPS.forEach((s) => kick((t - s) / F)); + if (!calm) taps.forEach((s) => kick((now - s) / F)); + if (k >= 0) { + const xe = SX + PW * Math.cos(Math.PI * k), lift = 22 * Math.sin(Math.PI * k), mx = (SX + xe) / 2; + turn.setAttribute("d", `M${SX} ${PT} Q${mx} ${PT - lift * 1.6} ${xe} ${PT - lift} L${xe} ${PB - lift} Q${mx} ${PB - lift * 0.6} ${SX} ${PB} Z`); + turn.setAttribute("display", "inline"); + } else turn.setAttribute("display", "none"); + const ex = SX + 12 + sw, ey = PB + 82, d = `M${SX + 12} ${PT - 18} C${SX + 12} ${PB - 40} ${SX + 12 + sw * 0.3} ${PB + 30} ${ex} ${ey}`; + ribI.setAttribute("d", d); ribO.setAttribute("d", d); tf(tag, ex, ey - 2, 1, -sw * 0.25); + /* the card: appears, fills line by line, slides into the tray */ + let op = 1, sc = 1, dy = 150; + if (t < R0) { op = 1 - seg(t, 0, 0.35); lines.forEach((l, i) => { l.setAttribute("width", LW[i]); l.setAttribute("display", "inline"); }); } + else { + const a = seg(t, 0.7, 1.1); op = a > 0 ? 1 : 0; sc = 0.6 + 0.4 * ob(a); dy = 150 * io(seg(t, 5.2, 6.0)); + lines.forEach((l, i) => { const w = LW[i] * oc(seg(t, 1.3 + i * 0.7, 1.8 + i * 0.7)); l.setAttribute("width", w); l.setAttribute("display", w > 1 ? "inline" : "none"); }); + } + card.setAttribute("opacity", op); + card.setAttribute("transform", `translate(620 ${243 + dy}) scale(${sc}) translate(-620 -243)`); + }; + }, + }; + + /* ---- 2. two lunchboxes pop open one after the other ---- */ + const sandwich = (g, tag) => { + g = el("g", { transform: "translate(0 -8)" }, g); + el("path", { d: "M-78 0 L0 -92 L78 0 Z", fill: LIL, stroke: INK, "stroke-width": 2.5, "stroke-linejoin": "round", transform: "translate(11 -9)" }, g); + el("path", { d: "M-78 0 L0 -92 L78 0 Z", fill: MINT, stroke: INK, "stroke-width": 2.5, "stroke-linejoin": "round", transform: "translate(5 -4)" }, g); + el("path", { d: "M-70 0 Q-76 0 -72 -6 L-6 -84 Q0 -90 6 -84 L72 -6 Q76 0 70 0 Z", fill: YEL, stroke: INK, "stroke-width": 3, "stroke-linejoin": "round" }, g); + el("path", { d: "M-46 -12 L0 -66 L46 -12 Z", fill: "#fff", stroke: INK, "stroke-width": 2, "stroke-linejoin": "round" }, g); + el("path", { d: "M0 -84 V-112", stroke: INK, "stroke-width": 3, "stroke-linecap": "round" }, g); + const r = el("rect", { x: 0, y: -134, height: 30, rx: 7, fill: "#fff", stroke: INK, "stroke-width": 2.5 }, g); + const n = txt(g, 0, -113, tag, { "font-family": MONO, "font-size": 17, "font-weight": 700 }); + const w = n.getComputedTextLength() + 22; r.setAttribute("width", w); n.setAttribute("x", 11); + return 144; + }; + const snack = (g, tag) => { + const s = el("g", { transform: "rotate(-8 0 -62)" }, g); + el("circle", { cx: 0, cy: -62, r: 58, fill: YEL, stroke: INK, "stroke-width": 3 }, s); + for (let i = 0; i < 10; i++) { const a = (i / 10) * 6.283 + 0.3; el("circle", { cx: Math.cos(a) * 44, cy: -62 + Math.sin(a) * 44, r: 5, fill: BLUE }, s); } + txt(s, 0, -53, tag, { "text-anchor": "middle", "font-family": MONO, "font-size": 26, "font-weight": 700 }); + return 124; + }; + SC.lunchbox = { + dur: 6.4, still: 6.4, + build(svg, api) { + hint(svg, "tap a lunchbox"); + el("path", { d: "M40 534 H760", stroke: SOFT, "stroke-width": 12, "stroke-linecap": "round" }, svg); + const B = [ + { x: 70, w: 260, h: 160, col: SKY, name: "Claude Pro", price: "$20", food: sandwich, tag: "Cowork", at: 1.0, ph: 132 }, + { x: 390, w: 340, h: 220, col: MINT, name: "ChatGPT Pro", price: "from $100", food: snack, tag: "Dots", at: 2.3, ph: 146 }, + ]; + const boxes = B.map((b) => { + const rim = 528 - b.h, cx = b.x + b.w / 2, g = el("g", {}, svg); + hitbox(g, { x: b.x - 10, y: rim - 196, width: b.w + 20, height: b.h + 204 }); + ring(g, { x: b.x - 14, y: rim - 200, width: b.w + 28, height: b.h + 212, rx: 18 }); + const handle = (y) => `M${cx - 40} ${y} V${y - 16} Q${cx - 40} ${y - 32} ${cx - 24} ${y - 32} H${cx + 24} Q${cx + 40} ${y - 32} ${cx + 40} ${y - 16} V${y}`; + const pH = el("path", { stroke: INK, "stroke-width": 10, fill: "none", "stroke-linecap": "round" }, g), pH2 = el("path", { stroke: YEL, "stroke-width": 4, fill: "none", "stroke-linecap": "round" }, g); + const panel = el("rect", { x: b.x + 10, width: b.w - 20, rx: 14, fill: b.col, stroke: INK, "stroke-width": 3 }, g); + el("rect", { x: b.x + 14, y: rim - 9, width: b.w - 28, height: 18, rx: 9, fill: SOFT, stroke: INK, "stroke-width": 2.5 }, g); + const food = el("g", {}, g), fh = b.food(el("g", {}, food), b.tag); + el("rect", { x: b.x, y: rim, width: b.w, height: b.h, rx: 20, fill: b.col, stroke: INK, "stroke-width": 3 }, g); + const sr = el("rect", { y: rim + b.h / 2 - 42, height: 84, rx: 12, fill: "#fff", stroke: INK, "stroke-width": 2.5 }, g); + const t1 = txt(g, cx, rim + b.h / 2 - 8, b.name, { "text-anchor": "middle", "font-size": 22, "font-weight": 700 }); + const t2 = txt(g, cx, rim + b.h / 2 + 26, b.price, { "text-anchor": "middle", "font-family": MONO, "font-size": 22, "font-weight": 700 }); + const sw = Math.max(t1.getComputedTextLength(), t2.getComputedTextLength()) + 44; sr.setAttribute("x", cx - sw / 2); sr.setAttribute("width", sw); + const cap = el("g", {}, g); + el("path", { d: handle(rim - 28), stroke: INK, "stroke-width": 10, fill: "none", "stroke-linecap": "round" }, cap); + el("path", { d: handle(rim - 28), stroke: YEL, "stroke-width": 4, fill: "none", "stroke-linecap": "round" }, cap); + el("rect", { x: b.x - 6, y: rim - 30, width: b.w + 12, height: 40, rx: 14, fill: b.col, stroke: INK, "stroke-width": 3 }, cap); + const f = flipper(api, 0.9); + button(g, `Lunchbox: ${b.name}, ${b.price}`, () => f.flip()); + return { b, rim, cx, pH, pH2, panel, food, cap, f, sink: fh - 4, handle }; + }); + return (t, now) => boxes.forEach((x) => { + const o = x.f.v(pv(t, x.b.at, x.b.at + 1.0), now); + const ck = cl(o / 0.45), pk = cl((o - 0.4) / 0.6), fk = ob(cl((o - 0.45) / 0.55)); + x.cap.setAttribute("display", o < 0.45 ? "inline" : "none"); + x.cap.setAttribute("transform", `translate(0 ${x.rim - 40 * ck}) scale(1 ${1 - 0.7 * ck}) translate(0 ${-x.rim})`); + const show = pk > 0.01 ? "inline" : "none", top = x.rim - 6 - x.b.ph * pk; + [x.panel, x.pH, x.pH2].forEach((n) => n.setAttribute("display", show)); + x.panel.setAttribute("y", top); x.panel.setAttribute("height", x.b.ph * pk + 6); + x.pH.setAttribute("d", x.handle(top + 2)); x.pH2.setAttribute("d", x.handle(top + 2)); + tf(x.food, x.cx, x.rim + 12 + x.sink * (1 - fk)); + }); + }, + }; + + /* ---- 3. a key rack: the second key swings on once the tag flips ---- */ + SC.keys = { + dur: 7.2, still: 7.2, + build(svg, api) { + hint(svg, "tap the Allow access tag"); + el("rect", { x: 70, y: 100, width: 700, height: 60, rx: 14, fill: YEL, stroke: INK, "stroke-width": 3 }, svg); + el("path", { d: "M130 120 H300 M350 142 H520 M560 120 H700", stroke: INK, "stroke-width": 2, "stroke-linecap": "round" }, svg); + [100, 740].forEach((x) => { el("circle", { cx: x, cy: 130, r: 9, fill: SOFT, stroke: INK, "stroke-width": 2.5 }, svg); el("path", { d: `M${x - 5} 130 H${x + 5}`, stroke: INK, "stroke-width": 2.5 }, svg); }); + const key = (g, col, label) => { + el("path", { d: "M8 26 L40 48", stroke: INK, "stroke-width": 3 }, g); + const fob = el("rect", { x: 34, y: 40, height: 46, rx: 12, fill: "#fff", stroke: INK, "stroke-width": 3 }, g); + const ft = txt(g, 0, 70, label, { "text-anchor": "middle", "font-size": 19 }); + const w = ft.getComputedTextLength() + 32; fob.setAttribute("width", w); ft.setAttribute("x", 34 + w / 2); + el("circle", { cx: 0, cy: 16, r: 15, fill: "none", stroke: INK, "stroke-width": 5 }, g); + el("rect", { x: -8, y: 76, width: 16, height: 120, rx: 4, fill: col, stroke: INK, "stroke-width": 3 }, g); + el("path", { d: "M8 150 H22 V162 H8 Z M8 172 H26 V186 H8 Z", fill: col, stroke: INK, "stroke-width": 3, "stroke-linejoin": "round" }, g); + el("circle", { cx: 0, cy: 58, r: 26, fill: col, stroke: INK, "stroke-width": 3 }, g); + el("circle", { cx: 0, cy: 52, r: 7, fill: "#fff", stroke: INK, "stroke-width": 2.5 }, g); + }; + const k1 = el("g", {}, svg); key(k1, SKY, "Cloud computer"); tf(k1, 140, 196); + const k2 = el("g", {}, svg); key(k2, LIL, "Your computer"); + [130, 370].forEach((hx) => el("path", { d: `M${hx} 158 V186 Q${hx} 200 ${hx + 12} 200 Q${hx + 24} 200 ${hx + 24} 188`, stroke: INK, "stroke-width": 6, fill: "none", "stroke-linecap": "round" }, svg)); + /* the tag hangs on a string; front reads Allow access, back is a mint tick */ + el("path", { d: "M690 158 V212", stroke: INK, "stroke-width": 2.5 }, svg); + const tg = el("g", {}, svg); + const fr = el("g", {}, tg), bk = el("g", {}, tg); + const face = (g, fill, ticked) => { + const r = el("rect", { y: 0, height: 56, rx: 12, fill, stroke: INK, "stroke-width": 3 }, g); + const tt = txt(g, 0, 39, "Allow access", { "font-size": 18 }), w = tt.getComputedTextLength() + 74; + r.setAttribute("x", -w / 2); r.setAttribute("width", w); tt.setAttribute("x", -w / 2 + 52); + el("circle", { cx: 0, cy: 9, r: 4, fill: "#fff", stroke: INK, "stroke-width": 2 }, g); + el("rect", { x: -w / 2 + 16, y: 18, width: 24, height: 24, rx: 6, fill: "#fff", stroke: INK, "stroke-width": 2.5 }, g); + if (ticked) { + const d = `M${-w / 2 + 21} 30 L${-w / 2 + 27} 36 L${-w / 2 + 37} 23`; + el("path", { d, stroke: INK, "stroke-width": 8, fill: "none", "stroke-linecap": "round", "stroke-linejoin": "round" }, g); + el("path", { d, stroke: MINT, "stroke-width": 4, fill: "none", "stroke-linecap": "round", "stroke-linejoin": "round" }, g); + } + return w; + }; + const TW = face(fr, LIL, false); face(bk, "#fff", true); + const hit = el("g", {}, svg); + hitbox(hit, { x: 690 - TW / 2 - 8, y: 196, width: TW + 16, height: 80 }); + ring(hit, { x: 690 - TW / 2 - 10, y: 194, width: TW + 20, height: 84, rx: 16 }); + /* the card that sways below */ + el("circle", { cx: 260, cy: 436, r: 6, fill: SOFT, stroke: INK, "stroke-width": 2.5 }, svg); + const dc = el("g", {}, svg); + el("path", { d: "M0 0 L-50 34 M0 0 L50 34", stroke: INK, "stroke-width": 2.5, fill: "none" }, dc); + el("rect", { x: -78, y: 34, width: 156, height: 86, rx: 12, fill: SKY, stroke: INK, "stroke-width": 3 }, dc); + txt(dc, 0, 70, "Delete?", { "text-anchor": "middle", "font-size": 24, "font-weight": 700 }); + txt(dc, 0, 101, "Ask first", { "text-anchor": "middle", "font-size": 20, "font-weight": 500 }); + el("circle", { cx: 0, cy: 0, r: 6, fill: SOFT, stroke: INK, "stroke-width": 2.5 }, dc); + let m = null, lastF = 0, lastK = 0; + const D = (x) => (calm ? 1e-3 : x); + button(hit, "Allow access tag", () => { m = { to: lastF > 0.5 ? 0 : 1, at: api.now(), f0: lastF, k0: lastK }; api.nudge(); }); + return (t, now) => { + let F, K, s; + if (m) { + const u = now - m.at; F = m.f0 + (m.to - m.f0) * io(seg(u, 0, D(0.7))); + if (m.to) { const a = D(0.8), b = D(1.7); K = m.k0 > 0.99 ? 1 : m.k0 + (1 - m.k0) * io(seg(u, a, b)); s = m.k0 > 0.99 ? 99 : u - b; } + else { K = m.k0 * (1 - io(seg(u, 0, D(0.6)))); s = 99; } + } else { F = pv(t, 1.4, 2.1, io); K = pv(t, 2.4, 3.3, io); s = t < R0 ? 99 : t - 3.3; } + lastF = F; lastK = K; + const c = Math.cos(Math.PI * F); + fr.setAttribute("display", c >= 0 ? "inline" : "none"); bk.setAttribute("display", c >= 0 ? "none" : "inline"); + tg.setAttribute("transform", `translate(690 210) scale(${Math.max(0.001, Math.abs(c))} 1)`); + const sway = s > 0 && !calm ? 16 * Math.exp(-2.4 * s) * Math.sin(6 * s) : 0; + k2.setAttribute("display", K > 0.002 ? "inline" : "none"); + tf(k2, 380 + 380 * (1 - K), 196 + 70 * (1 - K) - 90 * Math.sin(Math.PI * K), 1, -35 * (1 - K) + sway); + tf(dc, 260, 436, 1, calm ? 0 : 4 * Math.sin((2 * Math.PI * t) / 2.4)); + }; + }, + }; + + /* ---- title card, 16 by 9 ---- */ + SC.hero = { + w: 960, h: 540, dur: 1, still: 0, + build(svg) { + const pr = el("rect", { x: 64, y: 64, height: 40, rx: 20, fill: SOFT, stroke: INK, "stroke-width": 2 }, svg); + const pt = txt(svg, 84, 91, "Comparisons", { "font-size": 18, "font-weight": 700 }); + pr.setAttribute("width", pt.getComputedTextLength() + 40); + fit(txt(svg, 64, 196, "ChatGPT Dots vs", { "font-size": 62, "font-weight": 700 }), 520); + fit(txt(svg, 64, 270, "Claude Cowork", { "font-size": 62, "font-weight": 700 }), 520); + el("path", { d: "M66 296 H400", stroke: YEL, "stroke-width": 12, "stroke-linecap": "round" }, svg); + txt(svg, 64, 352, "Ongoing jobs or finished files?", { "font-size": 26, "font-weight": 500, fill: MUTE }); + txt(svg, 64, 470, "Checked 28 Oct 2026", { "font-size": 18, "font-weight": 500, fill: CAP }); + el("path", { d: "M628 120 H688 V410 L658 382 L628 410 Z", fill: LIL, stroke: INK, "stroke-width": 3, "stroke-linejoin": "round" }, svg); + el("path", { d: "M640 132 V376 M676 132 V376", stroke: INK, "stroke-width": 1.5, "stroke-dasharray": "5 7" }, svg); + el("circle", { cx: 742, cy: 266, r: 28, fill: "#fff", stroke: INK, "stroke-width": 3 }, svg); + txt(svg, 742, 274, "vs", { "text-anchor": "middle", "font-size": 22, "font-weight": 700 }); + const c = el("g", { transform: "rotate(-4 860 266)" }, svg); + el("rect", { x: 790, y: 212, width: 144, height: 108, rx: 10, fill: YEL, stroke: INK, "stroke-width": 3 }, c); + el("path", { d: "M806 240 H918", stroke: BLUE, "stroke-width": 3, "stroke-linecap": "round" }, c); + el("path", { d: "M806 262 H906 M806 282 H916 M806 302 H884", stroke: INK, "stroke-width": 2, "stroke-linecap": "round" }, c); + 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(); }, nudge: () => { if (held) frame(); else 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/codex-vs-chatgpt/hero.png b/docs/blog/assets/media/codex-vs-chatgpt/hero.png new file mode 100644 index 0000000000..48c1c7ebb7 Binary files /dev/null and b/docs/blog/assets/media/codex-vs-chatgpt/hero.png differ diff --git a/docs/blog/assets/media/codex-vs-chatgpt/ladder.png b/docs/blog/assets/media/codex-vs-chatgpt/ladder.png new file mode 100644 index 0000000000..822a04490b Binary files /dev/null and b/docs/blog/assets/media/codex-vs-chatgpt/ladder.png differ diff --git a/docs/blog/assets/media/codex-vs-chatgpt/motion.css b/docs/blog/assets/media/codex-vs-chatgpt/motion.css new file mode 100644 index 0000000000..c5d40b40b4 --- /dev/null +++ b/docs/blog/assets/media/codex-vs-chatgpt/motion.css @@ -0,0 +1,13 @@ +/* Bright coded scenes for "Codex vs ChatGPT". 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/codex-vs-chatgpt/motion.js b/docs/blog/assets/media/codex-vs-chatgpt/motion.js new file mode 100644 index 0000000000..f33f1661c5 --- /dev/null +++ b/docs/blog/assets/media/codex-vs-chatgpt/motion.js @@ -0,0 +1,260 @@ +/* Bright coded scenes for "Codex vs ChatGPT". 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(); } }); + }; + /* each loop opens on the final frame and eases back to the start in R0 seconds, so the loop has no jump */ + const R0 = 0.6; + const pv = (t, a, b, e = oc) => (t < R0 ? 1 - io(t / R0) : e(seg(t, a, b))); + const hint = (svg, s) => txt(svg, 756, 52, s, { "text-anchor": "end", "font-size": 16, fill: MUTE, "font-weight": 500 }); + const hitbox = (g, a) => el("rect", Object.assign({ fill: "#fff", "fill-opacity": 0 }, a), g); + const ring = (g, a) => el("rect", Object.assign({ fill: "none", stroke: INK, "stroke-width": 2.5, "stroke-dasharray": "6 6", class: "mg-ring" }, a), g); + /* a tap toggles one thing between 0 and 1; under reduced motion it jumps */ + const flipper = (api, D = 0.6) => { + let m = null, last = 0; + return { + v(auto, now) { last = m ? m.f + (m.to - m.f) * io(seg(now, m.at, m.at + (calm ? 1e-3 : D))) : auto; return last; }, + flip() { m = { f: last, to: last > 0.5 ? 0 : 1, at: api.now() }; api.nudge(); }, + }; + }; + let uid = 0; + + const SC = {}; + const CAP = "#6B5878"; + /* shrink a line of text until it fits a width */ + const fit = (n, w) => { const l = n.getComputedTextLength(); if (l > w) n.setAttribute("font-size", (parseFloat(n.getAttribute("font-size")) * w) / l); return n; }; + + /* a toolbox tray, 290 by 70, drawn from its top left; what it holds sits in `held`, clipped at the tray floor */ + const tray = (p, col, label, kind, card = true) => { + const g = el("g", {}, p), id = `mgclip${++uid}`; + el("rect", { x: -80, y: -240, width: 450, height: 310 }, el("clipPath", { id }, el("defs", {}, g))); + el("rect", { x: 8, y: -10, width: 274, height: 18, rx: 7, fill: col, stroke: INK, "stroke-width": 2.5 }, g); + const held = el("g", {}, el("g", { "clip-path": `url(#${id})` }, g)); + if (kind === "chat") { + const pad = el("g", { transform: "translate(46 -80) rotate(-6)" }, held); + el("rect", { x: 0, y: 0, width: 86, height: 104, rx: 6, fill: "#fff", stroke: INK, "stroke-width": 3 }, pad); + [0, 1, 2, 3].forEach((i) => el("rect", { x: 14, y: 26 + i * 15, width: [58, 50, 60, 40][i], height: 5, rx: 2.5, fill: SKY }, pad)); + [14, 30, 46, 62, 78].forEach((x) => el("circle", { cx: x, cy: 2, r: 4.5, fill: SOFT, stroke: INK, "stroke-width": 2 }, pad)); + const pen = el("g", { transform: "translate(196 -92) rotate(18)" }, held); + el("rect", { x: -9, y: -16, width: 18, height: 18, rx: 4, fill: LIL, stroke: INK, "stroke-width": 3 }, pen); + el("rect", { x: -9, y: 0, width: 18, height: 100, fill: YEL, stroke: INK, "stroke-width": 3 }, pen); + el("path", { d: "M-9 100 L0 124 L9 100 Z", fill: SOFT, stroke: INK, "stroke-width": 3, "stroke-linejoin": "round" }, pen); + el("path", { d: "M-3.5 115 L0 124 L3.5 115 Z", fill: INK }, pen); + } else { + const w = el("g", { transform: card ? "translate(72 -50) rotate(-30)" : "translate(140 -50) rotate(-60)" }, held); + el("rect", { x: -9, y: 0, width: 18, height: 112, rx: 9, fill: LIL, stroke: INK, "stroke-width": 3 }, w); + el("circle", { cx: 0, cy: -10, r: 24, fill: LIL, stroke: INK, "stroke-width": 3 }, w); + el("rect", { x: -8, y: -38, width: 16, height: 26, rx: 3, fill: "#fff", stroke: INK, "stroke-width": 2.5 }, w); + el("rect", { x: -12, y: -40, width: 24, height: 6, fill: "#fff" }, w); + if (card) { + const c = el("g", { transform: "translate(148 -62)" }, held); + el("rect", { x: 0, y: 0, width: 120, height: 80, rx: 8, fill: "#fff", stroke: INK, "stroke-width": 3 }, c); + txt(c, 60, 32, "terminal", { "text-anchor": "middle", "font-family": MONO, "font-size": 18, "font-weight": 700 }); + } + } + el("rect", { x: 0, y: 0, width: 290, height: 70, rx: 12, fill: col, stroke: INK, "stroke-width": 3 }, g); + txt(g, 145, 45, label, { "text-anchor": "middle", "font-size": 26, "font-weight": 700 }); + return { g, held }; + }; + + /* ---- 1. a cantilever toolbox: the ChatGPT tray slides out, the Codex tray rises ---- */ + SC.toolbox = { + dur: 6.2, still: 6.2, + build(svg, api) { + hint(svg, "tap the toolbox"); + el("path", { d: "M60 534 H740", stroke: SOFT, "stroke-width": 12, "stroke-linecap": "round" }, svg); + const box = el("g", {}, svg); + hitbox(box, { x: 80, y: 60, width: 600, height: 470 }); + ring(box, { x: 76, y: 56, width: 608, height: 478, rx: 20 }); + const arm = () => [el("path", { stroke: INK, "stroke-width": 9, "stroke-linecap": "round" }, box), el("path", { stroke: BLUE, "stroke-width": 3, "stroke-linecap": "round" }, box)]; + const setArm = (a, x1, y1, x2, y2) => a.forEach((n) => n.setAttribute("d", `M${x1} ${y1} L${x2} ${y2}`)); + const cA = [arm(), arm()], gA = [arm(), arm()], codex = tray(box, YEL, "Codex", "codex"); + el("rect", { x: 250, y: 400, width: 310, height: 124, rx: 14, fill: BLUE, stroke: INK, "stroke-width": 3 }, box); + [292, 486].forEach((x) => el("rect", { x, y: 404, width: 32, height: 22, rx: 5, fill: YEL, stroke: INK, "stroke-width": 2.5 }, box)); + const chat = tray(box, SKY, "ChatGPT", "chat"); + const f = flipper(api, 1.4); + button(box, "Toolbox: open or close the trays", () => f.flip()); + return (t, now) => { + const o = f.v(pv(t, 1.0, 3.0, (x) => x), now); + const k1 = io(cl(o / 0.6)), k2 = io(cl((o - 0.4) / 0.6)); + const x1 = 260 - 160 * k1, y1 = 330 - 150 * k1 - 40 * Math.sin(Math.PI * k1); + const x2 = 260 + 100 * k2, y2 = 412 - 102 * k2 - 20 * Math.sin(Math.PI * k2); + tf(chat.g, x1, y1); tf(codex.g, x2, y2); + tf(chat.held, 0, 112 * (1 - ob(cl((k1 - 0.45) / 0.55)))); + tf(codex.held, 0, 112 * (1 - ob(cl((k2 - 0.45) / 0.55)))); + setArm(gA[0], 280, 420, x1 + 30, y1 + 60); setArm(gA[1], 400, 420, x1 + 150, y1 + 60); + setArm(cA[0], 430, 470, x2 + 70, y2 + 60); setArm(cA[1], 540, 470, x2 + 180, y2 + 60); + }; + }, + }; + + /* ---- 2. a ladder of plans; the CLI card climbs and settles on Plus ---- */ + SC.ladder = { + dur: 6.4, still: 6.4, + build(svg, api) { + hint(svg, "tap the ladder"); + el("rect", { x: 568, y: -10, width: 250, height: 570, fill: SOFT }, svg); + el("path", { d: "M568 0 V560", stroke: INK, "stroke-width": 3 }, svg); + el("path", { d: "M30 560 H800", stroke: INK, "stroke-width": 3, "stroke-linecap": "round" }, svg); + const LX = (y) => 430 - 0.44 * (y - 70), RW = 130, YS = [480, 380, 280, 180]; + const lad = el("g", {}, svg); + hitbox(lad, { x: 60, y: 56, width: 512, height: 508 }); + ring(lad, { x: 56, y: 52, width: 520, height: 516, rx: 20 }); + YS.forEach((y) => { const d = `M${LX(y)} ${y} H${LX(y) + RW}`; el("path", { d, stroke: INK, "stroke-width": 14 }, lad); el("path", { d, stroke: YEL, "stroke-width": 8 }, lad); }); + [0, RW].forEach((dx) => { const d = `M${LX(560) + dx} 560 L${LX(70) + dx} 70`; el("path", { d, stroke: INK, "stroke-width": 18, "stroke-linecap": "round" }, lad); el("path", { d, stroke: YEL, "stroke-width": 12, "stroke-linecap": "round" }, lad); }); + const chips = ["Free $0", "Go $8", "Plus $20", "Pro from $100"].map((s, i) => { + const y = YS[i], r = el("rect", { y: y - 19, height: 38, rx: 19, fill: "#fff", stroke: INK, "stroke-width": 2.5 }, lad); + const n = txt(lad, 0, y + 7, s, { "text-anchor": "middle", "font-size": 19 }), w = n.getComputedTextLength() + 34, right = LX(y) - 22; + r.setAttribute("x", right - w); r.setAttribute("width", w); n.setAttribute("x", right - w / 2); + return r; + }); + button(lad, "Ladder: replay the climb", () => api.seek(R0)); + const card = el("g", {}, svg); + el("rect", { x: -38, y: -46, width: 76, height: 46, rx: 9, fill: MINT, stroke: INK, "stroke-width": 3 }, card); + txt(card, 0, -15, "CLI", { "text-anchor": "middle", "font-family": MONO, "font-size": 22, "font-weight": 700 }); + const spot = [[LX(560) + RW / 2, 558], ...YS.slice(0, 3).map((y) => [LX(y) + RW / 2 + 12, y - 7])], HOPS = [1.0, 2.0, 3.0], H = 0.62; + return (t) => { + let x, y, s = 1, r = 0, op = 1; + if (t < R0) { const top = t < 0.3; [x, y] = spot[top ? 3 : 0]; op = top ? 1 - seg(t, 0, 0.3) : seg(t, 0.3, 0.6); } + else { + let j = 0; HOPS.forEach((h) => { if (t >= h + H) j++; }); + [x, y] = spot[j]; + const h = HOPS[j]; + if (j < 3 && t >= h) { + const u = seg(t, h, h + H), [ax, ay] = spot[j], [bx, by] = spot[j + 1], e = io(u); + x = ax + (bx - ax) * e; y = ay + (by - ay) * e - 60 * Math.sin(Math.PI * u); r = 10 * Math.sin(2 * Math.PI * u); + } else if (j > 0) { const v = t - (HOPS[j - 1] + H); s = 1 + 0.12 * Math.exp(-6 * v) * Math.sin(14 * v); } + } + card.setAttribute("transform", `translate(${x} ${y}) rotate(${r}) scale(${2 - s} ${s})`); + card.setAttribute("opacity", op); + const on = t < 0.3 || t >= HOPS[2] + H; + chips.forEach((c, i) => c.setAttribute("fill", i === 2 && on ? YEL : "#fff")); + }; + }, + }; + + /* ---- 3. a tram map: Codex runs four stops, ChatGPT three, both share Desktop app ---- */ + SC.tram = { + dur: 8, still: 8, + build(svg, api) { + hint(svg, "tap a tram line"); + const along = (P, d) => { for (let i = 1; i < P.length; i++) { const [ax, ay] = P[i - 1], [bx, by] = P[i], L = Math.hypot(bx - ax, by - ay); if (d <= L || i === P.length - 1) { const u = cl(d / L); return [ax + (bx - ax) * u, ay + (by - ay) * u]; } d -= L; } }; + const cum = (P) => P.map((p, i) => P.slice(1, i + 1).reduce((s, q, j) => s + Math.hypot(q[0] - P[j][0], q[1] - P[j][1]), 0)); + const LINES = [ + { name: "Codex", col: YEL, P: [[100, 170], [280, 170], [430, 320], [690, 320]], stops: [0, 1, 2, 3], dr: [0.6, 1.8], show: 2.2, moves: [[2.8, 3.4, 0, 1], [3.8, 4.6, 1, 2], [5.0, 5.8, 2, 3]] }, + { name: "ChatGPT", col: SKY, P: [[180, 470], [280, 470], [430, 320], [580, 170]], stops: [0, 2, 3], dr: [1.1, 2.2], show: 2.3, moves: [[2.6, 3.2, 0, 2], [3.5, 4.1, 2, 3]] }, + ]; + let sel = -1; + LINES.forEach((l, i) => { + l.C = cum(l.P); l.L = l.C[l.C.length - 1]; + const d = "M" + l.P.map((p) => p.join(" ")).join(" L"), g = el("g", {}, svg), lj = { fill: "none", "stroke-linejoin": "round", "stroke-linecap": "round", d }; + el("path", Object.assign({ stroke: "#fff", "stroke-opacity": 0, "stroke-width": 44 }, lj), g); + el("path", Object.assign({ stroke: INK, "stroke-width": 42, class: "mg-ring" }, lj), g); + el("path", Object.assign({ stroke: "#fff", "stroke-width": 37, class: "mg-ring" }, lj), g); + l.halo = el("path", Object.assign({ stroke: LIL, "stroke-width": 32 }, lj), g); + l.ink = el("path", Object.assign({ stroke: INK, "stroke-width": 18, "stroke-dasharray": `${l.L + 2} ${l.L + 2}` }, lj), g); + l.fill = el("path", Object.assign({ stroke: l.col, "stroke-width": 11, "stroke-dasharray": `${l.L + 2} ${l.L + 2}` }, lj), g); + button(g, `${l.name} line`, () => { sel = sel === i ? -1 : i; api.nudge(); }); + }); + /* stops and their names, above both lines */ + const NAMES = [["Terminal", 100, 126, "middle"], ["Editor", 280, 126, "middle"], ["Desktop app", 452, 374, "start"], ["Cloud", 690, 364, "middle"], ["Web", 180, 514, "middle"], ["Mobile", 580, 126, "middle"]]; + const STOPS = [[0, 0, 0], [0, 1, 1], [-1, 2, 2], [0, 3, 3], [1, 0, 4], [1, 3, 5]].map(([li, v, ni]) => { + const [x, y] = li < 0 ? [430, 320] : LINES[li].P[v], g = el("g", {}, svg); + el("circle", { cx: 0, cy: 0, r: li < 0 ? 16 : 10, fill: "#fff", stroke: INK, "stroke-width": li < 0 ? 4 : 3 }, g); + const [s, lx, ly, an] = NAMES[ni], n = txt(svg, lx, ly, s, { "text-anchor": an, "font-size": 20 }); + const at = li < 0 ? Math.min(...LINES.map((l) => l.dr[0] + (l.C[2] / l.L) * (l.dr[1] - l.dr[0]))) : LINES[li].dr[0] + (LINES[li].C[v] / LINES[li].L) * (LINES[li].dr[1] - LINES[li].dr[0]); + return { g, n, x, y, at }; + }); + const trams = LINES.map((l) => { + const g = el("g", {}, svg); + el("path", { d: "M-14 -20 L0 -32 L14 -20", stroke: INK, "stroke-width": 2.5, fill: "none", "stroke-linejoin": "round" }, g); + el("rect", { x: -54, y: -20, width: 108, height: 40, rx: 12, fill: l.col, stroke: INK, "stroke-width": 3 }, g); + txt(g, 0, 6, l.name, { "text-anchor": "middle", "font-family": MONO, "font-size": 17, "font-weight": 700 }); + return g; + }); + return (t) => { + LINES.forEach((l, i) => { + const k = t < R0 ? 1 - io(t / R0) : io(seg(t, l.dr[0], l.dr[1])); + [l.ink, l.fill].forEach((n) => n.setAttribute("stroke-dashoffset", (l.L + 2) * (1 - k))); + l.halo.setAttribute("display", sel === i ? "inline" : "none"); + let d = l.C[l.moves[l.moves.length - 1][3]]; + if (t >= R0) { d = 0; l.moves.forEach(([a, b, p, q]) => { if (t >= a) d = l.C[p] + (l.C[q] - l.C[p]) * io(seg(t, a, b)); }); } + const [x, y] = along(l.P, d), pop = t < R0 ? 1 : ob(seg(t, l.show, l.show + 0.4)); + trams[i].setAttribute("transform", `translate(${x} ${y}) scale(${Math.max(0.001, pop)})`); + trams[i].setAttribute("opacity", t < R0 ? 1 - seg(t, 0, 0.3) : t >= l.show ? 1 : 0); + }); + STOPS.forEach((s) => { + const k = t < R0 ? 1 - seg(t, 0, R0) : ob(seg(t, s.at, s.at + 0.35)); + s.g.setAttribute("transform", `translate(${s.x} ${s.y}) scale(${Math.max(0.001, k)})`); + s.n.setAttribute("opacity", cl(k)); + }); + }; + }, + }; + + /* ---- title card, 16 by 9 ---- */ + SC.hero = { + w: 960, h: 540, dur: 1, still: 0, + build(svg) { + const pr = el("rect", { x: 64, y: 64, height: 40, rx: 20, fill: SOFT, stroke: INK, "stroke-width": 2 }, svg); + const pt = txt(svg, 84, 91, "Comparisons", { "font-size": 18, "font-weight": 700 }); + pr.setAttribute("width", pt.getComputedTextLength() + 40); + fit(txt(svg, 64, 200, "Codex vs", { "font-size": 76, "font-weight": 700 }), 440); + fit(txt(svg, 64, 284, "ChatGPT", { "font-size": 76, "font-weight": 700 }), 440); + el("path", { d: "M66 310 H380", stroke: YEL, "stroke-width": 12, "stroke-linecap": "round" }, svg); + txt(svg, 64, 366, "Coding agent or assistant?", { "font-size": 26, "font-weight": 500, fill: MUTE }); + txt(svg, 64, 470, "Checked 28 Oct 2026", { "font-size": 18, "font-weight": 500, fill: CAP }); + const top = tray(svg, SKY, "ChatGPT", "chat"), bot = tray(svg, YEL, "Codex", "codex", false); + tf(top.g, 548, 186); tf(bot.g, 572, 372); + el("circle", { cx: 904, cy: 320, r: 26, fill: "#fff", stroke: INK, "stroke-width": 3 }, svg); + txt(svg, 904, 328, "vs", { "text-anchor": "middle", "font-size": 22, "font-weight": 700 }); + 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(); }, nudge: () => { if (held) frame(); else 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/codex-vs-chatgpt/toolbox.png b/docs/blog/assets/media/codex-vs-chatgpt/toolbox.png new file mode 100644 index 0000000000..8caf422cac Binary files /dev/null and b/docs/blog/assets/media/codex-vs-chatgpt/toolbox.png differ diff --git a/docs/blog/assets/media/codex-vs-chatgpt/tram.png b/docs/blog/assets/media/codex-vs-chatgpt/tram.png new file mode 100644 index 0000000000..33614ce84c Binary files /dev/null and b/docs/blog/assets/media/codex-vs-chatgpt/tram.png differ diff --git a/docs/blog/best-ai-coding-agents/index.html b/docs/blog/best-ai-coding-agents/index.html index a994005922..e00acb9557 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
-

Codex Alternatives: 7 Picks Beyond OpenAI's Agent (Oct 2026)

-

Seven Codex alternatives checked 26 Oct 2026: Claude Code, Munder Difflin, Copilot CLI, OpenCode, Goose, Cline and Cursor, with licences and prices.

+

ChatGPT Dots vs Claude Cowork: Plans, Price and Safety (Oct 2026)

+

ChatGPT Dots keeps an ongoing job moving; Claude Cowork hands back finished files. Plans, prices, where each runs and how each asks first, checked 28 Oct 2026.

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

Pi Agent Alternatives: 7 Coding Agents to Try (Oct 2026)

-

Seven Pi agent alternatives checked 26 Oct 2026: OpenCode, Munder Difflin, Claude Code, Codex CLI, Hermes Agent, Goose and Crush, with licences and prices.

+

Codex vs ChatGPT: What Is the Difference? (Oct 2026)

+

Codex is OpenAI's coding agent and ChatGPT is its assistant. Which plans include Codex, the limits, where each runs and which to use, checked 28 Oct 2026.

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 6239ad3e22..96c16959d1 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
-

Codex Alternatives: 7 Picks Beyond OpenAI's Agent (Oct 2026)

-

Seven Codex alternatives checked 26 Oct 2026: Claude Code, Munder Difflin, Copilot CLI, OpenCode, Goose, Cline and Cursor, with licences and prices.

+

ChatGPT Dots vs Claude Cowork: Plans, Price and Safety (Oct 2026)

+

ChatGPT Dots keeps an ongoing job moving; Claude Cowork hands back finished files. Plans, prices, where each runs and how each asks first, checked 28 Oct 2026.

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

Pi Agent Alternatives: 7 Coding Agents to Try (Oct 2026)

-

Seven Pi agent alternatives checked 26 Oct 2026: OpenCode, Munder Difflin, Claude Code, Codex CLI, Hermes Agent, Goose and Crush, with licences and prices.

+

Codex vs ChatGPT: What Is the Difference? (Oct 2026)

+

Codex is OpenAI's coding agent and ChatGPT is its assistant. Which plans include Codex, the limits, where each runs and which to use, checked 28 Oct 2026.

Comparisons - Read → + Read →
diff --git a/docs/blog/black-october-php2shell/index.html b/docs/blog/black-october-php2shell/index.html index 1b00fded4d..c955571dce 100644 --- a/docs/blog/black-october-php2shell/index.html +++ b/docs/blog/black-october-php2shell/index.html @@ -326,50 +326,50 @@

FAQ

Related in News

- +
- + 5 min
-

Agent Tools Today, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

-

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

+

Agent Tools Today, 28 Oct 2026: OpenCode 2.2, Entire, Hallmark

+

The top launches, skills, multi agent moves, rising repos and arguments in AI agents from 27 to 28 Oct 2026, each with its source and date.

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

Agent Tools Today, 23 Oct 2026: Claude Duet, OpenAI CLI, Nvidia OpenShell

-

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

+

Agent Tools Today, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail

+

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

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

Agent Tools Today, 22 Oct 2026: Claude API 2026-10-21, LayerFS 1.0, PHP2Shell

-

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

+

Agent Tools Today, 23 Oct 2026: Claude Duet, OpenAI CLI, Nvidia OpenShell

+

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

News - Read → + Read →
diff --git a/docs/blog/chatgpt-dots-alternatives/index.html b/docs/blog/chatgpt-dots-alternatives/index.html index 0cb399558b..e57f033394 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
-

Codex Alternatives: 7 Picks Beyond OpenAI's Agent (Oct 2026)

-

Seven Codex alternatives checked 26 Oct 2026: Claude Code, Munder Difflin, Copilot CLI, OpenCode, Goose, Cline and Cursor, with licences and prices.

+

ChatGPT Dots vs Claude Cowork: Plans, Price and Safety (Oct 2026)

+

ChatGPT Dots keeps an ongoing job moving; Claude Cowork hands back finished files. Plans, prices, where each runs and how each asks first, checked 28 Oct 2026.

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

Pi Agent Alternatives: 7 Coding Agents to Try (Oct 2026)

-

Seven Pi agent alternatives checked 26 Oct 2026: OpenCode, Munder Difflin, Claude Code, Codex CLI, Hermes Agent, Goose and Crush, with licences and prices.

+

Codex vs ChatGPT: What Is the Difference? (Oct 2026)

+

Codex is OpenAI's coding agent and ChatGPT is its assistant. Which plans include Codex, the limits, where each runs and which to use, checked 28 Oct 2026.

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 new file mode 100644 index 0000000000..8dbc3c36e3 --- /dev/null +++ b/docs/blog/chatgpt-dots-vs-claude-cowork/index.html @@ -0,0 +1,446 @@ + + + + + + + + +ChatGPT Dots vs Claude Cowork (2026): Price, Plans, Files + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +

ChatGPT Dots vs Claude Cowork: Plans, Price and Safety (Oct 2026)

+

ChatGPT Dots keeps an ongoing job moving; Claude Cowork hands back finished files. Plans, prices, where each runs and how each asks first, checked 28 Oct 2026.

+ +
+ +
Title card on white. A pill reading Comparisons, the title ChatGPT Dots vs Claude Cowork, the line Ongoing jobs or finished files? and a Checked 28 Oct 2026 line, beside a lilac ribbon bookmark and a yellow index card with a small vs chip between them.
+ +
+
+

Pick ChatGPT Dots if you want one always on agent that owns an ongoing job and reaches you in Slack, Teams or a call; pick Claude Cowork if you want tasks handed back as finished files. Cowork comes with Claude Pro at $20 billed monthly, Dots with ChatGPT Pro from $100 a month, checked 28 Oct 2026.

+

If you want agents on your own machine as well, 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. This sits in our Comparisons hub, next to what is ChatGPT Dots and what is Claude Cowork.

+

ChatGPT Dots vs Claude Cowork at a glance (checked 28 Oct 2026)

+

Both are hosted agents that keep working in the cloud; they differ in the job, the plan and the controls.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ChatGPT DotsClaude Cowork
Unit of workAn ongoing responsibilityA task with an outcome
Where the work runsIts own cloud computer and browserAnthropic’s servers, in an isolated environment
Your computerOptional, one at a timeThrough the desktop app, folders you connect
Where you talk to itChatGPT apps, Slack, Teams, callsClaude web, desktop, mobile, Chrome side panel
PlansPro 100, Pro 200, Pro 500; Business Premium and Enterprise rolling outPro, Max, Team, Enterprise
Entry price on 28 Oct 2026ChatGPT Pro from $100 a monthClaude Pro, $20 billed monthly
ApprovalsAutomatic review, optional custom rulesManual, Auto or Skip mode
+
+

What does each one do?

+

A dot keeps track of something over time, while Cowork finishes a task you describe. OpenAI’s dots page calls a dot “an always-on agent that keeps work moving across your tools and projects”, for when you want it to “keep track of an ongoing responsibility, figure out next steps as things change, and follow up between conversations”. It runs on GPT-6 Astra and can hand work to ChatGPT Work or Codex.

+

Anthropic’s help page says Cowork “brings Claude Code’s agentic capabilities to knowledge work beyond coding”. You “describe an outcome, step away, and come back to finished work”, such as documents, organized files and research. Cowork is also being folded into Claude itself: on 28 Oct 2026 the pricing page banner read “Claude Cowork is now just Claude”, rolling out to Pro and Max first.

+

Our view: a dot is a standing assignment, Cowork is a job ticket.

+
Animation. On a white background, a thick book turns its own pages while a ribbon bookmark labelled ChatGPT Dots moves forward chapter by chapter. Beside it a single index card labelled Claude Cowork fills with lines and slides into a finished tray.
A dot follows an ongoing job; Cowork hands back finished work. OpenAI and Anthropic docs, 28 Oct 2026.
+

How much do they cost?

+

Claude Cowork costs less to start, because it comes with Claude Pro and dots need ChatGPT Pro, Business Premium or Enterprise. On 28 Oct 2026 Anthropic’s pricing page listed Pro at $20 if billed monthly, or $17 a month billed annually, and Max from $100 a month. The help page says Cowork “is available on paid plans (Pro, Max, Team, and Enterprise)”.

+

OpenAI’s pricing page listed Pro on 28 Oct 2026 as “Plans at $100, $200, or $500 USD per month”. The dots page lists Pro 100, Pro 200 and Pro 500 “for users over 18 outside the European Economic Area, United Kingdom, and Switzerland”. Business Premium and Enterprise are “rolling out worldwide”, and Enterprise admins must switch dots on. OpenAI adds that dots are rolling out gradually, so you may not see them yet even on an eligible plan.

+

Usage counts differently too. OpenAI says conversations with your dot “don’t count toward your ChatGPT usage limits”, while tasks it starts in Work or Codex do. Anthropic’s Cowork page warns that “Claude Cowork consumes limits faster than Chat.”

+
Animation. On a white background, two lunchboxes pop open one after the other. The small one is labelled Claude Pro, 20 dollars, and holds one sandwich marked Cowork. The big one is labelled ChatGPT Pro, from 100 dollars, and holds a round snack marked Dots. Prices from 28 Oct 2026.
Claude Pro at $20 billed monthly, ChatGPT Pro from $100 a month, per Anthropic's and OpenAI's pricing pages on 28 Oct 2026.
+

Where do they run and what can they touch?

+

Both run in the cloud and reach your own computer through their desktop app. A dot “lives in the cloud and has its own computer and browser” and “can keep working even when your computer is off”. You can connect one personal computer at a time, and it must be online with the ChatGPT app open. Its cloud browser “doesn’t inherit logins from your personal browser”.

+

Cowork’s help page says “Claude’s work runs on Anthropic’s servers, in an isolated environment”, and “work continues if you close your laptop”. Local files, browser use and computer use need the Claude Desktop app for macOS or Windows, open and connected. Claude “can only read and write files in folders you’ve connected”. Anthropic’s Cowork page says its built in browser, in the desktop app on Pro, Max and Team, is “Separate from your own browser, logins, and tabs.”

+

Which is safer with your files?

+

Both check risky actions, but Cowork fixes one rule for files. Its help page says Claude “requires your explicit permission before permanently deleting any files”. It offers three modes: Manual asks each time, Auto lets Claude review each action and block unsafe ones, and Skip means “nothing checks its actions automatically”. In the new Claude experience the message box offers Auto, the default on Pro, Max and Team, and Manual. Anthropic also states that “Cowork has unique risks due to its agentic nature and internet access.”

+

OpenAI’s controls page says an automatic review checks actions that could affect your accounts or share information. Custom rules offer four choices: “Take action without asking”, “Take action when you say so”, “Ask before taking action” and “Hand off to you”. The page adds that rules are instructions your dot “tries to follow, and it can make mistakes”, and that stopping work “doesn’t undo completed actions”.

+
Animation. On a white background, a wooden key rack has two hooks. A key labelled Cloud computer already hangs on the first hook. A second key labelled Your computer swings onto the empty hook after a tag reading Allow access flips over. A small card reading Delete? Ask first sways below.
A dot reaches your computer after you allow access; Cowork asks before deleting files. OpenAI and Anthropic docs, 28 Oct 2026.
+

Our view: keep both on the asking setting for anything that sends messages or touches money.

+

Pick ChatGPT Dots if…, pick Claude Cowork if…

+

Pick by the shape of the work.

+

Pick ChatGPT Dots if:

+
    +
  • You pay for ChatGPT Pro outside the EEA, UK and Switzerland, or have Business Premium.
  • +
  • You want one agent that watches a project and pings you when a decision is due.
  • +
  • You want to reach it in Slack, Teams or by calling it.
  • +
+

Pick Claude Cowork if:

+
    +
  • You want a finished spreadsheet, deck or report.
  • +
  • You want to start on a $20 plan (28 Oct 2026) rather than one from $100.
  • +
  • You want file access fenced to folders you connect.
  • +
+

More options sit in ChatGPT Dots alternatives; Claude Cowork vs Claude Code covers Anthropic’s other agent.

+

Can you run both?

+

Yes, but they are separate subscriptions, so you pay OpenAI and Anthropic.

+

Munder Difflin fits alongside either when you want agents on your own machine. It runs agents on engines such as Claude Code, Codex and Gemini CLI, takes work in from Slack and webhooks, and connects tools through MCP servers, skills and plugins. Today the agents run on your computer; a Cloud Office and a mobile app are coming soon. How to install and use Munder Difflin covers setup, and Munder Difflin vs ChatGPT Dots puts it next to Dots.

+ + + + +
+

FAQ

+ +
+

What is the difference between ChatGPT Dots and Claude Cowork?

+

The shape of the work. OpenAI's docs describe a dot as an always on agent that keeps track of an ongoing responsibility and follows up between conversations. Anthropic's help page says Cowork lets you describe an outcome, step away and come back to finished work such as documents, organized files and research. Checked 28 Oct 2026.

+
+ +
+

Which is cheaper, ChatGPT Dots or Claude Cowork?

+

Claude Cowork. On 28 Oct 2026 Anthropic's pricing page listed Claude Pro at $20 if billed monthly, and Cowork is available on Pro. OpenAI's docs list dots for Pro 100, Pro 200 and Pro 500, and its pricing page listed Pro from $100 a month on the same date.

+
+ +
+

Can I use ChatGPT Dots in the UK or EU?

+

Not on a personal Pro plan. OpenAI's dots page lists Pro for users over 18 outside the European Economic Area, United Kingdom and Switzerland. Business Premium and Enterprise are rolling out worldwide, and Enterprise admins must turn dots on. Checked 28 Oct 2026.

+
+ +
+

Do ChatGPT Dots and Claude Cowork keep working when my computer is off?

+

Yes, for cloud work. A dot has its own cloud computer and can keep working when your computer is off. Cowork runs on Anthropic's servers, and scheduled tasks run with no device online. Work that needs your own files needs your computer on and the app open.

+
+ +
+

Can a ChatGPT dot or Claude Cowork delete my files?

+

Cowork asks first: its help page says Claude requires your explicit permission before permanently deleting any files. OpenAI's dots docs give you custom rules such as Hand off to you, and say rules are instructions a dot tries to follow and it can make mistakes. Checked 28 Oct 2026.

+
+ +
+ + + +
+ + +
+ + + + +
+ + +
+ +
+ + + + + + diff --git a/docs/blog/claude-code-alternatives/index.html b/docs/blog/claude-code-alternatives/index.html index cf427d8789..0ad0bd299e 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
-

Codex Alternatives: 7 Picks Beyond OpenAI's Agent (Oct 2026)

-

Seven Codex alternatives checked 26 Oct 2026: Claude Code, Munder Difflin, Copilot CLI, OpenCode, Goose, Cline and Cursor, with licences and prices.

+

ChatGPT Dots vs Claude Cowork: Plans, Price and Safety (Oct 2026)

+

ChatGPT Dots keeps an ongoing job moving; Claude Cowork hands back finished files. Plans, prices, where each runs and how each asks first, checked 28 Oct 2026.

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

Pi Agent Alternatives: 7 Coding Agents to Try (Oct 2026)

-

Seven Pi agent alternatives checked 26 Oct 2026: OpenCode, Munder Difflin, Claude Code, Codex CLI, Hermes Agent, Goose and Crush, with licences and prices.

+

Codex vs ChatGPT: What Is the Difference? (Oct 2026)

+

Codex is OpenAI's coding agent and ChatGPT is its assistant. Which plans include Codex, the limits, where each runs and which to use, checked 28 Oct 2026.

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 b92bd2ded1..dd97d386b0 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
-

Codex Alternatives: 7 Picks Beyond OpenAI's Agent (Oct 2026)

-

Seven Codex alternatives checked 26 Oct 2026: Claude Code, Munder Difflin, Copilot CLI, OpenCode, Goose, Cline and Cursor, with licences and prices.

+

ChatGPT Dots vs Claude Cowork: Plans, Price and Safety (Oct 2026)

+

ChatGPT Dots keeps an ongoing job moving; Claude Cowork hands back finished files. Plans, prices, where each runs and how each asks first, checked 28 Oct 2026.

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

Pi Agent Alternatives: 7 Coding Agents to Try (Oct 2026)

-

Seven Pi agent alternatives checked 26 Oct 2026: OpenCode, Munder Difflin, Claude Code, Codex CLI, Hermes Agent, Goose and Crush, with licences and prices.

+

Codex vs ChatGPT: What Is the Difference? (Oct 2026)

+

Codex is OpenAI's coding agent and ChatGPT is its assistant. Which plans include Codex, the limits, where each runs and which to use, checked 28 Oct 2026.

Comparisons - Read → + Read →
diff --git a/docs/blog/claude-code-vs-antigravity/index.html b/docs/blog/claude-code-vs-antigravity/index.html index c655cb9c1d..70427e9687 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
-

Codex Alternatives: 7 Picks Beyond OpenAI's Agent (Oct 2026)

-

Seven Codex alternatives checked 26 Oct 2026: Claude Code, Munder Difflin, Copilot CLI, OpenCode, Goose, Cline and Cursor, with licences and prices.

+

ChatGPT Dots vs Claude Cowork: Plans, Price and Safety (Oct 2026)

+

ChatGPT Dots keeps an ongoing job moving; Claude Cowork hands back finished files. Plans, prices, where each runs and how each asks first, checked 28 Oct 2026.

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

Pi Agent Alternatives: 7 Coding Agents to Try (Oct 2026)

-

Seven Pi agent alternatives checked 26 Oct 2026: OpenCode, Munder Difflin, Claude Code, Codex CLI, Hermes Agent, Goose and Crush, with licences and prices.

+

Codex vs ChatGPT: What Is the Difference? (Oct 2026)

+

Codex is OpenAI's coding agent and ChatGPT is its assistant. Which plans include Codex, the limits, where each runs and which to use, checked 28 Oct 2026.

Comparisons - Read → + Read →
diff --git a/docs/blog/claude-code-vs-cursor/index.html b/docs/blog/claude-code-vs-cursor/index.html index e4011e590f..e1d3e582a6 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
-

Codex Alternatives: 7 Picks Beyond OpenAI's Agent (Oct 2026)

-

Seven Codex alternatives checked 26 Oct 2026: Claude Code, Munder Difflin, Copilot CLI, OpenCode, Goose, Cline and Cursor, with licences and prices.

+

ChatGPT Dots vs Claude Cowork: Plans, Price and Safety (Oct 2026)

+

ChatGPT Dots keeps an ongoing job moving; Claude Cowork hands back finished files. Plans, prices, where each runs and how each asks first, checked 28 Oct 2026.

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

Pi Agent Alternatives: 7 Coding Agents to Try (Oct 2026)

-

Seven Pi agent alternatives checked 26 Oct 2026: OpenCode, Munder Difflin, Claude Code, Codex CLI, Hermes Agent, Goose and Crush, with licences and prices.

+

Codex vs ChatGPT: What Is the Difference? (Oct 2026)

+

Codex is OpenAI's coding agent and ChatGPT is its assistant. Which plans include Codex, the limits, where each runs and which to use, checked 28 Oct 2026.

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 815dc856ee..a0c08c29ed 100644 --- a/docs/blog/claude-cowork-vs-claude-code/index.html +++ b/docs/blog/claude-cowork-vs-claude-code/index.html @@ -275,6 +275,7 @@

Can you use both? Claude Cowork vs OpenClaw: how do they differ?

Cowork is hosted and paid, OpenClaw is self-hosted and free. The OpenClaw README says it is MIT licensed and “has no paid tier, hosted service, or token”. It answers in chat apps: “Discord, iMessage, Slack, Teams, Telegram, WhatsApp, and 20+ more”. Models are plugins, and the README names Claude, Codex and local models.

The trade is control against convenience. OpenClaw’s README warns that “Tools run on the host for the main session unless you configure sandboxing”. Cowork runs in Anthropic’s isolated environment, on Anthropic’s terms and plans. GitHub showed OpenClaw release v2026.9.8, dated 3 Oct, when we checked on 6 Oct 2026. Its README says it was built for Molty, a space lobster AI assistant. See OpenClaw alternatives for more options.

+

OpenAI’s rival: ChatGPT Dots vs Claude Cowork.

Who should pick which?

Pick by what you need handed back.

    @@ -347,50 +348,50 @@

    FAQ

    Related in Comparisons

    - +
    - + 5 min
    -

    Codex Alternatives: 7 Picks Beyond OpenAI's Agent (Oct 2026)

    -

    Seven Codex alternatives checked 26 Oct 2026: Claude Code, Munder Difflin, Copilot CLI, OpenCode, Goose, Cline and Cursor, with licences and prices.

    +

    ChatGPT Dots vs Claude Cowork: Plans, Price and Safety (Oct 2026)

    +

    ChatGPT Dots keeps an ongoing job moving; Claude Cowork hands back finished files. Plans, prices, where each runs and how each asks first, checked 28 Oct 2026.

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

    Pi Agent Alternatives: 7 Coding Agents to Try (Oct 2026)

    -

    Seven Pi agent alternatives checked 26 Oct 2026: OpenCode, Munder Difflin, Claude Code, Codex CLI, Hermes Agent, Goose and Crush, with licences and prices.

    +

    Codex vs ChatGPT: What Is the Difference? (Oct 2026)

    +

    Codex is OpenAI's coding agent and ChatGPT is its assistant. Which plans include Codex, the limits, where each runs and which to use, checked 28 Oct 2026.

    Comparisons - Read → + Read →
    diff --git a/docs/blog/claude-duet-alternatives/index.html b/docs/blog/claude-duet-alternatives/index.html index c7d542b36b..8aa42be866 100644 --- a/docs/blog/claude-duet-alternatives/index.html +++ b/docs/blog/claude-duet-alternatives/index.html @@ -313,50 +313,50 @@

    FAQ

    Related in Comparisons

    - +
    - + 5 min
    -

    Codex Alternatives: 7 Picks Beyond OpenAI's Agent (Oct 2026)

    -

    Seven Codex alternatives checked 26 Oct 2026: Claude Code, Munder Difflin, Copilot CLI, OpenCode, Goose, Cline and Cursor, with licences and prices.

    +

    ChatGPT Dots vs Claude Cowork: Plans, Price and Safety (Oct 2026)

    +

    ChatGPT Dots keeps an ongoing job moving; Claude Cowork hands back finished files. Plans, prices, where each runs and how each asks first, checked 28 Oct 2026.

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

    Pi Agent Alternatives: 7 Coding Agents to Try (Oct 2026)

    -

    Seven Pi agent alternatives checked 26 Oct 2026: OpenCode, Munder Difflin, Claude Code, Codex CLI, Hermes Agent, Goose and Crush, with licences and prices.

    +

    Codex vs ChatGPT: What Is the Difference? (Oct 2026)

    +

    Codex is OpenAI's coding agent and ChatGPT is its assistant. Which plans include Codex, the limits, where each runs and which to use, checked 28 Oct 2026.

    Comparisons - Read → + Read →
    diff --git a/docs/blog/claude-duet-for-developers/index.html b/docs/blog/claude-duet-for-developers/index.html index 2c5e14c2a6..060d28f30e 100644 --- a/docs/blog/claude-duet-for-developers/index.html +++ b/docs/blog/claude-duet-for-developers/index.html @@ -264,50 +264,50 @@

    FAQ

    Related in Comparisons

    - +
    - + 5 min
    -

    Codex Alternatives: 7 Picks Beyond OpenAI's Agent (Oct 2026)

    -

    Seven Codex alternatives checked 26 Oct 2026: Claude Code, Munder Difflin, Copilot CLI, OpenCode, Goose, Cline and Cursor, with licences and prices.

    +

    ChatGPT Dots vs Claude Cowork: Plans, Price and Safety (Oct 2026)

    +

    ChatGPT Dots keeps an ongoing job moving; Claude Cowork hands back finished files. Plans, prices, where each runs and how each asks first, checked 28 Oct 2026.

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

    Pi Agent Alternatives: 7 Coding Agents to Try (Oct 2026)

    -

    Seven Pi agent alternatives checked 26 Oct 2026: OpenCode, Munder Difflin, Claude Code, Codex CLI, Hermes Agent, Goose and Crush, with licences and prices.

    +

    Codex vs ChatGPT: What Is the Difference? (Oct 2026)

    +

    Codex is OpenAI's coding agent and ChatGPT is its assistant. Which plans include Codex, the limits, where each runs and which to use, checked 28 Oct 2026.

    Comparisons - Read → + Read →
    diff --git a/docs/blog/claude-duet-vs-munder-difflin/index.html b/docs/blog/claude-duet-vs-munder-difflin/index.html index d3f1d7c298..ac7119ba93 100644 --- a/docs/blog/claude-duet-vs-munder-difflin/index.html +++ b/docs/blog/claude-duet-vs-munder-difflin/index.html @@ -310,50 +310,50 @@

    FAQ

    Related in Comparisons

    - +
    - + 5 min
    -

    Codex Alternatives: 7 Picks Beyond OpenAI's Agent (Oct 2026)

    -

    Seven Codex alternatives checked 26 Oct 2026: Claude Code, Munder Difflin, Copilot CLI, OpenCode, Goose, Cline and Cursor, with licences and prices.

    +

    ChatGPT Dots vs Claude Cowork: Plans, Price and Safety (Oct 2026)

    +

    ChatGPT Dots keeps an ongoing job moving; Claude Cowork hands back finished files. Plans, prices, where each runs and how each asks first, checked 28 Oct 2026.

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

    Pi Agent Alternatives: 7 Coding Agents to Try (Oct 2026)

    -

    Seven Pi agent alternatives checked 26 Oct 2026: OpenCode, Munder Difflin, Claude Code, Codex CLI, Hermes Agent, Goose and Crush, with licences and prices.

    +

    Codex vs ChatGPT: What Is the Difference? (Oct 2026)

    +

    Codex is OpenAI's coding agent and ChatGPT is its assistant. Which plans include Codex, the limits, where each runs and which to use, checked 28 Oct 2026.

    Comparisons - Read → + Read →
    diff --git a/docs/blog/claude-squad-alternative/index.html b/docs/blog/claude-squad-alternative/index.html index cb2e9a9bf7..771a3f10c7 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
    -

    Codex Alternatives: 7 Picks Beyond OpenAI's Agent (Oct 2026)

    -

    Seven Codex alternatives checked 26 Oct 2026: Claude Code, Munder Difflin, Copilot CLI, OpenCode, Goose, Cline and Cursor, with licences and prices.

    +

    ChatGPT Dots vs Claude Cowork: Plans, Price and Safety (Oct 2026)

    +

    ChatGPT Dots keeps an ongoing job moving; Claude Cowork hands back finished files. Plans, prices, where each runs and how each asks first, checked 28 Oct 2026.

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

    Pi Agent Alternatives: 7 Coding Agents to Try (Oct 2026)

    -

    Seven Pi agent alternatives checked 26 Oct 2026: OpenCode, Munder Difflin, Claude Code, Codex CLI, Hermes Agent, Goose and Crush, with licences and prices.

    +

    Codex vs ChatGPT: What Is the Difference? (Oct 2026)

    +

    Codex is OpenAI's coding agent and ChatGPT is its assistant. Which plans include Codex, the limits, where each runs and which to use, checked 28 Oct 2026.

    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 efbaddc6f0..2d149daae5 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
    -

    Codex Alternatives: 7 Picks Beyond OpenAI's Agent (Oct 2026)

    -

    Seven Codex alternatives checked 26 Oct 2026: Claude Code, Munder Difflin, Copilot CLI, OpenCode, Goose, Cline and Cursor, with licences and prices.

    +

    ChatGPT Dots vs Claude Cowork: Plans, Price and Safety (Oct 2026)

    +

    ChatGPT Dots keeps an ongoing job moving; Claude Cowork hands back finished files. Plans, prices, where each runs and how each asks first, checked 28 Oct 2026.

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

    Pi Agent Alternatives: 7 Coding Agents to Try (Oct 2026)

    -

    Seven Pi agent alternatives checked 26 Oct 2026: OpenCode, Munder Difflin, Claude Code, Codex CLI, Hermes Agent, Goose and Crush, with licences and prices.

    +

    Codex vs ChatGPT: What Is the Difference? (Oct 2026)

    +

    Codex is OpenAI's coding agent and ChatGPT is its assistant. Which plans include Codex, the limits, where each runs and which to use, checked 28 Oct 2026.

    Comparisons - Read → + Read →
    diff --git a/docs/blog/cline-alternatives/index.html b/docs/blog/cline-alternatives/index.html index 64e29bd0be..a9d070c053 100644 --- a/docs/blog/cline-alternatives/index.html +++ b/docs/blog/cline-alternatives/index.html @@ -338,50 +338,50 @@

    FAQ

    Related in Comparisons

    - +
    - + 5 min
    -

    Codex Alternatives: 7 Picks Beyond OpenAI's Agent (Oct 2026)

    -

    Seven Codex alternatives checked 26 Oct 2026: Claude Code, Munder Difflin, Copilot CLI, OpenCode, Goose, Cline and Cursor, with licences and prices.

    +

    ChatGPT Dots vs Claude Cowork: Plans, Price and Safety (Oct 2026)

    +

    ChatGPT Dots keeps an ongoing job moving; Claude Cowork hands back finished files. Plans, prices, where each runs and how each asks first, checked 28 Oct 2026.

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

    Pi Agent Alternatives: 7 Coding Agents to Try (Oct 2026)

    -

    Seven Pi agent alternatives checked 26 Oct 2026: OpenCode, Munder Difflin, Claude Code, Codex CLI, Hermes Agent, Goose and Crush, with licences and prices.

    +

    Codex vs ChatGPT: What Is the Difference? (Oct 2026)

    +

    Codex is OpenAI's coding agent and ChatGPT is its assistant. Which plans include Codex, the limits, where each runs and which to use, checked 28 Oct 2026.

    Comparisons - Read → + Read →
    diff --git a/docs/blog/cline-vs-munder-difflin/index.html b/docs/blog/cline-vs-munder-difflin/index.html index db4021d7b8..4628421b44 100644 --- a/docs/blog/cline-vs-munder-difflin/index.html +++ b/docs/blog/cline-vs-munder-difflin/index.html @@ -326,50 +326,50 @@

    FAQ

    Related in Comparisons

    - +
    - + 5 min
    -

    Codex Alternatives: 7 Picks Beyond OpenAI's Agent (Oct 2026)

    -

    Seven Codex alternatives checked 26 Oct 2026: Claude Code, Munder Difflin, Copilot CLI, OpenCode, Goose, Cline and Cursor, with licences and prices.

    +

    ChatGPT Dots vs Claude Cowork: Plans, Price and Safety (Oct 2026)

    +

    ChatGPT Dots keeps an ongoing job moving; Claude Cowork hands back finished files. Plans, prices, where each runs and how each asks first, checked 28 Oct 2026.

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

    Pi Agent Alternatives: 7 Coding Agents to Try (Oct 2026)

    -

    Seven Pi agent alternatives checked 26 Oct 2026: OpenCode, Munder Difflin, Claude Code, Codex CLI, Hermes Agent, Goose and Crush, with licences and prices.

    +

    Codex vs ChatGPT: What Is the Difference? (Oct 2026)

    +

    Codex is OpenAI's coding agent and ChatGPT is its assistant. Which plans include Codex, the limits, where each runs and which to use, checked 28 Oct 2026.

    Comparisons - Read → + Read →
    diff --git a/docs/blog/codex-alternatives/index.html b/docs/blog/codex-alternatives/index.html index 513435365e..7774a39b49 100644 --- a/docs/blog/codex-alternatives/index.html +++ b/docs/blog/codex-alternatives/index.html @@ -351,50 +351,50 @@

    FAQ

    Related in Comparisons

    - +
    - + - 4 min + 5 min
    -

    Pi Agent Alternatives: 7 Coding Agents to Try (Oct 2026)

    -

    Seven Pi agent alternatives checked 26 Oct 2026: OpenCode, Munder Difflin, Claude Code, Codex CLI, Hermes Agent, Goose and Crush, with licences and prices.

    +

    ChatGPT Dots vs Claude Cowork: Plans, Price and Safety (Oct 2026)

    +

    ChatGPT Dots keeps an ongoing job moving; Claude Cowork hands back finished files. Plans, prices, where each runs and how each asks first, checked 28 Oct 2026.

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

    Claude Duet Alternatives: 4 AI Agents You Can Use Today, No Waitlist

    -

    Claude Duet is waitlisted and US only. Four proactive agents you can run today, sorted by where they run: a vendor's cloud or hardware you control.

    +

    Pi Agent Alternatives: 7 Coding Agents to Try (Oct 2026)

    +

    Seven Pi agent alternatives checked 26 Oct 2026: OpenCode, Munder Difflin, Claude Code, Codex CLI, Hermes Agent, Goose and Crush, with licences and prices.

    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 6969a2c675..7a94182522 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
    -

    Codex Alternatives: 7 Picks Beyond OpenAI's Agent (Oct 2026)

    -

    Seven Codex alternatives checked 26 Oct 2026: Claude Code, Munder Difflin, Copilot CLI, OpenCode, Goose, Cline and Cursor, with licences and prices.

    +

    ChatGPT Dots vs Claude Cowork: Plans, Price and Safety (Oct 2026)

    +

    ChatGPT Dots keeps an ongoing job moving; Claude Cowork hands back finished files. Plans, prices, where each runs and how each asks first, checked 28 Oct 2026.

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

    Pi Agent Alternatives: 7 Coding Agents to Try (Oct 2026)

    -

    Seven Pi agent alternatives checked 26 Oct 2026: OpenCode, Munder Difflin, Claude Code, Codex CLI, Hermes Agent, Goose and Crush, with licences and prices.

    +

    Codex vs ChatGPT: What Is the Difference? (Oct 2026)

    +

    Codex is OpenAI's coding agent and ChatGPT is its assistant. Which plans include Codex, the limits, where each runs and which to use, checked 28 Oct 2026.

    Comparisons - Read → + Read →
    diff --git a/docs/blog/codex-vs-chatgpt/index.html b/docs/blog/codex-vs-chatgpt/index.html new file mode 100644 index 0000000000..c32a6951ea --- /dev/null +++ b/docs/blog/codex-vs-chatgpt/index.html @@ -0,0 +1,458 @@ + + + + + + + + +Codex vs ChatGPT (2026): Difference, Plans and Coding + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    + +

    Codex vs ChatGPT: What Is the Difference? (Oct 2026)

    +

    Codex is OpenAI's coding agent and ChatGPT is its assistant. Which plans include Codex, the limits, where each runs and which to use, checked 28 Oct 2026.

    + +
    + +
    Title card on white. A pill reading Comparisons, the title Codex vs ChatGPT, the line Coding agent or assistant? and a Checked 28 Oct 2026 line, beside two stacked trays labelled ChatGPT and Codex with a small vs chip.
    + +
    +
    +

    Pick Codex if you want an agent that works inside a code repository from your terminal, editor or the cloud; pick ChatGPT for answers, drafts and finished documents. ChatGPT Free, Go, Plus, Pro, Business, Edu and Enterprise include Codex, on Free and Go in the desktop app subject to rollout, checked 28 Oct 2026.

    +

    You can also run Codex next to other agents in Munder Difflin, which 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. This page sits in our Comparisons hub. For Codex alone, start with what is Codex.

    +

    Codex vs ChatGPT at a glance (checked 28 Oct 2026)

    +

    Codex is the coding agent and ChatGPT is the assistant around it; they share your account and your usage.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CodexChatGPT
    What it isOpenAI’s coding agentOpenAI’s assistant: Chat for answers, Work for finished tasks
    Use it toBuild, debug, test or review softwareAsk, draft, research, analyze, create files
    Where it runsDesktop app, CLI, IDE extension, Codex Cloud, mobileWeb, desktop app, mobile
    Sign inChatGPT account or API keyChatGPT account
    PlansFree, Go, Plus, Pro, Business, Edu, Enterprise, or an API keyThe same ChatGPT plans
    UsageShared with ChatGPT WorkWork uses Codex’s pricing, credits and limits
    Open sourceCLI under Apache-2.0Not listed on OpenAI’s open source page
    +
    +

    What is the difference between Codex and ChatGPT?

    +

    The difference is the job: ChatGPT talks and produces documents, Codex works on code with developer tools. OpenAI’s Use ChatGPT page puts it in one line: “Use Chat for a question or back-and-forth. Turn on Work in the switcher when you want ChatGPT to carry a larger task through to a reviewable result. Select Codex when you want developer views or more technical detail, especially for software development.”

    +

    So is Codex part of ChatGPT? Yes. The desktop app page tells you to “Choose ChatGPT or Codex” when you send your first message. The pricing page says “ChatGPT Work usage inside ChatGPT uses the same pricing, credits, and usage limits as Codex.”

    +

    Codex also lives outside the app. The Codex README says “Codex CLI is a coding agent from OpenAI that runs locally on your computer.” GitHub listed the repo under Apache-2.0 on 28 Oct 2026, with release rust-v0.165.0 published on 27 Oct.

    +
    Animation. On a white background, a toolbox opens and its top tray, labelled ChatGPT, slides out holding a notepad and a pencil. Under it a second tray, labelled Codex, rises with a wrench and a small card that reads terminal.
    One app, two trays: you choose ChatGPT or Codex in the desktop app. OpenAI's desktop app docs, 28 Oct 2026.
    +

    Do you need a ChatGPT plan to use Codex?

    +

    No, an API key works too, but a plan decides where you can use Codex. OpenAI’s pricing page listed these plans, in US dollars, on 28 Oct 2026:

    +
      +
    • Free at $0 and Go at $8 a month (28 Oct 2026): “GPT-6 Luna at Standard speed in the desktop app, subject to rollout”.
    • +
    • Plus at $20 a month (28 Oct 2026): “Codex on the web, in the CLI, in the IDE extension, and on iOS”, automatic code review and Slack, GPT-6.1 Sol and GPT-6 Luna.
    • +
    • Pro from $100 a month (28 Oct 2026): “Plans at $100, $200, or $500 USD per month”, with Ultrafast mode on Pro $500.
    • +
    • Business at $20 per user a month (28 Oct 2026): for two or more users billed annually, or $25 billed monthly.
    • +
    • API key: Codex “in the CLI, SDK, or IDE extension”, with “No cloud-based features”, billed at API pricing.
    • +
    +

    Limits are estimates, not caps. For Plus and Standard Business, the page estimated local messages “per five-hour period”: 15 to 160 on GPT-6.1 Sol and 350 to 3,000 on GPT-6 Luna. It adds that “Weekly limits may also apply” and that “Pro plans currently have no five-hour limit.” Codex pricing has the credit rates.

    +
    Animation. On a white background, a wooden ladder leans on a wall with rungs labelled Free 0 dollars, Go 8 dollars, Plus 20 dollars and Pro from 100 dollars, as listed on 28 Oct 2026. A small card that reads CLI climbs rung by rung and settles on Plus.
    Free and Go list the desktop app; Plus at $20 a month was the first card listing the CLI on OpenAI's pricing page, 28 Oct 2026.
    +

    Where does each one run?

    +

    ChatGPT runs on the web, the desktop app and mobile; Codex adds your terminal, your editor and OpenAI’s cloud. The desktop app comes “for macOS or Windows”, with a Linux installation guide.

    +
      +
    • Codex CLI: the CLI page says Codex can “inspect files, make edits, and run the tools already installed on your machine”, and codex exec runs it in scripts and CI.
    • +
    • IDE extension: per the IDE page, “VS Code and compatible editors use the Codex extension; Xcode and JetBrains IDEs provide their own integrations.”
    • +
    • Codex Cloud: each task “has its own workspace and can keep working while your computer is asleep”, according to the cloud page.
    • +
    • Mobile: OpenAI’s mobile page says the ChatGPT mobile app can start, guide and approve Codex tasks that run “in the cloud or on a connected computer”, with availability depending on rollout and your workspace settings.
    • +
    +

    Our Codex CLI install guide covers the terminal setup.

    +
    Animation. On a white background, a tram map draws two lines. A tram labelled Codex stops in turn at Terminal, Editor, Desktop app and Cloud. A second tram labelled ChatGPT runs a shorter line through Web, Desktop app and Mobile, and both lines share the Desktop app stop.
    Codex runs in the CLI, IDE extension, desktop app and Codex Cloud; both share the desktop app. OpenAI's Codex docs, 28 Oct 2026.
    +

    Which is better for coding?

    +

    Codex, for anything that touches a repository. OpenAI’s dots page lists Codex for when you want to “build, debug, test, or review software and work directly with code and developer tools”. Model choice differs too: the pricing page says “GPT-6.1 Sol is available in Work and Codex, not Chat.”

    +

    ChatGPT Work can still handle some code. The Use ChatGPT page says it can “Run code and shell commands, analyze data, inspect files, review code, and work with repositories your selected environment can access.” The Work page also says that if you used Codex for non coding work, “you can stay in Codex or use ChatGPT Work instead.”

    +

    Our view: Chat to think it through, Codex to change the code, Work for the write up. Same bill, three tabs.

    +

    Pick Codex if…, pick ChatGPT if…

    +

    Pick by what you need handed back: a diff or a document.

    +

    Pick Codex if:

    +
      +
    • You want an agent that edits files and runs commands in your repo.
    • +
    • You want to script it in CI with codex exec or an API key.
    • +
    • You want cloud tasks that keep going while your laptop sleeps.
    • +
    +

    Pick ChatGPT if:

    +
      +
    • You want an answer, a brainstorm or a draft (Chat).
    • +
    • You want a deck, report or spreadsheet you can review (Work).
    • +
    • You are on Free or Go and mostly ask questions.
    • +
    +

    For other coding agents, see Codex vs Claude Code and Codex alternatives.

    +

    Can you run Codex next to other agents?

    +

    Yes. Codex is one CLI among several, and they can run side by side.

    +

    Munder Difflin is one place to do that. It runs a team of agents for research, writing, ops and coding on engines such as Claude Code, Codex and Gemini CLI, takes work in from Slack and webhooks, and connects tools through MCP servers, skills and plugins. The agents run on your computer today; a Cloud Office and a mobile app are coming soon. How to install and use Munder Difflin walks through setup.

    + + + + +
    +

    FAQ

    + +
    +

    Is Codex part of ChatGPT?

    +

    Yes. OpenAI's docs say ChatGPT Work and Codex are included in your ChatGPT Free, Go, Plus, Pro, Business, Edu or Enterprise plan, and the ChatGPT desktop app asks you to choose ChatGPT or Codex. The Codex CLI is also an open source project on GitHub under Apache-2.0. Checked 28 Oct 2026.

    +
    + +
    +

    Do I need ChatGPT Plus for Codex?

    +

    Not to try it. On 28 Oct 2026 OpenAI's pricing page listed Free at $0 and Go at $8 a month with GPT-6 Luna in the desktop app, subject to rollout. Plus at $20 a month (28 Oct 2026) is the first card that lists Codex on the web, in the CLI, in the IDE extension and on iOS. An API key works without a plan.

    +
    + +
    +

    Is Codex better than ChatGPT for coding?

    +

    For work inside a repository, yes. OpenAI's docs say to use Codex when you want to build, debug, test or review software and work directly with code and developer tools. ChatGPT Work can also run code and review it in the environment you select.

    +
    + +
    +

    What are the Codex usage limits on Plus?

    +

    OpenAI publishes estimates, not fixed limits. On 28 Oct 2026 its pricing page estimated 15 to 160 local messages per five hours on GPT-6.1 Sol and 350 to 3,000 on GPT-6 Luna for Plus, said weekly limits may also apply, and said Pro plans currently have no five hour limit.

    +
    + +
    +

    Can I use Codex without a ChatGPT account?

    +

    Yes, with an API key. OpenAI's pricing page says an API key gives you Codex in the CLI, SDK or IDE extension, billed at API pricing, with no cloud based features such as GitHub code review or Slack. Checked 28 Oct 2026.

    +
    + +
    + + + +
    + + +
    + + + + +
    + + +
    + +
    + + + + + + 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 837302c873..46556db7e3 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
    -

    Codex Alternatives: 7 Picks Beyond OpenAI's Agent (Oct 2026)

    -

    Seven Codex alternatives checked 26 Oct 2026: Claude Code, Munder Difflin, Copilot CLI, OpenCode, Goose, Cline and Cursor, with licences and prices.

    +

    ChatGPT Dots vs Claude Cowork: Plans, Price and Safety (Oct 2026)

    +

    ChatGPT Dots keeps an ongoing job moving; Claude Cowork hands back finished files. Plans, prices, where each runs and how each asks first, checked 28 Oct 2026.

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

    Pi Agent Alternatives: 7 Coding Agents to Try (Oct 2026)

    -

    Seven Pi agent alternatives checked 26 Oct 2026: OpenCode, Munder Difflin, Claude Code, Codex CLI, Hermes Agent, Goose and Crush, with licences and prices.

    +

    Codex vs ChatGPT: What Is the Difference? (Oct 2026)

    +

    Codex is OpenAI's coding agent and ChatGPT is its assistant. Which plans include Codex, the limits, where each runs and which to use, checked 28 Oct 2026.

    Comparisons - Read → + Read →
    diff --git a/docs/blog/codex-vs-cursor/index.html b/docs/blog/codex-vs-cursor/index.html index 67872d7170..026c5a124f 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
    -

    Codex Alternatives: 7 Picks Beyond OpenAI's Agent (Oct 2026)

    -

    Seven Codex alternatives checked 26 Oct 2026: Claude Code, Munder Difflin, Copilot CLI, OpenCode, Goose, Cline and Cursor, with licences and prices.

    +

    ChatGPT Dots vs Claude Cowork: Plans, Price and Safety (Oct 2026)

    +

    ChatGPT Dots keeps an ongoing job moving; Claude Cowork hands back finished files. Plans, prices, where each runs and how each asks first, checked 28 Oct 2026.

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

    Pi Agent Alternatives: 7 Coding Agents to Try (Oct 2026)

    -

    Seven Pi agent alternatives checked 26 Oct 2026: OpenCode, Munder Difflin, Claude Code, Codex CLI, Hermes Agent, Goose and Crush, with licences and prices.

    +

    Codex vs ChatGPT: What Is the Difference? (Oct 2026)

    +

    Codex is OpenAI's coding agent and ChatGPT is its assistant. Which plans include Codex, the limits, where each runs and which to use, checked 28 Oct 2026.

    Comparisons - Read → + Read →
    diff --git a/docs/blog/codex-vs-gemini-cli/index.html b/docs/blog/codex-vs-gemini-cli/index.html index 8c591970da..fce38bbb3c 100644 --- a/docs/blog/codex-vs-gemini-cli/index.html +++ b/docs/blog/codex-vs-gemini-cli/index.html @@ -331,50 +331,50 @@

    FAQ

    Related in Comparisons

    - +
    - + 5 min
    -

    Codex Alternatives: 7 Picks Beyond OpenAI's Agent (Oct 2026)

    -

    Seven Codex alternatives checked 26 Oct 2026: Claude Code, Munder Difflin, Copilot CLI, OpenCode, Goose, Cline and Cursor, with licences and prices.

    +

    ChatGPT Dots vs Claude Cowork: Plans, Price and Safety (Oct 2026)

    +

    ChatGPT Dots keeps an ongoing job moving; Claude Cowork hands back finished files. Plans, prices, where each runs and how each asks first, checked 28 Oct 2026.

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

    Pi Agent Alternatives: 7 Coding Agents to Try (Oct 2026)

    -

    Seven Pi agent alternatives checked 26 Oct 2026: OpenCode, Munder Difflin, Claude Code, Codex CLI, Hermes Agent, Goose and Crush, with licences and prices.

    +

    Codex vs ChatGPT: What Is the Difference? (Oct 2026)

    +

    Codex is OpenAI's coding agent and ChatGPT is its assistant. Which plans include Codex, the limits, where each runs and which to use, checked 28 Oct 2026.

    Comparisons - Read → + Read →
    diff --git a/docs/blog/conductor-claude-code-alternative/index.html b/docs/blog/conductor-claude-code-alternative/index.html index fd93f0b634..e2b66454a7 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
    -

    Codex Alternatives: 7 Picks Beyond OpenAI's Agent (Oct 2026)

    -

    Seven Codex alternatives checked 26 Oct 2026: Claude Code, Munder Difflin, Copilot CLI, OpenCode, Goose, Cline and Cursor, with licences and prices.

    +

    ChatGPT Dots vs Claude Cowork: Plans, Price and Safety (Oct 2026)

    +

    ChatGPT Dots keeps an ongoing job moving; Claude Cowork hands back finished files. Plans, prices, where each runs and how each asks first, checked 28 Oct 2026.

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

    Pi Agent Alternatives: 7 Coding Agents to Try (Oct 2026)

    -

    Seven Pi agent alternatives checked 26 Oct 2026: OpenCode, Munder Difflin, Claude Code, Codex CLI, Hermes Agent, Goose and Crush, with licences and prices.

    +

    Codex vs ChatGPT: What Is the Difference? (Oct 2026)

    +

    Codex is OpenAI's coding agent and ChatGPT is its assistant. Which plans include Codex, the limits, where each runs and which to use, checked 28 Oct 2026.

    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 42e302af39..ddcab86ffe 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
    -

    Codex Alternatives: 7 Picks Beyond OpenAI's Agent (Oct 2026)

    -

    Seven Codex alternatives checked 26 Oct 2026: Claude Code, Munder Difflin, Copilot CLI, OpenCode, Goose, Cline and Cursor, with licences and prices.

    +

    ChatGPT Dots vs Claude Cowork: Plans, Price and Safety (Oct 2026)

    +

    ChatGPT Dots keeps an ongoing job moving; Claude Cowork hands back finished files. Plans, prices, where each runs and how each asks first, checked 28 Oct 2026.

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

    Pi Agent Alternatives: 7 Coding Agents to Try (Oct 2026)

    -

    Seven Pi agent alternatives checked 26 Oct 2026: OpenCode, Munder Difflin, Claude Code, Codex CLI, Hermes Agent, Goose and Crush, with licences and prices.

    +

    Codex vs ChatGPT: What Is the Difference? (Oct 2026)

    +

    Codex is OpenAI's coding agent and ChatGPT is its assistant. Which plans include Codex, the limits, where each runs and which to use, checked 28 Oct 2026.

    Comparisons - Read → + Read →
    diff --git a/docs/blog/crystal-claude-code-alternative/index.html b/docs/blog/crystal-claude-code-alternative/index.html index ad3a4ad3d2..ed3c3d57fa 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
    -

    Codex Alternatives: 7 Picks Beyond OpenAI's Agent (Oct 2026)

    -

    Seven Codex alternatives checked 26 Oct 2026: Claude Code, Munder Difflin, Copilot CLI, OpenCode, Goose, Cline and Cursor, with licences and prices.

    +

    ChatGPT Dots vs Claude Cowork: Plans, Price and Safety (Oct 2026)

    +

    ChatGPT Dots keeps an ongoing job moving; Claude Cowork hands back finished files. Plans, prices, where each runs and how each asks first, checked 28 Oct 2026.

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

    Pi Agent Alternatives: 7 Coding Agents to Try (Oct 2026)

    -

    Seven Pi agent alternatives checked 26 Oct 2026: OpenCode, Munder Difflin, Claude Code, Codex CLI, Hermes Agent, Goose and Crush, with licences and prices.

    +

    Codex vs ChatGPT: What Is the Difference? (Oct 2026)

    +

    Codex is OpenAI's coding agent and ChatGPT is its assistant. Which plans include Codex, the limits, where each runs and which to use, checked 28 Oct 2026.

    Comparisons - Read → + Read →
    diff --git a/docs/blog/cursor-alternatives/index.html b/docs/blog/cursor-alternatives/index.html index 8ac37005bb..8deaacbe5f 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
    -

    Codex Alternatives: 7 Picks Beyond OpenAI's Agent (Oct 2026)

    -

    Seven Codex alternatives checked 26 Oct 2026: Claude Code, Munder Difflin, Copilot CLI, OpenCode, Goose, Cline and Cursor, with licences and prices.

    +

    ChatGPT Dots vs Claude Cowork: Plans, Price and Safety (Oct 2026)

    +

    ChatGPT Dots keeps an ongoing job moving; Claude Cowork hands back finished files. Plans, prices, where each runs and how each asks first, checked 28 Oct 2026.

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

    Pi Agent Alternatives: 7 Coding Agents to Try (Oct 2026)

    -

    Seven Pi agent alternatives checked 26 Oct 2026: OpenCode, Munder Difflin, Claude Code, Codex CLI, Hermes Agent, Goose and Crush, with licences and prices.

    +

    Codex vs ChatGPT: What Is the Difference? (Oct 2026)

    +

    Codex is OpenAI's coding agent and ChatGPT is its assistant. Which plans include Codex, the limits, where each runs and which to use, checked 28 Oct 2026.

    Comparisons - Read → + Read →
    diff --git a/docs/blog/cursor-vs-cline/index.html b/docs/blog/cursor-vs-cline/index.html index d85e9cdd03..f15d9bc663 100644 --- a/docs/blog/cursor-vs-cline/index.html +++ b/docs/blog/cursor-vs-cline/index.html @@ -327,50 +327,50 @@

    FAQ

    Related in Comparisons

    - +
    - + 5 min
    -

    Codex Alternatives: 7 Picks Beyond OpenAI's Agent (Oct 2026)

    -

    Seven Codex alternatives checked 26 Oct 2026: Claude Code, Munder Difflin, Copilot CLI, OpenCode, Goose, Cline and Cursor, with licences and prices.

    +

    ChatGPT Dots vs Claude Cowork: Plans, Price and Safety (Oct 2026)

    +

    ChatGPT Dots keeps an ongoing job moving; Claude Cowork hands back finished files. Plans, prices, where each runs and how each asks first, checked 28 Oct 2026.

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

    Pi Agent Alternatives: 7 Coding Agents to Try (Oct 2026)

    -

    Seven Pi agent alternatives checked 26 Oct 2026: OpenCode, Munder Difflin, Claude Code, Codex CLI, Hermes Agent, Goose and Crush, with licences and prices.

    +

    Codex vs ChatGPT: What Is the Difference? (Oct 2026)

    +

    Codex is OpenAI's coding agent and ChatGPT is its assistant. Which plans include Codex, the limits, where each runs and which to use, checked 28 Oct 2026.

    Comparisons - Read → + Read →
    diff --git a/docs/blog/feed.xml b/docs/blog/feed.xml index 2d4e0d4bc3..f311e9b416 100644 --- a/docs/blog/feed.xml +++ b/docs/blog/feed.xml @@ -4,9 +4,33 @@ Guides, comparisons and pricing for AI agents and coding tools such as Claude Code, Codex and Cursor, each checked and dated. From the makers of Munder Difflin. - 2026-10-27T00:00:00.000Z + 2026-10-28T00:00:00.000Z https://munderdiffl.in/blog/ Chaitanya Girihttps://munderdiffl.in + + Agent Tools Today, 28 Oct 2026: OpenCode 2.2, Entire, Hallmark + + https://munderdiffl.in/blog/agent-tools-today-2026-10-28/ + 2026-10-28T00:00:00.000Z + 2026-10-28T00:00:00.000Z + The top launches, skills, multi agent moves, rising repos and arguments in AI agents from 27 to 28 Oct 2026, each with its source and date. + + + ChatGPT Dots vs Claude Cowork: Plans, Price and Safety (Oct 2026) + + https://munderdiffl.in/blog/chatgpt-dots-vs-claude-cowork/ + 2026-10-28T00:00:00.000Z + 2026-10-28T00:00:00.000Z + ChatGPT Dots keeps an ongoing job moving; Claude Cowork hands back finished files. Plans, prices, where each runs and how each asks first, checked 28 Oct 2026. + + + Codex vs ChatGPT: What Is the Difference? (Oct 2026) + + https://munderdiffl.in/blog/codex-vs-chatgpt/ + 2026-10-28T00:00:00.000Z + 2026-10-28T00:00:00.000Z + Codex is OpenAI's coding agent and ChatGPT is its assistant. Which plans include Codex, the limits, where each runs and which to use, checked 28 Oct 2026. + GPT-6.1 Terra: Price, Specs and How to Use It in Codex (Oct 2026) @@ -463,28 +487,4 @@ 2026-10-09T00:00:00.000Z The top launches, skills and plugins, multi agent moves, rising repos and arguments in coding agents on 9 Oct 2026, each with its source. - - Agent Tools Today, 8 Oct 2026: Claude Haiku 5.5, GPT-6 Intelligent UI, Docker Agent - - https://munderdiffl.in/blog/agent-tools-today-2026-10-08/ - 2026-10-08T00:00:00.000Z - 2026-10-08T00:00:00.000Z - The top launches, skills and plugins, multi agent moves, rising repos and arguments in coding agents on 8 Oct 2026, each with its source. - - - Claude Code agent teams: what they are, how to use them - - https://munderdiffl.in/blog/claude-code-agent-teams/ - 2026-10-08T00:00:00.000Z - 2026-10-08T00:00:00.000Z - Claude Code agent teams, checked 8 Oct 2026: what they are, the experimental setting that turns them on, how they differ from subagents, token cost and limits. - - - Claude Haiku 5.5: price, benchmarks and where it fits - - https://munderdiffl.in/blog/claude-haiku-5-5/ - 2026-10-08T00:00:00.000Z - 2026-10-08T00:00:00.000Z - Claude Haiku 5.5 is Anthropic's new small model. Its tiered price, Anthropic's own scores and how to pick it in Claude Code, checked 8 Oct 2026. - 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 eb77f4a650..d2adea272b 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
    -

    Codex Alternatives: 7 Picks Beyond OpenAI's Agent (Oct 2026)

    -

    Seven Codex alternatives checked 26 Oct 2026: Claude Code, Munder Difflin, Copilot CLI, OpenCode, Goose, Cline and Cursor, with licences and prices.

    +

    ChatGPT Dots vs Claude Cowork: Plans, Price and Safety (Oct 2026)

    +

    ChatGPT Dots keeps an ongoing job moving; Claude Cowork hands back finished files. Plans, prices, where each runs and how each asks first, checked 28 Oct 2026.

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

    Pi Agent Alternatives: 7 Coding Agents to Try (Oct 2026)

    -

    Seven Pi agent alternatives checked 26 Oct 2026: OpenCode, Munder Difflin, Claude Code, Codex CLI, Hermes Agent, Goose and Crush, with licences and prices.

    +

    Codex vs ChatGPT: What Is the Difference? (Oct 2026)

    +

    Codex is OpenAI's coding agent and ChatGPT is its assistant. Which plans include Codex, the limits, where each runs and which to use, checked 28 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 4676efa429..5c40f0619e 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
    -

    Codex Alternatives: 7 Picks Beyond OpenAI's Agent (Oct 2026)

    -

    Seven Codex alternatives checked 26 Oct 2026: Claude Code, Munder Difflin, Copilot CLI, OpenCode, Goose, Cline and Cursor, with licences and prices.

    +

    ChatGPT Dots vs Claude Cowork: Plans, Price and Safety (Oct 2026)

    +

    ChatGPT Dots keeps an ongoing job moving; Claude Cowork hands back finished files. Plans, prices, where each runs and how each asks first, checked 28 Oct 2026.

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

    Pi Agent Alternatives: 7 Coding Agents to Try (Oct 2026)

    -

    Seven Pi agent alternatives checked 26 Oct 2026: OpenCode, Munder Difflin, Claude Code, Codex CLI, Hermes Agent, Goose and Crush, with licences and prices.

    +

    Codex vs ChatGPT: What Is the Difference? (Oct 2026)

    +

    Codex is OpenAI's coding agent and ChatGPT is its assistant. Which plans include Codex, the limits, where each runs and which to use, checked 28 Oct 2026.

    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 4f755b5868..09d647cf19 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
    -

    Codex Alternatives: 7 Picks Beyond OpenAI's Agent (Oct 2026)

    -

    Seven Codex alternatives checked 26 Oct 2026: Claude Code, Munder Difflin, Copilot CLI, OpenCode, Goose, Cline and Cursor, with licences and prices.

    +

    ChatGPT Dots vs Claude Cowork: Plans, Price and Safety (Oct 2026)

    +

    ChatGPT Dots keeps an ongoing job moving; Claude Cowork hands back finished files. Plans, prices, where each runs and how each asks first, checked 28 Oct 2026.

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

    Pi Agent Alternatives: 7 Coding Agents to Try (Oct 2026)

    -

    Seven Pi agent alternatives checked 26 Oct 2026: OpenCode, Munder Difflin, Claude Code, Codex CLI, Hermes Agent, Goose and Crush, with licences and prices.

    +

    Codex vs ChatGPT: What Is the Difference? (Oct 2026)

    +

    Codex is OpenAI's coding agent and ChatGPT is its assistant. Which plans include Codex, the limits, where each runs and which to use, checked 28 Oct 2026.

    Comparisons - Read → + Read →
    diff --git a/docs/blog/gpt-6-1-terra/index.html b/docs/blog/gpt-6-1-terra/index.html index 8417454557..e7c2445c1a 100644 --- a/docs/blog/gpt-6-1-terra/index.html +++ b/docs/blog/gpt-6-1-terra/index.html @@ -378,7 +378,7 @@

    FAQ

Is Codex the same as ChatGPT?

No: ChatGPT is OpenAI’s assistant, and Codex is the coding agent that ships with it. They share your account and the desktop app, and the pricing page says ChatGPT Work uses the same pricing, credits and usage limits as Codex. The difference is the job. ChatGPT answers in a conversation; Codex changes files in a repository. With an API key you can run the CLI without any ChatGPT plan.

+

The full comparison: Codex vs ChatGPT.

How does Codex compare with Claude Code?

Codex and Claude Code do the same job; our view is that the plan you already pay for usually decides. Codex’s CLI is open source under Apache-2.0 and the Free plan lists Codex in the desktop app. Claude Code is Anthropic’s agent and, per Anthropic’s memory docs, reads CLAUDE.md files and can read AGENTS.md too. We think neither wins for every repo. Our Codex vs Claude Code comparison has a dated table, and Codex vs Cursor covers the editor side. For seven other agents, see Codex alternatives.

diff --git a/docs/llms.txt b/docs/llms.txt index ceedc522c8..bb325e3915 100644 --- a/docs/llms.txt +++ b/docs/llms.txt @@ -68,7 +68,7 @@ Saturday 24 October 2026. ## Blog -254 posts, grouped by topic, newest first in each topic. Topic hubs: https://munderdiffl.in/blog/topics/ +257 posts, grouped by topic, newest first in each topic. Topic hubs: https://munderdiffl.in/blog/topics/ ### guides @@ -198,6 +198,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. +- [ChatGPT Dots vs Claude Cowork: Plans, Price and Safety (Oct 2026)](https://munderdiffl.in/blog/chatgpt-dots-vs-claude-cowork/): ChatGPT Dots keeps an ongoing job moving; Claude Cowork hands back finished files. Plans, prices, where each runs and how each asks first, checked 28 Oct 2026. +- [Codex vs ChatGPT: What Is the Difference? (Oct 2026)](https://munderdiffl.in/blog/codex-vs-chatgpt/): Codex is OpenAI's coding agent and ChatGPT is its assistant. Which plans include Codex, the limits, where each runs and which to use, checked 28 Oct 2026. - [Codex Alternatives: 7 Picks Beyond OpenAI's Agent (Oct 2026)](https://munderdiffl.in/blog/codex-alternatives/): Seven Codex alternatives checked 26 Oct 2026: Claude Code, Munder Difflin, Copilot CLI, OpenCode, Goose, Cline and Cursor, with licences and prices. - [Pi Agent Alternatives: 7 Coding Agents to Try (Oct 2026)](https://munderdiffl.in/blog/pi-agent-alternatives/): Seven Pi agent alternatives checked 26 Oct 2026: OpenCode, Munder Difflin, Claude Code, Codex CLI, Hermes Agent, Goose and Crush, with licences and prices. - [Open Source AI Agent Office Apps on GitHub (Oct 2026)](https://munderdiffl.in/blog/ai-agent-office-github/): Open source AI agent office apps on GitHub, checked 23 Oct 2026: ChatDev, Munder Difflin, OpenHands, CrewAI, AG2 and three more, with licences. @@ -253,6 +255,7 @@ Saturday 24 October 2026. ### news +- [Agent Tools Today, 28 Oct 2026: OpenCode 2.2, Entire, Hallmark](https://munderdiffl.in/blog/agent-tools-today-2026-10-28/): The top launches, skills, multi agent moves, rising repos and arguments in AI agents from 27 to 28 Oct 2026, each with its source and date. - [Agent Tools Today, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, ThinkRail](https://munderdiffl.in/blog/agent-tools-today-2026-10-26/): The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents from 23 to 26 Oct 2026, each with its source. - [Agent Tools Today, 23 Oct 2026: Claude Duet, OpenAI CLI, Nvidia OpenShell](https://munderdiffl.in/blog/agent-tools-today-2026-10-23/): The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 23 Oct 2026, each with its source. - [Black October: What PHP2Shell Is and How to Patch (Oct 2026)](https://munderdiffl.in/blog/black-october-php2shell/): Black October is the scramble around PHP2Shell, two critical PHP flaws fixed on 21 Oct 2026. Who found them, the fixed versions and how to patch. diff --git a/docs/sitemap.xml b/docs/sitemap.xml index f3eeda71c1..5ea266585a 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -10,7 +10,7 @@ https://munderdiffl.in/ - 2026-10-27 + 2026-10-28 weekly 1.0 @@ -24,6 +24,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-28/ + 2026-10-28 + monthly + 0.8 + + + https://munderdiffl.in/blog/chatgpt-dots-vs-claude-cowork/ + 2026-10-28 + monthly + 0.8 + + + https://munderdiffl.in/blog/codex-vs-chatgpt/ + 2026-10-28 + monthly + 0.8 + https://munderdiffl.in/blog/gpt-6-1-terra/ 2026-10-27