cgdprojects/laravel-gedcom
A Laravel package for working with GEDCOM genealogy files. Parse, read, and manipulate family tree data with an Eloquent-style API, making it easier to import GEDCOM records and build genealogy features in Laravel applications.
Architecture fit. cgdprojects/laravel-gedcom is a Composer-installed Laravel package that wraps GEDCOM parsing behind a service provider, config, and (presumably) a facade/API that returns structured individuals, families, and events. Architecturally it slots into an existing Laravel application as an ingestion library, not a service: one dependency, one config file, one adapter class. The correct boundary for a TPM to enforce is that the package owns parsing and nothing else. The canonical person/family model, deduplication and merge policy, source citations, media handling, privacy rules for living individuals, and audit trail all remain internal. If the package's record shape leaks into our domain model, we lose the ability to swap or fork it — and given the adoption signals below, that option must stay cheap.
Integration feasibility. Mechanically straightforward: composer require, publish config, wrap behind an internal GedcomImporter interface, map to our own DTOs. The actual cost is not the library — it is file validation, encoding handling, domain mapping, and the merge/dedup logic that GEDCOM imports always force. Planning estimate for one engineer: a 2–3 day spike to prove the parser against real-world files, then roughly 1–2 sprints for adapter, import pipeline, fixtures, and error taxonomy, plus QA time. That estimate assumes the package works; the spike exists to find out cheaply.
Technical risk. The dominant risk is longevity, not code quality. Signals: 22 stars (negligible adoption), a single visible release in the evidence set (2023-01-03), and no stated support policy. That is a thin maintenance base for a component on a data path that is expensive to replace late. Secondary risks, in order:
CONC/CONT continuation lines, and vendor-specific custom tags (_UID, _APID, etc.). The v3.4.3 "special characters" fix confirms this class of bug is live in the codebase and was recently being worked.composer.json in minutes.Evidence gap worth flagging. The assessment material provided reads as generic file-import boilerplate — CSV/Excel, delimiters, currency symbols, "catalog and pricing loads." None of it is GEDCOM-specific. A TPM should treat those documents as unvalidated for this package and not cite them in a go/no-go decision. The only package-specific facts we actually hold are: it parses GEDCOM for Laravel, MIT licensed, 22 stars, last release 2023-01-03, and that release fixed special-character import.
Key questions for the spike.
composer.json and CI config — does it install cleanly on our target versions?CONC/CONT, NOTE, SOUR citations, and multimedia references, or only the core individual/family/event graph?Stack fit. Native Laravel: Composer, service provider, config publish, and — if the parser is chunkable — queue jobs. No new runtime components, no new infrastructure, no new operational surface. That is the package's main strategic virtue: it converts a bespoke parser project into a dependency upgrade, which is a scope and headcount win a TPM can bank.
Migration path. Pin first, then prove, then adopt.
GedcomImporter interface with the package confined to a single directory. No package types cross the boundary.Compatibility. Verify before committing: declared PHP/Laravel constraints vs. our versions; mbstring/iconv availability; utf8mb4 collation end-to-end; storage and upload limits; queue worker memory ceilings; and the GEDCOM version(s) our target users actually upload. Also confirm the MIT license and any attribution obligations are acceptable to legal — low friction, but it's a checkbox.
Sequencing. Gate the work so a bad outcome is cheap:
Deliberately out of scope for the first release: merge/dedup across multiple files, incremental sync, and GEDCOM export. Those are product features with their own value case; bundling them would turn a two-sprint integration into a quarter and destroy the "buy not build" argument.
Maintenance. Plan for a fork contingency from day one — vendor the package under our namespace or maintain a private fork, because the upstream release cadence is the single most likely thing to fail. Budget a small, recurring maintenance allocation (a few engineer-days per quarter) to watch the changelog, rebase the fork, and keep the parser green against new Laravel/PHP majors. Compare that to the fully-loaded cost of owning a GEDCOM parser in-house; if the fork overhead creeps toward that number, the build-vs-adopt thesis has failed and we should say so explicitly rather than drift.
Support. Support load is concentrated in file-encoding complaints ("my tree imported but the names are garbled," "half my family is missing"). Equip the help desk with: a sample-file capture requirement, an error taxonomy (unsupported encoding / malformed structure / too large / valid-but-unsupported tags), and a clear statement of which GEDCOM producers we support. Track import failure rate and partial-import rate as first-class product metrics, not just ticket volume — the partial-import rate is the one that predicts churn.
Scaling. Assume large trees (tens of thousands of individuals, tens of MB) and design for queued, chunked, resumable imports from the start. Synchronous in-request parsing will hit memory and timeout limits and will fail in a way that looks like user error. This is a design constraint on our wrapper, not a property of the package, and it is the most common place this kind of integration is under-scoped.
Failure modes to instrument. Malformed or truncated files; unsupported encodings (ANSEL being the usual offender); dropped custom tags; broken cross-references (individuals pointing at nonexistent families) and cyclic relationships; duplicate persons across re-imports without stable external IDs; DB collation mismatches mangling non-Latin scripts; memory/timeout kills on large files; and privacy leakage of living individuals into search or shared views. Each should have a counter, an alert threshold, and a user-facing message that distinguishes "we couldn't read your file" from "we read it but some records need review."
Ramp-up. The library itself takes an afternoon to learn. The scarce skill is GEDCOM domain knowledge — encoding declarations, continuation lines, dialect quirks, and what "correct" looks like for a genealogist. Budget one to two weeks for the implementing engineer to become genuinely effective, and require QA to work from real multilingual, multi-vendor fixtures rather than synthetic files. Capture that knowledge in the repo as fixtures and a short README, because with 22 stars and a single-maintainer upstream, our team is the only institutional memory this integration will have.
How can I help you explore Laravel packages today?