{"id":15017256,"url":"https://github.com/nigelhorne/ged2site","last_synced_at":"2025-07-18T01:36:21.942Z","repository":{"id":40005116,"uuid":"48782889","full_name":"nigelhorne/ged2site","owner":"nigelhorne","description":"Create a family tree website from a Gedcom file","archived":false,"fork":false,"pushed_at":"2025-07-10T12:02:29.000Z","size":247457,"stargazers_count":43,"open_issues_count":3,"forks_count":4,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-07-10T19:43:07.496Z","etag":null,"topics":["ancestry","calendar","family-tree","family-tree-website","findmypast","gedcom","genealogy","graphviz","perl","perl-script","perl5","vwf","website-generation"],"latest_commit_sha":null,"homepage":"https://genealogy.nigelhorne.com","language":"Perl","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nigelhorne.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":"nigelhorne","patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"lfx_crowdfunding":null,"custom":["https://www.paypal.com/paypalme/bandsman"]}},"created_at":"2015-12-30T05:05:17.000Z","updated_at":"2025-07-10T12:02:33.000Z","dependencies_parsed_at":"2024-03-09T00:28:04.505Z","dependency_job_id":"f56c6ac1-a0ba-4046-a1cc-b8f8ef543c0d","html_url":"https://github.com/nigelhorne/ged2site","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/nigelhorne/ged2site","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nigelhorne%2Fged2site","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nigelhorne%2Fged2site/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nigelhorne%2Fged2site/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nigelhorne%2Fged2site/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nigelhorne","download_url":"https://codeload.github.com/nigelhorne/ged2site/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nigelhorne%2Fged2site/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265688345,"owners_count":23811417,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["ancestry","calendar","family-tree","family-tree-website","findmypast","gedcom","genealogy","graphviz","perl","perl-script","perl5","vwf","website-generation"],"created_at":"2024-09-24T19:50:10.721Z","updated_at":"2025-07-18T01:36:21.928Z","avatar_url":"https://github.com/nigelhorne.png","language":"Perl","funding_links":["https://github.com/sponsors/nigelhorne","https://www.paypal.com/paypalme/bandsman"],"categories":[],"sub_categories":[],"readme":"[![Tweet](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://x.com/intent/tweet?text=A+utility+for+creating+a+family+history+website+from+a+gedcoms+file+#genealogy\u0026url=https://github.com/nigelhorne/ged2site\u0026via=nigelhorne)\n\n# ged2site\n\nCreate a Stunning Family Tree Website from Your Gedcom File!\n\nTurn your Gedcom file into a fully interactive family tree website with Ged2Site.\nThis powerful tool transforms your genealogical data into a beautifully structured HTML site,\nmaking it easy to share your family history with others.\n\nCheck out a live example of a genealogy website built with Ged2Site:\n[Nigel Horne's Family Tree](https://genealogy.nigelhorne.com).\n\n## Need Help?\n\nGed2Site is a feature-rich and advanced tool, and while it’s designed to be accessible, setting up a genealogy website can be complex.\nIf you’re a genealogist without an IT background, I’d be happy to assist you.\nReach out to me at \u003cnjh at nigelhorne.com\u003e for professional support.\n\n## Compatibility\n\nIt's been extensively tested with Gedcoms exported and downloaded from\nFindMyPast and Family Tree Maker, though it should work fine with other systems\nsuch as GenesReunited and Ancestry.\n\n## Usage\n\nTypical usage:\n\n    ged2site -cFdh 'Your Name' gedfile.ged\n\nYou will then have two sites created in sub-directories\n- static-site is static HTML (no CGI),\n- dynamic-site is a [VWF](//github.com/nigelhorne/vwf) based website which uses templates to support more than one\nlanguage and present different content to mobile/web/search-engine clients.\nThis allows for better SEO and a seamless experience on mobile as well as desktops\nin a multi-lingual environment.\nThis is much more easily customisable\nby you to create the look and feel of the website that you want.\nThe dynamic site contains more data visualisation such as trend analysis,\ntime-lapse views and heatmaps in a visually appealing way.\n\n## How to Use Ged2Site\n\nTo generate your family tree website, run the following command:\n\n    ged2site -cFdh 'Your Name' gedfile.ged\n\nThis will create two website versions in separate folders:\n\n* static-site – A simple, no-frills HTML website that works without CGI.\n* dynamic-site – A more advanced website powered by [VWF](https://github.com/nigelhorne/vwf).\n\nWhat’s the Difference?\n* Static Site:\n\t* Basic HTML, easy to use, no extra setup required.\n* Dynamic Site:\n\t* Supports multiple languages.\n\t* Adapts content for mobile, web, and search engines.\n\t* Improves SEO and user experience.\n\t* Easier to customize for a unique look and feel.\n\t* Includes data visualizations like trend analysis, time-lapse views, and heatmaps.\n\nIf you want a flexible, visually rich, and customizable family tree website, the dynamic site is the better option.\n\n## **How to Publish Your Site**\n\n### **For the Static Site**\nIf you're using the **static site**,\nsimply **copy all files from the `static-site` directory** to your web server.\nNo extra setup is needed.\n\n### **For the Dynamic Site**\nIf you prefer the **dynamic site**,\nfollow these steps:\n\n#### **1. Create a Configuration File**\n- Go to the `conf` directory and create a new file named after your website's hostname (e.g., `yourdomain.com`).\n- Use the `default` file as a template.\n- Update the configuration file with key details:\n\n  ```\n  root_dir: /full/path/to/your/website\n  SiteTitle: Your Website Title\n  memory_cache: Stores short-term data like user locations\n  disc_cache: Stores long-term data for caching and performance\n  contact: Your Name and Email Address\n  ```\n\n#### **2. Customize the Site**\nModify the **template files** to change the website’s design and layout to match your needs.\n\n#### **3. Upload to Your Web Server**\nCopy the entire `dynamic-site` directory to your web server.\n\n#### **4. Optimize Your Database (Optional)**\nThe dynamic site stores data in **CSV files**, but for faster performance, you can **convert them to SQLite** using [`csv2sqlite`](http://search.cpan.org/~rwstauner/App-csv2sqlite/).\n\nRun this command on each CSV file:\n```\ncsv2sqlite -o sep_char='!' -o allow_loose_quotes=1 people.csv people.sql\n```\n\n#### **5. Clear Old Cache**\nBefore uploading a new version of your site, **delete the `save_to` directory and the disc cache** to remove outdated page copies.\n\n#### **6. Set Up Logging (Optional)**\nIf you want logging, edit the `page.l4pconf` file to configure it to your needs.\n\nOnce you've completed these steps, your **dynamic family tree website** will be live and optimized.\n\n## **Installing Dependencies for Ged2Site**\n\n### **Automatic Installation**\nGed2Site relies on multiple **CPAN modules**.\nIf they are missing, the program will attempt to **install them automatically** when you run it for the first time **without any arguments**\nand set the evironment variable BOOTSTRAP.\n\n\n```\nBOOTSTRAP=1 ged2site\n```\n\nHowever, this **may fail** with a \"permission denied\" error if:\n- You are **not running as root** (which is the correct and safer way).\n- You are **not using** tools like [local::lib](https://metacpan.org/pod/local::lib) or [Perlbrew](https://perlbrew.pl/).\n\n### **Manual Installation (If Automatic Installation Fails)**\nIf the modules do not install automatically, you have three options:\n\n1. **Use `local::lib`** (Recommended)\n   - Set up `local::lib` by following [these instructions](https://metacpan.org/pod/local::lib).\n   - Install missing modules manually with CPAN:\n     ```\n     cpan install Module::Name\n     ```\n\n2. **Use Perlbrew**\n   - Install [Perlbrew](https://perlbrew.pl/) to manage your Perl environment.\n   - Install modules within your Perlbrew-managed environment.\n\n3. **Run Ged2Site as Root** (Not Recommended)\n   - You **can** run it as root, but this **is not advised** due to security risks.\n\n### **Alternative Installation Method (Experimental)**\nYou can also try installing dependencies with:\n\n```\ncpan -i lazy \u0026\u0026 perl -Mlazy ged2site \u0026\u0026 perl -Mlazy dynamic-site/cgi-bin/page.cgi\n```\n\n**Note:** This method is **untested** and may not work.\n\n### **Installing Gedcom (Required for Calendars)**\nTo enable calendar features on the **dynamic site**, you **must install Gedcom**:\n\n```\ngit clone https://github.com/nigelhorne/gedcom.git\ncd gedcom\nperl Makefile.PL \u0026\u0026 make \u0026\u0026 make install\n```\n\n### **Additional Setup for FreeBSD**\nIf you're using **FreeBSD**, install required packages and create symbolic links:\n\n```\nsudo pkg install pkgconf gdlib graphviz ImageMagick7\ncd /usr/local/lib\nsudo ln -s libMagick++-7.so libMagickCore-7.Q16HDRI.so\n```\n\n### **Final Check**\nOnce dependencies are installed, **try running Ged2Site again**. If you still encounter issues, ensure your Perl environment is properly configured using `local::lib` or `Perlbrew`.\n\n## Runtime Options\n\nGed2Site comes with various options that let you customize how your family tree website is generated.\nHere’s what each option does:\n\n### Command-Line Flags\n\n| Flag | Description |\n| ---- | ----------- |\n| `-c` | Include citations in the output. |\n| `-d` | Download and embed media files (e.g., images, documents) instead of linking to them. This is useful for paid sites like FindMyPast (FMP). |\n| `-f` | Treat warnings as errors (stops execution if warnings occur). Implies `-w`. |\n| `-F` | Generate a graphical family tree (requires GraphViz). |\n| `-g` | Generate a Google verification file for search engine indexing. Enter the verification code **without** the `.html` extension. |\n| `-h` | Set the home (starting) person in the tree. |\n| `-l` | Include living people in the generated site. |\n| `-L n` | Limit the output to **n** records. |\n| `-m` | Add an interactive map to each page showing event locations. |\n| `-J` | Provide a Google Maps JavaScript API key for displaying maps. The key should have an application restriction for your website. If omitted, OpenStreetMaps is used. |\n| `-G` | Provide a Google Maps Geolocation API key for mapping event locations. |\n| `-w` | Enable warnings for inconsistent data (like a lint tool for Gedcom files). |\n| `-W` | Disable colorized warning output. |\n| `-x f` | Use a previous `people.xml` file to track changes and generate a blog (TODO feature). |\n\n### Important Notes\n\n- If you use the `-m` option (maps), **your Google API key will be included in the website’s code**. To protect it, restrict the key’s use to your host’s IP address.\n- By default, Ged2Site is designed to **protect the privacy of living individuals**.\n\n### Additional Features\n\n- If [Gedcom](https://github.com/nigelhorne/gedcom) is installed, Ged2Site can generate a **calendar of births and deaths**, with a dedicated page for each month of the current year.\n- Ged2Site produces an **XML file (`people.xml`)** containing parsed output, which can be used in other genealogy software for queries. This means it also functions as a **Gedcom-to-XML converter**.\n\n### Configuration File (`ged2site.conf`)\n\nSome options can be stored in a configuration file instead of passing them every time in the command line:\n\n| Flag | Configuration Key |\n| ---- | ----------------- |\n| `-h` | `home` (home person) |\n| `-g` | `google_verification` (Google site verification) |\n| `-G` | `google_maps_geolocation_key` (can also be set via `GMAP_KEY` environment variable) |\n| `-J` | `google_maps_javascript_key` |\n\n### Getting API Keys\n\nTo use Google Maps or site verification features, get free API keys from [Google API Console](https://console.developers.google.com/apis/credentials).\n\n## Ancestry on Windows\n\nI use FindMyPast on Linux because the export of images is better on FMP and\nbecause Linux.  I recognise that many folks use Ancestry on Windows, so I\nhave this rough guide that works for me but understand that you'll still\nneed to be an advanced Windows user, this is not for the Novice.  If you\nstill need help, e-mail me or put an issue on github.com/nigelhorne/ged2site.\n\n* Firstly, if you're running Windows 10, install\n[Ubuntu](https://ubuntu.com/tutorials/ubuntu-on-windows#1-overview)\nor install Perl directly, either ActiveState or Strawberry should work fine.\nI have also had success using Cygwin's Perl.\n\n* Next follow the instructions at [local::lib](https://metacpan.org/pod/local::lib#The-bootstrapping-technique).\n\n* Load in all the CPAN modules that ged2site uses.\nIf you're not sure, run ged2site with no arguments and the program will install its core modules to get started.\n\n* Install Family Tree Maker.  Sorry; there's no alternative so you'll just have\nto find a copy and buy it.\n\n* Sync your ACOM tree to FTM, ensuring you also sync all of the media.\n\n* Create a Gedcom using File-\u003eExport, and choosing GEDCOM5.5 as the\noutput format.\n\n* Run ged2site on that saved Gedcom file.\n\n* -F may not work because it depends on Graphviz being found,\nbut could work under Cygwin. On the other hand, I've been hit by a Cygwin bug\nwhen trying to call Graphviz from ged2site.  This may be because ged2site\npipes output to Graphviz, perhaps it would work if it used a temporary file\nas input.\n\n## .htaccess\nI strongly suggest adding this to your .htaccess file:\n\n```\n# disallow access to special directories and feedback a 404 error\nRedirectMatch 404 /\\\\.svn(/|$)\nRedirectMatch 404 /\\\\.git(/|$)\n\n\u003cIfModule mod_expires.c\u003e\n# http://httpd.apache.org/docs/2.0/mod/mod_expires.html\nExpiresActive On\n\nExpiresDefault \"access plus 1 hour\"\n\nExpiresByType image/x-icon \"access plus 1 month\"\nExpiresByType image/png \"access plus 1 month\"\nExpiresByType image/jpg \"access plus 1 month\"\nExpiresByType image/gif \"access plus 1 month\"\nExpiresByType image/jpeg \"access plus 1 month\"\n\nExpiresByType text/css \"access plus 1 day\"\nExpiresByType text/javascript \"access plus 1 day\"\n\u003c/IfModule\u003e\n```\n\n## Environment Variables\n\n`Ged2Site` honours the following environment variables for improved compatibility:\n\n* BOOTSTRAP - Attempt to install the modules you need\n* BMAP_KEY - Bing (virtualearth.net) API Key\n* GEONAMES_USER - geonames.org registered username\n* GMAP_KEY - Google Places (maps.googleapis.com) API Key\n* LANG - some handling of en_GB and en_US translating between then, fr_FR is a work in progress\n* OPENADDR_HOME - directory of data from http -//results.openaddresses.io/\n* REDIS_SERVER - ip:port pair of where to cache geo-coding data\n* OPENAI_KEY - experimental: use the key from openai.com to enhance the text\n\n## Debugging and Developing\n\nBecause the dynamic ged2site site uses VWF,\nit is possible to run the scripts from the command\nline simulating different environments and thus test the look and feel of your\nsite before you deploy. Be aware that you will also see debugging messages.\n\n    cd dynamic-site/bin \u0026\u0026 ./tosqlite\n    cd ../cgi-bin\n    ./page.fcgi page=people home=1 # Look at your home entry from the -h option\n    ./page.fcgi page=surnames surname=horne # List people whose surname is Horne\n    ./page.fcgi page=surnames surname=horne lang=fr # List people whose surname is Horne, in French\n    ./page.fcgi --mobile page=surnames surname=horne # List people whose surname is Horne, as it would appear on a smart-phone\n\nTo see the environment of the system to help with debugging\n\n    https://localhost/cgi-bin/page.fcgi?page=meta-data\n\nDifferent people use different ways to format and enter information,\nged2site goes out of its way to support all of these,\nsuch as different location and date formats.\nIf your data shows issues with this aim, let me know.\n\n## Premium Support\n\nPremium support covers:\n\n### Consulting\n\nExpertise in setting up, customizing, and maintaining ged2site.\n\n### Training\n\nPaid training sessions, webinars, or workshops.\n\n### Technical Support\n\nPremium support plans with a guaranteed response time and direct assistance.\n\n### Family History Website\n\nHost your family history securely and beautifully.\nBy sending your Gedcom, preserving your family’s legacy online has never been easier.\nWhether you're just starting your genealogy journey or managing a massive archive,\njust send your Gedcom and I'll do the rest.\n\n## **Ged2Site Licence Agreement**\n\n### **Personal Use:**\nGed2Site is **free to use** for a **single individual** on **one computer** for **personal, non-commercial purposes only**.\n\n### **Restricted Use:**\nAny other use—including but not limited to **commercial, charitable, educational, or government organizations**—**requires a written license agreement**.\n\n### **License Application:**\nOrganizations or individuals falling outside the personal-use terms **must request written permission** and obtain a license before using Ged2Site.\n\nFor licensing enquiries, please contact: **\u003c njh @ nigelhorne.com \u003e**.\n\n## Bugs\n\nIf you see this message in your log file:\n```\nCan't locate auto/NetAddr/IP/InetBase/AF_INET6.al\n```\nthis is because of a bug in the autoloader.  The fix is to edit NetAddr/IP/InetBase.pm\nadding this toward the top, just after the package statement:\n\n```\nuse Socket;\n```\n\nAncestry images that you've uploaded yourself should work fine.  However, images attached\nfrom another tree to your tree are not downloaded.  Either use\nFTM or download from the other tree to your desktop and upload to your tree.\n\nThere will be numerous strange handling of Gedcoms since it's not that tightly\nobserved by websites.\n\nIf you see lumpy English text in the output or just plain mistakes,\nplease e-mail me or add a bug report to github.com/nigelhorne/ged2site.\n\nProfile pictures are not handled with output from Ancestry.  Findmypast is handled correctly.\n\nThe storytelling format is hard coded, it would be useful if it were configurable.\n\n## XML File Generation\n\nGed2Site generates an XML file for each individual in the database.\nThese files are primarily used to create dynamic content for websites.\nHowever, in principle, they can be imported into any data viewing system that supports XML.\n\n### File Location\n\nThe XML files are stored in the following directory:\n\n```\n.../dynamic_site/data/people/${xref}.XML\n```\n\nEach file is named based on the unique xref identifier assigned to the individual.\n\n### Usage\n\nThe XML files enable dynamic content generation on websites.\nThey can be parsed and imported into other data visualization or genealogy tools,\nthe structured format allows easy integration with third-party systems.\nFor further details on the XML structure and how to use these files, refer to the XML Schema Documentation or contact the Nigel Horne.\n\n## Acknowledgements\n\nhttps://fullcalendar.io for the calendar view\n\nhttps://github.com/weichie/animated-Timeline for the family history view\n\nGoogle for the map page\n\nRon Savage for the HTML::Timeline module which sparked a template for the timeline code\n\nGraphviz for the family tree and Tree::Family from CPAN for the inspiration\nand code to use as a template\n\nSo many Perl CPAN modules that if I list them all I'll miss one, but special\nmention goes to the Gedcom module.\n\nMagnific Popup http://dimsemenov.com/plugins/magnific-popup/\n\n## See Also\n\n* [gedcom](https://github.com/nigelhorne/gedcom) - a general-purpose utility for Gedcom files\n* [gedcmp](https://github.com/nigelhorne/gedcmp) - compare two Gedcoms\n* [The Perl-GEDCOM Mailing List](https://www.miskatonic.org/pg/) - dead mailing list, you can check the archives\n\n## LICENSE AND COPYRIGHT\n\nCopyright 2015-2025 Nigel Horne.\n\n## Support\n\nPlease report any bugs or feature requests to the author.\nThis module is provided as-is without any warranty.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnigelhorne%2Fged2site","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnigelhorne%2Fged2site","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnigelhorne%2Fged2site/lists"}