Skip to content

Releases: open-horizon-labs/obsidian-am

0.11.1

Choose a tag to compare

@github-actions github-actions released this 26 Jul 22:49

First stable release with incremental Marvin sync and the companion MCP
server
, both validated end-to-end in a real vault by a beta tester across ten
beta rounds.

Why 0.11.1 and not 0.11.0? 0.11.0-beta1 through beta10 shipped, which
burns 0.11.0 as a stable version. Obsidian's stock update checker can't
compare pre-release suffixes, so anyone on a beta would never be offered
0.11.0. Documented in CONTRIBUTING.md.

Everything below is opt-in and off by default. If you upgrade and change
nothing, the plugin behaves as it did in 0.10.1 — with one improvement you get
for free (completed tasks, below).


Completed tasks stay in your daily note

No setup required — this applies to everyone.

Previously, checking a task off in the managed Today region deleted the line on
the next refresh. Your daily note ended up recording only what you hadn't
finished, which is backwards for a record of the day.

Completed tasks now stay, checked, in the position they already occupied.

The cause was upstream: Marvin's Today and due reads only return open work.
/dueItems is documented as "open", /todayItems has no parameter for
completed items, and no endpoint lists what you completed on a given day. So a
checked task went missing from the read and the line was removed. Checked
Marvin lines already in your note are now kept when the current read no longer
returns them.

Deliberately narrow, so stale work doesn't get pinned into notes:

  • Only checked lines are kept. An unchecked task Marvin stops returning has
    genuinely left your Today list — rescheduled, unscheduled, deleted — and still
    disappears.
  • Marvin still wins. Un-complete a task there and it renders open again.
  • Nothing accumulates across days. Preservation is scoped to each note's own
    dated region.

Experimental: incremental sync

Opt-in, off by default, desktop only. Settings → Advanced: incremental sync.

What it solves

Amazing Marvin's request API throttles heavily — confirmed with their support,
and it still happens when routing through the local desktop API. With enough
categories, a full import can hit the limit partway through and leave a
half-imported tree.

Incremental sync avoids the REST API for ongoing work entirely. It hydrates once
via a bulk database read, then keeps current through CouchDB's changes feed,
updating only the notes that actually changed rather than rebuilding the
tree.

The trade-off, stated plainly

