Gedcom
approvedby Andrei Lobanov
Edit GEDCOM files with autocomplete, validation, navigation, and semantic highlighting. - This plugin has not been manually reviewed by Obsidian staff.
GEDCOM for Obsidian
GEDCOM language support by Domorium. Edit source .ged and .gedcom files
directly in Obsidian with validation, autocomplete, navigation, folding, and
semantic highlighting.

Part of Domorium. The same GEDCOM language support runs in VS Code, JetBrains IDEs, and in the browser — one implementation of the format, adapted per editor.
Features
- Context-aware GEDCOM tag autocomplete
- Real-time validation errors and warnings
- Semantic highlighting for levels, tags, and cross-references
- Documentation tooltips for GEDCOM tags
- Go to definition for XREF values
- Find XREF references and highlight declarations and usages
- Safe XREF rename as one undoable edit
- Web links and vault-relative file links
- Photographs previewed from a
FILEpayload, cropped to the part of the image a multimedia link asks for - Quick fixes for broken references and invalid levels
- Folding and visual indentation for nested records
- Highlighted and checked
gedcomcode blocks in notes - Links from a note to a record, indexed by the vault or as an
obsidian://URL - Desktop and mobile Obsidian support
The plugin keeps the GEDCOM file as the source of truth. It does not convert records into Markdown, create a second genealogy database, or send vault data to a remote service.
Usage
- Enable GEDCOM in Settings → Community plugins.
- Open a
.gedor.gedcomfile in your vault. - Edit the source directly. Obsidian saves changes back to the same file.
Use Go to GEDCOM definition from the command palette to jump from an XREF usage to its record declaration. Find GEDCOM references moves between matching declarations and usages, and Rename GEDCOM reference updates the current XREF atomically. Editor behavior can be adjusted in the plugin settings.
A record pasted into a note is highlighted and checked when it is fenced as
gedcom. A block carries no header, so it is read as GEDCOM 7 unless the fence
names another specification — ```gedcom 5.5.1.
A note can link to a record. Copy link to record puts
[[tree.ged#@I47@|Marie /Curie/]] on the clipboard — a link the vault indexes,
so the file's Backlinks pane lists the notes that mention it and the graph draws
an edge to each. It is spelt the way this vault spells its own links, and shows
the name the record carries rather than a path. Copy Obsidian URL to
record writes the obsidian://domorium?vault=…&file=…&xref=@I47@ form instead,
which a browser or another application can follow. Either one opens the file with
the cursor on that record.
Hovering a FILE payload shows the photograph it names, and hovering the
pointer of 1 OBJE @O1@ shows the part of that photograph the link's CROP
asks for — so one group portrait shows a different face under each person who
references it. Media that is not an image is named rather than drawn, and a
FILE naming a web address says so instead of being fetched. Media preview
in the plugin settings chooses the gesture, or turns it off, independently of
Record preview. Both open on a resting hover by default; either can be set
to ask for Ctrl/Cmd instead, and a gesture already chosen is kept.
Typing [[tree.ged# in a note offers the records in that file, by name where
the format gives one. Hovering a link to a record shows the record, highlighted,
without opening the file, and ![[tree.ged#@I47@]] embeds it in the note the
same way.
A vault to try it on
demo-vault/ is an Obsidian vault: open it with Open folder as
vault, enable the plugin, and start from Start here.md. Four generations of
the Curie family live in one GEDCOM file — seventeen people, five families,
sources, repositories and images — and the notes around it link into it the way
your own notes would.
For dataviewjs and other plugins
The parsed document is reachable without opening the file:
```dataviewjs
const api = app.plugins.plugins["domorium"].api;
const tree = await api.read("family/tree.ged");
dv.list(tree.getNodes().filter((n) => n.tokens.TAG?.value === "INDI")
.map((n) => tree.getLabel(n) ?? n.tokens.XREF?.value));
```
api.parse(text, options) does the same for text already in hand. Both answer
with the validator's GedcomDocument: getNodes, getErrors, getVersion,
getLabel, getPointerTargetTag, isRecordDeclaration. api.version says
which API you are holding.
Privacy
GEDCOM by Domorium works locally inside the vault. It does not require an account, access files outside the vault, show advertisements, or collect analytics or telemetry.
It makes no network request until you ask it to. There is one thing you can
ask for: Load images from the web, off until you turn it on, which lets the
media preview draw a FILE payload naming an https address. Until then the
preview says the file is remote and fetches nothing, and offers to draw it —
this one, or every one from now on. Nothing else reaches the network, an
unencrypted http address is refused whatever the setting says, and no
photograph is copied into the vault.
Installation
Install GEDCOM from Obsidian's Community Plugins directory. To test beta releases, use BRAT with this repository URL:
https://github.com/lavich/domorium-obsidian
For a manual installation, copy main.js, manifest.json, and styles.css
from the latest release into:
<vault>/.obsidian/plugins/domorium/
Reload Community Plugins and enable GEDCOM.
Development
npm install
npm run check
The packaged plugin is written to dist/.
The shared GEDCOM parser and editor-independent language service are maintained in the main Domorium repository and consumed as versioned public npm packages.
License
MIT © 2026 Andrei Lobanov
Domorium is an independent project and is not affiliated with or endorsed by FamilySearch or Intellectual Reserve, Inc. FAMILYSEARCH GEDCOM™ and FAMILYSEARCH® are trademarks of Intellectual Reserve, Inc.
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.