Home / Blog Menu ↓

Blog: #genealogy

37 posts / tag feed / about the blog / archive / tags

It took me a while to get around to this, but I’ve finally posted the code for tabular pedigrees, family pedigrees, and family sheets (which includes ancestor line charts and family sparklines).

Reply via email or office hours

After linking to Felt not too long ago, I actually tried it out and goodness, it’s a delight. Easy to use, beautiful (I like the graphic design so much more than what Google Maps has), and the tools are great.

I made a family history map showing the towns where my Spanish and Cuban ancestors lived and shared it with my siblings:

Map of part of northern Spain
Map of part of Cuba

Though I haven’t done these things in this particular map, being able to call out specific buildings and add text labels and custom polygons are all features that make Felt compelling to me. For example, I’m making another map showing where my dad’s family is from. I know my great-grandmother had a bakery on a certain street, but I don’t know exactly where it was on that street. Rather than choosing some arbitrary point along the street for a misleading pin, I’m able to mark the whole street with a custom polygon.

It feels like Google Docs for maps. Love it.

Reply via email or office hours

Family source list WIP part 1

In the interest of working more with the garage door up, I’m going to write this as I work on this project, starting at the beginning. (Rather than just posting about it when it’s done.)

The idea is to have some kind of list (chart isn’t the right word) where I can put what I know about a family (genealogy-wise) and how I know it (which sources provide evidence). I want the output format to be PDF so it’s easily printable/archivable.

At this point I have a rough picture in my head of what it might look like:

  • Headings (one for each person, probably some more general groups too), and then under each heading a list of facts (birth date, place, marriage, kids, etc.) with the sources for each.
  • Some sources are used more than once, so having some way to simplify that (a table of sources, maybe) would be good.
  • Also, some way to mark a fact as less sure (more of a supposition). This makes me think that “fact” is probably the wrong word to use here. “Assertion” makes sense but also feels a bit much. “Point,” maybe? This is almost certainly only going to be used internally (I’m not planning to put the word on the list itself), but I try to get the nomenclature right for my own sake. A person has a list of points? “Attribute” feels more correct but also too technical.
  • As far as the supposition aspect goes, I don’t know yet if I want a binary (unproven, proven) or a gradient (0% sure, 50% sure, 100% sure, for example). Probably going to start with a binary to keep things simpler.

While it’s very tempting right now to get the code environment set up and start mocking things up directly in HTML (since that’s what I’m using to go to PDF), I’m going to make myself write some mocks by hand first instead. And then maybe do a quick iteration in Google Docs.

Okay, I ended up going straight to Google Docs, which worked out well since I went through seven or eight iterations and I’m still not there yet. Current status (keeping in mind that this is more about sussing out how to lay out the information and is far from a finished design):



  • The format right now for each line is “fact/supposition/point — sources — reasoning”.
  • If there’s more than one source, we apply the abcde etc. naming so we can easily and succinctly distinguish between them in the reasoning section.
  • The reasoning section is optional if it’s straightforward based on the source
  • I initially had a table of sources included at the end but it felt like overkill. At the point/line level, it seems better to have the actual source description (“1850 census”) rather than some cryptic reference to the table like “[12]”. Then the user doesn’t have to keep going back and forth to figure out what the sources are.
  • I’m thinking of grouping things better when I do the final design, but I’m not worrying about that any more for now.
  • I haven’t yet gotten to the suppositions/assertions.

Also, I’ve decided to call this a family source list. More to come!

Reply via email or office hours

Projects — Prints 2.6

We’ll group the projects together today.

Family pedigrees

An old-yet-new chart type: family pedigrees.


As you can see, it’s a little different from the initial design. This modern incarnation admittedly isn’t as pretty in some ways, but it’s a heck of a lot easier to lay out programmatically.

New things: It shows which child the line comes through, I added the lifespan right after each parent’s name, and I added indicators for the children showing how many kids they had (the dot) and how many marriages (the slash, though if they were married only once and had children, I left the marriage indicator off).

It also supports four generations, admittedly with less space and smaller type:


I tried it without the table borders, by the way. While it was more readable than I expected, it felt a little too loose and unmoored.

