Contacts

Any indexed heading with an :EMAIL: property or a :person: tag is a contact, as in scimax-contacts for Emacs:

* Ana Ramirez                                   :person:
  :PROPERTIES:
  :EMAIL: ana@example.edu
  :PHONE: 555-0100
  :ADDRESS: 123 Science Dr, Pittsburgh PA
  :END:

Run cmd:scimax.contacts (Scimax: Contacts, C-c S-c, or c in the main menu C-c m) and fuzzy-pick a contact. Check several with Space to act on all of them at once. Then choose an action:

ActionWhat it does
Insert emailInserts the address(es) at the cursor, comma-separated
Insert Name Inserts Ana Ramirez <ana@example.edu>, ready for a To: line
EmailOpens a compose window to all picked contacts (see Email client)
Insert link[[id:…][Name]] in org (adds an :ID:), [Name](mailto:…) in Markdown
Copy email / Name The same text, on the clipboard
Go to contactOpens the contact's heading (one contact)
Add a noteAdds =- [2026-11-09 Mon 14:05] = at the end of the entry and puts the cursor after it (one contact)
Insert / Copy property…Pick any property (phone, address, …) and insert or copy its value (one contact)
Open in MapsOpens :ADDRESS: in Google Maps (one contact)

New contact… at the bottom of the list runs Scimax: New Person.

Contacts come from the database, so run Scimax: Sync Files (or open the folder as a workspace) first. The more general Entity Selector below works on any tag or property.

Email client

All email Scimax composes goes through one setting, scimax.mail.client:

  • gmail (the default) opens a Gmail compose window in the browser.

  • mailto hands a mailto: link to the system mail client, such as Apple Mail.

If you are signed in to several Google accounts, set scimax.mail.gmailAccount to the address (or account index) to send from.

This applies to Contacts, to mailto: links in org and Markdown files (Ctrl+click, C-c C-o, and the preview), to the email link in person hovers, to the Email action of Pick Entity, and to Email a Heading. cmd:scimax.mail.compose (Scimax: Compose Email) opens a blank compose window.

A mailto: link ctrl+clicked in VS Code's own Markdown preview still goes to the system mail client. VS Code handles those clicks itself.

{
  "scimax.mail.client": "gmail",
  "scimax.mail.gmailAccount": "me@example.com"
}

✅ Entity Selector (Contacts, Locations, …)

Use org headings as a lightweight database of people, places, and things — a contact manager, a locations list, a reagent/resource catalog — and fuzzy-pick one to act on it. An "entity" is just a heading identified by a tag (or a property), with details in its property drawer:

* Ana Ramirez                                   :person:
  :PROPERTIES:
  :ID: person-ana
  :EMAIL: ana@example.edu
  :NICK: ana
  :END:

* Lab B                                         :location:
  :PROPERTIES:
  :ID: loc-b
  :ADDRESS: 123 Science Dr, Pittsburgh PA
  :END:

Picking and acting

Run cmd:scimax.org.pickEntity (Scimax: Pick Entity):

  1. Choose an entity type — the configured types plus ad-hoc By tag… / By property… (so you can select on any tag/property with no setup).

  2. Fuzzy-pick a heading (matches on title, the shown field, and file:line).

  3. Choose an action:

    • Insert link — inserts [[id:…][Title]] at the cursor (assigns an :ID: to the target if it lacks one).

    • Copy link — the same link to the clipboard.

    • Insert field… / Copy field… — pick any of the heading's properties (email, address, phone, CAS, …) and insert/copy its value.

    • Email — opens a compose window in the configured email client (when the entity has an email property).

    • Open in Maps — opens the address in Google Maps (when it has an address).

    • Open link — opens a URL property in the browser (when configured).

    • Go to heading — jump to it.

Contacts (:person:) and Locations (:location:) work out of the box; the :person: headings are the same ones used for task assignees.

Requires the files to be indexed — run Scimax: Sync Files (or open the folder as a workspace) so entities are searchable.

✅ Defining your own entity type

Entity types are pure configuration — add a new kind (Reagents, Resources, Equipment, Samples…) with no code by appending to scimax.org.entities in settings.json:

"scimax.org.entities": [
  { "name": "Reagents",  "tag": "reagent",  "display": "CAS", "url": "SUPPLIER_URL" },
  { "name": "Resources", "tag": "resource", "display": "KIND", "url": "URL" }
]

Then any :reagent: heading is selectable. The Insert/Copy field chooser lists all of a heading's properties, so arbitrary schemas (CAS, CATALOG#, HAZARD, LOCATION…) just work.

Each entry's fields:

FieldMeaning
nameLabel shown in the type picker (required).
tagSelect headings carrying this tag.
propertySelect headings that have this property…
value…optionally equal to this value.
displayProperty whose value is shown on the picker line.
emailProperty holding an email → Email (mailto) action (default EMAIL).
addressProperty holding an address → Open in Maps (default ADDRESS).
urlProperty holding a URL → Open link action.

Built-in Contacts/Locations are always available; your entries are merged in (and override a built-in with the same name).