askMyu

approved

by askMyu

Capture your journal notes to askMyu, encrypted before they leave, and read your day beside your vault. - This plugin has not been manually reviewed by Obsidian staff.

34 downloadsUpdated 16d agoApache-2.0

askMyu — Obsidian plugin

Capture your journal notes to askMyu, encrypted before they leave, and read your day beside your vault.

Working home: packages/obsidian in the askmyu-frontend monorepo. The public mirror (AskMyu/askmyu-obsidian-plugin) carries the same source plus the three release artifacts — main.js, manifest.json, styles.css.

What it does

  • Prep. A pane with Myu's read before each meeting — the signal, the read, the one move — claims rendered exactly as the server gated them. Unresolved meetings ask who is this? ▸ instead of guessing.
  • Chat. Talk to Myu beside your notes: about a note, a selection, a person's card, a prep. First-class conversation, same contract as the web app.
  • Live Today. The brief, the meeting rail, the week, the monthly mirror — refreshed ambiently, updated live over SSE, cues as pane rows (never popups).
  • Capture (B1). Notes in the folders you choose are encrypted on this device and sent to askMyu when they go quiet. One note stays one entry, however many times you edit it. Notes keep their own dates, so backfilled history arrives as history.
  • Meeting notes (opt-in, separate consent). Notes in folders you choose (or tagged myu-meeting: true) become meetings Myu understands — decisions, owners, follow-ups. This content is processed on askMyu's servers like every meeting source (it is not end-to-end encrypted like journal capture) — the consent screen says exactly that before anything is shared.
  • Save to vault (opt-in, per item). A composition as an Obsidian .canvas; a conversation as a note. Always behind an exposure warning, never automatic, always marked myu-generated: true so everything Myu ever wrote stays one search away.
  • The canvas talks back. A decision, a prompt, an action pressed on a canvas card is recorded the way the web records it, and Myu answers in the conversation. Expired canvases say so and offer Refresh; canvases Myu makes while you are elsewhere are offered as rows (in the thread and in Today), never opened on you. Undo, past canvases, and a reply 👍/👎.
  • Help Myu. People Myu cannot place — a LinkedIn to confirm, a possible duplicate — appear as rows in Today, each one decision. Cards show what is around a person (related people, memories, where a memory came from), and "what's up with X" on demand.
  • Weave Myu in. Settings → Weave Myu in → Open the recipes: embeds for your daily and weekly notes, a Tasks query for your commitments, the people table, a Dataview table, a button to Today — each a code block with a copy button, the text in view. Insert a Myu snippet… puts one at the cursor. Nothing is written to your vault unless you press Keep a copy in Myu/. For scripts: app.plugins.plugins.askmyu.apigetBrief(), getPrep(id), getPersonCard(name), getWeeklyReview(); read-only, null while locked.
  • Connections, in place. Google and Microsoft accounts with Set primary and Disconnect per account; Slack and Zulip connect and disconnect from settings.
  • Entities (B2). [[Marcus Webb]] in a note is a person-tag, for free. The plugin passes the names as hints; it never decides who anyone is.
  • Today (B3). A right-sidebar pane with the brief and the day's meetings, in your theme. It refreshes every five minutes and otherwise sits still.

Six questions, answered

  • Can I self-host, or use it offline? No self-hosting: one server, myu.askmyu.com, and that is the only remote host the plugin talks to. Offline, everything Myu already wrote into your vault still opens (it is plain markdown, .canvas and .base); capture pauses and catches up when the connection returns.
  • What exactly is sent? Only notes in the folders (or tags) you chose, encrypted on this device before they leave with a key your devices hold — plus the requests listed under "Network use" below. No telemetry, no third-party analytics.
  • Can I exclude my journal, or any note? Yes: share only the folders you choose (nothing is preselected), and any single note opts out with myu: false in its frontmatter.
  • Will it touch my existing notes? No. Myu writes only inside its own folder (Myu/ by default). Your notes are read (when shared) and linked to, never edited.
  • Can I change the folder? Yes — one folder, renameable in settings; everything Myu writes lives under it, every file marked myu-generated: true.
  • How do I delete my data? "Remove everything Myu wrote" (settings, or the command) sends every generated file to the trash; "Delete my account" removes everything the server holds; "Export everything" and "Request my data archive" get you a copy first.