The input uses ArchieML and currently looks like this:


family: 1.1
marriage: 30 Dec 1829 in Polanco
father: José Antonio Fuentevilla Fuentevilla // 1809-1878
mother: Manuela Gándara Cobo // 1811-1879
  name: ? // 1830-1831

  name: Josefa // 1832-1834

  name: Francisca Maria // 1835-1843

  name: Maria Remedios // 1838-1898
  children: 6

  name: Maria Luisa // 1841-1916
  marriages: 1

  name: Manuel // 1845-

  name: < Maria Isabel // 1848-1928
  children: 9

  name: Maria Dolores // 1853-1853

  name: José Maria // 1858-1858

# --------------------------------------

family: 2.1
marriage: 29 Feb 1808 in Polanco
father: José Fuentevilla Piñera // 1779-1855
mother: Vicenta Manuela Fuentevilla Ruiz // 1787-1828
  name: < José Antonio // 1809-1878
  children: 9



Right now the family numbering is table-based (column, row), but eventually I think I probably want to make it hierarchical (somehow) so it’s easier to know which cell to put things in.

Timeline charts

Another new chart of sorts: timelines. I’ve been sorting through my Cuban lines and realized I needed some way to map out everybody so I could see the bigger picture.


The input is an ArchieML file that just lists events with dates and optional places:

title: Cuba timeline


event: Antonio Sánchez Rodríguez Díaz marries Ana Josefa Muñoz y Martínez Machado, possibly in El Calvario
daterange: 1790s-1800s

event: Agustin Sánchez Muñoz marries Ana Josefa Montoro, who then dies before 7 Feb 1835
daterange: 1790s-1830s

event: Rafaela Crispina Sánchez Muñoz born to Antonio Sánchez Rodríguez Díaz and Ana Josefa Muñoz y Martínez Machado
date: 1805 Oct 25
place: Matanzas City

event: Domingo Sánchez Muñoz born to Antonio Sánchez Rodríguez Díaz and Ana Josefa Muñoz y Martínez Machado
date: 1807 May 12
place: Matanzas City

event: Antonia Crispina Vargas Hernández is born to José Vargas and Gertrudis Hernández
daterange: 1800s
place: Güira de Melena, Mayabeque


If the date is a range, it’s italicized to show that it’s broader than a specific date.

(I originally was just going to use Google Docs for this, by the way, and made an initial prototype there. Having to do all the formatting manually got old, though, so I scripted it. Now I can just focus on the content.)

Family sheets update

I’ve got almost all the family sheet functionality ported to Node/JavaScript and cleaned up. (The sparklines code now uses tracks and markers in a way that is much more extensible and easier to work with.) In the process, I also revised the resolution (before, it just keyed off the year, but now it uses the month and day if present as well, so spacing is more accurate), added dotted-line support for date ranges (for birth and death), and added a marker for divorce (a skinny X):


Still have a number of bugs to fix, but it’s getting close.

Tabular pedigrees update

I ported the tabular pedigrees to Node/JavaScript and added support for seven-generation charts:


Comparison to the six-generation chart:


The shaded cells, by the way, indicate that I haven’t yet verified those people. Basically a TODO comment for myself.

Can’t wait till Chrome supports border stroke widths smaller than 1pt.

Quick links

Last and sort of least, I’m slowly putting together a page with quick links to the various Torre de’ Passeri civil registration scans on FamilySearch, to save myself some time. Planning to do this for the other localities I do research in as well.

Reply via email or office hours

I’ve been doing a lot of genealogy lately, and as part of that I’ve been refining the family sheets I mentioned last time:


Ancestor line chart

The main new thing is the ancestor line chart in the upper right, showing where the family is on my line in relation to me, with fathers on the left and mothers on the right. (So this family is my mother’s mother’s mother’s father’s father’s parents.) Each person’s initial is in the circle.

For collateral lines, it looks like this:


If the family sheet were for Agustin’s grandchildren or great-grandchildren, the collateral line would extend further downward (with each collateral line generation lining up with its parallel main line generation).

The syntax for both ancestor line charts:

