Online genealogy
webtrees is a web application for recording, viewing and sharing your family history. It imports and exports standard GEDCOM files, making it compatible with every major desktop genealogy application.
You host it on your own web server, so you stay in control of your data. Multiple family members can collaborate on the same tree at the same time, and you decide who can see what through fine-grained privacy rules.
Key features:
For user documentation, screenshots and demos visit ****.
This software is licensed under the GNU General Public License v3 or later. See LICENSE.md for the full text.
Download the latest stable release from github.com/fisharebest/webtrees/releases/latest.
| Component | Requirement |
|---|---|
| PHP | 8.3 – 8.6 |
| Database | MySQL (recommended), PostgreSQL, SQLite, or SQL Server |
| Web server | Apache, NGINX, IIS or similar (URL rewriting needed for pretty URLs) |
| Disk space | ~100 MB for application files, plus space for media and database |
Required PHP extensions: ctype, curl, gd, iconv, intl, json, mbstring,
pcre, pdo, session, xml.
Recommended PHP extensions: exif (auto-rotate images), zip (compress downloads
and use the upgrade wizard), zlib (compress HTTP responses).
PHP memory and execution time should be scaled to your tree size:
| Tree size | Memory | Max execution time |
|---|---|---|
| Small (500 individuals) | 16–32 MB | 10–20 s |
| Medium (5 000 individuals) | 32–64 MB | 20–40 s |
| Large (50 000 individuals) | 64–128 MB | 40–80 s |
Full installation and upgrade guides are available at .
…| Namespace | Directory | Standard |
|---|---|---|
Fisharebest\Webtrees\ |
app/ |
PSR-4 |
Fisharebest\Webtrees\Tests\ |
tests/ |
PSR-4 |
Global helper functions are in app/Helpers/functions.php (loaded via composer
autoload.files).
webtrees follows PSR-12 with these additional rules:
Abstract*.*Interface.*Trait.$snake_case.Type|null, not ?Type.$variables, not $vars).$color, not $colour).use; unused imports are removed.camelCase, not snake_case.For javascript, we use semistandard.
PSR standards applied:
| PSR | Topic |
|---|---|
| PSR-4 | Autoloading |
| PSR-6 | Caching |
| PSR-7 | HTTP messages |
| PSR-11 | Dependency injection container |
| PSR-12 | Coding style |
| PSR-15 | HTTP request handlers and middleware |
| PSR-17 | HTTP factories |
| PSR-18 | HTTP client |
All dependencies are pinned to exact version numbers (no ranges).
Main PHP dependencies (via Composer):
illuminate/database symfony/cache, symfony/console, symfony/mailer, symfony/http-clientleague/flysystemleague/commonmarkaura/routerMain JavaScript dependencies (via npm / webpack):
Prerequisites: PHP 8.3+, Composer, Node.js with npm.
# Install PHP dependencies
composer install
# Install JS dependencies and compile assets
npm install
npm run build
# Create a .ZIP file containing a release
composer buildRun the full local CI suite:
composer ciThis executes, in order:
| Tool | Purpose | Config file |
|---|---|---|
| PHP_CodeSniffer | PSR-12 style enforcement | phpcs.xml.dist |
| PHPUnit | Unit and feature tests | phpunit.xml.dist |
| PHPStan (level 6) | Static analysis | phpstan.neon.dist |
Individual commands:
# Coding style (fix automatically)
vendor/bin/phpcbf
# Tests with coverage
vendor/bin/phpunit
# Static analysis
vendor/bin/phpstanTests live in tests/Unit/ and tests/Feature/. Run a subset with:
vendor/bin/phpunit --filter=testMethodName
vendor/bin/phpunit tests/Feature/SomeTest.phpThe application uses PSR-15 middleware and request handlers:
index.php boots the application and dispatches the request.app/Http/Routes/.app/Http/RequestHandlers/.Most user-visible features are implemented as modules in app/Module/. Modules
implement one or more interfaces (e.g. ModuleChartInterface,
ModuleReportInterface, ModuleThemeInterface) and are auto-discovered by the
ModuleService.
Third-party modules can be placed in modules_v4/.
webtrees uses Laravel’s Illuminate Database (query builder and schema builder) without the full Laravel framework. Supported drivers:
Schema migrations are in app/Schema/. The current schema version is tracked in
app/Webtrees.php.
Table names use a configurable prefix so multiple instances can share a database.
No open issues yet, or sync has not completed.