Open app →
Documentation

References & mentions

How @-mentions and cross-entity references connect people, tasks, and notes inside note bodies, comments, and task descriptions, including the exact wire format so agents can read and write them through the Company-Brain MCP.

What references are

A reference is a single, unified way to point at something from inside a body of text. You @-mention a person, or you reference a task or a note, and Elliptic turns it into a compact chip right where you typed it. The same mechanism works across rich-text surfaces: a note page, a project description, a task description, and a comment on a task, meeting, or note. One reference can pull the runbook note a task depends on into its description, name a teammate in a comment, or cite a related task from a page. Work stays connected instead of scattered.

There are three kinds of reference. A user reference is a mention of a person. A task reference points at a work item. A note reference points at a page. People are mentioned so they can be notified, tasks and notes are referenced so the chip becomes a link you can follow.

KindTriggerRenders asLinks to
user@ then a namean @ chip in accent colora person. This is a mention, not a navigation target
task@ then a task title or identifiera # chip in monospacethe task, opened in the browse view
note@ then a page titlea chip with a page iconthe note, opened in the notes view
Why this matters for agents
Elliptic is Jira for your agents. Because every reference is plain Markdown, an agent operating over the Company-Brain MCP reads and writes the same chips your teammates do. When an agent embeds a reference in a task description or a comment, it renders as a chip for everyone, and when it reads a description back, the reference is right there in the text as a link it can resolve. References are how humans and agents point at the same things in the same words.

Mentioning in the app

Type @ where you want the reference. A picker opens and filters as you type. Pick one with the mouse, or move with the arrow keys and press Enter. Elliptic inserts the chip and drops a trailing space so you can keep typing.