line: -T -J -A A- E- LF

line: -T J- A- -I -M -J PA > A-

I went through a whole bunch of iterations on the syntax before landing on this, which I really like. It’s concise and reads easily to me, and it also happens to be very, very easy to parse.

Family sparklines

I’ve changed the family sparklines to show whether children are sons (hollow diamonds) or daughters (filled circles), and the marriages are now slightly thicker and longer vertical lines. (So in the second screenshot, you can see that Agustin married three times. And yes, he had a couple children when he was in his sixties!)

Though these don’t show it, I’ve also added support for twins and other multiple births.

Next up, I’m planning to add dotted lines for date ranges (“died between X and Y”) and markers for divorce and for the death of a spouse. Also working toward making this month-level granular instead of just year-level. (Right now, if someone is born in January of one year and their next sibling is born December of the next year, the sparklines make it look like they’re only one year apart even though in reality they’re almost two apart.)

Other changes

The layout has changed a bit, mostly to give more horizontal room for the sparklines, and to set the husband and wife side by side (which saves vertical space and also creates a spatial analogue to the ancestor line chart).

I’m no longer manually (and laboriously) loading these in the browser to export the PDFs. Instead, I call Chrome in headless mode as part of my script:

/Applications/Google Chrome.app/Contents/MacOS/Google Chrome \
  --headless \
  --disable-gpu \
  --print-to-pdf \
  --print-to-pdf-no-header \

Last (and also least), I’ve switched the font from EB Garamond to Clifford Pro. Mmm.

The code

Right now the code is a bit of a mess. Now that the prototype has served its purpose, I’m about to rearchitect it all and port it to Node, possibly Bun, possibly with ArchieML. (It’s currently Python with Jinja2 and YAML. For years I’ve used Python for writing almost all my command-line tools, but lately I find that I’d rather write JavaScript. Time for an ecosystem shift.)

Reply via email or office hours

Family sheets

As part of my quest to start saving my genealogical research on paper, I built a small system for generating family sheet PDFs. (Kind of like my family group record redesigns.)

It takes input like this:

    name: José Antonio Fuentevilla Fuentevilla
      date: 13 Apr 1809
      place: Polanco, Santander, Spain
      date: 23 Dec 1878
      place: Polanco, Santander, Spain
      father: José Fuentevilla Piñera
      mother: Vicenta Manuela Fuentevilla Ruiz
      link: SE-0013

    name: Manuela Gándara Cobo
      date: about 1811
      place: Setién, Marina de Cudeyo, Santander, Spain
      date: 30 Nov 1879
      place: Polanco, Santander, Spain
      father: José Gandara Valdecilla
      mother: Josefa Cobo Palacio

    date: 30 Dec 1829
    place: Polanco, Santander, Spain

    - name: "[unnamed infant]"
        date: about 1830
        place: Polanco, Santander, Spain
        date: 14 Jan 1831
        place: Polanco, Santander, Spain

    - name: Josefa Fuentevilla Gandara
        date: 31 Jul 1832
        place: Polanco, Santander, Spain
        date: 5 Aug 1834
        place: Polanco, Santander, Spain


And then generates an HTML page which I can then load in a browser and print to get this:


I’m using a page-naming scheme that helps me know which side of my family it’s on. The numbering is in order of creation. The family sparklines show an overview of the family. There’s a notes section (not shown) where I include notes on the family and what research we still need to do. The age calculations are primitive but get the idea across.

It takes a bit of time to copy things out of FamilySearch and keep it up to date, but I’m finding that these sheets help me see what work I still need to do. And it’s nice having something material and persistent so I’m not always on a screen.

Reply via email or office hours

Family sparklines

I’ve been thinking more about genealogy sparklines. Decided to pick up the recent work I did in that vein and make it work for families, for use in my new family sheets. This also riffs off my old family analysis project.

Introducing the first draft of family sparklines:


(At this point are they really still sparklines, you ask? Good question.)

These families are from my Spanish line, by the way, which is why there is an abundance of initials.

