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:
| Action | What it does |
|---|---|
| Insert email | Inserts the address(es) at the cursor, comma-separated |
| Insert Name | Inserts Ana Ramirez <ana@example.edu>, ready for a To: line |
| Opens 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 contact | Opens the contact's heading (one contact) |
| Add a note | Adds =- [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 Maps | Opens :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.mailtohands amailto: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):
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).
Fuzzy-pick a heading (matches on title, the shown field, and file:line).
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:
| Field | Meaning |
|---|---|
name | Label shown in the type picker (required). |
tag | Select headings carrying this tag. |
property | Select headings that have this property… |
value | …optionally equal to this value. |
display | Property whose value is shown on the picker line. |
email | Property holding an email → Email (mailto) action (default EMAIL). |
address | Property holding an address → Open in Maps (default ADDRESS). |
url | Property 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).