What it will not do

  • No toasts. Notice is used for errors and status only, never to tell you something about a person. Obsidian is a desk, not a notification channel.
  • No writes into your vault until you ask. Everything Myu writes is opt-in behind its own consent screen, lands under one folder you choose (default Myu/), and carries myu-generated: true frontmatter so everything Myu ever wrote stays one search — and one delete — away. Myu never writes into notes you authored: not your daily notes, not your People/ pages, not your templates. It links to them. Card views are ephemeral panes.
  • No reading before you choose. The vault watcher is not registered while the shared-folder list is empty. Not "registered and skipping" — not registered.

What survives if you uninstall

Everything. That is the point of writing files.

  • Every file under Myu/ stays exactly as it is — people, companies, journal, meetings, calendar, commitments, canvases, conversations. None of it needs the plugin to open: markdown, .canvas (an open standard), .base (an Obsidian core feature). They stop refreshing; nothing breaks.
  • Your own notes were never touched. Myu links to them; it does not write into them.
  • The plugin's data.json goes with the plugin — your plugin token and wrapped key. No custody is left on this device.
  • Your account is untouched. Delete it from Settings → askMyu → Delete account, or on the web.

Export everything

Two doors, for two different things:

  • Export everything into the vault (Settings → askMyu → Advanced, or the command) — every surface regardless of your toggles, every conversation as a note, every canvas that still exists on the server, and a receipt at Myu/Export.md saying what landed, what could not, and what was never vault material.
  • Request my data archive — what no vault file can carry: your account, devices, keys, consents, and everything the server holds, as one encrypted zip. The link is emailed when it is ready; the passphrase is shown once and never stored.

Encryption, plainly

Your notes are encrypted on this device before they leave, with the same key your other askMyu devices use.

At rest, that key is split: this device holds it wrapped under a key it does not have, and the server holds the wrapping key with nothing to wrap. Neither half is useful alone. On start-up the plugin fetches the wrapping key over your session, opens the blob in memory, and keeps it there — nothing raw is ever written to disk.

Consequences worth knowing before you install:

  • Offline start-up stays locked. No network, no key, so capture pauses with a badge until you reconnect. This is the price of not keeping a usable key on disk, and we would rather pay it than pretend.
  • Every unlock leaves a receipt and can be revoked. Removing this device in askMyu deletes the wrapping key, which makes the local blob permanently inert — a working remote wipe, not a promise.
  • Obsidian has no plugin sandbox. Any plugin you install can read any other plugin's files, including this one's data.json (which holds your token and the wrapped blob). We designed around that as far as it can be designed around; we cannot design around a plugin that hooks the browser's crypto before we load. That is true of every plugin you install, and we would rather say it.

Capabilities (what the plugin accesses)

  • Network — only the askMyu backend you configure; every endpoint is listed below.
  • File system — the vault, through Obsidian's Vault API only: reads the notes and folders you allow in Settings → What Myu can read; lists the vault's file paths (never their contents) to find your own person pages and the files Myu wrote; writes only under the Myu/ folder (and Myu/Canvas/, Myu/Conversations/) after your explicit consent, plus one CSS snippet in your vault's config folder (.obsidian/snippets/myu-look.css) when you press Install the look — removable from the same row. Never outside the vault.
  • Clipboard — user-initiated copies only: your recovery phrase (the key ceremony) and a recipe from the Weave Myu in pane (the copy button on its code block). Nothing is read from the clipboard except to clear the phrase you just copied.
  • Account — required. askMyu is a service; the plugin is a client for it.
  • Pricing — free during the beta. Creating an account means agreeing to the Beta Participation Terms and the Privacy Policy: a checkbox at the door, and the backend records which version you agreed to. An account that has not agreed yet sees one screen asking, and nothing else, until it does.

Network use (full disclosure)

Obsidian's developer policies require network use to be disclosed; here is all of it. The plugin talks ONLY to the askMyu backend you configure (default myu.askmyu.com) — no third-party services, no analytics endpoints, no CDN.

Links that open in your browser, never fetched by the plugin. A few buttons hand a page to your browser: the beta terms and privacy policy on askmyu.com, the askMyu web app (Google sign-in, subscription), the look snippet on github.com, and a person's LinkedIn profile from their card or the Career row. Each opens only when you press it; the plugin itself never requests those sites. The LinkedIn address also appears as placeholder text in the fields that ask for one.

