{"id":28715629,"url":"https://github.com/ge3224/ged_io","last_synced_at":"2026-05-10T03:56:24.090Z","repository":{"id":297880351,"uuid":"998188212","full_name":"ge3224/ged_io","owner":"ge3224","description":"Parse GEDCOM genealogy files in Rust","archived":false,"fork":false,"pushed_at":"2026-02-11T12:16:26.000Z","size":1746,"stargazers_count":6,"open_issues_count":2,"forks_count":2,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-11T20:35:44.858Z","etag":null,"topics":["family-trees","gedcom","genealogy","parser"],"latest_commit_sha":null,"homepage":"https://crates.io/crates/ged_io","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ge3224.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"license.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-06-08T03:55:07.000Z","updated_at":"2026-02-11T12:16:29.000Z","dependencies_parsed_at":null,"dependency_job_id":"840b5809-bc3c-4489-b671-d84ff315d075","html_url":"https://github.com/ge3224/ged_io","commit_stats":null,"previous_names":["ge3224/ged-io"],"tags_count":20,"template":false,"template_full_name":null,"purl":"pkg:github/ge3224/ged_io","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ge3224%2Fged_io","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ge3224%2Fged_io/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ge3224%2Fged_io/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ge3224%2Fged_io/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ge3224","download_url":"https://codeload.github.com/ge3224/ged_io/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ge3224%2Fged_io/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30109123,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-05T03:40:26.266Z","status":"ssl_error","status_checked_at":"2026-03-05T03:39:15.902Z","response_time":93,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["family-trees","gedcom","genealogy","parser"],"created_at":"2025-06-15T02:10:34.770Z","updated_at":"2026-03-05T04:06:23.074Z","avatar_url":"https://github.com/ge3224.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ged_io\n\n**A fast, full-featured GEDCOM parser and writer for Rust**\n\n[![Crates.io](https://img.shields.io/crates/v/ged_io.svg)](https://crates.io/crates/ged_io)\n[![Documentation](https://docs.rs/ged_io/badge.svg)](https://docs.rs/ged_io)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n---\n\n## What is ged_io?\n\n`ged_io` is a Rust library for reading and writing [GEDCOM](https://en.wikipedia.org/wiki/GEDCOM) files - the universal standard for exchanging genealogical data between family tree software.\n\nWhether you're building a genealogy application, migrating data between platforms, or analyzing family history datasets, `ged_io` provides a robust, type-safe API to work with GEDCOM data.\n\n### Key Features\n\n| Feature | Description |\n|---------|-------------|\n| **Dual Format Support** | Full support for both GEDCOM 5.5.1 and GEDCOM 7.0 specifications |\n| **Read \u0026 Write** | Parse GEDCOM files into Rust structs, modify them, and write back |\n| **Streaming Parser** | Memory-efficient iterator-based parsing for large files |\n| **GEDZIP Support** | Read/write `.gdz` archives bundling GEDCOM data with media files |\n| **Multiple Encodings** | UTF-8, UTF-16, ISO-8859-1, ISO-8859-15 (Latin-9), ANSEL |\n| **JSON Export** | Optional serde integration for JSON serialization |\n| **Type Safe** | Strongly-typed Rust structs for all GEDCOM record types |\n| **Compatible** | Relax rules to be compatible with most of GEDCOM files |\n\n---\n\n## Installation\n\nAdd to your `Cargo.toml`:\n\n```toml\n[dependencies]\nged_io = \"0.11\"\n```\n\n### Optional Features\n\n```toml\n# JSON serialization support\nged_io = { version = \"0.11\", features = [\"json\"] }\n\n# GEDZIP archive support (.gdz files)\nged_io = { version = \"0.11\", features = [\"gedzip\"] }\n\n# Enable all features\nged_io = { version = \"0.11\", features = [\"json\", \"gedzip\"] }\n```\n\n---\n\n## Quick Start\n\n### Parse a GEDCOM File\n\n```rust\nuse ged_io::GedcomBuilder;\n\nfn main() -\u003e Result\u003c(), Box\u003cdyn std::error::Error\u003e\u003e {\n    let content = std::fs::read_to_string(\"family.ged\")?;\n    let data = GedcomBuilder::new().build_from_str(\u0026content)?;\n\n    println!(\"GEDCOM version: {:?}\", data.gedcom_version());\n    println!(\"Individuals: {}\", data.individuals.len());\n    println!(\"Families: {}\", data.families.len());\n\n    for person in \u0026data.individuals {\n        if let Some(name) = person.full_name() {\n            println!(\"  - {}\", name);\n        }\n    }\n\n    Ok(())\n}\n```\n\n### Write a GEDCOM File\n\n```rust\nuse ged_io::{GedcomBuilder, GedcomWriter};\n\nfn main() -\u003e Result\u003c(), Box\u003cdyn std::error::Error\u003e\u003e {\n    // Parse existing file\n    let content = std::fs::read_to_string(\"input.ged\")?;\n    let data = GedcomBuilder::new().build_from_str(\u0026content)?;\n\n    // Write to new file\n    let writer = GedcomWriter::new();\n    let output = writer.write_to_string(\u0026data)?;\n    std::fs::write(\"output.ged\", output)?;\n\n    Ok(())\n}\n```\n\n---\n\n## Use Cases\n\n### 1. Family Tree Application Backend\n\nBuild genealogy software with full GEDCOM import/export:\n\n```rust\nuse ged_io::{GedcomBuilder, GedcomWriter};\n\n// Import from any genealogy software\nlet data = GedcomBuilder::new()\n    .validate_references(true)  // Ensure data integrity\n    .build_from_str(\u0026content)?;\n\n// Access family relationships\nfor family in \u0026data.families {\n    let parents = data.get_parents(family);\n    let children = data.get_children(family);\n    // Build your family tree UI...\n}\n\n// Export back to GEDCOM\nlet writer = GedcomWriter::new();\nstd::fs::write(\"export.ged\", writer.write_to_string(\u0026data)?)?;\n```\n\n### 2. Data Migration Between Platforms\n\nConvert GEDCOM files between formats or migrate to JSON:\n\n```rust\nuse ged_io::GedcomBuilder;\n\n// Read GEDCOM 5.5.1 file\nlet data = GedcomBuilder::new().build_from_str(\u0026old_content)?;\n\n// Check version and migrate\nif data.is_gedcom_5() {\n    println!(\"Migrating from GEDCOM 5.5.1...\");\n}\n\n// Export as JSON (requires \"json\" feature)\n#[cfg(feature = \"json\")]\n{\n    let json = serde_json::to_string_pretty(\u0026data)?;\n    std::fs::write(\"family.json\", json)?;\n}\n```\n\n### 3. Genealogy Data Analysis\n\nAnalyze family history datasets:\n\n```rust\nuse ged_io::GedcomBuilder;\n\nlet data = GedcomBuilder::new().build_from_str(\u0026content)?;\n\n// Find all people with a specific surname\nlet smiths = data.search_individuals_by_name(\"Smith\");\nprintln!(\"Found {} Smiths\", smiths.len());\n\n// Analyze source citations\nlet citation_stats = data.count_source_citations();\nprintln!(\"Total citations: {}\", citation_stats.total);\n\n// Find birth/death statistics\nfor person in \u0026data.individuals {\n    if let (Some(birth), Some(death)) = (person.birth_date(), person.death_date()) {\n        println!(\"{}: {} - {}\", \n            person.full_name().unwrap_or_default(), \n            birth, death);\n    }\n}\n```\n\n### 4. GEDZIP Archive Processing\n\nWork with GEDCOM 7.0 bundled archives:\n\n```rust\nuse ged_io::GedcomBuilder;\nuse ged_io::gedzip::{GedzipReader, write_gedzip_with_media};\nuse std::collections::HashMap;\n\n// Read GEDZIP with embedded photos\nlet bytes = std::fs::read(\"family.gdz\")?;\nlet data = GedcomBuilder::new().build_from_gedzip(\u0026bytes)?;\n\n// Extract media files\nlet cursor = std::io::Cursor::new(\u0026bytes);\nlet mut reader = GedzipReader::new(cursor)?;\nfor filename in reader.media_files() {\n    let media_bytes = reader.read_media_file(filename)?;\n    std::fs::write(format!(\"extracted/{}\", filename), media_bytes)?;\n}\n\n// Create new GEDZIP with media\nlet mut media = HashMap::new();\nmedia.insert(\"photos/grandpa.jpg\".to_string(), std::fs::read(\"grandpa.jpg\")?);\nlet archive = write_gedzip_with_media(\u0026data, \u0026media)?;\nstd::fs::write(\"new_family.gdz\", archive)?;\n```\n\n### 5. Streaming Large Files\n\nProcess large GEDCOM files without loading everything into memory:\n\n```rust\nuse ged_io::{GedcomStreamParser, GedcomRecord, GedcomData};\nuse std::fs::File;\nuse std::io::BufReader;\n\n// Stream records one at a time\nlet file = File::open(\"huge_family.ged\")?;\nlet reader = BufReader::new(file);\nlet parser = GedcomStreamParser::new(reader)?;\n\nfor result in parser {\n    match result? {\n        GedcomRecord::Individual(indi) =\u003e {\n            println!(\"Found: {}\", indi.full_name().unwrap_or_default());\n        }\n        GedcomRecord::Family(fam) =\u003e {\n            println!(\"Family: {}\", fam.xref.as_deref().unwrap_or(\"?\"));\n        }\n        _ =\u003e {} // Handle other record types\n    }\n}\n\n// Or collect into GedcomData when needed\nlet file = File::open(\"huge_family.ged\")?;\nlet reader = BufReader::new(file);\nlet parser = GedcomStreamParser::new(reader)?;\nlet data: GedcomData = parser\n    .collect::\u003cResult\u003cVec\u003c_\u003e, _\u003e\u003e()?\n    .into_iter()\n    .collect();\n```\n\nNote: The streaming parser requires UTF-8 input. For files with other encodings,\nread and convert to UTF-8 first, or use `GedcomBuilder::build_from_str()` which\nhandles encoding detection automatically.\n\n---\n\n## API Overview\n\n### Core Types\n\n| Type | Description |\n|------|-------------|\n| `GedcomData` | The root container holding all parsed records |\n| `Individual` | A person record (INDI) |\n| `Family` | A family unit record (FAM) |\n| `Source` | A source citation record (SOUR) |\n| `Repository` | A repository record (REPO) |\n| `Multimedia` | A multimedia object record (OBJE) |\n| `SharedNote` | A shared note record (SNOTE) - GEDCOM 7.0 |\n\n### Builder Configuration\n\n```rust\nlet data = GedcomBuilder::new()\n    .strict_mode(false)           // Lenient parsing (default)\n    .validate_references(true)    // Check cross-reference integrity\n    .ignore_unknown_tags(false)   // Report unknown tags\n    .max_file_size(Some(50_000_000))  // 50 MB limit\n    .build_from_str(\u0026content)?;\n```\n\nLenient parsing policy (default):\n- Accepts common real-world quirks (UTF-8 BOM, CRLF line endings, trailing newline at EOF).\n- Allows missing `HEAD` and/or `TRLR` records (the parser stops cleanly at EOF).\n- Keeps writing strict: the writer always emits valid GEDCOM output (including `0 TRLR` without a final newline and using `CONT`/`CONC` for multiline text).\n\n| Option | Default | Description |\n|--------|---------|-------------|\n| `strict_mode` | `false` | Fail on non-standard tags |\n| `validate_references` | `false` | Validate all cross-references exist |\n| `ignore_unknown_tags` | `false` | Silently skip unknown tags |\n| `max_file_size` | `None` | Maximum file size in bytes |\n\n### Convenience Methods\n\n```rust\n// Find records by cross-reference ID\nlet person = data.find_individual(\"@I1@\");\nlet family = data.find_family(\"@F1@\");\nlet source = data.find_source(\"@S1@\");\n\n// Navigate relationships\nlet families = data.get_families_as_spouse(\"@I1@\");\nlet parents = data.get_parents(family);\nlet children = data.get_children(family);\nlet spouse = data.get_spouse(\"@I1@\", family);\n\n// Search\nlet matches = data.search_individuals_by_name(\"Smith\");\n\n// Statistics\nlet total = data.total_records();\nlet is_empty = data.is_empty();\n```\n\n### Indexed Lookups (O(1) Performance)\n\nFor large files with frequent lookups:\n\n```rust\nuse ged_io::indexed::IndexedGedcomData;\n\nlet indexed = IndexedGedcomData::from(data);\n\n// O(1) lookups instead of O(n) linear search\nlet person = indexed.find_individual(\"@I1@\");\nlet family = indexed.find_family(\"@F1@\");\n```\n\n---\n\n## Supported GEDCOM Tags\n\nThe library provides full support for GEDCOM 5.5.1 and 7.0 specifications. Tags marked with **7.0** are new in GEDCOM 7.0.\n\n### Records (Level 0)\n\n| Tag | Description | 5.5.1 | 7.0 |\n|-----|-------------|:-----:|:---:|\n| HEAD | Header with file metadata | ✅ | ✅ |\n| INDI | Individual person record | ✅ | ✅ |\n| FAM | Family group record | ✅ | ✅ |\n| SOUR | Source record | ✅ | ✅ |\n| REPO | Repository record | ✅ | ✅ |\n| OBJE | Multimedia object record | ✅ | ✅ |\n| SUBM | Submitter record | ✅ | ✅ |\n| SUBN | Submission record | ✅ | - |\n| SNOTE | Shared note record | - | ✅ |\n| TRLR | Trailer (end of file) | ✅ | ✅ |\n\n### Individual Events\n\n| Tag | Description | 5.5.1 | 7.0 |\n|-----|-------------|:-----:|:---:|\n| ADOP | Adoption | ✅ | ✅ |\n| BAPM | Baptism | ✅ | ✅ |\n| BARM | Bar Mitzvah | ✅ | ✅ |\n| BASM | Bas Mitzvah | ✅ | ✅ |\n| BIRT | Birth | ✅ | ✅ |\n| BLES | Blessing | ✅ | ✅ |\n| BURI | Burial/Depositing remains | ✅ | ✅ |\n| CENS | Census | ✅ | ✅ |\n| CHR | Christening | ✅ | ✅ |\n| CHRA | Adult christening | ✅ | ✅ |\n| CONF | Confirmation | ✅ | ✅ |\n| CREM | Cremation | ✅ | ✅ |\n| DEAT | Death | ✅ | ✅ |\n| EMIG | Emigration | ✅ | ✅ |\n| EVEN | Generic event | ✅ | ✅ |\n| FCOM | First communion | ✅ | ✅ |\n| GRAD | Graduation | ✅ | ✅ |\n| IMMI | Immigration | ✅ | ✅ |\n| NATU | Naturalization | ✅ | ✅ |\n| ORDN | Ordination | ✅ | ✅ |\n| PROB | Probate | ✅ | ✅ |\n| RETI | Retirement | ✅ | ✅ |\n| WILL | Will | ✅ | ✅ |\n\n### Family Events\n\n| Tag | Description | 5.5.1 | 7.0 |\n|-----|-------------|:-----:|:---:|\n| ANUL | Annulment | ✅ | ✅ |\n| CENS | Census | ✅ | ✅ |\n| DIV | Divorce | ✅ | ✅ |\n| DIVF | Divorce filed | ✅ | ✅ |\n| ENGA | Engagement | ✅ | ✅ |\n| EVEN | Generic event | ✅ | ✅ |\n| MARB | Marriage bann | ✅ | ✅ |\n| MARC | Marriage contract | ✅ | ✅ |\n| MARL | Marriage license | ✅ | ✅ |\n| MARR | Marriage | ✅ | ✅ |\n| MARS | Marriage settlement | ✅ | ✅ |\n| RESI | Residence | ✅ | ✅ |\n| SEP | Separation | - | ✅ |\n\n### Individual Attributes\n\n| Tag | Description | 5.5.1 | 7.0 |\n|-----|-------------|:-----:|:---:|\n| CAST | Caste name | ✅ | ✅ |\n| DSCR | Physical description | ✅ | ✅ |\n| EDUC | Education | ✅ | ✅ |\n| FACT | Generic fact | ✅ | ✅ |\n| IDNO | National ID number | ✅ | ✅ |\n| NATI | Nationality | ✅ | ✅ |\n| NCHI | Number of children | ✅ | ✅ |\n| NMR | Number of marriages | ✅ | ✅ |\n| OCCU | Occupation | ✅ | ✅ |\n| PROP | Property/Possessions | ✅ | ✅ |\n| RELI | Religion | ✅ | ✅ |\n| RESI | Residence | ✅ | ✅ |\n| SSN | Social Security Number | ✅ | ✅ |\n| TITL | Title/Nobility | ✅ | ✅ |\n\n### Name Structure\n\n| Tag | Description | 5.5.1 | 7.0 |\n|-----|-------------|:-----:|:---:|\n| NAME | Personal name | ✅ | ✅ |\n| GIVN | Given name | ✅ | ✅ |\n| NICK | Nickname | ✅ | ✅ |\n| NPFX | Name prefix | ✅ | ✅ |\n| NSFX | Name suffix | ✅ | ✅ |\n| SPFX | Surname prefix | ✅ | ✅ |\n| SURN | Surname | ✅ | ✅ |\n| TYPE | Name type | ✅ | ✅ |\n| FONE | Phonetic variation | ✅ | ✅ |\n| ROMN | Romanized variation | ✅ | ✅ |\n| TRAN | Translation | - | ✅ |\n\n### Family Links\n\n| Tag | Description | 5.5.1 | 7.0 |\n|-----|-------------|:-----:|:---:|\n| CHIL | Child | ✅ | ✅ |\n| FAMC | Family as child | ✅ | ✅ |\n| FAMS | Family as spouse | ✅ | ✅ |\n| HUSB | Husband/Partner | ✅ | ✅ |\n| WIFE | Wife/Partner | ✅ | ✅ |\n| PEDI | Pedigree linkage type | ✅ | ✅ |\n| STAT | Status | ✅ | ✅ |\n| ALIA | Alias/Alternate ID | ✅ | ✅ |\n| ASSO | Association | ✅ | ✅ |\n\n### Source \u0026 Citation\n\n| Tag | Description | 5.5.1 | 7.0 |\n|-----|-------------|:-----:|:---:|\n| SOUR | Source citation | ✅ | ✅ |\n| ABBR | Abbreviation | ✅ | ✅ |\n| AUTH | Author | ✅ | ✅ |\n| CALN | Call number | ✅ | ✅ |\n| DATA | Data | ✅ | ✅ |\n| PAGE | Page/Location | ✅ | ✅ |\n| PUBL | Publication info | ✅ | ✅ |\n| QUAY | Quality assessment | ✅ | ✅ |\n| REPO | Repository reference | ✅ | ✅ |\n| ROLE | Role in event | ✅ | ✅ |\n| TEXT | Text from source | ✅ | ✅ |\n| TITL | Title | ✅ | ✅ |\n\n### Date \u0026 Time\n\n| Tag | Description | 5.5.1 | 7.0 |\n|-----|-------------|:-----:|:---:|\n| DATE | Date | ✅ | ✅ |\n| TIME | Time | ✅ | ✅ |\n| CHAN | Change date | ✅ | ✅ |\n| CREA | Creation date | - | ✅ |\n| SDATE | Sort date | - | ✅ |\n| PHRASE | Free-text phrase | - | ✅ |\n\n### Place \u0026 Address\n\n| Tag | Description | 5.5.1 | 7.0 |\n|-----|-------------|:-----:|:---:|\n| PLAC | Place | ✅ | ✅ |\n| ADDR | Address | ✅ | ✅ |\n| ADR1 | Address line 1 | ✅ | ✅ |\n| ADR2 | Address line 2 | ✅ | ✅ |\n| ADR3 | Address line 3 | ✅ | ✅ |\n| CITY | City | ✅ | ✅ |\n| STAE | State/Province | ✅ | ✅ |\n| POST | Postal code | ✅ | ✅ |\n| CTRY | Country | ✅ | ✅ |\n| MAP | Map coordinates | ✅ | ✅ |\n| LATI | Latitude | ✅ | ✅ |\n| LONG | Longitude | ✅ | ✅ |\n| FONE | Phonetic variation | ✅ | ✅ |\n| ROMN | Romanized variation | ✅ | ✅ |\n| FORM | Place hierarchy format | ✅ | ✅ |\n\n### Multimedia\n\n| Tag | Description | 5.5.1 | 7.0 |\n|-----|-------------|:-----:|:---:|\n| OBJE | Multimedia link | ✅ | ✅ |\n| FILE | File reference | ✅ | ✅ |\n| FORM | Media format/type | ✅ | ✅ |\n| TITL | Title | ✅ | ✅ |\n| MEDI | Medium type | ✅ | ✅ |\n| BLOB | Binary data (5.5.1 only) | ✅ | - |\n| CROP | Image crop region | - | ✅ |\n| TOP | Crop top | - | ✅ |\n| LEFT | Crop left | - | ✅ |\n| HEIGHT | Crop height | - | ✅ |\n| WIDTH | Crop width | - | ✅ |\n\n### Notes\n\n| Tag | Description | 5.5.1 | 7.0 |\n|-----|-------------|:-----:|:---:|\n| NOTE | Note | ✅ | ✅ |\n| SNOTE | Shared note reference | - | ✅ |\n| CONT | Line continuation | ✅ | ✅ |\n| CONC | Line concatenation | ✅ | - |\n| MIME | MIME type | - | ✅ |\n| LANG | Language | ✅ | ✅ |\n| TRAN | Translation | - | ✅ |\n\n### Header \u0026 Metadata\n\n| Tag | Description | 5.5.1 | 7.0 |\n|-----|-------------|:-----:|:---:|\n| GEDC | GEDCOM info | ✅ | ✅ |\n| VERS | Version | ✅ | ✅ |\n| FORM | Format | ✅ | ✅ |\n| CHAR | Character encoding | ✅ | - |\n| DEST | Destination | ✅ | ✅ |\n| COPR | Copyright | ✅ | ✅ |\n| CORP | Corporation | ✅ | ✅ |\n| SCHMA | Extension schema | - | ✅ |\n| TAG | Tag definition | - | ✅ |\n\n### Contact Information\n\n| Tag | Description | 5.5.1 | 7.0 |\n|-----|-------------|:-----:|:---:|\n| PHON | Phone | ✅ | ✅ |\n| EMAIL | Email | ✅ | ✅ |\n| FAX | Fax | ✅ | ✅ |\n| WWW | Website | ✅ | ✅ |\n\n### Identifiers\n\n| Tag | Description | 5.5.1 | 7.0 |\n|-----|-------------|:-----:|:---:|\n| REFN | User reference number | ✅ | ✅ |\n| RIN | Record ID number | ✅ | ✅ |\n| AFN | Ancestral File Number | ✅ | ✅ |\n| UID | Unique identifier | ✅ | ✅ |\n| EXID | External identifier | - | ✅ |\n\n### Event Details\n\n| Tag | Description | 5.5.1 | 7.0 |\n|-----|-------------|:-----:|:---:|\n| TYPE | Event/Fact type | ✅ | ✅ |\n| AGE | Age at event | ✅ | ✅ |\n| AGNC | Agency | ✅ | ✅ |\n| CAUS | Cause | ✅ | ✅ |\n| RESN | Restriction notice | ✅ | ✅ |\n| NO | Non-event assertion | - | ✅ |\n\n### LDS Ordinances\n\n| Tag | Description | 5.5.1 | 7.0 |\n|-----|-------------|:-----:|:---:|\n| BAPL | Baptism, LDS | ✅ | ✅ |\n| CONL | Confirmation, LDS | ✅ | ✅ |\n| ENDL | Endowment, LDS | ✅ | ✅ |\n| SLGC | Sealing, child to parents | ✅ | ✅ |\n| SLGS | Sealing, spouse | ✅ | ✅ |\n| INIL | Initiatory, LDS | - | ✅ |\n| TEMP | Temple | ✅ | ✅ |\n| STAT | Ordinance status | ✅ | ✅ |\n\n### Submitter \u0026 Submission\n\n| Tag | Description | 5.5.1 | 7.0 |\n|-----|-------------|:-----:|:---:|\n| SUBM | Submitter reference | ✅ | ✅ |\n| ANCI | Ancestor interest | ✅ | ✅ |\n| DESI | Descendant interest | ✅ | ✅ |\n\n### Other\n\n| Tag | Description | 5.5.1 | 7.0 |\n|-----|-------------|:-----:|:---:|\n| SEX | Sex/Gender | ✅ | ✅ |\n\n### Date Formats\n\nAll standard GEDCOM date formats are preserved:\n\n- **Exact**: `15 MAR 1950`\n- **Range**: `BET 1900 AND 1910`, `BEF 1900`, `AFT 1900`\n- **Period**: `FROM 1900 TO 1910`\n- **Approximate**: `ABT 1900`, `CAL 1900`, `EST 1900`\n\n### Calendars\n\n- Gregorian (`@#DGREGORIAN@`)\n- Julian (`@#DJULIAN@`)\n- Hebrew (`@#DHEBREW@`)\n- French Republican (`@#DFRENCH R@`)\n\n### Character Encodings\n\n- UTF-8 (with/without BOM)\n- UTF-16 LE/BE\n- ANSEL (Z39.47, legacy GEDCOM 5.x encoding)\n- ISO-8859-1 (Latin-1)\n- ISO-8859-15 (Latin-9)\n- ASCII\n\n---\n\n## Command Line Tool\n\nA CLI tool is included for quick GEDCOM inspection:\n\n```bash\n# Install\ncargo install ged_io\n\n# Help\nged_io --help\nged_io - GEDCOM inspection tool\n\nUSAGE:\nged_io \u003cfile.ged\u003e\nged_io --individual \u003cXREF\u003e \u003cfile.ged\u003e\nged_io --individual-lastname \u003cLASTNAME\u003e \u003cfile.ged\u003e\nged_io --individual-firstname \u003cFIRSTNAME\u003e \u003cfile.ged\u003e\n\nOPTIONS:\n-h, --help                        Print this help\n--individual \u003cXREF\u003e               Display a single individual (e.g. @I1@)\n--individual-lastname \u003cLASTNAME\u003e  Filter individuals by last name (case-insensitive)\n--individual-firstname \u003cFIRSTNAME\u003e Filter individuals by first name (case-insensitive)\n\nNOTES:\nIf both --individual-lastname and --individual-firstname are set,\nindividuals matching BOTH filters are listed.\n\n```\nExample with one file:\n```bash\n# Analyze a file\nged_io family.ged\n```\n\nOutput (example `tests/fixtures/sample.ged`):\n```\n----------------------\n| GEDCOM Data Stats: |\n----------------------\n  submissions: 0\n  submitters: 1\n  individuals: 3\n  families: 2\n  repositories: 1\n  sources (records): 1\n  source citations: 1\n  multimedia: 0\n  shared_notes: 0\n----------------------\n| Citation Breakdown: |\n----------------------\n  on individuals: 0\n  on events: 1\n  on attributes: 0\n  on families: 0\n  on names: 0\n  on other: 0\n----------------------\n```\n\n---\n\n## Building from Source\n\n```bash\n# Clone the repository\ngit clone https://github.com/ge3224/ged_io.git\ncd ged_io\n\n# Build\ncargo build --release\n\n# Run tests\ncargo test --all-features\n\n# Run benchmarks\ncargo bench\n\n# Check code quality\ncargo clippy --all-targets --all-features -- -D warnings\n```\n\n---\n\n## Performance\n\nCriterion benchmarks (`cargo bench`) on this repo's fixtures:\n\n| Fixture | Benchmark | Time (median) |\n|---------|-----------|---------------|\n| `tests/fixtures/simple.ged` | `GedcomBuilder::build_from_str` | ~10.58 µs |\n| `tests/fixtures/sample.ged` | `GedcomBuilder::build_from_str` | ~22.27 µs |\n| `tests/fixtures/washington.ged` | `GedcomBuilder::build_from_str` | ~2.93 ms |\n\nNotes:\n- The \"original\" API (`Gedcom::new`) is faster in parsing-only benches (~8.30 µs / ~18.06 µs / ~2.74 ms) because it does less validation/configuration work.\n- Round-tripping (parse + write) is benchmarked separately in `benches/memory.rs`.\n- Numbers vary by CPU, Rust version, and enabled features.\n\n---\n\n## Documentation\n\n- [API Documentation](https://docs.rs/ged_io) - Full API reference\n- [MIGRATION.md](MIGRATION.md) - GEDCOM 5.5.1 to 7.0 migration guide\n- [ROADMAP.md](ROADMAP.md) - Project roadmap and planned features\n- GEDCOM specifications (bundled in this repo):\n  - [GEDCOM 7.0 Specification (PDF)](docs/FamilySearchGEDCOMv7.pdf)\n  - [GEDCOM 5.5.1 Specification (PDF)](docs/ged551.pdf)\n\n---\n\n## Contributing\n\nContributions are welcome! Areas where help is appreciated:\n\n- Bug reports and feature requests\n- Additional test cases and edge cases\n- Documentation improvements\n- Performance optimizations\n\nPlease feel free to open issues or submit pull requests.\n\n---\n\n## License\n\nThis project is licensed under the [MIT License](LICENSE).\n\n---\n\n## Acknowledgments\n\nOriginally forked from [`pirtleshell/rust-gedcom`](https://github.com/pirtleshell/rust-gedcom).\n\nGEDCOM is a specification maintained by [FamilySearch](https://www.familysearch.org/).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fge3224%2Fged_io","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fge3224%2Fged_io","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fge3224%2Fged_io/lists"}