Repository navigation
Releases
1.299.1
1.299.1 — Ctrl/Cmd+P stays the command palette
Pressing Ctrl/Cmd+P now opens Obsidian's command palette only. An older
install can carry a custom hotkey that assigns the same chord to Open
cards; when the Cards module is off, that command's module guard opens
Settings to turn Cards on. Both actions then appeared at once.
What changed
- One startup repair.
src/hotkey-cleanup.jschecks the custom hotkeys on
mcq-tracker:open-cardsand removes an exactCtrl/Cmd+Pbinding. It does
not touch Obsidian's own command-palette hotkey. - Narrow by design. Only
PwithMod,Ctrl,CmdorMetais
removed.ShiftandAltvariants, other commands and other keys are left
alone. Open cards remains in the command palette, and its ribbon button
is unchanged whenever Cards is on. - Visible only when it matters. A short notice explains the change when a
binding is actually removed. A clean install, or one without that custom
binding, sees no notice and no write. - No data or feature changes. Note formats, cards, review history,
settings, AI setup and network paths are untouched.
Verification
The release adds tests/hotkey-cleanup.test.js for exact-chord matching,
preservation of other bindings, the removeHotkeys and setHotkeys paths,
and quiet handling of hosts without the hotkey manager. tests/plugin.test.js
also drives the real plugin startup and proves the core
command-palette:open binding is not changed.
node --test passes 2,568 tests. npm run check is clean across
353 source files; main.js is current at 7,069,068 bytes from
356 modules. git diff --check is clean. The release asset is rebuilt from
this commit, so the build-verification check can reproduce it byte for byte.
A live Obsidian window is not available in this workspace, so the final
click-through with a real vault hotkey file remains an owner check.
1.299.0
1.299.0 — OpenCode at the front door
A new desktop setup now starts with OpenCode. The same connection screen used
before an AI import has the install button inline, tests the install, and only
then enables Continue. Direct API remains the phone path and a one-click
fallback.
What changed
- OpenCode is the desktop default. A brand-new desktop install starts on
the OpenCode backend. Phones still use Direct API, because OpenCode runs on
the computer. - The install button is in the setup path. The shared wizard used by
Practice and the import helper opens on OpenCode instead of hiding it under
an advanced disclosure. Install OpenCode downloads the supported build,
shows progress, and can retry a failed start without leaving the screen. - Test, then Continue. Installing no longer silently marks AI as ready.
The screen saves an optional provider key, Test OpenCode starts the
agent and checks its health and provider list, and Continue to import
unlocks only after that test succeeds. - Readiness tells the truth. Practice, the empty screen and the import
helper now require an actual OpenCode install, or a server the user
configured, before showing AI as ready. A missing install points back to the
install button instead of failing later in an import. - Direct API and offline remain reachable. The same screen offers a
Direct API key path for phones, existing keys or a fallback, and Paste
questions instead (works offline) stays visible on both paths. - Existing Direct API setups keep working. An install that already has AI
enabled or saved Direct API credentials, but no saved backend, is migrated
to Direct API. It is not moved to OpenCode by the new default.
The welcome guide's one-click installer still enables AI on a successful
install. The shared wizard passes { enable: false } so it can test the
connection before turning AI on.
Verification
node --test passes 2,563 tests. npm run check is clean across
352 source files; main.js is current at 7,065,144 bytes from
355 modules. git diff --check is clean. The release asset is rebuilt from
this commit, so the build-verification check can reproduce it byte for byte.
The installer and test flow are covered by the wizard tests with a mocked
desktop manager. A live Obsidian window and a real OpenCode installation are
not available in this workspace, so the final in-app install click-through
remains an owner check.
1.298.0
1.298.0 — Community review fixes
This patch clears the two actionable findings from the Community Plugins
review. It changes metadata and one decorative stylesheet rule only; no plugin
feature, setting, note schema or network path changed.
What changed
- Manifest description fixed. The plugin description no longer contains the
word "Obsidian". The community directory rejects that word in a description
as redundant, and this was the review's only blocking failure. - Stylesheet warning cleared. The small red marker on a flagged exam
question usedclip-path, which the review reports as only partially
supported by Obsidian 1.7.4. It is now a supported rounded marker in the
same top-right position. - Regression guard. The release-hygiene suite now fails if the manifest
description mentions Obsidian or the stylesheet usesclip-pathagain. - No behaviour change. Practice, imports, the AI connection wizard, review,
cards, calendar, assignments and every note format are untouched.
Remaining review warnings
These are intentional and unchanged:
main.jsis larger than 5 MB because the plugin bundles the optional
OpenCode installer and the unmodified MIT-licensed PDF++ bundle. Users on the
Obsidian Sync Standard plan cannot sync a file that large.- Direct filesystem access, shell execution and Electron IPC come from that
optional desktop installer and the vendored PDF++ bundle. They are not used
on mobile and are documented indocs/security-inventory.md. - Vault enumeration, clipboard access and dynamic code execution are the same
previously reviewed surfaces.
Verification
node --test passes 2,558 tests. npm run check is clean across
352 source files; main.js is current at 7,052,911 bytes from
355 modules. git diff --check is clean. The release asset is rebuilt from
this commit, so the build-verification check can reproduce it byte for byte.
1.297.0
1.297.0 — A first PDF import anyone can finish
This release finishes the first-run PDF path. A new user who has never used
Obsidian and has never made an AI key now sees that the file import needs AI,
can paste questions offline instead, and can connect a provider through a short
wizard that chooses a model for them and tests it before the importer opens.
What a new user gets
- Honest labels at every entry point. The empty Practice screen says
Import files (needs AI) and explains that practice, cards and timed tests
work offline. Paste questions instead (works offline) sits directly beside
it and opens Quick add. The top-of-Practice shortcut reads Import questions
(needs AI) and a Paste questions (offline) button is next to it. - A beginner connection wizard. The setup screen and the import help window
preselect Anthropic (Claude) — recommended, show a visible Create a key
button that opens that provider's key page in the browser, and explain what
the page is for. There is no required model-name field on the happy path. - Fetch models chooses for you. Fetch models reads the provider's own
list and picks a stable saved model, the provider default, a preferred family
such as Sonnet or GPT-5, or the first chat model. The chosen model appears in
a dropdown and is saved. - Tested before continuing. Test connection sends one short request and
reports the reply. Continue to import stays disabled until a cold start
has a key, a model and a successful test. A saved working setup can continue
without retesting. - Failure is a next step, not a dead end. A rejected key names the problem
and points back to Create a key; an empty or non-chat model list says so;
an offline device says it could not reach the provider and points at the
offline paste route. Every one of those states keeps Paste questions
instead (works offline) on screen. - One implementation.
src/ai-connection.jsowns provider defaults, key
pages, model choice, model fetching and the connection test. The practice
wizard, the import help window and Settings call the same fetch and test
code instead of duplicating it. - Start here says the offline route. The guide's "If you do not have AI"
line and the AP import step now name Quick add questions from pasted
text and say it works offline, instead of telling the reader to write a
question note by hand.
Verification
Focused tests drive a real cold start through the wizard with mocked provider
responses: the recommended provider is preselected, the key is stored, a model
is chosen from the fetched list, the connection is tested, and the importer
opens with AI enabled. Separate tests cover a rejected key, an empty model
list, an offline request, the absence of a free-text model field and the
offline Quick add path writing a note that passes the import checker.
node --test passes 2,557 tests. npm run check is clean across
352 source files; main.js is current at 7,051,745 bytes from
355 modules. No dependency, note schema, provider list or network path
was added; the wizard only uses the existing ApiClient requests.
1.296.0
1.296.0 — A simpler start and What's New
This release shortens the everyday path: new installs begin with a smaller
settings page, Import questions is at the top of Practice, the less-used
practice actions sit under More actions, and an update now opens a short
local What's new note inside Obsidian.
What changed
- What's new in Obsidian. After an update, a short note lists the changes in
that version. It is bundled with the plugin, uses no network, appears once per
version on each device, and stays quiet on a genuine first run so the Start
here note owns onboarding. Reopen it with Show what's new from the command
palette or Settings → Global → About. - Simple settings. New installs start with Practice, review, the Study agent
and app settings. A single Show all settings switch reveals the full
specialist tree and remembers the choice. Existing data files keep the full
tree, and a deep link to an advanced page reveals it instead of being dropped. - Import at the top. Practice puts Import questions above presets and
filters. It stays visible with AI off and opens the existing setup screen
rather than hiding the entry point. - Clearer practice actions. Skip, mark known, bury, suspend and exclude move
under More actions. Confidence and Submit remain the primary path. - Calmer imports. Course, unit, skill and other note properties wait behind
Add details. Importing into an existing folder adds questions instead of
stopping, and an import that produced no notes now links directly to the AI
settings page when the agent may be waiting for file-edit permission. - Clearer confidence labels. The untouched default scale is now Guessing /
Probably Right / Confident; custom labels are left alone. Ribbon buttons also
carry matching accessible labels.
Verification
node --test passes 2,549 tests. npm run check is clean across 350
source files; main.js is current at 7,034,946 bytes from 353 modules.
Focused tests cover the bundled release data, first-install and update gating,
the command, the modal, Simple settings, the old-label migration and the practice
layouts. No dependency, provider, note schema or network path changed; the
What's new note is bundled locally and reads only per-device local storage.
1.295.0
1.295.0 — Clearer feedback, tutoring and events
The feedback link now opens the MCQ Tracker feedback form, the Cards deck page
can open AnkiWeb's shared-deck search, local events carry a location, and the
Study agent gains an Objective coach tutor role.
What changed
- Feedback defaults to the Tally form. An install that still carries the old
built-in GitHub issue URL is migrated once on load; a URL you set yourself is
left alone. - Cards → Find a deck on AnkiWeb (and the matching command) opens AnkiWeb's
shared-deck search in your browser. Nothing is sent from Obsidian: download
the.apkgthere and import it with the existing Anki import. - Local events gain an optional Location field (up to 300 characters),
shown beside the time and category in the day, week and timeline lists. The
existing notes field is now labelled Description. - Study agent → Objective coach joins the tutor roles. It charts a note into
atomic learning objectives, teaches one at a time through explain, recall and
apply, keeps recall and transfer separate, and resumes at the objective that
needs the most work.
Verification
node --test passes 2,513 tests. npm run check is clean across 347
source files; main.js is current at 6,997,963 bytes from 350 modules.
Focused tests cover the feedback default and migration, the AnkiWeb command, the
event location and the new tutor role. No dependency, provider, note schema,
storage format or network path changed; the AnkiWeb button only opens a browser
tab.
1.294.0
1.294.0 — A one-screen start
The first run now opens on one Start here screen. It gives a new user three
plain steps, a real example question, an optional desktop OpenCode installer,
feedback links and a short mobile note. The optional module chooser and workflow
guide are still one click away.
What changed
- Try the example question writes one ordinary note to
Questions/Getting started example.md, enables MCQ Tracker if it was off, and
opens Practice limited to that note. If the name is taken, it uses the next
free number instead of overwriting a note. - Install OpenCode runs the existing desktop installer from the welcome
screen. It reuses an existing compatible program, shows download progress,
and leaves the AI settings unchanged if the install fails. The button then
says Try again. - On mobile, the same section explains that OpenCode is desktop-only and points
to a Direct API provider key instead. The desktop install button is not shown. - Help and feedback links open the GitHub issue form and the quick-start
guide. Nothing opens or is submitted until you click. - The guide can be reopened from the command palette or Settings → Global →
About.
The example is a normal question note: you can edit, move or delete it like any
other note. It uses the same Quick add format, question ID and review schedule
as the rest of the vault.
Verification
node --test passes 2,509 tests. npm run check is clean across 347
source files; main.js is current at 6,995,234 bytes from 350 modules.
The 11 welcome tests cover preset state, the example note path and unique name,
the Practice filter, direct install and reuse, and the rendered screen. The
desktop and mobile branches are implemented; no physical mobile device was
available for this pass. No dependency, provider, note schema, storage format or
network path changed.
1.293.2
1.293.2 — Practice can use the computer layout on a tablet
The Practice screen now has a Mobile practice view switch under Practice
session settings. An iPad reports itself as a mobile device, so its question
screen always used the phone tree even though the review and Settings already
used the desktop layout.
- On (default) — phones keep the mobile question and review screens; an iPad
keeps the mobile question screen and the shared desktop review, exactly as in
1.293.1. - Off — an iPad or phone renders the desktop question and shared desktop
review tree, so Practice can look like it does on a computer. - Desktop — ignores the switch and always uses the computer layout.
- The preference is saved as
settings.mobilePracticeView; changing it refreshes
open Practice views immediately. It does not change the Settings navigation,
notes, attempts, scheduling or distraction-free practice.
src/practice-view.js, src/settings-tab.js, src/constants.js and
src/plugin.js carry the change. tests/mobile-practice.test.js,
tests/plugin.test.js and tests/settings-navigation.test.js cover the iPad,
phone and desktop branches, the default and persisted off value, and the
rendered switch. The iPad branch is verified with Platform-driven tests; no
physical iPad was available for an in-app capture. No dependency, provider,
note schema, storage format or network path changed.
Verification: node --test → 2,502 pass, 0 fail; npm run check clean
across 347 source files; main.js is 6,986,925 bytes from
350 modules. The plan records 98 checked / 3 partial / 0 unchecked.
1.293.1
1.293.1 — Tablets keep the desktop Settings layout
Settings chose its compact phone layout from body.is-mobile, so an iPad —
which Obsidian reports as mobile — lost the desktop category and page list and
fell back to the phone picker. The layout is now chosen when the settings tab
renders.
- Phones —
Platform.isPhonemarks the layoutis-phone; the existing
single-column body, grouped page picker, wrapped tabs and wrapped setting
controls apply there. - Tablets —
Platform.isPhoneis false on iPad, so the desktop two-column
layout and page list stay, with the current category row and breadcrumb. - Older API builds — when
isPhoneis unavailable,Platform.isTablet
decides; a device with neither flag is treated as a phone, matching the
existing practice-view fallback. - Narrow desktop panes — the container-query picker below 540 px is
unchanged, so a narrow pane still gets the grouped picker.
src/settings-tab.js and styles.css carry the change.
tests/settings-navigation.test.js adds the iPad, phone and older-platform
test and asserts that no settings rule is scoped to body.is-mobile. The split
is covered by the platform-driven tests; no iPad or phone was available for an
in-app capture. No dependency, provider, note schema, storage format or network
path changed.
Verification: node --test → 2,499 pass, 0 fail; npm run check clean
across 347 source files; main.js is 6,986,073 bytes from
350 modules. The plan records 98 checked / 3 partial / 0 unchecked.
1.293.0
1.293.0 — The Practice view matches the exam app's question screen
The Practice question screen is rebuilt from the owner's screenshots of the
official testing app, recorded as text in docs/practice-bluebook-reference.md.
The layout is clean-room: no exam-app code, artwork, font or wording is copied,
and colours still come from the user's Obsidian theme.
- Header and tools — the section title with Directions beneath it, a
centred timer and its Hide pill, and labelled tool buttons
(Highlights & Notes, Calculator, Reference, More) replace the
generic bar. The practice-test ribbon is no longer rendered. - Answers — full-width outlined rows with a lettered circle, and the
cross-out control outside the box. A crossed-out choice keeps a solid 1 px
border, greys and strikes its text, slashes the letter circle and swaps the
control for a small orange Undo pill. The controls and Undo no longer
inherit the plugin's 44 px tap target, so they render at their intended
22 px and 20 px. - Highlights — the drawer's highlight panel is replaced by one floating
pill anchored above the selected text or the clicked highlight, with the four
colours, a highlight/underline toggle, remove and an inline note field.
Marks also paint inside answer choices, true/false options and review rows;
clicking a mark reopens the pill, and a drag across choice text no longer
counts as choosing that answer. - Selection capture —
selectionchangeplus a range-text fallback and
section detection, and exam text opts back into text selection because
Obsidian's own chrome disables it. - Calculator — a graphing tab plots an expression of
xthrough the
existing restricted evaluator and draws an SVG path. There is still no
eval,new Function, dependency or network call.
src/practice-view.js, src/practice-tools.js, src/calculator.js and
styles.css carry the change. tests/practice-chrome.test.js adds 16 tests,
and tests/practice-tools.test.js is updated for the pill and the labelled
tool row. No dependency, provider, network path, note schema or storage format
was added.
Verification: node --test → 2,498 pass, 0 fail; npm run check clean
across 347 source files; main.js is 6,985,509 bytes from
350 modules. The plan records 98 checked / 3 partial / 0 unchecked.