Basic idea: larger hollow circles are marriages, smaller filled circles are children. Vertical marks at beginning or end for birth and death. (If the vertical tick isn’t present, the birth or death date isn’t known.) Father at the top of the chart, mother at the bottom, children in the middle. Vertical line from father to mother for the parents’ marriage. In cases where the marriage isn’t known (like in the bottom right MA/CS family), the vertical line and circles are left out. People’s initials are at the right to help know who is who. The smaller vertical tick marks on each line mark ten years of age. If there isn’t a death date, it goes five years past the last known date.

It’s still a work in progress, but I like how it provides an at-a-glance overview of a family. With the JAFF/MGC family in the upper left, for example, I can easily see that:

  • The parents were alive for all three marriages of their children and most of the grandkids’ births
  • They had five children die young
  • I don’t have a marriage or death for MFG
  • I haven’t found any children for MLFG

You can also see a child born before the wedding, how old people were when they married, gaps where there might have been children, etc.

I’m sure I’ll refine it further in the future, but I wanted to post where it’s at right now.

Reply via email or office hours

Tabular pedigree chart

Lately I’ve found myself wanting to have local, paper copies of my genealogical research. As part of that, I wrote a script that takes input like this:

- Maria Isabel Fuentevilla Gándara | 1848 | ? | Polanco, Spain
-- José Antonio Fuentevilla Fuentevilla | 1809 | 1878 | Polanco, Spain
--- José Fuentevilla Piñera | 1779 | ? | Polanco, Spain
---- José Villa Oyuela | 1737 | 1803 | Polanco, Spain
----- Juan Antonio Villa Cacho | ? | ? | Polanco, Spain
------ Santiago Villa | 1687 | ? | Polanco, Spain
------ Maria Cacho
----- Rosa Maria Oyuela | ? | 1740 | Polanco, Spain
------ Damian Oyuela | ? | 1720 |
------ Josefa Rio
---- Rosa Piñera Pereda | 1747 | 1817 | Rumoroso, Spain
----- Juan Francisco Piñera Velo | ? | ? | Rumoroso, Spain
------ Juan Piñera | ? | ? | Arce, Spain
------ Francisca Velo | ? | ? | Arce, Spain
----- Maria Pereda Fuente | ? | ? | Rumoroso, Spain
------ Francisco Pereda | ? | ? | Rumoroso, Spain
------ Anna Fuente | ? | ? | Rumoroso, Spain

And turns it into what I’m calling a tabular pedigree chart:


It’s not glamorous by any means, and it’s still a work in progress, but it was super simple to implement with HTML tables and a bit of CSS. I print it to PDF from the browser. Overall, I’m fairly happy with it.

Reply via email or office hours

Lately I’ve been playing around with implementing genealogy sparklines on the web. Still very much a work in progress, but I’m trying to do more working in public, so here’s the messy current status (and at some point I’ll post the actual HTML/CSS):

Ruby test


Implementation notes:

  • The sparklines use inline SVG
  • This test uses the <ruby> and <rt> tags, with ruby-position set to under and ruby-align set to start (though only Firefox supports it so it’s not sadly viable for actual use yet)
  • I don’t really like that it makes the leading uneven (lines that have ruby vs. lines that don’t)

Design notes:

  • Rather than having solid squares at the births and deaths, I’ve gone for vertical lines so they’re less obtrusive (and have also considered just getting rid of the vertical lines, though I haven’t tried it out yet)
  • Circles are simple so I went with them for marriages and children

Absolute positioning test


Implementation notes:

  • The names are wrapped in span tags with position: relative set, and the SVG gets position: absolute. Fairly simple.
  • Even leading!
  • There’s some wonkiness right now when the span is at the beginning of a line (the sparkline shows up at the end of the previous line), haven’t tried very hard to fix it yet

Reply via email or office hours

Accidentally spent a couple hours working on my Italian-side genealogy (late 1700s and early 1800s in Morrone del Sannio). It had been a while since I’d done much family history — long enough that I’d forgotten how easy it is to get sucked in and completely lose track of time. Whoops. Sorry, contemporary family. For the sake of the fourteen new (or rather old) direct ancestors I found, though, it seems worth it.

Reply via email or office hours