pointcast 0.8.0
Extension, CLI and integrations at 0.8.0. The MCP server becomes the main path: /pointcast watch applies each recording as soon as you press Stop.
Code lines on React 19 + Vite (D9 note 2026-09-29)
- Fixed: on React 19 with Vite,
used at:andwithin:named the file with no line (used at: `src/App.tsx` — `<Sidebar>`). They now give the line, like React 18 did:used at: `src/App.tsx:12` — `<Sidebar page={page} onNavigate={setPage} />`, and the element's own component gets its line infind:. - How: right after the gesture, the page reads the modules its own Vite dev server already serves and maps the stack positions through their inline source maps, like the Next.js path does. Local dev hosts only, same origin only, in memory, within the same 3 s budget; no new permission.
- Silent when unsure: a missing map, a module edited since the element was rendered, or a map that names another file leaves the file without a line, as before. Files in the chain never change, only lines are added.
- New e2e test against the real
dev/examples/react-dashboarddev server (dev/e2e/vite-react19.spec.ts). - Fixed: a dev page left open across an extension update or reload kept answering with the older build's code, so its gestures got files without lines (and no component file) until the page was reloaded. The newest build's page script now takes over when the tab is attached again; pages still running a script from 0.7.0 or earlier stop being asked.
Fixes from a first real test (D4, D9 and D14 notes 2026-09-29)
- Fixed: an element whose text is joined from several children (a section header with its title, a help tooltip and filter tabs with counts) got
text at:one of the tabs' labels, a descendant's line. Only its own leading text is looked up now: the header gets itstitle="…"line, or no line when that text is written twice. An element with one piece of text is looked up as before. - Fixed: a gesture made just before speaking, in a long silence, was a "Pointed at without speaking." request of its own, followed by the request it was about. A pointing whose gestures all come at most 1 s before the first word of a request said while pointing now joins it, marked before its first word: "[a] y la tarjeta de pedidos [b] hay que…".
requestsformat only; the classic format is unchanged. - Fixed:
pointcast setuprun at the root of a repository whose app is in a subfolder (web/package.json, nothing at the root) said no project was found. It now looks one folder down when the folder it runs in has nopackage.jsonormanage.py: "Frontend (react, vite) in web/: nothing to add in development." With several such subfolders it picks none and lists them.
One entry for list rows that link to different pages (D5 note 2026-09-29)
- Fixed: 3 or more copies of one component that differ only in their link (
<a href="#/asignatura/algebra">,…/calculo, …) were one entry each, because theirfind:lines differed byhref. They are now one entry like other copies; the links are listed in letter order on their own line (href [a–e]: `#/asignatura/algebra`, …), and a label that differs as the texts do («Ver Álgebra») likewise. Everything else must still be identical, and pairs are never grouped. Specs without such runs are unchanged.
Pointing inside SVG charts and maps (D7 note 2026-09-29)
- Fixed: Alt+click on a bar, point or star of a chart or map drawn in inline SVG captured the whole element around the drawing (a 3254×1568 px
div.map-layerin a real test), so one star could not be pointed at. It now captures the SVG element when it is content (named byaria-label,aria-labelledbyor a<title>, or with a role, a test attribute, a stable id, a link,tabindexor its own pointer cursor, or a<text>label):rect «Febrero: 90», with a path through the drawing (svg«Mapa» › g«Álgebra» › circle«Límite de una función»), its component, and the highlight on the shape itself. A nameless shape inside a named group points at the group, and so does one inside an item marked only by an identifier (<g data-id="limites">, alsodata-key,data-node,data-node-id,data-name,data-slug), even in an<svg role="application" aria-label>:find:showsdata-id `limites`and the pathg[data-id=limites]. Three or more such items drawn by one component are one entry, their identifiers listed like links (data-id [a–c]: `limites`, `derivadas`, …). - Unchanged: icons (
aria-hidden, inside a button or link, or icon-sized) and nameless drawing still point at the element around them. Path data and other geometry never leave the page; a<title>follows the same privacy rules asaria-label. Session format:stylesaddsfillandstrokefor SVG elements.
Spec polish from real sessions (D4, D5 and D9 notes 2026-09-29)
- Fixed: a group of copies with no text (three SVG stars) read
- [a–c] 3 × → code:; it now names their tag,3 × g → code:. - Fixed: two different elements with the same selector on the same page (two charts in two tab panels) were rendered as one, "(same element as in request 1)", and the second lost its code lines. They must now also share their path, their card and their code to count as the same element; otherwise each is described in full. The classic format's appendix had the same bug and is fixed too.
- Fixed: an element's card (
in «…») could be the title of a closed dialog kept in the page (a command palette's «Command Palette · Search for a command to run...»). Headings the user cannot see (closed<dialog>,hidden,inert,aria-hidden, not rendered, screen-reader-only) are skipped. - Fixed: fields of a shadcn form (react-hook-form) got
used at: `src/components/ui/form.tsx:37` — `<Controller {...props} />`, the same wrapper line for every field. A line that only hands its props on is no longerused at: the field's own line in the form, or the form's<FormField …>line, is. - Fixed: after pointing at an element, a longer explanation of it with no new gesture became several requests with no element. The sentences said right after a request (each within 4 s of the previous one, up to 4 sentences and 80 words, until the next gesture) are now quoted inside it, one line each, marked
(continues, no pointing); a preamble line explains the marker when a spec has one. The quote and its markers are unchanged.
Transcription quality: Fast / Accurate (D1 note 2026-09-29)
- New popup setting. Fast is the model used so far (
Xenova/whisper-base, the default). Accurate usesXenova/whisper-small: fewer misheard words (96 % of the Spanish test recording's words instead of 93 %), about twice as slow, and a 512 MB download the first time it is used, shown in the popup like the first download. Still transcribed on your computer, from the same host; no new permission. - The time estimate and the first-download notice are kept per model, so switching does not reuse the other model's numbers.
words.jsonnames the model used. - CLI:
--model Xenova/whisper-smallis the same Accurate model, at the same precision (fp32 encoder, q8 decoder);pointcast --helplists both.
The MCP server as the main path (D11 note 2026-09-29)
list_sessionssays what each recording is: the pages pointed at (host/path, three at most), how manyrequestsandelements, apreviewof the first request (~80 characters),matchesProject(whether the recording's source files are in the project:true,falseor"unknown", the check behindget_session's other-project warning) andrendered(itssession.mdis on disk). It takes arepoargument like the other tools, and answers with one session per line. The absolutedirof each session is no longer listed.- New session id
"latest-here"forget_sessionandget_element: the newest recording made on this project. It passes over newer recordings whose source files are all missing from the project (and says which, above the spec), takes one that names no files (it cannot tell), and falls back to the newest recording, with a note, when none of the 20 newest is from here."latest"is unchanged./pointcastwithout an argument now uses"latest-here". - The line above a spec (
get_session) and afterpointcast processsays what the recording holds in plain terms:8 requests · 17 elements · ~3,100 tokensinstead of17 events (10 deictic, 6 time, 1 standalone) · 12322 chars · ~3081 tokens. A spec on disk with nowords.jsongets the same line instead of "session.md read from disk". - Helpful errors: an unknown session id names the 3 newest recordings with the start of their first request, and suggests
list_sessions(instead of "No session.json in …"); an unknown event id gives the valid range,e1…e17. - New tool
wait_for_recording: waits for the user's next recording and returns its spec, asget_sessiondoes (with the other-project warning), as soon as the extension hands it over at Stop. AftertimeoutSecondsit answers "No new recording yet … call wait_for_recording again to keep listening", which is not an error. The default fits the client's own limit for a tool call: 9 minutes for Claude Code and Gemini CLI, 50 s for others (Codex stops tool calls after 60 s by default); at most 25 minutes. It sends progress notifications while waiting when the client asks for them. It works with several agent sessions open: the server that does not hold the handoff port watches the sessions folder, and a recording saved by Chrome's downloads is taken once its files are complete. A recording made while the agent was busy is returned by the next call; one already read withget_sessionis not returned again. By default it returns only recordings made on this project (the"latest-here"rule: skipped when its source files are all missing here, kept when it names none), so two agents watching two projects each get their own; a skipped recording stays new for the other one.anyProject: truereturns every recording. /pointcast watch(Claude Code and Codex skill, Gemini CLI command): the agent says it is listening, then loops: wait for a recording, apply it with the usual rules (it stops on the other-project warning and asks when a request is ambiguous), report one line per request, wait again, until you tell it to stop. It only picks up recordings made on the project it runs in.- Experimental: the MCP server declares a Claude Code channel. A Claude Code session started with
--dangerously-load-development-channels plugin:pointcast@pointcast(pointcast is not on the preview's allowlist) is told when the extension hands its server a recording: "New pointcast recording : 3 requests on localhost:5173/orders. Apply it with the pointcast tools…". Only the id, counts and pages, never the spec. Nothing changes for anyone who does not start Claude Code that way, and other clients get no message. - README: the Quick start leads with the agent integration (
/pointcast,/pointcast watch), with pasting as the fallback; new FAQ entry "How do I turn it off for a project or a session?". The CLI README documents the new tools and the default waits per client, and its MCP snippets pinpointcast@0.7instead of the outdated0.2. The popup setting is named as the popup shows it, Send to your agent's Pointcast MCP server. pointcast doctor: when a pointcast MCP server holds the handoff port, it adds a note that every agent session starts its own server and they all read the same sessions folder, so it works whichever one receives; when that server is older than the CLI, it says it is probably a session started before the update, and to close or restart those sessions so the new version receives.