A self-hosted family tree and private social space for families who want to stay in touch without the noise.
This project exists to fill a gap. There are plenty of genealogical apps out there—even self-hosted ones like webtrees. Those tools tend to be aimed at serious genealogical research. Most people I know would find in adequate to simply have a family tree they can navigate and a straightforward way to stay in touch.
I have come to dislike large social platforms: more ads than conversation, and mechanics like likes and dislikes that feel needlessly toxic. Kinnect is built for family members who want to share photos and videos, view a family tree, and talk to each other—on infrastructure you control.
Browse your family as an interactive chart—pan, zoom, and follow links between people. The focus is on clarity and navigation, not academic citation workflows.
If you already have a tree elsewhere, you can bring it in with a standard GEDCOM file (offered during onboarding when the database is empty and you have administrator access). Individuals, relationships, and many common life events are mapped into the app’s model. Import is entirely optional—you can skip it and build the tree from scratch by adding people manually, one at a time, with the same end result: a tree you grow and maintain inside Kinnect.
A single timeline for posts, photos, and videos from people in your family—similar in spirit to a social feed, but without engagement metrics or algorithmic games. Share what is on your mind or let new posts appear in the stream.
Each person can have a rich profile: photos, narrative context, and events (birth, death, residence, and custom milestones). Events can tie into maps so you can see where things happened when locations are available.
Upload and organize photos and videos with optional folders and tags. Images can be processed automatically (resize, thumbnails, quality settings). Videos are processed with FFmpeg (including transcoding for web-friendly playback). Documents are supported with configurable types and size limits.
Rooms and messages so family can talk in real time inside the same app—no need to route everything through external messengers.
Stay aware of activity that matters to you through the app’s notification system (e.g. new messages or relevant updates).
Explore events or photo locations on a map when geographic data is present—useful for trips, heritage, and visualizing where your family’s story unfolded.
Administrators can manage users and roles, and work with backups of person-related data. The app is designed to be run self-hosted (for example with Docker and PostgreSQL), with optional OpenID Connect integration (using Keycloak) if you want centralized identity instead of built-in accounts alone.
The easiest way to use this app is with Docker. Here's what my stack looks like in Portainer:
services:
app:
image: ghcr.io/gordon-matt/kinnect:latest
ports:
- "7005:8080"
environment:
ASPNETCORE_URLS: http://+:8080
ConnectionStrings__DefaultConnection: "Host=db;Port=5432;Database=kinnect;Username=postgres;Password=your_password"
FileStorage__BasePath: /app/data
ImageProcessing__AutoShrinkImages: "true"
ImageProcessing__MaxWidth: "1920"
ImageProcessing__MaxHeight: "1080"
ImageProcessing__Quality: "80"
ImageProcessing__ThumbnailWidth: "400"
ImageProcessing__ThumbnailHeight: "400"
ImageProcessing__ThumbnailQuality: "70"
DocumentProcessing__AllowedExtensions: ".pdf,.jpg,.jpeg,.png,.gif,.webp"
DocumentProcessing__MaxFileSizeBytes: "5242880"
DocumentProcessing__AutoShrinkDocuments: "true"
VideoProcessing__AutoShrinkVideos: "true"
VideoProcessing__ToolsPath: /usr/bin
VideoProcessing__OutputVideoSize: "Hd720"
VideoProcessing__Crf: "28"
VideoProcessing__AudioBitrate: "128000"
Smtp__Host: smtp.something.com
Smtp__Port: "587"
Smtp__EnableSsl: "true"
Smtp__Username: smtp_email
Smtp__Password: smtp_password
Smtp__FromAddress: smtp_email
Smtp__FromName: Kinnect
SeedAdmin__Email: your_email
SeedAdmin__Password: your_password
SeedAdmin__FirstName: Admin
SeedAdmin__LastName: User
volumes:
- /volume1/docker/kinnect:/app/data
networks:
- postgres-net
networks:
postgres-net:
external: trueYou can add postgres directly in the stack if you prefer, but I find that adding a separate postgres install for every app that needs it gets messy and wastes resources. I use one postgres stack for all apps that need it and I include pgadmin with it, so I can manage the databases myself. Here's an example:
version: "3.9"
services:
db:
image: postgres:18-alpine
container_name: postgres
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: your_password
volumes:
- /volume1/docker/postgresql/data:/var/lib/postgresql:rw
ports:
- "7001:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 5s
retries: 5
restart: unless-stopped
networks:
- postgres-net
pgadmin:
image: dpage/pgadmin4:latest
container_name: pgadmin
environment:
PGADMIN_DEFAULT_EMAIL: your_email
PGADMIN_DEFAULT_PASSWORD: your_password
ports:
- "7002:80"
volumes:
- /volume1/docker/postgresql/pgadmin:/var/lib/pgadmin:rw
- /volume1/docker/postgresql/backups:/var/lib/pgadmin/storage/your_email_replace_at/backups:rw
restart: unless-stopped
networks:
- postgres-net
networks:
postgres-net:
external: truewhere your_email_replace_at is the @ signed replaced by an underscore _ for your email address. Example: test_something.com instead of test@something.com.
- ASP.NET Core web application (.NET 10)
- PostgreSQL with Entity Framework Core
- ASP.NET Core Identity (with optional OpenID Connect / Keycloak)
- Hangfire for background jobs (e.g. media processing)
- Docker support for the app and database
- Serilog logging (including PostgreSQL sink options)
Yes—shamelessly. Without AI, this project would not exist. It is something I have wanted to build for years but never had the time. Life is busy: work, family, and everything in between. I am a senior developer and have been coding since the mid-2000s—I know what good code looks like and I know what sloppy code looks like. So yes: I used AI as a productivity tool, but the architecture and decisions are mine, and I am the one maintaining it.
Kinnect builds on excellent open work from the community:
| Project | Description | Repository |
|---|---|---|
| family-chart.js | D3-based interactive family tree visualization (npm package family-chart; used in the tree UI) |
github.com/donatso/family-chart |
| GeneGenie.Gedcom | .NET library for loading, parsing, and working with GEDCOM data | github.com/TheGeneGenieProject/GeneGenie.Gedcom |
| SignalR-Chat | A real-time chat application using .NET 7, SignalR and Knockout.js | github.com/AKouki/SignalR-Chat |
Thank you to the authors and contributors of these and other projects this app is built on.






