Memos Sync Plus

unlisted

by hiyukoim

Forked from ccinoo/obsidian-memos-sync

Sync memos from a Memos server into your vault, with tag filter, per-memo-file output, and tag-based folder routing. Fork of memos-sync.

1 starsUpdated 29d agoMIT
View on GitHub

Memos Sync Plus

A fork of RyoJerryYu/obsidian-memos-sync that syncs memos from a Memos server into your Obsidian vault.

Why this fork

I love Memos. It's so frictionless for capturing everything. Thoughts, links, half-formed ideas... that it became my default dump for anything that crossed my mind.

But over time I wanted those captures to integrate with my Obsidian notes, where I can connect them to my existing knowledge base and feed them into LLM workflows. The original plugin got me most of the way there, but I needed more control over where things landed: complex tag routing, per-memo files with stable identities, frontmatter I could annotate without losing on the next sync.

So I forked it, and here we are :)

What it does

One-way sync from a Memos server into your Obsidian vault. Two output modes:

  • Daily note mode (default) — memos are appended under a configurable header inside each day's daily note.
  • Per-memo file mode — each memo becomes its own .md file with managed frontmatter, optional folder routing by tag, and user-owned metadata that survives re-syncs.

Edit memos in Memos, annotate them with frontmatter in Obsidian. Syncing is Memos → Obsidian only; the plugin never writes back to the server.

Compatibility

  • Memos API: v0.19.x through v0.26.x (v0.27.x supported via REST path with improved diagnostics when the server is behind Cloudflare Access).
  • Daily note mode requires the official Daily Notes, Calendar, or Periodic Notes plugin. Per-memo mode has no daily-note dependency.
  • Desktop only.

Commands

CommandWhat it does
Sync memosIncremental sync since the last run.
Force sync memosRe-sync everything, ignoring the last-run timestamp. Also the trigger for orphan handling.
Force sync today's memosDaily-note mode only — re-sync memos for the day of the currently open daily note.

Output modes

Daily note mode

Appends each synced memo as a bullet under a configurable header inside that day's daily note.

Settings:

  • Daily memos header — the markdown header the plugin inserts under (e.g. ## Memos). Your daily-note template must include this header, otherwise the plugin has nowhere to insert.

Per-memo file mode

Writes one markdown file per memo. Each file has managed frontmatter (memo_id, created, memo_url), user-owned everything-else, and a stable ^<memo_id> block anchor at the bottom.

Filename pattern: YYYY-MM-DD-HHmm.md in the target folder, with numeric suffixes on collision (-01, -02, …).

Settings:

  • Default folder — where memos go when no routing rule matches.

Features (per-memo file mode)

Tag folder routing

Route new memos into different folders based on their tags. One rule per line, tag: folder. Evaluated top-down, first match wins; memos with no matching rule fall back to the default folder. Leading # is optional, matching is case-insensitive, Unicode-aware.

work: Memos/Work
読書: Memos/読書
projet: Memos/Projets
идея: Memos/идея
日記: Memos/Journal
papala: Song Writing Projects/Lyrics & Drafts/papala/Idea Notes/

Folder paths can contain spaces, mixed scripts, and as many /-separated levels as you want — the plugin creates the whole tree for you. Only the first : on a line separates the tag from the folder, so : is safe inside folder names too.

Routing only affects where new memos land. Existing memos update in place wherever they currently live (see Manual file moves).

Manual file moves respected

Move any synced memo file anywhere inside the configured scan scope and the plugin will find it again by frontmatter memo_id on the next sync. Useful when reorganising files, or when your routing rules change — old memos don't get migrated or re-routed.

Settings:

  • Scan folders — comma-separated folders (with descendants) the plugin searches for existing memo_ids. Leave empty to auto-derive from the default folder + all routing-rule folders.

    Example: Memos, Archive, Projects/Notes

User-owned frontmatter

The plugin owns exactly four frontmatter keys and rewrites them on every sync:

KeyMeaning
memo_idStable identifier the plugin uses to locate the file on later syncs.
createdISO timestamp of the memo's creation.
memo_urlDeep link back to the memo in the Memos web UI (v0.22+).
deletedISO timestamp added when the memo is detected as an orphan (see Orphan handling). Stripped on un-deletion.

Everything else in the frontmatter block is user-owned and preserved verbatim. Add your own tags:, rating:, source:, whatever — it survives re-syncs. The body (memo content + attachment links + ^<memo_id> anchor) is always overwritten from the server.

Server-side hashtags like #work live in the body, not in tags:, so Obsidian's tag pane picks them up natively while you keep full control of the tags: frontmatter list.

Memo URL backlink

Each synced file's frontmatter includes memo_url: https://<your-memos-host>/m/<uid>, a one-click jump back to the memo in the Memos web UI for editing. Requires Memos v0.22+; skipped on v0.19.x.

Orphan handling

When a memo is deleted on the Memos server, its corresponding local .md file is orphaned — the plugin never fetches it again, so the file sits silently stale. Orphan handling lets you opt in to doing something about it.

Orphan detection runs only during force sync (when the full server list is walked). Scope is limited to the configured scan folders. Nothing happens during regular Sync memos.

Options (setting: Orphan handling):

OptionWhat happens to orphan files
Keep (default)Nothing. Files stay as-is.
MarkPlugin adds deleted: <ISO> to managed frontmatter and appends a #memos-deleted hashtag to the body. File stays in place, shows up in Obsidian's tag pane for easy filtering.
DeleteFile is moved to the system trash (reversible via OS). Shown in a confirmation dialog listing affected files before anything is touched.

Additional setting (mark mode only):

  • Orphan marker tag — customise the hashtag (default memos-deleted).

Un-deletion recovers automatically. If a memo re-appears on the server (un-archived, or you recreate it and paste the same content), the next sync overwrites the local file as usual, which strips the deleted: key and the marker. No manual cleanup needed.

Tag filter

Applies to both output modes — controls which memos get synced at all.

Settings:

  • Include tags — comma-separated. Only memos carrying at least one of these tags are synced. Empty = sync everything.
  • Exclude tags — comma-separated. Memos carrying any of these tags are skipped. Applied before include (exclude wins).

Leading # is optional, matching is case-insensitive, Unicode-aware.


Memos API settings

  • Memos API version — pick the range matching your server. Routes internally to the right REST/gRPC adapter.
  • Memos API URL — e.g. http://localhost:5230. No trailing slash needed.
  • Memos API token — create one from the Memos UI under Settings → My Account.

Attachment folder

Where downloaded attachments go. Default Attachments.


FAQ

Can I edit memos in Obsidian and push back to Memos?

No — sync is one-way (Memos → Obsidian). Any body edits you make in Obsidian will be overwritten on the next sync. Use the memo_url frontmatter link to jump back to the Memos UI for editing.

What happens if I move a memo file to a different folder?

Nothing breaks — as long as the destination is inside the configured scan scope, the plugin finds the file again by memo_id and updates it in place. Routing rules only apply to memos the plugin has never seen before.

Will my Obsidian-added frontmatter survive a sync?

Yes. Only memo_id, created, memo_url, and deleted are managed by the plugin. Any other keys (including a user-added tags: list) are preserved verbatim.

How do I find all orphan files?

Set Orphan handling to Mark, then click Obsidian's tag pane and filter by #memos-deleted — or run a search query for tag:#memos-deleted.

"Failed to find header for xxxx"

Daily-note mode only. The plugin inserts memos under a specific header; if your daily-note template doesn't include it, there's nowhere to insert. Either update your template, or switch to per-memo file mode.


Credits

For plugin developers

Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.