Concept entries kept attributing innovations to tech giants (Microsoft, Google, etc.)
because training data over-represents them. Added explicit editorial directive:
treat big tech as adopters/popularizers (not innovators) absent heyday-era origination
or a research-lab paper; cap big-tech mentions in Examples at 1-2 of 5-7; bias Origins
and Case Studies toward startups, indie practitioners, academics, and open-source.
Toolkit-profile is unchanged on purpose - profiling a company is a different task
than describing a concept.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Three landings:
1. New {{basename}} interpolation token. Resolves strictly to the target
file's basename without .md, never falling through to a frontmatter
`title` field. Concept-profile uses this so the H1 always matches the
filename in the vault, regardless of what the frontmatter says.
2. New seed template src/docs/templates/concept-profile.md (matched in the
user's vault at zz-cf-lib/templates/concept-profile.md). applies-to-paths
is "concepts/**". Heading skeleton:
- Defining and Describing {{basename}} (image placeholder bullet,
optional mermaid diagram, italic lede, 2–4 sentence paragraph)
- Uses in Context
- History of Use (Origins, Evolution)
- Best Real-World Examples
- Case Studies
search-recency is "year" rather than "month" since concepts evolve more
slowly than products.
3. In-body provenance line inside the # Sources footer:
_Generated <ISO timestamp> via <Provider> <model id>._
Always renders, even when the run returned zero sources (in which case
the body becomes "_No sources returned._"). Mirrors and complements the
frontmatter stamp; gives readers an at-a-glance record of which model
produced a given file and when, without needing to inspect frontmatter.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Every successful applyTemplate now writes two keys back to the target file's
frontmatter, via app.fileManager.processFrontMatter so other keys remain
untouched:
- cf_last_run: ISO 8601 timestamp (e.g. "2026-05-09T20:14:32.451Z").
- cf_last_run_model: provider + model id (e.g. "Perplexity sonar-deep-research").
Lets the vault be queried for staleness — e.g. "show all files in
Tooling/AI-Toolkit/Agentic AI/Agentic Workspaces sorted by oldest cf_last_run"
to find which entries need a refresh. Mirrors the og_last_fetch pattern from
metafetch.
Stamping happens only on { status: 'applied' } — errors and skips do not
touch frontmatter.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Reference section now emits as:
{content}
***
# Sources
[1]: [Title](URL)
[2]: [Title](URL)
Blank line before the separator, blank line between separator and the
h1 heading (Sources promoted from h2 to h1), blank line before the first
reference. Matches the user-preferred citation-block shape per the
Lossless citation spec aesthetic.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Previous version returned third-party stock illustrations (wufoo.com,
thingsup.io, pixelfreestudio.com) instead of actual screenshots from the
entity's site. The "prefer entity domain" instruction in the prompt was
suggestion-only; the model picked whatever Perplexity's image search
indexed against the topic keywords.
Two changes that should compose to fix this:
1. Send `search_domain_filter: [entityDomain]` on the Perplexity request
when the active file's frontmatter has a `url` field. This restricts
Perplexity's underlying web search to the entity's domain, so the model
can only see and reference on-site pages.
2. Strict client-side filter as defense in depth. Any returned image whose
`origin_url` or `image_url` hostname does not end in the entity domain
is rejected before placement. Better to surface "no on-domain images
found" via Notice than to silently insert third-party stock images.
Prompt also tightened: it now instructs the model that searches are
already domain-filtered and that returning fewer images (or none) is
preferred over substituting generic stock content.
Next escalation if this still falls short: direct DOM crawl of the entity
URL (fetch HTML, parse <img> tags by alt-text/context match) — fully
deterministic, no model judgment for image selection.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
New command "Find images for selection". Highlight a passage in any open file,
invoke the command, and the plugin:
1. Splits the selection into paragraphs and numbers them.
2. Reads the active file's frontmatter for url / site_name (entity context).
3. Sends a Perplexity request with return_images=true asking the model to:
- Find N screenshot/product/feature images that illustrate the specific
passage content.
- Prefer images hosted on the entity's domain; fall back to other web
sources only when on-domain images aren't available.
- For each chosen image, output one line of the form
`[AFTER {paragraph_number}] [IMAGE {n}: <description>]` so the model
itself decides which paragraph each image belongs after.
4. Parses the placement markers, maps each image number to the corresponding
entry in response.images, and rebuilds the selection with `\n\n`
separators around each embed so images sit between paragraphs, never
inside one.
5. Falls back to even-distribution domain-preferred ordering if the model
emitted no placement markers.
Result is `` embeds in standard CommonMark/GFM form,
inserted via editor.replaceSelection. Frontmatter and surrounding content
are untouched.
New setting `findImagesMaxImages` (default 3) caps the per-invocation count.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Previous fix used [N] without the colon. Lossless-Citation-Spec.md mandates
the colon for reference-section identifiers (cite-wide reminders/spec line
68: "always use a `: ` after the citation identifier"). Cite-wide's parser
accepts both shapes, but the colon form is canonical and what other
Lossless tooling expects to see in checked-in files.
Verified the parser flow against cite-wide:
- REFDEF_NUM_RE (llmCitationParserService.ts:91) matches both `[N]` and `[N]:`
- reformatRefDefBodyAsMarkdownLink (line 547) skips wrapping when the body
already contains a markdown link, so `[N]: [Title](URL)` passes through
untouched into the hex-conversion stage.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The previous footer used ordered-list style ("1. [Title](URL)"), which
cite-wide's LLM citation parser ignores. Cite-wide's REFDEF_NUM_RE expects
each line to start with [N] (square-bracketed digit), optionally followed by
a colon, then the link.
New format per source:
[1] [Title](URL)
[2] [Title](URL)
This matches cite-wide/src/services/llmCitationParserService.ts:91 verbatim,
so running cite-wide's "convert numeric citations to hex" command on a file
generated by this plugin now picks up the footer references and rewrites
them to the project's [^hexId] form.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Real-vault use revealed Perplexity Deep Research was returning all-essay
content padded from training data instead of search results: zero inline
citations, "not available in current accessible sources" repeated for every
section. Diagnosis traced two root causes — laziness (the system prompt's
escape hatch "even if a section reads 'limited public information'" gave the
model permission to dodge search) and hallucination (no enforcement that
factual claims be tied to search results).
Fixes in this commit:
1. Streaming writes (replaces v0.2's buffer-then-write). fetch() with SSE,
tokens flush to file every 500ms via app.vault.modify. Cancel mid-stream
via existing batch-cancel flag; partial output remains in file.
2. Combined system prompt: perplexed's standard inline-citation directive
prepends the template's role framing, matching how the working ask-
perplexity command activates search.
3. Auto-prepended research framing to user prompt: "Research the entity X
using web search... Every factual claim must be followed by [N]." The
prompt no longer reads as a writing brief.
4. Post-stream cleanup runs after the write completes (per user spec):
- Wraps any <think>...</think> blocks in ```think-output fenced code (raw
<think> HTML breaks Obsidian rendering).
- Appends a ## Sources footer listing search_results from the API
response so evidence-of-search is visible even if the model failed to
inline [N] markers.
5. Seed template (toolkit-profile.md) system prompt rewritten with positive
directives only — no escape hatches, no "limited info" phrasing, no
failure-mode descriptions. Encodes the project rule that telling a model
it can be lazy makes it lazy.
ApplyOutcome now carries sourceCount; the user-facing notice reports it.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Three additions driven by real-vault use against ~1600 Tooling/ profile files:
1. Folder batch run. New command "Apply directory template to all files in
folder" prompts for folder, then template, then a confirm modal showing
total/fill/append counts before firing. Sequential execution with a
live-updating progress notice. New "Stop directory template batch"
command sets a cancel flag checked between files.
2. Append-below replaces abort-on-existing-body. If the target body is
non-empty, the response is appended after a blank-line separator instead
of skipping. Frontmatter still byte-identical. ApplyOutcome return type
distinguishes fill / append / skip / error so batch can tally them.
3. Interpolation extended beyond {{title}} and {{frontmatter}}. Now supports
{{frontmatter.X}} for explicit access and bare {{X}} as auto-fallback to
frontmatter.X — so templates can use {{site_name}}, {{slug}}, etc.
directly. Arrays render as comma-joined strings; nested objects as YAML.
Also adds {{today}} → ISO date.
New files:
- src/modals/FolderPickerModal.ts — FuzzySuggestModal<TFolder>.
- src/modals/BatchConfirmModal.ts — confirm dialog showing batch counts.
Out of scope, still:
- v0.3: cf codefence in user notes.
- v0.4: section-aware writing + per-section output modes.
- v0.5: citation/backlink preservation.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Match the user's preferred naming. The template file is "Toolkit Profile"
(its identity); it applies to entries under Tooling/ via applies-to-paths.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Solves the immediate workload of populating ~1600 nearly-empty profile files
under Tooling/, Sources/, and Vocabulary/ with a consistent outline + body.
The user picks a template from a fuzzy palette (filtered by glob match against
the active file's path), and the plugin sends a single Perplexity Deep Research
request driven by the template's heading skeleton + per-section bullet
instructions. The response is buffered, then written into the empty body of the
target file. Frontmatter is byte-identical before and after.
Template anatomy (per context-v/specs/Per-Directory-Profile-Templates.md):
- Frontmatter — title, applies-to-paths globs, description.
- Pre-`cft` prose — explainer for humans, ignored at runtime.
- One `cft` codefence — YAML config + `system:` field. Config-only; no prompt
body inside the fence.
- Post-`cft` skeleton — heading outline with model-facing bullet instructions.
Sent as the user prompt with `{{title}}` and `{{frontmatter}}` interpolated.
- A `***` line below the skeleton terminates the user prompt; everything below
is authoring scratch and never reaches the API.
New files:
- src/services/directoryTemplateService.ts — template loader, parser, glob
matcher, frontmatter whitelist filter, prompt assembly, non-streaming
Perplexity call, file writer.
- src/modals/DirectoryTemplatePickerModal.ts — FuzzySuggestModal wrapping the
glob-matched template list.
- src/docs/templates/{tooling-profile,source-profile}.md — seed templates
users can copy into their vault.
main.ts changes:
- New settings: directoryTemplatesRoot (default "zz-cf-lib/templates"),
directoryTemplatesFrontmatterWhitelist (default ["title", "og_description",
"tags", "og_image"]), directoryTemplatesRequestTimeoutMs (default 300000).
- New command: "Apply directory template to current file".
- New settings UI section under "Directory templates".
Out of scope for v0.1 — captured in the spec for later iterations:
- Folder-batch run with concurrency/progress/resume (v0.2).
- `cf` codefence runtime in user notes (v0.3).
- Section-aware writing + output modes (v0.4).
- Citation/backlink preservation (v0.5).
- Multi-provider, image generation, verb registry split (later).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Patch release bundling the marketplace-compliance lint pass for the
Obsidian community plugin re-submission. No user-visible behavior
changes from 0.1.0; this is the bot-clean version.
versions.json picks up "0.1.1": "1.8.10" matching the manifest's
minAppVersion.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Applies all required fixes from the bot's review of PR #12513
(obsidianmd/obsidian-releases). ESLint now passes 0 errors with the
Obsidian community ruleset; tsc passes; production build is clean.
Lint setup:
- Adopted eslint-plugin-obsidianmd@^0.2.9 in eslint.config.mjs
- Mirrored the bot's rule surface locally so violations surface in
`pnpm lint` instead of the marketplace PR thread
- Configured the ui/sentence-case rule with a brand allowlist
(Perplexity, Perplexica, Vane, Claude, Anthropic, LM Studio, Imgur,
ImageKit, OpenAI, Ollama, Sonar, Llama, GPT, YAML, JSON, URL, API)
so legitimate proper nouns aren't lowercased
Code fixes (487 → 0):
- console.log/info → console.debug across all sources (~130 sites)
- UI strings normalized to sentence case (~150 sites)
- Command IDs and names cleaned up: dropped "command" suffix, dropped
"perplexed" plugin-name prefix
- Settings tab section headers switched from createEl('h2') to
new Setting().setHeading() (5 sites)
- Inline element.style.color/width/minHeight/fontFamily migrated to
a new CSS class (.perplexed-json-textarea + .is-tall / .is-extra-tall)
in src/styles/settings-tab.css (8 textarea sites, 32 style assignments)
- Async input handlers wrapped: addEventListener('input', () => void
(async () => { ... })()) so the listener type matches (8 sites)
- forEach((opt) => dd.addOption(...)) blocks made void-returning to
satisfy no-misused-promises (9 modal sites)
- JSON.parse results typed as unknown then narrowed
- throw <string> → throw new Error(<string>)
- ${unknown} interpolations narrowed via instanceof Error
- Removed dotenv runtime dependency: published plugins shouldn't read
.env at runtime; user enters API keys via the settings tab
- Replaced builtin-modules dev-dependency with node:module's
builtinModules — same data, no extra package
- Logger console-method dispatch rewritten as a switch instead of
dynamic console[level] indexing (which the bot rejects)
Streaming exceptions:
- src/services/{perplexityService,lmStudioService,perplexicaService}.ts
retain `fetch()` for SSE / chunked streaming because Obsidian's
`requestUrl` buffers the whole body. Each site has an
`eslint-disable-next-line no-restricted-globals` with the marketplace
`/skip` justification inline. Plan to surface these on the PR with
a `/skip` reply.
Reference docs:
- context-v/issues/Obsidian-Review-Bot-Feedback-on-Perplexed-Submission.md
(issue log distilled into…)
- context-v/reminders/Obsidian-Marketplace-Compliance.md (the rules
themselves, reusable for image-gin and cite-wide submissions)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Perplexity's Sonar API stopped embedding inline citation markers in
message.content; responses now return prose plus separate citations
and search_results arrays. The plugin's addCitations() rendered a
correct bibliography, but the body had nothing to anchor the numbers
to.
Prepend a system message telling the model to append [1], [2], ...
markers inline, ordered to match search_results. All three payload
build sites now share one messagesWithSystem array.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Brings the manifest in line with the rest of the content-farm plugins —
1.8.10 is the team's current minAppVersion baseline (image-gin, plunk-it,
lmstud-yo, filestarter, file-transporter all use it); the 0.15.0 here
was a 2022-era inheritance from the original Obsidian sample plugin.
Also adds fundingUrl for parity with the rest of the farm.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Tighten the retrospective to lead with this repo's own substance.
Lineage from the official Obsidian sample plugin is what every plugin
forks from on day one — not interesting and now relegated to a footnote
or removed entirely.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Seeds the changelog/ directory with a retrospective entry dated to the
first commit of substance in this repo, written in May 2026 from the
content-farm pseudomonorepo cleanup. The convention didn't exist when
the original work shipped; this entry exists so the upcoming GitHub
Content API roll-up loader has something from this plugin to surface
on the content-farm splash.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds a context-v/reminders/ note that points future humans and AI agents
to the canonical Obsidian API source of truth and lists the most common
community plugin review-bot rejection reasons. Same canonical reminder is
being seeded across every plugin in the content-farm ecosystem so the
content-farm splash's rolled-up context-v feed has reminders surfacing
from every plugin once the GitHub Content API loader lands.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds the Updating-Naming-to-Reflect-Provider-Rebrand issue note that
documents the surfaces touched by the Perplexica/Vane rename and the
ones intentionally left as internal symbols.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Background: the open-source self-hosted repo (ItzCrazyKns/Perplexica)
was renamed to Vane on 2026-03-09 by its maintainer (commit
'feat(app): rename to vane'). The hosted service at perplexica.io
remains live under the Perplexica brand — that's a separate hosted
product, not what users self-install for this plugin. The local API
surface (/api/search, focus modes, optimization modes) is unchanged
across the rename.
Updates "Perplexica" to "Perplexica / Vane" wherever a user can see
the string — command palette, modals, notice toasts, editor-injected
callouts, settings tab, README. Internal references (class names,
method names, CSS classes, command IDs, settings field names) are
left bare to avoid breaking compatibility or requiring migration.
main.ts
- Command names: 'Ask Perplexica' / 'Update Perplexica URL' /
'Show Perplexica Settings' all gain '/ Vane'.
- Notice toasts (service not initialized, failed to open modal,
current URL display) updated.
- Settings tab section heading 'Perplexica (Self-Hosted)' →
'Perplexica / Vane (self-hosted)'; all 9 endpoint/model/template/
prompt/placeholder labels and descriptions in that section
updated to read 'Perplexica / Vane'.
- URLUpdateModal config (title + label) for the Update URL command
updated to match the new command name.
- Default Perplexica query placeholder updated.
src/modals/PerplexicaModal.ts
- Header title, subtitle, submit button all read 'Ask Perplexica / Vane'.
src/services/perplexicaService.ts
- Editor-injected callout '**Perplexica Query**' / '### **Response
from Perplexica**' both updated.
- Error notice prefix 'Perplexica Error:' → 'Perplexica / Vane Error:'.
README.md
- Top blurb, features bullet, network-use table row, "Using" section
heading + TOC anchor (slug regenerated), full Commands table.
- Install section rewrite: heading marks the local-install
requirement explicit; new rename callout points users at
github.com/ItzCrazyKns/Vane for docs while explaining what got
renamed and what didn't (perplexica.io is still a separate
hosted brand).
Intentionally bare (justified):
- Example JSON content '"What is Perplexica's architecture?"'
(sample content, not a UI label).
- Internal Error throws + console logs (dev-only surface).
- Code comments.
- Lines 98-102 of README, inside the rename callout itself —
those sentences distinguish the two names by design.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Six docs-derived blockers fixed in one pass; punch-list plan filed
under context-v/plans/ for traceability.
manifest.json
- description rewritten: action-verb start (was "A plugin for
Obsidian…", which the docs call out as an anti-pattern), all four
providers named (Perplexity, Anthropic Claude, Perplexica, LM
Studio), 144 chars, ends with period.
- fundingUrl removed — was pointed at the company website, not a
donation service. Docs: "If you don't accept donations, remove
fundingUrl from your manifest."
main.ts
- Three command IDs un-prefixed: 'perplexed-debug-commands' →
'debug-commands', 'perplexed-reset-prompts' → 'reset-prompts',
'perplexed-reinitialize-services' → 'reinitialize-services'.
Obsidian auto-prefixes commands with the plugin id, so the
doubled form would have registered as 'perplexed.perplexed-…'.
- Deleted the top-level <h2>Perplexed Plugin Settings</h2> from the
settings tab. Docs: "Avoid adding a top-level heading in the
settings tab, such as 'General', 'Settings', or the name of your
plugin."
README.md
- Placeholder URLs replaced with the real lossless-group/perplexed-plugin
repo (clone command, Issues link x2, Discussions link).
- Stale "Version: 0.0.0.1" footer line deleted (manifest is the
source of truth).
- New "## Network use and accounts" section: per-provider table with
endpoint, account requirement, and API-key requirement, plus an
explicit no-telemetry / no-self-update statement. Required by
Developer Policies (network-use disclosure + paid-account
disclosure). Key Features bullet updated to mention Claude.
context-v/plans/2026-05-02_Submission-Blockers-Punch-List.md
- New plan documenting the audit findings: six blockers fixed here,
four will-be-flagged items (7-10: settings <h3>/<h4> → setHeading,
sentence case, console.log hygiene, vault.adapter.write in
logger.ts) deferred to a separate pass.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Two open items from changelog/2026-05-02_01.md:
1. TextDecoder was being instantiated inside the read loop, so the
{stream: true} flag (meant to carry partial multi-byte UTF-8 state
across chunk boundaries) was discarded every iteration. Multi-byte
characters split across a chunk boundary silently became U+FFFD,
which then caused the JSON parse on that line to fail — caught and
logged silently by the per-line try/catch. Hoisted the decoder
outside the loop so the stream-state flag actually does its job.
2. Streaming responses occasionally truncated mid-answer with no
console error and no Notice — the loop just stopped writing.
Diagnosis (unverified) was that Perplexity's server or Obsidian's
Electron fetch was closing the SSE socket without surfacing an
error, leaving reader.read() blocked forever. Each read now races
against a 90s idle timer; if no chunk arrives in that window, the
timer rejects with a clear message ("stream went idle for 90s
(likely API stall, rate limit, or socket close)") which propagates
to the existing catch and produces a visible Streaming Error
notice + editor line instead of silent truncation. 90s is generous
enough for sonar-deep-research first-byte (30-60s typical) but
short enough that a true stall is caught quickly.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Brings LMStudioModal, TextEnhancementModal, and TextEnhancementWithImagesModal
to the same shape as Ask Perplexity / Ask Claude / Ask Perplexica:
modalEl.addClass(...) wide-modal unlock, sectioned header/section/footer
layout, BEM-scoped class names, native Obsidian Setting components for
dropdowns and toggles, custom textareas where Setting is a poor fit,
Cmd/Ctrl+Enter submit, mobile breakpoint at 600px.
LMStudioModal: model dropdown with live taglines, Max Tokens input,
Temperature slider (0-2 with dynamic tooltip), optional System Prompt
textarea, Images + Stream toggles.
TextEnhancementModal + TextEnhancementWithImagesModal: read-only
Selected Text textarea (background-secondary tint to distinguish from
editable input) + editable prompt pre-filled from the plugin template,
button busy-state during the call.
Bonus: TextEnhancementWithImagesModal CSS class name now matches the
file/class name (was 'get-related-images-modal' on the .ts side while
the file was text-enhancement-with-images-modal.css).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
On branch development
Your branch is up to date with 'origin/development'.
Changes to be committed:
new file: changelog/2026-04-30_01.md
new file: changelog/2026-05-01_01.md
modified: changelog/2026-05-02_01.md
modified: context-v/specs/Using-Files-as-Prompt-Outlines.md
modified: src/modals/PerplexicaModal.ts
modified: src/styles/perplexica-modal.css
modified: styles.css
standards
On branch development
Your branch is up to date with 'origin/development'.
Changes to be committed:
new file: LICENSE
new file: context-v/plans/20206-05-02_Assuring-Obsidian-Community-Plugin-Requirements.md
modified: eslint.config.mjs
modified: main.ts
modified: manifest.json
modified: package.json
modified: src/modals/ArticleGeneratorModal.ts
modified: src/modals/ClaudeModal.ts
modified: src/modals/LMStudioModal.ts
modified: src/modals/PerplexicaModal.ts
modified: src/modals/PerplexityModal.ts
modified: src/modals/TextEnhancementModal.ts
modified: src/modals/TextEnhancementWithImagesModal.ts
modified: src/modals/URLUpdateModal.ts
modified: src/services/lmStudioService.ts
modified: src/services/perplexicaService.ts
modified: src/services/perplexityService.ts
modified: src/types/obsidian.d.ts
new file: src/utils/coerce.ts
modified: src/utils/formatDate.ts
modified: src/utils/logger.ts
modified: styles.css
modified: versions.json
On branch development
Your branch is up to date with 'origin/development'.
Changes to be committed:
new file: .logs/obsidian.md-1777711786079.log
modified: context-v/issue-resolutions/Getting-Claude-to-Respond-With-Research.md
new file: context-v/specs/Using-Files-as-Prompt-Outlines.md
modified: src/modals/ArticleGeneratorModal.ts
modified: src/modals/ClaudeModal.ts
modified: src/modals/PerplexityModal.ts
modified: src/services/claudeService.ts
modified: src/styles/article-generator-modal.css
modified: src/styles/perplexity-modal.css
modified: styles.css
definitions, just plain text
On branch development
Your branch is ahead of 'origin/development' by 1 commit.
(use "git push" to publish your local commits)
Changes to be committed:
new file: context-v/issue-resolutions/Getting-Claude-to-Respond-With-Research.md
new file: context-v/issue-resolutions/Widen-Modals-in-Obsidian-using-CSS.md
modified: package.json
with getting returned research objects.
On branch development
Your branch is up to date with 'origin/development'.
Changes to be committed:
new file: context-v/reminders/Ideal-and-Overkill-Schema-for-Max-Flexibility.md
modified: main.ts
modified: package.json
modified: pnpm-lock.yaml
new file: src/modals/ClaudeModal.ts
new file: src/services/claudeService.ts
new file: src/styles/claude-modal.css
modified: src/styles/main.css
modified: styles.css
On branch development
Your branch is ahead of 'origin/development' by 1 commit.
(use "git push" to publish your local commits)
Changes to be committed:
deleted: .eslintignore
deleted: .eslintrc
new file: changelog/2026-05-02_01.md
new file: eslint.config.mjs
modified: package.json
modified: pnpm-lock.yaml
modified: src/services/perplexityService.ts
modified: styles.css
modified: tsconfig.json
On branch feature/perplexity-streaming
Changes to be committed:
modified: README.md
new file: src/docs/Understanding-the-Perplexity-Response-Object.md
modified: src/services/lmStudioService.ts
modified: src/services/perplexicaService.ts
modified: src/services/perplexityService.ts
new file: src/utils/formatDate.ts
modified: styles.css
new file: test-perplexity-api.sh
new file: test-perplexity-non-streaming.sh
- Split monolithic main.ts into modular services and modals
- Created separate service classes: PerplexityService,
PerplexicaService, LMStudioService
- Created modular modal classes: PerplexityModal, PerplexicaModal,
LMStudioModal, URLUpdateModal
- Deleted unused legacy files: CitationModal.ts, citationService.ts,
cleanReferencesSectionService.ts
## New Features
- Added ArticleGeneratorModal for one-page article generation with
predefined prompts
- Implemented intelligent image placement with [IMAGE n:
description] markers
- Added auto-scrolling during streaming responses for better
UX
- Created full callout formatting for query blocks with
multi-line support
## UI/UX Improvements
- Moved all inline styles to dedicated CSS files for
better maintainability
- Created modular CSS structure: perplexity-modal.css,
article-generator-modal.css, etc.
- Added proper spacing and padding to text inputs
across all modals
- Fixed sources placement to appear after last
non-empty line (no more huge gaps)
- Enhanced modal layouts with better visual
hierarchy
## Build System
- Updated esbuild.config.mjs to properly bundle
CSS files
- Created src/styles/main.css as CSS entry
point
- Implemented proper CSS build process with
minification support
## Bug Fixes
- Fixed TypeScript errors from unused
imports and parameters
- Resolved streaming scroll issues with
proper cursor tracking
- Fixed multi-line query formatting in
callout blocks
- Corrected sources insertion logic
for both streaming and
non-streaming responses
## Code Quality
- Improved separation of concerns
with service/modal architecture
- Enhanced maintainability with
modular CSS structure
- Added comprehensive error
handling and logging
- Implemented consistent
coding patterns across all
services
## Technical Details
- Services now handle API
calls, streaming, and
response processing
- Modals focus purely on
UI and user
interaction
- CSS uses Obsidian's
design system
variables for
theming
- All modals support
both streaming and
non-streaming
modes
- Image placement
supports both
inline markers
and fallback
sections
Breaking
Changes: None
Migration:
Existing
functionality
preserved,
enhanced with
new features
On branch development
Your branch is up to date with 'origin/development'.
Changes to be committed:
modified: README.md
modified: main.ts
modified: styles.css
works and streams responses back. Not perfect, but works!
On branch development
Your branch is up to date with 'origin/development'.
Changes to be committed:
modified: main.ts
On branch development
Your branch is ahead of 'origin/development' by 1 commit.
(use "git push" to publish your local commits)
Changes to be committed:
modified: README.md
modified: main.ts
On branch development
Your branch is up to date with 'origin/development'.
Changes to be committed:
modified: main.ts
new file: package-lock.json
modified: package.json
modified: styles.css