What the picker offers depends on the surface. On a note page and in a project description it lists people, tasks (each shown with its # identifier), and notes (each shown with a Note tag and a page icon). In a task description and a task comment the picker offers tasks and notes, so you reference work items and pages there rather than people. The placeholder text tells you which: a task comment composer reads @ to mention a task or note.

  1. Type @
    In a note, a project description, a task description, or a comment composer, type @ followed by a few letters of a name, a task title or identifier, or a page title.
  2. Pick from the picker
    The list shows the targets available on that surface. Filter by typing, then select with the mouse or with the arrow keys and Enter.
  3. It becomes a chip
    Elliptic inserts the chip. A task or note chip is clickable right away and opens the referenced item. A person chip names them.

On a note page the editor placeholder says it all: type @ to mention, type / for a block menu, and Markdown shortcuts like ## for a heading, - for a list, and > for a quote all work. Mentioning is just one of the editor's inline behaviors.

How a chip behaves

  • Task and note chips are interactive. Clicking a chip (or focusing it and pressing Enter or Space) opens the referenced item. A note chip routes to the page, a task chip resolves to the task in the browse view.
  • Person chips are labels, not links. An @ person chip shows who is mentioned. It does not navigate anywhere, its job is to identify the person.
  • Chips are atomic. A chip is a single unit in the editor, not editable character by character. The label is what you see, the kind and id underneath are what make it resolve.

Notes, descriptions, and comments are all stored as Markdown. A reference is encoded as an ordinary Markdown link whose href is a relative sentinel path carrying the kind and the id of the target:

markdown
[Visible label](/__mention/<kind>/<id>)

The <kind> is one of user, task, or note. The <id> is the target's identifier, URL-encoded. The visible label is the link text. For example, a note reference, a task reference, and a person reference look like this:

markdown
Mirror the steps in [Runbook — Deploy a backend change](/__mention/note/019ed7a1-2b3c-7d4e-9f01-aabbccddeeff).
This work is blocked by [HML-42](/__mention/task/019ed802-4f5a-7b6c-8d9e-001122334455).
Handing this to [Ada](/__mention/user/019ed9c3-7a1b-4c2d-8e3f-556677889900).

The editor's Mention extension writes this href when you pick from the @ picker, and serializes the chip back to the same link when the content is saved as Markdown. The Markdown renderer does the reverse: it recognizes any link whose href begins with /__mention/, parses out the kind and id, and re-hydrates it into a chip. A note resolves to its notes route, a task resolves to the browse route built from its identifier, and a person renders as a styled, non-navigating glyph chip. Ordinary Markdown links are left untouched and render as normal links.

Why a relative sentinel path
/__mention/... is a relative path, not an absolute URL, so it stays stable across environments and across the hosted instance at elliptic.sh and any self-hosted deployment. The editor and renderer intercept it before it would ever be followed as a normal link, so the id is the source of truth and the label is display only. Editing the label does not change the target.

Each kind has a glyph the renderer prepends so the chip reads naturally even as plain text: # for a task, @ for a person, and for a note. When the same Markdown is flattened to plain text (for a search index or a snippet), the link collapses to that glyph plus the label, so [Ada](/__mention/user/...) becomes simply @Ada.

Drag to cite

When you are editing a note page, you can drag an entity from elsewhere in the app and drop it into the page to drop a citation link. The editor accepts the drag payload, works out where you dropped it, and inserts a link to that entity at that exact spot followed by a non-breaking space. Drag to cite is wired in the full note editor, the same surface that supports the @ picker, slash menu, and AI tools.

The drag carries a small structured payload over a Elliptic-specific clipboard type, with a kind, an id, a title, and an href. On drop, the editor builds an anchor from it: the link text is the entity's title, the href is the entity's own route, and the anchor also carries data-entity-kind and data-entity-id attributes so the citation stays identifiable. If the dragged entity has no route, the citation is inserted as the plain title instead of a link.

Carried over from the dragUsed for
titlethe visible link text of the citation
hrefthe destination the citation links to, when the entity has a route
kindstamped onto the anchor as data-entity-kind
idstamped onto the anchor as data-entity-id
Drag-cite vs typing @
Reach for drag to cite when the entity is already on screen and you want to pull it into a page without leaving your place. Reach for @ when you are mid-sentence and want to name a person or item by title. Both end up as links inside the same Markdown body. Note that a dragged citation links to the entity's own route, while an @ mention writes the /__mention/ sentinel that re-hydrates into a chip.

Notifications from mentions

Mentioning a person is how you get their attention. The notification path is driven by an explicit mention_user_ids field on the create and update payload, not by scanning the body for /__mention/user/ links. When that field carries member ids, Elliptic emits a MENTIONED notification to each of them. It only notifies ids that are genuine members of the same organization, and it never notifies you about your own mention.

  • On a note, creating or updating the page with mention_user_ids notifies each named member with a MENTIONED notification titled "You were mentioned in <note title>", pointing at the note.
  • On a comment, each named member gets a MENTIONED notification pointing at the entity the comment is on (the task, meeting, or note), with a snippet of the comment text.
  • On a task, each named member gets a MENTIONED notification pointing at the task and titled with the task's identifier, and is auto-subscribed to that task.
  • In a task comment specifically, each named member is likewise auto-subscribed to the task, idempotently, so they keep getting that task's updates. Auto-subscribe on mention happens for task targets, not for note or meeting targets.
Mention notifications are separate from comment notifications
A new comment already notifies the owner of the thing it is on (the task's assignee, the note's creator, the meeting's owner) with a COMMENTED notification. A MENTIONED notification is in addition to that, sent to the people named in mention_user_ids. The in-app inbox is always on, while per-trigger email delivery (including a mentions toggle) follows each member's notification preferences.
The chip and the ping are separate steps
Writing a /__mention/user/<id> link renders a person chip, but the chip alone does not notify anyone. The recipient list comes from the explicit mention_user_ids field, which is carried on the task create and update payloads (and accepted by the note and comment APIs). Referencing a task or a note never notifies a person, those kinds are about linking, not pinging.

Writing references as an agent (via the MCP)

Because a reference is just a Markdown link, an agent on the Company-Brain MCP can embed one anywhere a body of text is written. Resolve the target's id first, then write the /__mention/<kind>/<id> link inline and it renders as a chip for everyone who opens the item.

  1. Resolve the id
    Look up the target id. Use list_project_tasks or get_task for a task, list_notes or get_note for a note, and list_org_members for a person. Take the returned id.
  2. Embed the link
    Write the reference link with that id in the Markdown body, in the [label](/__mention/<kind>/<id>) form.
  3. Write the body
    Pass the Markdown as description on create_task or update_task, as content on create_note or update_note, or as body on create_comment. The link renders as a chip when anyone opens the item.
markdown
## Plan
Mirror the steps in [Runbook — Deploy a backend change](/__mention/note/019ed7a1-2b3c-7d4e-9f01-aabbccddeeff).
This work is blocked by [HML-42](/__mention/task/019ed802-4f5a-7b6c-8d9e-001122334455).
Notifying people through the MCP
To actually notify a person an agent mentions, pass their id in `mention_user_ids`. Among the MCP tools, that argument is exposed on create_task and update_task, where named members get a MENTIONED notification (and are auto-subscribed to the task). The create_note, update_note, and create_comment MCP tools accept the body text and render the chips inside it, but do not expose a mention_user_ids argument, so a person chip written there links and labels but does not by itself emit a mention notification. Keep the inline link for the chip, and use the task tools' mention_user_ids when a ping is the point.
Keep the label human, keep the id exact
The label is what readers see, so make it a short, readable title. The kind and id are what make the chip resolve, so they must be accurate and belong to an entity in the same organization. If the id does not match something the reader can access, the chip will not open anything. Avoid unescaped square brackets in the label so the link form stays valid.

Where references show up

References are not their own surface, they live inside the surfaces you already use:

  • Notes. Pages are the richest place for references and the only surface that supports drag to cite. See Notes, Activity & Calendar.
  • Comments. Task, meeting, and note comments are composed with @ and store the same link form in the comment text. A task comment's @ picker offers tasks and notes.
  • Task descriptions. A description can reference related tasks and notes with @, and the same Markdown link form is stored. See Projects & Tasks.
  • Project descriptions. A project brief is a rich-text body where you can @ people, tasks, and notes.
  • Activity. Creating or editing a note, or commenting, records an entry in the activity feed, so a referenced item's history shows when it was touched. See Notes, Activity & Calendar.
  • The assistant. The org assistant has its own @ context picker for attaching a project or a work item to a message, so you can ground an answer in a specific task or project.

Rules and behavior

  • References round trip. They are saved in the Markdown and re-hydrate into chips on reload, not only during the current edit session.
  • Only links whose href starts with /__mention/ become reference chips. Normal Markdown links stay normal links.
  • The kind is one of user, task, or note. An unrecognized kind falls back to user.
  • The label is display text and the id is authoritative. Editing the label does not change the target.
  • Task and note chips are clickable and navigate, person chips are labels.
  • Notifying a mentioned person uses the explicit mention_user_ids field, only members of the same org are notified, and you are never notified about your own mention.
  • Mentioning a member on a task or in a task comment auto-subscribes them to that task, idempotently.