Repository navigation
Releases: candidloom-hub/sourcebolt
Release list
v0.3.3
Changelog
Fixes
- a984f8f fix: serve starts with an unreadable profile; login replaces undecryptable ones
Other
- afbeba9 Merge pull request #43 from candidloom-hub/docs/app-screenshots
- be821bf Merge pull request #44 from candidloom-hub/fix/serve-unreadable-profile
- e19e689 Merge pull request #45 from candidloom-hub/docs/chatgpt-shots
- 5a884dc Merge pull request #46 from candidloom-hub/release/v0.3.3
- 79b16d2 release: v0.3.3 changelog, version bumps, state and handoff
v0.3.2
Changelog
Features
- 1c2e7c2 feat(auth): sign in from NOTEBOOKLM_COOKIES or NOTEBOOKLM_COOKIES_FILE
Fixes
- 4664deb fix(install): purge the new Windows data folder; docs for the move
- 941d6b9 fix(session): Windows data folder outside AppData, folder-scoped keyring keys
Other
- ca35075 Merge branch 'main' of https://github.com/candidloom-hub/sourcebolt into fix/windows-config-dir
- b8c0986 Merge branch 'main' of https://github.com/candidloom-hub/sourcebolt into release/v0.3.2
- 021171a Merge pull request #35 from candidloom-hub/docs/post-v0.3.1
- 9d30bd3 Merge pull request #36 from candidloom-hub/docs/handoff-final
- 3cd197f Merge pull request #37 from candidloom-hub/feat/env-cookie-import
- 954456d Merge pull request #38 from candidloom-hub/ci/npm-trusted-publishing
- bfa1e5e Merge pull request #39 from candidloom-hub/docs/cline-and-shots
- 625bb5a Merge pull request #40 from candidloom-hub/fix/status-help
- 38901ec Merge pull request #41 from candidloom-hub/release/v0.3.2
- ccdac9f Merge pull request #42 from candidloom-hub/fix/windows-config-dir
- b18410d Merge remote-tracking branch 'origin/main' into feat/env-cookie-import
- eca2e16 ci(release): npm trusted publishing with token fallback; stage every version
- 30c8456 cli: status --help prints usage; status rejects arguments
- 63bf1f9 release: v0.3.2 changelog and version bumps
- c48f21d release: v0.3.2 includes the Windows data-folder fix
v0.3.1
sourcebolt v0.2.0
sourcebolt is a fast MCP server for Google NotebookLM: internal RPC first, with headless-browser and page (DOM) fallbacks.
Install
- Binaries: download the archive for your platform below and put
sourcebolt(sourcebolt.exeon Windows) on your PATH. - Claude Desktop: download
sourcebolt-mcp-<os>-<arch>.mcpbbelow and double-click it. - Claude Code plugin:
/plugin install sourcebolt --marketplace candidloom-hub/sourcebolt - Go:
go install github.com/candidloom-hub/sourcebolt/cmd/sourcebolt@v0.2.0 - Docker:
ghcr.io/candidloom-hub/sourcebolt:0.2.0; the image with the browser fallback isghcr.io/candidloom-hub/sourcebolt:0.2.0-browser. - VS Code, Cursor and other clients: see docs/install-links.md and docs/clients.md.
- npm, PyPI and the MCP registry: not published yet.
Verify
cosign verify-blob --bundle checksums.txt.sigstore.json --certificate-identity https://github.com/candidloom-hub/sourcebolt/.github/workflows/release.yml@refs/tags/v0.2.0 --certificate-oidc-issuer https://token.actions.githubusercontent.com checksums.txt
The bundles are listed in sourcebolt-mcp-checksums.txt. Each archive has a CycloneDX SBOM (.cdx.json).
Every Studio type, chat settings, saving answers as notes, deletes for sources, notes and chat history, a large performance pass, new user docs, and new distribution channels. Shapes are pinned by live captures #2, #3 and #3b (2026-10-20); see research/rpc-catalog.md (rows marked "live").
Added
sourcebolt doctor --dom-check <notebook>asks one question through the browser (DOM) fallback, so you can confirm it works on your machine before you need it.- Distribution: a Claude Code plugin marketplace in the repo (
/plugin install sourcebolt --marketplace candidloom-hub/sourcebolt), MCP Bundles (sourcebolt-mcp-<os>-<arch>.mcpb) attached to releases, VS Code and Cursor one-click install links (docs/install-links.md),glama.json,gemini-extension.json, and a registry-readyserver.json(GHCR image only until npm and PyPI are published). - User docs rewritten: getting started, per-client setup, troubleshooting by error message, FAQ, performance, "Why sourcebolt" and a sourced comparison page; plus a privacy page.
studio_generategenerates every Studio type:audio,video,report,interactive_report,slide_deck,mind_map,quiz,flashcards,infographicanddata_table. Each kind has its own option object whose schema enums list only the values a live capture sent; an omitted option takes the web app's default. A value the web app offers but no capture sent returnsUNSUPPORTED_BY_TRANSPORTnaming the option, before the quota check. Proven values (default first): audio formatdeep_dive,critique, lengthdefault,short; video formatcinematic,short; slide deck formatdetailed_deck,presenter_slides, lengthdefault,short; quiz quantitystandard,more, difficultymedium,easy; flashcards quantitystandard,fewer, difficultymedium,hard, imagesinclude,text_only; infographic orientationlandscape,portrait, detailstandard,concise, styleauto,sketch_note.instructionsis optional for audio, video, slide deck and quiz, required for report, mind map, flashcards and data table, and refused by infographic and interactive report (each as captured).reportneedsreport.titleandreport.descriptionplusinstructionsas the prompt;suggestsurfacereportreturns such triples.languageaccepts only the captured codesen(default) anden_in; cinematic video takes none.video.generate_laterasks for deferred generation (the web app's "Generate later"; cinematic only; the artifact lists as pending). Sources default to every source of the notebook.chat_askoptionsave_as_note: saves the answer as a note the way the web app's "Save to note" does (the answer's passages and rich text go along; the server picks the title). Returnsnote_idandnote_title, ornote_errorwith the answer kept.deletekindssource,noteandchat_history(a conversation's whole history; ids are conversation ids). Same preview andconfirm:truegate as notebooks; refs are matched strictly against a fresh list of the notebook's items. Thechat_historypreview shows each conversation's created and updated times and, when its whole history can be read, the first question; only the newest 20 conversations are reachable (an older id getsUNSUPPORTED_BY_TRANSPORT, notNOT_FOUND).source_readmodeguide: the source guide's summary astextpluskeywords.studio_listdecodes rows of every Studio type with their status (pendingwhile queued, generating or deferred).
Changed
- Breaking:
studio_listreports flashcards, quiz and mind map artifacts as kindsflashcards,quizandmind_map(all wereinteractive), and slide decks asslide_deck(wasslides), the namesstudio_generateuses. Filters on the old names match nothing. - Breaking:
studio_generateflashcards default to the web app's defaults (standard, medium, with images), which capture #3 sent, instead of fewer, hard, text only (still available as options). - Breaking:
chat_configureaccepts modedefault,learning_guideorcustomand response_lengthdefault,longerorshorter, the values captures #3 and #3b saved; modedefaultwith response_lengthdefaultresets a notebook. Modesconciseanddetailedare removed. suggestsurfacereportno longer returnsaudience: the number has no verified meaning.suggestsurfacereportsends the live request (artifact options block and every source when none are given).notebook_listresults carryhas_more, true when notebooks after the returned page also match; page withoffset.notebook_listreturns 20 notebooks by default instead of 50.totalstill counts every match; passoffsetfor the next page or a largerlimit(pages come from the 30 s cache, so paging makes no extra Google call). Each listed notebook is sent twice (structured content and its JSON text fallback) and decoded by the client, so the smaller page cuts the cached call's overhead by about half (B3, seebench/RESULTS.md).note_savecreates a note in one call with its title and content, as the web app's "Copied text" flow does; updates send the live note-edit shape.- Notebook rename, text load-source and artifact-read requests match the live web app (options block added, full
v9rmvdform). Markdown load-source and chat suggestions were not captured and keep their earlier requests. note_list(and sonote_saveand the note delete) skips rows that are not notes, such as note-backed mind maps.source_readreports drift instead of returning empty text when an answer has no text blocks and no HTML.source_addlists the notebook before adding, so that a source missing from the add answer is only reported added when its row is new; a match with a source that already existed is pending.
Performance
- Tool-call overhead (B3, 100 notebooks, 2-CPU CI, p50): uncached
notebook_list2.20 -> 0.76 ms, cached 0.99 -> 0.40 ms; decoding a 40 KB answer 508 -> 225 us with 9 instead of 93 allocations; cold start and idle memory lower (tool schemas are resolved on first use). Seebench/RESULTS.md. - On Linux the server turns off transparent huge pages for its own process (
prctl), which cut idle RSS by about 2 MB on hosts whose THP mode is "always". The fallback browser inherits the setting. serveruns with GOGC=200 unlessGOGCis set: fewer collections per tool call (cachednotebook_listabout 20% faster) at the cost of a somewhat larger heap under load.
Fixed
-
loginreplaces a profile whose encryption key is gone from the OS keyring (it could never be read again) instead of failing with a file-not-found error; other unreadable profiles get alogouthint. -
The cookie-import error names exactly the cookies sourcebolt checks (
SID,__Secure-1PSIDTS, andOSIDorAPISID+SAPISID). -
chat_configuresent no options block; the web app sends it. Two changes on one notebook at once could lose one of them; the read and the write now run one at a time per notebook. -
chat_askstreams copy the answer's rich block only whensave_as_noteis set. -
studio_listwith kindslide_deckmatched nothing. -
source_readreturned a source's text as one run-on line: text blocks sit one level deeper than the research catalog said. -
Chat citations: a marker lists passage indices, not a range (checked against both live captures). Answers citing a single passage had no citations, and answers whose markers cite several passages lost some. Exact duplicates are dropped and malformed indices skipped.
-
source_add: an item missing from a successful add answer was reported failed although Google had added it (seen live with YouTube). It is now looked up in the notebook: found is added, not found is failed, a failed lookup is pending.
Known limitations
- Replaces the 0.1.0 list. Not available yet: Studio option values no capture sent (audio formats brief and debate, long audio, video formats explainer and brief and their visual styles, quiz fewer and hard, flashcards more and easy, square infographics, detailed infographics, other infographic styles), languages other than
enanden_in, deferred generation for anything but cinematic video, free text where a kind was captured without it (infographic, interactive report) or required where only captured with it (report, mind map, flashcards, data table), report templates by name (their texts live in the web app), and notes as Studio sources; artifact, label and collection deletes; ...
sourcebolt v0.1.0
sourcebolt is a fast MCP server for Google NotebookLM: internal RPC first, with a headless-browser fallback. First public release.
Install
- Binaries: download the archive for your platform below and put
sourcebolt(sourcebolt.exeon Windows) on your PATH. - Docker:
docker run -i --rm -v sourcebolt-config:/config ghcr.io/candidloom-hub/sourcebolt:0.1.0. The browser-fallback image isghcr.io/candidloom-hub/sourcebolt:0.1.0-browser. - npm, PyPI and the MCP registry: not published yet.
Verify
checksums.txt lists SHA-256 sums for every archive, and checksums.txt.sigstore.json is its keyless cosign signature:
cosign verify-blob --bundle checksums.txt.sigstore.json --certificate-identity-regexp 'https://github.com/candidloom-hub/sourcebolt/' --certificate-oidc-issuer https://token.actions.githubusercontent.com checksums.txt
Each archive has a CycloneDX SBOM (.cdx.json). The container images are signed too.
First public release: GitHub release binaries and GHCR images. npm, PyPI and MCP registry packages are not published yet.
Added
- Core (P1): Go module,
batchexecuterequest encoder and chunked response decoder with status, drift and null policies, RPC id registry with runtime overrides (NOTEBOOKLM_RPC_IDS), TTL cache with singleflight and stale-while-revalidate, notebook id/prefix/title resolver. - Auth and storage: cookie import (Netscape, JSON, header), AES-256-GCM encrypted profile store with the key in the OS keyring (key file fallback), revision-checked saves,
login --import,login --browser,login --attach(CDP),logout,status,doctor. - CLI:
serve(stdio, or loopback streamable HTTP with bearer token and Origin check),call <tool> '<json>', tool profilesdefault,minimalandall. - Transports: tuned HTTP/2 RPC transport, streamed chat transport with first-chunk, idle, total and size limits, in-page browser fetch transport on a dedicated profile, and a router that falls back from RPC to the headless browser (
--no-browser-fallback/NOTEBOOKLM_BROWSER_FALLBACK=0to disable). - 31 MCP tools:
server_info;notebook_list,notebook_open,notebook_create,notebook_update;source_add,source_list,source_read,source_update;chat_ask,chat_status,chat_history,chat_configure,chat_ask_many,suggest;research_start,research_status,research_import;note_list,note_save;share_status,share_update;label_list,label_update;studio_list,studio_generate(quota check only);account_settings,auth_login,auth_logout(CLI hints only);delete(notebooks);job_cancel. Several options returnUNSUPPORTED_BY_TRANSPORTuntil a live capture pins them; see docs/tools.md. - DOM fallback: when NotebookLM changes its chat or add-source RPC, sourcebolt drives the signed-in page instead (
browser-domtransport). Selectors are overridable in<config>/selectors.json. Source-scoped asks, non-default threads and Drive sources are not covered. - Progress notifications for long calls and a local job table for detached chat (
wait=false). - Safety: SSRF URL check, path allow-root check, log redaction, preview-before-delete and preview-before-share-widening.
- Performance: benchmark suite with a regression gate in CI (
bench/); lazy wire view that cut notebook decode allocations about 111x. - Packaging: GoReleaser config (archives, checksums, SBOMs, cosign signatures, Docker images including a
-browservariant), npm launcher with per-platform packages, PyPI per-platform wheels. Nothing is published. - Documentation: README, generated tool reference (
go run ./tools/gendocs > docs/tools.md, checked for staleness by a test in CI), auth and security guides, agentSKILL.md, MCP registryserver.json. - Live capture tooling (
tools/capture) and sanitized golden fixtures from a real NotebookLM session.
Changed
- Breaking:
research_importselects candidates byurls,report: trueorall, matched against a fresh read; the index-basedselectinput is removed.research_statusno longer shows indices, and import results carryurlinstead ofindex. share_updatetries both of its calls and reports each part. The status isappliedorpartial; it is an error only when nothing was applied.- Error envelopes include
retry_after_secondswhen Google sends Retry-After. - Docker base images are pinned by tag and digest, and Dependabot watches them.
Performance
- Tool results are marshalled once. The output-schema check runs only in tests, and the advertised schemas are unchanged. Per
notebook_listcall (100 notebooks), on the 2-CPU CI runner: allocations −72%; p50 2.88 → 2.26 ms uncached and 1.67 → 1.00 ms cached.
Fixed
- Chat answers are no longer cut off by a 30 s response-header timeout. Unary calls bound their wait to the first response byte.
- The browser fallback is skipped after a direct connection refusal. A refused proxy still allows it.
- The HTTP server's Origin check compares the parsed hostname;
http://localhost.evil.comno longer passes. - New profile names reject Windows device names, control characters, and leading or trailing dots and spaces. Existing profiles still load, delete and save.
- Chat stream errors after the question was sent are marked as sent.
- Asks that start a new chat thread run one at a time per notebook, so concurrent asks no longer pick up each other's thread.
- Session store keeps keys on transient keyring errors and locks and retries saves; fresh logins win over stale ones.
- No secrets in transport errors; tool errors are redacted.
- Non-idempotent calls are not resent after the request reached the server.
- Source URLs: the validated URL is the one sent.
- Deletes dedupe ids, report per-id outcomes and refuse unsupported kinds before previewing.
- Mutating tools resolve notebooks strictly against a fresh list.
- Headless fallback browser is shut down on exit; failed launches are cached with backoff; detached chat jobs are bounded.
- Chat progress no longer resends the whole answer every second.
Known limitations
- Studio generation, deletes other than notebooks, Drive and file sources, source guide and refresh, followup suggestions, label create and auto-label, research
discover, and saving a chat turn as a note are not available yet. - Uncached
notebook_list(100 notebooks) measures about 2.3 ms p50 on the 2-CPU CI runner, above the 2 ms overhead target. Most of the remaining time is MCP JSON-RPC encoding and decoding, and the benchmark counts the client's share too (seebench/RESULTS.md).