Base64 is how ciphertext and keys travel. Encrypted notes, wrapped keys and the device-transfer blob are binary; the plugin base64-encodes them into JSON for the wire and decodes them back. That is the only use of base64, and none of it hides anything: the bundle ships unminified, and every endpoint is listed below.

There is no client-side telemetry in this plugin. It does not measure, count, or report your use of it, and there is no toggle to turn on — the capability is absent, and a build check (pnpm verify) fails if any module outside the transport layer opens a network connection at all. askMyu's servers record their own API usage the way any service does; that is described in the privacy policy.

Account, keys and sign-in

endpointwhencarries
POST /account/plugin-token/exchangeconnect + every app startyour plugin token
POST /account/plugin-token/createafter sign-innothing outbound but the request
POST /account/session/escrow-keyevery unlockyour content key, to your session
POST /account/device/kek/store · kek/getdevice setup · each unlockthe wrapping key (split custody)
POST /account/device/transfer-request · -approve · -denydevice approvalECDH public keys; the 4-digit code
GET /account/device/transfer-pending · -receivedevice approvalrequests only
GET /account/recovery/wrapped-keyrecovery-phrase unlockrequests only
POST /account/recovery/setuprecovery ceremonyyour key wrapped under the phrase — the phrase never leaves this device
POST /account/createin-plugin signup (password door)email, name, password, the terms version you agreed to
POST /auth/magic-link/request · GET /auth/magic-link/validatein-plugin signupemail, name, the terms version you agreed to; then the emailed single-use token
GET /termsopening the Create-account doornothing — public; it says which version the door shows
POST /account/terms/acceptthe "Before you start" screenthe terms version you agreed to
POST /account/background-work/setsettings toggleyour choice

What you share

endpointwhencarries
POST /journal/addjournal captureyour note, encrypted on this device
POST /meetings/ingest_notemeeting-note capture (opt-in)the note, plaintext by disclosed consent
POST /journal/add · POST /journal_chats/addchatyour messages (+ any note or selection you seeded)

Reading your day

