diff --git a/blog/src/_data/media.json b/blog/src/_data/media.json index 1f77259780..5e54cbf83c 100644 --- a/blog/src/_data/media.json +++ b/blog/src/_data/media.json @@ -4556,12 +4556,45 @@ "inline": {}, "youtube": [] }, + "how-to-run-mistral-large-4": { + "title": "How to Run Mistral Large 4 Locally: Hardware, GGUF Sizes and vLLM (Oct 2026)", + "category": "guides", + "hero": { + "file": "assets/media/how-to-run-mistral-large-4/hero.png", + "alt": "Title card on white. Run Mistral Large 4 in large ink type with the line From 256 GB of memory, three suitcases tagged 233 GB, 378 GB and 605 GB, and Checked 29 Oct 2026", + "prompt": "Still of the hero scene in assets/media/how-to-run-mistral-large-4/motion.js.", + "status": "ready" + }, + "inline": {} + }, + "mistral-large-4-vs-claude-opus-5-5": { + "title": "Mistral Large 4 vs Claude Opus 5.5: Price, Coding Scores and Open Weights (Oct 2026)", + "category": "comparisons", + "hero": { + "file": "assets/media/mistral-large-4-vs-claude-opus-5-5/hero.png", + "alt": "Title card on white. Mistral Large 4 vs Claude Opus 5.5 in large ink type with the line Open weights or top scores, two taxi meters reading $2.10 and $20, and Checked 29 Oct 2026", + "prompt": "Still of the hero scene in assets/media/mistral-large-4-vs-claude-opus-5-5/motion.js.", + "status": "ready" + }, + "inline": {} + }, + "what-is-kimi-k3-1-pro": { + "title": "What Is Kimi K3.1 Pro? Price, Weights and How to Use It for Coding (Oct 2026)", + "category": "concepts", + "hero": { + "file": "assets/media/what-is-kimi-k3-1-pro/hero.png", + "alt": "Title card on white. Kimi K3.1 Pro in large ink type with the line 1M context, weights by 4 Nov, three high jump bars, and Checked 29 Oct 2026", + "prompt": "Still of the hero scene in assets/media/what-is-kimi-k3-1-pro/motion.js.", + "status": "ready" + }, + "inline": {} + }, "mistral-large-4": { "title": "Mistral Large 4 (Le Chonk): size, price, scores and weights", "category": "concepts", "hero": { "file": "assets/media/mistral-large-4/hero.png", - "alt": "Title card on white. Mistral Large 4 in large ink type with a lilac kettlebell labelled Le Chonk and the line Checked 6 Oct 2026", + "alt": "Title card on white. Mistral Large 4 in large ink type with a lilac kettlebell labelled Le Chonk and the line Checked 29 Oct 2026", "prompt": "Still of the hero scene in assets/media/mistral-large-4/motion.js.", "status": "ready" }, diff --git a/blog/src/assets/media/how-to-run-mistral-large-4/hero.png b/blog/src/assets/media/how-to-run-mistral-large-4/hero.png new file mode 100644 index 0000000000..1bbb950be3 Binary files /dev/null and b/blog/src/assets/media/how-to-run-mistral-large-4/hero.png differ diff --git a/blog/src/assets/media/how-to-run-mistral-large-4/luggage.png b/blog/src/assets/media/how-to-run-mistral-large-4/luggage.png new file mode 100644 index 0000000000..c300712392 Binary files /dev/null and b/blog/src/assets/media/how-to-run-mistral-large-4/luggage.png differ diff --git a/blog/src/assets/media/how-to-run-mistral-large-4/motion.css b/blog/src/assets/media/how-to-run-mistral-large-4/motion.css new file mode 100644 index 0000000000..05f29fc464 --- /dev/null +++ b/blog/src/assets/media/how-to-run-mistral-large-4/motion.css @@ -0,0 +1,13 @@ +/* Bright coded scenes for "How to run Mistral Large 4". 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/how-to-run-mistral-large-4/motion.js b/blog/src/assets/media/how-to-run-mistral-large-4/motion.js new file mode 100644 index 0000000000..a7e5f402d2 --- /dev/null +++ b/blog/src/assets/media/how-to-run-mistral-large-4/motion.js @@ -0,0 +1,238 @@ +/* Bright coded scenes for "How to run Mistral Large 4". Vanilla JS, no library. +
holds a still image; this script swaps in a live SVG. + Plays only in view, honours reduced motion, "?mgstill" freezes each scene on its still frame. */ +(() => { + const NS = "http://www.w3.org/2000/svg"; + const INK = "#1A1320", YEL = "#FFCA54", BLUE = "#6C8EF5", LIL = "#B69CFF", MINT = "#7FD8AE", SKY = "#9AD8FF", SOFT = "#F1ECF9", MUTE = "#7A6A88"; + const SANS = '"Space Grotesk", system-ui, sans-serif', MONO = '"JetBrains Mono", ui-monospace, monospace'; + const el = (t, a = {}, p) => { const n = document.createElementNS(NS, t); for (const k in a) n.setAttribute(k, a[k]); if (p) p.appendChild(n); return n; }; + const txt = (p, x, y, s, a = {}) => { const n = el("text", Object.assign({ x, y, "font-family": SANS, "font-size": 24, "font-weight": 600, fill: INK }, a), p); n.textContent = s; return n; }; + const cl = (v, a = 0, b = 1) => Math.max(a, Math.min(b, v)); + const seg = (t, a, b) => cl((t - a) / (b - a)); + const oc = (x) => 1 - Math.pow(1 - x, 3); + const ob = (x) => { const c = 1.70158; return 1 + (c + 1) * Math.pow(x - 1, 3) + c * Math.pow(x - 1, 2); }; + const io = (x) => (x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2); + const tf = (n, x, y, s = 1, r = 0) => n.setAttribute("transform", `translate(${x} ${y}) rotate(${r}) scale(${s})`); + const button = (g, label, fn) => { + g.setAttribute("role", "button"); g.setAttribute("tabindex", "0"); g.setAttribute("aria-label", label); g.classList.add("mg-hit"); + g.addEventListener("click", fn); + g.addEventListener("keydown", (e) => { if (e.key === "Enter" || e.key === " ") { e.preventDefault(); fn(); } }); + }; + const strip = (svg, y, w = 680) => { + el("rect", { x: (800 - w) / 2, y, width: w, height: 48, rx: 24, fill: SOFT }, svg); + return txt(svg, 400, y + 31, "", { "text-anchor": "middle", "font-size": 20, "font-weight": 500 }); + }; + + + const SC = {}; + + /* ---- shared suitcase, drawn with its bottom centre at 0,0 ---- */ + const suitcase = (g, w, h, col, tag) => { + el("path", { d: `M-14 ${-h} V${-h - 10} H14 V${-h}`, stroke: INK, "stroke-width": 3, fill: "none", "stroke-linejoin": "round" }, g); + el("rect", { x: -w / 2, y: -h, width: w, height: h, rx: 10, fill: col, stroke: INK, "stroke-width": 3 }, g); + [-0.27, 0.27].forEach((f) => el("path", { d: `M${w * f} ${-h + 3} V-3`, stroke: INK, "stroke-width": 2 }, g)); + const tw = tag.length * 8.4 + 18; + el("path", { d: `M0 ${-h - 10} V${-h - 32}`, stroke: INK, "stroke-width": 2 }, g); + const tg = el("rect", { x: -tw / 2, y: -h - 58, width: tw, height: 26, rx: 6, fill: "#fff", stroke: INK, "stroke-width": 2 }, g); + txt(g, 0, -h - 40, tag, { "text-anchor": "middle", "font-family": MONO, "font-size": 14, "font-weight": 700 }); + return { tg, tw }; + }; + + /* ---- 1. five suitcases on a carousel, one shelf of memory ---- */ + SC.luggage = { + dur: 10, still: 10, + build(svg, api) { + const TAG = ["233 GB 1 bit", "378 GB 2 bit", "605 GB 4 bit", "1.1 TB 8 bit", "2.1 TB full"]; + const SZ = ["233 GB", "378 GB", "605 GB", "1.1 TB", "2.1 TB"]; + const W = [64, 80, 100, 128, 160], H = [46, 58, 72, 90, 110], X = [715, 592, 455, 300, 125], COL = [YEL, SKY, LIL, BLUE, YEL]; + const BY = 470, SX = 400, SY = 230; + /* shelf: two side posts 76 apart, so only the smallest case fits between them */ + const glow = el("rect", { x: SX - 38, y: SY - 72, width: 76, height: 72, fill: MINT, opacity: 0 }, svg); + [-40, 40].forEach((d) => el("rect", { x: SX + d - 4, y: SY - 76, width: 8, height: 76, rx: 3, fill: "#fff", stroke: INK, "stroke-width": 2.5 }, svg)); + el("rect", { x: SX - 80, y: SY, width: 160, height: 12, rx: 4, fill: BLUE, stroke: INK, "stroke-width": 3 }, svg); + txt(svg, SX, SY + 40, "256 GB memory", { "text-anchor": "middle", "font-family": MONO, "font-size": 20, "font-weight": 700 }); + /* the carousel */ + el("rect", { x: 30, y: BY, width: 740, height: 24, rx: 12, fill: SOFT, stroke: INK, "stroke-width": 3 }, svg); + const slats = el("path", { d: `M44 ${BY + 12} H756`, stroke: MUTE, "stroke-width": 12, "stroke-dasharray": "2 38" }, svg); + for (let x = 70; x <= 730; x += 110) el("circle", { cx: x, cy: BY + 34, r: 8, fill: "#fff", stroke: INK, "stroke-width": 2.5 }, svg); + let pinned = -1; + const cases = W.map((w, i) => { + const g = el("g", {}, svg), rw = Math.max(w, TAG[i].length * 8.4 + 18) + 16; + el("rect", { x: -rw / 2, y: -H[i] - 66, width: rw, height: H[i] + 74, rx: 14, fill: "#fff", "fill-opacity": 0, class: "mg-ring", stroke: INK, "stroke-width": 2, "stroke-dasharray": "4 6" }, g); + const s = suitcase(g, w, H[i], COL[i], TAG[i]); + button(g, `${TAG[i]}: Needs more than ${SZ[i]} of memory`, () => { pinned = i; api.poke(); }); + return Object.assign({ g }, s); + }); + const bar = el("g", {}, svg); + el("rect", { x: 160, y: 532, width: 480, height: 48, rx: 24, fill: SOFT }, bar); + const line = txt(bar, 400, 563, "", { "text-anchor": "middle", "font-size": 21, "font-weight": 600 }); + const LIFT = [2.6, 3.8], HOP = (i) => 4.3 + (i - 1) * 0.8; + return (t) => { + const ride = io(seg(t, 0.3, 2.4)), back = 900 * (1 - ride); + slats.setAttribute("stroke-dashoffset", -900 * ride); + let auto = -1; + cases.forEach((c, i) => { + let x = X[i] - back, y = BY, r = 0; + if (i === 0) { + const k = io(seg(t, LIFT[0], LIFT[1])); + x = X[0] + (SX - X[0]) * k; y = BY + (SY - BY) * k - Math.sin(k * Math.PI) * 60; + if (t >= LIFT[0]) auto = 0; + } else { + const h = seg(t, HOP(i), HOP(i) + 0.7), up = Math.sin(h * Math.PI); + x += (SX - X[i]) * 0.18 * up; y -= 44 * up; r = Math.sin(h * Math.PI * 4) * 5 * up; + if (h > 0 && h < 1) auto = i; + } + tf(c.g, x, y, 1, r); + }); + if (t >= 7.6) auto = 0; + glow.setAttribute("opacity", seg(t, LIFT[1] - 0.2, LIFT[1] + 0.2)); + const show = pinned >= 0 ? pinned : auto; + cases.forEach((c, i) => c.tg.setAttribute("fill", i === show ? YEL : "#fff")); + line.textContent = show < 0 ? "" : `Needs more than ${SZ[show]} of memory`; + bar.setAttribute("opacity", show < 0 ? 0 : 1); + }; + }, + }; + + /* ---- 2. one loaf, eight cups ---- */ + SC.tin = { + dur: 9, still: 9, + build(svg, api) { + const LY = 96, LH = 84, CY = 330, CH = 100, cx = (i) => 68 + i * 84, FULL = 84, SMALL = 84 * 76 / 128; + txt(svg, 400, 74, "Mistral Large 4", { "text-anchor": "middle", "font-family": MONO, "font-size": 26, "font-weight": 700 }); + el("rect", { x: 66, y: LY - 2, width: 668, height: LH + 4, rx: 38, fill: "none", stroke: MUTE, "stroke-width": 2, "stroke-dasharray": "4 8" }, svg); + const loaf = el("rect", { x: 68, y: LY, width: 664, height: LH, rx: 36, fill: YEL, stroke: INK, "stroke-width": 3 }, svg); + const cuts = Array.from({ length: 7 }, (_, i) => el("path", { d: `M${cx(i + 1) - 2} ${LY - 12} V${LY + LH + 12}`, stroke: INK, "stroke-width": 3, "stroke-linecap": "round" }, svg)); + el("rect", { x: 56, y: CY - 14, width: 688, height: CH + 26, rx: 16, fill: SKY, stroke: INK, "stroke-width": 3 }, svg); + for (let i = 0; i < 8; i++) { + el("rect", { x: cx(i), y: CY, width: 80, height: CH, rx: 10, fill: "#fff", stroke: INK, "stroke-width": 2.5 }, svg); + txt(svg, cx(i) + 40, CY + CH + 52, `GPU ${i + 1}`, { "text-anchor": "middle", "font-family": MONO, "font-size": 17, "font-weight": 700 }); + } + const slices = Array.from({ length: 8 }, (_, i) => el("rect", { x: cx(i) + 4, width: 72, rx: i === 0 || i === 7 ? 18 : 8, fill: YEL, stroke: INK, "stroke-width": 3 }, svg)); + const sw = el("g", {}, svg), SWX = 214, SWY = 508; + el("rect", { x: SWX - 10, y: SWY - 10, width: 392, height: 60, rx: 30, fill: "#fff", "fill-opacity": 0, class: "mg-ring", stroke: INK, "stroke-width": 2, "stroke-dasharray": "4 6" }, sw); + const track = el("rect", { x: SWX, y: SWY, width: 76, height: 40, rx: 20, fill: SOFT, stroke: INK, "stroke-width": 3 }, sw); + const knob = el("circle", { cy: SWY + 20, r: 14, fill: "#fff", stroke: INK, "stroke-width": 3 }, sw); + const lab = txt(sw, SWX + 96, SWY + 29, "", { "font-size": 25, "font-weight": 700 }); + let user = null, from = 0, at = 0; + const cur = (t, now) => user == null ? io(seg(t, 5.2, 5.8)) : from + (user - from) * io(seg(now - at, 0, 0.6)); + let last = 0, lastT = 0; + button(sw, "FP8 or NVFP4", () => { from = last; user = last > 0.5 ? 0 : 1; at = api.now(); if (lastT < 4.6) api.seek(4.6); else api.poke(); }); + sw.setAttribute("role", "switch"); + return (t, now) => { + const v = cur(t, now); last = v; lastT = t; + const cut = seg(t, 0.5, 1.8), sliced = t >= 2; + loaf.setAttribute("opacity", sliced ? 0 : 1); + cuts.forEach((c, i) => c.setAttribute("opacity", !sliced && cut * 7 > i ? 1 : 0)); + const hh = FULL + (SMALL - FULL) * v; + slices.forEach((s, i) => { + const d = seg(t, 2.1 + i * 0.26, 2.1 + i * 0.26 + 0.55), k = d < 0.75 ? Math.pow(d / 0.75, 2) : 1 - Math.sin((d - 0.75) / 0.25 * Math.PI) * 0.06; + const landed = d >= 1, h = landed ? hh : FULL; + const yTop = LY + (CY + CH - 4 - FULL - LY) * k; + s.setAttribute("y", landed ? CY + CH - 4 - h : yTop); s.setAttribute("height", h); + s.setAttribute("opacity", sliced ? 1 : 0); + }); + const on = v > 0.5; + knob.setAttribute("cx", SWX + 20 + 36 * v); + track.setAttribute("fill", on ? BLUE : SOFT); + lab.textContent = on ? "NVFP4, 76 GiB a cup" : "FP8, 128 GiB a cup"; + sw.setAttribute("aria-checked", on ? "true" : "false"); + sw.setAttribute("aria-label", on ? "NVFP4, 76 GiB a cup" : "FP8, 128 GiB a cup"); + }; + }, + }; + + /* ---- 3. the licence as a signpost ---- */ + SC.signpost = { + dur: 8, still: 8, + build(svg, api) { + const PX = 320, GY = 522, AH = 46; + const ARMS = [["Use", 1, 140], ["Modify", -1, 205], ["Fine tune", 1, 270], ["Sell", -1, 335], ["Model as a Service", 1, 400]]; + el("ellipse", { cx: PX, cy: GY + 4, rx: 170, ry: 14, fill: SOFT }, svg); + const post = el("g", {}, svg); + el("rect", { x: PX - 40, y: 92, width: 80, height: GY - 92 + 12, rx: 16, fill: "#fff", "fill-opacity": 0, class: "mg-ring", stroke: INK, "stroke-width": 2, "stroke-dasharray": "4 6" }, post); + el("rect", { x: PX - 12, y: 104, width: 24, height: GY - 104, rx: 6, fill: YEL, stroke: INK, "stroke-width": 3 }, post); + button(post, "Swing the arms out again", () => api.seek(1.2)); + const arms = ARMS.map(([word, s, y], i) => { + const g = el("g", {}, svg), last = i === 4, base = PX + 12 * s; + const path = el("path", { fill: last ? LIL : YEL, stroke: INK, "stroke-width": 3, "stroke-linejoin": "round" }, g); + const t0 = last ? 22 : 54, label = txt(g, base + s * t0, y + 8, word, { "text-anchor": s > 0 ? "start" : "end", "font-size": 24, "font-weight": 700 }); + const L = t0 + label.getComputedTextLength() + 40; + path.setAttribute("d", `M${base} ${y - AH / 2} H${base + s * (L - 22)} L${base + s * L} ${y} L${base + s * (L - 22)} ${y + AH / 2} H${base} Z`); + let tick = null; + if (!last) { tick = el("g", {}, g); el("circle", { r: 13, fill: MINT, stroke: INK, "stroke-width": 2.5 }, tick); el("path", { d: "M-6 0 L-2 5 L6 -5", stroke: INK, "stroke-width": 3, fill: "none", "stroke-linecap": "round", "stroke-linejoin": "round" }, tick); } + return { g, s, y, tick, tx: base + s * 28, L, start: last ? 3.4 : 1.4 + i * 0.45 }; + }); + const maas = arms[4], nx = PX + 40; + const note = el("g", {}, svg); + el("path", { d: `M${nx + 110} ${maas.y + AH / 2} V${maas.y + 50}`, stroke: INK, "stroke-width": 2 }, note); + const nt = txt(note, nx + 16, maas.y + 78, "Separate licence from Mistral", { "font-size": 19, "font-weight": 600 }); + const nw = nt.getComputedTextLength() + 32; + const card = el("rect", { x: nx, y: maas.y + 50, width: nw, height: 40, rx: 10, fill: SOFT, stroke: INK, "stroke-width": 2 }, note); + note.insertBefore(card, nt); + return (t) => { + const r = ob(seg(t, 0.2, 1.2)); + post.setAttribute("transform", `translate(0 ${GY}) scale(1 ${cl(r, 0, 1.08)}) translate(0 ${-GY})`); + arms.forEach((a) => { + const p = seg(t, a.start, a.start + 0.6), k = ob(p); + a.g.setAttribute("transform", `rotate(${a.s * 80 * (1 - k)} ${PX} ${a.y})`); + a.g.setAttribute("opacity", p > 0 ? 1 : 0); + if (a.tick) tf(a.tick, a.tx, a.y, ob(seg(t, a.start + 0.45, a.start + 0.8))); + }); + const n = oc(seg(t, 4.3, 4.9)); + note.setAttribute("opacity", n); note.setAttribute("transform", `translate(0 ${-18 * (1 - n)})`); + }; + }, + }; + + /* ---- title card, 16 by 9 ---- */ + SC.hero = { + w: 960, h: 540, dur: 1, still: 0, + build(svg) { + el("rect", { x: 64, y: 70, width: 104, height: 38, rx: 19, fill: SOFT, stroke: INK, "stroke-width": 2 }, svg); + txt(svg, 116, 96, "Guides", { "text-anchor": "middle", "font-size": 19, "font-weight": 700 }); + txt(svg, 64, 210, "Run Mistral", { "font-size": 72, "font-weight": 700 }); + txt(svg, 64, 292, "Large 4", { "font-size": 72, "font-weight": 700 }); + el("path", { d: "M66 318 H330", stroke: YEL, "stroke-width": 14, "stroke-linecap": "round" }, svg); + txt(svg, 64, 376, "From 256 GB of memory", { "font-size": 30, "font-weight": 500, fill: MUTE }); + txt(svg, 64, 470, "Checked 29 Oct 2026", { "font-size": 18, "font-weight": 500, fill: "#6B5878" }); + const BY = 440; + el("rect", { x: 540, y: BY, width: 380, height: 22, rx: 11, fill: SOFT, stroke: INK, "stroke-width": 3 }, svg); + el("path", { d: `M552 ${BY + 11} H908`, stroke: MUTE, "stroke-width": 10, "stroke-dasharray": "2 34" }, svg); + for (let x = 572; x <= 900; x += 82) el("circle", { cx: x, cy: BY + 31, r: 7, fill: "#fff", stroke: INK, "stroke-width": 2.5 }, svg); + [[600, 80, 58, YEL, "233 GB"], [712, 100, 74, SKY, "378 GB"], [846, 124, 94, LIL, "605 GB"]].forEach(([x, w, h, c, s]) => { const g = el("g", {}, svg); suitcase(g, w, h, c, s); tf(g, x, BY); }); + return () => {}; + }, + }; + + /* ---- player ---- */ + const q = new URLSearchParams(location.search), frozen = q.has("mgstill"), fixed = parseFloat(q.get("mgstill")); + const calm = matchMedia("(prefers-reduced-motion: reduce)").matches; + const mount = (fig) => { + const sc = SC[fig.dataset.scene], img = fig.querySelector("img"); if (!sc || !img) return; + const W = sc.w || 800, H = sc.h || 600; + const svg = el("svg", { viewBox: `0 0 ${W} ${H}`, class: "mg-svg", role: "group", "aria-label": img.alt || "" }); + svg.style.aspectRatio = `${W} / ${H}`; + el("rect", { width: W, height: H, fill: "#fff" }, svg); + img.replaceWith(svg); + let off = 0, raf = 0, seen = false, held = calm; + const base = performance.now(), clock = () => (performance.now() - base) / 1000; + let draw = () => {}; + const frame = () => { const now = clock(); draw(held ? sc.still : (((now + off) % sc.dur) + sc.dur) % sc.dur, now); }; + const tick = () => { cancelAnimationFrame(raf); frame(); if (seen && !held) raf = requestAnimationFrame(tick); }; + const api = { now: clock, seek: (s) => { off = s - clock(); held = false; tick(); }, poke: () => { held = false; tick(); } }; + draw = sc.build(svg, api); + if (frozen) { draw(isNaN(fixed) ? sc.still : fixed, 0); return; } + new IntersectionObserver(([e]) => { + seen = e.isIntersecting; + if (seen) { tick(); if (!fig.dataset.sent && window.posthog) { fig.dataset.sent = 1; window.posthog.capture("blog_scene_view", { slug: location.pathname.split("/").filter(Boolean).pop(), scene: fig.dataset.scene }); } } + else cancelAnimationFrame(raf); + }, { threshold: 0.25 }).observe(fig); + svg.addEventListener("click", () => { if (!fig.dataset.hit && window.posthog) { fig.dataset.hit = 1; window.posthog.capture("blog_scene_interact", { slug: location.pathname.split("/").filter(Boolean).pop(), scene: fig.dataset.scene }); } }); + frame(); + }; + const go = () => document.querySelectorAll("figure.mg[data-scene]").forEach(mount); + const fonts = document.fonts && document.fonts.load ? Promise.all([document.fonts.load('700 32px "Space Grotesk"'), document.fonts.load('500 20px "Space Grotesk"'), document.fonts.load('700 20px "JetBrains Mono"')]).catch(() => {}) : Promise.resolve(); + const start = () => fonts.then(go, go); + if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", start); else start(); +})(); diff --git a/blog/src/assets/media/how-to-run-mistral-large-4/signpost.png b/blog/src/assets/media/how-to-run-mistral-large-4/signpost.png new file mode 100644 index 0000000000..ea4b0fc1e6 Binary files /dev/null and b/blog/src/assets/media/how-to-run-mistral-large-4/signpost.png differ diff --git a/blog/src/assets/media/how-to-run-mistral-large-4/tin.png b/blog/src/assets/media/how-to-run-mistral-large-4/tin.png new file mode 100644 index 0000000000..d623ea4f5c Binary files /dev/null and b/blog/src/assets/media/how-to-run-mistral-large-4/tin.png differ diff --git a/blog/src/assets/media/mistral-large-4-vs-claude-opus-5-5/hero.png b/blog/src/assets/media/mistral-large-4-vs-claude-opus-5-5/hero.png new file mode 100644 index 0000000000..cc05e34094 Binary files /dev/null and b/blog/src/assets/media/mistral-large-4-vs-claude-opus-5-5/hero.png differ diff --git a/blog/src/assets/media/mistral-large-4-vs-claude-opus-5-5/library.png b/blog/src/assets/media/mistral-large-4-vs-claude-opus-5-5/library.png new file mode 100644 index 0000000000..f3b835aaa8 Binary files /dev/null and b/blog/src/assets/media/mistral-large-4-vs-claude-opus-5-5/library.png differ diff --git a/blog/src/assets/media/mistral-large-4-vs-claude-opus-5-5/meter.png b/blog/src/assets/media/mistral-large-4-vs-claude-opus-5-5/meter.png new file mode 100644 index 0000000000..a486a741c3 Binary files /dev/null and b/blog/src/assets/media/mistral-large-4-vs-claude-opus-5-5/meter.png differ diff --git a/blog/src/assets/media/mistral-large-4-vs-claude-opus-5-5/motion.css b/blog/src/assets/media/mistral-large-4-vs-claude-opus-5-5/motion.css new file mode 100644 index 0000000000..cf1f22d5a9 --- /dev/null +++ b/blog/src/assets/media/mistral-large-4-vs-claude-opus-5-5/motion.css @@ -0,0 +1,13 @@ +/* Bright coded scenes for "Mistral Large 4 vs Claude Opus 5.5". 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/mistral-large-4-vs-claude-opus-5-5/motion.js b/blog/src/assets/media/mistral-large-4-vs-claude-opus-5-5/motion.js new file mode 100644 index 0000000000..4a88c828ac --- /dev/null +++ b/blog/src/assets/media/mistral-large-4-vs-claude-opus-5-5/motion.js @@ -0,0 +1,246 @@ +/* Bright coded scenes for "Mistral Large 4 vs Claude Opus 5.5". Vanilla JS, no library. +
holds a still image; this script swaps in a live SVG. + Plays only in view, honours reduced motion, "?mgstill" freezes each scene on its still frame. */ +(() => { + const NS = "http://www.w3.org/2000/svg"; + const INK = "#1A1320", YEL = "#FFCA54", BLUE = "#6C8EF5", LIL = "#B69CFF", MINT = "#7FD8AE", SKY = "#9AD8FF", SOFT = "#F1ECF9", MUTE = "#7A6A88"; + const SANS = '"Space Grotesk", system-ui, sans-serif', MONO = '"JetBrains Mono", ui-monospace, monospace'; + const el = (t, a = {}, p) => { const n = document.createElementNS(NS, t); for (const k in a) n.setAttribute(k, a[k]); if (p) p.appendChild(n); return n; }; + const txt = (p, x, y, s, a = {}) => { const n = el("text", Object.assign({ x, y, "font-family": SANS, "font-size": 24, "font-weight": 600, fill: INK }, a), p); n.textContent = s; return n; }; + const cl = (v, a = 0, b = 1) => Math.max(a, Math.min(b, v)); + const seg = (t, a, b) => cl((t - a) / (b - a)); + const oc = (x) => 1 - Math.pow(1 - x, 3); + const ob = (x) => { const c = 1.70158; return 1 + (c + 1) * Math.pow(x - 1, 3) + c * Math.pow(x - 1, 2); }; + const io = (x) => (x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2); + const tf = (n, x, y, s = 1, r = 0) => n.setAttribute("transform", `translate(${x} ${y}) rotate(${r}) scale(${s})`); + const button = (g, label, fn) => { + g.setAttribute("role", "button"); g.setAttribute("tabindex", "0"); g.setAttribute("aria-label", label); g.classList.add("mg-hit"); + g.addEventListener("click", fn); + g.addEventListener("keydown", (e) => { if (e.key === "Enter" || e.key === " ") { e.preventDefault(); fn(); } }); + }; + const strip = (svg, y, w = 680) => { + el("rect", { x: (800 - w) / 2, y, width: w, height: 48, rx: 24, fill: SOFT }, svg); + return txt(svg, 400, y + 31, "", { "text-anchor": "middle", "font-size": 20, "font-weight": 500 }); + }; + + /* ---- a taxi meter, 280 by 200, drawn from its top left corner ---- */ + const meter = (p, color, label) => { + const g = el("g", {}, p); + el("rect", { x: 100, y: -26, width: 80, height: 32, rx: 9, fill: YEL, stroke: INK, "stroke-width": 3 }, g); + el("rect", { x: 0, y: 0, width: 280, height: 200, rx: 24, fill: color, stroke: INK, "stroke-width": 3 }, g); + el("rect", { x: 22, y: 24, width: 236, height: 96, rx: 14, fill: "#fff", stroke: INK, "stroke-width": 3 }, g); + const val = txt(g, 140, 91, "$0.00", { "text-anchor": "middle", "font-family": MONO, "font-size": 52, "font-weight": 700 }); + [0, 1, 2].forEach((i) => el("circle", { cx: 46 + i * 40, cy: 160, r: 12, fill: "#fff", stroke: INK, "stroke-width": 2.5 }, g)); + const wheel = el("g", {}, g); + el("circle", { r: 21, fill: "#fff", stroke: INK, "stroke-width": 2.5 }, wheel); + el("path", { d: "M-13 0 H13 M0 -13 V13", stroke: INK, "stroke-width": 3, "stroke-linecap": "round" }, wheel); + txt(g, 140, 248, label, { "text-anchor": "middle", "font-family": MONO, "font-size": 22, "font-weight": 700 }); + const set = (s, a = 0) => { val.textContent = s; tf(wheel, 228, 160, 1, a); }; + set("$0.00"); + return { g, set }; + }; + + const SC = {}; + + /* ---- 1. two lanes of a running track ---- */ + SC.track = { + dur: 6.5, still: 6.5, + build(svg, api) { + txt(svg, 44, 62, "Coding Agent Index", { "font-size": 32, "font-weight": 700 }); + const X0 = 90, PX = 7.5, xv = (v) => X0 + v * PX; + const LANES = [ + ["Claude Opus 5.5", BLUE, 62, "Artificial Analysis, 28 Oct 2026", 4.2], + ["Mistral Large 4", LIL, 48, "Mistral's post, 29 Oct 2026", 3.6], + ]; + let pinned = -1; + const tip = strip(svg, 524, 720); + const lanes = LANES.map(([name, col, val, src, end], i) => { + const y = 110 + i * 160, g = el("g", {}, svg), cy = y + 92; + el("rect", { x: 34, y: y - 8, width: 732, height: 146, rx: 26, fill: "none", stroke: INK, "stroke-width": 2, "stroke-dasharray": "4 7", class: "mg-ring" }, g); + el("rect", { x: 44, y, width: 712, height: 130, rx: 20, fill: SOFT }, g); + txt(g, 72, y + 44, name, { "font-family": MONO, "font-size": 22, "font-weight": 700 }); + const band = el("path", { d: "", stroke: "#fff", "stroke-width": 26, "stroke-linecap": "round", fill: "none" }, g); + const dash = el("path", { d: "", stroke: INK, "stroke-width": 2, "stroke-dasharray": "2 12", "stroke-linecap": "round", fill: "none" }, g); + const trail = el("path", { d: "", stroke: col, "stroke-width": 12, "stroke-linecap": "round", fill: "none" }, g); + const mk = el("g", {}, g); + el("circle", { r: 22, fill: col, stroke: INK, "stroke-width": 3 }, mk); + el("circle", { r: 6, fill: "#fff", stroke: INK, "stroke-width": 2 }, mk); + const chip = el("rect", { x: 0, y: cy - 22, width: 58, height: 44, rx: 14, fill: "#fff" }, g); + const num = txt(g, 0, cy + 11, "", { "text-anchor": "middle", "font-size": 30, "font-weight": 700 }); + button(g, `${name}, ${val}: ${src}`, () => { pinned = i; api.poke(); }); + return { band, dash, trail, mk, chip, num, cy, val, end, src, d: i * 0.15 }; + }); + el("path", { d: `M${xv(0)} 462 H${xv(84)}`, stroke: INK, "stroke-width": 2.5, "stroke-linecap": "round" }, svg); + for (let v = 0; v <= 80; v += 10) el("path", { d: `M${xv(v)} 455 V469`, stroke: INK, "stroke-width": v % 50 === 0 ? 3 : 2, "stroke-linecap": "round" }, svg); + const pins = lanes.map((l) => el("path", { d: `M${xv(l.val)} 462 V462`, stroke: MUTE, "stroke-width": 2, "stroke-dasharray": "3 6" }, svg)); + return (t) => { + lanes.forEach((l, i) => { + const k = io(seg(t, 0.2 + l.d, 1.3 + l.d)), xe = X0 + (xv(84) - X0) * k; + const lane = `M${X0} ${l.cy} H${Math.max(X0 + 0.01, xe)}`; + l.band.setAttribute("d", lane); l.dash.setAttribute("d", lane); + l.band.setAttribute("opacity", k > 0 ? 1 : 0); l.dash.setAttribute("opacity", k > 0 ? 1 : 0); + const r = oc(seg(t, 1.3, l.end)), v = l.val * r, x = xv(v), stop = t >= l.end; + l.trail.setAttribute("d", `M${X0} ${l.cy} H${Math.max(X0 + 0.01, x)}`); + const pop = ob(seg(t, l.end, l.end + 0.4)); + tf(l.mk, x, l.cy, (k > 0.05 ? 1 : 0) * (stop ? 1 + 0.18 * Math.sin(pop * Math.PI) : 1)); + l.num.setAttribute("x", x + 59); l.chip.setAttribute("x", x + 30); l.chip.setAttribute("opacity", t >= 1.3 ? 1 : 0); + l.num.textContent = t >= 1.3 ? String(Math.round(v)) : ""; + l.num.setAttribute("font-size", stop ? 32 : 26); + const g = oc(seg(t, l.end, l.end + 0.6)); + pins[i].setAttribute("d", `M${xv(l.val)} ${l.cy + 24} V${l.cy + 24 + (462 - l.cy - 24) * g}`); + pins[i].setAttribute("opacity", g); + }); + tip.setAttribute("fill", pinned < 0 ? MUTE : INK); + tip.textContent = pinned < 0 ? "Tapping a lane shows its source" : LANES[pinned][3]; + }; + }, + }; + + /* ---- 2. two taxi meters, one million tokens ---- */ + SC.meter = { + dur: 7.5, still: 7.5, + build(svg, api) { + const MODES = [["1M output tokens", 2.1, 20], ["1M input tokens", 0.7, 4]]; + let mode = 0; + el("rect", { x: 190, y: 40, width: 420, height: 68, rx: 34, fill: "#fff" }, svg); + const bar = el("rect", { x: 190, y: 40, width: 68, height: 68, rx: 34, fill: SKY }, svg); + el("rect", { x: 190, y: 40, width: 420, height: 68, rx: 34, fill: "none", stroke: INK, "stroke-width": 3 }, svg); + const count = txt(svg, 400, 84, MODES[0][0], { "text-anchor": "middle", "font-family": MONO, "font-size": 26, "font-weight": 700 }); + const left = meter(svg, LIL, "Mistral Large 4"), right = meter(svg, BLUE, "Claude Opus 5.5"); + tf(left.g, 90, 186); tf(right.g, 430, 186); + const sw = el("g", {}, svg); + el("rect", { x: 270, y: 478, width: 260, height: 72, rx: 36, fill: "none", stroke: INK, "stroke-width": 2, "stroke-dasharray": "4 7", class: "mg-ring" }, sw); + el("rect", { x: 280, y: 486, width: 240, height: 56, rx: 28, fill: SOFT, stroke: INK, "stroke-width": 2.5 }, sw); + const knob = el("rect", { x: 285, y: 491, width: 115, height: 46, rx: 23, fill: YEL, stroke: INK, "stroke-width": 2 }, sw); + txt(sw, 342, 521, "output", { "text-anchor": "middle", "font-family": MONO, "font-size": 19, "font-weight": 700 }); + txt(sw, 458, 521, "input", { "text-anchor": "middle", "font-family": MONO, "font-size": 19, "font-weight": 700 }); + const label = () => { sw.setAttribute("aria-label", mode ? "Showing input tokens. Switch to output tokens" : "Showing output tokens. Switch to input tokens"); sw.setAttribute("aria-pressed", mode ? "true" : "false"); }; + button(sw, "", () => { mode = 1 - mode; label(); api.seek(0.01); }); + label(); + const money = (v, end, done) => (done && Number.isInteger(end) ? `$${end}` : `$${v.toFixed(2)}`); + return (t) => { + const [name, a, b] = MODES[mode]; + count.textContent = name; + bar.setAttribute("width", 68 + 352 * io(seg(t, 0.2, 1.2))); + knob.setAttribute("x", mode ? 400 : 285); + const ka = oc(seg(t, 1.3, 3.0)), kb = seg(t, 1.3, 5.8), kbe = 1 - Math.pow(1 - kb, 1.6); + left.set(money(a * ka, a, ka >= 1), ka * 900); + right.set(money(b * kbe, b, kb >= 1), kbe * 2520); + }; + }, + }; + + /* ---- 3. two shelves: one book leaves, one stays behind glass ---- */ + SC.library = { + dur: 7.5, still: 7.5, + build(svg, api) { + const shelf = (x, name) => { + txt(svg, x + 150, 96, name, { "text-anchor": "middle", "font-family": MONO, "font-size": 24, "font-weight": 700 }); + }; + shelf(50, "Mistral Large 4"); shelf(450, "Claude Opus 5.5"); + // the reading card sits behind the right shelf until it slides out + const card = el("g", {}, svg); + el("rect", { x: 530, y: 0, width: 140, height: 104, rx: 12, fill: "#fff", stroke: INK, "stroke-width": 3 }, card); + [24, 46, 68].forEach((y, i) => el("rect", { x: 548, y, width: [96, 80, 100][i], height: 10, rx: 5, fill: SOFT, stroke: INK, "stroke-width": 1.5 }, card)); + const tagB = el("g", {}, card); + el("rect", { x: 610, y: 82, width: 76, height: 40, rx: 12, fill: YEL, stroke: INK, "stroke-width": 2.5 }, tagB); + txt(tagB, 648, 110, "API", { "text-anchor": "middle", "font-family": MONO, "font-size": 20, "font-weight": 700 }); + const books = []; + [50, 450].forEach((x, s) => { + el("rect", { x, y: 120, width: 300, height: 212, rx: 14, fill: SOFT, stroke: INK, "stroke-width": 3 }, svg); + el("rect", { x, y: 300, width: 300, height: 16, fill: YEL, stroke: INK, "stroke-width": 2.5 }, svg); + [[x + 40, 30, 116, SKY], [x + 74, 30, 132, MINT], [x + 214, 30, 106, s ? LIL : BLUE]].forEach(([bx, w, h, c]) => el("rect", { x: bx, y: 300 - h, width: w, height: h, rx: 4, fill: c, stroke: INK, "stroke-width": 2.5 }, svg)); + }); + el("path", { d: "M540 332 H660", stroke: INK, "stroke-width": 5, "stroke-linecap": "round" }, svg); + // the thick books, drawn around their centre + const book = (col) => { const g = el("g", {}, svg); el("rect", { x: -40, y: -76, width: 80, height: 152, rx: 6, fill: col, stroke: INK, "stroke-width": 3 }, g); el("path", { d: "M-40 -50 H40 M-40 50 H40", stroke: INK, "stroke-width": 2.5 }, g); el("rect", { x: -20, y: -18, width: 40, height: 36, rx: 4, fill: "#fff", stroke: INK, "stroke-width": 2 }, g); return g; }; + // tote bag, back then book then front + const tote = el("g", {}, svg); + const handle = el("path", { d: "M160 432 Q160 380 200 380 Q240 380 240 432", stroke: INK, "stroke-width": 5, fill: "none", "stroke-linecap": "round" }, tote); + const bookA = book(LIL), bookB = book(BLUE); + const front = el("g", {}, svg); + el("path", { d: "M118 432 H282 L270 560 H130 Z", fill: MINT, stroke: INK, "stroke-width": 3, "stroke-linejoin": "round" }, front); + const tagA = el("g", {}, svg); + el("path", { d: "M240 420 L304 446", stroke: INK, "stroke-width": 2.5, "stroke-linecap": "round" }, tagA); + el("rect", { x: 292, y: 440, width: 132, height: 42, rx: 12, fill: YEL, stroke: INK, "stroke-width": 2.5 }, tagA); + txt(tagA, 358, 468, "Download", { "text-anchor": "middle", "font-family": MONO, "font-size": 20, "font-weight": 700 }); + const glass = el("g", {}, svg); + el("rect", { x: 462, y: 132, width: 276, height: 166, rx: 8, fill: "none", stroke: INK, "stroke-width": 2.5 }, glass); + const shine = el("path", { d: "M500 280 L560 150 M530 280 L590 150", stroke: SKY, "stroke-width": 7, "stroke-linecap": "round" }, glass); + const hit = el("g", {}, svg); + el("rect", { x: 10, y: 10, width: 780, height: 580, rx: 20, fill: "#fff", "fill-opacity": 0, stroke: INK, "stroke-width": 2, "stroke-dasharray": "4 7", class: "mg-ring" }, hit); + button(hit, "Replay the shelves", () => api.seek(0.01)); + return (t) => { + // left: lift, then drop into the tote + const lift = io(seg(t, 0.8, 1.4)), drop = seg(t, 1.4, 2.3), dd = drop * drop; + const ax = 200, ay = 224 - 22 * lift + (462 - 224 + 22) * dd; + tf(bookA, ax + 40 * Math.sin(drop * Math.PI), ay, 1 + 0.05 * lift * (1 - drop), 14 * Math.sin(drop * Math.PI)); + const land = seg(t, 2.3, 2.8), sq = Math.sin(land * Math.PI) * (1 - land); + front.setAttribute("transform", `translate(200 560) scale(${1 + 0.06 * sq} ${1 - 0.08 * sq}) translate(-200 -560)`); + handle.setAttribute("transform", `translate(0 ${10 * sq})`); + const sw = seg(t, 2.3, 4.3); + tagA.setAttribute("transform", `rotate(${Math.sin(sw * Math.PI * 4) * 14 * (1 - sw)} 240 420)`); + // right: the book presses on the glass, then the card slides out + const nudge = Math.sin(seg(t, 3.0, 3.7) * Math.PI); + tf(bookB, 600 + 5 * Math.sin(seg(t, 3.0, 3.7) * Math.PI * 4), 224, 1 + 0.06 * nudge); + shine.setAttribute("transform", `translate(${120 * io(seg(t, 3.1, 3.9))} 0)`); + const out = ob(seg(t, 3.9, 4.9)); + card.setAttribute("transform", `translate(0 ${220 + 186 * out})`); + const tp = ob(seg(t, 4.8, 5.3)); + tagB.setAttribute("transform", `translate(648 102) scale(${tp}) translate(-648 -102)`); + }; + }, + }; + + /* ---- title card, 16 by 9 ---- */ + SC.hero = { + w: 960, h: 540, dur: 1, still: 0, + build(svg) { + el("rect", { x: 60, y: 60, width: 168, height: 40, rx: 20, fill: YEL, stroke: INK, "stroke-width": 2.5 }, svg); + txt(svg, 144, 87, "Comparisons", { "text-anchor": "middle", "font-size": 19, "font-weight": 700 }); + txt(svg, 60, 182, "Mistral Large 4", { "font-size": 60, "font-weight": 700 }); + txt(svg, 60, 248, "vs", { "font-size": 60, "font-weight": 700, fill: MUTE }); + txt(svg, 60, 314, "Claude Opus 5.5", { "font-size": 60, "font-weight": 700 }); + el("path", { d: "M62 340 H300", stroke: YEL, "stroke-width": 12, "stroke-linecap": "round" }, svg); + txt(svg, 60, 396, "Open weights or top scores", { "font-size": 27, "font-weight": 500, fill: MUTE }); + txt(svg, 60, 480, "Checked 29 Oct 2026", { "font-size": 18, "font-weight": 500, fill: MUTE }); + const a = meter(svg, LIL, "Mistral Large 4"), b = meter(svg, BLUE, "Claude Opus 5.5"); + a.set("$2.10", 0); b.set("$20", 0); + a.g.setAttribute("transform", "translate(560 210) scale(0.62)"); + b.g.setAttribute("transform", "translate(752 210) scale(0.62)"); + 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); }; + // with reduced motion an interaction redraws the still frame instead of playing + const api = { now: clock, seek: (s) => { if (calm) return frame(); off = s - clock(); held = false; tick(); }, poke: () => { if (calm) return frame(); held = false; tick(); } }; + draw = sc.build(svg, api); + if (frozen) { draw(isNaN(fixed) ? sc.still : fixed, 0); return; } + new IntersectionObserver(([e]) => { + seen = e.isIntersecting; + if (seen) { tick(); if (!fig.dataset.sent && window.posthog) { fig.dataset.sent = 1; window.posthog.capture("blog_scene_view", { slug: location.pathname.split("/").filter(Boolean).pop(), scene: fig.dataset.scene }); } } + else cancelAnimationFrame(raf); + }, { threshold: 0.25 }).observe(fig); + svg.addEventListener("click", () => { if (!fig.dataset.hit && window.posthog) { fig.dataset.hit = 1; window.posthog.capture("blog_scene_interact", { slug: location.pathname.split("/").filter(Boolean).pop(), scene: fig.dataset.scene }); } }); + frame(); + }; + const go = () => document.querySelectorAll("figure.mg[data-scene]").forEach(mount); + const fonts = document.fonts && document.fonts.load ? Promise.all([document.fonts.load('700 32px "Space Grotesk"'), document.fonts.load('500 20px "Space Grotesk"'), document.fonts.load('700 20px "JetBrains Mono"')]).catch(() => {}) : Promise.resolve(); + const start = () => fonts.then(go, go); + if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", start); else start(); +})(); diff --git a/blog/src/assets/media/mistral-large-4-vs-claude-opus-5-5/track.png b/blog/src/assets/media/mistral-large-4-vs-claude-opus-5-5/track.png new file mode 100644 index 0000000000..7d7cc48597 Binary files /dev/null and b/blog/src/assets/media/mistral-large-4-vs-claude-opus-5-5/track.png differ diff --git a/blog/src/assets/media/mistral-large-4/crate.png b/blog/src/assets/media/mistral-large-4/crate.png index 5b7838b32d..301b25c48a 100644 Binary files a/blog/src/assets/media/mistral-large-4/crate.png and b/blog/src/assets/media/mistral-large-4/crate.png differ diff --git a/blog/src/assets/media/mistral-large-4/hero.png b/blog/src/assets/media/mistral-large-4/hero.png index eebb6d909c..ba3b70d63e 100644 Binary files a/blog/src/assets/media/mistral-large-4/hero.png and b/blog/src/assets/media/mistral-large-4/hero.png differ diff --git a/blog/src/assets/media/mistral-large-4/motion.js b/blog/src/assets/media/mistral-large-4/motion.js index e61ef31df1..2f7b4a72f7 100644 --- a/blog/src/assets/media/mistral-large-4/motion.js +++ b/blog/src/assets/media/mistral-large-4/motion.js @@ -89,11 +89,11 @@ }, }; - /* ---- 2. a crate rolls in on a trolley; its delivery slip says Coming soon twice while a calendar tears off days ---- */ + /* ---- 2. a crate rolls in on a trolley; its delivery slip says Released twice while a calendar tears off days to 29 ---- */ SC.crate = { dur: 11.2, still: 9, build(svg, api) { - txt(svg, 44, 62, "The weights are not out yet", { "font-size": 32, "font-weight": 700 }); + txt(svg, 44, 62, "The weights are out", { "font-size": 32, "font-weight": 700 }); txt(svg, 756, 60, "tap the crate", { "text-anchor": "end", "font-size": 20, fill: MUTE, "font-weight": 500 }); el("path", { d: "M44 480 H756", stroke: INK, "stroke-width": 3, "stroke-linecap": "round" }, svg); /* tear-off calendar */ @@ -105,7 +105,7 @@ el("path", { d: "M548 168 V128 Q548 112 564 112 H716 Q732 112 732 128 V168 Z", fill: SKY, stroke: INK, "stroke-width": 3, "stroke-linejoin": "round" }, svg); txt(svg, 640, 156, "October", { "text-anchor": "middle", "font-size": 24, "font-weight": 700 }); [594, 686].forEach((x) => el("rect", { x: x - 6, y: 96, width: 12, height: 26, rx: 6, fill: "#fff", stroke: INK, "stroke-width": 3 }, svg)); - const notes = [["VentureBeat: Oct. 27", "#fff", 346, 6.3], ["Mistral: end of month", YEL, 398, 7.8]].map(([s, fill, y, at]) => ({ g: pill(svg, s, fill), y, at })); + const notes = [["Weights out", YEL, 346, 7]].map(([s, fill, y, at]) => ({ g: pill(svg, s, fill), y, at })); /* trolley and crate */ const tr = el("g", {}, svg); el("path", { d: "M84 438 V262 Q84 236 60 236 H46", stroke: INK, "stroke-width": 6, fill: "none", "stroke-linecap": "round" }, tr); @@ -121,11 +121,12 @@ el("path", { d: "M-140 -110 H140", stroke: SOFT, "stroke-width": 3, "stroke-linecap": "round" }, cr); txt(cr, -140, -137, "weights", { "font-size": 22, "font-weight": 700 }); txt(cr, -140, -69, "licence", { "font-size": 22, "font-weight": 700 }); - const stamps = [[-144, -3], [-76, 2.5]].map(([y, rot]) => ({ g: pill(cr, "Coming soon", LIL, { rx: 10 }), y, rot })); + const stamps = [[-144, -3], [-76, 2.5]].map(([y, rot]) => ({ g: pill(cr, "Released", LIL, { rx: 10 }), y, rot })); el("rect", { x: -192, y: -269, width: 384, height: 276, rx: 18, fill: "none", stroke: INK, "stroke-width": 2, "stroke-dasharray": "3 7", class: "mg-ring" }, cr); - const cap = strip(svg, 512, 700); + const cap = strip(svg, 512, 740); let poked = -99; - button(cr, "The crate is closed. Weights and licence both read Coming soon.", () => { poked = api.now(); api.poke(); }); + const OPEN = "The crate is open. Weights and licence were released on 29 Oct 2026."; + button(cr, OPEN, () => { poked = api.now(); api.poke(); }); return (t, now) => { const w = now - poked, shake = w >= 0 && w < 0.9 ? Math.sin(w * 30) * 3 * (1 - w / 0.9) : 0; const roll = oc(seg(t, 0.3, 1.3)) - io(seg(t, 10.3, 11)), dx = -580 * (1 - roll); @@ -133,47 +134,43 @@ wheels.forEach((wh) => tf(wh.g, wh.x, 463, 1, (dx / 15) * 57.3)); cr.setAttribute("transform", `translate(293 430) rotate(${shake})`); stamps.forEach((s, i) => { const k = seg(t, 1.8 + i * 0.7, 2.1 + i * 0.7); s.g.setAttribute("opacity", k <= 0 ? 0 : 1); tf(s.g, 76, s.y, 2.2 - 1.2 * ob(k), s.rot); }); - let f = t < 3.2 || t > 10.6 ? 0 : Math.min(21, (t - 3.2) / 0.14); - if (t >= 7 && t <= 10.6) f = 21 + Math.min(4, (t - 7) / 0.15); + const f = t < 3.2 || t > 10.6 ? 0 : Math.min(23, (t - 3.2) / 0.15); const day = 6 + Math.floor(f), fr = f - Math.floor(f), moving = fr > 0 && day > 6; num.textContent = day; old.textContent = day - 1; leaf.setAttribute("transform", `translate(640 168) scale(1 ${moving ? 1 - seg(fr, 0, 0.8) : 0})`); leaf.setAttribute("opacity", moving ? 1 : 0); notes.forEach((n) => { const k = ob(seg(t, n.at, n.at + 0.35)) * (1 - seg(t, 10.3, 10.7)); tf(n.g, 640, n.y, cl(k, 0, 1.05)); n.g.setAttribute("opacity", k <= 0.01 ? 0 : 1); }); - cap.textContent = w >= 0 && w < 3 ? "Not yet. You can only rent it through the API for now." : "Mistral's model page on 6 Oct 2026: both read Coming soon"; + cap.textContent = w >= 0 && w < 3 ? OPEN : "Mistral's release post, 29 Oct 2026: weights and licence out"; }; }, }; - /* ---- 3. three price tags on a line; a pencil strikes the higher price and the lower one drops in ---- */ + /* ---- 3. three price tags on a line; each price drops in; tap a tag for its 6 Oct price ---- */ SC.tags = { dur: 11.6, still: 9, build(svg, api) { txt(svg, 44, 62, "Price per million tokens", { "font-size": 32, "font-weight": 700 }); - txt(svg, 44, 98, "Mistral's model page, checked 6 Oct 2026", { "font-size": 20, "font-weight": 500, fill: MUTE }); + txt(svg, 44, 98, "Mistral's release post, 29 Oct 2026", { "font-size": 20, "font-weight": 500, fill: MUTE }); txt(svg, 756, 60, "tap a tag", { "text-anchor": "end", "font-size": 20, fill: MUTE, "font-weight": 500 }); el("path", { d: "M40 142 Q400 166 760 142", stroke: INK, "stroke-width": 2.5, fill: "none", "stroke-linecap": "round" }, svg); - const IT = [["Input", "$0.68", "$1.36", YEL], ["Cached input", "$0.07", "$0.14", SKY], ["Output", "$2.09", "$4.18", MINT]]; - const X = [150, 400, 650], LY = [148, 154, 148], S = (i) => 1.8 + i * 2; - const LINES = IT.map(([n, p, o]) => `${n}: ${p} listed, ${o} struck through`); + const IT = [["Input", "$0.70", "$0.68", YEL], ["Cached input", "$0.07", "$0.07", SKY], ["Output", "$2.10", "$2.09", MINT]]; + const X = [150, 400, 650], LY = [148, 154, 148], S = (i) => 1.4 + i * 1.6; + const LINES = IT.map(([n, p]) => `${n}: ${p} per million tokens`); + const PIN = IT.map(([n, p, o]) => `${n}: ${p} on 29 Oct, ${o} on 6 Oct`); + const SUM = "Input $0.70, cached input $0.07, output $2.10"; let pinned = -1; const tags = IT.map(([name, price, was, col], i) => { const g = el("g", {}, svg); el("rect", { x: -102, y: -2, width: 204, height: 327, rx: 22, fill: "none", stroke: INK, "stroke-width": 2, "stroke-dasharray": "3 7", class: "mg-ring" }, g); el("path", { d: "M-95 52 L-46 6 H46 L95 52 V302 Q95 318 79 318 H-79 Q-95 318 -95 302 Z", fill: col, stroke: INK, "stroke-width": 3, "stroke-linejoin": "round" }, g); txt(g, 0, 96, name, { "text-anchor": "middle", "font-size": 24, "font-weight": 700 }); - txt(g, 0, 156, was, { "text-anchor": "middle", "font-size": 34, "font-weight": 700 }); - const strike = el("path", { stroke: INK, "stroke-width": 4, "stroke-linecap": "round", fill: "none" }, g); + const prev = pill(g, `${was} on 6 Oct`, "#fff"), tt = prev.querySelector("text"), tr = prev.querySelector("rect"); + tt.setAttribute("font-size", 18); const tw = tt.getComputedTextLength() + 28; tr.setAttribute("x", -tw / 2); tr.setAttribute("width", tw); const plate = el("g", {}, g); el("rect", { x: -80, y: -40, width: 160, height: 80, rx: 16, fill: "#fff", stroke: INK, "stroke-width": 3 }, plate); txt(plate, 0, 17, price, { "text-anchor": "middle", "font-size": 48, "font-weight": 700 }); - const pen = el("g", {}, g); - el("rect", { x: 16, y: -7, width: 60, height: 14, fill: BLUE, stroke: INK, "stroke-width": 2.5 }, pen); - el("rect", { x: 76, y: -7, width: 14, height: 14, rx: 3, fill: LIL, stroke: INK, "stroke-width": 2.5 }, pen); - el("path", { d: "M0 0 L16 -7 V7 Z", fill: "#fff", stroke: INK, "stroke-width": 2.5, "stroke-linejoin": "round" }, pen); - el("path", { d: "M0 0 L6 -2.6 V2.6 Z", fill: INK }, pen); - button(g, LINES[i], () => { pinned = i; poked[i] = api.now(); api.poke(); }); - return { g, strike, plate, pen }; + button(g, `${name}: ${price} on 29 Oct 2026, ${was} on 6 Oct 2026`, () => { pinned = i; poked[i] = api.now(); api.poke(); }); + return { g, prev, plate }; }); const poked = [-99, -99, -99]; X.forEach((x, i) => el("rect", { x: x - 8, y: LY[i] - 22, width: 16, height: 42, rx: 6, fill: LIL, stroke: INK, "stroke-width": 2.5, "pointer-events": "none" }, svg)); @@ -185,16 +182,14 @@ const te = Math.max(0, t - 0.15 * i), w = now - poked[i]; const a = 10 * Math.exp(-2.2 * te) * Math.sin(6 * te) + (w >= 0 && w < 3 ? 8 * Math.exp(-2.5 * w) * Math.sin(8 * w) : 0); k.g.setAttribute("transform", `translate(${X[i]} ${LY[i]}) rotate(${a})`); - const s = seg(t, S(i), S(i) + 0.55) * (1 - out), px = -58 + 116 * s; - k.strike.setAttribute("d", `M-58 148 L${px} ${148 - 8 * s}`); k.strike.setAttribute("opacity", s > 0 ? 1 : 0); - tf(k.pen, px, 148 - 8 * s, 1, -28 + Math.sin(t * 40) * 3 * (s > 0 && s < 1 ? 1 : 0)); - k.pen.setAttribute("opacity", seg(t, S(i) - 0.25, S(i) - 0.1) * (1 - seg(t, S(i) + 0.6, S(i) + 0.75))); - const p = seg(t, S(i) + 0.75, S(i) + 1.15); + const o = poked[i] > -99 ? ob(seg(w, 0, 0.35)) : 0; + tf(k.prev, 0, 160, cl(o, 0, 1.1)); k.prev.setAttribute("opacity", o <= 0.01 ? 0 : 1); + const p = seg(t, S(i), S(i) + 0.4); tf(k.plate, 0, 250 - 80 * (1 - ob(p))); k.plate.setAttribute("opacity", seg(p, 0, 0.25) * (1 - out)); - if (t >= S(i) + 0.3) last = i; + if (t >= S(i) + 0.1) last = i; }); - cap.textContent = pinned >= 0 ? LINES[pinned] : t > 8.4 && t < 10.6 ? "The page did not say how long the lower prices last" : last < 0 || t >= 10.6 ? "A higher price was struck through beside each one" : LINES[last]; + cap.textContent = pinned >= 0 ? PIN[pinned] : last < 0 || t >= 6.6 ? SUM : LINES[last]; }; }, }; @@ -258,7 +253,7 @@ el("path", { d: "M66 226 H606", stroke: YEL, "stroke-width": 14, "stroke-linecap": "round" }, svg); txt(svg, 64, 288, "Le Chonk: size, price, scores, weights", { "font-size": 25, "font-weight": 500, fill: MUTE }); el("rect", { x: 64, y: 326, width: 290, height: 52, rx: 26, fill: SOFT }, svg); - txt(svg, 209, 360, "Checked 6 Oct 2026", { "text-anchor": "middle", "font-family": MONO, "font-size": 20, "font-weight": 700 }); + txt(svg, 209, 360, "Checked 29 Oct 2026", { "text-anchor": "middle", "font-family": MONO, "font-size": 20, "font-weight": 700 }); /* one chunky kettlebell */ const k = el("g", { transform: "translate(776 396)" }, svg); el("ellipse", { cx: 0, cy: 96, rx: 118, ry: 10, fill: SOFT }, k); diff --git a/blog/src/assets/media/mistral-large-4/tags.png b/blog/src/assets/media/mistral-large-4/tags.png index 5fdea957fc..9379f43ca9 100644 Binary files a/blog/src/assets/media/mistral-large-4/tags.png and b/blog/src/assets/media/mistral-large-4/tags.png differ diff --git a/blog/src/assets/media/what-is-kimi-k3-1-pro/hero.png b/blog/src/assets/media/what-is-kimi-k3-1-pro/hero.png new file mode 100644 index 0000000000..1a19c9bcf8 Binary files /dev/null and b/blog/src/assets/media/what-is-kimi-k3-1-pro/hero.png differ diff --git a/blog/src/assets/media/what-is-kimi-k3-1-pro/highjump.png b/blog/src/assets/media/what-is-kimi-k3-1-pro/highjump.png new file mode 100644 index 0000000000..387b4e5ced Binary files /dev/null and b/blog/src/assets/media/what-is-kimi-k3-1-pro/highjump.png differ diff --git a/blog/src/assets/media/what-is-kimi-k3-1-pro/motion.css b/blog/src/assets/media/what-is-kimi-k3-1-pro/motion.css new file mode 100644 index 0000000000..a2b6dd2960 --- /dev/null +++ b/blog/src/assets/media/what-is-kimi-k3-1-pro/motion.css @@ -0,0 +1,13 @@ +/* Bright coded scenes for "What is Kimi K3.1 Pro". 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/what-is-kimi-k3-1-pro/motion.js b/blog/src/assets/media/what-is-kimi-k3-1-pro/motion.js new file mode 100644 index 0000000000..73ee64e78d --- /dev/null +++ b/blog/src/assets/media/what-is-kimi-k3-1-pro/motion.js @@ -0,0 +1,217 @@ +/* Bright coded scenes for "What is Kimi K3.1 Pro". Vanilla JS, no library. +
holds a still image; this script swaps in a live SVG. + Plays only in view, honours reduced motion, "?mgstill" freezes each scene on its still frame. */ +(() => { + const NS = "http://www.w3.org/2000/svg"; + const INK = "#1A1320", YEL = "#FFCA54", BLUE = "#6C8EF5", LIL = "#B69CFF", MINT = "#7FD8AE", SKY = "#9AD8FF", SOFT = "#F1ECF9", MUTE = "#7A6A88"; + const SANS = '"Space Grotesk", system-ui, sans-serif', MONO = '"JetBrains Mono", ui-monospace, monospace'; + const el = (t, a = {}, p) => { const n = document.createElementNS(NS, t); for (const k in a) n.setAttribute(k, a[k]); if (p) p.appendChild(n); return n; }; + const txt = (p, x, y, s, a = {}) => { const n = el("text", Object.assign({ x, y, "font-family": SANS, "font-size": 24, "font-weight": 600, fill: INK }, a), p); n.textContent = s; return n; }; + const cl = (v, a = 0, b = 1) => Math.max(a, Math.min(b, v)); + const seg = (t, a, b) => cl((t - a) / (b - a)); + const oc = (x) => 1 - Math.pow(1 - x, 3); + const ob = (x) => { const c = 1.70158; return 1 + (c + 1) * Math.pow(x - 1, 3) + c * Math.pow(x - 1, 2); }; + const io = (x) => (x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2); + const tf = (n, x, y, s = 1, r = 0) => n.setAttribute("transform", `translate(${x} ${y}) rotate(${r}) scale(${s})`); + const button = (g, label, fn) => { + g.setAttribute("role", "button"); g.setAttribute("tabindex", "0"); g.setAttribute("aria-label", label); g.classList.add("mg-hit"); + g.addEventListener("click", fn); + g.addEventListener("keydown", (e) => { if (e.key === "Enter" || e.key === " ") { e.preventDefault(); fn(); } }); + }; + const strip = (svg, y, w = 680) => { + el("rect", { x: (800 - w) / 2, y, width: w, height: 48, rx: 24, fill: SOFT }, svg); + return txt(svg, 400, y + 31, "", { "text-anchor": "middle", "font-size": 20, "font-weight": 500 }); + }; + + /* one high jump standard: two posts and a crossbar that rides up them; returns a setter for the bar's y */ + const standard = (p, cx, base, top, half, col, post = 4) => { + const g = el("g", {}, p); + [-half + 4, half - 4].forEach((dx) => { + el("path", { d: `M${cx + dx} ${base} V${top}`, stroke: INK, "stroke-width": post, "stroke-linecap": "round" }, g); + el("path", { d: `M${cx + dx - 9} ${base} H${cx + dx + 9}`, stroke: INK, "stroke-width": post, "stroke-linecap": "round" }, g); + }); + const bar = el("rect", { x: cx - half, width: half * 2, height: 12, rx: 6, fill: col, stroke: INK, "stroke-width": 2.5 }, g); + return { g, set: (y) => bar.setAttribute("y", y - 6) }; + }; + + const SC = {}; + + /* ---- 1. three high jump bars on the Terminal-Bench 4.0 scale ---- */ + SC.highjump = { + dur: 8, still: 8, + build(svg, api) { + const BASE = 470, Y = (v) => BASE - (v - 55) * 21.33; + txt(svg, 44, 70, "Terminal-Bench 4.0", { "font-size": 32, "font-weight": 700 }); + [55, 60, 65, 70].forEach((v) => { + el("path", { d: `M120 ${Y(v)} H740`, stroke: SOFT, "stroke-width": 2 }, svg); + txt(svg, 100, Y(v) + 6, String(v), { "text-anchor": "end", "font-family": MONO, "font-size": 16, "font-weight": 500, fill: MUTE }); + }); + el("rect", { x: 150, y: BASE, width: 590, height: 14, rx: 7, fill: SOFT }, svg); + const DATA = [["GPT-6 Astra", 58.2, SKY, 260], ["Kimi K3.1 Pro", 65.7, YEL, 450], ["Claude Opus 5.5", 66.4, LIL, 640]]; + let pinned = -1; + const src = el("g", { opacity: 0 }, svg), srcText = strip(src, 530, 360); srcText.textContent = "Kimi's launch post"; + const bars = DATA.map(([name, v, col, cx], i) => { + const g = el("g", {}, svg); + el("rect", { x: cx - 80, y: 120, width: 160, height: 410, rx: 14, fill: "#fff", "fill-opacity": 0 }, g); + el("rect", { x: cx - 84, y: 116, width: 168, height: 412, rx: 16, fill: "none", stroke: INK, "stroke-width": 2, "stroke-dasharray": "3 7", class: "mg-ring" }, g); + const s = standard(g, cx, BASE, Y(70) - 8, 66, col); + const val = txt(g, cx, 0, "", { "text-anchor": "middle", "font-family": MONO, "font-size": 20, "font-weight": 700 }); + txt(g, cx, BASE + 42, name, { "text-anchor": "middle", "font-size": 21 }); + button(g, `${name}: ${v}. Source: Kimi's launch post`, () => { pinned = i; api.poke(); }); + return { s, val, v, d: 0.4 + i * 0.5 }; + }); + const rx = 545, rTop = Y(66.4), rBot = Y(65.7); + const ruler = el("g", {}, svg); + el("path", { d: `M516 ${rBot} H${rx + 14} M${rx - 14} ${rTop} H574`, stroke: INK, "stroke-width": 1.5, "stroke-dasharray": "3 4" }, ruler); + el("path", { d: `M${rx} ${rTop} V${rBot} M${rx - 8} ${rTop} H${rx + 8} M${rx - 8} ${rBot} H${rx + 8} M${rx} ${rTop} V134`, stroke: INK, "stroke-width": 2.5, "stroke-linecap": "round" }, ruler); + el("rect", { x: rx - 62, y: 100, width: 124, height: 34, rx: 17, fill: MINT, stroke: INK, "stroke-width": 2.5 }, ruler); + txt(ruler, rx, 123, "0.7 points", { "text-anchor": "middle", "font-size": 18, "font-weight": 700 }); + return (t) => { + bars.forEach((b) => { + const k = oc(seg(t, b.d, b.d + 1.3)), y = Y(55) + (Y(b.v) - Y(55)) * k; + b.s.set(y); b.val.setAttribute("y", y - 20); + b.val.textContent = (55 + (b.v - 55) * k).toFixed(1); + b.val.setAttribute("opacity", seg(t, b.d, b.d + 0.3)); + }); + const r = oc(seg(t, 3.2, 4.1)); + ruler.setAttribute("opacity", r); ruler.setAttribute("transform", `translate(${90 * (1 - r)} 0)`); + src.setAttribute("opacity", pinned >= 0 ? 1 : 0); + }; + }, + }; + + /* ---- 2. a parcel tracking line with three stops ---- */ + SC.route = { + dur: 8, still: 8, + build(svg, api) { + const all = el("g", {}, svg); + el("rect", { x: 0, y: 0, width: 800, height: 600, fill: "#fff", "fill-opacity": 0 }, all); + el("rect", { x: 10, y: 10, width: 780, height: 580, rx: 16, fill: "none", stroke: INK, "stroke-width": 2, "stroke-dasharray": "3 7", class: "mg-ring" }, all); + const LY = 350, X = [140, 400, 660]; + const STOPS = [["Launched 23 Oct", true], ["API and apps today", true], ["Weights by 4 Nov", false]]; + el("path", { d: `M${X[0]} ${LY} H${X[2]}`, stroke: SOFT, "stroke-width": 18, "stroke-linecap": "round" }, all); + el("path", { d: `M${X[0]} ${LY} H${X[2]}`, stroke: INK, "stroke-width": 2, "stroke-dasharray": "2 12", "stroke-linecap": "round" }, all); + const done = el("path", { d: "", stroke: INK, "stroke-width": 5, "stroke-linecap": "round" }, all); + const wait = el("circle", { cx: X[2], cy: LY, r: 34, fill: "none", stroke: INK, "stroke-width": 2, "stroke-dasharray": "4 6" }, all); + const stops = STOPS.map(([label, tick], i) => { + const g = el("g", {}, all), c = el("circle", { cx: X[i], cy: LY, r: 22, fill: "#fff", stroke: INK, "stroke-width": 3 }, g); + const mark = tick ? el("path", { d: `M${X[i] - 10} ${LY} l7 7 l13 -14`, stroke: INK, "stroke-width": 4, fill: "none", "stroke-linecap": "round", "stroke-linejoin": "round" }, g) : null; + txt(g, X[i], LY + 66, label, { "text-anchor": "middle", "font-size": 22 }); + return { c, mark, tick }; + }); + const parcel = el("g", {}, all); + el("rect", { x: -82, y: -112, width: 164, height: 92, rx: 10, fill: YEL, stroke: INK, "stroke-width": 3 }, parcel); + el("path", { d: "M-82 -86 H82", stroke: INK, "stroke-width": 2.5 }, parcel); + el("rect", { x: -70, y: -74, width: 140, height: 40, rx: 8, fill: "#fff", stroke: INK, "stroke-width": 2 }, parcel); + txt(parcel, 0, -48, "Kimi K3.1 Pro", { "text-anchor": "middle", "font-family": MONO, "font-size": 16, "font-weight": 700 }); + el("path", { d: "M-20 -20 L0 -4 L20 -20", stroke: INK, "stroke-width": 2.5, fill: "none", "stroke-linejoin": "round" }, parcel); + button(all, "Replay the parcel route", () => api.seek(0.01)); + const legs = [[1.4, 2.8], [3.8, 5.4]], arrive = [0.6, 2.8, 5.4]; + return (t) => { + const a = io(seg(t, legs[0][0], legs[0][1])), b = io(seg(t, legs[1][0], legs[1][1])); + const x = X[0] + (X[1] - X[0]) * a + (X[2] - X[1]) * b, moving = (a > 0 && a < 1) || (b > 0 && b < 1); + const drop = oc(seg(t, 0.2, 0.7)); + tf(parcel, x, LY - 32 - 60 * (1 - drop) - (moving ? Math.abs(Math.sin(t * 9)) * 6 : 0)); + parcel.setAttribute("opacity", drop); + done.setAttribute("d", `M${X[0]} ${LY} H${x}`); + stops.forEach((s, i) => { + const k = ob(seg(t, arrive[i], arrive[i] + 0.4)), on = t >= arrive[i]; + if (s.tick) { s.c.setAttribute("fill", on ? MINT : "#fff"); s.mark.setAttribute("opacity", on ? 1 : 0); s.mark.setAttribute("transform", `translate(${X[i]} ${LY}) scale(${0.4 + 0.6 * cl(k, 0, 1.2)}) translate(${-X[i]} ${-LY})`); } + }); + const w = seg(t, 5.4, 6.0), pulse = 1 + 0.08 * Math.sin((t - 5.4) * 4) * (t > 6 ? 1 : w); + wait.setAttribute("opacity", w); wait.setAttribute("transform", `translate(${X[2]} ${LY}) scale(${pulse}) translate(${-X[2]} ${-LY})`); + }; + }, + }; + + /* ---- 3. three plugs slide into a power strip ---- */ + SC.plugs = { + dur: 8, still: 8, + build(svg, api) { + const SY = 360, X = [210, 400, 590]; + const P = [["Kimi Code", "model picker", BLUE, "Kimi Code: /model"], ["Codex", "config.toml", LIL, "Codex: api.moonshot.ai/v1"], ["Claude Code", "settings.json", SKY, "Claude Code: api.moonshot.ai/anthropic"]]; + const body = el("rect", { x: 90, y: SY, width: 620, height: 96, rx: 22, fill: SOFT, stroke: INK, "stroke-width": 3 }, svg); + txt(svg, 400, SY + 80, "Kimi API", { "text-anchor": "middle", "font-family": MONO, "font-size": 20, "font-weight": 700 }); + const lights = X.map((x) => { + el("rect", { x: x - 34, y: SY + 14, width: 68, height: 34, rx: 10, fill: "#fff", stroke: INK, "stroke-width": 2.5 }, svg); + el("path", { d: `M${x - 12} ${SY + 22} V${SY + 40} M${x + 12} ${SY + 22} V${SY + 40}`, stroke: INK, "stroke-width": 4, "stroke-linecap": "round" }, svg); + return el("circle", { cx: x + 54, cy: SY + 31, r: 8, fill: "#fff", stroke: INK, "stroke-width": 2.5 }, svg); + }); + const out = el("g", { opacity: 0 }, svg), outText = strip(out, 512, 600); + outText.setAttribute("font-family", MONO); outText.setAttribute("font-size", 19); + let pinned = -1; + const plugs = P.map(([name, tag, col, ep], i) => { + const g = el("g", {}, svg), x = X[i]; + el("path", { d: `M${x} -20 C${x} 60 ${x + (i - 1) * 30} 90 ${x} 160 V240`, stroke: INK, "stroke-width": 5, fill: "none", "stroke-linecap": "round" }, g); + el("rect", { x: x - 86, y: 150, width: 172, height: 206, rx: 18, fill: "#fff", "fill-opacity": 0 }, g); + el("rect", { x: x - 90, y: 146, width: 180, height: 214, rx: 20, fill: "none", stroke: INK, "stroke-width": 2, "stroke-dasharray": "3 7", class: "mg-ring" }, g); + el("rect", { x: x - 66, y: 166, width: 132, height: 34, rx: 8, fill: "#fff", stroke: INK, "stroke-width": 2 }, g); + txt(g, x, 189, tag, { "text-anchor": "middle", "font-family": MONO, "font-size": 15, "font-weight": 500 }); + el("path", { d: `M${x - 12} ${SY - 34} V${SY + 30} M${x + 12} ${SY - 34} V${SY + 30}`, stroke: INK, "stroke-width": 6, "stroke-linecap": "round" }, g); + el("rect", { x: x - 80, y: 240, width: 160, height: 88, rx: 16, fill: col, stroke: INK, "stroke-width": 3 }, g); + txt(g, x, 292, name, { "text-anchor": "middle", "font-size": 22, "font-weight": 700 }); + button(g, `${name}, ${tag}. Endpoint: ${ep}`, () => { pinned = i; api.poke(); }); + return { g, d: 0.5 + i * 1.3 }; + }); + return (t) => { + let lit = 0; + plugs.forEach((p, i) => { + const k = ob(seg(t, p.d, p.d + 0.9)), on = t >= p.d + 0.75; + p.g.setAttribute("transform", `translate(0 ${-330 * (1 - cl(k, 0, 1.1))})`); + lights[i].setAttribute("fill", on ? MINT : "#fff"); if (on) lit++; + }); + body.setAttribute("fill", lit === 3 && t >= 4.6 ? YEL : SOFT); + out.setAttribute("opacity", pinned >= 0 ? 1 : 0); + if (pinned >= 0) outText.textContent = P[pinned][3]; + }; + }, + }; + + /* ---- title card, 16 by 9 ---- */ + SC.hero = { + w: 960, h: 540, dur: 1, still: 0, + build(svg) { + el("rect", { x: 64, y: 96, width: 132, height: 40, rx: 20, fill: LIL, stroke: INK, "stroke-width": 2.5 }, svg); + txt(svg, 130, 123, "Concepts", { "text-anchor": "middle", "font-size": 20, "font-weight": 700 }); + txt(svg, 64, 240, "Kimi K3.1 Pro", { "font-size": 80, "font-weight": 700 }); + el("path", { d: "M66 268 H500", stroke: YEL, "stroke-width": 14, "stroke-linecap": "round" }, svg); + txt(svg, 64, 330, "1M context, weights by 4 Nov", { "font-size": 28, "font-weight": 500, fill: MUTE }); + txt(svg, 64, 466, "Checked 29 Oct 2026", { "font-family": MONO, "font-size": 18, "font-weight": 500, fill: MUTE }); + const BASE = 470, Y = (v) => BASE - (v - 50) * 16; + el("rect", { x: 606, y: BASE, width: 328, height: 12, rx: 6, fill: SOFT }, svg); + [[58.2, SKY, 660], [65.7, YEL, 770], [66.4, LIL, 880]].forEach(([v, col, cx]) => standard(svg, cx, BASE, Y(70) - 6, 38, col, 3.5).set(Y(v))); + return () => {}; + }, + }; + + /* ---- player ---- */ + const q = new URLSearchParams(location.search), frozen = q.has("mgstill"), fixed = parseFloat(q.get("mgstill")); + const calm = matchMedia("(prefers-reduced-motion: reduce)").matches; + const mount = (fig) => { + const sc = SC[fig.dataset.scene], img = fig.querySelector("img"); if (!sc || !img) return; + const W = sc.w || 800, H = sc.h || 600; + const svg = el("svg", { viewBox: `0 0 ${W} ${H}`, class: "mg-svg", role: "group", "aria-label": img.alt || "" }); + svg.style.aspectRatio = `${W} / ${H}`; + el("rect", { width: W, height: H, fill: "#fff" }, svg); + img.replaceWith(svg); + let off = 0, raf = 0, seen = false, held = calm; + const base = performance.now(), clock = () => (performance.now() - base) / 1000; + let draw = () => {}; + const frame = () => { const now = clock(); draw(held ? sc.still : (((now + off) % sc.dur) + sc.dur) % sc.dur, now); }; + const tick = () => { cancelAnimationFrame(raf); frame(); if (seen && !held) raf = requestAnimationFrame(tick); }; + const api = { now: clock, seek: (s) => { off = s - clock(); held = false; tick(); }, poke: () => { held = false; tick(); } }; + draw = sc.build(svg, api); + if (frozen) { draw(isNaN(fixed) ? sc.still : fixed, 0); return; } + new IntersectionObserver(([e]) => { + seen = e.isIntersecting; + if (seen) { tick(); if (!fig.dataset.sent && window.posthog) { fig.dataset.sent = 1; window.posthog.capture("blog_scene_view", { slug: location.pathname.split("/").filter(Boolean).pop(), scene: fig.dataset.scene }); } } + else cancelAnimationFrame(raf); + }, { threshold: 0.25 }).observe(fig); + svg.addEventListener("click", () => { if (!fig.dataset.hit && window.posthog) { fig.dataset.hit = 1; window.posthog.capture("blog_scene_interact", { slug: location.pathname.split("/").filter(Boolean).pop(), scene: fig.dataset.scene }); } }); + frame(); + }; + const go = () => document.querySelectorAll("figure.mg[data-scene]").forEach(mount); + const fonts = document.fonts && document.fonts.load ? Promise.all([document.fonts.load('700 32px "Space Grotesk"'), document.fonts.load('500 20px "Space Grotesk"'), document.fonts.load('700 20px "JetBrains Mono"')]).catch(() => {}) : Promise.resolve(); + const start = () => fonts.then(go, go); + if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", start); else start(); +})(); diff --git a/blog/src/assets/media/what-is-kimi-k3-1-pro/plugs.png b/blog/src/assets/media/what-is-kimi-k3-1-pro/plugs.png new file mode 100644 index 0000000000..300663186e Binary files /dev/null and b/blog/src/assets/media/what-is-kimi-k3-1-pro/plugs.png differ diff --git a/blog/src/assets/media/what-is-kimi-k3-1-pro/route.png b/blog/src/assets/media/what-is-kimi-k3-1-pro/route.png new file mode 100644 index 0000000000..d3ea684fcc Binary files /dev/null and b/blog/src/assets/media/what-is-kimi-k3-1-pro/route.png differ diff --git a/blog/src/posts/agent-tools-today-2026-10-26.md b/blog/src/posts/agent-tools-today-2026-10-26.md index c835864593..e0918c1818 100644 --- a/blog/src/posts/agent-tools-today-2026-10-26.md +++ b/blog/src/posts/agent-tools-today-2026-10-26.md @@ -20,7 +20,7 @@ Agent tools today, 26 Oct 2026, in one line: Moonshot AI shipped Kimi K3.1 Pro, ## Top 3 launches -1. **Kimi K3.1 Pro.** Moonshot AI's most capable open weight model in its 3T class, with a context window of one million tokens and a Highspeed version at 2 to 3 times the speed. It is live in Kimi Code and the Kimi API, with full weights due by 4 Nov. In the vendor's own figures, published 23 Oct, it scores 65.7% on Terminal-Bench 4.0 against 66.4% for Claude Opus 5.5. More than 1,050 points and 650 comments on Hacker News on 23 Oct. [Source](https://www.kimi.ai/blog/kimi-k3-1-pro) +1. **Kimi K3.1 Pro.** Moonshot AI's most capable open weight model in its 3T class, with a context window of one million tokens and a Highspeed version at 2 to 3 times the speed. It is live in Kimi Code and the Kimi API, with full weights due by 4 Nov. In the vendor's own figures, published 23 Oct, it scores 65.7% on Terminal-Bench 4.0 against 66.4% for Claude Opus 5.5. More than 1,050 points and 650 comments on Hacker News on 23 Oct. Details in [Kimi K3.1 Pro](/blog/what-is-kimi-k3-1-pro/). [Source](https://www.kimi.ai/blog/kimi-k3-1-pro) 2. **Chat and Cowork become one Claude for Enterprise.** Generally available on 23 Oct. A conversation starts as a chat; when a task needs code or files, Claude continues in the cloud, keeps going after you close your laptop, and you pick it up on the web, desktop or mobile. Each cloud session runs in its own isolated virtual machine, and a new Efficient mode keeps work on Sonnet and Haiku. See [Claude Cowork vs Claude Code](/blog/claude-cowork-vs-claude-code/). [Source](https://claude.com/resources/articles/unified-claude-enterprise) 3. **JetBrains ThinkRail.** An incubator project that bills itself as "the agentic IDE that gets better every time you use it". It wraps the `pi` coding agent in a real editor, gives each workspace its own git worktree, and keeps `SPEC.md` files the agent maintains. More than 190 points on Hacker News on 25 Oct, Apache 2.0, more than 1,900 stars. [Source](https://github.com/JetBrains/thinkrail) diff --git a/blog/src/posts/gemini-4-argon-vs-claude-opus-5-5.md b/blog/src/posts/gemini-4-argon-vs-claude-opus-5-5.md index 3ab06924d8..82d9379d90 100644 --- a/blog/src/posts/gemini-4-argon-vs-claude-opus-5-5.md +++ b/blog/src/posts/gemini-4-argon-vs-claude-opus-5-5.md @@ -96,6 +96,6 @@ Names matter too. Meta's table this week listed Claude Opus 5.5 at 59.6 on Termi Our view: pick by job, not by logo. On Google's figures, Gemini 4 Argon suits long documents and, until December, tight budgets. Claude Opus 5.5 suits terminal work, and GPT-6 Astra leads the OSWorld-2.0 offline subset, one of the two computer use rows. -Mixing models by task is covered in [model routing](/blog/do-more-with-less-model-routing/), and Google's own coding tool in [Gemini CLI vs Claude Code](/blog/gemini-cli-vs-claude-code/). +Mixing models by task is covered in [model routing](/blog/do-more-with-less-model-routing/), and Google's own coding tool in [Gemini CLI vs Claude Code](/blog/gemini-cli-vs-claude-code/). For an open weight model against Opus, see [Mistral Large 4 vs Claude Opus 5.5](/blog/mistral-large-4-vs-claude-opus-5-5/). diff --git a/blog/src/posts/how-to-run-mistral-large-4.md b/blog/src/posts/how-to-run-mistral-large-4.md new file mode 100644 index 0000000000..5fe72903f2 --- /dev/null +++ b/blog/src/posts/how-to-run-mistral-large-4.md @@ -0,0 +1,101 @@ +--- +title: "How to Run Mistral Large 4 Locally: Hardware, GGUF Sizes and vLLM (Oct 2026)" +seoTitle: "How to Run Mistral Large 4 Locally (2026): Memory, GGUF, vLLM" +description: "Mistral Large 4 weights are out. Which file fits your memory, the llama.cpp and vLLM commands, the GPUs Mistral validated and the licence, checked 29 Oct 2026." +date: 2026-10-29 +category: guides +categoryLabel: Guides +type: Technical +primaryKeyword: "how to run mistral large 4 locally" +secondaryKeywords: ["mistral large 4 gguf", "mistral large 4 hardware requirements", "mistral large 4 vllm", "mistral large 4 llama.cpp", "mistral large 4 weights download", "mistral large 4 mac studio"] +tags: ["Guides", "Open Source", "Local-First", "AI Agents"] +faq: + - q: "How much memory do you need to run Mistral Large 4?" + a: "At least about 256 GB of RAM plus VRAM, or unified memory, for the smallest file. Unsloth's guide of 29 Oct 2026 says its 1 bit UD-IQ1_S quant uses about 233 GB of disk and should fit on 256 GB, including a Mac Studio. The 4 bit UD-Q4_K_XL file is 605 GB and the full FP8 checkpoint about 1.06 TB." + - q: "Can Mistral Large 4 run on a Mac?" + a: "Only a Mac with 256 GB or more of unified memory, using a heavily quantized GGUF. Unsloth names a Mac Studio for its 233 GB 1 bit file, and llama.cpp enables Metal by default on macOS. ggml-org lists its 381 GB Q2_K and 298 GB IQ2_XXS files as fitting in 512 GB of unified memory." + - q: "What GPUs does vLLM support for Mistral Large 4?" + a: "vLLM's recipe, read 29 Oct 2026, lists validated runs on NVIDIA GB300, 8x B300, 8x B200, two nodes of 8 H200 with FP8, and AMD Instinct MI350X with 8 GPUs. It says FP8 needs about 128 GiB of weights per GPU on 8 GPUs and NVFP4 about 76 GiB." + - q: "Is Mistral Large 4 free for commercial use?" + a: "Mostly. Mistral's post of 29 Oct 2026 says the Mistral Ecosystem Open-Weight license, a modified MIT license, lets you use, modify, fine tune and commercialize the model, with one condition: a business that runs a Model as a Service offering needs a separate commercial license from Mistral." + - q: "Is it cheaper to use the Mistral API than to self host?" + a: "For most people, yes. Mistral's post of 29 Oct 2026 prices the API at $0.70 per million input tokens, $0.07 cached and $2.10 output, and the model card recommends the Mistral API if local serving is subpar. Self hosting pays off when the data must stay on your own hardware." +--- + +You can run Mistral Large 4 yourself from today, but only with about 256 GB of memory or more: a 1 bit GGUF on a large Mac Studio, a 2 to 4 bit GGUF on a workstation, or the full checkpoint on 8 data center GPUs with vLLM. Mistral released the weights on 29 Oct 2026, checked the same day. + +If you want a team of agents on your own work, [Munder Difflin](https://harnessmd.com/download) is free and open source: a desktop app that runs a team of AI agents for all kinds of knowledge work, coding included, on your own computer. For what the model is and its scores, see [Mistral Large 4](/blog/mistral-large-4/). This guide sits in our [Guides hub](/blog/topics/guides/). + +
Animation. On a white background, five suitcases ride a baggage carousel, smallest first, tagged 233 GB 1 bit, 378 GB 2 bit, 605 GB 4 bit, 1.1 TB 8 bit and 2.1 TB 16 bit. A shelf labelled 256 GB memory accepts only the smallest case. Tapping a case shows which memory size it needs.
GGUF file sizes from Unsloth and ggml-org on Hugging Face, read 29 Oct 2026.
+ +## What do you need to run Mistral Large 4? + +Total memory decides it: RAM plus VRAM, or unified memory, has to be larger than the file you load. The [model card](https://huggingface.co/mistralai/Mistral-Large-4-1T-A52B), read 29 Oct 2026, describes a mixture of experts model with "49 billion active parameters per token" out of about 1 trillion, a 1M token context window and text plus image input. + +Only the active part runs for each token, but all of it has to sit in memory. That is why a model with 49B active parameters still needs hundreds of gigabytes. + +| File (checked 29 Oct 2026) | Size | Source | +| --- | --- | --- | +| UD-IQ1_S, 1 bit | 233 GB | Unsloth | +| UD-Q2_K_XL, 2 bit | 378 GB | Unsloth | +| UD-Q4_K_XL, 4 bit | 605 GB | Unsloth | +| Q8_0, 8 bit | 1.12 TB | ggml-org | +| NVFP4 checkpoint | about 610 GB | vLLM recipe | +| FP8 checkpoint | about 1.06 TB | vLLM recipe | + +[Unsloth's guide](https://unsloth.ai/docs/models/mistral-large-4) says the 1 bit file "should fit on 256GB RAM including a Mac Studio or 2x NVIDIA DGX Sparks", and that its 2 bit file keeps 95.6% of top 1 accuracy against the original. Longer contexts need more memory on top of the file. + +## How to run it on one machine with llama.cpp + +Use a GGUF file and a llama.cpp build with Mistral Large 4 support. ggml-org publishes [GGUF files](https://huggingface.co/ggml-org/Mistral-Large-4-1T-A52B-GGUF) from 298 GB up, and Unsloth publishes its own. Unsloth's example serves the 2 bit file with a 32K context: + +```bash +./llama.cpp/build/bin/llama-server \ + -hf unsloth/Mistral-Large-4-1T-A52B-GGUF:UD-Q2_K_XL \ + --ctx-size 32768 --temp 1.0 --top-p 0.95 --top-k 0 --min-p 0.0 \ + --chat-template-kwargs '{"reasoning_effort":"high"}' \ + --host 127.0.0.1 --port 8080 +``` + +That starts a chat page at http://127.0.0.1:8080 and an API at /v1. On a Mac, Unsloth says "Metal support is enabled by default". If you run out of memory, it says to lower the context size or pick a smaller quant. Unsloth Desktop does the same on macOS, Windows and Linux without the command line. + +Two settings come from the model card: temperature 1.0 and top_p 0.95 for every reasoning effort. The ggml-org page adds that "Reasoning cannot be turned off": low, medium and high are the choices, and high is the default. + +## How to serve it on GPUs with vLLM + +Mistral recommends [vLLM](https://recipes.vllm.ai/mistralai/Mistral-Large-4-1T-A52B) for production. The model card serves it from the official Docker image across 8 GPUs: + +```bash +docker run --runtime nvidia --gpus all \ + -v ~/.cache/huggingface:/root/.cache/huggingface \ + -p 8000:8000 --ipc=host \ + vllm/vllm-openai:mistral-large-4 \ + --model mistralai/Mistral-Large-4-1T-A52B \ + --tensor-parallel-size 8 \ + --tool-call-parser mistral --reasoning-parser mistral \ + --enable-auto-tool-choice --gpu-memory-utilization 0.85 +``` + +The two parser flags are required for tool calls and to keep reasoning out of the answer. vLLM's recipe lists validated hardware: NVIDIA GB300, 8x B300, 8x B200, two nodes of 8 H200 for FP8, and AMD Instinct MI350X. It says FP8 "needs ~128 GiB of weights per GPU on 8 GPUs", NVFP4 about 76 GiB. The recipe validated contexts up to 256K, not the full 1M. SGLang works too, with its own image. + +
Animation. On a white background, a long loaf labelled Mistral Large 4 is sliced into eight equal pieces that drop into an eight cup baking tin, each cup labelled GPU. A switch flips the label from FP8, 128 GiB a cup, to NVFP4, 76 GiB a cup, and the slices shrink.
vLLM's recipe, read 29 Oct 2026: about 128 GiB of weights per GPU for FP8 on 8 GPUs, about 76 GiB for NVFP4.
+ +## What does the licence allow? + +Almost everything except selling the model as a hosted service. Mistral's [post of 29 Oct 2026](https://mistral.ai/news/mistral-large-4-oss/) calls it the Mistral Ecosystem Open-Weight license, "a modified MIT license", free to "use, modify, fine-tune, and commercialize". The one condition: "businesses that operate a Model-as-a-Service offering must obtain a separate commercial license from Mistral". The [licence text](https://huggingface.co/mistralai/Mistral-Large-4-1T-A52B/blob/main/LICENSE) is in the repo. + +
Animation. On a white background, a wooden signpost rises with four arms that read Use, Modify, Fine tune and Sell, each with a tick. A fifth arm reading Model as a Service swings out with a small note that says separate licence from Mistral.
Mistral's post of 29 Oct 2026 lists one condition: a separate licence for Model as a Service businesses.
+ +## Should you self host or use the API? + +Use the API unless the data has to stay on hardware you control. Mistral's post priced it at $0.70 per million input tokens, $0.07 cached and $2.10 output on 29 Oct 2026, and the model card says to use the Mistral API "if local serving is subpar". The post also lists OpenRouter, Microsoft Foundry and NVIDIA hosted endpoints. + +Self hosting earns its cost when the model must run under your own control, or when you want to fine tune it; Unsloth, Axolotl and TRL all list guides. + +## Can you use it with coding agents? + +Yes, through any agent that accepts an OpenAI compatible base URL; both servers above expose one. Mistral points to its own coding agent, Mistral Vibe. + +Munder Difflin 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. Some of its engines accept a local base URL; [running Munder Difflin on open models](/blog/run-munder-difflin-on-open-models/) has the wiring. 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. For a lighter local setup, see [how to connect Ollama to Claude Code](/blog/how-to-connect-ollama-to-claude-code/). + + diff --git a/blog/src/posts/mistral-large-4-vs-claude-opus-5-5.md b/blog/src/posts/mistral-large-4-vs-claude-opus-5-5.md new file mode 100644 index 0000000000..47cc037883 --- /dev/null +++ b/blog/src/posts/mistral-large-4-vs-claude-opus-5-5.md @@ -0,0 +1,92 @@ +--- +title: "Mistral Large 4 vs Claude Opus 5.5: Price, Coding Scores and Open Weights (Oct 2026)" +seoTitle: "Mistral Large 4 vs Claude Opus 5.5 (2026): Price and Coding" +description: "Claude Opus 5.5 leads on coding scores; Mistral Large 4 costs about a tenth per output token and you can download it. Prices and scores, checked 29 Oct 2026." +date: 2026-10-29 +category: comparisons +categoryLabel: Comparisons +type: Non-technical +primaryKeyword: "mistral large 4 vs claude opus 5.5" +secondaryKeywords: ["mistral large 4 vs claude", "le chonk vs opus", "mistral large 4 vs opus 5.5 coding", "mistral large 4 price vs claude", "best open weight model vs claude opus"] +tags: ["Comparisons", "Open Source", "AI Agents", "Cost"] +faq: + - q: "Is Mistral Large 4 better than Claude Opus 5.5?" + a: "Not at coding, on the published figures. On the Artificial Analysis Coding Agent Index, Mistral's post of 29 Oct 2026 gives Mistral Large 4 48%, and Artificial Analysis gave Claude Code with Claude Opus 5.5 (max) 62 on 28 Oct 2026. Mistral's own post says graders in Surge Code's blind test ranked it behind only Claude Opus 5.5 among the models evaluated." + - q: "How much cheaper is Mistral Large 4 than Claude Opus 5.5?" + a: "About 5.7 times cheaper on input and 9.5 times on output, at list prices on 29 Oct 2026. Mistral listed $0.70 input and $2.10 output per million tokens; Anthropic listed $4 and $20 for Claude Opus 5.5." + - q: "Can you download Claude Opus 5.5 like Mistral Large 4?" + a: "No. Claude Opus 5.5 is a hosted model you call by its API ID, claude-opus-5-5, or use in Claude's apps. Mistral released the Mistral Large 4 weights on Hugging Face on 29 Oct 2026 under the Mistral Ecosystem Open-Weight license, a modified MIT license." + - q: "Do both have a 1M token context window?" + a: "Yes. Anthropic's models overview, read 29 Oct 2026, lists 1M tokens of context and 128K tokens of output for Claude Opus 5.5. Mistral's model card lists a 1M context window for Mistral Large 4, and vLLM's recipe says it validated serving up to 256K." +--- + +Claude Opus 5.5 is the stronger coding model on every shared score we found; Mistral Large 4 costs about a tenth per output token and is the one you can download and run yourself. Pick Opus for the hardest agent work, Mistral for volume, cost or data that must stay in house. Checked 29 Oct 2026. + +If you run agents on your own work, [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 page sits in our [Comparisons hub](/blog/topics/comparisons/). + +## Mistral Large 4 vs Claude Opus 5.5 at a glance (checked 29 Oct 2026) + +| | Mistral Large 4 | Claude Opus 5.5 | +| --- | --- | --- | +| Maker | Mistral | Anthropic | +| Weights | Downloadable, Mistral Ecosystem Open-Weight license | Hosted only | +| Input, per million tokens | $0.70 | $4 | +| Output, per million tokens | $2.10 | $20 | +| Cached input or cache read | $0.07 | $0.20 | +| Context window | 1M tokens | 1M tokens | +| Size | About 1T total, 52B active | Not published | +| Reasoning control | low, medium, high (default) | Adaptive thinking, medium effort by default | + +Sources: Mistral's [post of 29 Oct 2026](https://mistral.ai/news/mistral-large-4-oss/) and [model card](https://huggingface.co/mistralai/Mistral-Large-4-1T-A52B); Anthropic's [models overview](https://platform.claude.com/docs/en/about-claude/models/overview) and [pricing page](https://claude.com/pricing). + +## Which is better at coding? + +Claude Opus 5.5, on the scores both vendors and testers published. Mistral's post of 29 Oct 2026 gives Mistral Large 4 48% on the Artificial Analysis Coding Agent Index, "effectively tied with the leading open-weight model, GLM-5.3, while using 47% fewer tokens per task". Artificial Analysis wrote on 28 Oct 2026 that Claude Code with Claude Opus 5.5 (max) scores 62 on the same index, the top result. + +Mistral says so itself in one place: in Surge Code's blind pairwise test, Mistral Large 4 ranked "behind only Claude Opus 5.5 among the models evaluated", ahead of GLM-5.3, Kimi K3 and DeepSeek V4.1 Flash. + +Terminal-Bench 4.0 points the same way, with a caveat: Mistral reports 41% for its model, while Kimi's and Google's launch tables list Claude Opus 5.5 at 66.4%. Those figures come from different vendors and harnesses, so read the gap as a direction, not an exact margin. + +
Animation. On a white background, two lanes of a running track draw forward. A blue marker labelled Claude Opus 5.5 stops at 62 and a lilac marker labelled Mistral Large 4 stops at 48 on a scale titled Coding Agent Index. Tapping a lane shows its source.
Artificial Analysis Coding Agent Index, 28 Oct 2026: Claude Code with Opus 5.5 (max) 62, Mistral Large 4 48 as reported in Mistral's post.
+ +## Which is cheaper? + +Mistral Large 4, by a wide margin. On 29 Oct 2026, Mistral listed $0.70 per million input tokens and $2.10 per million output tokens, against $4 and $20 for Claude Opus 5.5 on Anthropic's pricing page. That is about 5.7 times less for input and 9.5 times less for output. + +Anthropic's pricing page says batch processing saves 50%, which narrows the gap for work that can wait. Mistral's claim of 47% fewer tokens per task is measured against GLM-5.3, not against Opus. + +Self hosting removes the token bill for Mistral Large 4 but needs hundreds of gigabytes of memory; [how to run Mistral Large 4 locally](/blog/how-to-run-mistral-large-4/) has the sizes. + +
Animation. On a white background, two taxi meters tick side by side while a counter reads one million output tokens. The left meter, Mistral Large 4, stops at 2.10 dollars. The right meter, Claude Opus 5.5, keeps going to 20 dollars. A toggle switches the counter to input tokens: 0.70 against 4 dollars.
List prices per million tokens on 29 Oct 2026: Mistral's post and Anthropic's pricing page.
+ +## Can you run either one yourself? + +Only Mistral Large 4. Its weights went up on Hugging Face on 29 Oct 2026, with GGUF files for llama.cpp and a vLLM recipe for GPU servers. The licence is free to "use, modify, fine-tune, and commercialize", except that a Model as a Service business needs a separate licence from Mistral. + +Claude Opus 5.5 runs only where Anthropic serves it: the Claude API, Claude's apps and the cloud platforms each model page lists. That is the trade: Opus gives more capability per call, Mistral gives you the file. + +
Animation. On a white background, two shelves sit side by side. From the left shelf, labelled Mistral Large 4, a thick book slides off into a tote bag tagged Download. On the right shelf, labelled Claude Opus 5.5, the book stays behind glass and a reading card tagged API slides out instead.
Mistral Large 4 weights are on Hugging Face; Claude Opus 5.5 is hosted only. Checked 29 Oct 2026.
+ +## Pick Mistral Large 4 if..., pick Claude Opus 5.5 if... + +Pick by what costs you more: wrong answers or token bills. + +**Pick Mistral Large 4 if:** +- You need the model on hardware you control, or want to fine tune it. +- You run a lot of tokens and price matters more than the last points of quality. +- You work in one of the 160 plus languages Mistral lists, or want a model trained in Europe. + +**Pick Claude Opus 5.5 if:** +- You want the top coding agent result on the Artificial Analysis index. +- You run long agent tasks where a failed run costs more than the tokens. +- You do not want to run servers. + +For other match ups, see [Gemini 4 Argon vs Claude Opus 5.5](/blog/gemini-4-argon-vs-claude-opus-5-5/) and our page on [Mistral Large 4](/blog/mistral-large-4/). + +## Can you use both in one team? + +Yes. A common split is the strong hosted model for planning and review, and the cheaper or local one for bulk work. + +Munder Difflin 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. Some engines accept a local base URL, so an open model can drive them; see [running Munder Difflin on open models](/blog/run-munder-difflin-on-open-models/). 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. + + diff --git a/blog/src/posts/mistral-large-4.md b/blog/src/posts/mistral-large-4.md index 7179aa7e77..048e255886 100644 --- a/blog/src/posts/mistral-large-4.md +++ b/blog/src/posts/mistral-large-4.md @@ -1,104 +1,101 @@ --- title: "Mistral Large 4 (Le Chonk): size, price, scores and weights" -description: "Mistral Large 4 is a 1 trillion parameter open weight model in public preview. Context window, API price, Mistral's own scores and weights, checked 6 Oct 2026." +description: "Mistral Large 4 is a 1 trillion parameter open weight model, with weights out since 29 Oct 2026. Context window, API price, scores, licence and hardware." date: 2026-10-06 +updated: 2026-10-29 category: concepts categoryLabel: Concepts type: Non-technical primaryKeyword: "mistral large 4" -secondaryKeywords: ["mistral large 4 benchmarks", "mistral large 4 pricing", "mistral large 4 open weights", "le chonk mistral", "mistral large 4 vs", "mistral large 4 context window"] +secondaryKeywords: ["mistral large 4 benchmarks", "mistral large 4 pricing", "mistral large 4 open weights", "le chonk mistral", "mistral large 4 vs", "mistral large 4 context window", "mistral large 4 license"] tags: ["Concepts", "Open Source", "AI Agents"] faq: - q: "Is Mistral Large 4 open source?" - a: "Mistral calls it open weight, and the weights are not out yet. Its launch post of 6 October 2026 says it will release the weights by the end of the month. When we checked Mistral's model page on 6 Oct 2026, both the weights and the licence were marked Coming soon. VentureBeat reported the same day that the weights are expected under a custom Mistral license." + a: "It is open weight. Mistral released the weights on Hugging Face on 29 October 2026 under the Mistral Ecosystem Open-Weight license, which its post calls a modified MIT license. You may use, modify, fine tune and commercialize it; a business that runs a Model as a Service offering needs a separate commercial license from Mistral." - q: "What is the Mistral Large 4 context window?" - a: "1M tokens. Mistral's model page listed a context size of 1M tokens on 6 Oct 2026, and defines the context window as the maximum number of input plus output tokens the model can process at once." + a: "1M tokens. Mistral's model card, read 29 Oct 2026, lists a 1M context length, and vLLM's recipe says it validated serving up to 256K. Mistral's model page defines the context window as the maximum number of input plus output tokens the model can process at once." - q: "How much does Mistral Large 4 cost?" - a: "Mistral's model page listed $0.68 per million input tokens, $0.07 per million cached input tokens and $2.09 per million output tokens on 6 Oct 2026. The same page showed $1.36, $0.14 and $4.18 struck through, and the launch post lists $1.36 and $4.18. The page did not say how long the lower prices last." + a: "Mistral's post of 29 Oct 2026 prices the API at $0.70 per million input tokens, $0.07 per million cached input tokens and $2.10 per million output tokens. On 6 Oct 2026 the model page had listed $0.68, $0.07 and $2.09, with higher prices struck through." - q: "Why is Mistral Large 4 called Le Chonk?" a: "It is Mistral's own nickname for the model. The launch post of 6 October 2026 says the model is unofficially ML4 and very officially le Chonk. Mistral describes it as its largest and most capable model to date." - q: "Is Mistral Large 4 better than Kimi K3?" - a: "It depends on the test, on the figures Mistral published. Mistral's charts show Kimi K3 ahead on DeepSWE 1.1 (68 against 62) and Mistral Large 4 ahead on Terminal-Bench 4 (28 against 21). VentureBeat reported on 6 October 2026 that Mistral's ranking claim remains provisional until outsiders can test the released weights." + a: "It depends on the test, on the figures Mistral published. Its preview charts of 6 Oct 2026 show Kimi K3 ahead on DeepSWE 1.1 (68 against 62). Its post of 29 Oct 2026 says graders in Surge Code's blind test preferred Mistral Large 4 over Kimi K3, GLM-5.3 and DeepSeek V4.1 Flash, behind only Claude Opus 5.5 among the models evaluated." --- -Our view: Mistral Large 4, nicknamed Le Chonk, is a serious open weight coding model that you can only rent for now. Mistral launched it as a public preview on 6 October 2026, with about 1 trillion parameters, a 1M token context window, an API you can call today and weights promised this month. Checked 6 Oct 2026. +Our view: Mistral Large 4, nicknamed Le Chonk, is now the open weight coding model to try first if you can host about 1 trillion parameters, and a cheap API model if you cannot. Mistral released the weights on 29 October 2026, three weeks after the 6 October preview, with a 1M token context window. Checked 29 Oct 2026. -Open models can drive coding agents, which is why we care. [Munder Difflin](https://harnessmd.com/download) is free and open source: a desktop app that runs a team of coding agents such as Claude Code, Codex and Gemini CLI on your own computer. Our guide to [running Munder Difflin on open models](/blog/run-munder-difflin-on-open-models/) covers the models you can use now, the [install guide](/blog/how-to-install-and-use-munder-difflin/) covers setup, and the [Concepts hub](/blog/topics/concepts/) explains the terms. +Open models can drive the agents you run. [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. Our guide to [running Munder Difflin on open models](/blog/run-munder-difflin-on-open-models/) covers the wiring, the [install guide](/blog/how-to-install-and-use-munder-difflin/) covers setup, and the [Concepts hub](/blog/topics/concepts/) explains the terms. ## What is Mistral Large 4? -Mistral Large 4 is Mistral's largest model so far, released as a public preview. The [launch post](https://mistral.ai/news/mistral-large-4/) says the model is "unofficially ML4, very officially: le Chonk". Yes, that is the vendor's wording, not ours. +Mistral Large 4 is Mistral's largest model so far. The [launch post](https://mistral.ai/news/mistral-large-4/) says the model is "unofficially ML4, very officially: le Chonk". Yes, that is the vendor's wording, not ours. -Mistral's [model page](https://docs.mistral.ai/models/mistral-large-4-0) describes an open-weight, general-purpose multimodal model with a Mixture-of-Experts architecture. The launch post says it takes multimodal input and was trained on more than 160 languages. [VentureBeat](https://venturebeat.com/technology/mistral-debuts-large-4-le-chonk-a-1-trillion-parameter-text-output-model-with-high-benchmarks-planned-for-open-weights-release) describes it as a text output model. +The [model card](https://huggingface.co/mistralai/Mistral-Large-4-1T-A52B), read 29 Oct 2026, describes a mixture of experts model that takes text and images and writes text, fluent in more than 160 languages. It unifies instruction following, reasoning, coding and agent work in one set of weights, with three reasoning efforts: low, medium and high, the default. -The [Hacker News thread](https://news.ycombinator.com/item?id=49977979) had more than 750 points and 430 comments when we checked on 6 Oct 2026. +The [Hacker News thread](https://news.ycombinator.com/item?id=50289418) on the weights release had more than 420 points when we checked on 29 Oct 2026. ## How big is it, and what is the context window? -It has about 1 trillion parameters and a 1M token context window. The launch post of 6 October 2026 says "1 trillion-parameter" with 49 billion active parameters. The model page is more exact: 1.05T total parameters, 49B active, and a 1.6B vision encoder. +It has about 1 trillion parameters and a 1M token context window. The model card says "49 billion active parameters per token (52 billion including embeddings and output layers)", from 128 routed experts with 4 active per token plus 1 shared expert. On 6 Oct 2026 Mistral's model page listed 1.05T total and a 1.6B vision encoder. -In plain words: the total sets how big the download will be, and the active count sets how much work each token costs. The model page lists the context size as 1M tokens, counting input and output together. +In plain words: the total sets how big the download is, and the active count sets how much work each token costs.
Animation. A kitchen scale holds a very large flour sack labelled 1.05T total parameters. A small scoop labelled 49B active lifts out of the sack for each new token on a belt beside it, then tips back in.
Mistral's model page lists 1.05T total parameters and 49B active, as of 6 Oct 2026.
## Can you download the weights, and what is the licence? -No, not yet. The launch post says "We will release the weights by the end of the month", and that until then Mistral is red-teaming the model with cybersecurity partners and state authorities. On the model page, the Weights tab showed "Coming soon" for both the weights and the licence on 6 Oct 2026. +Yes, since 29 October 2026. Mistral's [release post](https://mistral.ai/news/mistral-large-4-oss/) says to "download the open weights from Hugging Face and deploy on your own infrastructure with vLLM or SGLang". GGUF files for llama.cpp followed the same day, and a quantized NVFP4 checkpoint targets Blackwell GPUs. -VentureBeat reported on 6 October 2026 that Mistral plans to publish the weights on Oct. 27, and that they are "expected under a custom Mistral license". Mistral's own pages did not name a licence when we checked. Our view: do not plan a commercial self-hosted deployment until the licence text is public. +The licence is the Mistral Ecosystem Open-Weight license, "a modified MIT license". The post says the model "is free to use, modify, fine-tune, and commercialize", with one condition: businesses that run a Model as a Service offering need a separate commercial licence from Mistral. The [licence text](https://huggingface.co/mistralai/Mistral-Large-4-1T-A52B/blob/main/LICENSE) is in the repo. -
Animation. A crate marked Mistral Large 4 rolls in on a trolley. Its delivery slip is stamped Coming soon twice, once for weights and once for licence. A wall calendar for October tears off its pages from 6 to 31, with notes for VentureBeat's Oct. 27 and Mistral's end of month.
Weights and licence were both marked Coming soon on Mistral's model page on 6 Oct 2026. Mistral says the weights arrive by the end of the month.
+
Animation. A crate marked Mistral Large 4 rolls in on a trolley. Its delivery slip is stamped Released twice, once for weights and once for licence. A wall calendar for October tears off its pages from 6 to 29, where a note reads Weights out.
Mistral released the weights and the licence on 29 Oct 2026, three weeks after the preview of 6 Oct.
## What does Mistral Large 4 cost on the API? -Input costs $0.68 per million tokens and output costs $2.09, on the price Mistral's model page listed on 6 Oct 2026. The page showed a higher figure struck through beside each price, and the launch post lists those higher figures. Neither page said how long the lower prices last. +Input costs $0.70 per million tokens and output $2.10, in Mistral's post of 29 Oct 2026. That is a little above the $0.68 and $2.09 the model page listed on 6 Oct 2026, when higher prices were shown struck through. -| Per million tokens | Listed price | Struck through price | +| Per million tokens | 29 Oct 2026 (release post) | 6 Oct 2026 (model page) | | --- | --- | --- | -| Input | $0.68 | $1.36 | -| Cached input | $0.07 | $0.14 | -| Output | $2.09 | $4.18 | +| Input | $0.70 | $0.68 | +| Cached input | $0.07 | $0.07 | +| Output | $2.10 | $2.09 | -Source: [Mistral's model page](https://docs.mistral.ai/models/mistral-large-4-0), checked 6 Oct 2026. The API model name is `mistral-large-4`. +The API model name is `mistral-large-4`. The post also lists OpenRouter, Microsoft Foundry and NVIDIA hosted endpoints. Against Claude, see [Mistral Large 4 vs Claude Opus 5.5](/blog/mistral-large-4-vs-claude-opus-5-5/). -
Animation. Three price tags hang from pegs on a line, for input, cached input and output. On each tag the higher price is crossed out by a pencil and the lower price drops in below it.
Mistral's model page on 6 Oct 2026: input $0.68 with $1.36 struck through, cached input $0.07 with $0.14 struck through, output $2.09 with $4.18 struck through.
+
Animation. Three price tags hang from pegs on a line, for input, cached input and output. Each tag shows the price from Mistral's release post of 29 Oct 2026: 0.70, 0.07 and 2.10 dollars per million tokens. Tapping a tag shows the 6 Oct price beside it.
Mistral's release post on 29 Oct 2026: input $0.70, cached input $0.07, output $2.10 per million tokens.
## How does Mistral Large 4 score on benchmarks? -On the vendor's own figures, it is second among the five models in both charts below, and leads neither. The two rows below are our selection from the charts in Mistral's [launch post](https://mistral.ai/news/mistral-large-4/). The charts round to whole numbers. +Better than the preview, on Mistral's own figures. Its post of 29 Oct 2026 gives 48% on the Artificial Analysis Coding Agent Index, "effectively tied with the leading open-weight model, GLM-5.3, while using 47% fewer tokens per task". It gives 41% on Terminal-Bench 4.0, 13 points above the preview, and 19.7% on Cognition's private FrontierCode 2.0 benchmark. -| Benchmark (Mistral's charts) | Mistral Large 4 | Kimi K3 | GLM-5.3 | DeepSeek V4 Pro 0813 | Qwen3.8 Max | +The preview charts of 6 October showed a different picture; two rows we selected: + +| Preview benchmark (6 Oct 2026, Mistral's charts) | Mistral Large 4 | Kimi K3 | GLM-5.3 | DeepSeek V4 Pro 0813 | Qwen3.8 Max | | --- | --- | --- | --- | --- | --- | | DeepSWE 1.1 | 62 | 68 | 61 | 57 | 51 | | Terminal-Bench 4 | 28 | 21 | 40 | 10 | 17 | -In its text, Mistral gives 61.7% on DeepSWE v1.1, 28.3% on Terminal-Bench 4 and 59.4% on SWE-Atlas-QnA, and a combined Coding Agent Index of 49.8%. It also says the model solves 93% of Cybench. In a blind human evaluation of coding quality across five models, Mistral says the preview rated 3.74 out of 5, second to Claude Opus 5 at 4.22. - -VentureBeat noted that the model did not yet appear in Artificial Analysis' public evaluations or on the DeepSWE leaderboard, so the ranking claim "remains provisional". Mistral's charts say the scores were evaluated privately by Artificial Analysis. For another launch this week, see our [Reflection Beam explainer](/blog/reflection-beam/). +The model card puts it at 26 on the Artificial Analysis Intelligence Index v5, "the highest among western open-weight models", and says leading Chinese open models score higher on that index. For another launch, see our [Reflection Beam explainer](/blog/reflection-beam/).
Animation. Five flags for Mistral Large 4, Kimi K3, GLM-5.3, DeepSeek V4 Pro 0813 and Qwen3.8 Max slide up their poles to heights set by their scores, first for DeepSWE 1.1 and then for Terminal-Bench 4, and the order changes between the two.
Mistral's own figures from its launch post of 6 October 2026, two rows we selected.
## What hardware do you need to run it? -Mistral has not said. The model page has a column for approximate GPU RAM, and it read "N/A" on 6 Oct 2026. The launch post gives training hardware only: 3,800 NVIDIA Grace Blackwell GPUs in Mistral's own datacenters in Europe. +Hundreds of gigabytes of memory. Unsloth's smallest 1 bit GGUF is about 233 GB and, its guide says, fits on 256 GB including a Mac Studio. vLLM's recipe, read 29 Oct 2026, validated it on 8 data center GPUs such as B300 (FP8 or NVFP4) or B200 (NVFP4). -Our view: do not read 49B active as "fits on a workstation". The download will hold every parameter. For a local coding model this week, [is Ollama good for coding?](/blog/is-ollama-good-for-coding/) covers what runs on normal hardware. +Our view: do not read 52B active as "fits on a workstation"; the file holds every parameter. [How to run Mistral Large 4 locally](/blog/how-to-run-mistral-large-4/) has the sizes and commands, and [is Ollama good for coding?](/blog/is-ollama-good-for-coding/) covers what runs on normal hardware. ## Can Mistral Large 4 drive a coding agent today? -Through the API, probably, but no source we opened names a coding CLI that ships with it. The model page lists Function Calling on `/v1/chat/completions`, which is what a coding agent needs from a model. The launch post points people to the preview API on Mistral Studio. - -One detail is telling. Mistral's DeepSWE chart labels rivals by harness, such as Qwen3.8 Max with Claude Code and GLM-5.3 with Opencode. Its own bar names none, and the footnote mentions a harness that has not launched publicly. - -We think any agent that accepts a custom API endpoint could be pointed at it. For what works now, see our [best AI coding agents](/blog/best-ai-coding-agents/) roundup. +Yes. The model card recommends Mistral Vibe, "our coding agent powered by Mistral Large 4", and supports native function calling and strict JSON schema output. Any agent that accepts an OpenAI compatible base URL can point at the API or at your own vLLM server. For what else works, see our [best AI coding agents](/blog/best-ai-coding-agents/) roundup. ## What should you do now? -Try the preview on the API if you are curious, and wait for the weights before committing. +Test it on your own work before you switch. -1. Test `mistral-large-4` on a task from your own repo. -2. Budget on the struck through prices, in case the lower ones end. -3. Read the licence when it is published. -4. Wait for independent scores before you switch models. +1. Run `mistral-large-4` on the API against a task from your own repo. +2. Read the licence if you plan to serve it to others. +3. Price the hardware before self hosting; the API is cheaper for most teams. +4. Compare it with the model you use today at the same reasoning effort. diff --git a/blog/src/posts/what-is-kimi-k3-1-pro.md b/blog/src/posts/what-is-kimi-k3-1-pro.md new file mode 100644 index 0000000000..4b7ee473bd --- /dev/null +++ b/blog/src/posts/what-is-kimi-k3-1-pro.md @@ -0,0 +1,88 @@ +--- +title: "What Is Kimi K3.1 Pro? Price, Weights and How to Use It for Coding (Oct 2026)" +seoTitle: "Kimi K3.1 Pro (2026): Price, Weights, Codex and Claude Code" +description: "Kimi K3.1 Pro is Moonshot's 1M context coding model, weights due by 4 Nov. Price, Terminal-Bench score and setup in Kimi Code, Codex and Claude Code." +date: 2026-10-29 +category: concepts +categoryLabel: Concepts +type: Non-technical +primaryKeyword: "kimi k3.1 pro" +secondaryKeywords: ["what is kimi k3.1 pro", "kimi k3.1 pro price", "kimi k3.1 pro weights", "kimi k3.1 pro codex", "kimi k3.1 pro claude code", "kimi k3.1 pro highspeed"] +tags: ["Concepts", "Open Source", "AI Agents", "Codex"] +faq: + - q: "Is Kimi K3.1 Pro open source?" + a: "Not yet. Kimi's launch post calls it its most capable 3T class open weight model and says the full weights will be released by 4 November 2026. Until then it is available on Kimi's apps, Kimi Work, Kimi Code, the Kimi API and OpenRouter. Checked 29 Oct 2026." + - q: "How much does Kimi K3.1 Pro cost?" + a: "OpenRouter listed moonshotai/kimi-k3.1-pro at $2 per million input tokens, $10 per million output tokens and $0.20 per million cached input tokens on 29 Oct 2026. Kimi's own pricing page says its API is pay as you go with no subscription and no tiering by context length." + - q: "Can I use Kimi K3.1 Pro in Codex?" + a: "Yes. Kimi's Codex guide, read 29 Oct 2026, says Codex can use kimi-k3.1-pro directly through Kimi's Responses API, with no proxy. You add a kimi provider in ~/.codex/config.toml with base_url https://api.moonshot.ai/v1 and wire_api set to responses." + - q: "What is the difference between Kimi K3.1 Pro and K3.1 Pro Highspeed?" + a: "Speed. Kimi's launch post says Kimi K3.1 Pro Highspeed delivers 2 to 3 times the speed of K3.1 Pro for more responsive interactions. Its API model ID is kimi-k3.1-pro-highspeed." + - q: "Can you turn off thinking in Kimi K3.1 Pro?" + a: "No. Kimi's quickstart says K3.1 Pro always has thinking mode on. You set reasoning_effort to low, high or max, and max is the default." +--- + +Kimi K3.1 Pro is Moonshot AI's coding and agent model with a 1M token context window, available through Kimi's apps, Kimi Code and the Kimi API, with open weights promised by 4 November 2026. On Kimi's own Terminal-Bench 4.0 table it sits 0.7 points behind Claude Opus 5.5. Checked 29 Oct 2026. + +For a team of agents on your own work, [Munder Difflin](https://harnessmd.com/download) is free and open source: a desktop app that runs a team of AI agents for all kinds of knowledge work, coding included, on your own computer. For another open model released this week, see [Mistral Large 4](/blog/mistral-large-4/). This page sits in our [Concepts hub](/blog/topics/concepts/). + +
Animation. On a white background, three high jump bars rise to 58.2, 65.7 and 66.4 on a scale titled Terminal-Bench 4.0, labelled GPT-6 Astra, Kimi K3.1 Pro and Claude Opus 5.5. A small ruler slides between the two highest bars and reads 0.7 points. Tapping a bar shows its source.
Terminal-Bench 4.0 figures from Kimi's launch post: Claude Opus 5.5 66.4%, Kimi K3.1 Pro 65.7%, GPT-6 Astra 58.2%.
+ +## What is Kimi K3.1 Pro? + +It is the first model in Kimi's K3.1 series, a post trained version of Kimi K3. Kimi's [launch post](https://kimi.ai/blog/kimi-k3-1-pro) calls it "our most capable 3T-class open-weight model to date", with improvements "across coding, 3D creation, financial research, and other agentic capabilities". OpenRouter first listed it on 23 Oct 2026. + +A faster variant, Kimi K3.1 Pro Highspeed, "delivers 2-3× the speed of K3.1 Pro", the post says. Moonshot posted it on 23 Oct 2026, and the [Hacker News thread](https://news.ycombinator.com/item?id=50212065) had more than 1,090 points and 670 comments when we checked on 29 Oct 2026. + +Kimi's [quickstart](https://platform.kimi.ai/docs/guide/kimi-k3-1-pro-quickstart.md) adds three facts that matter for agents: thinking is always on, `reasoning_effort` takes low, high or max (the default), and the API accepts text, images and video. + +## How good is it at coding? + +Close to the top on Kimi's own figures. On Terminal-Bench 4.0, the post gives "65.7%, ahead of GPT-6 Astra (58.2%) and narrowly behind Claude Opus 5.5 (66.4%)". Kimi says it ran its model "with the Claude-Code harness" and took rivals' scores from their posts or the official leaderboard, so the margin depends on setup. + +On Kimi Code Bench 3.0 Long-horizon, an internal test, it scores 61.2% against K3's 55.95%. Artificial Analysis wrote on 28 Oct 2026 that Kimi K3.1 Pro scores 1678 Elo on its AA-Briefcase knowledge work test, above Muse Wonder (1659) and Grok 4.7 (1638). + +## How much does it cost? + +On 29 Oct 2026, OpenRouter listed it at $2 per million input tokens, $10 per million output tokens and $0.20 per million cached input tokens, with a 1,048,576 token context. Kimi's [pricing page](https://platform.kimi.ai/docs/pricing/chat.md) says the API is pay as you go, "with no subscription plan", and the quickstart says there is "no tiering by context length". + +Because thinking is always on, output tokens include reasoning. Setting `reasoning_effort` to low is the lever Kimi gives for cost and speed. + +
Animation. On a white background, a parcel tracking line draws three stops: Launched 23 Oct with a tick, API and apps today with a tick, and Weights by 4 Nov with an empty circle. A small parcel labelled Kimi K3.1 Pro moves along the line and waits at the last stop.
Launch on 23 Oct 2026 and weights promised by 4 Nov 2026, from Kimi's launch post and OpenRouter's listing.
+ +## When are the weights out? + +By 4 November 2026, Kimi says: "Full model weights will be released by Nov 4, 2026." Until then you rent it. The post also says Kimi removed cyber related data from training for the open release, and that its offensive cyber skill "remains behind that of frontier proprietary models". + +## How do you use it for coding? + +Three routes, from Kimi's own docs, read 29 Oct 2026: + +1. **Kimi Code.** Run Kimi Code and pick Kimi K3.1 Pro with the `/model` command, the launch post says. Kimi Code CLI also takes a Kimi API key. +2. **Codex.** Kimi's [Codex guide](https://platform.kimi.ai/docs/guide/codex-kimi.md) says Codex "can use the `kimi-k3.1-pro` model directly" through Kimi's Responses API, with this in `~/.codex/config.toml`: + +```toml +model = "kimi-k3.1-pro" +model_provider = "kimi" +model_context_window = 1048576 + +[model_providers.kimi] +name = "Kimi" +base_url = "https://api.moonshot.ai/v1" +env_key = "KIMI_API_KEY" +wire_api = "responses" +``` + +3. **Claude Code.** Kimi's [Claude Code guide](https://platform.kimi.ai/docs/guide/claude-code-kimi.md) points Claude Code at its Anthropic compatible endpoint, `https://api.moonshot.ai/anthropic`, through `ANTHROPIC_BASE_URL` in `~/.claude/settings.json`. Its example sets the model to `kimi-k3[1m]`, and its test call uses `kimi-k3.1-pro`. + +Both guides need a key from the Kimi API Platform. Our [Codex CLI install guide](/blog/how-to-install-codex-cli/) covers Codex itself. + +
Animation. On a white background, a power strip labelled Kimi API lights up as three plugs slide into it one by one, labelled Kimi Code, Codex and Claude Code. Each plug shows a small tag: model picker, config.toml and settings.json. Tapping a plug shows the endpoint it uses.
Kimi's docs, read 29 Oct 2026, cover Kimi Code, Codex through the Responses API and Claude Code through the Anthropic compatible endpoint.
+ +## Should you switch to it? + +Try it if you want a cheaper model close to Claude Opus 5.5 on terminal coding, and if open weights matter to you later. Wait for independent scores and the weights if you plan to self host. + +Munder Difflin 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, and [Mistral Large 4 vs Claude Opus 5.5](/blog/mistral-large-4-vs-claude-opus-5-5/) compares another open model with Opus. + + diff --git a/docs/blog/agent-security-and-sandboxing/index.html b/docs/blog/agent-security-and-sandboxing/index.html index ff8538b98e..182d4862a7 100644 --- a/docs/blog/agent-security-and-sandboxing/index.html +++ b/docs/blog/agent-security-and-sandboxing/index.html @@ -327,50 +327,50 @@

FAQ

Related in Guides

- +
- + 4 min
-

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

-

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

+

How to Run Mistral Large 4 Locally: Hardware, GGUF Sizes and vLLM (Oct 2026)

+

Mistral Large 4 weights are out. Which file fits your memory, the llama.cpp and vLLM commands, the GPUs Mistral validated and the licence, checked 29 Oct 2026.

Guides - Read → + Read →
- +
4 min
-

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

-

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

+

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

+

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

Guides - Read → + Read →
- +
- 5 min + 4 min
-

Cursor Pricing (Oct 2026): Every Plan After the 12 Oct Change

-

Cursor pricing as of 26 Oct 2026: Free, Plus $8, Premium $30, Super $100, Ultra $200, Teams seats, what changed on 12 Oct and what old plans keep.

+

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

+

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

Guides - 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..ef50f11521 100644 --- a/docs/blog/agent-tools-today-2026-10-26/index.html +++ b/docs/blog/agent-tools-today-2026-10-26/index.html @@ -177,7 +177,7 @@

Agent Tools Today, 26 Oct 2026: Kimi K3.1 Pro, Unified Claude Enterprise, Th
Animation. On a white background, a laptop labelled Chat shows a short question and a quick answer. A second message asks for a report, and a thin blue line carries it up to a cloud labelled Cloud session. The laptop lid closes and a tag reads Laptop closed, but a progress bar inside the cloud keeps filling. A sheet labelled Report drops onto a phone labelled Mobile, which shows a green tick.
How unified Claude for Enterprise keeps a task running in the cloud after the laptop closes, drawn from Anthropic's post of 23 Oct 2026.

Top 3 launches

    -
  1. Kimi K3.1 Pro. Moonshot AI’s most capable open weight model in its 3T class, with a context window of one million tokens and a Highspeed version at 2 to 3 times the speed. It is live in Kimi Code and the Kimi API, with full weights due by 4 Nov. In the vendor’s own figures, published 23 Oct, it scores 65.7% on Terminal-Bench 4.0 against 66.4% for Claude Opus 5.5. More than 1,050 points and 650 comments on Hacker News on 23 Oct. Source
  2. +
  3. Kimi K3.1 Pro. Moonshot AI’s most capable open weight model in its 3T class, with a context window of one million tokens and a Highspeed version at 2 to 3 times the speed. It is live in Kimi Code and the Kimi API, with full weights due by 4 Nov. In the vendor’s own figures, published 23 Oct, it scores 65.7% on Terminal-Bench 4.0 against 66.4% for Claude Opus 5.5. More than 1,050 points and 650 comments on Hacker News on 23 Oct. Details in Kimi K3.1 Pro. Source
  4. Chat and Cowork become one Claude for Enterprise. Generally available on 23 Oct. A conversation starts as a chat; when a task needs code or files, Claude continues in the cloud, keeps going after you close your laptop, and you pick it up on the web, desktop or mobile. Each cloud session runs in its own isolated virtual machine, and a new Efficient mode keeps work on Sonnet and Haiku. See Claude Cowork vs Claude Code. Source
  5. JetBrains ThinkRail. An incubator project that bills itself as “the agentic IDE that gets better every time you use it”. It wraps the pi coding agent in a real editor, gives each workspace its own git worktree, and keeps SPEC.md files the agent maintains. More than 190 points on Hacker News on 25 Oct, Apache 2.0, more than 1,900 stars. Source
diff --git a/docs/blog/agents-rule-of-two/index.html b/docs/blog/agents-rule-of-two/index.html index e3a7731936..54868f4f19 100644 --- a/docs/blog/agents-rule-of-two/index.html +++ b/docs/blog/agents-rule-of-two/index.html @@ -331,6 +331,22 @@

FAQ

Related in Concepts

+ -
diff --git a/docs/blog/ai-agent-glossary/index.html b/docs/blog/ai-agent-glossary/index.html index 3aa88090f0..e2ac4e90b2 100644 --- a/docs/blog/ai-agent-glossary/index.html +++ b/docs/blog/ai-agent-glossary/index.html @@ -303,6 +303,22 @@

FAQ

Related in Concepts

+ -
diff --git a/docs/blog/ai-agent-office-github/index.html b/docs/blog/ai-agent-office-github/index.html index 93dea06d8f..0fa49d5dbd 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 + 4 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.

+

Mistral Large 4 vs Claude Opus 5.5: Price, Coding Scores and Open Weights (Oct 2026)

+

Claude Opus 5.5 leads on coding scores; Mistral Large 4 costs about a tenth per output token and you can download it. Prices and scores, checked 29 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/ai-agent-use-cases-our-office/index.html b/docs/blog/ai-agent-use-cases-our-office/index.html index 0a3897664c..7f47d0e0af 100644 --- a/docs/blog/ai-agent-use-cases-our-office/index.html +++ b/docs/blog/ai-agent-use-cases-our-office/index.html @@ -422,50 +422,50 @@

FAQ

Related in Guides

- +
- + 4 min
-

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

-

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

+

How to Run Mistral Large 4 Locally: Hardware, GGUF Sizes and vLLM (Oct 2026)

+

Mistral Large 4 weights are out. Which file fits your memory, the llama.cpp and vLLM commands, the GPUs Mistral validated and the licence, checked 29 Oct 2026.

Guides - Read → + Read →
- +
4 min
-

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

-

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

+

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

+

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

Guides - Read → + Read →
- +
- 5 min + 4 min
-

Cursor Pricing (Oct 2026): Every Plan After the 12 Oct Change

-

Cursor pricing as of 26 Oct 2026: Free, Plus $8, Premium $30, Super $100, Ultra $200, Teams seats, what changed on 12 Oct and what old plans keep.

+

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

+

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

Guides - Read → + Read →
diff --git a/docs/blog/aider-vs-claude-code/index.html b/docs/blog/aider-vs-claude-code/index.html index a707aa9852..d15935eeab 100644 --- a/docs/blog/aider-vs-claude-code/index.html +++ b/docs/blog/aider-vs-claude-code/index.html @@ -291,6 +291,22 @@

FAQ

Related in Comparisons

+ -
diff --git a/docs/blog/asd-ste100-prompting/index.html b/docs/blog/asd-ste100-prompting/index.html index 6fd2a55686..6c65461d34 100644 --- a/docs/blog/asd-ste100-prompting/index.html +++ b/docs/blog/asd-ste100-prompting/index.html @@ -365,50 +365,50 @@

FAQ

Related in Guides

- +
- + 4 min
-

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

-

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

+

How to Run Mistral Large 4 Locally: Hardware, GGUF Sizes and vLLM (Oct 2026)

+

Mistral Large 4 weights are out. Which file fits your memory, the llama.cpp and vLLM commands, the GPUs Mistral validated and the licence, checked 29 Oct 2026.

Guides - Read → + Read →
- +
4 min
-

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

-

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

+

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

+

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

Guides - Read → + Read →
- +
- 5 min + 4 min
-

Cursor Pricing (Oct 2026): Every Plan After the 12 Oct Change

-

Cursor pricing as of 26 Oct 2026: Free, Plus $8, Premium $30, Super $100, Ultra $200, Teams seats, what changed on 12 Oct and what old plans keep.

+

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

+

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

Guides - Read → + Read →
diff --git a/docs/blog/assets/media/how-to-run-mistral-large-4/hero.png b/docs/blog/assets/media/how-to-run-mistral-large-4/hero.png new file mode 100644 index 0000000000..1bbb950be3 Binary files /dev/null and b/docs/blog/assets/media/how-to-run-mistral-large-4/hero.png differ diff --git a/docs/blog/assets/media/how-to-run-mistral-large-4/luggage.png b/docs/blog/assets/media/how-to-run-mistral-large-4/luggage.png new file mode 100644 index 0000000000..c300712392 Binary files /dev/null and b/docs/blog/assets/media/how-to-run-mistral-large-4/luggage.png differ diff --git a/docs/blog/assets/media/how-to-run-mistral-large-4/motion.css b/docs/blog/assets/media/how-to-run-mistral-large-4/motion.css new file mode 100644 index 0000000000..05f29fc464 --- /dev/null +++ b/docs/blog/assets/media/how-to-run-mistral-large-4/motion.css @@ -0,0 +1,13 @@ +/* Bright coded scenes for "How to run Mistral Large 4". 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/how-to-run-mistral-large-4/motion.js b/docs/blog/assets/media/how-to-run-mistral-large-4/motion.js new file mode 100644 index 0000000000..a7e5f402d2 --- /dev/null +++ b/docs/blog/assets/media/how-to-run-mistral-large-4/motion.js @@ -0,0 +1,238 @@ +/* Bright coded scenes for "How to run Mistral Large 4". Vanilla JS, no library. +
holds a still image; this script swaps in a live SVG. + Plays only in view, honours reduced motion, "?mgstill" freezes each scene on its still frame. */ +(() => { + const NS = "http://www.w3.org/2000/svg"; + const INK = "#1A1320", YEL = "#FFCA54", BLUE = "#6C8EF5", LIL = "#B69CFF", MINT = "#7FD8AE", SKY = "#9AD8FF", SOFT = "#F1ECF9", MUTE = "#7A6A88"; + const SANS = '"Space Grotesk", system-ui, sans-serif', MONO = '"JetBrains Mono", ui-monospace, monospace'; + const el = (t, a = {}, p) => { const n = document.createElementNS(NS, t); for (const k in a) n.setAttribute(k, a[k]); if (p) p.appendChild(n); return n; }; + const txt = (p, x, y, s, a = {}) => { const n = el("text", Object.assign({ x, y, "font-family": SANS, "font-size": 24, "font-weight": 600, fill: INK }, a), p); n.textContent = s; return n; }; + const cl = (v, a = 0, b = 1) => Math.max(a, Math.min(b, v)); + const seg = (t, a, b) => cl((t - a) / (b - a)); + const oc = (x) => 1 - Math.pow(1 - x, 3); + const ob = (x) => { const c = 1.70158; return 1 + (c + 1) * Math.pow(x - 1, 3) + c * Math.pow(x - 1, 2); }; + const io = (x) => (x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2); + const tf = (n, x, y, s = 1, r = 0) => n.setAttribute("transform", `translate(${x} ${y}) rotate(${r}) scale(${s})`); + const button = (g, label, fn) => { + g.setAttribute("role", "button"); g.setAttribute("tabindex", "0"); g.setAttribute("aria-label", label); g.classList.add("mg-hit"); + g.addEventListener("click", fn); + g.addEventListener("keydown", (e) => { if (e.key === "Enter" || e.key === " ") { e.preventDefault(); fn(); } }); + }; + const strip = (svg, y, w = 680) => { + el("rect", { x: (800 - w) / 2, y, width: w, height: 48, rx: 24, fill: SOFT }, svg); + return txt(svg, 400, y + 31, "", { "text-anchor": "middle", "font-size": 20, "font-weight": 500 }); + }; + + + const SC = {}; + + /* ---- shared suitcase, drawn with its bottom centre at 0,0 ---- */ + const suitcase = (g, w, h, col, tag) => { + el("path", { d: `M-14 ${-h} V${-h - 10} H14 V${-h}`, stroke: INK, "stroke-width": 3, fill: "none", "stroke-linejoin": "round" }, g); + el("rect", { x: -w / 2, y: -h, width: w, height: h, rx: 10, fill: col, stroke: INK, "stroke-width": 3 }, g); + [-0.27, 0.27].forEach((f) => el("path", { d: `M${w * f} ${-h + 3} V-3`, stroke: INK, "stroke-width": 2 }, g)); + const tw = tag.length * 8.4 + 18; + el("path", { d: `M0 ${-h - 10} V${-h - 32}`, stroke: INK, "stroke-width": 2 }, g); + const tg = el("rect", { x: -tw / 2, y: -h - 58, width: tw, height: 26, rx: 6, fill: "#fff", stroke: INK, "stroke-width": 2 }, g); + txt(g, 0, -h - 40, tag, { "text-anchor": "middle", "font-family": MONO, "font-size": 14, "font-weight": 700 }); + return { tg, tw }; + }; + + /* ---- 1. five suitcases on a carousel, one shelf of memory ---- */ + SC.luggage = { + dur: 10, still: 10, + build(svg, api) { + const TAG = ["233 GB 1 bit", "378 GB 2 bit", "605 GB 4 bit", "1.1 TB 8 bit", "2.1 TB full"]; + const SZ = ["233 GB", "378 GB", "605 GB", "1.1 TB", "2.1 TB"]; + const W = [64, 80, 100, 128, 160], H = [46, 58, 72, 90, 110], X = [715, 592, 455, 300, 125], COL = [YEL, SKY, LIL, BLUE, YEL]; + const BY = 470, SX = 400, SY = 230; + /* shelf: two side posts 76 apart, so only the smallest case fits between them */ + const glow = el("rect", { x: SX - 38, y: SY - 72, width: 76, height: 72, fill: MINT, opacity: 0 }, svg); + [-40, 40].forEach((d) => el("rect", { x: SX + d - 4, y: SY - 76, width: 8, height: 76, rx: 3, fill: "#fff", stroke: INK, "stroke-width": 2.5 }, svg)); + el("rect", { x: SX - 80, y: SY, width: 160, height: 12, rx: 4, fill: BLUE, stroke: INK, "stroke-width": 3 }, svg); + txt(svg, SX, SY + 40, "256 GB memory", { "text-anchor": "middle", "font-family": MONO, "font-size": 20, "font-weight": 700 }); + /* the carousel */ + el("rect", { x: 30, y: BY, width: 740, height: 24, rx: 12, fill: SOFT, stroke: INK, "stroke-width": 3 }, svg); + const slats = el("path", { d: `M44 ${BY + 12} H756`, stroke: MUTE, "stroke-width": 12, "stroke-dasharray": "2 38" }, svg); + for (let x = 70; x <= 730; x += 110) el("circle", { cx: x, cy: BY + 34, r: 8, fill: "#fff", stroke: INK, "stroke-width": 2.5 }, svg); + let pinned = -1; + const cases = W.map((w, i) => { + const g = el("g", {}, svg), rw = Math.max(w, TAG[i].length * 8.4 + 18) + 16; + el("rect", { x: -rw / 2, y: -H[i] - 66, width: rw, height: H[i] + 74, rx: 14, fill: "#fff", "fill-opacity": 0, class: "mg-ring", stroke: INK, "stroke-width": 2, "stroke-dasharray": "4 6" }, g); + const s = suitcase(g, w, H[i], COL[i], TAG[i]); + button(g, `${TAG[i]}: Needs more than ${SZ[i]} of memory`, () => { pinned = i; api.poke(); }); + return Object.assign({ g }, s); + }); + const bar = el("g", {}, svg); + el("rect", { x: 160, y: 532, width: 480, height: 48, rx: 24, fill: SOFT }, bar); + const line = txt(bar, 400, 563, "", { "text-anchor": "middle", "font-size": 21, "font-weight": 600 }); + const LIFT = [2.6, 3.8], HOP = (i) => 4.3 + (i - 1) * 0.8; + return (t) => { + const ride = io(seg(t, 0.3, 2.4)), back = 900 * (1 - ride); + slats.setAttribute("stroke-dashoffset", -900 * ride); + let auto = -1; + cases.forEach((c, i) => { + let x = X[i] - back, y = BY, r = 0; + if (i === 0) { + const k = io(seg(t, LIFT[0], LIFT[1])); + x = X[0] + (SX - X[0]) * k; y = BY + (SY - BY) * k - Math.sin(k * Math.PI) * 60; + if (t >= LIFT[0]) auto = 0; + } else { + const h = seg(t, HOP(i), HOP(i) + 0.7), up = Math.sin(h * Math.PI); + x += (SX - X[i]) * 0.18 * up; y -= 44 * up; r = Math.sin(h * Math.PI * 4) * 5 * up; + if (h > 0 && h < 1) auto = i; + } + tf(c.g, x, y, 1, r); + }); + if (t >= 7.6) auto = 0; + glow.setAttribute("opacity", seg(t, LIFT[1] - 0.2, LIFT[1] + 0.2)); + const show = pinned >= 0 ? pinned : auto; + cases.forEach((c, i) => c.tg.setAttribute("fill", i === show ? YEL : "#fff")); + line.textContent = show < 0 ? "" : `Needs more than ${SZ[show]} of memory`; + bar.setAttribute("opacity", show < 0 ? 0 : 1); + }; + }, + }; + + /* ---- 2. one loaf, eight cups ---- */ + SC.tin = { + dur: 9, still: 9, + build(svg, api) { + const LY = 96, LH = 84, CY = 330, CH = 100, cx = (i) => 68 + i * 84, FULL = 84, SMALL = 84 * 76 / 128; + txt(svg, 400, 74, "Mistral Large 4", { "text-anchor": "middle", "font-family": MONO, "font-size": 26, "font-weight": 700 }); + el("rect", { x: 66, y: LY - 2, width: 668, height: LH + 4, rx: 38, fill: "none", stroke: MUTE, "stroke-width": 2, "stroke-dasharray": "4 8" }, svg); + const loaf = el("rect", { x: 68, y: LY, width: 664, height: LH, rx: 36, fill: YEL, stroke: INK, "stroke-width": 3 }, svg); + const cuts = Array.from({ length: 7 }, (_, i) => el("path", { d: `M${cx(i + 1) - 2} ${LY - 12} V${LY + LH + 12}`, stroke: INK, "stroke-width": 3, "stroke-linecap": "round" }, svg)); + el("rect", { x: 56, y: CY - 14, width: 688, height: CH + 26, rx: 16, fill: SKY, stroke: INK, "stroke-width": 3 }, svg); + for (let i = 0; i < 8; i++) { + el("rect", { x: cx(i), y: CY, width: 80, height: CH, rx: 10, fill: "#fff", stroke: INK, "stroke-width": 2.5 }, svg); + txt(svg, cx(i) + 40, CY + CH + 52, `GPU ${i + 1}`, { "text-anchor": "middle", "font-family": MONO, "font-size": 17, "font-weight": 700 }); + } + const slices = Array.from({ length: 8 }, (_, i) => el("rect", { x: cx(i) + 4, width: 72, rx: i === 0 || i === 7 ? 18 : 8, fill: YEL, stroke: INK, "stroke-width": 3 }, svg)); + const sw = el("g", {}, svg), SWX = 214, SWY = 508; + el("rect", { x: SWX - 10, y: SWY - 10, width: 392, height: 60, rx: 30, fill: "#fff", "fill-opacity": 0, class: "mg-ring", stroke: INK, "stroke-width": 2, "stroke-dasharray": "4 6" }, sw); + const track = el("rect", { x: SWX, y: SWY, width: 76, height: 40, rx: 20, fill: SOFT, stroke: INK, "stroke-width": 3 }, sw); + const knob = el("circle", { cy: SWY + 20, r: 14, fill: "#fff", stroke: INK, "stroke-width": 3 }, sw); + const lab = txt(sw, SWX + 96, SWY + 29, "", { "font-size": 25, "font-weight": 700 }); + let user = null, from = 0, at = 0; + const cur = (t, now) => user == null ? io(seg(t, 5.2, 5.8)) : from + (user - from) * io(seg(now - at, 0, 0.6)); + let last = 0, lastT = 0; + button(sw, "FP8 or NVFP4", () => { from = last; user = last > 0.5 ? 0 : 1; at = api.now(); if (lastT < 4.6) api.seek(4.6); else api.poke(); }); + sw.setAttribute("role", "switch"); + return (t, now) => { + const v = cur(t, now); last = v; lastT = t; + const cut = seg(t, 0.5, 1.8), sliced = t >= 2; + loaf.setAttribute("opacity", sliced ? 0 : 1); + cuts.forEach((c, i) => c.setAttribute("opacity", !sliced && cut * 7 > i ? 1 : 0)); + const hh = FULL + (SMALL - FULL) * v; + slices.forEach((s, i) => { + const d = seg(t, 2.1 + i * 0.26, 2.1 + i * 0.26 + 0.55), k = d < 0.75 ? Math.pow(d / 0.75, 2) : 1 - Math.sin((d - 0.75) / 0.25 * Math.PI) * 0.06; + const landed = d >= 1, h = landed ? hh : FULL; + const yTop = LY + (CY + CH - 4 - FULL - LY) * k; + s.setAttribute("y", landed ? CY + CH - 4 - h : yTop); s.setAttribute("height", h); + s.setAttribute("opacity", sliced ? 1 : 0); + }); + const on = v > 0.5; + knob.setAttribute("cx", SWX + 20 + 36 * v); + track.setAttribute("fill", on ? BLUE : SOFT); + lab.textContent = on ? "NVFP4, 76 GiB a cup" : "FP8, 128 GiB a cup"; + sw.setAttribute("aria-checked", on ? "true" : "false"); + sw.setAttribute("aria-label", on ? "NVFP4, 76 GiB a cup" : "FP8, 128 GiB a cup"); + }; + }, + }; + + /* ---- 3. the licence as a signpost ---- */ + SC.signpost = { + dur: 8, still: 8, + build(svg, api) { + const PX = 320, GY = 522, AH = 46; + const ARMS = [["Use", 1, 140], ["Modify", -1, 205], ["Fine tune", 1, 270], ["Sell", -1, 335], ["Model as a Service", 1, 400]]; + el("ellipse", { cx: PX, cy: GY + 4, rx: 170, ry: 14, fill: SOFT }, svg); + const post = el("g", {}, svg); + el("rect", { x: PX - 40, y: 92, width: 80, height: GY - 92 + 12, rx: 16, fill: "#fff", "fill-opacity": 0, class: "mg-ring", stroke: INK, "stroke-width": 2, "stroke-dasharray": "4 6" }, post); + el("rect", { x: PX - 12, y: 104, width: 24, height: GY - 104, rx: 6, fill: YEL, stroke: INK, "stroke-width": 3 }, post); + button(post, "Swing the arms out again", () => api.seek(1.2)); + const arms = ARMS.map(([word, s, y], i) => { + const g = el("g", {}, svg), last = i === 4, base = PX + 12 * s; + const path = el("path", { fill: last ? LIL : YEL, stroke: INK, "stroke-width": 3, "stroke-linejoin": "round" }, g); + const t0 = last ? 22 : 54, label = txt(g, base + s * t0, y + 8, word, { "text-anchor": s > 0 ? "start" : "end", "font-size": 24, "font-weight": 700 }); + const L = t0 + label.getComputedTextLength() + 40; + path.setAttribute("d", `M${base} ${y - AH / 2} H${base + s * (L - 22)} L${base + s * L} ${y} L${base + s * (L - 22)} ${y + AH / 2} H${base} Z`); + let tick = null; + if (!last) { tick = el("g", {}, g); el("circle", { r: 13, fill: MINT, stroke: INK, "stroke-width": 2.5 }, tick); el("path", { d: "M-6 0 L-2 5 L6 -5", stroke: INK, "stroke-width": 3, fill: "none", "stroke-linecap": "round", "stroke-linejoin": "round" }, tick); } + return { g, s, y, tick, tx: base + s * 28, L, start: last ? 3.4 : 1.4 + i * 0.45 }; + }); + const maas = arms[4], nx = PX + 40; + const note = el("g", {}, svg); + el("path", { d: `M${nx + 110} ${maas.y + AH / 2} V${maas.y + 50}`, stroke: INK, "stroke-width": 2 }, note); + const nt = txt(note, nx + 16, maas.y + 78, "Separate licence from Mistral", { "font-size": 19, "font-weight": 600 }); + const nw = nt.getComputedTextLength() + 32; + const card = el("rect", { x: nx, y: maas.y + 50, width: nw, height: 40, rx: 10, fill: SOFT, stroke: INK, "stroke-width": 2 }, note); + note.insertBefore(card, nt); + return (t) => { + const r = ob(seg(t, 0.2, 1.2)); + post.setAttribute("transform", `translate(0 ${GY}) scale(1 ${cl(r, 0, 1.08)}) translate(0 ${-GY})`); + arms.forEach((a) => { + const p = seg(t, a.start, a.start + 0.6), k = ob(p); + a.g.setAttribute("transform", `rotate(${a.s * 80 * (1 - k)} ${PX} ${a.y})`); + a.g.setAttribute("opacity", p > 0 ? 1 : 0); + if (a.tick) tf(a.tick, a.tx, a.y, ob(seg(t, a.start + 0.45, a.start + 0.8))); + }); + const n = oc(seg(t, 4.3, 4.9)); + note.setAttribute("opacity", n); note.setAttribute("transform", `translate(0 ${-18 * (1 - n)})`); + }; + }, + }; + + /* ---- title card, 16 by 9 ---- */ + SC.hero = { + w: 960, h: 540, dur: 1, still: 0, + build(svg) { + el("rect", { x: 64, y: 70, width: 104, height: 38, rx: 19, fill: SOFT, stroke: INK, "stroke-width": 2 }, svg); + txt(svg, 116, 96, "Guides", { "text-anchor": "middle", "font-size": 19, "font-weight": 700 }); + txt(svg, 64, 210, "Run Mistral", { "font-size": 72, "font-weight": 700 }); + txt(svg, 64, 292, "Large 4", { "font-size": 72, "font-weight": 700 }); + el("path", { d: "M66 318 H330", stroke: YEL, "stroke-width": 14, "stroke-linecap": "round" }, svg); + txt(svg, 64, 376, "From 256 GB of memory", { "font-size": 30, "font-weight": 500, fill: MUTE }); + txt(svg, 64, 470, "Checked 29 Oct 2026", { "font-size": 18, "font-weight": 500, fill: "#6B5878" }); + const BY = 440; + el("rect", { x: 540, y: BY, width: 380, height: 22, rx: 11, fill: SOFT, stroke: INK, "stroke-width": 3 }, svg); + el("path", { d: `M552 ${BY + 11} H908`, stroke: MUTE, "stroke-width": 10, "stroke-dasharray": "2 34" }, svg); + for (let x = 572; x <= 900; x += 82) el("circle", { cx: x, cy: BY + 31, r: 7, fill: "#fff", stroke: INK, "stroke-width": 2.5 }, svg); + [[600, 80, 58, YEL, "233 GB"], [712, 100, 74, SKY, "378 GB"], [846, 124, 94, LIL, "605 GB"]].forEach(([x, w, h, c, s]) => { const g = el("g", {}, svg); suitcase(g, w, h, c, s); tf(g, x, BY); }); + return () => {}; + }, + }; + + /* ---- player ---- */ + const q = new URLSearchParams(location.search), frozen = q.has("mgstill"), fixed = parseFloat(q.get("mgstill")); + const calm = matchMedia("(prefers-reduced-motion: reduce)").matches; + const mount = (fig) => { + const sc = SC[fig.dataset.scene], img = fig.querySelector("img"); if (!sc || !img) return; + const W = sc.w || 800, H = sc.h || 600; + const svg = el("svg", { viewBox: `0 0 ${W} ${H}`, class: "mg-svg", role: "group", "aria-label": img.alt || "" }); + svg.style.aspectRatio = `${W} / ${H}`; + el("rect", { width: W, height: H, fill: "#fff" }, svg); + img.replaceWith(svg); + let off = 0, raf = 0, seen = false, held = calm; + const base = performance.now(), clock = () => (performance.now() - base) / 1000; + let draw = () => {}; + const frame = () => { const now = clock(); draw(held ? sc.still : (((now + off) % sc.dur) + sc.dur) % sc.dur, now); }; + const tick = () => { cancelAnimationFrame(raf); frame(); if (seen && !held) raf = requestAnimationFrame(tick); }; + const api = { now: clock, seek: (s) => { off = s - clock(); held = false; tick(); }, poke: () => { held = false; tick(); } }; + draw = sc.build(svg, api); + if (frozen) { draw(isNaN(fixed) ? sc.still : fixed, 0); return; } + new IntersectionObserver(([e]) => { + seen = e.isIntersecting; + if (seen) { tick(); if (!fig.dataset.sent && window.posthog) { fig.dataset.sent = 1; window.posthog.capture("blog_scene_view", { slug: location.pathname.split("/").filter(Boolean).pop(), scene: fig.dataset.scene }); } } + else cancelAnimationFrame(raf); + }, { threshold: 0.25 }).observe(fig); + svg.addEventListener("click", () => { if (!fig.dataset.hit && window.posthog) { fig.dataset.hit = 1; window.posthog.capture("blog_scene_interact", { slug: location.pathname.split("/").filter(Boolean).pop(), scene: fig.dataset.scene }); } }); + frame(); + }; + const go = () => document.querySelectorAll("figure.mg[data-scene]").forEach(mount); + const fonts = document.fonts && document.fonts.load ? Promise.all([document.fonts.load('700 32px "Space Grotesk"'), document.fonts.load('500 20px "Space Grotesk"'), document.fonts.load('700 20px "JetBrains Mono"')]).catch(() => {}) : Promise.resolve(); + const start = () => fonts.then(go, go); + if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", start); else start(); +})(); diff --git a/docs/blog/assets/media/how-to-run-mistral-large-4/signpost.png b/docs/blog/assets/media/how-to-run-mistral-large-4/signpost.png new file mode 100644 index 0000000000..ea4b0fc1e6 Binary files /dev/null and b/docs/blog/assets/media/how-to-run-mistral-large-4/signpost.png differ diff --git a/docs/blog/assets/media/how-to-run-mistral-large-4/tin.png b/docs/blog/assets/media/how-to-run-mistral-large-4/tin.png new file mode 100644 index 0000000000..d623ea4f5c Binary files /dev/null and b/docs/blog/assets/media/how-to-run-mistral-large-4/tin.png differ diff --git a/docs/blog/assets/media/mistral-large-4-vs-claude-opus-5-5/hero.png b/docs/blog/assets/media/mistral-large-4-vs-claude-opus-5-5/hero.png new file mode 100644 index 0000000000..cc05e34094 Binary files /dev/null and b/docs/blog/assets/media/mistral-large-4-vs-claude-opus-5-5/hero.png differ diff --git a/docs/blog/assets/media/mistral-large-4-vs-claude-opus-5-5/library.png b/docs/blog/assets/media/mistral-large-4-vs-claude-opus-5-5/library.png new file mode 100644 index 0000000000..f3b835aaa8 Binary files /dev/null and b/docs/blog/assets/media/mistral-large-4-vs-claude-opus-5-5/library.png differ diff --git a/docs/blog/assets/media/mistral-large-4-vs-claude-opus-5-5/meter.png b/docs/blog/assets/media/mistral-large-4-vs-claude-opus-5-5/meter.png new file mode 100644 index 0000000000..a486a741c3 Binary files /dev/null and b/docs/blog/assets/media/mistral-large-4-vs-claude-opus-5-5/meter.png differ diff --git a/docs/blog/assets/media/mistral-large-4-vs-claude-opus-5-5/motion.css b/docs/blog/assets/media/mistral-large-4-vs-claude-opus-5-5/motion.css new file mode 100644 index 0000000000..cf1f22d5a9 --- /dev/null +++ b/docs/blog/assets/media/mistral-large-4-vs-claude-opus-5-5/motion.css @@ -0,0 +1,13 @@ +/* Bright coded scenes for "Mistral Large 4 vs Claude Opus 5.5". 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/mistral-large-4-vs-claude-opus-5-5/motion.js b/docs/blog/assets/media/mistral-large-4-vs-claude-opus-5-5/motion.js new file mode 100644 index 0000000000..4a88c828ac --- /dev/null +++ b/docs/blog/assets/media/mistral-large-4-vs-claude-opus-5-5/motion.js @@ -0,0 +1,246 @@ +/* Bright coded scenes for "Mistral Large 4 vs Claude Opus 5.5". Vanilla JS, no library. +
holds a still image; this script swaps in a live SVG. + Plays only in view, honours reduced motion, "?mgstill" freezes each scene on its still frame. */ +(() => { + const NS = "http://www.w3.org/2000/svg"; + const INK = "#1A1320", YEL = "#FFCA54", BLUE = "#6C8EF5", LIL = "#B69CFF", MINT = "#7FD8AE", SKY = "#9AD8FF", SOFT = "#F1ECF9", MUTE = "#7A6A88"; + const SANS = '"Space Grotesk", system-ui, sans-serif', MONO = '"JetBrains Mono", ui-monospace, monospace'; + const el = (t, a = {}, p) => { const n = document.createElementNS(NS, t); for (const k in a) n.setAttribute(k, a[k]); if (p) p.appendChild(n); return n; }; + const txt = (p, x, y, s, a = {}) => { const n = el("text", Object.assign({ x, y, "font-family": SANS, "font-size": 24, "font-weight": 600, fill: INK }, a), p); n.textContent = s; return n; }; + const cl = (v, a = 0, b = 1) => Math.max(a, Math.min(b, v)); + const seg = (t, a, b) => cl((t - a) / (b - a)); + const oc = (x) => 1 - Math.pow(1 - x, 3); + const ob = (x) => { const c = 1.70158; return 1 + (c + 1) * Math.pow(x - 1, 3) + c * Math.pow(x - 1, 2); }; + const io = (x) => (x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2); + const tf = (n, x, y, s = 1, r = 0) => n.setAttribute("transform", `translate(${x} ${y}) rotate(${r}) scale(${s})`); + const button = (g, label, fn) => { + g.setAttribute("role", "button"); g.setAttribute("tabindex", "0"); g.setAttribute("aria-label", label); g.classList.add("mg-hit"); + g.addEventListener("click", fn); + g.addEventListener("keydown", (e) => { if (e.key === "Enter" || e.key === " ") { e.preventDefault(); fn(); } }); + }; + const strip = (svg, y, w = 680) => { + el("rect", { x: (800 - w) / 2, y, width: w, height: 48, rx: 24, fill: SOFT }, svg); + return txt(svg, 400, y + 31, "", { "text-anchor": "middle", "font-size": 20, "font-weight": 500 }); + }; + + /* ---- a taxi meter, 280 by 200, drawn from its top left corner ---- */ + const meter = (p, color, label) => { + const g = el("g", {}, p); + el("rect", { x: 100, y: -26, width: 80, height: 32, rx: 9, fill: YEL, stroke: INK, "stroke-width": 3 }, g); + el("rect", { x: 0, y: 0, width: 280, height: 200, rx: 24, fill: color, stroke: INK, "stroke-width": 3 }, g); + el("rect", { x: 22, y: 24, width: 236, height: 96, rx: 14, fill: "#fff", stroke: INK, "stroke-width": 3 }, g); + const val = txt(g, 140, 91, "$0.00", { "text-anchor": "middle", "font-family": MONO, "font-size": 52, "font-weight": 700 }); + [0, 1, 2].forEach((i) => el("circle", { cx: 46 + i * 40, cy: 160, r: 12, fill: "#fff", stroke: INK, "stroke-width": 2.5 }, g)); + const wheel = el("g", {}, g); + el("circle", { r: 21, fill: "#fff", stroke: INK, "stroke-width": 2.5 }, wheel); + el("path", { d: "M-13 0 H13 M0 -13 V13", stroke: INK, "stroke-width": 3, "stroke-linecap": "round" }, wheel); + txt(g, 140, 248, label, { "text-anchor": "middle", "font-family": MONO, "font-size": 22, "font-weight": 700 }); + const set = (s, a = 0) => { val.textContent = s; tf(wheel, 228, 160, 1, a); }; + set("$0.00"); + return { g, set }; + }; + + const SC = {}; + + /* ---- 1. two lanes of a running track ---- */ + SC.track = { + dur: 6.5, still: 6.5, + build(svg, api) { + txt(svg, 44, 62, "Coding Agent Index", { "font-size": 32, "font-weight": 700 }); + const X0 = 90, PX = 7.5, xv = (v) => X0 + v * PX; + const LANES = [ + ["Claude Opus 5.5", BLUE, 62, "Artificial Analysis, 28 Oct 2026", 4.2], + ["Mistral Large 4", LIL, 48, "Mistral's post, 29 Oct 2026", 3.6], + ]; + let pinned = -1; + const tip = strip(svg, 524, 720); + const lanes = LANES.map(([name, col, val, src, end], i) => { + const y = 110 + i * 160, g = el("g", {}, svg), cy = y + 92; + el("rect", { x: 34, y: y - 8, width: 732, height: 146, rx: 26, fill: "none", stroke: INK, "stroke-width": 2, "stroke-dasharray": "4 7", class: "mg-ring" }, g); + el("rect", { x: 44, y, width: 712, height: 130, rx: 20, fill: SOFT }, g); + txt(g, 72, y + 44, name, { "font-family": MONO, "font-size": 22, "font-weight": 700 }); + const band = el("path", { d: "", stroke: "#fff", "stroke-width": 26, "stroke-linecap": "round", fill: "none" }, g); + const dash = el("path", { d: "", stroke: INK, "stroke-width": 2, "stroke-dasharray": "2 12", "stroke-linecap": "round", fill: "none" }, g); + const trail = el("path", { d: "", stroke: col, "stroke-width": 12, "stroke-linecap": "round", fill: "none" }, g); + const mk = el("g", {}, g); + el("circle", { r: 22, fill: col, stroke: INK, "stroke-width": 3 }, mk); + el("circle", { r: 6, fill: "#fff", stroke: INK, "stroke-width": 2 }, mk); + const chip = el("rect", { x: 0, y: cy - 22, width: 58, height: 44, rx: 14, fill: "#fff" }, g); + const num = txt(g, 0, cy + 11, "", { "text-anchor": "middle", "font-size": 30, "font-weight": 700 }); + button(g, `${name}, ${val}: ${src}`, () => { pinned = i; api.poke(); }); + return { band, dash, trail, mk, chip, num, cy, val, end, src, d: i * 0.15 }; + }); + el("path", { d: `M${xv(0)} 462 H${xv(84)}`, stroke: INK, "stroke-width": 2.5, "stroke-linecap": "round" }, svg); + for (let v = 0; v <= 80; v += 10) el("path", { d: `M${xv(v)} 455 V469`, stroke: INK, "stroke-width": v % 50 === 0 ? 3 : 2, "stroke-linecap": "round" }, svg); + const pins = lanes.map((l) => el("path", { d: `M${xv(l.val)} 462 V462`, stroke: MUTE, "stroke-width": 2, "stroke-dasharray": "3 6" }, svg)); + return (t) => { + lanes.forEach((l, i) => { + const k = io(seg(t, 0.2 + l.d, 1.3 + l.d)), xe = X0 + (xv(84) - X0) * k; + const lane = `M${X0} ${l.cy} H${Math.max(X0 + 0.01, xe)}`; + l.band.setAttribute("d", lane); l.dash.setAttribute("d", lane); + l.band.setAttribute("opacity", k > 0 ? 1 : 0); l.dash.setAttribute("opacity", k > 0 ? 1 : 0); + const r = oc(seg(t, 1.3, l.end)), v = l.val * r, x = xv(v), stop = t >= l.end; + l.trail.setAttribute("d", `M${X0} ${l.cy} H${Math.max(X0 + 0.01, x)}`); + const pop = ob(seg(t, l.end, l.end + 0.4)); + tf(l.mk, x, l.cy, (k > 0.05 ? 1 : 0) * (stop ? 1 + 0.18 * Math.sin(pop * Math.PI) : 1)); + l.num.setAttribute("x", x + 59); l.chip.setAttribute("x", x + 30); l.chip.setAttribute("opacity", t >= 1.3 ? 1 : 0); + l.num.textContent = t >= 1.3 ? String(Math.round(v)) : ""; + l.num.setAttribute("font-size", stop ? 32 : 26); + const g = oc(seg(t, l.end, l.end + 0.6)); + pins[i].setAttribute("d", `M${xv(l.val)} ${l.cy + 24} V${l.cy + 24 + (462 - l.cy - 24) * g}`); + pins[i].setAttribute("opacity", g); + }); + tip.setAttribute("fill", pinned < 0 ? MUTE : INK); + tip.textContent = pinned < 0 ? "Tapping a lane shows its source" : LANES[pinned][3]; + }; + }, + }; + + /* ---- 2. two taxi meters, one million tokens ---- */ + SC.meter = { + dur: 7.5, still: 7.5, + build(svg, api) { + const MODES = [["1M output tokens", 2.1, 20], ["1M input tokens", 0.7, 4]]; + let mode = 0; + el("rect", { x: 190, y: 40, width: 420, height: 68, rx: 34, fill: "#fff" }, svg); + const bar = el("rect", { x: 190, y: 40, width: 68, height: 68, rx: 34, fill: SKY }, svg); + el("rect", { x: 190, y: 40, width: 420, height: 68, rx: 34, fill: "none", stroke: INK, "stroke-width": 3 }, svg); + const count = txt(svg, 400, 84, MODES[0][0], { "text-anchor": "middle", "font-family": MONO, "font-size": 26, "font-weight": 700 }); + const left = meter(svg, LIL, "Mistral Large 4"), right = meter(svg, BLUE, "Claude Opus 5.5"); + tf(left.g, 90, 186); tf(right.g, 430, 186); + const sw = el("g", {}, svg); + el("rect", { x: 270, y: 478, width: 260, height: 72, rx: 36, fill: "none", stroke: INK, "stroke-width": 2, "stroke-dasharray": "4 7", class: "mg-ring" }, sw); + el("rect", { x: 280, y: 486, width: 240, height: 56, rx: 28, fill: SOFT, stroke: INK, "stroke-width": 2.5 }, sw); + const knob = el("rect", { x: 285, y: 491, width: 115, height: 46, rx: 23, fill: YEL, stroke: INK, "stroke-width": 2 }, sw); + txt(sw, 342, 521, "output", { "text-anchor": "middle", "font-family": MONO, "font-size": 19, "font-weight": 700 }); + txt(sw, 458, 521, "input", { "text-anchor": "middle", "font-family": MONO, "font-size": 19, "font-weight": 700 }); + const label = () => { sw.setAttribute("aria-label", mode ? "Showing input tokens. Switch to output tokens" : "Showing output tokens. Switch to input tokens"); sw.setAttribute("aria-pressed", mode ? "true" : "false"); }; + button(sw, "", () => { mode = 1 - mode; label(); api.seek(0.01); }); + label(); + const money = (v, end, done) => (done && Number.isInteger(end) ? `$${end}` : `$${v.toFixed(2)}`); + return (t) => { + const [name, a, b] = MODES[mode]; + count.textContent = name; + bar.setAttribute("width", 68 + 352 * io(seg(t, 0.2, 1.2))); + knob.setAttribute("x", mode ? 400 : 285); + const ka = oc(seg(t, 1.3, 3.0)), kb = seg(t, 1.3, 5.8), kbe = 1 - Math.pow(1 - kb, 1.6); + left.set(money(a * ka, a, ka >= 1), ka * 900); + right.set(money(b * kbe, b, kb >= 1), kbe * 2520); + }; + }, + }; + + /* ---- 3. two shelves: one book leaves, one stays behind glass ---- */ + SC.library = { + dur: 7.5, still: 7.5, + build(svg, api) { + const shelf = (x, name) => { + txt(svg, x + 150, 96, name, { "text-anchor": "middle", "font-family": MONO, "font-size": 24, "font-weight": 700 }); + }; + shelf(50, "Mistral Large 4"); shelf(450, "Claude Opus 5.5"); + // the reading card sits behind the right shelf until it slides out + const card = el("g", {}, svg); + el("rect", { x: 530, y: 0, width: 140, height: 104, rx: 12, fill: "#fff", stroke: INK, "stroke-width": 3 }, card); + [24, 46, 68].forEach((y, i) => el("rect", { x: 548, y, width: [96, 80, 100][i], height: 10, rx: 5, fill: SOFT, stroke: INK, "stroke-width": 1.5 }, card)); + const tagB = el("g", {}, card); + el("rect", { x: 610, y: 82, width: 76, height: 40, rx: 12, fill: YEL, stroke: INK, "stroke-width": 2.5 }, tagB); + txt(tagB, 648, 110, "API", { "text-anchor": "middle", "font-family": MONO, "font-size": 20, "font-weight": 700 }); + const books = []; + [50, 450].forEach((x, s) => { + el("rect", { x, y: 120, width: 300, height: 212, rx: 14, fill: SOFT, stroke: INK, "stroke-width": 3 }, svg); + el("rect", { x, y: 300, width: 300, height: 16, fill: YEL, stroke: INK, "stroke-width": 2.5 }, svg); + [[x + 40, 30, 116, SKY], [x + 74, 30, 132, MINT], [x + 214, 30, 106, s ? LIL : BLUE]].forEach(([bx, w, h, c]) => el("rect", { x: bx, y: 300 - h, width: w, height: h, rx: 4, fill: c, stroke: INK, "stroke-width": 2.5 }, svg)); + }); + el("path", { d: "M540 332 H660", stroke: INK, "stroke-width": 5, "stroke-linecap": "round" }, svg); + // the thick books, drawn around their centre + const book = (col) => { const g = el("g", {}, svg); el("rect", { x: -40, y: -76, width: 80, height: 152, rx: 6, fill: col, stroke: INK, "stroke-width": 3 }, g); el("path", { d: "M-40 -50 H40 M-40 50 H40", stroke: INK, "stroke-width": 2.5 }, g); el("rect", { x: -20, y: -18, width: 40, height: 36, rx: 4, fill: "#fff", stroke: INK, "stroke-width": 2 }, g); return g; }; + // tote bag, back then book then front + const tote = el("g", {}, svg); + const handle = el("path", { d: "M160 432 Q160 380 200 380 Q240 380 240 432", stroke: INK, "stroke-width": 5, fill: "none", "stroke-linecap": "round" }, tote); + const bookA = book(LIL), bookB = book(BLUE); + const front = el("g", {}, svg); + el("path", { d: "M118 432 H282 L270 560 H130 Z", fill: MINT, stroke: INK, "stroke-width": 3, "stroke-linejoin": "round" }, front); + const tagA = el("g", {}, svg); + el("path", { d: "M240 420 L304 446", stroke: INK, "stroke-width": 2.5, "stroke-linecap": "round" }, tagA); + el("rect", { x: 292, y: 440, width: 132, height: 42, rx: 12, fill: YEL, stroke: INK, "stroke-width": 2.5 }, tagA); + txt(tagA, 358, 468, "Download", { "text-anchor": "middle", "font-family": MONO, "font-size": 20, "font-weight": 700 }); + const glass = el("g", {}, svg); + el("rect", { x: 462, y: 132, width: 276, height: 166, rx: 8, fill: "none", stroke: INK, "stroke-width": 2.5 }, glass); + const shine = el("path", { d: "M500 280 L560 150 M530 280 L590 150", stroke: SKY, "stroke-width": 7, "stroke-linecap": "round" }, glass); + const hit = el("g", {}, svg); + el("rect", { x: 10, y: 10, width: 780, height: 580, rx: 20, fill: "#fff", "fill-opacity": 0, stroke: INK, "stroke-width": 2, "stroke-dasharray": "4 7", class: "mg-ring" }, hit); + button(hit, "Replay the shelves", () => api.seek(0.01)); + return (t) => { + // left: lift, then drop into the tote + const lift = io(seg(t, 0.8, 1.4)), drop = seg(t, 1.4, 2.3), dd = drop * drop; + const ax = 200, ay = 224 - 22 * lift + (462 - 224 + 22) * dd; + tf(bookA, ax + 40 * Math.sin(drop * Math.PI), ay, 1 + 0.05 * lift * (1 - drop), 14 * Math.sin(drop * Math.PI)); + const land = seg(t, 2.3, 2.8), sq = Math.sin(land * Math.PI) * (1 - land); + front.setAttribute("transform", `translate(200 560) scale(${1 + 0.06 * sq} ${1 - 0.08 * sq}) translate(-200 -560)`); + handle.setAttribute("transform", `translate(0 ${10 * sq})`); + const sw = seg(t, 2.3, 4.3); + tagA.setAttribute("transform", `rotate(${Math.sin(sw * Math.PI * 4) * 14 * (1 - sw)} 240 420)`); + // right: the book presses on the glass, then the card slides out + const nudge = Math.sin(seg(t, 3.0, 3.7) * Math.PI); + tf(bookB, 600 + 5 * Math.sin(seg(t, 3.0, 3.7) * Math.PI * 4), 224, 1 + 0.06 * nudge); + shine.setAttribute("transform", `translate(${120 * io(seg(t, 3.1, 3.9))} 0)`); + const out = ob(seg(t, 3.9, 4.9)); + card.setAttribute("transform", `translate(0 ${220 + 186 * out})`); + const tp = ob(seg(t, 4.8, 5.3)); + tagB.setAttribute("transform", `translate(648 102) scale(${tp}) translate(-648 -102)`); + }; + }, + }; + + /* ---- title card, 16 by 9 ---- */ + SC.hero = { + w: 960, h: 540, dur: 1, still: 0, + build(svg) { + el("rect", { x: 60, y: 60, width: 168, height: 40, rx: 20, fill: YEL, stroke: INK, "stroke-width": 2.5 }, svg); + txt(svg, 144, 87, "Comparisons", { "text-anchor": "middle", "font-size": 19, "font-weight": 700 }); + txt(svg, 60, 182, "Mistral Large 4", { "font-size": 60, "font-weight": 700 }); + txt(svg, 60, 248, "vs", { "font-size": 60, "font-weight": 700, fill: MUTE }); + txt(svg, 60, 314, "Claude Opus 5.5", { "font-size": 60, "font-weight": 700 }); + el("path", { d: "M62 340 H300", stroke: YEL, "stroke-width": 12, "stroke-linecap": "round" }, svg); + txt(svg, 60, 396, "Open weights or top scores", { "font-size": 27, "font-weight": 500, fill: MUTE }); + txt(svg, 60, 480, "Checked 29 Oct 2026", { "font-size": 18, "font-weight": 500, fill: MUTE }); + const a = meter(svg, LIL, "Mistral Large 4"), b = meter(svg, BLUE, "Claude Opus 5.5"); + a.set("$2.10", 0); b.set("$20", 0); + a.g.setAttribute("transform", "translate(560 210) scale(0.62)"); + b.g.setAttribute("transform", "translate(752 210) scale(0.62)"); + 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); }; + // with reduced motion an interaction redraws the still frame instead of playing + const api = { now: clock, seek: (s) => { if (calm) return frame(); off = s - clock(); held = false; tick(); }, poke: () => { if (calm) return frame(); held = false; tick(); } }; + draw = sc.build(svg, api); + if (frozen) { draw(isNaN(fixed) ? sc.still : fixed, 0); return; } + new IntersectionObserver(([e]) => { + seen = e.isIntersecting; + if (seen) { tick(); if (!fig.dataset.sent && window.posthog) { fig.dataset.sent = 1; window.posthog.capture("blog_scene_view", { slug: location.pathname.split("/").filter(Boolean).pop(), scene: fig.dataset.scene }); } } + else cancelAnimationFrame(raf); + }, { threshold: 0.25 }).observe(fig); + svg.addEventListener("click", () => { if (!fig.dataset.hit && window.posthog) { fig.dataset.hit = 1; window.posthog.capture("blog_scene_interact", { slug: location.pathname.split("/").filter(Boolean).pop(), scene: fig.dataset.scene }); } }); + frame(); + }; + const go = () => document.querySelectorAll("figure.mg[data-scene]").forEach(mount); + const fonts = document.fonts && document.fonts.load ? Promise.all([document.fonts.load('700 32px "Space Grotesk"'), document.fonts.load('500 20px "Space Grotesk"'), document.fonts.load('700 20px "JetBrains Mono"')]).catch(() => {}) : Promise.resolve(); + const start = () => fonts.then(go, go); + if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", start); else start(); +})(); diff --git a/docs/blog/assets/media/mistral-large-4-vs-claude-opus-5-5/track.png b/docs/blog/assets/media/mistral-large-4-vs-claude-opus-5-5/track.png new file mode 100644 index 0000000000..7d7cc48597 Binary files /dev/null and b/docs/blog/assets/media/mistral-large-4-vs-claude-opus-5-5/track.png differ diff --git a/docs/blog/assets/media/mistral-large-4/crate.png b/docs/blog/assets/media/mistral-large-4/crate.png index 5b7838b32d..301b25c48a 100644 Binary files a/docs/blog/assets/media/mistral-large-4/crate.png and b/docs/blog/assets/media/mistral-large-4/crate.png differ diff --git a/docs/blog/assets/media/mistral-large-4/hero.png b/docs/blog/assets/media/mistral-large-4/hero.png index eebb6d909c..ba3b70d63e 100644 Binary files a/docs/blog/assets/media/mistral-large-4/hero.png and b/docs/blog/assets/media/mistral-large-4/hero.png differ diff --git a/docs/blog/assets/media/mistral-large-4/motion.js b/docs/blog/assets/media/mistral-large-4/motion.js index e61ef31df1..2f7b4a72f7 100644 --- a/docs/blog/assets/media/mistral-large-4/motion.js +++ b/docs/blog/assets/media/mistral-large-4/motion.js @@ -89,11 +89,11 @@ }, }; - /* ---- 2. a crate rolls in on a trolley; its delivery slip says Coming soon twice while a calendar tears off days ---- */ + /* ---- 2. a crate rolls in on a trolley; its delivery slip says Released twice while a calendar tears off days to 29 ---- */ SC.crate = { dur: 11.2, still: 9, build(svg, api) { - txt(svg, 44, 62, "The weights are not out yet", { "font-size": 32, "font-weight": 700 }); + txt(svg, 44, 62, "The weights are out", { "font-size": 32, "font-weight": 700 }); txt(svg, 756, 60, "tap the crate", { "text-anchor": "end", "font-size": 20, fill: MUTE, "font-weight": 500 }); el("path", { d: "M44 480 H756", stroke: INK, "stroke-width": 3, "stroke-linecap": "round" }, svg); /* tear-off calendar */ @@ -105,7 +105,7 @@ el("path", { d: "M548 168 V128 Q548 112 564 112 H716 Q732 112 732 128 V168 Z", fill: SKY, stroke: INK, "stroke-width": 3, "stroke-linejoin": "round" }, svg); txt(svg, 640, 156, "October", { "text-anchor": "middle", "font-size": 24, "font-weight": 700 }); [594, 686].forEach((x) => el("rect", { x: x - 6, y: 96, width: 12, height: 26, rx: 6, fill: "#fff", stroke: INK, "stroke-width": 3 }, svg)); - const notes = [["VentureBeat: Oct. 27", "#fff", 346, 6.3], ["Mistral: end of month", YEL, 398, 7.8]].map(([s, fill, y, at]) => ({ g: pill(svg, s, fill), y, at })); + const notes = [["Weights out", YEL, 346, 7]].map(([s, fill, y, at]) => ({ g: pill(svg, s, fill), y, at })); /* trolley and crate */ const tr = el("g", {}, svg); el("path", { d: "M84 438 V262 Q84 236 60 236 H46", stroke: INK, "stroke-width": 6, fill: "none", "stroke-linecap": "round" }, tr); @@ -121,11 +121,12 @@ el("path", { d: "M-140 -110 H140", stroke: SOFT, "stroke-width": 3, "stroke-linecap": "round" }, cr); txt(cr, -140, -137, "weights", { "font-size": 22, "font-weight": 700 }); txt(cr, -140, -69, "licence", { "font-size": 22, "font-weight": 700 }); - const stamps = [[-144, -3], [-76, 2.5]].map(([y, rot]) => ({ g: pill(cr, "Coming soon", LIL, { rx: 10 }), y, rot })); + const stamps = [[-144, -3], [-76, 2.5]].map(([y, rot]) => ({ g: pill(cr, "Released", LIL, { rx: 10 }), y, rot })); el("rect", { x: -192, y: -269, width: 384, height: 276, rx: 18, fill: "none", stroke: INK, "stroke-width": 2, "stroke-dasharray": "3 7", class: "mg-ring" }, cr); - const cap = strip(svg, 512, 700); + const cap = strip(svg, 512, 740); let poked = -99; - button(cr, "The crate is closed. Weights and licence both read Coming soon.", () => { poked = api.now(); api.poke(); }); + const OPEN = "The crate is open. Weights and licence were released on 29 Oct 2026."; + button(cr, OPEN, () => { poked = api.now(); api.poke(); }); return (t, now) => { const w = now - poked, shake = w >= 0 && w < 0.9 ? Math.sin(w * 30) * 3 * (1 - w / 0.9) : 0; const roll = oc(seg(t, 0.3, 1.3)) - io(seg(t, 10.3, 11)), dx = -580 * (1 - roll); @@ -133,47 +134,43 @@ wheels.forEach((wh) => tf(wh.g, wh.x, 463, 1, (dx / 15) * 57.3)); cr.setAttribute("transform", `translate(293 430) rotate(${shake})`); stamps.forEach((s, i) => { const k = seg(t, 1.8 + i * 0.7, 2.1 + i * 0.7); s.g.setAttribute("opacity", k <= 0 ? 0 : 1); tf(s.g, 76, s.y, 2.2 - 1.2 * ob(k), s.rot); }); - let f = t < 3.2 || t > 10.6 ? 0 : Math.min(21, (t - 3.2) / 0.14); - if (t >= 7 && t <= 10.6) f = 21 + Math.min(4, (t - 7) / 0.15); + const f = t < 3.2 || t > 10.6 ? 0 : Math.min(23, (t - 3.2) / 0.15); const day = 6 + Math.floor(f), fr = f - Math.floor(f), moving = fr > 0 && day > 6; num.textContent = day; old.textContent = day - 1; leaf.setAttribute("transform", `translate(640 168) scale(1 ${moving ? 1 - seg(fr, 0, 0.8) : 0})`); leaf.setAttribute("opacity", moving ? 1 : 0); notes.forEach((n) => { const k = ob(seg(t, n.at, n.at + 0.35)) * (1 - seg(t, 10.3, 10.7)); tf(n.g, 640, n.y, cl(k, 0, 1.05)); n.g.setAttribute("opacity", k <= 0.01 ? 0 : 1); }); - cap.textContent = w >= 0 && w < 3 ? "Not yet. You can only rent it through the API for now." : "Mistral's model page on 6 Oct 2026: both read Coming soon"; + cap.textContent = w >= 0 && w < 3 ? OPEN : "Mistral's release post, 29 Oct 2026: weights and licence out"; }; }, }; - /* ---- 3. three price tags on a line; a pencil strikes the higher price and the lower one drops in ---- */ + /* ---- 3. three price tags on a line; each price drops in; tap a tag for its 6 Oct price ---- */ SC.tags = { dur: 11.6, still: 9, build(svg, api) { txt(svg, 44, 62, "Price per million tokens", { "font-size": 32, "font-weight": 700 }); - txt(svg, 44, 98, "Mistral's model page, checked 6 Oct 2026", { "font-size": 20, "font-weight": 500, fill: MUTE }); + txt(svg, 44, 98, "Mistral's release post, 29 Oct 2026", { "font-size": 20, "font-weight": 500, fill: MUTE }); txt(svg, 756, 60, "tap a tag", { "text-anchor": "end", "font-size": 20, fill: MUTE, "font-weight": 500 }); el("path", { d: "M40 142 Q400 166 760 142", stroke: INK, "stroke-width": 2.5, fill: "none", "stroke-linecap": "round" }, svg); - const IT = [["Input", "$0.68", "$1.36", YEL], ["Cached input", "$0.07", "$0.14", SKY], ["Output", "$2.09", "$4.18", MINT]]; - const X = [150, 400, 650], LY = [148, 154, 148], S = (i) => 1.8 + i * 2; - const LINES = IT.map(([n, p, o]) => `${n}: ${p} listed, ${o} struck through`); + const IT = [["Input", "$0.70", "$0.68", YEL], ["Cached input", "$0.07", "$0.07", SKY], ["Output", "$2.10", "$2.09", MINT]]; + const X = [150, 400, 650], LY = [148, 154, 148], S = (i) => 1.4 + i * 1.6; + const LINES = IT.map(([n, p]) => `${n}: ${p} per million tokens`); + const PIN = IT.map(([n, p, o]) => `${n}: ${p} on 29 Oct, ${o} on 6 Oct`); + const SUM = "Input $0.70, cached input $0.07, output $2.10"; let pinned = -1; const tags = IT.map(([name, price, was, col], i) => { const g = el("g", {}, svg); el("rect", { x: -102, y: -2, width: 204, height: 327, rx: 22, fill: "none", stroke: INK, "stroke-width": 2, "stroke-dasharray": "3 7", class: "mg-ring" }, g); el("path", { d: "M-95 52 L-46 6 H46 L95 52 V302 Q95 318 79 318 H-79 Q-95 318 -95 302 Z", fill: col, stroke: INK, "stroke-width": 3, "stroke-linejoin": "round" }, g); txt(g, 0, 96, name, { "text-anchor": "middle", "font-size": 24, "font-weight": 700 }); - txt(g, 0, 156, was, { "text-anchor": "middle", "font-size": 34, "font-weight": 700 }); - const strike = el("path", { stroke: INK, "stroke-width": 4, "stroke-linecap": "round", fill: "none" }, g); + const prev = pill(g, `${was} on 6 Oct`, "#fff"), tt = prev.querySelector("text"), tr = prev.querySelector("rect"); + tt.setAttribute("font-size", 18); const tw = tt.getComputedTextLength() + 28; tr.setAttribute("x", -tw / 2); tr.setAttribute("width", tw); const plate = el("g", {}, g); el("rect", { x: -80, y: -40, width: 160, height: 80, rx: 16, fill: "#fff", stroke: INK, "stroke-width": 3 }, plate); txt(plate, 0, 17, price, { "text-anchor": "middle", "font-size": 48, "font-weight": 700 }); - const pen = el("g", {}, g); - el("rect", { x: 16, y: -7, width: 60, height: 14, fill: BLUE, stroke: INK, "stroke-width": 2.5 }, pen); - el("rect", { x: 76, y: -7, width: 14, height: 14, rx: 3, fill: LIL, stroke: INK, "stroke-width": 2.5 }, pen); - el("path", { d: "M0 0 L16 -7 V7 Z", fill: "#fff", stroke: INK, "stroke-width": 2.5, "stroke-linejoin": "round" }, pen); - el("path", { d: "M0 0 L6 -2.6 V2.6 Z", fill: INK }, pen); - button(g, LINES[i], () => { pinned = i; poked[i] = api.now(); api.poke(); }); - return { g, strike, plate, pen }; + button(g, `${name}: ${price} on 29 Oct 2026, ${was} on 6 Oct 2026`, () => { pinned = i; poked[i] = api.now(); api.poke(); }); + return { g, prev, plate }; }); const poked = [-99, -99, -99]; X.forEach((x, i) => el("rect", { x: x - 8, y: LY[i] - 22, width: 16, height: 42, rx: 6, fill: LIL, stroke: INK, "stroke-width": 2.5, "pointer-events": "none" }, svg)); @@ -185,16 +182,14 @@ const te = Math.max(0, t - 0.15 * i), w = now - poked[i]; const a = 10 * Math.exp(-2.2 * te) * Math.sin(6 * te) + (w >= 0 && w < 3 ? 8 * Math.exp(-2.5 * w) * Math.sin(8 * w) : 0); k.g.setAttribute("transform", `translate(${X[i]} ${LY[i]}) rotate(${a})`); - const s = seg(t, S(i), S(i) + 0.55) * (1 - out), px = -58 + 116 * s; - k.strike.setAttribute("d", `M-58 148 L${px} ${148 - 8 * s}`); k.strike.setAttribute("opacity", s > 0 ? 1 : 0); - tf(k.pen, px, 148 - 8 * s, 1, -28 + Math.sin(t * 40) * 3 * (s > 0 && s < 1 ? 1 : 0)); - k.pen.setAttribute("opacity", seg(t, S(i) - 0.25, S(i) - 0.1) * (1 - seg(t, S(i) + 0.6, S(i) + 0.75))); - const p = seg(t, S(i) + 0.75, S(i) + 1.15); + const o = poked[i] > -99 ? ob(seg(w, 0, 0.35)) : 0; + tf(k.prev, 0, 160, cl(o, 0, 1.1)); k.prev.setAttribute("opacity", o <= 0.01 ? 0 : 1); + const p = seg(t, S(i), S(i) + 0.4); tf(k.plate, 0, 250 - 80 * (1 - ob(p))); k.plate.setAttribute("opacity", seg(p, 0, 0.25) * (1 - out)); - if (t >= S(i) + 0.3) last = i; + if (t >= S(i) + 0.1) last = i; }); - cap.textContent = pinned >= 0 ? LINES[pinned] : t > 8.4 && t < 10.6 ? "The page did not say how long the lower prices last" : last < 0 || t >= 10.6 ? "A higher price was struck through beside each one" : LINES[last]; + cap.textContent = pinned >= 0 ? PIN[pinned] : last < 0 || t >= 6.6 ? SUM : LINES[last]; }; }, }; @@ -258,7 +253,7 @@ el("path", { d: "M66 226 H606", stroke: YEL, "stroke-width": 14, "stroke-linecap": "round" }, svg); txt(svg, 64, 288, "Le Chonk: size, price, scores, weights", { "font-size": 25, "font-weight": 500, fill: MUTE }); el("rect", { x: 64, y: 326, width: 290, height: 52, rx: 26, fill: SOFT }, svg); - txt(svg, 209, 360, "Checked 6 Oct 2026", { "text-anchor": "middle", "font-family": MONO, "font-size": 20, "font-weight": 700 }); + txt(svg, 209, 360, "Checked 29 Oct 2026", { "text-anchor": "middle", "font-family": MONO, "font-size": 20, "font-weight": 700 }); /* one chunky kettlebell */ const k = el("g", { transform: "translate(776 396)" }, svg); el("ellipse", { cx: 0, cy: 96, rx: 118, ry: 10, fill: SOFT }, k); diff --git a/docs/blog/assets/media/mistral-large-4/tags.png b/docs/blog/assets/media/mistral-large-4/tags.png index 5fdea957fc..9379f43ca9 100644 Binary files a/docs/blog/assets/media/mistral-large-4/tags.png and b/docs/blog/assets/media/mistral-large-4/tags.png differ diff --git a/docs/blog/assets/media/what-is-kimi-k3-1-pro/hero.png b/docs/blog/assets/media/what-is-kimi-k3-1-pro/hero.png new file mode 100644 index 0000000000..1a19c9bcf8 Binary files /dev/null and b/docs/blog/assets/media/what-is-kimi-k3-1-pro/hero.png differ diff --git a/docs/blog/assets/media/what-is-kimi-k3-1-pro/highjump.png b/docs/blog/assets/media/what-is-kimi-k3-1-pro/highjump.png new file mode 100644 index 0000000000..387b4e5ced Binary files /dev/null and b/docs/blog/assets/media/what-is-kimi-k3-1-pro/highjump.png differ diff --git a/docs/blog/assets/media/what-is-kimi-k3-1-pro/motion.css b/docs/blog/assets/media/what-is-kimi-k3-1-pro/motion.css new file mode 100644 index 0000000000..a2b6dd2960 --- /dev/null +++ b/docs/blog/assets/media/what-is-kimi-k3-1-pro/motion.css @@ -0,0 +1,13 @@ +/* Bright coded scenes for "What is Kimi K3.1 Pro". 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/what-is-kimi-k3-1-pro/motion.js b/docs/blog/assets/media/what-is-kimi-k3-1-pro/motion.js new file mode 100644 index 0000000000..73ee64e78d --- /dev/null +++ b/docs/blog/assets/media/what-is-kimi-k3-1-pro/motion.js @@ -0,0 +1,217 @@ +/* Bright coded scenes for "What is Kimi K3.1 Pro". Vanilla JS, no library. +
holds a still image; this script swaps in a live SVG. + Plays only in view, honours reduced motion, "?mgstill" freezes each scene on its still frame. */ +(() => { + const NS = "http://www.w3.org/2000/svg"; + const INK = "#1A1320", YEL = "#FFCA54", BLUE = "#6C8EF5", LIL = "#B69CFF", MINT = "#7FD8AE", SKY = "#9AD8FF", SOFT = "#F1ECF9", MUTE = "#7A6A88"; + const SANS = '"Space Grotesk", system-ui, sans-serif', MONO = '"JetBrains Mono", ui-monospace, monospace'; + const el = (t, a = {}, p) => { const n = document.createElementNS(NS, t); for (const k in a) n.setAttribute(k, a[k]); if (p) p.appendChild(n); return n; }; + const txt = (p, x, y, s, a = {}) => { const n = el("text", Object.assign({ x, y, "font-family": SANS, "font-size": 24, "font-weight": 600, fill: INK }, a), p); n.textContent = s; return n; }; + const cl = (v, a = 0, b = 1) => Math.max(a, Math.min(b, v)); + const seg = (t, a, b) => cl((t - a) / (b - a)); + const oc = (x) => 1 - Math.pow(1 - x, 3); + const ob = (x) => { const c = 1.70158; return 1 + (c + 1) * Math.pow(x - 1, 3) + c * Math.pow(x - 1, 2); }; + const io = (x) => (x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2); + const tf = (n, x, y, s = 1, r = 0) => n.setAttribute("transform", `translate(${x} ${y}) rotate(${r}) scale(${s})`); + const button = (g, label, fn) => { + g.setAttribute("role", "button"); g.setAttribute("tabindex", "0"); g.setAttribute("aria-label", label); g.classList.add("mg-hit"); + g.addEventListener("click", fn); + g.addEventListener("keydown", (e) => { if (e.key === "Enter" || e.key === " ") { e.preventDefault(); fn(); } }); + }; + const strip = (svg, y, w = 680) => { + el("rect", { x: (800 - w) / 2, y, width: w, height: 48, rx: 24, fill: SOFT }, svg); + return txt(svg, 400, y + 31, "", { "text-anchor": "middle", "font-size": 20, "font-weight": 500 }); + }; + + /* one high jump standard: two posts and a crossbar that rides up them; returns a setter for the bar's y */ + const standard = (p, cx, base, top, half, col, post = 4) => { + const g = el("g", {}, p); + [-half + 4, half - 4].forEach((dx) => { + el("path", { d: `M${cx + dx} ${base} V${top}`, stroke: INK, "stroke-width": post, "stroke-linecap": "round" }, g); + el("path", { d: `M${cx + dx - 9} ${base} H${cx + dx + 9}`, stroke: INK, "stroke-width": post, "stroke-linecap": "round" }, g); + }); + const bar = el("rect", { x: cx - half, width: half * 2, height: 12, rx: 6, fill: col, stroke: INK, "stroke-width": 2.5 }, g); + return { g, set: (y) => bar.setAttribute("y", y - 6) }; + }; + + const SC = {}; + + /* ---- 1. three high jump bars on the Terminal-Bench 4.0 scale ---- */ + SC.highjump = { + dur: 8, still: 8, + build(svg, api) { + const BASE = 470, Y = (v) => BASE - (v - 55) * 21.33; + txt(svg, 44, 70, "Terminal-Bench 4.0", { "font-size": 32, "font-weight": 700 }); + [55, 60, 65, 70].forEach((v) => { + el("path", { d: `M120 ${Y(v)} H740`, stroke: SOFT, "stroke-width": 2 }, svg); + txt(svg, 100, Y(v) + 6, String(v), { "text-anchor": "end", "font-family": MONO, "font-size": 16, "font-weight": 500, fill: MUTE }); + }); + el("rect", { x: 150, y: BASE, width: 590, height: 14, rx: 7, fill: SOFT }, svg); + const DATA = [["GPT-6 Astra", 58.2, SKY, 260], ["Kimi K3.1 Pro", 65.7, YEL, 450], ["Claude Opus 5.5", 66.4, LIL, 640]]; + let pinned = -1; + const src = el("g", { opacity: 0 }, svg), srcText = strip(src, 530, 360); srcText.textContent = "Kimi's launch post"; + const bars = DATA.map(([name, v, col, cx], i) => { + const g = el("g", {}, svg); + el("rect", { x: cx - 80, y: 120, width: 160, height: 410, rx: 14, fill: "#fff", "fill-opacity": 0 }, g); + el("rect", { x: cx - 84, y: 116, width: 168, height: 412, rx: 16, fill: "none", stroke: INK, "stroke-width": 2, "stroke-dasharray": "3 7", class: "mg-ring" }, g); + const s = standard(g, cx, BASE, Y(70) - 8, 66, col); + const val = txt(g, cx, 0, "", { "text-anchor": "middle", "font-family": MONO, "font-size": 20, "font-weight": 700 }); + txt(g, cx, BASE + 42, name, { "text-anchor": "middle", "font-size": 21 }); + button(g, `${name}: ${v}. Source: Kimi's launch post`, () => { pinned = i; api.poke(); }); + return { s, val, v, d: 0.4 + i * 0.5 }; + }); + const rx = 545, rTop = Y(66.4), rBot = Y(65.7); + const ruler = el("g", {}, svg); + el("path", { d: `M516 ${rBot} H${rx + 14} M${rx - 14} ${rTop} H574`, stroke: INK, "stroke-width": 1.5, "stroke-dasharray": "3 4" }, ruler); + el("path", { d: `M${rx} ${rTop} V${rBot} M${rx - 8} ${rTop} H${rx + 8} M${rx - 8} ${rBot} H${rx + 8} M${rx} ${rTop} V134`, stroke: INK, "stroke-width": 2.5, "stroke-linecap": "round" }, ruler); + el("rect", { x: rx - 62, y: 100, width: 124, height: 34, rx: 17, fill: MINT, stroke: INK, "stroke-width": 2.5 }, ruler); + txt(ruler, rx, 123, "0.7 points", { "text-anchor": "middle", "font-size": 18, "font-weight": 700 }); + return (t) => { + bars.forEach((b) => { + const k = oc(seg(t, b.d, b.d + 1.3)), y = Y(55) + (Y(b.v) - Y(55)) * k; + b.s.set(y); b.val.setAttribute("y", y - 20); + b.val.textContent = (55 + (b.v - 55) * k).toFixed(1); + b.val.setAttribute("opacity", seg(t, b.d, b.d + 0.3)); + }); + const r = oc(seg(t, 3.2, 4.1)); + ruler.setAttribute("opacity", r); ruler.setAttribute("transform", `translate(${90 * (1 - r)} 0)`); + src.setAttribute("opacity", pinned >= 0 ? 1 : 0); + }; + }, + }; + + /* ---- 2. a parcel tracking line with three stops ---- */ + SC.route = { + dur: 8, still: 8, + build(svg, api) { + const all = el("g", {}, svg); + el("rect", { x: 0, y: 0, width: 800, height: 600, fill: "#fff", "fill-opacity": 0 }, all); + el("rect", { x: 10, y: 10, width: 780, height: 580, rx: 16, fill: "none", stroke: INK, "stroke-width": 2, "stroke-dasharray": "3 7", class: "mg-ring" }, all); + const LY = 350, X = [140, 400, 660]; + const STOPS = [["Launched 23 Oct", true], ["API and apps today", true], ["Weights by 4 Nov", false]]; + el("path", { d: `M${X[0]} ${LY} H${X[2]}`, stroke: SOFT, "stroke-width": 18, "stroke-linecap": "round" }, all); + el("path", { d: `M${X[0]} ${LY} H${X[2]}`, stroke: INK, "stroke-width": 2, "stroke-dasharray": "2 12", "stroke-linecap": "round" }, all); + const done = el("path", { d: "", stroke: INK, "stroke-width": 5, "stroke-linecap": "round" }, all); + const wait = el("circle", { cx: X[2], cy: LY, r: 34, fill: "none", stroke: INK, "stroke-width": 2, "stroke-dasharray": "4 6" }, all); + const stops = STOPS.map(([label, tick], i) => { + const g = el("g", {}, all), c = el("circle", { cx: X[i], cy: LY, r: 22, fill: "#fff", stroke: INK, "stroke-width": 3 }, g); + const mark = tick ? el("path", { d: `M${X[i] - 10} ${LY} l7 7 l13 -14`, stroke: INK, "stroke-width": 4, fill: "none", "stroke-linecap": "round", "stroke-linejoin": "round" }, g) : null; + txt(g, X[i], LY + 66, label, { "text-anchor": "middle", "font-size": 22 }); + return { c, mark, tick }; + }); + const parcel = el("g", {}, all); + el("rect", { x: -82, y: -112, width: 164, height: 92, rx: 10, fill: YEL, stroke: INK, "stroke-width": 3 }, parcel); + el("path", { d: "M-82 -86 H82", stroke: INK, "stroke-width": 2.5 }, parcel); + el("rect", { x: -70, y: -74, width: 140, height: 40, rx: 8, fill: "#fff", stroke: INK, "stroke-width": 2 }, parcel); + txt(parcel, 0, -48, "Kimi K3.1 Pro", { "text-anchor": "middle", "font-family": MONO, "font-size": 16, "font-weight": 700 }); + el("path", { d: "M-20 -20 L0 -4 L20 -20", stroke: INK, "stroke-width": 2.5, fill: "none", "stroke-linejoin": "round" }, parcel); + button(all, "Replay the parcel route", () => api.seek(0.01)); + const legs = [[1.4, 2.8], [3.8, 5.4]], arrive = [0.6, 2.8, 5.4]; + return (t) => { + const a = io(seg(t, legs[0][0], legs[0][1])), b = io(seg(t, legs[1][0], legs[1][1])); + const x = X[0] + (X[1] - X[0]) * a + (X[2] - X[1]) * b, moving = (a > 0 && a < 1) || (b > 0 && b < 1); + const drop = oc(seg(t, 0.2, 0.7)); + tf(parcel, x, LY - 32 - 60 * (1 - drop) - (moving ? Math.abs(Math.sin(t * 9)) * 6 : 0)); + parcel.setAttribute("opacity", drop); + done.setAttribute("d", `M${X[0]} ${LY} H${x}`); + stops.forEach((s, i) => { + const k = ob(seg(t, arrive[i], arrive[i] + 0.4)), on = t >= arrive[i]; + if (s.tick) { s.c.setAttribute("fill", on ? MINT : "#fff"); s.mark.setAttribute("opacity", on ? 1 : 0); s.mark.setAttribute("transform", `translate(${X[i]} ${LY}) scale(${0.4 + 0.6 * cl(k, 0, 1.2)}) translate(${-X[i]} ${-LY})`); } + }); + const w = seg(t, 5.4, 6.0), pulse = 1 + 0.08 * Math.sin((t - 5.4) * 4) * (t > 6 ? 1 : w); + wait.setAttribute("opacity", w); wait.setAttribute("transform", `translate(${X[2]} ${LY}) scale(${pulse}) translate(${-X[2]} ${-LY})`); + }; + }, + }; + + /* ---- 3. three plugs slide into a power strip ---- */ + SC.plugs = { + dur: 8, still: 8, + build(svg, api) { + const SY = 360, X = [210, 400, 590]; + const P = [["Kimi Code", "model picker", BLUE, "Kimi Code: /model"], ["Codex", "config.toml", LIL, "Codex: api.moonshot.ai/v1"], ["Claude Code", "settings.json", SKY, "Claude Code: api.moonshot.ai/anthropic"]]; + const body = el("rect", { x: 90, y: SY, width: 620, height: 96, rx: 22, fill: SOFT, stroke: INK, "stroke-width": 3 }, svg); + txt(svg, 400, SY + 80, "Kimi API", { "text-anchor": "middle", "font-family": MONO, "font-size": 20, "font-weight": 700 }); + const lights = X.map((x) => { + el("rect", { x: x - 34, y: SY + 14, width: 68, height: 34, rx: 10, fill: "#fff", stroke: INK, "stroke-width": 2.5 }, svg); + el("path", { d: `M${x - 12} ${SY + 22} V${SY + 40} M${x + 12} ${SY + 22} V${SY + 40}`, stroke: INK, "stroke-width": 4, "stroke-linecap": "round" }, svg); + return el("circle", { cx: x + 54, cy: SY + 31, r: 8, fill: "#fff", stroke: INK, "stroke-width": 2.5 }, svg); + }); + const out = el("g", { opacity: 0 }, svg), outText = strip(out, 512, 600); + outText.setAttribute("font-family", MONO); outText.setAttribute("font-size", 19); + let pinned = -1; + const plugs = P.map(([name, tag, col, ep], i) => { + const g = el("g", {}, svg), x = X[i]; + el("path", { d: `M${x} -20 C${x} 60 ${x + (i - 1) * 30} 90 ${x} 160 V240`, stroke: INK, "stroke-width": 5, fill: "none", "stroke-linecap": "round" }, g); + el("rect", { x: x - 86, y: 150, width: 172, height: 206, rx: 18, fill: "#fff", "fill-opacity": 0 }, g); + el("rect", { x: x - 90, y: 146, width: 180, height: 214, rx: 20, fill: "none", stroke: INK, "stroke-width": 2, "stroke-dasharray": "3 7", class: "mg-ring" }, g); + el("rect", { x: x - 66, y: 166, width: 132, height: 34, rx: 8, fill: "#fff", stroke: INK, "stroke-width": 2 }, g); + txt(g, x, 189, tag, { "text-anchor": "middle", "font-family": MONO, "font-size": 15, "font-weight": 500 }); + el("path", { d: `M${x - 12} ${SY - 34} V${SY + 30} M${x + 12} ${SY - 34} V${SY + 30}`, stroke: INK, "stroke-width": 6, "stroke-linecap": "round" }, g); + el("rect", { x: x - 80, y: 240, width: 160, height: 88, rx: 16, fill: col, stroke: INK, "stroke-width": 3 }, g); + txt(g, x, 292, name, { "text-anchor": "middle", "font-size": 22, "font-weight": 700 }); + button(g, `${name}, ${tag}. Endpoint: ${ep}`, () => { pinned = i; api.poke(); }); + return { g, d: 0.5 + i * 1.3 }; + }); + return (t) => { + let lit = 0; + plugs.forEach((p, i) => { + const k = ob(seg(t, p.d, p.d + 0.9)), on = t >= p.d + 0.75; + p.g.setAttribute("transform", `translate(0 ${-330 * (1 - cl(k, 0, 1.1))})`); + lights[i].setAttribute("fill", on ? MINT : "#fff"); if (on) lit++; + }); + body.setAttribute("fill", lit === 3 && t >= 4.6 ? YEL : SOFT); + out.setAttribute("opacity", pinned >= 0 ? 1 : 0); + if (pinned >= 0) outText.textContent = P[pinned][3]; + }; + }, + }; + + /* ---- title card, 16 by 9 ---- */ + SC.hero = { + w: 960, h: 540, dur: 1, still: 0, + build(svg) { + el("rect", { x: 64, y: 96, width: 132, height: 40, rx: 20, fill: LIL, stroke: INK, "stroke-width": 2.5 }, svg); + txt(svg, 130, 123, "Concepts", { "text-anchor": "middle", "font-size": 20, "font-weight": 700 }); + txt(svg, 64, 240, "Kimi K3.1 Pro", { "font-size": 80, "font-weight": 700 }); + el("path", { d: "M66 268 H500", stroke: YEL, "stroke-width": 14, "stroke-linecap": "round" }, svg); + txt(svg, 64, 330, "1M context, weights by 4 Nov", { "font-size": 28, "font-weight": 500, fill: MUTE }); + txt(svg, 64, 466, "Checked 29 Oct 2026", { "font-family": MONO, "font-size": 18, "font-weight": 500, fill: MUTE }); + const BASE = 470, Y = (v) => BASE - (v - 50) * 16; + el("rect", { x: 606, y: BASE, width: 328, height: 12, rx: 6, fill: SOFT }, svg); + [[58.2, SKY, 660], [65.7, YEL, 770], [66.4, LIL, 880]].forEach(([v, col, cx]) => standard(svg, cx, BASE, Y(70) - 6, 38, col, 3.5).set(Y(v))); + return () => {}; + }, + }; + + /* ---- player ---- */ + const q = new URLSearchParams(location.search), frozen = q.has("mgstill"), fixed = parseFloat(q.get("mgstill")); + const calm = matchMedia("(prefers-reduced-motion: reduce)").matches; + const mount = (fig) => { + const sc = SC[fig.dataset.scene], img = fig.querySelector("img"); if (!sc || !img) return; + const W = sc.w || 800, H = sc.h || 600; + const svg = el("svg", { viewBox: `0 0 ${W} ${H}`, class: "mg-svg", role: "group", "aria-label": img.alt || "" }); + svg.style.aspectRatio = `${W} / ${H}`; + el("rect", { width: W, height: H, fill: "#fff" }, svg); + img.replaceWith(svg); + let off = 0, raf = 0, seen = false, held = calm; + const base = performance.now(), clock = () => (performance.now() - base) / 1000; + let draw = () => {}; + const frame = () => { const now = clock(); draw(held ? sc.still : (((now + off) % sc.dur) + sc.dur) % sc.dur, now); }; + const tick = () => { cancelAnimationFrame(raf); frame(); if (seen && !held) raf = requestAnimationFrame(tick); }; + const api = { now: clock, seek: (s) => { off = s - clock(); held = false; tick(); }, poke: () => { held = false; tick(); } }; + draw = sc.build(svg, api); + if (frozen) { draw(isNaN(fixed) ? sc.still : fixed, 0); return; } + new IntersectionObserver(([e]) => { + seen = e.isIntersecting; + if (seen) { tick(); if (!fig.dataset.sent && window.posthog) { fig.dataset.sent = 1; window.posthog.capture("blog_scene_view", { slug: location.pathname.split("/").filter(Boolean).pop(), scene: fig.dataset.scene }); } } + else cancelAnimationFrame(raf); + }, { threshold: 0.25 }).observe(fig); + svg.addEventListener("click", () => { if (!fig.dataset.hit && window.posthog) { fig.dataset.hit = 1; window.posthog.capture("blog_scene_interact", { slug: location.pathname.split("/").filter(Boolean).pop(), scene: fig.dataset.scene }); } }); + frame(); + }; + const go = () => document.querySelectorAll("figure.mg[data-scene]").forEach(mount); + const fonts = document.fonts && document.fonts.load ? Promise.all([document.fonts.load('700 32px "Space Grotesk"'), document.fonts.load('500 20px "Space Grotesk"'), document.fonts.load('700 20px "JetBrains Mono"')]).catch(() => {}) : Promise.resolve(); + const start = () => fonts.then(go, go); + if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", start); else start(); +})(); diff --git a/docs/blog/assets/media/what-is-kimi-k3-1-pro/plugs.png b/docs/blog/assets/media/what-is-kimi-k3-1-pro/plugs.png new file mode 100644 index 0000000000..300663186e Binary files /dev/null and b/docs/blog/assets/media/what-is-kimi-k3-1-pro/plugs.png differ diff --git a/docs/blog/assets/media/what-is-kimi-k3-1-pro/route.png b/docs/blog/assets/media/what-is-kimi-k3-1-pro/route.png new file mode 100644 index 0000000000..d3ea684fcc Binary files /dev/null and b/docs/blog/assets/media/what-is-kimi-k3-1-pro/route.png differ diff --git a/docs/blog/best-ai-coding-agents/index.html b/docs/blog/best-ai-coding-agents/index.html index a994005922..017068583d 100644 --- a/docs/blog/best-ai-coding-agents/index.html +++ b/docs/blog/best-ai-coding-agents/index.html @@ -468,6 +468,22 @@

FAQ

Related in Comparisons

+ -
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..dd4dc28c21 100644 --- a/docs/blog/best-claude-code-multi-agent-tools/index.html +++ b/docs/blog/best-claude-code-multi-agent-tools/index.html @@ -436,6 +436,22 @@

FAQ

Related in Comparisons

+ -
diff --git a/docs/blog/build-your-own-claude-duet/index.html b/docs/blog/build-your-own-claude-duet/index.html index 874a669037..9356cc4dd7 100644 --- a/docs/blog/build-your-own-claude-duet/index.html +++ b/docs/blog/build-your-own-claude-duet/index.html @@ -280,50 +280,50 @@

FAQ

Related in Guides

- +
- + 4 min
-

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

-

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

+

How to Run Mistral Large 4 Locally: Hardware, GGUF Sizes and vLLM (Oct 2026)

+

Mistral Large 4 weights are out. Which file fits your memory, the llama.cpp and vLLM commands, the GPUs Mistral validated and the licence, checked 29 Oct 2026.

Guides - Read → + Read →
- +
4 min
-

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

-

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

+

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

+

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

Guides - Read → + Read →
- +
- 5 min + 4 min
-

Cursor Pricing (Oct 2026): Every Plan After the 12 Oct Change

-

Cursor pricing as of 26 Oct 2026: Free, Plus $8, Premium $30, Super $100, Ultra $200, Teams seats, what changed on 12 Oct and what old plans keep.

+

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

+

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

Guides - Read → + Read →
diff --git a/docs/blog/build-your-personal-agi-on-your-computer/index.html b/docs/blog/build-your-personal-agi-on-your-computer/index.html index d21a35869f..005945260e 100644 --- a/docs/blog/build-your-personal-agi-on-your-computer/index.html +++ b/docs/blog/build-your-personal-agi-on-your-computer/index.html @@ -342,50 +342,50 @@

FAQ

Related in Guides

- +
- + 4 min
-

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

-

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

+

How to Run Mistral Large 4 Locally: Hardware, GGUF Sizes and vLLM (Oct 2026)

+

Mistral Large 4 weights are out. Which file fits your memory, the llama.cpp and vLLM commands, the GPUs Mistral validated and the licence, checked 29 Oct 2026.

Guides - Read → + Read →
- +
4 min
-

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

-

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

+

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

+

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

Guides - Read → + Read →
- +
- 5 min + 4 min
-

Cursor Pricing (Oct 2026): Every Plan After the 12 Oct Change

-

Cursor pricing as of 26 Oct 2026: Free, Plus $8, Premium $30, Super $100, Ultra $200, Teams seats, what changed on 12 Oct and what old plans keep.

+

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

+

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

Guides - Read → + Read →
diff --git a/docs/blog/building-reliable-ai-agents/index.html b/docs/blog/building-reliable-ai-agents/index.html index 86ea2b2786..3f5254a20d 100644 --- a/docs/blog/building-reliable-ai-agents/index.html +++ b/docs/blog/building-reliable-ai-agents/index.html @@ -358,50 +358,50 @@

FAQ

Related in Guides

- +
- + 4 min
-

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

-

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

+

How to Run Mistral Large 4 Locally: Hardware, GGUF Sizes and vLLM (Oct 2026)

+

Mistral Large 4 weights are out. Which file fits your memory, the llama.cpp and vLLM commands, the GPUs Mistral validated and the licence, checked 29 Oct 2026.

Guides - Read → + Read →
- +
4 min
-

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

-

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

+

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

+

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

Guides - Read → + Read →
- +
- 5 min + 4 min
-

Cursor Pricing (Oct 2026): Every Plan After the 12 Oct Change

-

Cursor pricing as of 26 Oct 2026: Free, Plus $8, Premium $30, Super $100, Ultra $200, Teams seats, what changed on 12 Oct and what old plans keep.

+

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

+

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

Guides - Read → + Read →
diff --git a/docs/blog/can-claude-code-agents-talk-to-each-other/index.html b/docs/blog/can-claude-code-agents-talk-to-each-other/index.html index 2a7f9f80a9..467e1ab493 100644 --- a/docs/blog/can-claude-code-agents-talk-to-each-other/index.html +++ b/docs/blog/can-claude-code-agents-talk-to-each-other/index.html @@ -341,6 +341,22 @@

FAQ

Related in Concepts

+ -
diff --git a/docs/blog/chatgpt-dots-alternatives/index.html b/docs/blog/chatgpt-dots-alternatives/index.html index 0cb399558b..f5d5fca3cf 100644 --- a/docs/blog/chatgpt-dots-alternatives/index.html +++ b/docs/blog/chatgpt-dots-alternatives/index.html @@ -350,6 +350,22 @@

FAQ

Related in Comparisons

+ -
diff --git a/docs/blog/claude-api-version-2026-10-21/index.html b/docs/blog/claude-api-version-2026-10-21/index.html index 20ce332935..d74915950d 100644 --- a/docs/blog/claude-api-version-2026-10-21/index.html +++ b/docs/blog/claude-api-version-2026-10-21/index.html @@ -330,50 +330,50 @@

FAQ

Related in Guides

- +
- + 4 min
-

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

-

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

+

How to Run Mistral Large 4 Locally: Hardware, GGUF Sizes and vLLM (Oct 2026)

+

Mistral Large 4 weights are out. Which file fits your memory, the llama.cpp and vLLM commands, the GPUs Mistral validated and the licence, checked 29 Oct 2026.

Guides - Read → + Read →
- +
4 min
-

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

-

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

+

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

+

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

Guides - Read → + Read →
- +
- 5 min + 4 min
-

Cursor Pricing (Oct 2026): Every Plan After the 12 Oct Change

-

Cursor pricing as of 26 Oct 2026: Free, Plus $8, Premium $30, Super $100, Ultra $200, Teams seats, what changed on 12 Oct and what old plans keep.

+

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

+

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

Guides - Read → + Read →
diff --git a/docs/blog/claude-code-agent-teams/index.html b/docs/blog/claude-code-agent-teams/index.html index 23b4ce9fa7..f23ea9c0ef 100644 --- a/docs/blog/claude-code-agent-teams/index.html +++ b/docs/blog/claude-code-agent-teams/index.html @@ -335,6 +335,22 @@

FAQ

Related in Concepts

+ -
diff --git a/docs/blog/claude-code-alternatives/index.html b/docs/blog/claude-code-alternatives/index.html index cf427d8789..c1ef2d8ed1 100644 --- a/docs/blog/claude-code-alternatives/index.html +++ b/docs/blog/claude-code-alternatives/index.html @@ -360,6 +360,22 @@

FAQ

Related in Comparisons

+ -
diff --git a/docs/blog/claude-code-automation-while-you-sleep/index.html b/docs/blog/claude-code-automation-while-you-sleep/index.html index ea379d80f1..c0b5f152fa 100644 --- a/docs/blog/claude-code-automation-while-you-sleep/index.html +++ b/docs/blog/claude-code-automation-while-you-sleep/index.html @@ -346,50 +346,50 @@

FAQ

Related in Guides

- +
- + 4 min
-

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

-

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

+

How to Run Mistral Large 4 Locally: Hardware, GGUF Sizes and vLLM (Oct 2026)

+

Mistral Large 4 weights are out. Which file fits your memory, the llama.cpp and vLLM commands, the GPUs Mistral validated and the licence, checked 29 Oct 2026.

Guides - Read → + Read →
- +
4 min
-

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

-

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

+

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

+

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

Guides - Read → + Read →
- +
- 5 min + 4 min
-

Cursor Pricing (Oct 2026): Every Plan After the 12 Oct Change

-

Cursor pricing as of 26 Oct 2026: Free, Plus $8, Premium $30, Super $100, Ultra $200, Teams seats, what changed on 12 Oct and what old plans keep.

+

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

+

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

Guides - Read → + Read →
diff --git a/docs/blog/claude-code-best-practices/index.html b/docs/blog/claude-code-best-practices/index.html index 85711125b6..f6940bea10 100644 --- a/docs/blog/claude-code-best-practices/index.html +++ b/docs/blog/claude-code-best-practices/index.html @@ -349,50 +349,50 @@

FAQ

Related in Guides

- +
- + 4 min
-

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

-

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

+

How to Run Mistral Large 4 Locally: Hardware, GGUF Sizes and vLLM (Oct 2026)

+

Mistral Large 4 weights are out. Which file fits your memory, the llama.cpp and vLLM commands, the GPUs Mistral validated and the licence, checked 29 Oct 2026.

Guides - Read → + Read →
- +
4 min
-

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

-

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

+

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

+

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

Guides - Read → + Read →
- +
- 5 min + 4 min
-

Cursor Pricing (Oct 2026): Every Plan After the 12 Oct Change

-

Cursor pricing as of 26 Oct 2026: Free, Plus $8, Premium $30, Super $100, Ultra $200, Teams seats, what changed on 12 Oct and what old plans keep.

+

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

+

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

Guides - Read → + Read →
diff --git a/docs/blog/claude-code-max-plan-tips/index.html b/docs/blog/claude-code-max-plan-tips/index.html index d801d3f652..f2c4028121 100644 --- a/docs/blog/claude-code-max-plan-tips/index.html +++ b/docs/blog/claude-code-max-plan-tips/index.html @@ -279,50 +279,50 @@

FAQ

Related in Guides

- +
- + 4 min
-

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

-

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

+

How to Run Mistral Large 4 Locally: Hardware, GGUF Sizes and vLLM (Oct 2026)

+

Mistral Large 4 weights are out. Which file fits your memory, the llama.cpp and vLLM commands, the GPUs Mistral validated and the licence, checked 29 Oct 2026.

Guides - Read → + Read →
- +
4 min
-

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

-

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

+

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

+

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

Guides - Read → + Read →
- +
- 5 min + 4 min
-

Cursor Pricing (Oct 2026): Every Plan After the 12 Oct Change

-

Cursor pricing as of 26 Oct 2026: Free, Plus $8, Premium $30, Super $100, Ultra $200, Teams seats, what changed on 12 Oct and what old plans keep.

+

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

+

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

Guides - Read → + Read →
diff --git a/docs/blog/claude-code-multi-agent-setup-tutorial/index.html b/docs/blog/claude-code-multi-agent-setup-tutorial/index.html index b182d18535..619a54ace2 100644 --- a/docs/blog/claude-code-multi-agent-setup-tutorial/index.html +++ b/docs/blog/claude-code-multi-agent-setup-tutorial/index.html @@ -335,50 +335,50 @@

FAQ

Related in Guides

- +
- + 4 min
-

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

-

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

+

How to Run Mistral Large 4 Locally: Hardware, GGUF Sizes and vLLM (Oct 2026)

+

Mistral Large 4 weights are out. Which file fits your memory, the llama.cpp and vLLM commands, the GPUs Mistral validated and the licence, checked 29 Oct 2026.

Guides - Read → + Read →
- +
4 min
-

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

-

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

+

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

+

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

Guides - Read → + Read →
- +
- 5 min + 4 min
-

Cursor Pricing (Oct 2026): Every Plan After the 12 Oct Change

-

Cursor pricing as of 26 Oct 2026: Free, Plus $8, Premium $30, Super $100, Ultra $200, Teams seats, what changed on 12 Oct and what old plans keep.

+

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

+

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

Guides - 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..bf77761271 100644 --- a/docs/blog/claude-code-orchestration-tools-compared/index.html +++ b/docs/blog/claude-code-orchestration-tools-compared/index.html @@ -334,6 +334,22 @@

Matching tools to priorities

Related in Comparisons

+ -
diff --git a/docs/blog/claude-code-projects/index.html b/docs/blog/claude-code-projects/index.html index 1b81ead8d1..a18cf3b851 100644 --- a/docs/blog/claude-code-projects/index.html +++ b/docs/blog/claude-code-projects/index.html @@ -325,6 +325,22 @@

FAQ

Related in Concepts

+ -
diff --git a/docs/blog/claude-code-router/index.html b/docs/blog/claude-code-router/index.html index f11d81a0e2..0d5ab9b85e 100644 --- a/docs/blog/claude-code-router/index.html +++ b/docs/blog/claude-code-router/index.html @@ -314,6 +314,22 @@

FAQ

Related in Concepts

+ -
diff --git a/docs/blog/claude-code-routines/index.html b/docs/blog/claude-code-routines/index.html index dfb797ea9e..c14783a284 100644 --- a/docs/blog/claude-code-routines/index.html +++ b/docs/blog/claude-code-routines/index.html @@ -353,6 +353,22 @@

FAQ

Related in Concepts

+ -
diff --git a/docs/blog/claude-code-skills/index.html b/docs/blog/claude-code-skills/index.html index 13ca5eae58..1b52474aa4 100644 --- a/docs/blog/claude-code-skills/index.html +++ b/docs/blog/claude-code-skills/index.html @@ -330,50 +330,50 @@

FAQ

Related in Guides

- +
- + 4 min
-

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

-

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

+

How to Run Mistral Large 4 Locally: Hardware, GGUF Sizes and vLLM (Oct 2026)

+

Mistral Large 4 weights are out. Which file fits your memory, the llama.cpp and vLLM commands, the GPUs Mistral validated and the licence, checked 29 Oct 2026.

Guides - Read → + Read →
- +
4 min
-

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

-

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

+

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

+

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

Guides - Read → + Read →
- +
- 5 min + 4 min
-

Cursor Pricing (Oct 2026): Every Plan After the 12 Oct Change

-

Cursor pricing as of 26 Oct 2026: Free, Plus $8, Premium $30, Super $100, Ultra $200, Teams seats, what changed on 12 Oct and what old plans keep.

+

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

+

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

Guides - Read → + Read →
diff --git a/docs/blog/claude-code-subagents-vs-multi-agent-harness/index.html b/docs/blog/claude-code-subagents-vs-multi-agent-harness/index.html index 72d0a3e82e..495fdb73a4 100644 --- a/docs/blog/claude-code-subagents-vs-multi-agent-harness/index.html +++ b/docs/blog/claude-code-subagents-vs-multi-agent-harness/index.html @@ -342,50 +342,50 @@

FAQ

Related in Guides

- +
- + 4 min
-

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

-

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

+

How to Run Mistral Large 4 Locally: Hardware, GGUF Sizes and vLLM (Oct 2026)

+

Mistral Large 4 weights are out. Which file fits your memory, the llama.cpp and vLLM commands, the GPUs Mistral validated and the licence, checked 29 Oct 2026.

Guides - Read → + Read →
- +
4 min
-

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

-

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

+

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

+

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

Guides - Read → + Read →
- +
- 5 min + 4 min
-

Cursor Pricing (Oct 2026): Every Plan After the 12 Oct Change

-

Cursor pricing as of 26 Oct 2026: Free, Plus $8, Premium $30, Super $100, Ultra $200, Teams seats, what changed on 12 Oct and what old plans keep.

+

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

+

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

Guides - Read → + Read →
diff --git a/docs/blog/claude-code-vs-antigravity/index.html b/docs/blog/claude-code-vs-antigravity/index.html index c655cb9c1d..013cf0d06d 100644 --- a/docs/blog/claude-code-vs-antigravity/index.html +++ b/docs/blog/claude-code-vs-antigravity/index.html @@ -275,6 +275,22 @@

FAQ

Related in Comparisons

+ -
diff --git a/docs/blog/claude-code-vs-cursor/index.html b/docs/blog/claude-code-vs-cursor/index.html index e4011e590f..44de0c7d33 100644 --- a/docs/blog/claude-code-vs-cursor/index.html +++ b/docs/blog/claude-code-vs-cursor/index.html @@ -353,6 +353,22 @@

FAQ

Related in Comparisons

+ -
diff --git a/docs/blog/claude-cowork-vs-claude-code/index.html b/docs/blog/claude-cowork-vs-claude-code/index.html index 815dc856ee..7190ef4255 100644 --- a/docs/blog/claude-cowork-vs-claude-code/index.html +++ b/docs/blog/claude-cowork-vs-claude-code/index.html @@ -347,6 +347,22 @@

FAQ

Related in Comparisons

+ -
diff --git a/docs/blog/claude-duet-alternatives/index.html b/docs/blog/claude-duet-alternatives/index.html index c7d542b36b..91e2edd5d2 100644 --- a/docs/blog/claude-duet-alternatives/index.html +++ b/docs/blog/claude-duet-alternatives/index.html @@ -313,6 +313,22 @@

FAQ

Related in Comparisons

+ -
diff --git a/docs/blog/claude-duet-app/index.html b/docs/blog/claude-duet-app/index.html index a4b5bf71c3..e4e49c9ec3 100644 --- a/docs/blog/claude-duet-app/index.html +++ b/docs/blog/claude-duet-app/index.html @@ -319,50 +319,50 @@

FAQ

Related in Guides

- +
- + 4 min
-

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

-

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

+

How to Run Mistral Large 4 Locally: Hardware, GGUF Sizes and vLLM (Oct 2026)

+

Mistral Large 4 weights are out. Which file fits your memory, the llama.cpp and vLLM commands, the GPUs Mistral validated and the licence, checked 29 Oct 2026.

Guides - Read → + Read →
- +
4 min
-

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

-

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

+

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

+

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

Guides - Read → + Read →
- +
- 5 min + 4 min
-

Cursor Pricing (Oct 2026): Every Plan After the 12 Oct Change

-

Cursor pricing as of 26 Oct 2026: Free, Plus $8, Premium $30, Super $100, Ultra $200, Teams seats, what changed on 12 Oct and what old plans keep.

+

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

+

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

Guides - Read → + Read →
diff --git a/docs/blog/claude-duet-for-developers/index.html b/docs/blog/claude-duet-for-developers/index.html index 2c5e14c2a6..0b4a2d3d5b 100644 --- a/docs/blog/claude-duet-for-developers/index.html +++ b/docs/blog/claude-duet-for-developers/index.html @@ -264,6 +264,22 @@

FAQ

Related in Comparisons

+ -
diff --git a/docs/blog/claude-duet-vs-munder-difflin/index.html b/docs/blog/claude-duet-vs-munder-difflin/index.html index d3f1d7c298..039eb070e8 100644 --- a/docs/blog/claude-duet-vs-munder-difflin/index.html +++ b/docs/blog/claude-duet-vs-munder-difflin/index.html @@ -310,6 +310,22 @@

FAQ

Related in Comparisons

+ -
diff --git a/docs/blog/claude-duet-waitlist/index.html b/docs/blog/claude-duet-waitlist/index.html index 49ed952e3e..cff646d387 100644 --- a/docs/blog/claude-duet-waitlist/index.html +++ b/docs/blog/claude-duet-waitlist/index.html @@ -290,50 +290,50 @@

FAQ

Related in Guides

- +
- + 4 min
-

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

-

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

+

How to Run Mistral Large 4 Locally: Hardware, GGUF Sizes and vLLM (Oct 2026)

+

Mistral Large 4 weights are out. Which file fits your memory, the llama.cpp and vLLM commands, the GPUs Mistral validated and the licence, checked 29 Oct 2026.

Guides - Read → + Read →
- +
4 min
-

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

-

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

+

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

+

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

Guides - Read → + Read →
- +
- 5 min + 4 min
-

Cursor Pricing (Oct 2026): Every Plan After the 12 Oct Change

-

Cursor pricing as of 26 Oct 2026: Free, Plus $8, Premium $30, Super $100, Ultra $200, Teams seats, what changed on 12 Oct and what old plans keep.

+

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

+

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

Guides - Read → + Read →
diff --git a/docs/blog/claude-haiku-5-5/index.html b/docs/blog/claude-haiku-5-5/index.html index 3a9702a797..f69d5bb986 100644 --- a/docs/blog/claude-haiku-5-5/index.html +++ b/docs/blog/claude-haiku-5-5/index.html @@ -384,6 +384,22 @@

FAQ

Related in Concepts

+ -
diff --git a/docs/blog/claude-managed-agents-dynamic-workflows/index.html b/docs/blog/claude-managed-agents-dynamic-workflows/index.html index b1299531d8..5ee6fa05b7 100644 --- a/docs/blog/claude-managed-agents-dynamic-workflows/index.html +++ b/docs/blog/claude-managed-agents-dynamic-workflows/index.html @@ -338,6 +338,22 @@

FAQ

Related in Concepts

+ -
diff --git a/docs/blog/claude-md-best-practices/index.html b/docs/blog/claude-md-best-practices/index.html index a5de925be7..2c8b6087b9 100644 --- a/docs/blog/claude-md-best-practices/index.html +++ b/docs/blog/claude-md-best-practices/index.html @@ -366,50 +366,50 @@

FAQ

Related in Guides

- +
- + 4 min
-

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

-

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

+

How to Run Mistral Large 4 Locally: Hardware, GGUF Sizes and vLLM (Oct 2026)

+

Mistral Large 4 weights are out. Which file fits your memory, the llama.cpp and vLLM commands, the GPUs Mistral validated and the licence, checked 29 Oct 2026.

Guides - Read → + Read →
- +
- 5 min + 4 min
-

Cursor Pricing (Oct 2026): Every Plan After the 12 Oct Change

-

Cursor pricing as of 26 Oct 2026: Free, Plus $8, Premium $30, Super $100, Ultra $200, Teams seats, what changed on 12 Oct and what old plans keep.

+

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

+

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

Guides - Read → + Read →
diff --git a/docs/blog/claude-squad-alternative/index.html b/docs/blog/claude-squad-alternative/index.html index cb2e9a9bf7..cf50b198bd 100644 --- a/docs/blog/claude-squad-alternative/index.html +++ b/docs/blog/claude-squad-alternative/index.html @@ -270,6 +270,22 @@

Which should you pick? + -

diff --git a/docs/blog/claude-squad-vs-munder-difflin/index.html b/docs/blog/claude-squad-vs-munder-difflin/index.html index efbaddc6f0..e6049fb86c 100644 --- a/docs/blog/claude-squad-vs-munder-difflin/index.html +++ b/docs/blog/claude-squad-vs-munder-difflin/index.html @@ -359,6 +359,22 @@

FAQ

Related in Comparisons

+ -
diff --git a/docs/blog/cline-alternatives/index.html b/docs/blog/cline-alternatives/index.html index 64e29bd0be..453b9fc0ca 100644 --- a/docs/blog/cline-alternatives/index.html +++ b/docs/blog/cline-alternatives/index.html @@ -338,6 +338,22 @@

FAQ

Related in Comparisons

+ -
diff --git a/docs/blog/cline-vs-munder-difflin/index.html b/docs/blog/cline-vs-munder-difflin/index.html index db4021d7b8..f853256943 100644 --- a/docs/blog/cline-vs-munder-difflin/index.html +++ b/docs/blog/cline-vs-munder-difflin/index.html @@ -326,6 +326,22 @@

FAQ

Related in Comparisons

+ -
diff --git a/docs/blog/codex-alternatives/index.html b/docs/blog/codex-alternatives/index.html index 513435365e..fcf2e034b3 100644 --- a/docs/blog/codex-alternatives/index.html +++ b/docs/blog/codex-alternatives/index.html @@ -351,6 +351,22 @@

FAQ

Related in Comparisons

+ -
diff --git a/docs/blog/codex-cli-vs-claude-code/index.html b/docs/blog/codex-cli-vs-claude-code/index.html index 6969a2c675..76f233acd1 100644 --- a/docs/blog/codex-cli-vs-claude-code/index.html +++ b/docs/blog/codex-cli-vs-claude-code/index.html @@ -407,6 +407,22 @@

FAQ

Related in Comparisons

+ -
diff --git a/docs/blog/codex-computer-use/index.html b/docs/blog/codex-computer-use/index.html index dc463b1fae..4b10c362bc 100644 --- a/docs/blog/codex-computer-use/index.html +++ b/docs/blog/codex-computer-use/index.html @@ -355,50 +355,50 @@

FAQ

Related in Guides

- +
- + 4 min
-

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

-

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

+

How to Run Mistral Large 4 Locally: Hardware, GGUF Sizes and vLLM (Oct 2026)

+

Mistral Large 4 weights are out. Which file fits your memory, the llama.cpp and vLLM commands, the GPUs Mistral validated and the licence, checked 29 Oct 2026.

Guides - Read → + Read →
- +
- 5 min + 4 min
-

Cursor Pricing (Oct 2026): Every Plan After the 12 Oct Change

-

Cursor pricing as of 26 Oct 2026: Free, Plus $8, Premium $30, Super $100, Ultra $200, Teams seats, what changed on 12 Oct and what old plans keep.

+

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

+

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

Guides - Read → + Read →
diff --git a/docs/blog/codex-max-plan-tips/index.html b/docs/blog/codex-max-plan-tips/index.html index e407b80678..5c0a9390b0 100644 --- a/docs/blog/codex-max-plan-tips/index.html +++ b/docs/blog/codex-max-plan-tips/index.html @@ -326,50 +326,50 @@

FAQ

Related in Guides

- +
- + 4 min
-

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

-

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

+

How to Run Mistral Large 4 Locally: Hardware, GGUF Sizes and vLLM (Oct 2026)

+

Mistral Large 4 weights are out. Which file fits your memory, the llama.cpp and vLLM commands, the GPUs Mistral validated and the licence, checked 29 Oct 2026.

Guides - Read → + Read →
- +
4 min
-

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

-

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

+

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

+

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

Guides - Read → + Read →
- +
- 5 min + 4 min
-

Cursor Pricing (Oct 2026): Every Plan After the 12 Oct Change

-

Cursor pricing as of 26 Oct 2026: Free, Plus $8, Premium $30, Super $100, Ultra $200, Teams seats, what changed on 12 Oct and what old plans keep.

+

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

+

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

Guides - Read → + Read →
diff --git a/docs/blog/codex-pricing/index.html b/docs/blog/codex-pricing/index.html index b5e7d57b00..0d4786974f 100644 --- a/docs/blog/codex-pricing/index.html +++ b/docs/blog/codex-pricing/index.html @@ -440,50 +440,50 @@

FAQ

Related in Guides

- +
- + 4 min
-

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

-

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

+

How to Run Mistral Large 4 Locally: Hardware, GGUF Sizes and vLLM (Oct 2026)

+

Mistral Large 4 weights are out. Which file fits your memory, the llama.cpp and vLLM commands, the GPUs Mistral validated and the licence, checked 29 Oct 2026.

Guides - Read → + Read →
- +
4 min
-

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

-

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

+

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

+

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

Guides - Read → + Read →
- +
- 5 min + 4 min
-

Cursor Pricing (Oct 2026): Every Plan After the 12 Oct Change

-

Cursor pricing as of 26 Oct 2026: Free, Plus $8, Premium $30, Super $100, Ultra $200, Teams seats, what changed on 12 Oct and what old plans keep.

+

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

+

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

Guides - Read → + Read →
diff --git a/docs/blog/codex-vs-claude-code-usage-limits/index.html b/docs/blog/codex-vs-claude-code-usage-limits/index.html index 837302c873..8ad99e35a0 100644 --- a/docs/blog/codex-vs-claude-code-usage-limits/index.html +++ b/docs/blog/codex-vs-claude-code-usage-limits/index.html @@ -341,6 +341,22 @@

FAQ

Related in Comparisons

+ -
diff --git a/docs/blog/codex-vs-cursor/index.html b/docs/blog/codex-vs-cursor/index.html index 67872d7170..3c25bc388b 100644 --- a/docs/blog/codex-vs-cursor/index.html +++ b/docs/blog/codex-vs-cursor/index.html @@ -347,6 +347,22 @@

FAQ

Related in Comparisons

+ -
diff --git a/docs/blog/codex-vs-gemini-cli/index.html b/docs/blog/codex-vs-gemini-cli/index.html index 8c591970da..395a00c970 100644 --- a/docs/blog/codex-vs-gemini-cli/index.html +++ b/docs/blog/codex-vs-gemini-cli/index.html @@ -331,6 +331,22 @@

FAQ

Related in Comparisons

+ -
diff --git a/docs/blog/command-center-guide/index.html b/docs/blog/command-center-guide/index.html index 0f1a45476e..c34b89a6f9 100644 --- a/docs/blog/command-center-guide/index.html +++ b/docs/blog/command-center-guide/index.html @@ -327,50 +327,50 @@

FAQ

Related in Guides

- +
- + 4 min
-

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

-

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

+

How to Run Mistral Large 4 Locally: Hardware, GGUF Sizes and vLLM (Oct 2026)

+

Mistral Large 4 weights are out. Which file fits your memory, the llama.cpp and vLLM commands, the GPUs Mistral validated and the licence, checked 29 Oct 2026.

Guides - Read → + Read →
- +
4 min
-

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

-

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

+

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

+

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

Guides - Read → + Read →
- +
- 5 min + 4 min
-

Cursor Pricing (Oct 2026): Every Plan After the 12 Oct Change

-

Cursor pricing as of 26 Oct 2026: Free, Plus $8, Premium $30, Super $100, Ultra $200, Teams seats, what changed on 12 Oct and what old plans keep.

+

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

+

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

Guides - Read → + Read →
diff --git a/docs/blog/conductor-claude-code-alternative/index.html b/docs/blog/conductor-claude-code-alternative/index.html index fd93f0b634..4cd0948eb2 100644 --- a/docs/blog/conductor-claude-code-alternative/index.html +++ b/docs/blog/conductor-claude-code-alternative/index.html @@ -272,6 +272,22 @@

Conductor vs an orchest

Related in Comparisons

+ -
diff --git a/docs/blog/connect-slack-to-munder-difflin/index.html b/docs/blog/connect-slack-to-munder-difflin/index.html index 3939f83e03..0dfe49d857 100644 --- a/docs/blog/connect-slack-to-munder-difflin/index.html +++ b/docs/blog/connect-slack-to-munder-difflin/index.html @@ -334,50 +334,50 @@

FAQ

Related in Guides

- +
- + 4 min
-

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

-

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

+

How to Run Mistral Large 4 Locally: Hardware, GGUF Sizes and vLLM (Oct 2026)

+

Mistral Large 4 weights are out. Which file fits your memory, the llama.cpp and vLLM commands, the GPUs Mistral validated and the licence, checked 29 Oct 2026.

Guides - Read → + Read →
- +
4 min
-

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

-

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

+

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

+

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

Guides - Read → + Read →
- +
- 5 min + 4 min
-

Cursor Pricing (Oct 2026): Every Plan After the 12 Oct Change

-

Cursor pricing as of 26 Oct 2026: Free, Plus $8, Premium $30, Super $100, Ultra $200, Teams seats, what changed on 12 Oct and what old plans keep.

+

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

+

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

Guides - Read → + Read →
diff --git a/docs/blog/context-engineering-for-ai-agents/index.html b/docs/blog/context-engineering-for-ai-agents/index.html index d8912ab4b1..f31918dd11 100644 --- a/docs/blog/context-engineering-for-ai-agents/index.html +++ b/docs/blog/context-engineering-for-ai-agents/index.html @@ -364,50 +364,50 @@

FAQ

Related in Guides

- +
- + 4 min
-

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

-

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

+

How to Run Mistral Large 4 Locally: Hardware, GGUF Sizes and vLLM (Oct 2026)

+

Mistral Large 4 weights are out. Which file fits your memory, the llama.cpp and vLLM commands, the GPUs Mistral validated and the licence, checked 29 Oct 2026.

Guides - Read → + Read →
- +
4 min
-

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

-

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

+

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

+

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

Guides - Read → + Read →
- +
- 5 min + 4 min
-

Cursor Pricing (Oct 2026): Every Plan After the 12 Oct Change

-

Cursor pricing as of 26 Oct 2026: Free, Plus $8, Premium $30, Super $100, Ultra $200, Teams seats, what changed on 12 Oct and what old plans keep.

+

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

+

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

Guides - 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..dee9274fb4 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,6 +296,22 @@

FAQ

Related in Comparisons

+ -
diff --git a/docs/blog/crystal-claude-code-alternative/index.html b/docs/blog/crystal-claude-code-alternative/index.html index ad3a4ad3d2..d8c5c0093e 100644 --- a/docs/blog/crystal-claude-code-alternative/index.html +++ b/docs/blog/crystal-claude-code-alternative/index.html @@ -268,6 +268,22 @@

Crystal vs a memory-backe

Related in Comparisons

+ -
diff --git a/docs/blog/cursor-alternatives/index.html b/docs/blog/cursor-alternatives/index.html index 8ac37005bb..b34027d263 100644 --- a/docs/blog/cursor-alternatives/index.html +++ b/docs/blog/cursor-alternatives/index.html @@ -367,6 +367,22 @@

FAQ

Related in Comparisons

+ -
diff --git a/docs/blog/cursor-pricing/index.html b/docs/blog/cursor-pricing/index.html index c3c6b0cb58..7dce3dd001 100644 --- a/docs/blog/cursor-pricing/index.html +++ b/docs/blog/cursor-pricing/index.html @@ -430,50 +430,50 @@

FAQ

Related in Guides

- +
- + 4 min
-

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

-

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

+

How to Run Mistral Large 4 Locally: Hardware, GGUF Sizes and vLLM (Oct 2026)

+

Mistral Large 4 weights are out. Which file fits your memory, the llama.cpp and vLLM commands, the GPUs Mistral validated and the licence, checked 29 Oct 2026.

Guides - Read → + Read →
- +
4 min
-

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

-

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

+

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

+

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

Guides - Read → + Read →
- +
- + - 5 min + 4 min
-

Claude Duet App: iPhone, Android and Web, and How to Get It

-

Is there a Claude Duet app? Yes, on iPhone and Android, and on a computer it runs at claude.ai. Who can get it, how the download works, and the cost.

+

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

+

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

Guides - Read → + Read →
diff --git a/docs/blog/cursor-vs-cline/index.html b/docs/blog/cursor-vs-cline/index.html index d85e9cdd03..088808fcf4 100644 --- a/docs/blog/cursor-vs-cline/index.html +++ b/docs/blog/cursor-vs-cline/index.html @@ -327,6 +327,22 @@

FAQ

Related in Comparisons

+ -
diff --git a/docs/blog/debugging-multi-agent-systems/index.html b/docs/blog/debugging-multi-agent-systems/index.html index 3b538582d3..1f4e9bf647 100644 --- a/docs/blog/debugging-multi-agent-systems/index.html +++ b/docs/blog/debugging-multi-agent-systems/index.html @@ -326,50 +326,50 @@

FAQ

Related in Guides

- +
- + 4 min
-

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

-

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

+

How to Run Mistral Large 4 Locally: Hardware, GGUF Sizes and vLLM (Oct 2026)

+

Mistral Large 4 weights are out. Which file fits your memory, the llama.cpp and vLLM commands, the GPUs Mistral validated and the licence, checked 29 Oct 2026.

Guides - Read → + Read →
- +
4 min
-

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

-

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

+

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

+

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

Guides - Read → + Read →
- +
- 5 min + 4 min
-

Cursor Pricing (Oct 2026): Every Plan After the 12 Oct Change

-

Cursor pricing as of 26 Oct 2026: Free, Plus $8, Premium $30, Super $100, Ultra $200, Teams seats, what changed on 12 Oct and what old plans keep.

+

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

+

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

Guides - Read → + Read →
diff --git a/docs/blog/deepseek-v4-1-flash-1017/index.html b/docs/blog/deepseek-v4-1-flash-1017/index.html index 03030402e6..0dd7bac172 100644 --- a/docs/blog/deepseek-v4-1-flash-1017/index.html +++ b/docs/blog/deepseek-v4-1-flash-1017/index.html @@ -390,6 +390,22 @@

FAQ

Related in Concepts

+ -
diff --git a/docs/blog/do-more-with-less-model-routing/index.html b/docs/blog/do-more-with-less-model-routing/index.html index fa83dc506e..ea1a4c97e2 100644 --- a/docs/blog/do-more-with-less-model-routing/index.html +++ b/docs/blog/do-more-with-less-model-routing/index.html @@ -330,6 +330,22 @@

FAQ

Related in Concepts

+ -
diff --git a/docs/blog/does-the-june-2026-agent-sdk-change-affect-munder-difflin/index.html b/docs/blog/does-the-june-2026-agent-sdk-change-affect-munder-difflin/index.html index 64502a6d0d..4e4ca883ee 100644 --- a/docs/blog/does-the-june-2026-agent-sdk-change-affect-munder-difflin/index.html +++ b/docs/blog/does-the-june-2026-agent-sdk-change-affect-munder-difflin/index.html @@ -322,50 +322,50 @@

FAQ

Related in Guides

- +
- + 4 min
-

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

-

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

+

How to Run Mistral Large 4 Locally: Hardware, GGUF Sizes and vLLM (Oct 2026)

+

Mistral Large 4 weights are out. Which file fits your memory, the llama.cpp and vLLM commands, the GPUs Mistral validated and the licence, checked 29 Oct 2026.

Guides - Read → + Read →
- +
4 min
-

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

-

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

+

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

+

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

Guides - Read → + Read →
- +
- 5 min + 4 min
-

Cursor Pricing (Oct 2026): Every Plan After the 12 Oct Change

-

Cursor pricing as of 26 Oct 2026: Free, Plus $8, Premium $30, Super $100, Ultra $200, Teams seats, what changed on 12 Oct and what old plans keep.

+

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

+

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

Guides - Read → + Read →
diff --git a/docs/blog/evaluating-ai-agent-reliability/index.html b/docs/blog/evaluating-ai-agent-reliability/index.html index 1d1314ece6..19862cab2c 100644 --- a/docs/blog/evaluating-ai-agent-reliability/index.html +++ b/docs/blog/evaluating-ai-agent-reliability/index.html @@ -329,50 +329,50 @@

FAQ

Related in Guides

- +
- + 4 min
-

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

-

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

+

How to Run Mistral Large 4 Locally: Hardware, GGUF Sizes and vLLM (Oct 2026)

+

Mistral Large 4 weights are out. Which file fits your memory, the llama.cpp and vLLM commands, the GPUs Mistral validated and the licence, checked 29 Oct 2026.

Guides - Read → + Read →
- +
4 min
-

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

-

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

+

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

+

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

Guides - Read → + Read →
- +
- 5 min + 4 min
-

Cursor Pricing (Oct 2026): Every Plan After the 12 Oct Change

-

Cursor pricing as of 26 Oct 2026: Free, Plus $8, Premium $30, Super $100, Ultra $200, Teams seats, what changed on 12 Oct and what old plans keep.

+

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

+

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

Guides - Read → + Read →
diff --git a/docs/blog/feed.xml b/docs/blog/feed.xml index 2d4e0d4bc3..70638e1df2 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-29T00:00:00.000Z https://munderdiffl.in/blog/ Chaitanya Girihttps://munderdiffl.in + + How to Run Mistral Large 4 Locally: Hardware, GGUF Sizes and vLLM (Oct 2026) + + https://munderdiffl.in/blog/how-to-run-mistral-large-4/ + 2026-10-29T00:00:00.000Z + 2026-10-29T00:00:00.000Z + Mistral Large 4 weights are out. Which file fits your memory, the llama.cpp and vLLM commands, the GPUs Mistral validated and the licence, checked 29 Oct 2026. + + + Mistral Large 4 vs Claude Opus 5.5: Price, Coding Scores and Open Weights (Oct 2026) + + https://munderdiffl.in/blog/mistral-large-4-vs-claude-opus-5-5/ + 2026-10-29T00:00:00.000Z + 2026-10-29T00:00:00.000Z + Claude Opus 5.5 leads on coding scores; Mistral Large 4 costs about a tenth per output token and you can download it. Prices and scores, checked 29 Oct 2026. + + + What Is Kimi K3.1 Pro? Price, Weights and How to Use It for Coding (Oct 2026) + + https://munderdiffl.in/blog/what-is-kimi-k3-1-pro/ + 2026-10-29T00:00:00.000Z + 2026-10-29T00:00:00.000Z + Kimi K3.1 Pro is Moonshot's 1M context coding model, weights due by 4 Nov. Price, Terminal-Bench score and setup in Kimi Code, Codex and Claude Code. + 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-inside-google/index.html b/docs/blog/gemini-4-argon-inside-google/index.html index 660bbc903f..a151dda474 100644 --- a/docs/blog/gemini-4-argon-inside-google/index.html +++ b/docs/blog/gemini-4-argon-inside-google/index.html @@ -266,6 +266,22 @@

FAQ

Related in Concepts

+ -
diff --git a/docs/blog/gemini-4-argon-pricing/index.html b/docs/blog/gemini-4-argon-pricing/index.html index 3b72bce45d..169fe7592f 100644 --- a/docs/blog/gemini-4-argon-pricing/index.html +++ b/docs/blog/gemini-4-argon-pricing/index.html @@ -378,50 +378,50 @@

FAQ

Related in Guides

- +
- + 4 min
-

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

-

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

+

How to Run Mistral Large 4 Locally: Hardware, GGUF Sizes and vLLM (Oct 2026)

+

Mistral Large 4 weights are out. Which file fits your memory, the llama.cpp and vLLM commands, the GPUs Mistral validated and the licence, checked 29 Oct 2026.

Guides - Read → + Read →
- +
4 min
-

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

-

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

+

CLAUDE.md Best Practices: What to Write, Where It Lives, How Long (Oct 2026)

+

CLAUDE.md best practices from Anthropic's docs, checked 26 Oct 2026: what to put in it, where each file lives, the 200 line target and how AGENTS.md loads.

Guides - Read → + Read →
- +
- 5 min + 4 min
-

Cursor Pricing (Oct 2026): Every Plan After the 12 Oct Change

-

Cursor pricing as of 26 Oct 2026: Free, Plus $8, Premium $30, Super $100, Ultra $200, Teams seats, what changed on 12 Oct and what old plans keep.

+

Codex Computer Use: How to Turn It On, Plans and Limits (Oct 2026)

+

Codex computer use lets the ChatGPT desktop app see and click apps on macOS and Windows. Setup, which plans get it, locked use and how Claude's compares.

Guides - Read → + Read →
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..a7fe93accb 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 @@ -394,7 +394,7 @@

Can you trust a vendor

Names matter too. Meta’s table this week listed Claude Opus 5.5 at 59.6 on Terminal-Bench 4.0-AA, as our Muse Wonder page records, while Google lists 66.4% on Terminal-bench 4.0. Read those as two different tests.

Which one should you run?

Our view: pick by job, not by logo. On Google’s figures, Gemini 4 Argon suits long documents and, until December, tight budgets. Claude Opus 5.5 suits terminal work, and GPT-6 Astra leads the OSWorld-2.0 offline subset, one of the two computer use rows.

-

Mixing models by task is covered in model routing, and Google’s own coding tool in Gemini CLI vs Claude Code.

+

Mixing models by task is covered in model routing, and Google’s own coding tool in Gemini CLI vs Claude Code. For an open weight model against Opus, see Mistral Large 4 vs Claude Opus 5.5.

@@ -452,6 +452,22 @@

FAQ

Related in Comparisons

+ -
diff --git a/docs/blog/gemini-4-argon/index.html b/docs/blog/gemini-4-argon/index.html index 7e1431f9f2..af546cd755 100644 --- a/docs/blog/gemini-4-argon/index.html +++ b/docs/blog/gemini-4-argon/index.html @@ -407,6 +407,22 @@

FAQ

Related in Concepts

+ -
diff --git a/docs/blog/gemini-cli-vs-claude-code/index.html b/docs/blog/gemini-cli-vs-claude-code/index.html index 4676efa429..2b191f99ae 100644 --- a/docs/blog/gemini-cli-vs-claude-code/index.html +++ b/docs/blog/gemini-cli-vs-claude-code/index.html @@ -335,6 +335,22 @@

FAQ

Related in Comparisons

+ -
diff --git a/docs/blog/generative-engine-optimization-techniques/index.html b/docs/blog/generative-engine-optimization-techniques/index.html index 31959b04f5..521324b78c 100644 --- a/docs/blog/generative-engine-optimization-techniques/index.html +++ b/docs/blog/generative-engine-optimization-techniques/index.html @@ -335,6 +335,22 @@

FAQ

Related in Concepts

+ -
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..285829eb84 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,6 +397,22 @@

FAQ

Related in Comparisons

+ -
diff --git a/docs/blog/gpt-6-1-terra/index.html b/docs/blog/gpt-6-1-terra/index.html index 8417454557..652636b0aa 100644 --- a/docs/blog/gpt-6-1-terra/index.html +++ b/docs/blog/gpt-6-1-terra/index.html @@ -378,56 +378,56 @@

FAQ