fisharebest/webtrees
webtrees is an open-source, collaborative web genealogy application built with PHP. It lets families publish and manage GEDCOM-based family trees online, with multi-user editing, privacy controls, charts, reports, and media support.
Classification mismatch is the first finding. Despite the description's phrasing, fisharebest/webtrees is not a Laravel package — it is a standalone, server-rendered PHP application that consumes a few Laravel components (illuminate/database for query building, Blade for templating) as independently versioned Composer dependencies. There is no service provider, no publishable config, no facade, no package-style extension contract. composer require fisharebest/webtrees inside an existing Laravel app is not a supported integration path; the project ships its own bootstrap, container/registry, routing, session handling, authentication, migration runner, and theme layer.
Architecture fit: low. webtrees is a monolith with global/static state, its own module registry, and opinionated conventions (GEDCOM-record-backed Eloquent-style models keyed by xref IDs, not auto-increment primary keys). Dropping it beside a Laravel application means two competing auth systems, two session stores, two migration timelines, and two view layers. There is meaningful conceptual overlap and almost no compositional overlap.
Integration feasibility: constrained by the absence of an API. The core application is HTML-in/HTML-out; there is no first-party REST/JSON API. Machine integration must go through one of: (a) GEDCOM 5.5.1 file import/export, (b) direct database reads against an internal schema with no stability guarantee, or (c) an in-process module that registers routes against webtrees' own router. Only (a) is a defensible contract.
Technical risk: high, concentrated in three areas.
| Risk | Severity | Note |
|---|---|---|
| License: GPL-3.0 | High | Viral copyleft. Linking or distributing a derivative inside a proprietary product triggers source-disclosure obligations. Requires legal sign-off before any code reuse, and rules out "extract a class and ship it" as a casual move. |
| Release metadata contradicting reality | High | The record states last release 2016-12-05, which conflicts with the description's framing of a maintained 2.x product. One of the two is wrong. An eight-year-stale release is a hard blocker; a mis-scraped metric is a data-quality failure in the evaluation pipeline. Must be resolved against GitHub Releases and Packagist before any build decision. |
| PII exposure surface | High | The data model is deliberately about living people. Privacy rules are per-tree, per-person, per-user, with role-based visibility — a misconfiguration or a module bug is a personal-data incident, not a UI bug. |
| No stable extension/API contract | Medium | Modules hook internal events; upgrades across major versions are documented migrations, not semver-safe bumps. |
Key questions before committing engineering time:
illuminate/* constraints does it pin, and do they collide with our framework version?illuminate/* and PHP minor versions are supported, and what is the stated EOL policy?Bottom line: treat this as a reference implementation and a possible sidecar appliance, not as a dependency. The score of ~34.9 with an opportunity score of ~26.25 is consistent with that read: a mature artifact with limited leverage against our roadmap.
Stack fit is runtime-compatible but framework-incompatible. PHP 8.x + MySQL/MariaDB/PostgreSQL/SQLite satisfies our infrastructure, but the shared-dependency axis is the problem: webtrees' pinned illuminate/* and Blade versions must coexist with ours in a monorepo or be isolated entirely. Do not attempt to co-resolve them in one composer.json; isolate at the process boundary.
Four viable paths, ranked:
Migration path: GEDCOM is the contract boundary, and only GEDCOM. Any inbound data migration uses GEDCOM 5.5.1 export from the source system, import into webtrees, and round-trip validation. Build a fixture suite before the spike: a handful of real trees with blended families, adoptions, multiple marriages, unknown parents, source citations, and multimedia pointers. Assert record counts, xref stability, and that privacy flags survive export→import→export unchanged. Media files are a separate problem — they are filesystem/URL references inside GEDCOM, so they need a mapping table and object-storage strategy, and this is where most migrations silently lose data.
Compatibility: SSO is not native. Authentication into a sidecar requires an OIDC/SAML module or proxy-level identity injection, and that module becomes a pinned, upgrade-blocking fork. Budget for it explicitly rather than assuming it is configuration.
Sequencing, with decision gates:
Maintenance. No vendor, no LTS, no support contract. GPL-3.0 means we own every bug we hit and every security patch we backport. If we operate a sidecar, we inherit a PHP application with its own upgrade treadmill, and major-version upgrades are documented data migrations rather than drop-in bumps — plan one engineer-quarter of risk per major upgrade. Pinning is mandatory; auto-updates are not acceptable given the PII surface.
Support. Community forum and issue tracker only. Response times are volunteer-shaped. There is no SLA to inherit and no escalation path. For an internal tool that is tolerable; for anything user-facing with uptime expectations it must be explicit in the risk register.
Scaling. The read/write profile is favorable: heavily read-dominant, PHP-FPM stateless per request, horizontally scalable behind a load balancer with a shared database. The database is the bottleneck, not the application tier. Media should move to object storage with a CDN rather than local disk, since multimedia is first-class. Cron is required for scheduled jobs; there is no queue-worker model to lean on, so anything long-running (large GEDCOM imports, report generation) blocks a request unless we wrap it. Large imports need explicit progress tracking and resumability, which the core does not give us.
Failure modes to design for, in priority order:
illuminate/* set will age out of security support before our own framework does, forcing a coupled upgrade.Ramp-up. Two distinct learning curves, and they compound. First, genealogy domain literacy: GEDCOM 5.5.1 is a dense specification with genuinely ambiguous corners (pedigree linkage, adoption events, source citations, confidence levels) and practitioners are unforgiving about data fidelity. Second, the codebase: legacy-flavored PHP with global state and internal registries that does not match the "modern Laravel" framing in the description. A new engineer should be assumed to need two to three weeks before they can safely touch the privacy layer, and that estimate should not be compressed.
Recommendation. Cap investment at the timeboxed spike plus a legal opinion. Default to the reference-only path and, if a genealogy feature is genuinely on the roadmap, to a sidecar deployment with GEDCOM as the sole integration contract. Do not make this a dependency of the main application.
How can I help you explore Laravel packages today?