SparseTree supports multiple genealogy platforms via browser-based scraping.
| Provider | Status | Login | Notes |
|---|---|---|---|
| FamilySearch | Full support | Browser + Google SSO | Primary provider |
| Ancestry | Partial | Browser | Requires subscription |
| WikiTree | Partial | Browser | Public profiles |
| 23andMe | Limited | Browser | Canvas-based UI challenges |
Navigate to /providers/genealogy in the web UI to:
- Check login status for each provider
- Log in via the connected browser
- Save credentials for auto-login
- Enable/disable providers
- Connect to browser at
/settings/browser - Click "Login" on provider card
- Complete login in browser window
- Click "Check Session" to verify
- Connect to browser
- Click "Login with Google" on FamilySearch card
- Google sign-in completes automatically if already logged into Google
- Save credentials via "Add Credentials" button
- Enable "Auto-login" toggle
- System will auto-login when session expires
Security Note: Credentials are stored encrypted in data/credentials.json using AES-256-GCM. The encryption key is stored in data/.credentials-key. Both files are git-ignored.
| Provider | Login URL | Tree URL Pattern |
|---|---|---|
| FamilySearch | familysearch.org/auth/familysearch/login | familysearch.org/tree/pedigree/landscape/{id} |
| Ancestry | ancestry.com/account/signin | ancestry.com/family-tree/tree/{treeId}/family |
| 23AndMe | you.23andme.com/ | you.23andme.com/family/tree/ |
| WikiTree | wikitree.com/wiki/Special:Userlogin | wikitree.com/wiki/{WikiTreeId} |
Each provider has configurable rate limits to avoid being blocked:
| Provider | Default Min | Default Max |
|---|---|---|
| FamilySearch | 100ms | 300ms |
| Ancestry | 200ms | 500ms |
| WikiTree | 100ms | 300ms |
| 23andMe | 500ms | 1000ms |
Configure via data/provider-config.json or the web UI.
Scrapers implement the ProviderScraper interface:
interface ProviderScraper {
provider: BuiltInProvider;
displayName: string;
loginUrl: string;
checkLoginStatus(page): Promise<boolean>;
getLoggedInUser(page): Promise<{name?, userId?} | null>;
listTrees(page): Promise<ProviderTreeInfo[]>;
scrapePersonById(page, id): Promise<ScrapedPersonData>;
scrapeAncestors(page, rootId, maxGen): AsyncGenerator<ScrapedPersonData>;
loginSelectors: LoginSelectors;
performLogin(page, username, password): Promise<boolean>;
}Scrapers: server/src/services/scrapers/
Navigate to /settings/browser for:
- CDP port configuration (default: 9920)
- Auto-connect on server start
- View open browser pages
- Launch/connect/disconnect browser
CDP_PORT=9920 ./.browser/start.shProfile data persists in .browser/data/.
Navigate to /tools/gedcom for:
- Upload
.gedfile - Preview contents
- Validate format
- Import to new database
- Select database
- Download as
.gedfile
Supports GEDCOM 5.5.1 format.