endpointwhencarries
GET /feed/brief · /review/weekly · /initiative/mirror · /card/selfToday pane (5-min ambient)requests only
POST /calendar/eventsToday + calendarthe date range
GET /prep/meeting · POST /prep/subject/linkprep panethe event id; the link you choose
GET /feed/entities · /feed/entities/search · /card/person · /card/companylookups + cardsyour queries
POST /card/board-litea card's extra takesthe entity id
POST /card/identity/confirm · /v2/relationships/linkedin/suggestion/resolvecard confirm ▸ / disambiguationthe identity you picked
GET /memories/relationship/{id}person pagesthe relationship id
GET /meetings/list · /meetings/getmeeting historyrequests only
GET /journal/get · /journal_chats/getjournal historyrequests only — entries decrypt on this device
GET /composition?id=save-to-vaultthe composition you asked for
POST /initiative/pattern-feedback/submitthe mirror's confirmyour yes or no
POST /composition/interaction · /composition/refresh · /composition/historya canvas card pressed; Refresh; Past canvasesthe card and choice you pressed (composition + component ids, the option label); requests otherwise
GET /feed/help-myu · /feed/related-persons · /feed/related-memories · /feed/entities/dispatch · /feed/search · /card/source-detailToday's Help Myu; a card's "around them"; "what's up with X"; Search Myu; "where this came from"ids, or the words you typed into search
POST /feed/entities/dismiss · /relationships/merge (reject) · /v2/relationships/linkedin/{id} (unlink)dismissing a dispatch; "Not the same"; Unlink LinkedInthe ids involved
POST /meetings/add-decision · /meetings/add-commitment · GET/POST /meetings/drive/* · POST /meetings/import/drivea bullet you type under a meeting note's Decisions/Commitments; Drive importthat bullet's text (and owner); the Drive file ids you choose
GET /personal_loop/get · POST /feedback/signal · POST /feedback/submitToday's loop strip and its 👍/👎; a reply's 👍/👎; Send feedbackyour rating; your feedback text, the build number, and (for a reply) the conversation id — never a screenshot, never your notes
GET <origin>/sse/getlive updates (streaming)nothing outbound; events inbound

Myu's folder (opt-in)

endpointwhencarries
POST /vault/commitmentsMyu's foldernothing outbound but the request
POST /vault/interactionMyu's folderwhich Myu checkbox you ticked (ids + that line, never your own notes)

Telling Myu who you are, and connecting sources (all opt-in)

endpointwhencarries
GET /account/state/check · POST /account/state/updateonboardingyour onboarding answers
GET /linkedin/seek · POST /account/career/updateonboarding arcthe LinkedIn profile you chose
GET /onboard/current_employment · POST /onboard/current_employment_confirmonboarding arcyour confirmation
POST /resume/uploadonboarding arc (optional)the resume file you chose
POST /onboard/classify_career_momentonboarding momentwhat you wrote
POST /oauth/google/init · /oauth/microsoft/init (scope_set, return_to in the query)connect (opt-in) — calendar, mail and meeting notes each on their own when the server splits consentnothing outbound; consent happens in your browser
GET /oauth/google/status · /oauth/microsoft/status · /slack/connections · /zulip/connectionssettingsrequests only
POST /oauth/{google,microsoft}/disconnect · /oauth/{google,microsoft}/credential/set-primary · /slack/connect · /slack/disconnect · /zulip/connect · /zulip/disconnectsettings, when you press themthe account/connection you chose; for Zulip the realm, email and API key you entered (sent once, kept on the server)
POST /account/update · GET /account/careersettings → Accountyour name; requests only
GET/POST /email/generic/*IMAP source (opt-in)the mail-server credentials you entered
GET/POST /calendar/caldav/*CalDAV source (opt-in)the calendar credentials you entered
POST /calendar/ical/add · POST /calendar/ics/uploadcalendar link or file (opt-in; settings → Connection, or the offer in the welcome canvas)the private iCal address you pasted, or the .ics file you chose
GET /featureson sign-inrequests only (which server-side features are on)
POST /composition/career-trajectoryafter you confirm your LinkedIn readrequests only (asks for the career canvas)

The plugin also registers six obsidian:// URL verbs — myu, myu-prep, myu-card, myu-chat, myu-signin, myu-connected — so askMyu's emails and its web sign-in page can open the right pane. Mail clients strip custom-scheme links, so emails link an HTTPS page on the askMyu backend that fires the verb; no data rides those links beyond the meeting id or name in the URL itself, and the sign-in verb carries a single-use token that expires in five minutes.

Development

pnpm install
pnpm --filter @askmyu/obsidian dev          # esbuild watch → main.js
pnpm --filter @askmyu/obsidian type-check
pnpm --filter @askmyu/obsidian lint
pnpm --filter @askmyu/obsidian test         # behavioural QA invariants
pnpm --filter @askmyu/obsidian verify       # structural QA invariants
pnpm --filter @askmyu/obsidian build        # production bundle

pnpm verify enforces the structural invariants, including the two that keep this plugin listable: all network egress goes through src/transport/ (so client-side telemetry cannot be added by accident — Obsidian's developer policies forbid it), and no module assigns HTML as a string.

Turn on Settings → askMyu → Use mock backend to run the whole unlock path against an in-memory stand-in, including its failure modes.

To test in a real vault, symlink the package into it:

ln -s "$PWD" "$VAULT/.obsidian/plugins/askmyu"

then enable askMyu in Community plugins (Restricted Mode off).

Styling Myu

Everything Myu renders carries a stable myu-* class — .myu-voice (Myu's words), .myu-whisper (quiet labels), .myu-chat-block, .myu-canvas-component, .myu-affordance (buttons) — so you can restyle Myu's panes with an ordinary CSS snippet, the same way you style any plugin. The plugin itself never overrides your theme.

One look ships with the plugin: snippets/myu-look.css — Myu's own identity, the web app's accents, a serif voice. Settings → askMyu → Advanced → Myu look → Install the look writes it into your vault's config folder (.obsidian/snippets/myu-look.css) and turns it on; the same row turns it off, updates it after a plugin update, or removes it. Nothing is fetched: the look for the build you are running is the look it installs. The file is yours after that — edit it (the row will not overwrite an edited copy without asking), or take the raw file from https://github.com/AskMyu/askmyu-obsidian-plugin/raw/main/snippets/myu-look.css and manage it by hand.

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.