GEDCOM references and ancestry audit
Inspect UTF-8 GEDCOM 5.5.1 family/person references, reciprocity and declared ancestry SCCs with original lines and pedigree classifications.
- 1Add input
- 2Adjust settings
- 3Get your result
Tool input and files are processed in this browser without being uploaded.
Before you start
Check a genealogy export before import: locate dangling or one-way family links and declared ancestor cycles. Retain the original source and report the evidence without adding relatives or inferring biological relationships.
How to use this tool
- Open a UTF-8 GEDCOM 5.5.1 export or paste its complete source.
- Review line-numbered target and reciprocity issues, pedigree declarations and ancestry SCC members.
- Download original.ged and full reports; verify facts with the source system before making corrections.
Supported inputs and limits
One UTF-8 file or paste up to 5 MiB, 50,000 physical lines, 10,000 top-level records including HEAD/TRLR, 64 hierarchy levels, and 50,000 combined declared relationship plus derived ancestry edges. Selected file takes precedence. Total downloads up to 10 MiB; oversized complete reports reject atomically. Preview first 200 rows.
HEAD/GEDC/VERS must explicitly be 5.5.1 and HEAD/CHAR UTF-8. Exact source BOM and CRLF/LF/CR endings remain in original.ged. GEDCOM 7, ANSEL, UTF-16, level gaps, duplicate xrefs, blank physical lines and malformed pointers reject. Unknown tags remain in source-derived JSON and original bytes.
INDI FAMC/FAMS and FAM CHIL/HUSB/WIFE targets are type-checked, with dangling/wrong-type/duplicate/absent reciprocal lines reported. CONT/CONC text is resolved without dropping continuation text; original hierarchy/value fields remain. Continued or nested continuation pointer syntax rejects rather than guessing.
Ancestor SCCs use declared parent-to-child edges only. Pedigree values birth/adopted/foster/sealing/unknown/multiple and original PEDI values/lines remain visible; these declarations do not establish biological facts. Spouse rings are not ancestry cycles. Reports include every reference, issue and SCC member, not exponential enumeration of all simple cycles. No records edited, relationship inference, import or database write.
Values longer than 4096 UTF-8 bytes have value:null with external-original-value and an exact byte span into downloaded original.ged. Multiline logical values carry ordered byte/literal segments joined by concat, preserving CONT newline and CONC concatenation. A null with this status is a present value stored in the original, not a missing field.
The result text and copy action use a compact preview when the report exceeds 20,000 characters. Complete report.json, CSV and HTML are downloaded artifacts. Long table cells show only their first 2,000 characters plus ellipsis; complete downloads are not truncated.
Worked example
Example input
0 HEAD 1 GEDC 2 VERS 5.5.1 2 FORM LINEAGE-LINKED 1 CHAR UTF-8 0 @I1@ INDI 1 NAME Parent /Example/ 1 FAMS @F1@ 0 @I2@ INDI 1 NAME Child /Example/ 1 FAMC @F1@ 2 PEDI adopted 0 @F1@ FAM 1 HUSB @I1@ 1 CHIL @I2@ 1 CHIL @MISSING@ 0 TRLR
Example options
{"secondary":"","params":{"spreadsheetSafe":true}}Example output
{"format":"GEDCOM 5.5.1 UTF-8","summary":{"individuals":2,"families":1,"records":5,"physicalLines":17,"relations":5,"ancestryEdges":1,"issues":1,"dangling":1,"wrongTargetTypes":0,"missingReciprocals":0,"ancestorSCCs":0},"records":[{"index":0,"xref":null,"tag":"HEAD","line":1,"names":[]},{"index":5,"xref":"@I1@","tag":"INDI","line":6,"names":["Parent /Example/"]},{"index":8,"xref":"@I2@","tag":"INDI","line":9,"names":["Child /Example/"]},{"index":12,"xref":"@F1@","tag":"FAM","line":13,"names":[]},{"index":16,"xref":null,"tag":"TRLR","line":17,"names":[]}],"nodes":[{"index":0,"line":1,"level":0,"parent":null,"xref":null,"tag":"HEAD","value":"","ending":"\n","children":[1,4]},{"index":1,"line":2,"level":1,"parent":0,"xref":null,"tag":"GEDC","value":"","ending":"\n","children":[2,3]},{"index":2,"line":3,"level":2,"parent":1,"xref":null,"tag":"VERS","value":"5.5.1","ending":"\n","children":[]},{"index":3,"line":4,"level":2,"parent":1,"xref":null,"tag":"FORM","value":"LINEAGE-LINKED","ending":"\n","children":[]},{"index":4,"line":5,"level":1,"parent":0,"xref":null,"tag":"CHAR","value":"UTF-8","ending":"\n","children":[]},{"index":5,"line":6,"level":0,"parent":null,"xref":"@I1@","tag":"INDI","value":"","ending":"\n","children":[6,7]},{"index":6,"line":7,"level":1,"parent":5,"xref":null,"tag":"NAME","value":"Parent /Example/","ending":"\n","children":[]},{"index":7,"line":8,"level":1,"parent":5,"xref":null,"tag":"FAMS","value":"@F1@","ending":"\n","children":[]},{"index":8,"line":9,"level":0,"parent":null,"xref":"@I2@","tag":"INDI","value":"","ending":"\n","children":[9,10]},{"index":9,"line":10,"level":1,"parent":8,"xref":null,"tag":"NAME","value":"Child /Example/","ending":"\n","children":[]},{"index":10,"line":11,"level":1,"parent":8,"xref":null,"tag":"FAMC","value":"@F1@","ending":"\n","children":[11]},{"index":11,"line":12,"level":2,"parent":10,"xref":null,"tag":"PEDI","value":"adopted","ending":"\n","children":[]},{"index":12,"line":13,"level":0,"parent":null,"xref":"@F1@","tag":"FAM","value":"","ending":"\n","children":[13,14,15]},{"index":13,"line":14,"level":1,"parent":12,"xref":null,"tag":"HUSB","value":"@I1@","ending":"\n","children":[]},{"index":14,"line":15,"level":1,"parent":12,"xref":null,"tag":"CHIL","value":"@I2@","ending":"\n","children":[]},{"index":15,"line":16,"level":1,"parent":12,"xref":null,"tag":"CHIL","value":"@MISSING@","ending":"\n","children":[]},{"index":16,"line":17,"level":0,"parent":null,"xref":null,"tag":"TRLR","value":"","ending":"\n","children":[]}],"continuedText":[],"relations":[{"from":"@I1@","tag":"FAMS","to":"@F1@","line":8,"status":"resolved","reciprocal":true,"pedigree":[]},{"from":"@I2@","tag":"FAMC","to":"@F1@","line":11,"status":"resolved","reciprocal":true,"pedigree":["adopted"]},{"from":"@F1@","tag":"HUSB","to":"@I1@","line":14,"status":"resolved","reciprocal":true,"pedigree":[]},{"from":"@F1@","tag":"CHIL","to":"@I2@","line":15,"status":"resolved","reciprocal":true,"pedigree":[]},{"from":"@F1@","tag":"CHIL","to":"@MISSING@","line":16,"status":"dangling","reciprocal":null,"pedigree":[]}],"ancestry":[{"parent":"@I1@","child":"@I2@","family":"@F1@","parentLine":14,"childLine":15,"pedigree":["adopted"],"pedigreeClass":"adopted","pedigreeLines":[12]}],"issues":[{"kind":"dangling","from":"@F1@","to":"@MISSING@","line":16,"detail":"Expected INDI"}],"ancestorSCCs":[]}When something does not work
Export GEDCOM 5.5.1 with an explicit UTF-8 declaration. Repair hierarchy gaps, duplicate xrefs and pointer syntax in the source system. Review reported one-way links without automatically inventing reciprocals. Reduce input if complete downloads exceed 10 MiB; rerun after corrections.
Frequently asked questions
Will a missing reciprocal family link be filled in?
No. The report shows each one-way declaration and its original line. Export omissions and real relationship facts must be checked in the source system.
Does an adopted edge count as ancestry in the graph?
Yes, as a declared parent-to-child edge, with adopted pedigree retained. The graph does not claim genetic ancestry.
Are unknown tags and multiline names lost?
Raw nodes and exact original bytes remain. Short CONT/CONC values are included directly. Longer values carry explicit original byte-span or ordered-segment references; reconstruct them from original.ged.
Documentation & further reading
Related tools
JSON formatting workspace
Format or minify strict JSON, sort object keys, and encode or decode strings while preserving raw number tokens.
Regex tester
Try a pattern and see what it matches in your text.
Compare text
See what changed, side by side.
HTML formatter
Format HTML indentation so its structure is easier to read.