The template-viewer content box used only max-height, so on mobile it
collapsed to a blank single line. Add a mobile size override for the
modal and a definite height for the content container inside the
existing max-width:768px media query. Desktop is unchanged.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Info (i) icons with service URLs on the ScrapeCreators, Supadata,
and OpenRouter settings.
- fetchOpenRouterModels: refresh the full OpenRouter model list from
the public API, vendor-grouped dropdown, auto-stored token limits.
- Desktop processing no longer shows a blank popup: the modal closes
on desktop (status-bar spinner only); mobile keeps the in-modal spinner.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Tier A of the UI native-component audit, no intended look-and-feel change:
- info icon and icon buttons -> setIcon / ExtraButtonComponent
- text buttons -> ButtonComponent (Process uses setCta)
- create-note modal URL/title inputs -> TextComponent, video-count
select -> DropdownComponent
Deferred: MarkdownRenderer for README/license modals, FuzzySuggestModal
for the pickers (both visibly change look).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Releases the current state as a stable before/after boundary:
- Copy template button restored (mobile users cannot scroll the
template example), plus a mobile touch-scroll hint.
- Settings info-icon tooltips fixed: native Obsidian setTooltip
replaces the flaky custom hover tooltip; OpenRouter reliability
note added to the LLM tooltip.
- Workflow and data-flow mermaid diagrams refreshed to current
architecture.
- README links made absolute so they resolve on the community site;
demo video linked.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Relative links (docs/, LICENSE, MIT-license-tubesage.md) resolve
against community.obsidian.md on the plugin's community page and 404.
Switch them to absolute github.com URLs so they work on both GitHub
and the community site. Add a link to the demo MP4 hosted in the repo.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Restore the Copy template button (mobile users cannot scroll the
template example); add a mobile touch-scroll hint.
- Replace the flaky custom info-icon tooltip with Obsidian's native
setTooltip; add an OpenRouter reliability note to the LLM tooltip.
- Refresh the workflow and data-flow mermaid diagrams to current
architecture.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Replace speculative/fictional components with architecture facts
verified from source: secret storage for cloud API keys, collectUnder
scoped folder traversal, LangChainClient dispatch for cloud providers,
OllamaClient for local, obsidianFetch shim for all HTTP, tiktoken
stubbed at build time, and OpenRouter as a supported cloud provider.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Release of the vault-enumeration and clipboard surface reduction:
the plugin no longer calls getMarkdownFiles / getAllLoadedFiles or
navigator.clipboard, so the Obsidian scorecard's Vault Enumeration and
Clipboard Access flags clear.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Replace whole-vault enumeration (getMarkdownFiles/getAllLoadedFiles) with
a scoped collectUnder folder-walk, and remove the Copy template button
(the only navigator.clipboard use), to clear the Obsidian scorecard's
Vault Enumeration and Clipboard Access flags.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The .tubesage-template-view-copy-container and -copy-text rules were
used only by the Copy template button removed in the previous commit.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Replace @langchain/core's tiktoken helper with a network-free stub via
an esbuild onLoad plugin. The upstream module lazy-fetches tokenizer
data from https://tiktoken.pages.dev; TubeSage never counts tokens, so
that path was unreachable, but the URL still sat in the bundle and
showed up as an external domain on the Obsidian plugin scorecard. The
stub removes it from main.js entirely.
- esbuild.config.mjs: add the stub-langchain-tiktoken onLoad plugin
- README.md: drop the tiktoken.pages.dev disclosure (no longer contacted)
- bump manifest.json / package.json / package-lock.json to 1.3.1
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Fallow dead-code analysis flagged 13 issues. Removed the 10 that are
genuinely unreferenced:
- LLMFactory.getBestProvider, LLMFactory.updateSettings
- GeminiClient.isAvailable, OllamaClient.isAvailable
- ProcessingSpinner.setLabel, plus the now-dead callCount field and its
'#N' suffix in the spinner text (setLabel was callCount's only writer,
so the counter had been stuck at 0 already)
- YouTubeTranscriptExtractor.fetchTranscriptSegments, combineTranscript,
clearConfigCache, parseJsonCaptions
- dropped the unused 'export' on the CaptionTrack interface (still used
locally in the file, just never imported elsewhere)
Kept OllamaClient.validateConnection and createChatCompletion: fallow
flagged them, but transcript-summarizer.ts calls them via a loosely
typed 'client' variable that fallow cannot statically resolve.
Build and lint pass clean.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The Obsidian plugin scorecard flagged that network requests and
capabilities should be disclosed to users. The Privacy & Security
section claimed the only network requests were to the LLM provider
and YouTube, which omitted tiktoken.pages.dev.
Rewrite the section to accurately disclose:
- tiktoken.pages.dev (tokenizer data, via the js-tiktoken transitive
dependency of LangChain; not called by TubeSage directly)
- vault file/folder enumeration (folder picker, template discovery)
- clipboard writes (the 'Copy template' button; never reads clipboard)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Note in LLM provider setup and Privacy & Security that cloud keys
(OpenAI, Anthropic, Google, OpenRouter) are stored in Obsidian's
native secret storage, not data.json, and that this is automatic.
- Mention the automatic migration of pre-1.3.0 keys.
- Correct the stale minimum Obsidian version (v1.2.0 -> v1.11.4),
which secret storage requires.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Correct brand/acronym casing in UI text: 'Youtube' -> 'YouTube'
(setting name + description), 'oauth' -> 'OAUTH', dropdown label
'Openai' -> 'OpenAI'. These were genuine misspellings.
- Whitelist the 'OpenRouter' dropdown label via ignoreRegex; it is a
brand with intentional internal capitals not in the rule's brand
list, and ignoreWords is bypassed for single-word strings.
npm run lint now passes with 0 errors and 0 warnings.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The local prefer-active-doc rule flagged every `window` identifier as
preferring `activeWindow`. obsidianmd 0.3.0's new `prefer-window-timers`
rule requires the opposite for timer calls (`window.setTimeout` etc.),
so the two rules contradicted, leaving 11 unfixable warnings.
Add a `window.<timerMethod>` carve-out to the local rule, mirroring the
same exception in upstream eslint-plugin-obsidianmd's prefer-active-doc.
Lint now reports 0 warnings (4 errors remain: intentional brand-name
casing left per project decision).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Bump eslint-plugin-obsidianmd 0.2.9 -> 0.3.0 and typescript-eslint
8.58.2 -> 8.59.3. ESLint stays at 9.39.4: obsidianmd 0.3.0 peer-pins
@eslint/js ^9 and @eslint/json 0.14.0, so ESLint 10 is not yet
cleanly supported.
obsidianmd 0.3.0 adds two new rules. Fixes for the errors they raise:
- no-unnecessary-type-assertion: remove 4 redundant type assertions
(main.ts x3, fetch-shim.ts x1) - all compile-time-only, tsc confirms.
- prefer-window-timers: switch 11 activeWindow timer calls to window
(main.ts, form-utils.ts, processing-spinner.ts). TubeSage has no
popout-window feature, so window === activeWindow at every call site.
Note: obsidianmd 0.3.0's prefer-active-doc rule (warning) now flags
window.* as preferring activeWindow, directly contradicting the
error-level prefer-window-timers rule. window.* is kept because it
satisfies the error-level rule; the 11 advisory warnings are an
upstream rule conflict and cannot be resolved without suppression.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>