It needs your Amazing Marvin database credentials (server, database, user,
password from Marvin's API settings page) — a materially larger credential than
the limited API token, granting full read access to your Marvin database. They're
stored in this plugin's Obsidian settings.

That's why it's opt-in, why the settings section spells out the reasoning inline,
and why the REST importer remains the default and the fallback on every failure.

Desktop only — the settings section and the sync itself. A phone keyboard
with autocorrect and no reveal toggle is the wrong place to enter a
full-database credential. Mobile keeps using the REST importer.

Safe to abandon

The cache holds only derived data — nothing that can't be rebuilt by
re-reading Marvin. "Reset cache" is a recovery step, not data loss, and a schema
change re-hydrates rather than migrating. That invariant is
documented and enforced in code comments
precisely so a future change doesn't quietly break it.


MCP server

Official support for driving Marvin from an agent. Runs as a Node stdio
process on your desktop; uses the same limited API token as the plugin.

It does not require this plugin, or Obsidian at all. It talks to Amazing
Marvin with the limited API token and nothing else — install it on its own if
that's all you want. Reading the plugin's cache (below) is an optional
optimization for people running both.

It will be spun out into its own repository. It lives here for now because
the plugin and the server share one Marvin client, and building them together
kept that contract honest while it settled. Expect it to move once it can be
versioned independently — configuration and usage shouldn't change, but the
clone path will.

Tools

Tool Purpose
marvin_today / marvin_due Read scheduled or due work for a date
marvin_categories Discover stable category/project IDs and hierarchy
marvin_children Read tasks/projects under a parent ID
marvin_labels Discover label IDs before creating tasks
marvin_create_task Create a task, with dates, labels, note, estimate
marvin_create_project Create a project to hold tasks — new in 0.11.1
marvin_mark_done Complete a task

Reads carry freshness and origin so a caller can tell live data from cached.

Edit and delete are deliberately absent. Marvin's limited API has no update
or delete endpoint; those require a third credential whose own documentation
warns that a wrong document shape "might cause Marvin to crash on startup" and
that API deletes bypass Marvin's Trash with no recovery. Reasoning is
written down rather than left
implicit. Rename and reschedule in Marvin's own apps.

Optional: let the MCP server read the plugin's cache

If you've enabled incremental sync, the MCP server can read the same cache the
plugin maintains, skipping a REST round trip. It needs no database
credentials
— it's a read-only consumer of a file the plugin already writes,
and falls back to REST on any failure.

marvin_categories and marvin_children also accept refresh: true, which
asks the running plugin to sync first and waits briefly. Those responses report
what actually happened:

"refresh": { "requested": true, "outcome": "synced", "waitedMs": 820 }

synced, timed_out, or skipped with a reason — so an agent can tell a
newly-synchronized answer from a silent timeout that fell back, and decide
whether to retry.

Setup

Full instructions, including the security guidance on not putting your token in
a host config file: MCP server
and Reading the plugin's incremental cache.

Prompt you can hand to an agent to set this up
Set up the Amazing Marvin MCP server from
https://github.com/open-horizon-labs/obsidian-am, release 0.11.1.

Read the "Companion MCP server" section of that repo's README first — it is
authoritative, and it explains why the API token should come from a launcher
rather than being pasted into an MCP host config file.

Steps:
1. Clone or update the repo, check out tag 0.11.1, then `npm ci` and
   `npm run build`. Note: the MCP server builds from this repository, NOT from
   the plugin installed in Obsidian — an older checkout silently ignores newer
   configuration.
2. Register the built server at packages/marvin-mcp/dist/server.js with my MCP
   host, following the README's launcher pattern so the token stays out of
   config files. The limited API token comes from Amazing Marvin's API settings
   page.
3. Verify by calling marvin_categories and confirming it returns my real
   categories.

Optional, only if I've enabled the plugin's Experimental incremental sync:
4. Set AMAZING_MARVIN_INCREMENTAL_CACHE_PATH to
   <vault>/.obsidian/plugins/cloudatlas-o-am/marvin-incremental-cache-v1.json
   (it exists only after incremental sync has run once), restart the server,
   and confirm marvin_categories now reports "freshness": "cached" and
   "origin": "local".
5. Confirm marvin_categories with refresh: true reports
   "refresh": { "outcome": "synced", ... }.

Do not ask me for my database credentials — the MCP server never needs them.
Report what you configured and anything that didn't work.

Settings tab reorganized

Grouped by what each setting does rather than by loose verbs: Connection,
Category and project import, Today's tasks, Automatic refresh, How
imported tasks are written
, Sending changes to Marvin, then two collapsed
Advanced sections.

Some settings were renamed for clarity — notably Tasks to ShowTasks to
include
, which previously collided confusingly with Show Due Date (one picks
which tasks appear, the other which date fields). Your existing
settings are preserved
; only labels changed.

Background file rewriting now has its own Automatic refresh heading rather
than sitting under what read like a display preference. Settings that only apply
to one metadata format grey out instead of looking active, and "Reset cache" and
removing an import root now ask for a confirming second click.


Also in this release

  • Fixed: the plugin author shown in Obsidian's plugin list. Beta builds credited
    the previous org name; a CI check now prevents the stable and beta manifests
    from drifting again.
  • Fixed: toggling settings no longer tears down and rebuilds the whole settings
    tab, which lost your scroll position and collapsed sections mid-edit.
  • Fixed: an invalid refresh interval now tells you it was rejected instead of
    being silently ignored.

Known limitations

  • Incremental sync is desktop only.
  • A task completed in Marvin's app that never appeared in your note won't show
    up there — there's no line to preserve. By design: your notes are the durable
    record, not plugin state.
  • Renaming, moving, and deleting are not available over MCP (see above).

Feedback

Issues and questions:
github.com/open-horizon-labs/obsidian-am/issues

0.11.0-beta9

0.11.0-beta9 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 26 Jul 22:21
953c7c3

Completed tasks stay in your daily note

If you checked off a task in the managed Today region, the next refresh deleted
the line. Your daily note recorded only what you hadn't finished — which is
backwards for a record of the day.

Completed tasks now stay, checked off, in the position they were already in.

Why it was happening

Marvin's Today and due reads only return open work. /dueItems is
documented as "open", /todayItems has no parameter for completed items, and
there is no endpoint at all that lists what you completed on a given day. So
once you checked a task, the refresh saw it missing from the read and removed
the line. The note renderer already knew how to draw a checked box — the data
just never survived long enough to reach it.

What it does now

A checked Marvin line already in the region is kept, verbatim, when the current
read no longer returns it, and it holds its original position rather than
sliding to the bottom.

Kept deliberately narrow, because over-preserving would pin stale work into
notes forever:

  • Only checked lines are kept. An unchecked task Marvin no longer returns
    has genuinely left your Today list — deleted, rescheduled, or unscheduled —
    so it still disappears, as before.
  • Marvin still wins. If you un-complete a task in Marvin, it renders as open
    again on the next refresh rather than staying stuck as a checked line.
  • Nothing accumulates across days. Preservation is scoped to each note's own
    dated region.

Needs no new credentials, and works whether or not you use incremental sync.

One case this doesn't cover

A task you completed in Marvin's app that had never appeared in your note
won't show up — there's no line in the note to preserve.

An earlier draft of these notes suggested the incremental cache could retain
completed tasks to fill that gap. That was the wrong idea and it isn't planned:
the moment that file holds the only copy of something, it stops being a cache
and becomes a system of record. "Reset cache" would become data loss instead of
a safe recovery step, a schema change would need a migration instead of just
re-hydrating, and the whole "off by default, delete it any time, REST is the
source of truth" framing would stop being true.

Your notes are the durable record here — versioned, backed up, portable, and
readable without this plugin. That's the right home for completion history, and
it's what this release writes to. If the remaining gap ever matters, the shape
would be a live read at refresh time, not something the cache keeps.

How to test

  1. Install 0.11.0-beta9 via BRAT.
  2. Open today's daily note with an initialized Today region and some open tasks.
  3. Check one off in Obsidian. Wait for the automatic refresh (window focus, or
    about a minute) or run "Refresh today's tasks".
  4. The task should still be there, checked, in the same spot. Previously it
    vanished.
  5. Let several refreshes run. The note should stop changing — no duplicates, no
    drift.
  6. Complete a different task in Marvin's own app instead of in Obsidian. It
    should also stay in the note, checked.
  7. Un-complete that task in Marvin. It should go back to an open checkbox.
  8. In Marvin, reschedule a still-open task to a different day. It should
    disappear from today's note — that's intended, not a regression.

Still uncovered

Reset-cache rehydration, and disabling incremental sync then running the regular
importer.

Feedback

Issue #55 for
incremental-sync results. This Today-region change is better discussed on a new
issue if something's off, since it's independent of the sync work.

0.11.0-beta8

0.11.0-beta8 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 26 Jul 22:11
779dc78

What's in this beta

A new MCP tool, plus a documented answer to "why can't the agent rename or
delete things?"

marvin_create_project

An agent could create tasks but not a project to put them in. It can now.
Uses the same limited API token as everything else — no new credential.

Projects aren't quite tasks: they support priority (high/mid/low),
which tasks don't, and they don't take plannedWeek/plannedMonth.

One rough edge worth knowing about, and it's Marvin's, not ours: Marvin's docs
say the create response will include the new project's ID "in the future" —
meaning today a successful create can come back without one. When that happens
the tool reports created: true with idUnavailable: true and tells the caller
to look the project up rather than retry. It deliberately does not report an
error
, because the project was created, and an agent treating it as a
failure would retry and make a second one.

Why rename / move / delete still aren't exposed

Short version: Marvin's limited API can't do them, and the API that can is one
we're deliberately not touching.

The limited token's writes are create-task, create-project, create-event,
mark-done, time tracking, reward points, reminders, and habits. There's no
update or delete endpoint at all. Renaming, reparenting, or rescheduling
requires /api/doc/update and /api/doc/delete, which need a third
credential beyond the API token and the database credentials — and which
Marvin's own documentation warns about plainly: a wrong document shape "might
cause Marvin to crash on startup," and API deletes bypass Marvin's client-side
Trash, so "you won't be able to recover any documents deleted in this way."

Handing an autonomous agent a tool that can permanently destroy unrecoverable
data isn't worth a tidier CRUD surface. Edit and delete stay in Marvin's own
apps. The reasoning is now written down in
docs/architecture/marvin-client-and-mcp.md so it doesn't have to be
re-litigated from scratch.

Correcting myself on the test plan: several of these release notes have
listed "rename/move/delete propagation" as untestable because MCP lacks those
routes. That was wrong — the test never needed MCP. Rename or move something
in Amazing Marvin, then watch the plugin's incremental sync bring it into
the vault. That's both possible today and closer to how anyone actually uses
this.

How to test

  1. Update your MCP checkout and rebuild — the MCP server builds from this repo,
    not from the BRAT-installed plugin:
    git -C /path/to/obsidian-am fetch --tags
    git -C /path/to/obsidian-am checkout 0.11.0-beta8
    npm --prefix /path/to/obsidian-am ci
    npm --prefix /path/to/obsidian-am run build
  2. Ask your agent to create a project with marvin_create_project, then create
    a task inside it with marvin_create_task using the returned parentId.
    Confirm both land in Marvin.
  3. Note what the create returned: an id, or idUnavailable: true? Either is
    correct behavior — worth reporting which you got, since it tells us whether
    Marvin has shipped the ID in the response yet.
  4. The propagation test that was never actually blocked: in Amazing Marvin,
    rename a task, move it to a different category, then delete it — one at a
    time. After each, confirm the vault catches up (automatically within about a
    minute, or immediately via "Sync now").

Still genuinely uncovered

Reset-cache rehydration, and disabling incremental sync then running the
regular importer.

Feedback

Issue #55 for test
results; a new issue for anything that looks like a distinct bug.

0.11.0-beta7

0.11.0-beta7 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 26 Jul 21:59
a4feefd

What's in this beta

Two things, both from beta6 feedback.

refresh: true now tells you what it did

beta6 added an optional refresh: true parameter to marvin_categories and
marvin_children, asking the running plugin to sync before answering. But it
was a black box: the surrounding freshness/origin fields say where an
answer came from, not whether the requested refresh actually ran. A cache hit
that was newly synchronized and one that silently timed out and fell back
looked identical.

Reads that request a refresh now carry a refresh object:

"refresh": { "requested": true, "outcome": "synced", "waitedMs": 820 }
  • synced — the plugin's checkpoint advanced; this data is current
  • timed_out — the request was written, but no sync happened inside the
    window
  • skipped — nothing was attempted, with a reason saying why

That reason is the useful part when something's wrong: "no incremental cache
is configured for this server" is permanent, while "an earlier request is still
unclaimed, so nothing is listening" clears the moment Obsidian comes back.
Different decisions for a caller.

The object is absent entirely when refresh wasn't requested, so passive reads
are unchanged.

Incremental sync is now desktop-only at the runtime, not just in settings

beta5 hid the incremental sync settings section on mobile, because
full-database credentials are the wrong thing to type on a phone keyboard.
That was half a change, and the half I shipped was the worse one: plugin
settings sync between devices, so mobile kept running a background sync
with those credentials while having no UI at all to see its status, read its
errors, trigger a sync, or reset its cache.

An invisible background process with no controls is worse than not having the
optimization. Mobile now skips incremental sync entirely and uses the REST
importer, which works there and remains the default on every platform anyway.

If you'd rather have incremental sync on mobile, say so — the fix would be to
un-hide the settings and add a reveal toggle to the password field, which
addresses the actual credential-entry concern rather than removing the feature.

How to test

Refresh diagnostics

  1. Update your MCP checkout to this tag and rebuild — the MCP server builds
    from this repo, not from the BRAT-installed plugin:
    git -C /path/to/obsidian-am fetch --tags
    git -C /path/to/obsidian-am checkout 0.11.0-beta7
    npm --prefix /path/to/obsidian-am ci
    npm --prefix /path/to/obsidian-am run build
  2. With Obsidian open and incremental sync configured, call marvin_categories
    with refresh: true. Expect outcome: "synced" and a plausible
    waitedMs.
  3. Call it without refresh and confirm there's no refresh object at all.
  4. Quit Obsidian, then call with refresh: true twice. Expect timed_out on
    the first and skipped on the second, with a reason mentioning nothing
    listening — and correct REST answers throughout, not errors.
  5. Unset AMAZING_MARVIN_INCREMENTAL_CACHE_PATH, restart the server, and call
    with refresh: true. Expect skipped with a reason about no cache being
    configured.

Desktop-only gating (plugin only — the MCP server is a desktop Node process)

  1. On mobile, confirm the settings tab has no incremental sync section, and that
    the regular "Import categories and tasks" command still works there.
  2. If you have a desktop vault whose settings sync to mobile with incremental
    sync enabled: on mobile, confirm marvin-incremental-cache-v1.json isn't
    being created or updated. (The AmazingMarvin folder will still change on
    mobile if you run the regular importer — that's expected; it's the cache
    file and background syncing that should be absent.)

Still uncovered

Rename / move / delete propagation (the MCP doesn't expose those routes),
reset-cache rehydration, and disabling incremental sync then running the
regular importer.

Feedback

Issue #55 for
test results; a new issue for anything that looks like a distinct bug.

0.11.0-beta6

0.11.0-beta6 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 26 Jul 21:47
ae0c7fd

What's in this beta

One new capability for agent use, on top of beta5's settings overhaul.

MCP reads can now ask for a fresh cache

Until now the MCP server's use of the plugin's incremental cache was passive:
it used the cache if Obsidian happened to have synced it, and otherwise fell
through to REST. Fine for browsing, but not dependable right after you've
changed something — freshness depended on focus/interval timing.

marvin_categories and marvin_children now accept an optional
refresh: true parameter. When set, the MCP server asks the running
plugin to sync and waits briefly (default 5s, via
AMAZING_MARVIN_REFRESH_TIMEOUT_MS) before answering.

It's a per-call parameter, defaulting to false, because the caller is the
one who knows whether a given question needs current data ("did my task
land?") versus tolerating a cached answer ("what's in Work?"). Passive,
zero-latency reads stay the default.

How it works, and why: the MCP server drops a small request file next to
the cache file it already reads; the plugin polls for it, syncs, and clears
it. A file rather than a socket, deliberately — the plugin keeps sole custody
of the database credentials under either design, but this way nothing opens an
inbound network listener on your note-taking app and there's no shared secret
between the two processes.

It's best-effort, not a guarantee. If Obsidian isn't running, the plugin
is disabled, or the sync fails, the wait ends and the read answers from cache
or REST exactly as before. Repeated calls also won't pile up waiting on a
plugin that isn't answering — an unclaimed request file is treated as evidence
nothing is listening, so subsequent calls skip the wait until the plugin picks
up again.

Reminder from beta5: settings were reorganized

The settings tab is now grouped by what each setting does rather than by loose
verbs — Connection, Category and project import, Today's tasks,
Automatic refresh, How imported tasks are written, Sending changes
to Marvin
, then two collapsed Advanced sections. Incremental sync is
desktop-only. See the beta5 notes for the full list.

How to test

The new refresh parameter

  1. Update your MCP checkout to this tag and rebuild — the MCP server is built
    from this repo, not from the BRAT-installed plugin:
    git -C /path/to/obsidian-am fetch --tags
    git -C /path/to/obsidian-am checkout 0.11.0-beta6
    npm --prefix /path/to/obsidian-am ci
    npm --prefix /path/to/obsidian-am run build
  2. With Obsidian running and incremental sync configured, create a task in
    Marvin (or via marvin_create_task), then immediately call
    marvin_children with refresh: true for its parent. The new task should
    be there without you touching "Sync now" or waiting out the interval.
  3. Call the same tool without refresh and confirm it still answers
    instantly from cache.
  4. Quit Obsidian entirely, then call with refresh: true a few times in a
    row. The first call should wait out the timeout at most once; subsequent
    calls should return promptly rather than each waiting the full 5s, and all
    of them should still answer correctly via REST.
  5. Restart Obsidian and confirm refresh: true starts working again without
    any intervention.

Still uncovered

Rename / move / delete propagation (the MCP doesn't expose those routes),
reset-cache rehydration, and disabling incremental sync then running the
regular importer.

Feedback

Issue #55 for
test results; a new issue for anything that looks like a distinct bug.

0.11.0-beta5

0.11.0-beta5 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 26 Jul 21:36
4995fb4

What's in this beta

Mostly a settings overhaul, plus the last round's sync fixes confirmed working
by a real-vault test.

Incremental sync itself is unchanged since beta4: an opt-in alternative to the
REST importer that reads Marvin's CouchDB _changes feed instead of rebuilding
the whole imported tree. Off by default; the REST importer stays the default and
fallback.

Settings tab reorganized

A design critique pass found the tab had outgrown its structure — ~30 rows in
one scroll, two of them floating above any heading at all. It's now grouped by
what the setting actually does rather than by loose verbs:

  • Connection — the API token, finally under a heading
  • Category and project import — unchanged
  • Today's tasks / Automatic refresh — split apart. Background file
    rewriting was previously filed under what read like a display preference; it
    now has its own heading, because it's the highest-consequence thing here.
  • How imported tasks are written (was "Task formatting")
  • Sending changes to Marvin (was "Task creation") — now also holds "Mark
    tasks done in Marvin," which used to sit at the very top next to the API
    token as if it were part of setup
  • Advanced: incremental sync and Advanced: local server, both
    collapsed, both at the bottom

Specific fixes you may notice:

  • "Tasks to Show" is now "Tasks to include." It collided with "Show Due
    Date" 170 lines further down — one picks which tasks appear, the other
    which date fields appear, and the old names read as contradicting each
    other.
  • The three bare "Show Due/Start/Scheduled Date" toggles are now one "Dates
    to show" row
    with labeled checkboxes. They were the only rows in the whole
    tab with no description.
  • Settings that only apply to one metadata format now grey out instead of
    sitting there looking active. Same for the label prefix when labels-as-tags
    is off. Nothing new was hidden — a row that vanishes is a row nobody knows
    exists.
  • Two more instances of the bug that caused "there's no place to put the
    creds"
    : adding/removing an import root rebuilt the entire tab (collapsing
    both advanced sections), and a background sync could rebuild the tab while
    you were mid-typing in a credential field. Both now update in place.
  • "Remove" on an import root asks for a confirming second click — it
    silently un-imports a whole subtree, and the much safer "Reset cache" already
    had that guard.
  • Sentence case throughout, two copy errors fixed, and an invalid refresh
    interval now tells you it was rejected instead of silently ignoring you.

Incremental sync is now desktop-only

The settings section is gated to desktop, matching the local server section.
It asks for full-database credentials, and a phone — autocorrecting keyboard,
no reveal toggle on the password field — is the wrong place to type one.

Note: this hides the UI, it doesn't disable an already-configured sync. If
you set it up on desktop and your settings sync to mobile, the sync still runs
there. Say so if you'd rather it didn't.

Confirmed working since beta4

A tester verified the whole path in a real vault, which retires the "never run
in a real Obsidian vault" caveat these notes carried for four releases:

  • The beta3 MCP regression is gone — marvin_today, marvin_due,
    marvin_labels, marvin_create_task, and marvin_mark_done all work with a
    cache path configured.
  • A task created via MCP appeared in the cache and in AmazingMarvin/Inbox.md,
    then disappeared from both after completion and sync.
  • Window-focus auto-sync works without touching "Sync now" — about a 20-second
    round trip, both directions.

How to test

Settings (new this round)

  1. Open the plugin settings and read down the tab. Does the grouping make sense?
    Does anything feel like it's under the wrong heading?
  2. Expand "Advanced: incremental sync," toggle it on, and confirm the four
    credential fields enable in place without the section collapsing.
  3. With the settings tab open and the advanced section expanded, wait for a
    background sync (or switch focus away and back). The section should stay open
    and keep your cursor where it was.
  4. Switch "Items to import" to "Selected roots," add and remove a root, and
    confirm the advanced sections stay expanded throughout.
  5. Set "Metadata format" to a Tasks format and confirm "Put task title first"
    and "Date link format" grey out.
  6. Type nonsense into "Refresh interval" and confirm it tells you it was
    rejected.

Still uncovered

Rename / move / delete propagation (MCP doesn't expose those routes),
reset-cache rehydration, and disabling incremental sync then running the regular
importer.

Feedback

Issue #55 for test
results; a new issue for anything that looks like a distinct bug.

0.11.0-beta4

0.11.0-beta4 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 26 Jul 21:12
9537b29

What's in this beta

Opt-in incremental Amazing Marvin sync — an alternative to the REST importer
that reads Marvin's CouchDB _changes feed instead of repeatedly rebuilding
the whole imported tree. Off by default; the existing REST importer remains
the default and fallback either way.

  • Obsidian plugin: an "Experimental incremental sync" section in
    settings (collapsed by default — click to expand). Enabling it hydrates a
    local cache from Amazing Marvin's database, then keeps it current via the
    changes feed, updating only the notes that actually changed.
  • MCP server: marvin_categories/marvin_children can read the same
    cache the plugin maintains, skipping a REST round trip when it's fresh.
    Opt-in via an environment variable; no new credentials needed there.

Fixed since beta3

The MCP cache wrapper broke every other tool. With a cache path
configured, marvin_today, marvin_due, marvin_labels,
marvin_create_task, and marvin_mark_done all failed with
... is not a function — only categories and children worked. Cause: the
wrapper spread a class instance, and object spread doesn't copy prototype
methods. Now uses explicit per-method delegation, with regression tests
built on a real class fixture (the old fixture was an object literal, which
structurally could not catch this). Thanks to the beta3 tester who found and
diagnosed this precisely — see
#81.

MCP setup instructions were misleading. Updating the plugin via BRAT
does not update the repository checkout the MCP server is built from, so
setting the cache-path variable against an older checkout was silently
ignored — no warning, it just kept using REST. The README now spells out the
fetch/checkout/build steps and how to verify a real cache hit.

Fixed in earlier betas

  • beta3: the settings tab tore itself down and rebuilt on every toggle,
    so the credential fields rendered below the fold with no cue — the cause
    of "there's no place to put the additional creds." Fields now render in
    place; both experimental sections collapse by default.
  • beta2: database credentials now match Amazing Marvin's own API
    settings page (server, database name, user, password as four fields).

Known limitation: the plugin's note-writing path still hasn't been
exercised end-to-end in a real vault — the beta3 tester deliberately
stopped short of creating a test task, because the bug above had broken the
task-writing tools needed to clean it up afterward. That path (create /
rename / move / complete / delete propagation, cache reset, and the
REST-importer-still-works check) is the most valuable thing to test now.

How to test

Obsidian plugin

  1. In Amazing Marvin, go to the API settings page and find the database
    server, database name, user, and password (a different credential from
    the plugin's limited API token — these grant full database read access,
    so treat them accordingly).
  2. In Obsidian settings, expand "Experimental incremental sync," enable the
    toggle, and copy each of those four fields into the matching field.
  3. Click "Sync now" (disabled with an inline reason until all four fields
    are filled). Confirm the resulting notes match what the regular "Import
    categories and tasks" command produces.
  4. The priority test: in Marvin, create a task, rename it, move it to
    another category, complete it, then delete it — one change at a time.
    Confirm each lands in the vault within about a minute, or immediately via
    "Sync now" / the "Sync Amazing Marvin now (incremental)" command.
  5. Click "Reset cache" (twice within 4 seconds to confirm), then sync again
    — confirm it re-hydrates cleanly.
  6. Disable incremental sync and confirm the regular REST importer still
    works unchanged.

MCP server (for agent use)

  1. Update the checkout first. The MCP server is built from this
    repository, not from the BRAT-installed plugin — an older checkout has no
    code reading the cache variable and will silently ignore it:
    git -C /path/to/obsidian-am fetch --tags
    git -C /path/to/obsidian-am checkout 0.11.0-beta4
    npm --prefix /path/to/obsidian-am ci
    npm --prefix /path/to/obsidian-am run build
  2. Set AMAZING_MARVIN_INCREMENTAL_CACHE_PATH to
    <vault>/.obsidian/plugins/<plugin-id>/marvin-incremental-cache-v1.json
    (exists only after incremental sync has run at least once), alongside the
    existing AMAZING_MARVIN_API_TOKEN. Restart the MCP server/session.
  3. Call marvin_categories and marvin_children — a cache hit reports
    "freshness": "cached" and "origin": "local".
  4. Point the variable at a nonexistent file and confirm a clean fallback to
    "freshness": "fresh" / "origin": "public". Restore the real path.
  5. Now verify the beta3 regression is gone: with a valid cache path set,
    call marvin_today, marvin_due, and marvin_labels. All three must
    work and report origin: "public" (they intentionally never use the
    cache). marvin_create_task and marvin_mark_done should work too.

Feedback

Please leave test results on
issue #55.
For anything that looks like a distinct bug, open a new issue instead.

0.11.0-beta3

0.11.0-beta3 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 26 Jul 20:53
a6951e3

What's in this beta

Opt-in incremental Amazing Marvin sync — an alternative to the REST importer
that reads Marvin's CouchDB _changes feed instead of repeatedly rebuilding
the whole imported tree. Off by default; the existing REST importer remains
the default and fallback either way.

  • Obsidian plugin: a new "Experimental incremental sync" section in
    settings (collapsed by default — click to expand). Enabling it hydrates a
    local cache from Amazing Marvin's database, then keeps it current via the
    changes feed, updating only the notes that actually changed instead of
    rebuilding everything.
  • MCP server: marvin_categories/marvin_children can read the same
    cache the plugin maintains, avoiding a REST round trip when it's fresh.
    Opt-in and separate from the plugin toggle — set an environment variable,
    no new credentials needed.

Fixed since beta2: a real tester reported "there's no place to put the
additional creds." Traced it to the settings tab tearing itself down and
rebuilding on every toggle, with the newly-created fields landing below the
fold with no visual cue. The credential fields (and the Local Server
section) now always render and just enable/disable in place — no more
full-tab rebuilds. Both sections are also now collapsible, closed by
default, so they don't add to the scroll for anyone not using them. "Sync
now" and "Reset cache" also got basic guardrails (disabled until
credentials are complete; a second click required to confirm a reset).

Fixed since beta1: the database credential fields match Amazing
Marvin's own API settings page exactly — server, database name, user,
password as four separate fields, instead of one hand-assembled URI.

Known limitation: the plugin side has not yet been run inside a real
Obsidian vault by anyone other than beta testers reading this. It's been
verified end-to-end against a real local CouchDB instance and a real Marvin
database export, and every module has unit tests, but the actual "does it
render notes correctly in your vault" step still needs real testers. That's
what this beta is for.

How to test

Obsidian plugin

  1. In Amazing Marvin, go to the API settings page and find the database
    server, database name, user, and password (a different credential from
    the plugin's existing limited API token — these grant full database read
    access, so treat them accordingly).
  2. In Obsidian, open the plugin settings and find "Experimental incremental
    sync" — click it to expand. Enable the toggle and copy each of those
    four fields into the matching field — same server/database/user/password
    layout as Amazing Marvin's own page.
  3. Click "Sync now" (it stays disabled with an inline reason until all four
    fields are filled in). Confirm the resulting category/task notes match
    what the regular "Import categories and tasks" command produces.
  4. In Marvin (web, mobile, or desktop), create, rename, move, complete, and
    delete a task or category. Confirm each change lands in the vault after
    a sync (automatic — on window focus, roughly once a minute, and on
    network reconnect — or manual, via "Sync now" or the "Sync Amazing
    Marvin now (incremental)" command).
  5. Try "Reset cache" (click twice within 4 seconds to confirm), then sync
    again — confirm it re-hydrates cleanly.
  6. Disable incremental sync and confirm the regular REST importer still
    works exactly as before.

MCP server (for agent use)

  1. Get the plugin's cache file path: it's
    <vault>/.obsidian/plugins/<plugin-id>/marvin-incremental-cache-v1.json
    once incremental sync has run at least once.
  2. Set AMAZING_MARVIN_INCREMENTAL_CACHE_PATH to that path in whatever
    launches the MCP server for your agent (alongside the existing
    AMAZING_MARVIN_API_TOKEN) — no new credentials needed here, this is a
    read-only reader of the plugin's own cache file.
  3. Restart the MCP server/agent session so it picks up the new environment
    variable.
  4. Ask your agent to call marvin_categories or marvin_children and
    check the response — cache hits report "freshness": "cached" and
    "origin": "local"; a REST fallback (empty/missing/stale cache) reports
    "freshness": "fresh" and "origin": "public" as before.
  5. Everything else (marvin_today, marvin_due, marvin_create_task,
    etc.) is unaffected — only the two read tools above ever consult the
    cache, and only if you set the path.

Feedback

Please leave test results, questions, or anything that looks wrong on
issue #55
that's the tracking issue this beta implements. For anything that looks
like a distinct bug rather than feedback on this feature specifically,
open a new issue instead.

0.11.0-beta10

0.11.0-beta10 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 26 Jul 22:36
d23d653

Fixes the plugin author shown in Obsidian

Every beta since the org rename has credited Cloud Atlas in Obsidian's
plugin list, with the old cloud-atlas.ai link. Stable releases were already
correct — only betas were wrong, which is why it went unnoticed.

The cause: the rename commit updated manifest.json, but the beta build ships
manifest-beta.json, and that file kept the old name. It now matches, and CI
fails if the two manifests ever disagree on anything except the version they're
releasing, so this can't drift again.

Nothing else changed in this release — same functionality as beta9.

Why the plugin folder still says "cloudatlas"

The plugin's internal id is still cloudatlas-o-am, so the folder under
.obsidian/plugins/ keeps the old name. That's deliberate: the id is the folder
name, so changing it would orphan your install — settings, and the incremental
sync cache, all live in that folder, and you'd get a fresh unconfigured plugin.
It's also the handle other plugins and scripts use to reach this one's API. Not
worth breaking working installs over an identifier nobody sees.

How to test

  1. Update to 0.11.0-beta10 via BRAT.
  2. Open Settings → Community plugins and confirm "Amazing Marvin
    Integration" now shows Open Horizon Labs as the author, linking to
    openhorizonlabs.ai.

Carried over from beta9

Completed tasks stay in the managed Today region instead of being deleted on the
next refresh. If you haven't exercised that yet, it's the more interesting thing
to test:

  • Check a task off in Obsidian, let a refresh run, and confirm the line stays
    put and checked rather than vanishing.
  • Complete one in Marvin's app instead — same result.
  • Un-complete it in Marvin and confirm it goes back to an open checkbox.
  • Reschedule a still-open task to another day in Marvin; it should leave
    today's note.

Still uncovered

Reset-cache rehydration, and disabling incremental sync then running the regular
importer.

Feedback

Issue #55 for
incremental-sync results; a new issue for anything else.

0.11.0-beta2

0.11.0-beta2 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 24 Jul 15:19
c976448

What's in this beta

Opt-in incremental Amazing Marvin sync — an alternative to the REST importer
that reads Marvin's CouchDB _changes feed instead of repeatedly rebuilding
the whole imported tree. Off by default; the existing REST importer remains
the default and fallback either way.

  • Obsidian plugin: a new "Experimental incremental sync" section in
    settings. Enabling it hydrates a local cache from Amazing Marvin's
    database, then keeps it current via the changes feed, updating only the
    notes that actually changed instead of rebuilding everything.
  • MCP server: marvin_categories/marvin_children can read the same
    cache the plugin maintains, avoiding a REST round trip when it's fresh.
    Opt-in and separate from the plugin toggle — set an environment variable,
    no new credentials needed.

Fixed since 0.11.0-beta1: the database credential fields now match
Amazing Marvin's own API settings page exactly — server, database name,
user, password as four separate fields, instead of one hand-assembled URI.
Direct copy-paste now, reported by a beta1 tester within minutes of trying
it.

Known limitation: the plugin side has not yet been run inside a real
Obsidian vault by anyone other than beta testers reading this. It's been
verified end-to-end against a real local CouchDB instance and a real Marvin
database export, and every module has unit tests, but the actual "does it
render notes correctly in your vault" step still needs real testers. That's
what this beta is for.

How to test

Obsidian plugin

  1. In Amazing Marvin, go to the API settings page and find the database
    server, database name, user, and password (a different credential from
    the plugin's existing limited API token — these grant full database read
    access, so treat them accordingly).
  2. In Obsidian, open the plugin settings and find "Experimental incremental
    sync." Enable it and copy each of those four fields into the matching
    field in settings — same server/database/user/password layout as
    Amazing Marvin's own page.
  3. Click "Sync now." Confirm the resulting category/task notes match what
    the regular "Import categories and tasks" command produces.
  4. In Marvin (web, mobile, or desktop), create, rename, move, complete, and
    delete a task or category. Confirm each change lands in the vault after
    a sync (automatic — on window focus, roughly once a minute, and on
    network reconnect — or manual, via the "Sync now" button or the "Sync
    Amazing Marvin now (incremental)" command).
  5. Try "Reset cache" in settings, then sync again — confirm it re-hydrates
    cleanly instead of erroring.
  6. Disable incremental sync and confirm the regular REST importer still
    works exactly as before.

MCP server (for agent use)

  1. Get the plugin's cache file path: it's
    <vault>/.obsidian/plugins/<plugin-id>/marvin-incremental-cache-v1.json
    once incremental sync has run at least once.
  2. Set AMAZING_MARVIN_INCREMENTAL_CACHE_PATH to that path in whatever
    launches the MCP server for your agent (alongside the existing
    AMAZING_MARVIN_API_TOKEN) — no new credentials needed here, this is a
    read-only reader of the plugin's own cache file.
  3. Restart the MCP server/agent session so it picks up the new environment
    variable.
  4. Ask your agent to call marvin_categories or marvin_children and
    check the response — cache hits report "freshness": "cached" and
    "origin": "local"; a REST fallback (empty/missing/stale cache) reports
    "freshness": "fresh" and "origin": "public" as before.
  5. Everything else (marvin_today, marvin_due, marvin_create_task,
    etc.) is unaffected — only the two read tools above ever consult the
    cache, and only if you set the path.

Feedback

Please leave test results, questions, or anything that looks wrong on
issue #55
that's the tracking issue this beta implements. For anything that looks
like a distinct bug rather than feedback on this feature specifically,
open a new issue instead.