The native family tree format of FamilyBushes.com — a single portable archive that contains your full tree, photos, and life events. This page documents the format completely, so you can read or write one yourself.
A .fbft file is the export format created by FamilyBushes.com.
Under the hood it is a standard ZIP archive — you can rename it to
.zip and open it with any archive tool. The extension stands for
Family Bushes Family Tree.
Unlike GEDCOM, which only stores text
data and references photos by path, .fbft bundles everything into
one self-contained file: people, relationships, dates, life events with map
coordinates, photos, and attachments.
my-family-tree.fbft (ZIP archive, DEFLATE)
├── family_tree.json ← all tree data (JSON, indented with 2 spaces)
├── images/ ← photo files, named {fileId}.{ext}
└── attachments/ ← document files, named {fileId}.{ext}
Everything below is a real, valid file: three people, one marriage, one custom attribute and one photo. Every other section on this page describes a field you can see here.
{
"schema": "https://familybushes.com/format/explain/fbft?version=1.0.0",
"id": "0f1d8c1e-7a3f-4a2b-9c11-6d5e4b3a2c10",
"createdAt": "2026-03-14T09:12:44.101Z",
"updatedAt": "2026-07-16T18:03:22.887Z",
"name": "The Fitzgerald Family",
"credits": "Compiled by Jane Doe, 2026",
"events": [
"$_BIRTH",
"$_MARRIED",
"$_LIVED_AT",
"$_KINDERGARTEN",
"$_SCHOOL_1",
"$_SCHOOL_2",
"$_SCHOOL_3",
"$_SCHOOL_4",
"$_MOVED",
"$_MILITARY_SERVICE",
"$_DIVORCED",
"$_DEATH",
"Emigrated"
],
"attributes": ["Occupation"],
"attributesTypeSelectString": [
{
"name": "Occupation",
"options": [
{ "value": "Teacher", "color": "#1976d2" },
{ "value": "Farmer", "color": "#2e7d32" }
]
}
],
"familyBushesWebsiteStyles": {
"lineThickness": "medium",
"lineAnimation": false,
"straightLines": false,
"personCardType": "photo-and-text",
"photoRadius": "round",
"nameRadius": "medium",
"treeTheme": "default"
},
"people": {
"1": {
"name": "Rose",
"surname": "Fitzgerald",
"surnameAssumed": "Murphy",
"gender": "FEMALE",
"information": "Moved to Boston in her twenties.",
"photos": [12],
"attachments": [],
"events": [
{
"dateStart": "1890-07-22",
"type": "$_BIRTH",
"comment": "Born at home",
"latLon": [42.3601, -71.0589]
},
{
"dateStart": "1912-09-01",
"dateEnd": "1916-06-30",
"type": "$_SCHOOL_4",
"comment": "Studied literature"
},
{
"dateStart": "1995-01-22",
"type": "$_DEATH",
"comment": ""
}
],
"attributes": { "Occupation": "Teacher" },
"createdAt": "2026-03-14T09:13:02.400Z",
"updatedAt": "2026-05-02T11:41:19.882Z"
},
"2": {
"name": "Patrick",
"surname": "Fitzgerald",
"surnameAssumed": "",
"gender": "MALE",
"information": "",
"photos": [],
"attachments": [],
"events": [
{
"dateStart": "1888-01-01",
"type": "$_BIRTH",
"comment": "Year only — the day is unknown"
}
],
"attributes": {}
},
"3": {
"name": "Mary",
"surname": "Fitzgerald",
"surnameAssumed": "",
"gender": "FEMALE",
"information": "",
"photos": [],
"attachments": [],
"events": [],
"attributes": {}
}
},
"mariages": [["1", "2", "3"]]
}
Every file we write opens with a schema field naming this page:
"schema": "https://familybushes.com/format/explain/fbft?version=1.0.0"
It is there so a tool can recognise a .fbft file for what it is,
and so a person who finds one years from now can follow the link and read what
it means. Write it as the first key.
The ?version is the version of this specification, not
of the file or the software that wrote it. It exists so revisions can be
published later without ambiguity. Version 1.0.0 is the only
one so far, so nothing needs to branch on it yet — and a file with no
schema field at all was written before it existed and should be
read as 1.0.0.
The field is a hint, not a gate: read a file that lacks it, and do not reject a version you do not recognise without looking first, since the format only ever gains optional fields.
| Field | Type | Required | Meaning |
|---|---|---|---|
schema |
string (URL) | no |
Identifies the file as .fbft and points at this page.
Always written first, so a reader can recognise the format from the
opening line. Absent in files written before it existed — treat a
missing value as version 1.0.0. See
Identifying the format.
|
id |
string (UUID) | yes | Identifies the tree. A fresh UUID is generated if missing. |
createdAt |
string (ISO 8601) | yes | When the tree was created. Defaults to now if missing. |
updatedAt |
string (ISO 8601) | yes | Last modification. Rewritten on every change. |
name |
string | yes | Tree title. May be empty. |
credits |
string | yes | Free-text attribution or author notes. May be empty. |
events |
string[] | yes | Event types available in this tree, in display order. The twelve built-ins are always appended on read, so they can never be lost. |
attributes |
string[] | yes | Names of the custom person fields this tree defines, in order. |
attributesTypeSelectString |
object[] | no |
Turns an attribute into a fixed-choice dropdown. Written as
[] when unused. See below.
|
familyBushesWebsiteStyles |
object | no | Presentation only. Omitted entirely when never customised. |
people |
object | yes | Map of person id → person object. |
mariages |
array[] | yes |
Family groups. Note the spelling — it is mariages, with
one r, everywhere in the format.
|
Keys of the people object are the person ids: numeric strings
"1", "2", "3"… A new person takes
max(existing ids) + 1. The id is the map key only — it never
appears inside the person object.
| Field | Type | If absent | Meaning |
|---|---|---|---|
name |
string | — | Given name. Leave it empty when unknown; do not write a placeholder. |
surname |
string | "" |
Family name. |
surnameAssumed |
string | "" |
Maiden name, or a surname taken later in life. |
gender |
"MALE" | "FEMALE" | "UNKNOWN" | treated as unknown | Drives the avatar and card colouring only. |
information |
string | "" |
Free-text biography or notes. |
photos |
(number | string)[] | [] |
File references — see below. |
attachments |
(number | string)[] | [] |
File references to documents. |
events |
object[] | [] |
Life events, sorted by dateStart. |
attributes |
object | no default is applied — read a missing value as {} |
Custom field name → value, both strings. |
createdAt |
string (ISO 8601) | absent | Optional. Only present on people created after it was introduced. |
updatedAt |
string (ISO 8601) | absent | Optional. Set when the person is edited. |
{
"dateStart": "1912-09-01",
"dateEnd": "1916-06-30",
"type": "$_SCHOOL_4",
"comment": "Studied literature",
"latLon": [54.6872, 25.2797]
}
| Field | Type | Meaning |
|---|---|---|
dateStart |
string |
YYYY-MM-DD. When only the year is known, use
YYYY-01-01 — the interface hides the
-01-01 suffix and shows the year alone.
|
dateEnd |
string | Optional, and only meaningful for types that span time. Never present on birth, death, marriage or divorce. |
type |
string |
A built-in key (prefixed $_) or any custom string, which
is displayed as-is.
|
comment |
string | Free text. May be empty. |
latLon |
[number, number] |
[latitude, longitude]. Omitted when
there is no place — an absent key, not null.
|
| Key | Label | Supports dateEnd |
|---|---|---|
$_BIRTH |
Was Born | no |
$_DEATH |
Passed Away | no |
$_MARRIED |
Got Married | no |
$_DIVORCED |
Got Divorced | no |
$_LIVED_AT |
Lived At | yes |
$_MOVED |
Relocated to | yes |
$_KINDERGARTEN |
Attended kindergarten | yes |
$_SCHOOL_1 |
Elementary school | yes |
$_SCHOOL_2 |
Middle school | yes |
$_SCHOOL_3 |
High school | yes |
$_SCHOOL_4 |
College / University | yes |
$_MILITARY_SERVICE |
Military Service | yes |
There is no "parent" field on a person. Every relationship lives in
mariages, where each entry is one family group:
[spouseA, spouseB, child1, child2, ...]
"mariages": [
["1", "2", "3", "4"],
["3", "7", "8"],
[null, "9", "10"]
]
null — that is a single-parent family, and it is how you record
a parent you know nothing about. Both being null is not valid.
people. Dangling ids are dropped.So the example above reads: 1 and 2 are married and have children 3 and 4; child 3 later married 7 and had 8; and 9 is a single parent of 10.
A person's photos and attachments hold file
references, and the file itself lives in the archive:
| Reference | Meaning |
|---|---|
12 |
A positive number: the file is in the archive as
images/12.jpg, keeping whatever extension the original
file had.
|
-1 |
A negative number: the photo was hosted at a URL, and the export
downloaded it and gave it a temporary id. The file is in the archive
as images/-1.jpg. Treat it exactly like a positive id.
|
"https://…" |
A string: a remote URL that was not bundled, typically because it could not be downloaded. Load it over the network, or ignore it. |
Ids are only unique within one archive. On import they are all renumbered, so never treat them as stable identity across files.
By default a custom attribute is free text. Listing it in
attributesTypeSelectString turns it into a fixed set of choices:
"attributesTypeSelectString": [
{
"name": "Occupation",
"options": [
{ "value": "Teacher", "color": "#1976d2" },
{ "value": "Farmer", "color": "#2e7d32" }
]
}
]
name must match an entry in the root
attributes array. color is optional, but it is
all-or-nothing: either every option of an attribute has one, or none do.
familyBushesWebsiteStyles is entirely optional and affects only
how FamilyBushes.com draws the tree. No genealogical data lives here, and any
reader is free to ignore the whole object. Older files may carry extra keys
here that are no longer written; ignore anything you do not recognise.
| Field | Values | Default |
|---|---|---|
lineThickness |
"thin" | "medium" | "thick" | "medium" |
lineAnimation |
boolean | false |
straightLines |
boolean | false |
personCardType |
"photo" | "photo-and-text" | "text" | "photo-and-text" |
photoRadius |
"none" | "medium" | "round" | "round" |
nameRadius |
"none" | "medium" | "round" | "medium" |
treeTheme |
string | "default" |
If you are producing .fbft from your own software:
family_tree.json with id, createdAt,
updatedAt, name, credits,
events, attributes, people and
mariages. The images/ and
attachments/ folders may be absent when nothing references
them.
mariages.
mariages. It has always been
misspelled, and correcting it would break every file ever exported.
Here are some examples.
Use the format. You do not need our permission, and you will never need a
licence from us to read or write a .fbft file.
There are no royalties and no conditions attached to implementing it. We would
much rather this format spread than stay ours — a family tree that can only be
opened by one company is a family tree nobody's grandchildren will be able to
open.
The specification on this page is published under CC BY 4.0, so you are free to copy it, quote it, translate it, or paste chunks of it into your own documentation.
We ask two things — a request, not a restriction:
Dropping a link like this anywhere in your interface covers both:
<a href="https://familybushes.com">Family tree format by Family Bushes</a>
Or, pointing straight at the specification so people can learn the format:
<a href="https://familybushes.com/format/explain/fbft/">.fbft format</a>
Plain text works just as well where a link cannot go — "Family tree format: familybushes.com" in an about box or a comment is completely fine.
If you are building something that reads or writes .fbft, we
would genuinely like to hear about it — and if the spec is unclear or wrong
somewhere, tell us and we will fix this page.
.fbft file is downloaded to your device. It includes your
full tree and all photos.
Export at any time to keep a local backup. Your cloud copy is always safe in your account — the export is an extra portable copy you own completely.
.fbft file.
This makes .fbft the recommended format for sharing a complete tree copy with a family member — they get everything in one file.
GEDCOM is the industry standard for
interoperability — use it when moving data between different genealogy
programs. .fbft is the right choice when you want a complete,
self-contained backup of everything in FamilyBushes.com including photos and
map events.
FBFT stands for Family Bushes Family Tree. It is the native export format of FamilyBushes.com.
Yes. You can rename it to .zip and open it with any standard archive tool. Inside you will find family_tree.json with all your tree data, and folders for photos and attachments.
You can extract the archive and read family_tree.json directly — it is standard JSON, indented with two spaces, and fully documented on this page. To view the interactive tree you need to import it into FamilyBushes.com.
Yes. This page is the specification — the field tables above cover every key that is written, and the "Writing a compatible file" section lists the rules that matter. The format is a plain ZIP with a JSON file inside, so any language can produce one.
It is a typo from the first version of the format that became permanent. Every file ever exported uses it, so it stays. Spell it with one r.
Yes. All photos and attachments you have added to people in your tree are embedded inside the archive under the images/ and attachments/ folders.
Yes. Send them the file and they can import it into their own FamilyBushes.com account. Their photos and events will all be there.
Yes, if that software supports the .fbft spec — please check with that tool first. The format is open and documented on this page, and anyone is welcome to implement it.