diff --git a/blog/src/_data/media.json b/blog/src/_data/media.json index e4489ddb5..c443a2a09 100644 --- a/blog/src/_data/media.json +++ b/blog/src/_data/media.json @@ -4990,6 +4990,18 @@ "inline": {}, "youtube": [] }, + "agent-tools-today-2026-10-18": { + "title": "Agent Tools Today, 18 Oct 2026: LeanREA Takes On REA, FLUX 3 Image Klein, Hy Memory", + "category": "news", + "hero": { + "file": "assets/media/agent-tools-today/hero.png", + "alt": "Hand drawn sketch: a front page with five numbered lines, a clock, and a yellow character reading it out", + "prompt": "Series hero for the Agent Tools Today daily brief, drawn in code (media-src/topic-tiles.html?t=news). Reused by every brief.", + "status": "ready" + }, + "inline": {}, + "youtube": [] + }, "what-is-roo-code": { "title": "What Is Roo Code? The Archived VS Code Agent, Explained", "category": "concepts", diff --git a/blog/src/assets/media/agent-tools-today-2026-10-18/motion.css b/blog/src/assets/media/agent-tools-today-2026-10-18/motion.css new file mode 100644 index 000000000..c6bc68a50 --- /dev/null +++ b/blog/src/assets/media/agent-tools-today-2026-10-18/motion.css @@ -0,0 +1,13 @@ +/* Bright coded scenes for "Agent tools today, 18 Oct 2026". Pairs with motion.js. */ +.prose figure.mg { margin: 42px 0; } +.prose figure.mg img, .mg .mg-svg { display: block; width: 100%; height: auto; border: 1px solid #1A1320; border-radius: 18px; background: #fff; } +.mg figcaption { font: 500 13px/1.5 "Space Grotesk", system-ui, sans-serif; color: #6B5878; padding-top: 10px; text-align: center; } +.mg .mg-svg { touch-action: manipulation; -webkit-tap-highlight-color: transparent; } +.mg .mg-svg text { -webkit-user-select: none; user-select: none; pointer-events: none; } +.mg .mg-hit { cursor: pointer; outline: none; } +.mg [role="slider"] { cursor: grab; touch-action: none; } +.mg .mg-ring { stroke-opacity: 0; transition: stroke-opacity 0.15s; } +.mg .mg-hit:focus-visible .mg-ring { stroke-opacity: 1; } +.mg [role="slider"]:focus-visible circle:nth-child(2) { stroke-width: 5; } +@media (hover: hover) { .mg .mg-hit:hover .mg-ring { stroke-opacity: 0.5; } } +@media (prefers-reduced-motion: reduce) { .mg .mg-ring { transition: none; } } diff --git a/blog/src/assets/media/agent-tools-today-2026-10-18/motion.js b/blog/src/assets/media/agent-tools-today-2026-10-18/motion.js new file mode 100644 index 000000000..65078c9b6 --- /dev/null +++ b/blog/src/assets/media/agent-tools-today-2026-10-18/motion.js @@ -0,0 +1,156 @@ +/* Bright coded scenes for "Agent tools today, 18 Oct 2026". Vanilla JS, no library. +
holds a still image; this script swaps in a live SVG. + Plays only in view, honours reduced motion, "?mgstill" freezes each scene on its still frame. */ +(() => { + const NS = "http://www.w3.org/2000/svg"; + const INK = "#1A1320", YEL = "#FFCA54", BLUE = "#6C8EF5", LIL = "#B69CFF", MINT = "#7FD8AE", SKY = "#9AD8FF", SOFT = "#F1ECF9", MUTE = "#7A6A88"; + const SANS = '"Space Grotesk", system-ui, sans-serif', MONO = '"JetBrains Mono", ui-monospace, monospace'; + const el = (t, a = {}, p) => { const n = document.createElementNS(NS, t); for (const k in a) n.setAttribute(k, a[k]); if (p) p.appendChild(n); return n; }; + const txt = (p, x, y, s, a = {}) => { const n = el("text", Object.assign({ x, y, "font-family": SANS, "font-size": 24, "font-weight": 600, fill: INK }, a), p); n.textContent = s; return n; }; + const cl = (v, a = 0, b = 1) => Math.max(a, Math.min(b, v)); + const seg = (t, a, b) => cl((t - a) / (b - a)); + const oc = (x) => 1 - Math.pow(1 - x, 3); + const ob = (x) => { const c = 1.70158; return 1 + (c + 1) * Math.pow(x - 1, 3) + c * Math.pow(x - 1, 2); }; + const io = (x) => (x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2); + const tf = (n, x, y, s = 1, r = 0) => n.setAttribute("transform", `translate(${x} ${y}) rotate(${r}) scale(${s})`); + const button = (g, label, fn) => { + g.setAttribute("role", "button"); g.setAttribute("tabindex", "0"); g.setAttribute("aria-label", label); g.classList.add("mg-hit"); + g.addEventListener("click", fn); + g.addEventListener("keydown", (e) => { if (e.key === "Enter" || e.key === " ") { e.preventDefault(); fn(); } }); + }; + + const SC = {}; + + /* ---- a backpack stuffed with tool cards beside one small index card, each with a counter that rolls up ---- */ + SC.today = { + dur: 11, still: 8, + build(svg, api) { + el("path", { d: "M60 414 H740", stroke: INK, "stroke-width": 3, "stroke-linecap": "round" }, svg); + + /* the backpack: back panel, dark opening, tool cards, then the front body that hides their lower half */ + const PX = 230, PB = 412; + const pack = el("g", {}, svg); + el("rect", { x: 100, y: 98, width: 260, height: 324, rx: 28, fill: "#fff", "fill-opacity": 0, stroke: BLUE, "stroke-width": 3, class: "mg-ring" }, pack); + [112, 326].forEach((x) => el("rect", { x, y: 300, width: 22, height: 82, rx: 10, fill: LIL, stroke: INK, "stroke-width": 3 }, pack)); + el("rect", { x: 138, y: 180, width: 184, height: 150, rx: 42, fill: BLUE, stroke: INK, "stroke-width": 3 }, pack); + el("ellipse", { cx: PX, cy: 216, rx: 88, ry: 14, fill: INK }, pack); + const layer = el("g", {}, pack); + const POS = [ + [150, 150, -18], [173, 132, -11], [197, 120, -5], [220, 112, 0], [243, 116, 4], [266, 124, 9], [289, 136, 14], [311, 154, 20], + [162, 172, -14], [186, 160, -7], [208, 152, -2], [232, 150, 3], [255, 156, 7], [279, 166, 12], [300, 180, 17], [196, 190, -3], + ]; + const ORDER = [3, 10, 0, 13, 6, 9, 1, 14, 4, 11, 7, 8, 2, 12, 5, 15]; + const CC = [YEL, MINT, LIL, SKY, "#fff", SOFT]; + const cards = POS.map(([x, y, r], i) => { + const g = el("g", { opacity: 0 }, layer); + el("rect", { x: -20, y: 0, width: 40, height: 124, rx: 7, fill: CC[i % CC.length], stroke: INK, "stroke-width": 2.5 }, g); + el("rect", { x: -12, y: 12, width: 24, height: 4, rx: 2, fill: INK, opacity: 0.6 }, g); + el("rect", { x: -12, y: 22, width: 14, height: 4, rx: 2, fill: INK, opacity: 0.3 }, g); + return { g, x, y, r, i, s: 0.2 + ORDER.indexOf(i) * 0.15 }; + }); + el("path", { d: "M128 222 Q230 240 332 222 L334 374 Q334 412 296 412 L164 412 Q126 412 126 374 Z", fill: BLUE, stroke: INK, "stroke-width": 3, "stroke-linejoin": "round" }, pack); + el("path", { d: "M140 248 Q230 264 320 248", fill: "none", stroke: INK, "stroke-width": 2, opacity: 0.35, "stroke-dasharray": "7 7", "stroke-linecap": "round" }, pack); + el("rect", { x: 162, y: 298, width: 136, height: 86, rx: 22, fill: SKY, stroke: INK, "stroke-width": 3 }, pack); + el("path", { d: "M180 322 H280", stroke: INK, "stroke-width": 2.5, "stroke-linecap": "round" }, pack); + el("rect", { x: 262, y: 322, width: 10, height: 18, rx: 4, fill: YEL, stroke: INK, "stroke-width": 2 }, pack); + + /* one small index card with a few ruled lines */ + const IX = 570; + const card = el("g", { opacity: 0 }, svg); + el("rect", { x: -80, y: -104, width: 160, height: 104, rx: 8, fill: SOFT, stroke: INK, "stroke-width": 3 }, card); + el("rect", { x: -64, y: -86, width: 128, height: 4, rx: 2, fill: BLUE }, card); + [[-70, 92, 0.75], [-54, 120, 0.4], [-38, 108, 0.4], [-22, 72, 0.4]].forEach(([y, w, o]) => el("rect", { x: -64, y, width: w, height: 5, rx: 2.5, fill: INK, opacity: o }, card)); + + /* names under each, then a counter that rolls up the context it costs */ + [[PX, "REA", "207 tools"], [IX, "LeanREA", "one SKILL.md"]].forEach(([x, a, b]) => { + txt(svg, x, 458, a, { "text-anchor": "middle", "font-size": 34, "font-weight": 700 }); + txt(svg, x, 488, b, { "text-anchor": "middle", "font-size": 20, "font-weight": 600, fill: MUTE }); + }); + const counters = [[PX, YEL, 400.7, 3.2, 6.4], [IX, MINT, 34.5, 3.2, 4.4]].map(([x, c, v, a, b]) => { + const g = el("g", { opacity: 0 }, svg); + el("rect", { x: x - 140, y: 506, width: 280, height: 54, rx: 27, fill: c, stroke: INK, "stroke-width": 3 }, g); + const n = txt(g, x, 543, "0.0k tokens", { "text-anchor": "middle", "font-family": MONO, "font-size": 28, "font-weight": 700 }); + return { g, n, x, v, a, b }; + }); + const sparks = [[478, 262, YEL], [668, 286, MINT], [636, 222, LIL]].map(([x, y, c], i) => { + const g = el("g", { opacity: 0 }, svg); + el("path", { d: "M0 -14 Q0 0 14 0 Q0 0 0 14 Q0 0 -14 0 Q0 0 0 -14 Z", fill: c, stroke: INK, "stroke-width": 2.5, "stroke-linejoin": "round" }, g); + return { g, x, y, i }; + }); + /* the title goes on top so falling cards pass behind it */ + txt(svg, 400, 66, "Context with every tool loaded", { "text-anchor": "middle", "font-size": 32, "font-weight": 700 }); + + let last = 0, kick = -99; + button(pack, "Shake the backpack and drop the tools in again", () => { kick = api.now(); api.seek(cl(last, 3.4, 7)); }); + return (t, now = 0) => { + last = t; + const out = 1 - io(seg(t, 10.2, 10.8)); + /* a tap ejects the cards, then drops them back in, while the pack wobbles */ + const lt = now - kick, re = lt >= 0 && lt < 2.7; + const dt = re ? (lt - 0.3) * 1.35 : t; + const ej = re && lt < 0.3 ? oc(lt / 0.3) : -1; + let sq = 0; + cards.forEach((c) => { + if (ej >= 0) { tf(c.g, c.x, c.y - 120 * ej, 1, c.r); c.g.setAttribute("opacity", 1 - ej); return; } + const p = seg(dt, c.s, c.s + 0.55); + tf(c.g, c.x, c.y + (1 - ob(p)) * -300, 1, c.r + (1 - p) * (c.i % 2 ? 26 : -26)); + c.g.setAttribute("opacity", p > 0 ? out : 0); + const b = seg(dt, c.s + 0.2, c.s + 0.4); + if (b > 0 && b < 1) sq += Math.sin(Math.PI * b); + }); + const w = re ? 8 * Math.sin(lt * 15) * Math.exp(-lt * 2.8) : 0; + const sy = 1 - 0.03 * Math.min(sq, 1.5), sx = 1 + 0.02 * Math.min(sq, 1.5); + pack.setAttribute("transform", `translate(${PX} ${PB}) rotate(${w}) scale(${sx} ${sy}) translate(${-PX} ${-PB})`); + + /* the index card floats down like paper and settles with a small hop */ + const p = seg(t, 0.9, 2.2), hop = seg(t, 2.2, 2.5); + const cy = 410 - 380 * (1 - oc(p)) - 8 * Math.sin(Math.PI * hop); + tf(card, IX + 30 * Math.sin(p * Math.PI * 3) * (1 - p), cy, 1, -3 + 16 * Math.sin(p * Math.PI * 3 + 0.6) * (1 - p)); + card.setAttribute("opacity", p > 0 ? out : 0); + + counters.forEach((k) => { + const s = ob(seg(t, 2.8, 3.2)); + k.g.setAttribute("transform", `translate(${k.x} 533) scale(${cl(s, 0, 1.15)}) translate(${-k.x} -533)`); + k.g.setAttribute("opacity", (s > 0.01 ? 1 : 0) * out); + k.n.textContent = `${(k.v * oc(seg(t, k.a, k.b))).toFixed(1)}k tokens`; + }); + sparks.forEach((w) => { + const s = seg(t, 4.4 + w.i * 0.2, 4.8 + w.i * 0.2) * out; + tf(w.g, w.x, w.y, ob(s) * (0.85 + 0.15 * Math.sin(t * 2.4 + w.i)), 14 * Math.sin(t + w.i)); + w.g.setAttribute("opacity", s <= 0 ? 0 : 1); + }); + }; + }, + }; + + /* ---- player ---- */ + const q = new URLSearchParams(location.search), frozen = q.has("mgstill"), fixed = parseFloat(q.get("mgstill")); + const calm = matchMedia("(prefers-reduced-motion: reduce)").matches; + const mount = (fig) => { + const sc = SC[fig.dataset.scene], img = fig.querySelector("img"); if (!sc || !img) return; + const W = sc.w || 800, H = sc.h || 600; + const svg = el("svg", { viewBox: `0 0 ${W} ${H}`, class: "mg-svg", role: "group", "aria-label": img.alt || "" }); + svg.style.aspectRatio = `${W} / ${H}`; + el("rect", { width: W, height: H, fill: "#fff" }, svg); + img.replaceWith(svg); + let off = 0, raf = 0, seen = false, held = calm; + const base = performance.now(), clock = () => (performance.now() - base) / 1000; + let draw = () => {}; + const frame = () => { const now = clock(); draw(held ? sc.still : (((now + off) % sc.dur) + sc.dur) % sc.dur, now); }; + const tick = () => { cancelAnimationFrame(raf); frame(); if (seen && !held) raf = requestAnimationFrame(tick); }; + const api = { now: clock, seek: (s) => { off = s - clock(); held = false; tick(); }, poke: () => { held = false; tick(); } }; + draw = sc.build(svg, api); + if (frozen) { draw(isNaN(fixed) ? sc.still : fixed, 0); return; } + new IntersectionObserver(([e]) => { + seen = e.isIntersecting; + if (seen) { tick(); if (!fig.dataset.sent && window.posthog) { fig.dataset.sent = 1; window.posthog.capture("blog_scene_view", { slug: location.pathname.split("/").filter(Boolean).pop(), scene: fig.dataset.scene }); } } + else cancelAnimationFrame(raf); + }, { threshold: 0.25 }).observe(fig); + svg.addEventListener("click", () => { if (!fig.dataset.hit && window.posthog) { fig.dataset.hit = 1; window.posthog.capture("blog_scene_interact", { slug: location.pathname.split("/").filter(Boolean).pop(), scene: fig.dataset.scene }); } }); + frame(); + }; + const go = () => document.querySelectorAll("figure.mg[data-scene]").forEach(mount); + const fonts = document.fonts && document.fonts.load ? Promise.all([document.fonts.load('700 32px "Space Grotesk"'), document.fonts.load('500 20px "Space Grotesk"'), document.fonts.load('700 20px "JetBrains Mono"')]).catch(() => {}) : Promise.resolve(); + const start = () => fonts.then(go, go); + if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", start); else start(); +})(); diff --git a/blog/src/assets/media/agent-tools-today-2026-10-18/today.png b/blog/src/assets/media/agent-tools-today-2026-10-18/today.png new file mode 100644 index 000000000..da4b8994b Binary files /dev/null and b/blog/src/assets/media/agent-tools-today-2026-10-18/today.png differ diff --git a/blog/src/posts/agent-tools-today-2026-10-18.md b/blog/src/posts/agent-tools-today-2026-10-18.md new file mode 100644 index 000000000..c3deb3201 --- /dev/null +++ b/blog/src/posts/agent-tools-today-2026-10-18.md @@ -0,0 +1,57 @@ +--- +title: "Agent Tools Today, 18 Oct 2026: LeanREA Takes On REA, FLUX 3 Image Klein, Hy Memory" +seoTitle: "Agent Tools Today (18 Oct 2026): Launches, Skills, MCP Servers" +description: "The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 18 Oct 2026, each with its source." +date: 2026-10-18 +category: news +categoryLabel: News +type: Non-technical +series: agent-tools-today +primaryKeyword: "agent tools today 18 oct 2026" +secondaryKeywords: ["leanrea", "rea reverse engineer anything", "flux 3 image klein", "hy memory", "orca native chat"] +tags: ["Daily Brief", "Claude Code", "MCP", "Open Source"] +--- + +Agent tools today, 18 Oct 2026, in one line: an 8 KB skill file claims to match a 207 tool MCP server, Black Forest Labs shipped a 5.6B image model with a build for 8 GB graphics cards, and Tencent opened a memory engine for agents. Every number was checked on 18 Oct. The last edition is [17 Oct](/blog/agent-tools-today-2026-10-17/). + +[Munder Difflin](https://harnessmd.com/download) is free and open source: a desktop app that runs a team of coding agents such as Claude Code, Codex and Gemini CLI on your own computer. It shipped no release in the last 24 hours, so it is not in the lists below. + +
Animation. On a white background, a big backpack stuffed with small tool cards sits next to a single index card. Under the backpack a counter reads 400.7k tokens; under the card a counter reads 34.5k tokens.
REA 6.5.0 against LeanREA in context tokens with every tool loaded, from the LeanREA README of 17 Oct 2026.
+ +## Top 3 launches + +1. **FLUX 3 Image Klein.** Black Forest Labs wrote on 15 Oct: "Today we are releasing FLUX 3 Image Klein, a 5.6B parameter open weights model" for text to image, editing and up to 10 reference images. The generator weights need "11.2 GB in BF16 and 5.6 GB in FP8", and the INT8 build runs on RTX cards "with as little as 8GB of VRAM". The licence is the FLUX Kommunity License. More than 200 points on Hacker News on 18 Oct. [Source](https://bfl.ai/blog/flux-3-image-klein) +2. **Hy Memory.** Tencent Hunyuan's repo calls it a "dual-system cognitive memory engine and Python SDK" for agents, with separate pipelines for chat, work and coding. Its desktop and CLI product, MemHub, pulls history from apps you authorise, such as Claude Code, Cursor, Codex and OpenCode, into one local data directory. Created 15 Oct. Apache 2.0, more than 590 stars on 18 Oct. [Source](https://github.com/Tencent-Hunyuan/Hy-Memory) +3. **MOSS-Image.** OpenMOSS released a 5B parameter base diffusion transformer with base and SFT checkpoints on Hugging Face and a technical report in the repo. Created 16 Oct. Apache 2.0, more than 460 stars on 18 Oct. For yesterday's open weights model from DeepSeek, see [DeepSeek V4.1 Flash 1017](/blog/deepseek-v4-1-flash-1017/). [Source](https://github.com/OpenMOSS/MOSS-Image) + +## Top 3 skills, MCP servers and plugins + +1. **LeanREA.** "One 8 KB skill file that does what REA does: no MCP server, no 207 tools, no setup." It tells the agent which command line tool to run for each target. In its own test with Claude Code headless and Sonnet 5.5, it reports "38% less wall time, 35% lower cost, 56% fewer turns and 60% fewer tokens, at the same accuracy" against REA, scoring 74 of 75 to REA's 75. Created 17 Oct. MIT, more than 460 stars on 18 Oct. [Source](https://github.com/aicodeking/leanrea) +2. **REA 6.6.0.** The skill and MCP server LeanREA measures itself against shipped a release on 18 Oct. It adds Kuna, which you install yourself, as a static analysis provider and extends Ghidra analysis "to Windows ARM PE targets and explicit raw m68k images". MIT. [Source](https://github.com/morluto/rea/releases/tag/rea-agents-6.6.0) +3. **Co-op Anything.** An "MCP server and playbook" that points a coding agent at a game for one player. The README says the agent reverse engineers the game if it has to, "tests it with bots inside the game", and packages the result so friends can install it in one click and join over Steam. Created 16 Oct. MIT, more than 180 stars on 18 Oct. See [MCP and skills in a hive](/blog/mcp-and-skills-in-a-hive/). [Source](https://github.com/cranebeaker/coop-anything) + +## Top 3 moves from multi agent tools + +1. **Orca v1.4.229.** Published 17 Oct. An experimental native chat shows edits inline, one turn at a time, along with "Claude goals and Codex context usage"; shared skill installation "now supports 20 additional agents". [Source](https://github.com/stablyai/orca/releases/tag/v1.4.229) +2. **Herdr GPUI v20261016.1.** Published 16 Oct. The native desktop client for Herdr shows "network latency and loss after CPU and memory" in the status bar, lets you reorder devices by dragging, and can destroy a Coder workspace from Settings. It "Requires an existing Herdr daemon". See [Herdr alternatives](/blog/herdr-alternatives/). [Source](https://github.com/penso/herdr-gpui/releases/tag/v20261016.1) +3. **Ollama v0.40.6.** Published 16 Oct. Four changes: it prevents orphaned runners on Windows, adds the q2_0 tensor and file types to GGUF, launches clef in Ollama's cloud, and uses identifiers for ask mode question keys. See [how to connect Ollama to Claude Code](/blog/how-to-connect-ollama-to-claude-code/). [Source](https://github.com/ollama/ollama/releases/tag/v0.40.6) + +## Top 3 rising repos + +1. **Handwired.** "Turn your regular JavaScript code into a neural net; no training, exact, yet also fully differentiable!" The README shows if and else, loops and state turned into matrix multiplication over floats. Created 15 Oct. MIT, more than 1,600 stars on 18 Oct. [Source](https://github.com/chenglou/handwired) +2. **web-ocean.** A real time ocean renderer "written from scratch on WebGPU, with no engine or rendering library". The README says it was built with Claude Code (Opus 5.5), which checked its own renders with headless Chrome screenshots reviewed by separate critic subagents. Created 16 Oct. MIT, more than 510 stars on 18 Oct. [Source](https://github.com/Noniv/web-ocean) +3. **PS5LM.** "Your PS5 runs the language model. Every device on your network uses it." It runs llama.cpp on a jailbroken console's GPU "with OpenAI and Anthropic APIs". GPL 3.0, more than 500 stars and more than 360 points on Hacker News on 18 Oct. [Source](https://github.com/cobanov/PS5LM) + +New repos can gain stars quickly for reasons other than use, so treat these as names to watch, not recommendations. + +## Top 3 things people are arguing about + +1. **Postgres 19 and AI code review.** The Register reported on 16 Oct that PostgreSQL 19 is now expected "around November 19" and that developers dropped "between eight and 10 significant features". It quotes a leading PostgreSQL committer who says the reverts could be due at least in part to LLM code reviews. More than 210 points on Hacker News on 18 Oct. [Source](https://www.theregister.com/databases/2026/10/16/postgres-19-delayed-after-ai-reviewers-find-more-bugs-than-humans-can-fix/5303471) +2. **What benchmarks miss.** Mercor's Benchmark Map maps 29 AI benchmarks onto 923 US occupations, and its provisional findings "suggest that 90% of American working hours are spent on tasks with little or no coverage from existing benchmarks". More than 590 points on Hacker News on 18 Oct. [Source](https://www.mercor.com/research/labor-index/benchmark-map/) +3. **How fast a local model feels.** Llmspeed lets you pick a graphics card or Mac and a model, such as DeepSeek V4.1 Flash or Gemma 4 31B, and see the speed. The site says its numbers are "Estimates for a short prompt on a single device", some measured by the community and the rest derived from similar setups or projected from specs. More than 260 points on Hacker News on 18 Oct. [Source](https://llmspeed.dev/) + +## How this list is built + +Each day our agents read GitHub releases and new repos, vendor posts and the Hacker News front page about coding agents. A name only makes a list with a link that was opened and a signal that can be shown: points, stars or a dated release. Repos are checked against the GitHub API before they appear, and a claim that exists only as a social post is left out. New here? Start with the [install guide](/blog/how-to-install-and-use-munder-difflin/). + + diff --git a/docs/blog/agent-tools-today-2026-10-03/index.html b/docs/blog/agent-tools-today-2026-10-03/index.html index 3da16694b..a1a2724fd 100644 --- a/docs/blog/agent-tools-today-2026-10-03/index.html +++ b/docs/blog/agent-tools-today-2026-10-03/index.html @@ -249,6 +249,22 @@

How this list is built + - diff --git a/docs/blog/agent-tools-today-2026-10-04/index.html b/docs/blog/agent-tools-today-2026-10-04/index.html index 2727f526e..fd1ea4b49 100644 --- a/docs/blog/agent-tools-today-2026-10-04/index.html +++ b/docs/blog/agent-tools-today-2026-10-04/index.html @@ -248,6 +248,22 @@

How this list is built + - diff --git a/docs/blog/agent-tools-today-2026-10-05/index.html b/docs/blog/agent-tools-today-2026-10-05/index.html index af0acef3a..8a4cd89b4 100644 --- a/docs/blog/agent-tools-today-2026-10-05/index.html +++ b/docs/blog/agent-tools-today-2026-10-05/index.html @@ -246,6 +246,22 @@

How this list is built + - diff --git a/docs/blog/agent-tools-today-2026-10-06/index.html b/docs/blog/agent-tools-today-2026-10-06/index.html index 0c995df94..cdcf54ab2 100644 --- a/docs/blog/agent-tools-today-2026-10-06/index.html +++ b/docs/blog/agent-tools-today-2026-10-06/index.html @@ -247,6 +247,22 @@

How this list is built + - diff --git a/docs/blog/agent-tools-today-2026-10-07/index.html b/docs/blog/agent-tools-today-2026-10-07/index.html index 79be03b5a..468c2bb75 100644 --- a/docs/blog/agent-tools-today-2026-10-07/index.html +++ b/docs/blog/agent-tools-today-2026-10-07/index.html @@ -247,6 +247,22 @@

How this list is built + - diff --git a/docs/blog/agent-tools-today-2026-10-08/index.html b/docs/blog/agent-tools-today-2026-10-08/index.html index 38f3e9486..5432cecf2 100644 --- a/docs/blog/agent-tools-today-2026-10-08/index.html +++ b/docs/blog/agent-tools-today-2026-10-08/index.html @@ -246,6 +246,22 @@

How this list is built + - diff --git a/docs/blog/agent-tools-today-2026-10-09/index.html b/docs/blog/agent-tools-today-2026-10-09/index.html index abd2bfbbd..8f2e47f1a 100644 --- a/docs/blog/agent-tools-today-2026-10-09/index.html +++ b/docs/blog/agent-tools-today-2026-10-09/index.html @@ -247,6 +247,22 @@

How this list is built + - diff --git a/docs/blog/agent-tools-today-2026-10-10/index.html b/docs/blog/agent-tools-today-2026-10-10/index.html index 517bba34b..da968b9b5 100644 --- a/docs/blog/agent-tools-today-2026-10-10/index.html +++ b/docs/blog/agent-tools-today-2026-10-10/index.html @@ -247,6 +247,22 @@

How this list is built + - diff --git a/docs/blog/agent-tools-today-2026-10-11/index.html b/docs/blog/agent-tools-today-2026-10-11/index.html index f785bb4d9..db016bf4d 100644 --- a/docs/blog/agent-tools-today-2026-10-11/index.html +++ b/docs/blog/agent-tools-today-2026-10-11/index.html @@ -245,6 +245,22 @@

How this list is built + - diff --git a/docs/blog/agent-tools-today-2026-10-12/index.html b/docs/blog/agent-tools-today-2026-10-12/index.html index e1336b526..9e4f57469 100644 --- a/docs/blog/agent-tools-today-2026-10-12/index.html +++ b/docs/blog/agent-tools-today-2026-10-12/index.html @@ -243,6 +243,22 @@

How this list is built + - diff --git a/docs/blog/agent-tools-today-2026-10-13/index.html b/docs/blog/agent-tools-today-2026-10-13/index.html index 775e5deb1..0318e92f0 100644 --- a/docs/blog/agent-tools-today-2026-10-13/index.html +++ b/docs/blog/agent-tools-today-2026-10-13/index.html @@ -243,6 +243,22 @@

How this list is built + - diff --git a/docs/blog/agent-tools-today-2026-10-15/index.html b/docs/blog/agent-tools-today-2026-10-15/index.html index ed080c27b..bf2679882 100644 --- a/docs/blog/agent-tools-today-2026-10-15/index.html +++ b/docs/blog/agent-tools-today-2026-10-15/index.html @@ -242,6 +242,22 @@

How this list is built + - diff --git a/docs/blog/agent-tools-today-2026-10-16/index.html b/docs/blog/agent-tools-today-2026-10-16/index.html index 4fba1a8d7..b784aaf2f 100644 --- a/docs/blog/agent-tools-today-2026-10-16/index.html +++ b/docs/blog/agent-tools-today-2026-10-16/index.html @@ -241,50 +241,50 @@

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

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

-

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

+

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

+

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

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

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

-

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

+

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

+

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

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

Agent Tools Today, 13 Oct 2026: Muse Wonder, GLM-Legal, the Codex Daemon Issue

-

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

+

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

+

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

News - Read → + Read →
diff --git a/docs/blog/agent-tools-today-2026-10-17/index.html b/docs/blog/agent-tools-today-2026-10-17/index.html index b1342d879..35fb33650 100644 --- a/docs/blog/agent-tools-today-2026-10-17/index.html +++ b/docs/blog/agent-tools-today-2026-10-17/index.html @@ -234,12 +234,28 @@

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

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

+

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

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

Agent tools today, 18 Oct 2026, in one line: an 8 KB skill file claims to match a 207 tool MCP server, Black Forest Labs shipped a 5.6B image model with a build for 8 GB graphics cards, and Tencent opened a memory engine for agents. Every number was checked on 18 Oct. The last edition is 17 Oct.

+

Munder Difflin is free and open source: a desktop app that runs a team of coding agents such as Claude Code, Codex and Gemini CLI on your own computer. It shipped no release in the last 24 hours, so it is not in the lists below.

+
Animation. On a white background, a big backpack stuffed with small tool cards sits next to a single index card. Under the backpack a counter reads 400.7k tokens; under the card a counter reads 34.5k tokens.
REA 6.5.0 against LeanREA in context tokens with every tool loaded, from the LeanREA README of 17 Oct 2026.
+

Top 3 launches

+
    +
  1. FLUX 3 Image Klein. Black Forest Labs wrote on 15 Oct: “Today we are releasing FLUX 3 Image Klein, a 5.6B parameter open weights model” for text to image, editing and up to 10 reference images. The generator weights need “11.2 GB in BF16 and 5.6 GB in FP8”, and the INT8 build runs on RTX cards “with as little as 8GB of VRAM”. The licence is the FLUX Kommunity License. More than 200 points on Hacker News on 18 Oct. Source
  2. +
  3. Hy Memory. Tencent Hunyuan’s repo calls it a “dual-system cognitive memory engine and Python SDK” for agents, with separate pipelines for chat, work and coding. Its desktop and CLI product, MemHub, pulls history from apps you authorise, such as Claude Code, Cursor, Codex and OpenCode, into one local data directory. Created 15 Oct. Apache 2.0, more than 590 stars on 18 Oct. Source
  4. +
  5. MOSS-Image. OpenMOSS released a 5B parameter base diffusion transformer with base and SFT checkpoints on Hugging Face and a technical report in the repo. Created 16 Oct. Apache 2.0, more than 460 stars on 18 Oct. For yesterday’s open weights model from DeepSeek, see DeepSeek V4.1 Flash 1017. Source
  6. +
+

Top 3 skills, MCP servers and plugins

+
    +
  1. LeanREA. “One 8 KB skill file that does what REA does: no MCP server, no 207 tools, no setup.” It tells the agent which command line tool to run for each target. In its own test with Claude Code headless and Sonnet 5.5, it reports “38% less wall time, 35% lower cost, 56% fewer turns and 60% fewer tokens, at the same accuracy” against REA, scoring 74 of 75 to REA’s 75. Created 17 Oct. MIT, more than 460 stars on 18 Oct. Source
  2. +
  3. REA 6.6.0. The skill and MCP server LeanREA measures itself against shipped a release on 18 Oct. It adds Kuna, which you install yourself, as a static analysis provider and extends Ghidra analysis “to Windows ARM PE targets and explicit raw m68k images”. MIT. Source
  4. +
  5. Co-op Anything. An “MCP server and playbook” that points a coding agent at a game for one player. The README says the agent reverse engineers the game if it has to, “tests it with bots inside the game”, and packages the result so friends can install it in one click and join over Steam. Created 16 Oct. MIT, more than 180 stars on 18 Oct. See MCP and skills in a hive. Source
  6. +
+

Top 3 moves from multi agent tools

+
    +
  1. Orca v1.4.229. Published 17 Oct. An experimental native chat shows edits inline, one turn at a time, along with “Claude goals and Codex context usage”; shared skill installation “now supports 20 additional agents”. Source
  2. +
  3. Herdr GPUI v20261016.1. Published 16 Oct. The native desktop client for Herdr shows “network latency and loss after CPU and memory” in the status bar, lets you reorder devices by dragging, and can destroy a Coder workspace from Settings. It “Requires an existing Herdr daemon”. See Herdr alternatives. Source
  4. +
  5. Ollama v0.40.6. Published 16 Oct. Four changes: it prevents orphaned runners on Windows, adds the q2_0 tensor and file types to GGUF, launches clef in Ollama’s cloud, and uses identifiers for ask mode question keys. See how to connect Ollama to Claude Code. Source
  6. +
+

Top 3 rising repos

+
    +
  1. Handwired. “Turn your regular JavaScript code into a neural net; no training, exact, yet also fully differentiable!” The README shows if and else, loops and state turned into matrix multiplication over floats. Created 15 Oct. MIT, more than 1,600 stars on 18 Oct. Source
  2. +
  3. web-ocean. A real time ocean renderer “written from scratch on WebGPU, with no engine or rendering library”. The README says it was built with Claude Code (Opus 5.5), which checked its own renders with headless Chrome screenshots reviewed by separate critic subagents. Created 16 Oct. MIT, more than 510 stars on 18 Oct. Source
  4. +
  5. PS5LM. “Your PS5 runs the language model. Every device on your network uses it.” It runs llama.cpp on a jailbroken console’s GPU “with OpenAI and Anthropic APIs”. GPL 3.0, more than 500 stars and more than 360 points on Hacker News on 18 Oct. Source
  6. +
+

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

+

Top 3 things people are arguing about

+
    +
  1. Postgres 19 and AI code review. The Register reported on 16 Oct that PostgreSQL 19 is now expected “around November 19” and that developers dropped “between eight and 10 significant features”. It quotes a leading PostgreSQL committer who says the reverts could be due at least in part to LLM code reviews. More than 210 points on Hacker News on 18 Oct. Source
  2. +
  3. What benchmarks miss. Mercor’s Benchmark Map maps 29 AI benchmarks onto 923 US occupations, and its provisional findings “suggest that 90% of American working hours are spent on tasks with little or no coverage from existing benchmarks”. More than 590 points on Hacker News on 18 Oct. Source
  4. +
  5. How fast a local model feels. Llmspeed lets you pick a graphics card or Mac and a model, such as DeepSeek V4.1 Flash or Gemma 4 31B, and see the speed. The site says its numbers are “Estimates for a short prompt on a single device”, some measured by the community and the rest derived from similar setups or projected from specs. More than 260 points on Hacker News on 18 Oct. Source
  6. +
+

How this list is built

+

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

+ + + + + + +
+ + +
+ + + + +
+ + +
+ +
+ + + + + + diff --git a/docs/blog/assets/media/agent-tools-today-2026-10-18/motion.css b/docs/blog/assets/media/agent-tools-today-2026-10-18/motion.css new file mode 100644 index 000000000..c6bc68a50 --- /dev/null +++ b/docs/blog/assets/media/agent-tools-today-2026-10-18/motion.css @@ -0,0 +1,13 @@ +/* Bright coded scenes for "Agent tools today, 18 Oct 2026". Pairs with motion.js. */ +.prose figure.mg { margin: 42px 0; } +.prose figure.mg img, .mg .mg-svg { display: block; width: 100%; height: auto; border: 1px solid #1A1320; border-radius: 18px; background: #fff; } +.mg figcaption { font: 500 13px/1.5 "Space Grotesk", system-ui, sans-serif; color: #6B5878; padding-top: 10px; text-align: center; } +.mg .mg-svg { touch-action: manipulation; -webkit-tap-highlight-color: transparent; } +.mg .mg-svg text { -webkit-user-select: none; user-select: none; pointer-events: none; } +.mg .mg-hit { cursor: pointer; outline: none; } +.mg [role="slider"] { cursor: grab; touch-action: none; } +.mg .mg-ring { stroke-opacity: 0; transition: stroke-opacity 0.15s; } +.mg .mg-hit:focus-visible .mg-ring { stroke-opacity: 1; } +.mg [role="slider"]:focus-visible circle:nth-child(2) { stroke-width: 5; } +@media (hover: hover) { .mg .mg-hit:hover .mg-ring { stroke-opacity: 0.5; } } +@media (prefers-reduced-motion: reduce) { .mg .mg-ring { transition: none; } } diff --git a/docs/blog/assets/media/agent-tools-today-2026-10-18/motion.js b/docs/blog/assets/media/agent-tools-today-2026-10-18/motion.js new file mode 100644 index 000000000..65078c9b6 --- /dev/null +++ b/docs/blog/assets/media/agent-tools-today-2026-10-18/motion.js @@ -0,0 +1,156 @@ +/* Bright coded scenes for "Agent tools today, 18 Oct 2026". Vanilla JS, no library. +
holds a still image; this script swaps in a live SVG. + Plays only in view, honours reduced motion, "?mgstill" freezes each scene on its still frame. */ +(() => { + const NS = "http://www.w3.org/2000/svg"; + const INK = "#1A1320", YEL = "#FFCA54", BLUE = "#6C8EF5", LIL = "#B69CFF", MINT = "#7FD8AE", SKY = "#9AD8FF", SOFT = "#F1ECF9", MUTE = "#7A6A88"; + const SANS = '"Space Grotesk", system-ui, sans-serif', MONO = '"JetBrains Mono", ui-monospace, monospace'; + const el = (t, a = {}, p) => { const n = document.createElementNS(NS, t); for (const k in a) n.setAttribute(k, a[k]); if (p) p.appendChild(n); return n; }; + const txt = (p, x, y, s, a = {}) => { const n = el("text", Object.assign({ x, y, "font-family": SANS, "font-size": 24, "font-weight": 600, fill: INK }, a), p); n.textContent = s; return n; }; + const cl = (v, a = 0, b = 1) => Math.max(a, Math.min(b, v)); + const seg = (t, a, b) => cl((t - a) / (b - a)); + const oc = (x) => 1 - Math.pow(1 - x, 3); + const ob = (x) => { const c = 1.70158; return 1 + (c + 1) * Math.pow(x - 1, 3) + c * Math.pow(x - 1, 2); }; + const io = (x) => (x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2); + const tf = (n, x, y, s = 1, r = 0) => n.setAttribute("transform", `translate(${x} ${y}) rotate(${r}) scale(${s})`); + const button = (g, label, fn) => { + g.setAttribute("role", "button"); g.setAttribute("tabindex", "0"); g.setAttribute("aria-label", label); g.classList.add("mg-hit"); + g.addEventListener("click", fn); + g.addEventListener("keydown", (e) => { if (e.key === "Enter" || e.key === " ") { e.preventDefault(); fn(); } }); + }; + + const SC = {}; + + /* ---- a backpack stuffed with tool cards beside one small index card, each with a counter that rolls up ---- */ + SC.today = { + dur: 11, still: 8, + build(svg, api) { + el("path", { d: "M60 414 H740", stroke: INK, "stroke-width": 3, "stroke-linecap": "round" }, svg); + + /* the backpack: back panel, dark opening, tool cards, then the front body that hides their lower half */ + const PX = 230, PB = 412; + const pack = el("g", {}, svg); + el("rect", { x: 100, y: 98, width: 260, height: 324, rx: 28, fill: "#fff", "fill-opacity": 0, stroke: BLUE, "stroke-width": 3, class: "mg-ring" }, pack); + [112, 326].forEach((x) => el("rect", { x, y: 300, width: 22, height: 82, rx: 10, fill: LIL, stroke: INK, "stroke-width": 3 }, pack)); + el("rect", { x: 138, y: 180, width: 184, height: 150, rx: 42, fill: BLUE, stroke: INK, "stroke-width": 3 }, pack); + el("ellipse", { cx: PX, cy: 216, rx: 88, ry: 14, fill: INK }, pack); + const layer = el("g", {}, pack); + const POS = [ + [150, 150, -18], [173, 132, -11], [197, 120, -5], [220, 112, 0], [243, 116, 4], [266, 124, 9], [289, 136, 14], [311, 154, 20], + [162, 172, -14], [186, 160, -7], [208, 152, -2], [232, 150, 3], [255, 156, 7], [279, 166, 12], [300, 180, 17], [196, 190, -3], + ]; + const ORDER = [3, 10, 0, 13, 6, 9, 1, 14, 4, 11, 7, 8, 2, 12, 5, 15]; + const CC = [YEL, MINT, LIL, SKY, "#fff", SOFT]; + const cards = POS.map(([x, y, r], i) => { + const g = el("g", { opacity: 0 }, layer); + el("rect", { x: -20, y: 0, width: 40, height: 124, rx: 7, fill: CC[i % CC.length], stroke: INK, "stroke-width": 2.5 }, g); + el("rect", { x: -12, y: 12, width: 24, height: 4, rx: 2, fill: INK, opacity: 0.6 }, g); + el("rect", { x: -12, y: 22, width: 14, height: 4, rx: 2, fill: INK, opacity: 0.3 }, g); + return { g, x, y, r, i, s: 0.2 + ORDER.indexOf(i) * 0.15 }; + }); + el("path", { d: "M128 222 Q230 240 332 222 L334 374 Q334 412 296 412 L164 412 Q126 412 126 374 Z", fill: BLUE, stroke: INK, "stroke-width": 3, "stroke-linejoin": "round" }, pack); + el("path", { d: "M140 248 Q230 264 320 248", fill: "none", stroke: INK, "stroke-width": 2, opacity: 0.35, "stroke-dasharray": "7 7", "stroke-linecap": "round" }, pack); + el("rect", { x: 162, y: 298, width: 136, height: 86, rx: 22, fill: SKY, stroke: INK, "stroke-width": 3 }, pack); + el("path", { d: "M180 322 H280", stroke: INK, "stroke-width": 2.5, "stroke-linecap": "round" }, pack); + el("rect", { x: 262, y: 322, width: 10, height: 18, rx: 4, fill: YEL, stroke: INK, "stroke-width": 2 }, pack); + + /* one small index card with a few ruled lines */ + const IX = 570; + const card = el("g", { opacity: 0 }, svg); + el("rect", { x: -80, y: -104, width: 160, height: 104, rx: 8, fill: SOFT, stroke: INK, "stroke-width": 3 }, card); + el("rect", { x: -64, y: -86, width: 128, height: 4, rx: 2, fill: BLUE }, card); + [[-70, 92, 0.75], [-54, 120, 0.4], [-38, 108, 0.4], [-22, 72, 0.4]].forEach(([y, w, o]) => el("rect", { x: -64, y, width: w, height: 5, rx: 2.5, fill: INK, opacity: o }, card)); + + /* names under each, then a counter that rolls up the context it costs */ + [[PX, "REA", "207 tools"], [IX, "LeanREA", "one SKILL.md"]].forEach(([x, a, b]) => { + txt(svg, x, 458, a, { "text-anchor": "middle", "font-size": 34, "font-weight": 700 }); + txt(svg, x, 488, b, { "text-anchor": "middle", "font-size": 20, "font-weight": 600, fill: MUTE }); + }); + const counters = [[PX, YEL, 400.7, 3.2, 6.4], [IX, MINT, 34.5, 3.2, 4.4]].map(([x, c, v, a, b]) => { + const g = el("g", { opacity: 0 }, svg); + el("rect", { x: x - 140, y: 506, width: 280, height: 54, rx: 27, fill: c, stroke: INK, "stroke-width": 3 }, g); + const n = txt(g, x, 543, "0.0k tokens", { "text-anchor": "middle", "font-family": MONO, "font-size": 28, "font-weight": 700 }); + return { g, n, x, v, a, b }; + }); + const sparks = [[478, 262, YEL], [668, 286, MINT], [636, 222, LIL]].map(([x, y, c], i) => { + const g = el("g", { opacity: 0 }, svg); + el("path", { d: "M0 -14 Q0 0 14 0 Q0 0 0 14 Q0 0 -14 0 Q0 0 0 -14 Z", fill: c, stroke: INK, "stroke-width": 2.5, "stroke-linejoin": "round" }, g); + return { g, x, y, i }; + }); + /* the title goes on top so falling cards pass behind it */ + txt(svg, 400, 66, "Context with every tool loaded", { "text-anchor": "middle", "font-size": 32, "font-weight": 700 }); + + let last = 0, kick = -99; + button(pack, "Shake the backpack and drop the tools in again", () => { kick = api.now(); api.seek(cl(last, 3.4, 7)); }); + return (t, now = 0) => { + last = t; + const out = 1 - io(seg(t, 10.2, 10.8)); + /* a tap ejects the cards, then drops them back in, while the pack wobbles */ + const lt = now - kick, re = lt >= 0 && lt < 2.7; + const dt = re ? (lt - 0.3) * 1.35 : t; + const ej = re && lt < 0.3 ? oc(lt / 0.3) : -1; + let sq = 0; + cards.forEach((c) => { + if (ej >= 0) { tf(c.g, c.x, c.y - 120 * ej, 1, c.r); c.g.setAttribute("opacity", 1 - ej); return; } + const p = seg(dt, c.s, c.s + 0.55); + tf(c.g, c.x, c.y + (1 - ob(p)) * -300, 1, c.r + (1 - p) * (c.i % 2 ? 26 : -26)); + c.g.setAttribute("opacity", p > 0 ? out : 0); + const b = seg(dt, c.s + 0.2, c.s + 0.4); + if (b > 0 && b < 1) sq += Math.sin(Math.PI * b); + }); + const w = re ? 8 * Math.sin(lt * 15) * Math.exp(-lt * 2.8) : 0; + const sy = 1 - 0.03 * Math.min(sq, 1.5), sx = 1 + 0.02 * Math.min(sq, 1.5); + pack.setAttribute("transform", `translate(${PX} ${PB}) rotate(${w}) scale(${sx} ${sy}) translate(${-PX} ${-PB})`); + + /* the index card floats down like paper and settles with a small hop */ + const p = seg(t, 0.9, 2.2), hop = seg(t, 2.2, 2.5); + const cy = 410 - 380 * (1 - oc(p)) - 8 * Math.sin(Math.PI * hop); + tf(card, IX + 30 * Math.sin(p * Math.PI * 3) * (1 - p), cy, 1, -3 + 16 * Math.sin(p * Math.PI * 3 + 0.6) * (1 - p)); + card.setAttribute("opacity", p > 0 ? out : 0); + + counters.forEach((k) => { + const s = ob(seg(t, 2.8, 3.2)); + k.g.setAttribute("transform", `translate(${k.x} 533) scale(${cl(s, 0, 1.15)}) translate(${-k.x} -533)`); + k.g.setAttribute("opacity", (s > 0.01 ? 1 : 0) * out); + k.n.textContent = `${(k.v * oc(seg(t, k.a, k.b))).toFixed(1)}k tokens`; + }); + sparks.forEach((w) => { + const s = seg(t, 4.4 + w.i * 0.2, 4.8 + w.i * 0.2) * out; + tf(w.g, w.x, w.y, ob(s) * (0.85 + 0.15 * Math.sin(t * 2.4 + w.i)), 14 * Math.sin(t + w.i)); + w.g.setAttribute("opacity", s <= 0 ? 0 : 1); + }); + }; + }, + }; + + /* ---- player ---- */ + const q = new URLSearchParams(location.search), frozen = q.has("mgstill"), fixed = parseFloat(q.get("mgstill")); + const calm = matchMedia("(prefers-reduced-motion: reduce)").matches; + const mount = (fig) => { + const sc = SC[fig.dataset.scene], img = fig.querySelector("img"); if (!sc || !img) return; + const W = sc.w || 800, H = sc.h || 600; + const svg = el("svg", { viewBox: `0 0 ${W} ${H}`, class: "mg-svg", role: "group", "aria-label": img.alt || "" }); + svg.style.aspectRatio = `${W} / ${H}`; + el("rect", { width: W, height: H, fill: "#fff" }, svg); + img.replaceWith(svg); + let off = 0, raf = 0, seen = false, held = calm; + const base = performance.now(), clock = () => (performance.now() - base) / 1000; + let draw = () => {}; + const frame = () => { const now = clock(); draw(held ? sc.still : (((now + off) % sc.dur) + sc.dur) % sc.dur, now); }; + const tick = () => { cancelAnimationFrame(raf); frame(); if (seen && !held) raf = requestAnimationFrame(tick); }; + const api = { now: clock, seek: (s) => { off = s - clock(); held = false; tick(); }, poke: () => { held = false; tick(); } }; + draw = sc.build(svg, api); + if (frozen) { draw(isNaN(fixed) ? sc.still : fixed, 0); return; } + new IntersectionObserver(([e]) => { + seen = e.isIntersecting; + if (seen) { tick(); if (!fig.dataset.sent && window.posthog) { fig.dataset.sent = 1; window.posthog.capture("blog_scene_view", { slug: location.pathname.split("/").filter(Boolean).pop(), scene: fig.dataset.scene }); } } + else cancelAnimationFrame(raf); + }, { threshold: 0.25 }).observe(fig); + svg.addEventListener("click", () => { if (!fig.dataset.hit && window.posthog) { fig.dataset.hit = 1; window.posthog.capture("blog_scene_interact", { slug: location.pathname.split("/").filter(Boolean).pop(), scene: fig.dataset.scene }); } }); + frame(); + }; + const go = () => document.querySelectorAll("figure.mg[data-scene]").forEach(mount); + const fonts = document.fonts && document.fonts.load ? Promise.all([document.fonts.load('700 32px "Space Grotesk"'), document.fonts.load('500 20px "Space Grotesk"'), document.fonts.load('700 20px "JetBrains Mono"')]).catch(() => {}) : Promise.resolve(); + const start = () => fonts.then(go, go); + if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", start); else start(); +})(); diff --git a/docs/blog/assets/media/agent-tools-today-2026-10-18/today.png b/docs/blog/assets/media/agent-tools-today-2026-10-18/today.png new file mode 100644 index 000000000..da4b8994b Binary files /dev/null and b/docs/blog/assets/media/agent-tools-today-2026-10-18/today.png differ diff --git a/docs/blog/feed.xml b/docs/blog/feed.xml index 0b642a1f2..ef17acffd 100644 --- a/docs/blog/feed.xml +++ b/docs/blog/feed.xml @@ -4,9 +4,17 @@ Guides, deep dives, and comparisons on running multi-agent Claude Code: orchestration, agent memory, automation, and the tooling landscape. - 2026-10-17T00:00:00.000Z + 2026-10-18T00:00:00.000Z https://munderdiffl.in/blog/ Chaitanya Girihttps://munderdiffl.in + + Agent Tools Today, 18 Oct 2026: LeanREA Takes On REA, FLUX 3 Image Klein, Hy Memory + + https://munderdiffl.in/blog/agent-tools-today-2026-10-18/ + 2026-10-18T00:00:00.000Z + 2026-10-18T00:00:00.000Z + The top launches, skills and MCP servers, multi agent moves, rising repos and arguments in coding agents on 18 Oct 2026, each with its source. + Agent Tools Today, 17 Oct 2026: Muse Spark Open on Mac Studio, StarSkirmish, Claude Design Closes @@ -479,12 +487,4 @@ 2026-10-15T00:00:00.000Z Codex is OpenAI's coding agent for your terminal, editor, desktop app and cloud. ChatGPT Free, Go, Plus and Pro include it. Plans and models, 15 Oct 2026. - - What is Pi agent? The open source coding agent harness, explained - - https://munderdiffl.in/blog/what-is-pi-agent/ - 2026-10-02T00:00:00.000Z - 2026-10-02T00:00:00.000Z - Pi agent is Earendil's MIT licensed coding agent harness. What it is, how to install it, what Pi 1.0 and Pi Durable add, and how it compares. - diff --git a/docs/blog/index.html b/docs/blog/index.html index 24462cb3b..96c2dff1e 100644 --- a/docs/blog/index.html +++ b/docs/blog/index.html @@ -135,7 +135,7 @@

The Munder Difflin Blog.

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

+ + + + + - + -