Neatbo.

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.

Browser-local processingInputGEDCOM 5.5.1 UTF-8OutputReference report JSON / CSV / HTMLUp to 5 MiB per file · File limit: 1
  1. 1Add input
  2. 2Adjust settings
  3. 3Get your result

Tool input and files are processed in this browser without being uploaded.

Your input

Inputs are kept temporarily in this tab when switching tools. Refreshing or closing clears them; large results may need to be regenerated.

⌘ / Ctrl + Enter to run

or drag and drop it here

Files stay on this device. Your originals stay unchanged.

.ged · .gedcom · .txt

Up to 5 MiB per file · File limit: 1

    0 characters · 0 bytes
    Options

    Complete the required options first. You can keep the defaults for the rest.

    Preparing the tool…

    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

    1. Open a UTF-8 GEDCOM 5.5.1 export or paste its complete source.
    2. Review line-numbered target and reciprocity issues, pedigree declarations and ancestry SCC members.
    3. 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