Skip to content

gordon-matt/Kinnect

Repository files navigation

Logo

Kinnect

A self-hosted family tree and private social space for families who want to stay in touch without the noise.


Why this exists

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.


Features

Interactive family tree

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.

Family Tree

GEDCOM import (optional)

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.

Home feed

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.

Feed

Profiles and life events

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.

Profile

Media library

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.

Media

Chat

Rooms and messages so family can talk in real time inside the same app—no need to route everything through external messengers.

Chat

Notifications

Stay aware of activity that matters to you through the app’s notification system (e.g. new messages or relevant updates).

Maps

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.

Map

Administration

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.


Getting Started

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: true

You 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: true

where your_email_replace_at is the @ signed replaced by an underscore _ for your email address. Example: test_something.com instead of test@something.com.


Tech stack (overview)

  • 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)

Did I use AI for this?

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.


Credits

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.

About

A self-hosted family tree and private social space for families who want to stay in touch without the noise.

Topics

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors