- Brand
- Hjarni
- Category
- Productivity
- Primary Subcategory
- Personal AI Memory & Second Brain
Integration details
Description
Hjarni is a knowledge base your AI can actually use. Write notes in Markdown. Organize them in folders and tags. ChatGPT reads them directly through a built-in MCP server. No plugins. No pasting the same context into every conversation. ChatGPT starts every conversation from zero. Connect Hjarni once and it stops asking. Ask questions across all your notes. Have ChatGPT write new notes, update old ones, and tag them the way you want. Set instructions per folder to control how ChatGPT writes, formats, and tags. Share a folder with your team so everyone's AI works from the same knowledge base. Search across everything in one call. Built on the same open MCP standard as Claude, so your knowledge base is not locked to one assistant. Use it as your second brain, your project memory, your research library, or your team's shared context. Notes, folders, tags. That is the product. Simple on purpose. Free to start. No credit card required.
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- Personal AI Memory & Second Brain
- Secondary Subcategories
- None listed
- Brand
- Hjarni
- Access
- Account required
- First tracked
- 2026-08-26
- Tool count
- 41
- Market
- US
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is listed.
Your score is coming
ChatGPT now suggests Plugins on its own when they match a user's request.Your Plugin Discovery Score measures how often yours appears, and it will show here as soon as it’s ready.
What discovery looks like

Get alerts for Hjarni Notes
Get updates when Hjarni Notes’s Discoverability Score or category rank changes.
Competing in ChatGPT Personal AI Memory & Second Brain
View Category41 tools agents can invoke
Fetch a file from a public URL or a native ChatGPT file reference and attach it to one of your personal notes (personal notes only; for team or shared notes use files-create_upload_url). Required: note_id and either url or file. In ChatGPT, prefer file for an available file reference, including generated or processed files when ChatGPT can provide one. ChatGPT supplies the temporary download URL and file ID; never invent them, pass a local file path, or encode the bytes as base64. If both sources are supplied, a non-empty file reference takes precedence; an all-blank file placeholder is ignored. Follows up to three redirects. Optional: filename (overrides reference metadata, otherwise derived from URL), content_type (overrides reference metadata, otherwise from HTTP response), description. When no reference or public URL is available, use files-create_upload_url.
files-attach_from_url
Attach a file to one of your personal notes via base64-encoded data (personal notes only; for team or shared notes use files-create_upload_url). Prefer files-create_upload_url for large files to save tokens. Required: note_id (integer), filename (string), data (base64 string). Optional: content_type (MIME type, default: application/octet-stream), description.
files-attach
Check the status of a file upload created by files-create_upload_url. Returns status: 'pending' (not uploaded yet), 'completed' (file attached, includes file metadata), or 'expired' (link timed out). Required: token (string, from files-create_upload_url response).
files-check_upload
Create a new container (folder) for organizing notes. Required: name (string). Optional: emoji (one emoji shown as the folder's icon in place of the folder glyph, e.g. 📦), description (string), negative_space (string — what does NOT belong in this folder, so notes can be routed away from it), parent_id (integer or null) for nesting inside another container — null or omitted creates it at the top level (so does the space's root id: the root is not a folder, and the response then reports parent_id null), team_id (integer) to create the container in a team instead of personal space. When team_id is set, parent_id (if provided) must belong to the same team. After creating, consider setting up LLM instructions with instructions-update.
containers-create
Create an email capture address. Anything mailed to the returned address becomes a note in the chosen folder, with the subject as the title and attachments carried across. Optional: container_id (integer or null — null or omitted files into the Inbox), label (string — defaults to the folder's name and becomes the first part of the address), tags (string, comma-separated, added to every note alongside the automatic 'email' tag). Tell the user the address once and remind them it is a secret anyone can write to the folder with.
email-addresses-create
Generate a one-time upload link for attaching files to a note. Share the upload_url with the user so they can upload directly in their browser, which saves tokens by avoiding base64 encoding. Some clients also render this result as an inline drop-zone the user can drop files into; you cannot detect that, so always share the link either way. The link expires after 30 minutes and accepts up to max_files_per_upload files per request, each up to max_file_size_bytes; when remaining_bytes/remaining_files are present the whole batch must also fit inside those. Use files-check_upload to verify completion. Required: note_id (integer). Optional: description.
files-create_upload_url
Create a note in the connected user's personal Hjarni account, an authorized shared folder, or a team workspace they belong to. The server enforces write access. Approaching or reaching a note quota may email an account-limit notification to the account or team owner; sent emails cannot be recalled. Required: title (string). Always include a 2-3 sentence summary too (required by convention, even though the schema only enforces title) so the note is useful to future LLM sessions. Optional: body (Markdown with [[id:Note Title]] wiki-links), summary, source_url, container_id, tag_list (comma-separated), team_id (to create in a team), review_after (ISO 8601 datetime, only set this for time-boxed notes that should flag themselves stale after a date). A new note starts verified (status 'active'). Search for an existing note on the topic first and update that instead when there is one. Example: {title: 'Meeting Notes', body: '## Agenda\n...', container_id: 5, tag_list: 'meetings, q4'}.
notes-create
Create a new tag. Check tags-list first to avoid duplicates. Required: name (string). Tag names are automatically lowercased.
tags-create
Create a new team owned by the user (they become the owner). Required: name (string). Optional: ref — set to "assistant_suggestion" ONLY when creating in response to the me → suggestions.create_team offer, so the creation is attributed to that surface; omit it when the user asked to create a team unprompted. A user can own at most 3 free teams: at that limit this returns an error naming the teams they own and asking them to delete one — relay it rather than retrying. Returns join_url: a shareable link that lets teammates join themselves, with join_link_expires_at and join_link_uses_remaining. Offer that link FIRST — most people cannot recall a colleague's address mid-conversation — and use teams-invite when the user names a specific address.
teams-create
Move a folder to Trash within the connected user's personal Hjarni account or an authorized team workspace, taking its sub-folders and their notes with it as ONE recoverable unit. Restorable with containers-restore for 30 days, then permanently removed. This is a real delete (the folder leaves every listing); to retire a folder while keeping it browsable in the Archive, use containers-update with archived: true instead. Team folders require the editor role on every folder the delete touches. Required: id (integer).
containers-delete
Move a note to Trash within the connected user's personal Hjarni account or an authorized team workspace. This is RECOVERABLE — the note (with its body, attachments, and history) is restorable with notes-restore until its purge date (default 30 days); it is not an immediate permanent erase. Deleting the wrong note can be undone with notes-restore. Works on your own personal notes and on team notes where you have the editor role. You cannot delete notes in a shared container (only the owner can). Required: id (integer).
notes-delete
Dismiss a nudge served in the `me` payload, on the user's behalf, so it stops appearing on every surface (including the web app). Call this ONLY when the user has actually declined the suggestion or asked not to be reminded — never on mere silence; ignored nudges are already frequency-capped server-side. Required: key (string, the `nudge.key` from `me`). Idempotent.
nudges-dismiss
Get a single container by ID, including notes_count, children_count, description, negative_space (what does NOT belong in the folder), and LLM instructions if set. Optional: include_tree (boolean) to also get ancestor chain and children. Required: id (integer). A row flagged root: true is the space's root (the notes filed outside any folder), which containers-update refuses; set that space's instructions with instructions-update instead.
containers-get
Get an overview of the user's Hjarni account: counts of notes, containers, tags, and inbox items, plus recent_notes (the 5 most recently created personal notes) and recent_changes (the 5 most recently edited notes across ALL spaces — personal, teams, and shared containers — newest edit first). Use recent_changes to orient at the start of a conversation on what changed lately everywhere. No parameters required.
dashboard-get
Get a time-limited download URL for a file attached to a note. Share the URL with the user to download in their browser. The URL expires 15 minutes after it is issued (see download_url_expires_at in the response); request a fresh one rather than reusing an old URL. It requires no login while valid, so treat it as a credential. Required: note_id (integer), file_id (integer, from notes-get response).
files-get_download_url
Get LLM instructions at the specified level. Call with level 'brain' early in conversations to learn user preferences. Optional: level ('brain'|'personal_root'|'container'|'team'), defaults to 'brain' if omitted or blank; the response echoes resolved_level and defaulted_level (true when the level was defaulted). Optional: id (integer, required for 'container' and 'team' levels). 'container' level takes a personal (or shared) container id and returns the full inheritance chain, outermost first; each entry carries a `level` field ('brain'|'personal_root'|'team'|'container'). Team container ids are not addressable here — read a team note's chain from notes-get, or the team's own instructions with level 'team'. For an agent token, level 'brain' also returns agent_instructions, written by its person for that agent alone; brain_instructions_off: true means its person kept their brain instructions from it.
instructions-get
Get a single note by ID, including its full Markdown body, tags, container path, linked notes (every note it links to or is linked from), backlinks (the subset that links to it), file attachments, and inherited_instructions — every user-written LLM instruction layer that applies to the note, outermost first (an inbox note still carries brain plus its space root), so no separate instructions lookup is needed before editing. A missing brain entry means the user has no custom brain instructions; the defaults come from instructions-get with level 'brain'. A note in Trash returns a status: 'trashed' summary (id, title, purge deadline, how to restore) instead of its content — restore it with notes-restore to read or edit it. Required: id (integer).
notes-get
Get team details including the 10 most recent notes. Required: id (integer).
teams-get
Get the connected user's profile, onboarding state, team memberships, and note quota in a single call. Call this once at the start of a conversation so you can greet the user by first name, run the onboarding script only when needed, route notes to the right team space, and avoid suggesting features their account does not include. Returns onboarding.completed (boolean) and onboarding.missing_steps (array of 'connect_mcp' | 'first_note'), which together tell you what, if any, setup is left. May include a `nudge` (key, message, url) — one frequency-capped suggestion; see the NUDGES section of the server instructions for how to handle it. Exposes the user's email address — same data the user sees in account settings, but never billing or token metadata. No parameters required.
me
Open a note in the Hjarni note panel beside the conversation, where the user can read it, edit the title and body, and save. Use it when the user asks to open, show or work on a specific note; find the id with search first. Returns the same data as notes-get (including body and lock_version), plus space (personal, team or shared), can_edit and uri. Clients without panels get just that data. Without an id the panel opens on a note picker. The user may edit the note in the panel: before changing it with notes-update, pass expected_lock_version from your latest read. Optional: id (integer).
notes-open
Used only by the ChatGPT composer's @-mention picker: returns the user's notes matching a typeahead query as selectable resources, each with its space and folder as a subtitle. Assistants should use search instead. Required: query (string, may be empty for recent notes).
notes-search_mentions
Get a teammate into a team (team owner only), two ways. Required: team_id (integer, from teams-list). WITH email: emails an invite to that address. WITHOUT email: returns join_url, a shareable link anyone can open to join themselves, plus join_link_expires_at and join_link_uses_remaining. Prefer the LINK unless the user names an address — few people can recall a colleague's address mid-conversation, and asking is where teams stall at one member. Give the link to the USER to share; never post it anywhere yourself. Creating a link REPLACES any existing one, so to repeat a link already shared, read join_url from teams-get instead of calling this. Optional: action ('create' (default) | 'revoke').
teams-invite
List containers (folders) for organizing notes. Each container includes notes_count and children_count. Returns a JSON array, followed by a line stating the total for the folders it pages through and whether more pages remain; folders shared WITH you are appended in full on the first page and counted separately in that line. Optional: team_id (integer) for team containers, scope ('roots' default|'all'|'archived'), page, per_page. Shared containers are automatically included when listing root-level personal containers. The space's root (the personal root, or a team's root folder) is not a folder: it holds the notes filed outside any folder and cannot be renamed, moved, archived or deleted. It is left out of the default 'roots' scope and appears under 'all' flagged root: true.
containers-list
List the user's email capture addresses. Mail sent to one of these becomes a note in the folder it is bound to. Each entry has id, label, address, destination (folder name, or 'Inbox'), container_id, team_id, tags, notes_count and last_received_at. Returns an empty array when the account has none, and accepting_mail: false when mail sent to them is currently being dropped. Treat every address as a secret: it is a write credential for that folder, so never put one in a note, a summary, or anything shared.
email-addresses-list
List and browse the user's saved notes — their stored knowledge and memories (preferences, workflows, projects, meeting notes, references, and the rest) — with optional filtering, sorting, and pagination. Use search instead when hunting for a topic or keyword; use this to enumerate a folder, tag, or scope. Returns paginated results as a JSON array, followed by a line stating how many notes matched in total and whether more pages remain — read it to know if you have the whole folder before acting on it. Optional: team_id (integer) to list team notes, scope ('active'|'archived'|'inbox'|'favorited'|'trashed'), container_id (integer) with include_nested (boolean), tags (array of strings, AND logic), tag_ids (array of integers, AND logic), summary_stale (boolean, filter to notes with outdated summaries), stale (boolean, filter to notes whose freshness is stale — past their review_after date or unverified for a while), sort ('recent'|'oldest'|'title'), page (integer, default 1), per_page (integer, max 100, default 25), include_body (boolean, default false — include each note's full body, so a scoped/paginated listing can retrieve complete contents without a notes-get call per note; withheld for trashed notes, same as notes-get), include_instructions (boolean, defaults to include_body — include each note's inherited_instructions, the same chain notes-get returns, so a full-body listing also carries the rules governing those notes; withheld for trashed notes). container_id can be combined with team_id to list a specific team container. Example: list ruby-tagged notes in a container: {container_id: 5, tags: ['ruby']}.
notes-list
List all tags with their notes_count. Returns a JSON array, followed by a line stating the total and whether more pages remain. Optional: page (integer), per_page (integer).
tags-list
List all teams the user is a member of, including members_count, notes_count, and containers_count for each team. No parameters required.
teams-list
Create or remove a bidirectional link between two notes. Required: action ('link'|'unlink'), source_note_id (integer), target_note_id (integer). Prefer wiki-link syntax [[id:Title]] in note bodies for inline linking — use this tool for programmatic links without modifying body text. Unlinking is destructive and cannot be undone.
links-manage
Rename, merge, or delete a tag — the cleanup tools for the tag list (this operates on the tag itself, unlike notes-update which only edits one note's tags). Required: action ('rename'|'merge'|'delete') and the tag to act on via name (string, case-insensitive) or tag_id (integer). For 'rename' also pass new_name. For 'merge' also pass the destination via target_name or target_id: every note on the source tag is moved onto the destination and the source tag is deleted — ideal for collapsing duplicates like 'machine learning' into 'machine-learning'. If target_name names a tag that doesn't exist yet, it's created, so you can merge straight into a clean canonical name without creating it first. 'delete' removes the tag from all its notes and deletes it; deleting a name that doesn't exist succeeds as a no-op (already_absent: true), so it's safe to retry. Merge and delete are destructive and cannot be undone; check tags-list first.
tags-manage
Read a note's revision history and provenance: who wrote each version (you, the user, or which AI client), when, and what changed. Use it to attribute facts to their source and to see recent edits before making your own. Read-only. Required: id (integer). Optional: limit (default 20, max 100), before_seq (paginate to older revisions), include_body (boolean — reconstruct each version's full text), seq (integer — return only that revision, with its full reconstructed body).
notes-history
Used only by the Hjarni note panel UI to reload, preview and save the note it shows. Assistants should not call this: read with notes-get and edit with notes-update. Actions: 'get' (id; known_lock_version answers status 'unchanged' when the note has not moved), 'search' (query: the panel's note picker, with a short preview per note; with id, only the notes that note can link to), 'browse' (place: one level of the folder tree, its folders and notes), 'preview' (id, body: renders Markdown without saving), 'save' (id, lock_version, title and/or body and/or add_tags/remove_tags; a lock_version that is no longer current saves nothing and answers status 'conflict' with the saved version and a line diff; resolve 'merge_hunks' with hunks {index: 'saved'|'draft'} applies a per-hunk choice), 'create_note' (place, title, body, add_tags), 'create_folder' (place, name), 'update_folder' (place folder:<id>; name, description, llm_instructions, negative_space), 'instructions' (place personal: brain, personal; place team:<id>: team), 'folder_options' (id: where that note can move), 'move' (id, place), 'trash' (id), 'restore' (id), 'favorite' (id, favorited), 'archive' (id, archived), 'history' (id; with seq, that version and its changes), 'revert' (id, seq, lock_version), 'verify' (id), 'keep_summary' (id, lock_version: clears summary_stale and leaves the summary as it is; a lock_version that is no longer current answers status 'stale'), 'file_description' (id, file_id, description), 'save_to_personal' (id of a team note), 'purge' (id of a trashed note: delete for good), 'folder_archive' (place folder:<id>, archived), 'folder_delete' (place), 'folder_restore' (id), 'folder_purge' (id), 'folder_parents' (place), 'folder_move' (place, to), 'folder_reorder' (place, direction up|down), 'tag' (place tag:<id>, op rename|merge|delete, name), 'share' (id, or place folder:<id>; op status|enable|disable|editing_on|editing_off), 'bulk' (ids, op move|archive|unarchive|trash, place for move), 'toggle' (id, lock_version, index, checked: ticks one task checkbox; a lock_version that is no longer current ticks nothing and answers status 'stale' with the saved version).
notes-panel
Permanently remove a file attachment from one of your personal notes (personal notes only). This action is irreversible. Required: note_id (integer), file_id (integer, from notes-get response).
files-remove
Restore a deleted folder from Trash within the connected user's personal Hjarni account or an authorized team workspace, bringing back everything its delete took -- sub-folders and notes return together, exactly as they were. Find restorable folders with containers-list scope 'trashed'. A note that was deleted TOGETHER with a folder can only come back this way (notes-restore refuses it and names the folder). Required: id (integer, the deleted folder's id).
containers-restore
Restore a note that notes-delete moved to Trash within the connected user's personal Hjarni account or an authorized team workspace, bringing back its body, tags, attachments, and history. Only works before the note's purge date. Required: id (integer) — the same note id you deleted.
notes-restore
Revert a note's body to an earlier revision (find the seq via notes-history). This does NOT erase history — it appends a NEW revision whose body equals the chosen earlier one, attributed to you, so the revert can itself be undone. Use only when the user explicitly asks to undo a change. Optional expected_lock_version (from notes-get) rejects the revert if the note changed since you read it, instead of clobbering that change. Required: id (integer), seq (integer).
notes-revert
Search across notes, containers, and tags in one call — the retrieval tool for ANYTHING the user has saved in their second brain: preferences, workflows, routines, projects, decisions, meeting notes, research, people, how-tos, code snippets, references, journal entries, and any other saved knowledge or memories. When a task needs something the user previously stored, this is the tool that finds it. Returns results grouped by type with pagination metadata (total_count, page, per_page, total_pages). Required: query (string). Optional: types (array, default all three), search_scope ('all'|'personal'|'team:<id>'), scope ('active'|'archived'), container_id (integer, ignored when search_scope is 'all'), tags (array, AND logic), tag_ids (array, AND logic), include_nested (boolean), include_body (boolean, default false — when true each note includes its full body), include_instructions (boolean, defaults to include_body — when true each note carries inherited_instructions, the same user-written instruction chain notes-get returns, so a full-body search hit arrives with the rules that govern it and needs no follow-up notes-get; pass false to omit the chain from a body-only page), created_after / created_before / updated_after / updated_before (ISO 8601 datetime filters on note timestamps), page (integer, default 1), per_page (integer, default 25, max 100). Note results include a snippet of the matching portion.
search
Change access only for existing members of the same Hjarni team; this does not invite anyone or publish a folder. Set or clear a team member's role on a team container. Roles cascade to descendants unless a child has its own role. Caller must have admin role on the target container. Required: container_id (integer, must be a team container), user_id (integer, must be a member of the same team), role ('viewer' | 'editor' | 'admin' | 'inherit'). Use 'inherit' to delete an explicit role and fall back to the role inherited from an ancestor (or from team membership). Team owners are always admin and cannot be downgraded. Returns the user's resulting effective_role on that container.
containers-permissions
Send feedback to Hjarni's maintainers, storing a feedback record and emailing an admin notification that cannot be recalled. Use only when the user asks to send feedback, and include only the task-specific details they authorized. Submit feedback about Hjarni itself — confusing tool descriptions, missing capabilities, unexpected errors, friction, or praise. Do NOT use this for the user's own notes or knowledge — those belong in notes-create. Required: category ('bug'|'confusing'|'missing_feature'|'friction'|'praise'|'other'), message (string, what's wrong and ideally what you'd expect instead). Optional: severity ('low'|'medium'|'high', default 'medium'), tool_name (the MCP tool the feedback is about, e.g. 'notes-update'), context (JSON-encoded string with any extra structured data — error excerpts, the arguments you tried, the steps that broke).
feedback-submit
Update a folder within the connected user's personal Hjarni account or an authorized team workspace — rename, set its icon (emoji), change description or negative_space (what does NOT belong here), move to a different parent, set display position, or archive/unarchive it. Works for both personal and team containers the current user can edit (team containers require the editor role). Refuses the space's root (root: true in containers-get); set that space's instructions with instructions-update instead, and pass parent_id null, not the root's id, for a top-level folder. Required: id (integer). Optional: name, emoji (pass null to clear it), description, negative_space (pass null to clear it), parent_id (null for root, must be in the same scope), position (integer, lower = first). Archiving: archived (boolean) archives or unarchives the folder itself; add include_notes: true to also retire/reactivate every note filed in it IN BULK, and include_nested: true to sweep nested sub-folders (and, with include_notes, their notes) too. This is THE way to retire a whole folder — e.g. a finished project or a large import whose notes keep surfacing in dashboards — in one call; never loop notes-update over each note for that. The response then includes containers_changed and notes_changed counts (rows actually flipped; note bodies are not returned). On team containers an include_nested sweep requires the editor role on every affected sub-folder. Caveat on reversing: an unarchive sweep reactivates EVERYTHING it touches — include_nested resurrects sub-folders, and include_notes resurrects notes, that the user had archived individually before the sweep. When that matters, unarchive selectively: archived: false on specific folders, and individual notes via notes-update. Unarchiving a nested folder also reactivates its archived ancestor folders, so the restored folder stays reachable. Find archived folders again later with containers-list scope 'archived'.
containers-update
Update LLM instructions at the specified level. Required: level ('brain'|'personal_root'|'container'|'team'), instructions (string). Optional: id (integer, required for 'container' and 'team'), mode ('replace' default|'append'). The 'container' level updates personal containers only; to set instructions for a team, use level 'team' (team owners only). In 'replace' mode (default), the provided text overwrites existing instructions. In 'append' mode, the text is appended to existing instructions with a newline separator. Always read current instructions first before replacing to avoid losing existing content.
instructions-update
Update a note: edit its content, move it to a different folder (set container_id, or null for the inbox), archive/favorite it, or change its tags. This is the tool for moving notes between folders; there is no separate move tool. Required: id (integer). Optional content (exactly one body-mutation mode at a time): title, body (full replace), append_body (appends to existing body), insert_after + insert_body (insert text immediately after a unique anchor snippet from the existing body), insert_before + insert_body (insert before a unique anchor), replace_find (+ optional replace_with) (replace a unique snippet; omit replace_with entirely to delete the snippet). Markdown-structure ops (heading/section/checklist aware — safer than eyeballing a unique snippet on long notes): replace_section + section_body (replace everything UNDER a heading, keeping the heading line); append_to_section + section_body (add content at the END of a section — the safe 'insert under heading' when you don't know its last line); rename_heading + new_heading (rename a heading in place, preserving its level unless new_heading carries its own '#'); check_item / uncheck_item (tick/untick a checklist item by its text, e.g. '- [ ] ship it'). Headings and checklist items must each match exactly one line. Anchor and find snippets must match exactly once; include enough surrounding context to disambiguate. Also optional: summary, source_url. Freshness: verified (boolean — pass true to mark the note re-confirmed as still true right now; only send this after the user has actually confirmed it), review_after (ISO 8601 datetime to time-box the note, or null to clear it). Organization: container_id (move note), archived (boolean — works on your own personal notes and on team notes where you have the editor role; notes in shared containers are owner-only), favorited (boolean). Tags: tag_list (full replace, comma-separated), add_tags, remove_tags. tag_list takes precedence over add_tags/remove_tags. Concurrent edit safety: pass expected_lock_version (the lock_version you saw when you last read the note via notes-get / notes-list / search) whenever you want a stale-write guard. If it doesn't match the current version, the update is rejected with the current state included so you can re-read and re-apply (append_body-only calls are exempt; see expected_lock_version). Surgical edits (append_body / insert_after / insert_before / replace_find) are anchor-based and so don't *need* expected_lock_version for their body change — but if you also change title / summary / container_id alongside, those fields can still silently overwrite a newer save unless you supply expected_lock_version. Examples: insert under a heading {id: 42, append_to_section: 'Open Questions', section_body: '- Should we ship Friday?'}; replace a section {id: 42, replace_section: '## Status', section_body: 'Shipped 🎉'}; rename a heading {id: 42, rename_heading: 'TODO', new_heading: 'Done'}; tick a checklist item {id: 42, check_item: 'ship it'}; fix a typo {id: 42, replace_find: 'recieved', replace_with: 'received'}; safe full rewrite {id: 42, body: '...', expected_lock_version: 5}. Every edit is recorded as a named, revertable revision attributed to you — use notes-history to see who changed what, and notes-revert to undo a change.
notes-update
Hjarni Notes ChatGPT Plugin FAQ
How the directory, categories and Discoverability Score work.
Read the methodologyHow do I improve Hjarni Notes's ChatGPT Plugin discoverability?
The levers are the listing surface agents actually read: names, descriptions, keywords, tool metadata, and registry health. Which lever matters depends on where discovery breaks, which is what continuous measurement shows.
What are Hjarni Notes alternatives on ChatGPT?
As of 2026-11-02, Hjarni Notes competes with 2Mind, AI Passport, AI Whisper Voice Note Taker, AI Wisebase, AiAkiv Memory, AideMemo, Areta, AristAI Thinker and 114 more in ChatGPT Personal AI Memory & Second Brain, ranked by public Discoverability Score.
Where is this profile measured?
This profile uses the geography attached to the latest public registry snapshot: US. Locale tags are intentionally omitted.