{
 "name": "Tech Digest self-hosting index",
 "description": "Structured profiles of 105 self-hosted tools: licence, datastore, default ports, arm64 availability, identity support, idle and typical memory, derived backup shape and a 1 to 5 operational load score.",
 "url": "https://techdigest.site/research/",
 "license": "https://creativecommons.org/licenses/by/4.0/",
 "attribution": "Tech Digest, techdigest.site",
 "generated": "2026-09-08",
 "methodology": "https://techdigest.site/methodology/",
 "count": 105,
 "categories": [
  {
   "id": "platform",
   "name": "Platforms and container management"
  },
  {
   "id": "networking",
   "name": "Networking, DNS and remote access"
  },
  {
   "id": "backup",
   "name": "Backup and object storage"
  },
  {
   "id": "identity",
   "name": "Passwords, SSO and identity"
  },
  {
   "id": "media",
   "name": "Media servers and libraries"
  },
  {
   "id": "photos-files",
   "name": "Photos, files and sync"
  },
  {
   "id": "knowledge",
   "name": "Documents, notes and knowledge"
  },
  {
   "id": "monitoring",
   "name": "Monitoring and observability"
  },
  {
   "id": "home-automation",
   "name": "Home automation"
  },
  {
   "id": "communication",
   "name": "Chat, mail and notifications"
  },
  {
   "id": "developer",
   "name": "Git forges and developer infrastructure"
  },
  {
   "id": "security",
   "name": "Security and update hygiene"
  },
  {
   "id": "feeds",
   "name": "Feeds, bookmarks and read-it-later"
  },
  {
   "id": "dashboards",
   "name": "Dashboards and automation glue"
  },
  {
   "id": "productivity",
   "name": "Tasks, recipes and personal finance"
  },
  {
   "id": "ai",
   "name": "Local AI and private search"
  }
 ],
 "tools": [
  {
   "slug": "actual-budget",
   "name": "Actual Budget",
   "category": "productivity",
   "url": "https://techdigest.site/apps/actual-budget/",
   "project": "https://actualbudget.org",
   "repo": "https://github.com/actualbudget/actual",
   "license": "MIT",
   "license_class": "permissive",
   "language": "TypeScript / JavaScript (React and Node.js)",
   "first_release": "2022",
   "maturity": "stable",
   "datastore": "SQLite on the client; the server keeps account.sqlite plus per-budget binary files",
   "default_ports": [
    5006
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 120,
   "ram_typical_mb": 250,
   "ops_load": 2,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "YNAB",
    "Mint",
    "Quicken",
    "Monarch Money"
   ]
  },
  {
   "slug": "adguard-home",
   "name": "AdGuard Home",
   "category": "networking",
   "url": "https://techdigest.site/apps/adguard-home/",
   "project": "https://adguard.com/adguard-home/overview.html",
   "repo": "https://github.com/AdguardTeam/AdGuardHome",
   "license": "GPL-3.0",
   "license_class": "copyleft",
   "language": "Go, with a React web interface",
   "first_release": "2018",
   "maturity": "mature",
   "datastore": "A single YAML config file plus BoltDB files for stats and sessions; the query log is a JSON lines file",
   "default_ports": [
    53,
    80,
    443,
    853,
    3000
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "none",
   "ram_idle_mb": 60,
   "ram_typical_mb": 150,
   "ops_load": 2,
   "backup_shape": "Embedded key-value store",
   "live_file_copy_safe": false,
   "replaces": [
    "NextDNS",
    "AdGuard DNS",
    "Cloudflare Gateway"
   ]
  },
  {
   "slug": "audiobookshelf",
   "name": "Audiobookshelf",
   "category": "media",
   "url": "https://techdigest.site/apps/audiobookshelf/",
   "project": "https://www.audiobookshelf.org",
   "repo": "https://github.com/advplyr/audiobookshelf",
   "license": "GPL-3.0",
   "license_class": "copyleft",
   "language": "JavaScript / Node.js",
   "first_release": "2021",
   "maturity": "stable",
   "datastore": "SQLite",
   "default_ports": [
    13378
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 200,
   "ram_typical_mb": 450,
   "ops_load": 2,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "Audible",
    "Overcast",
    "Pocket Casts",
    "Google Play Books"
   ]
  },
  {
   "slug": "authelia",
   "name": "Authelia",
   "category": "identity",
   "url": "https://techdigest.site/apps/authelia/",
   "project": "https://www.authelia.com",
   "repo": "https://github.com/authelia/authelia",
   "license": "Apache-2.0",
   "license_class": "permissive",
   "language": "Go / TypeScript",
   "first_release": "2017",
   "maturity": "stable",
   "datastore": "SQLite (default), PostgreSQL or MySQL; sessions in memory or Redis",
   "default_ports": [
    9091
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "ldap",
   "ram_idle_mb": 35,
   "ram_typical_mb": 80,
   "ops_load": 3,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "Cloudflare Access",
    "Okta",
    "Duo Security",
    "Auth0"
   ]
  },
  {
   "slug": "authentik",
   "name": "authentik",
   "category": "identity",
   "url": "https://techdigest.site/apps/authentik/",
   "project": "https://goauthentik.io",
   "repo": "https://github.com/goauthentik/authentik",
   "license": "MIT (core); authentik/enterprise/ under a separate Authentik Security license",
   "license_class": "permissive",
   "language": "Python / Django, Go (outposts), TypeScript",
   "first_release": "2020",
   "maturity": "stable",
   "datastore": "PostgreSQL",
   "default_ports": [
    9000,
    9443
   ],
   "container_count": 3,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 1000,
   "ram_typical_mb": 1600,
   "ops_load": 4,
   "backup_shape": "Postgres dump",
   "live_file_copy_safe": false,
   "replaces": [
    "Okta",
    "Auth0",
    "Microsoft Entra ID",
    "OneLogin"
   ]
  },
  {
   "slug": "beszel",
   "name": "Beszel",
   "category": "monitoring",
   "url": "https://techdigest.site/apps/beszel/",
   "project": "https://beszel.dev",
   "repo": "https://github.com/henrygd/beszel",
   "license": "MIT",
   "license_class": "permissive",
   "language": "Go",
   "first_release": "2024",
   "maturity": "young",
   "datastore": "SQLite via PocketBase",
   "default_ports": [
    8090,
    45876
   ],
   "container_count": 2,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 40,
   "ram_typical_mb": 80,
   "ops_load": 1,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "Netdata Cloud",
    "Datadog",
    "New Relic",
    "Glances"
   ]
  },
  {
   "slug": "bookstack",
   "name": "BookStack",
   "category": "knowledge",
   "url": "https://techdigest.site/apps/bookstack/",
   "project": "https://www.bookstackapp.com/",
   "repo": "https://codeberg.org/bookstack/bookstack",
   "license": "MIT",
   "license_class": "permissive",
   "language": "PHP (Laravel)",
   "first_release": "2015",
   "maturity": "mature",
   "datastore": "MySQL 8.0+ or MariaDB 10.6+",
   "default_ports": [
    80
   ],
   "container_count": 2,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 260,
   "ram_typical_mb": 500,
   "ops_load": 2,
   "backup_shape": "MySQL dump",
   "live_file_copy_safe": false,
   "replaces": [
    "Confluence",
    "Notion",
    "Google Sites",
    "SharePoint wiki"
   ]
  },
  {
   "slug": "borgbackup",
   "name": "BorgBackup",
   "category": "backup",
   "url": "https://techdigest.site/apps/borgbackup/",
   "project": "https://www.borgbackup.org/",
   "repo": "https://github.com/borgbackup/borg",
   "license": "BSD-3-Clause",
   "license_class": "permissive",
   "language": "Python / C / Cython",
   "first_release": "2015",
   "maturity": "mature",
   "datastore": "Its own repository format, plus a local chunks index and files cache under ~/.cache/borg",
   "default_ports": [],
   "container_count": 0,
   "arm64": false,
   "sso": "n/a",
   "ram_idle_mb": 80,
   "ram_typical_mb": 400,
   "ops_load": 2,
   "backup_shape": "Mixed",
   "live_file_copy_safe": false,
   "replaces": [
    "CrashPlan",
    "Backblaze Personal Backup",
    "Acronis True Image",
    "Carbonite"
   ]
  },
  {
   "slug": "caddy",
   "name": "Caddy",
   "category": "networking",
   "url": "https://techdigest.site/apps/caddy/",
   "project": "https://caddyserver.com",
   "repo": "https://github.com/caddyserver/caddy",
   "license": "Apache-2.0",
   "license_class": "permissive",
   "language": "Go",
   "first_release": "2015",
   "maturity": "mature",
   "datastore": "Filesystem (certificates, keys and ACME account data in the data directory)",
   "default_ports": [
    80,
    443,
    2019
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "n/a",
   "ram_idle_mb": 25,
   "ram_typical_mb": 70,
   "ops_load": 1,
   "backup_shape": "File copy",
   "live_file_copy_safe": true,
   "replaces": [
    "Nginx Plus",
    "Cloudflare Tunnel",
    "AWS Application Load Balancer"
   ]
  },
  {
   "slug": "calibre-web",
   "name": "Calibre-Web",
   "category": "media",
   "url": "https://techdigest.site/apps/calibre-web/",
   "project": "https://github.com/janeczku/calibre-web",
   "repo": "https://github.com/janeczku/calibre-web",
   "license": "GPL-3.0",
   "license_class": "copyleft",
   "language": "Python (Flask)",
   "first_release": "2016",
   "maturity": "mature",
   "datastore": "SQLite (Calibre's metadata.db plus its own app.db)",
   "default_ports": [
    8083
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "ldap",
   "ram_idle_mb": 120,
   "ram_typical_mb": 300,
   "ops_load": 2,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "Calibre Content Server",
    "Google Play Books",
    "Kindle library"
   ]
  },
  {
   "slug": "casaos",
   "name": "CasaOS",
   "category": "platform",
   "url": "https://techdigest.site/apps/casaos/",
   "project": "https://casaos.zimaspace.com/",
   "repo": "https://github.com/IceWhaleTech/CasaOS",
   "license": "Apache-2.0",
   "license_class": "permissive",
   "language": "Go",
   "first_release": "2021",
   "maturity": "legacy",
   "datastore": "SQLite files and INI config under /var/lib/casaos and /etc/casaos",
   "default_ports": [
    80
   ],
   "container_count": 0,
   "arm64": true,
   "sso": "none",
   "ram_idle_mb": 300,
   "ram_typical_mb": 900,
   "ops_load": 2,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "Synology DSM",
    "Google Drive",
    "Dropbox"
   ]
  },
  {
   "slug": "code-server",
   "name": "code-server",
   "category": "developer",
   "url": "https://techdigest.site/apps/code-server/",
   "project": "https://coder.com/docs/code-server",
   "repo": "https://github.com/coder/code-server",
   "license": "MIT",
   "license_class": "permissive",
   "language": "TypeScript",
   "first_release": "2019",
   "maturity": "mature",
   "datastore": "None; state is files on disk",
   "default_ports": [
    8080
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "proxy-only",
   "ram_idle_mb": 200,
   "ram_typical_mb": 900,
   "ops_load": 2,
   "backup_shape": "File copy",
   "live_file_copy_safe": true,
   "replaces": [
    "GitHub Codespaces",
    "JetBrains Gateway",
    "AWS Cloud9",
    "Gitpod"
   ]
  },
  {
   "slug": "coolify",
   "name": "Coolify",
   "category": "platform",
   "url": "https://techdigest.site/apps/coolify/",
   "project": "https://coolify.io/",
   "repo": "https://github.com/coollabsio/coolify",
   "license": "Apache-2.0",
   "license_class": "permissive",
   "language": "PHP (Laravel)",
   "first_release": "2021",
   "maturity": "stable",
   "datastore": "PostgreSQL, with Redis for queues and a Soketi realtime service",
   "default_ports": [
    80,
    443,
    6001,
    6002,
    8000
   ],
   "container_count": 5,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 1200,
   "ram_typical_mb": 2048,
   "ops_load": 3,
   "backup_shape": "Postgres dump",
   "live_file_copy_safe": false,
   "replaces": [
    "Heroku",
    "Vercel",
    "Netlify",
    "Railway"
   ]
  },
  {
   "slug": "crowdsec",
   "name": "CrowdSec",
   "category": "security",
   "url": "https://techdigest.site/apps/crowdsec/",
   "project": "https://www.crowdsec.net/",
   "repo": "https://github.com/crowdsecurity/crowdsec",
   "license": "MIT",
   "license_class": "permissive",
   "language": "Go",
   "first_release": "2020",
   "maturity": "stable",
   "datastore": "SQLite by default (MySQL and PostgreSQL supported)",
   "default_ports": [
    8080,
    6060
   ],
   "container_count": 2,
   "arm64": true,
   "sso": "n/a",
   "ram_idle_mb": 120,
   "ram_typical_mb": 250,
   "ops_load": 2,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "Cloudflare rate limiting",
    "AWS WAF managed rules",
    "Imunify360"
   ]
  },
  {
   "slug": "diun",
   "name": "Diun",
   "category": "security",
   "url": "https://techdigest.site/apps/diun/",
   "project": "https://crazymax.dev/diun/",
   "repo": "https://github.com/crazy-max/diun",
   "license": "MIT",
   "license_class": "permissive",
   "language": "Go",
   "first_release": "2019",
   "maturity": "stable",
   "datastore": "bbolt, a single file at `/data/diun.db`",
   "default_ports": [],
   "container_count": 1,
   "arm64": true,
   "sso": "n/a",
   "ram_idle_mb": 25,
   "ram_typical_mb": 60,
   "ops_load": 1,
   "backup_shape": "Embedded key-value store",
   "live_file_copy_safe": false,
   "replaces": [
    "Watchtower",
    "Renovate",
    "Docker Hub webhooks"
   ]
  },
  {
   "slug": "docker",
   "name": "Docker Engine",
   "category": "platform",
   "url": "https://techdigest.site/apps/docker/",
   "project": "https://www.docker.com/",
   "repo": "https://github.com/moby/moby",
   "license": "Apache-2.0 (Engine and Compose); Docker Desktop is proprietary",
   "license_class": "permissive",
   "language": "Go",
   "first_release": "2013",
   "maturity": "mature",
   "datastore": "None; image and container metadata under /var/lib/docker, containerd image store by default since 29.0",
   "default_ports": [],
   "container_count": 0,
   "arm64": true,
   "sso": "n/a",
   "ram_idle_mb": 120,
   "ram_typical_mb": 300,
   "ops_load": 2,
   "backup_shape": "File copy",
   "live_file_copy_safe": true,
   "replaces": [
    "VMware Workstation",
    "Heroku",
    "Vagrant"
   ]
  },
  {
   "slug": "docmost",
   "name": "Docmost",
   "category": "knowledge",
   "url": "https://techdigest.site/apps/docmost/",
   "project": "https://docmost.com/",
   "repo": "https://github.com/docmost/docmost",
   "license": "AGPL-3.0 core, proprietary Docmost Enterprise licence for `ee` directories",
   "license_class": "copyleft",
   "language": "TypeScript (NestJS + React)",
   "first_release": "2024",
   "maturity": "young",
   "datastore": "PostgreSQL with Redis",
   "default_ports": [
    3000
   ],
   "container_count": 3,
   "arm64": true,
   "sso": "none",
   "ram_idle_mb": 500,
   "ram_typical_mb": 900,
   "ops_load": 3,
   "backup_shape": "Postgres dump",
   "live_file_copy_safe": false,
   "replaces": [
    "Confluence",
    "Notion",
    "Slab",
    "Nuclino"
   ]
  },
  {
   "slug": "dokploy",
   "name": "Dokploy",
   "category": "platform",
   "url": "https://techdigest.site/apps/dokploy/",
   "project": "https://dokploy.com/",
   "repo": "https://github.com/Dokploy/dokploy",
   "license": "Apache-2.0, with DSAL 1.0 reserved for a /proprietary path",
   "license_class": "permissive",
   "language": "TypeScript",
   "first_release": "2024",
   "maturity": "young",
   "datastore": "PostgreSQL 16 (Docker Swarm service, dokploy-postgres volume)",
   "default_ports": [
    80,
    443,
    3000
   ],
   "container_count": 3,
   "arm64": true,
   "sso": "none",
   "ram_idle_mb": 900,
   "ram_typical_mb": 2048,
   "ops_load": 3,
   "backup_shape": "Postgres dump",
   "live_file_copy_safe": false,
   "replaces": [
    "Vercel",
    "Heroku",
    "Netlify",
    "Render"
   ]
  },
  {
   "slug": "dozzle",
   "name": "Dozzle",
   "category": "monitoring",
   "url": "https://techdigest.site/apps/dozzle/",
   "project": "https://dozzle.dev",
   "repo": "https://github.com/amir20/dozzle",
   "license": "MIT",
   "license_class": "permissive",
   "language": "Go / Vue",
   "first_release": "2018",
   "maturity": "mature",
   "datastore": "None for logs; a small /data directory for users and UI settings",
   "default_ports": [
    8080,
    7007
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "header",
   "ram_idle_mb": 15,
   "ram_typical_mb": 40,
   "ops_load": 1,
   "backup_shape": "File copy",
   "live_file_copy_safe": true,
   "replaces": [
    "Papertrail",
    "Loggly",
    "Datadog Logs",
    "Portainer log view"
   ]
  },
  {
   "slug": "duplicati",
   "name": "Duplicati",
   "category": "backup",
   "url": "https://techdigest.site/apps/duplicati/",
   "project": "https://duplicati.com/",
   "repo": "https://github.com/duplicati/duplicati",
   "license": "MIT",
   "license_class": "permissive",
   "language": "C# / .NET 8",
   "first_release": "2008",
   "maturity": "stable",
   "datastore": "SQLite: one server database plus one local database per backup job",
   "default_ports": [
    8200
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "none",
   "ram_idle_mb": 200,
   "ram_typical_mb": 700,
   "ops_load": 3,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "Backblaze Personal Backup",
    "Carbonite",
    "CrashPlan",
    "IDrive"
   ]
  },
  {
   "slug": "emby",
   "name": "Emby",
   "category": "media",
   "url": "https://techdigest.site/apps/emby/",
   "project": "https://emby.media",
   "repo": "https://github.com/MediaBrowser/Emby.Releases",
   "license": "Proprietary",
   "license_class": "proprietary",
   "language": "C# / .NET",
   "first_release": "2015",
   "maturity": "mature",
   "datastore": "SQLite",
   "default_ports": [
    8096,
    8920
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "ldap",
   "ram_idle_mb": 350,
   "ram_typical_mb": 900,
   "ops_load": 2,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "Plex",
    "Netflix",
    "Jellyfin"
   ]
  },
  {
   "slug": "esphome",
   "name": "ESPHome",
   "category": "home-automation",
   "url": "https://techdigest.site/apps/esphome/",
   "project": "https://esphome.io",
   "repo": "https://github.com/esphome/esphome",
   "license": "MIT (Python tooling) and GPL-3.0 (C++ device runtime)",
   "license_class": "copyleft",
   "language": "Python / C++",
   "first_release": "2018",
   "maturity": "mature",
   "datastore": "YAML files on disk, no database",
   "default_ports": [
    6052,
    6053,
    3232
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "proxy-only",
   "ram_idle_mb": 150,
   "ram_typical_mb": 1500,
   "ops_load": 2,
   "backup_shape": "File copy",
   "live_file_copy_safe": true,
   "replaces": [
    "Tuya cloud firmware",
    "Shelly Cloud",
    "Arduino IDE sketches",
    "Sonoff eWeLink"
   ]
  },
  {
   "slug": "fail2ban",
   "name": "Fail2ban",
   "category": "security",
   "url": "https://techdigest.site/apps/fail2ban/",
   "project": "https://www.fail2ban.org/",
   "repo": "https://github.com/fail2ban/fail2ban",
   "license": "GPL-2.0-or-later",
   "license_class": "copyleft",
   "language": "Python",
   "first_release": "2004",
   "maturity": "mature",
   "datastore": "SQLite at `/var/lib/fail2ban/fail2ban.sqlite3`",
   "default_ports": [],
   "container_count": 0,
   "arm64": true,
   "sso": "n/a",
   "ram_idle_mb": 40,
   "ram_typical_mb": 80,
   "ops_load": 2,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "Cloudflare rate limiting",
    "AWS WAF managed rules",
    "DenyHosts"
   ]
  },
  {
   "slug": "filebrowser",
   "name": "File Browser",
   "category": "photos-files",
   "url": "https://techdigest.site/apps/filebrowser/",
   "project": "https://github.com/filebrowser/filebrowser",
   "repo": "https://github.com/filebrowser/filebrowser",
   "license": "Apache-2.0",
   "license_class": "permissive",
   "language": "Go, with a Vue frontend",
   "first_release": "2015",
   "maturity": "legacy",
   "datastore": "Bolt, a single embedded `filebrowser.db` file",
   "default_ports": [
    8080
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "header",
   "ram_idle_mb": 20,
   "ram_typical_mb": 80,
   "ops_load": 1,
   "backup_shape": "Mixed",
   "live_file_copy_safe": false,
   "replaces": [
    "Dropbox (browser access)",
    "cPanel File Manager",
    "WeTransfer",
    "Windows file share over VPN"
   ]
  },
  {
   "slug": "firefly-iii",
   "name": "Firefly III",
   "category": "productivity",
   "url": "https://techdigest.site/apps/firefly-iii/",
   "project": "https://www.firefly-iii.org",
   "repo": "https://github.com/firefly-iii/firefly-iii",
   "license": "AGPL-3.0-or-later",
   "license_class": "copyleft",
   "language": "PHP (Laravel)",
   "first_release": "2015",
   "maturity": "mature",
   "datastore": "MariaDB or MySQL by default, PostgreSQL supported, SQLite possible but discouraged",
   "default_ports": [
    8080
   ],
   "container_count": 4,
   "arm64": true,
   "sso": "header",
   "ram_idle_mb": 250,
   "ram_typical_mb": 600,
   "ops_load": 3,
   "backup_shape": "MySQL dump",
   "live_file_copy_safe": false,
   "replaces": [
    "Mint",
    "YNAB",
    "Quicken",
    "Monarch Money"
   ]
  },
  {
   "slug": "forgejo",
   "name": "Forgejo",
   "category": "developer",
   "url": "https://techdigest.site/apps/forgejo/",
   "project": "https://forgejo.org",
   "repo": "https://codeberg.org/forgejo/forgejo",
   "license": "GPL-3.0-or-later",
   "license_class": "copyleft",
   "language": "Go / TypeScript",
   "first_release": "2022",
   "maturity": "stable",
   "datastore": "SQLite (default), PostgreSQL or MySQL optional",
   "default_ports": [
    3000,
    22
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 150,
   "ram_typical_mb": 450,
   "ops_load": 2,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "GitHub",
    "Bitbucket Server",
    "GitLab",
    "Azure DevOps Repos"
   ]
  },
  {
   "slug": "freshrss",
   "name": "FreshRSS",
   "category": "feeds",
   "url": "https://techdigest.site/apps/freshrss/",
   "project": "https://freshrss.org",
   "repo": "https://github.com/FreshRSS/FreshRSS",
   "license": "AGPL-3.0",
   "license_class": "copyleft",
   "language": "PHP",
   "first_release": "2013",
   "maturity": "mature",
   "datastore": "SQLite by default; PostgreSQL 10+, MariaDB 10.6+ or MySQL 8.0+ supported",
   "default_ports": [
    80
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 90,
   "ram_typical_mb": 200,
   "ops_load": 2,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "Feedly",
    "Inoreader",
    "NewsBlur",
    "Google Reader"
   ]
  },
  {
   "slug": "frigate",
   "name": "Frigate",
   "category": "home-automation",
   "url": "https://techdigest.site/apps/frigate/",
   "project": "https://frigate.video",
   "repo": "https://github.com/blakeblackshear/frigate",
   "license": "MIT",
   "license_class": "permissive",
   "language": "Python / TypeScript",
   "first_release": "2019",
   "maturity": "stable",
   "datastore": "SQLite (frigate.db) for metadata, video segments on disk",
   "default_ports": [
    8971,
    5000,
    8554,
    8555
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "header",
   "ram_idle_mb": 700,
   "ram_typical_mb": 2500,
   "ops_load": 3,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "Ring Protect",
    "Nest Aware",
    "Blue Iris",
    "Synology Surveillance Station"
   ]
  },
  {
   "slug": "garage",
   "name": "Garage",
   "category": "backup",
   "url": "https://techdigest.site/apps/garage/",
   "project": "https://garagehq.deuxfleurs.fr/",
   "repo": "https://git.deuxfleurs.fr/Deuxfleurs/garage",
   "license": "AGPL-3.0-only",
   "license_class": "copyleft",
   "language": "Rust",
   "first_release": "2020",
   "maturity": "stable",
   "datastore": "LMDB for metadata (SQLite optional), content-addressed data blocks on disk",
   "default_ports": [
    3900,
    3901,
    3902,
    3903
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "n/a",
   "ram_idle_mb": 150,
   "ram_typical_mb": 500,
   "ops_load": 3,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "Amazon S3",
    "Backblaze B2",
    "Wasabi",
    "DigitalOcean Spaces"
   ]
  },
  {
   "slug": "gatus",
   "name": "Gatus",
   "category": "monitoring",
   "url": "https://techdigest.site/apps/gatus/",
   "project": "https://gatus.io",
   "repo": "https://github.com/TwiN/gatus",
   "license": "Apache-2.0",
   "license_class": "permissive",
   "language": "Go",
   "first_release": "2019",
   "maturity": "mature",
   "datastore": "In-memory by default, SQLite or PostgreSQL optional",
   "default_ports": [
    8080
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 25,
   "ram_typical_mb": 60,
   "ops_load": 1,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "UptimeRobot",
    "Pingdom",
    "StatusCake",
    "Better Stack Uptime"
   ]
  },
  {
   "slug": "gitea",
   "name": "Gitea",
   "category": "developer",
   "url": "https://techdigest.site/apps/gitea/",
   "project": "https://about.gitea.com",
   "repo": "https://github.com/go-gitea/gitea",
   "license": "MIT",
   "license_class": "permissive",
   "language": "Go / TypeScript",
   "first_release": "2016",
   "maturity": "mature",
   "datastore": "SQLite (default), PostgreSQL or MySQL optional",
   "default_ports": [
    3000,
    22
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 150,
   "ram_typical_mb": 450,
   "ops_load": 2,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "GitHub",
    "Bitbucket Server",
    "GitLab",
    "Gogs"
   ]
  },
  {
   "slug": "gitlab-ce",
   "name": "GitLab CE",
   "category": "developer",
   "url": "https://techdigest.site/apps/gitlab-ce/",
   "project": "https://about.gitlab.com",
   "repo": "https://gitlab.com/gitlab-org/gitlab-foss",
   "license": "MIT",
   "license_class": "permissive",
   "language": "Ruby on Rails / Go / Vue",
   "first_release": "2011",
   "maturity": "mature",
   "datastore": "PostgreSQL plus Redis (both bundled in Omnibus)",
   "default_ports": [
    80,
    443,
    22
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 4096,
   "ram_typical_mb": 8192,
   "ops_load": 4,
   "backup_shape": "Postgres dump",
   "live_file_copy_safe": false,
   "replaces": [
    "GitHub Enterprise Server",
    "Bitbucket Data Center",
    "Azure DevOps Server",
    "Jenkins"
   ]
  },
  {
   "slug": "glance",
   "name": "Glance",
   "category": "dashboards",
   "url": "https://techdigest.site/apps/glance/",
   "project": "https://github.com/glanceapp/glance",
   "repo": "https://github.com/glanceapp/glance",
   "license": "AGPL-3.0",
   "license_class": "copyleft",
   "language": "Go",
   "first_release": "2024",
   "maturity": "young",
   "datastore": "None (YAML config plus an in-memory cache)",
   "default_ports": [
    8080
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "none",
   "ram_idle_mb": 25,
   "ram_typical_mb": 60,
   "ops_load": 1,
   "backup_shape": "File copy",
   "live_file_copy_safe": true,
   "replaces": [
    "Netvibes",
    "Start.me",
    "igHome",
    "Feedly"
   ]
  },
  {
   "slug": "gotify",
   "name": "Gotify",
   "category": "communication",
   "url": "https://techdigest.site/apps/gotify/",
   "project": "https://gotify.net/",
   "repo": "https://github.com/gotify/server",
   "license": "MIT",
   "license_class": "permissive",
   "language": "Go / React",
   "first_release": "2018",
   "maturity": "stable",
   "datastore": "SQLite (MySQL and PostgreSQL supported)",
   "default_ports": [
    80
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 20,
   "ram_typical_mb": 50,
   "ops_load": 1,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "Pushover",
    "Pushbullet",
    "Prowl",
    "Slack incoming webhooks"
   ]
  },
  {
   "slug": "grafana",
   "name": "Grafana",
   "category": "monitoring",
   "url": "https://techdigest.site/apps/grafana/",
   "project": "https://grafana.com/oss/grafana/",
   "repo": "https://github.com/grafana/grafana",
   "license": "AGPL-3.0-only",
   "license_class": "copyleft",
   "language": "Go / TypeScript",
   "first_release": "2014",
   "maturity": "mature",
   "datastore": "SQLite 3 by default, MySQL 8.0+ or PostgreSQL 12+ supported",
   "default_ports": [
    3000
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 150,
   "ram_typical_mb": 400,
   "ops_load": 2,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "Datadog",
    "Kibana",
    "New Relic",
    "Amazon CloudWatch dashboards"
   ]
  },
  {
   "slug": "grocy",
   "name": "grocy",
   "category": "productivity",
   "url": "https://techdigest.site/apps/grocy/",
   "project": "https://grocy.info",
   "repo": "https://github.com/grocy/grocy",
   "license": "MIT",
   "license_class": "permissive",
   "language": "PHP",
   "first_release": "2017",
   "maturity": "mature",
   "datastore": "SQLite",
   "default_ports": [
    9283
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "header",
   "ram_idle_mb": 40,
   "ram_typical_mb": 90,
   "ops_load": 1,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "AnyList",
    "Out of Milk",
    "Cozi",
    "Sortly"
   ]
  },
  {
   "slug": "harbor",
   "name": "Harbor",
   "category": "developer",
   "url": "https://techdigest.site/apps/harbor/",
   "project": "https://goharbor.io",
   "repo": "https://github.com/goharbor/harbor",
   "license": "Apache-2.0",
   "license_class": "permissive",
   "language": "Go / Angular",
   "first_release": "2016",
   "maturity": "mature",
   "datastore": "PostgreSQL plus Redis, both bundled",
   "default_ports": [
    80,
    443
   ],
   "container_count": 10,
   "arm64": false,
   "sso": "oidc-native",
   "ram_idle_mb": 2500,
   "ram_typical_mb": 4500,
   "ops_load": 4,
   "backup_shape": "Postgres dump",
   "live_file_copy_safe": false,
   "replaces": [
    "Docker Hub Team",
    "JFrog Artifactory",
    "Amazon ECR",
    "Azure Container Registry"
   ]
  },
  {
   "slug": "headscale",
   "name": "Headscale",
   "category": "networking",
   "url": "https://techdigest.site/apps/headscale/",
   "project": "https://headscale.net",
   "repo": "https://github.com/juanfont/headscale",
   "license": "BSD-3-Clause",
   "license_class": "permissive",
   "language": "Go",
   "first_release": "2021",
   "maturity": "young",
   "datastore": "SQLite (recommended); PostgreSQL supported but in maintenance mode",
   "default_ports": [
    8080,
    9090,
    3478
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 40,
   "ram_typical_mb": 120,
   "ops_load": 3,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "Tailscale",
    "ZeroTier Central",
    "Twingate",
    "Cloudflare WARP"
   ]
  },
  {
   "slug": "hedgedoc",
   "name": "HedgeDoc",
   "category": "knowledge",
   "url": "https://techdigest.site/apps/hedgedoc/",
   "project": "https://hedgedoc.org/",
   "repo": "https://github.com/hedgedoc/hedgedoc",
   "license": "AGPL-3.0",
   "license_class": "copyleft",
   "language": "TypeScript / Node.js",
   "first_release": "2020",
   "maturity": "mature",
   "datastore": "PostgreSQL (MariaDB/MySQL supported, SQLite discouraged)",
   "default_ports": [
    3000
   ],
   "container_count": 2,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 250,
   "ram_typical_mb": 480,
   "ops_load": 2,
   "backup_shape": "Postgres dump",
   "live_file_copy_safe": false,
   "replaces": [
    "HackMD",
    "Google Docs (meeting notes)",
    "Etherpad",
    "Notion (shared scratchpads)"
   ]
  },
  {
   "slug": "homarr",
   "name": "Homarr",
   "category": "dashboards",
   "url": "https://techdigest.site/apps/homarr/",
   "project": "https://homarr.dev",
   "repo": "https://github.com/homarr-labs/homarr",
   "license": "Apache-2.0",
   "license_class": "permissive",
   "language": "TypeScript / Next.js",
   "first_release": "2022",
   "maturity": "stable",
   "datastore": "SQLite by default; MySQL or PostgreSQL optional",
   "default_ports": [
    7575
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 500,
   "ram_typical_mb": 750,
   "ops_load": 2,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "Start.me",
    "Netvibes",
    "Protopage",
    "Organizr"
   ]
  },
  {
   "slug": "home-assistant",
   "name": "Home Assistant",
   "category": "home-automation",
   "url": "https://techdigest.site/apps/home-assistant/",
   "project": "https://www.home-assistant.io",
   "repo": "https://github.com/home-assistant/core",
   "license": "Apache-2.0",
   "license_class": "permissive",
   "language": "Python",
   "first_release": "2013",
   "maturity": "mature",
   "datastore": "SQLite (recorder), MariaDB or PostgreSQL optional",
   "default_ports": [
    8123
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "oidc-plugin",
   "ram_idle_mb": 600,
   "ram_typical_mb": 1600,
   "ops_load": 4,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "SmartThings",
    "Google Home",
    "Amazon Alexa routines",
    "Hubitat"
   ]
  },
  {
   "slug": "homepage",
   "name": "Homepage",
   "category": "dashboards",
   "url": "https://techdigest.site/apps/homepage/",
   "project": "https://gethomepage.dev",
   "repo": "https://github.com/gethomepage/homepage",
   "license": "GPL-3.0",
   "license_class": "copyleft",
   "language": "JavaScript / Next.js",
   "first_release": "2022",
   "maturity": "stable",
   "datastore": "None (YAML files on disk)",
   "default_ports": [
    3000
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 110,
   "ram_typical_mb": 220,
   "ops_load": 2,
   "backup_shape": "File copy",
   "live_file_copy_safe": true,
   "replaces": [
    "Start.me",
    "Netvibes",
    "Protopage",
    "igHome"
   ]
  },
  {
   "slug": "immich",
   "name": "Immich",
   "category": "photos-files",
   "url": "https://techdigest.site/apps/immich/",
   "project": "https://immich.app",
   "repo": "https://github.com/immich-app/immich",
   "license": "AGPL-3.0",
   "license_class": "copyleft",
   "language": "TypeScript / Node.js, Python (machine learning), Dart (mobile apps)",
   "first_release": "2022",
   "maturity": "stable",
   "datastore": "PostgreSQL 14 with the VectorChord extension, plus Valkey/Redis for the job queue",
   "default_ports": [
    2283
   ],
   "container_count": 4,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 900,
   "ram_typical_mb": 3500,
   "ops_load": 3,
   "backup_shape": "Postgres dump",
   "live_file_copy_safe": false,
   "replaces": [
    "Google Photos",
    "Apple iCloud Photos",
    "Amazon Photos",
    "Synology Photos"
   ]
  },
  {
   "slug": "jellyfin",
   "name": "Jellyfin",
   "category": "media",
   "url": "https://techdigest.site/apps/jellyfin/",
   "project": "https://jellyfin.org",
   "repo": "https://github.com/jellyfin/jellyfin",
   "license": "GPL-2.0-only",
   "license_class": "copyleft",
   "language": "C# / .NET",
   "first_release": "2018",
   "maturity": "mature",
   "datastore": "SQLite",
   "default_ports": [
    8096,
    8920
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "oidc-plugin",
   "ram_idle_mb": 280,
   "ram_typical_mb": 900,
   "ops_load": 2,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "Plex",
    "Emby",
    "Netflix",
    "Apple TV app"
   ]
  },
  {
   "slug": "jellyseerr",
   "name": "Jellyseerr",
   "category": "media",
   "url": "https://techdigest.site/apps/jellyseerr/",
   "project": "https://docs.seerr.dev",
   "repo": "https://github.com/seerr-team/seerr",
   "license": "MIT",
   "license_class": "permissive",
   "language": "TypeScript / Node.js",
   "first_release": "2022",
   "maturity": "stable",
   "datastore": "SQLite",
   "default_ports": [
    5055
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "proxy-only",
   "ram_idle_mb": 220,
   "ram_typical_mb": 450,
   "ops_load": 2,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "Overseerr",
    "Ombi",
    "Plex request forms"
   ]
  },
  {
   "slug": "k3s",
   "name": "k3s",
   "category": "platform",
   "url": "https://techdigest.site/apps/k3s/",
   "project": "https://k3s.io/",
   "repo": "https://github.com/k3s-io/k3s",
   "license": "Apache-2.0",
   "license_class": "permissive",
   "language": "Go",
   "first_release": "2019",
   "maturity": "mature",
   "datastore": "SQLite by default (kine); embedded etcd for HA, or external MySQL or PostgreSQL",
   "default_ports": [
    6443,
    8472,
    10250,
    51820
   ],
   "container_count": 0,
   "arm64": true,
   "sso": "n/a",
   "ram_idle_mb": 2048,
   "ram_typical_mb": 4096,
   "ops_load": 4,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "Amazon EKS",
    "Google GKE",
    "Docker Swarm"
   ]
  },
  {
   "slug": "karakeep",
   "name": "Karakeep",
   "category": "feeds",
   "url": "https://techdigest.site/apps/karakeep/",
   "project": "https://karakeep.app",
   "repo": "https://github.com/karakeep-app/karakeep",
   "license": "AGPL-3.0",
   "license_class": "copyleft",
   "language": "TypeScript / Next.js",
   "first_release": "2024",
   "maturity": "young",
   "datastore": "SQLite for data, Meilisearch for the search index",
   "default_ports": [
    3000
   ],
   "container_count": 3,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 700,
   "ram_typical_mb": 1300,
   "ops_load": 3,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "Raindrop.io",
    "Pocket",
    "Evernote Web Clipper",
    "MyMind"
   ]
  },
  {
   "slug": "kavita",
   "name": "Kavita",
   "category": "media",
   "url": "https://techdigest.site/apps/kavita/",
   "project": "https://www.kavitareader.com",
   "repo": "https://github.com/Kareadita/Kavita",
   "license": "GPL-3.0",
   "license_class": "copyleft",
   "language": "C# / .NET and Angular",
   "first_release": "2021",
   "maturity": "stable",
   "datastore": "SQLite",
   "default_ports": [
    5000
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 250,
   "ram_typical_mb": 600,
   "ops_load": 2,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "Komga",
    "Calibre-Web",
    "ComiXology",
    "Plex Comics"
   ]
  },
  {
   "slug": "keycloak",
   "name": "Keycloak",
   "category": "identity",
   "url": "https://techdigest.site/apps/keycloak/",
   "project": "https://www.keycloak.org",
   "repo": "https://github.com/keycloak/keycloak",
   "license": "Apache-2.0",
   "license_class": "permissive",
   "language": "Java (Quarkus)",
   "first_release": "2014",
   "maturity": "mature",
   "datastore": "PostgreSQL, MariaDB/MySQL, MSSQL or Oracle; a dev-file H2 database for development only",
   "default_ports": [
    8080,
    8443,
    9000
   ],
   "container_count": 2,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 750,
   "ram_typical_mb": 1250,
   "ops_load": 4,
   "backup_shape": "Postgres dump",
   "live_file_copy_safe": false,
   "replaces": [
    "Okta",
    "Auth0",
    "Microsoft Entra ID",
    "Ping Identity"
   ]
  },
  {
   "slug": "komodo",
   "name": "Komodo",
   "category": "platform",
   "url": "https://techdigest.site/apps/komodo/",
   "project": "https://komo.do/",
   "repo": "https://github.com/moghtech/komodo",
   "license": "GPL-3.0",
   "license_class": "copyleft",
   "language": "Rust / TypeScript",
   "first_release": "2023",
   "maturity": "stable",
   "datastore": "MongoDB (FerretDB supported as a drop-in for hosts that cannot run current MongoDB)",
   "default_ports": [
    9120,
    8120
   ],
   "container_count": 3,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 250,
   "ram_typical_mb": 700,
   "ops_load": 3,
   "backup_shape": "Mongo dump",
   "live_file_copy_safe": false,
   "replaces": [
    "Portainer Business",
    "Dokku",
    "Heroku"
   ]
  },
  {
   "slug": "kopia",
   "name": "Kopia",
   "category": "backup",
   "url": "https://techdigest.site/apps/kopia/",
   "project": "https://kopia.io/",
   "repo": "https://github.com/kopia/kopia",
   "license": "Apache-2.0",
   "license_class": "permissive",
   "language": "Go (KopiaUI is Electron)",
   "first_release": "2019",
   "maturity": "stable",
   "datastore": "Its own content-addressed repository with an epoch-based index, plus a local cache directory",
   "default_ports": [
    51515
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "none",
   "ram_idle_mb": 200,
   "ram_typical_mb": 700,
   "ops_load": 2,
   "backup_shape": "Mixed",
   "live_file_copy_safe": false,
   "replaces": [
    "Arq",
    "CrashPlan",
    "Backblaze Personal Backup",
    "Time Machine"
   ]
  },
  {
   "slug": "linkding",
   "name": "linkding",
   "category": "feeds",
   "url": "https://techdigest.site/apps/linkding/",
   "project": "https://linkding.link",
   "repo": "https://github.com/sissbruecker/linkding",
   "license": "MIT",
   "license_class": "permissive",
   "language": "Python / Django",
   "first_release": "2019",
   "maturity": "mature",
   "datastore": "SQLite by default; PostgreSQL supported via LD_DB_ENGINE",
   "default_ports": [
    9090
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 90,
   "ram_typical_mb": 150,
   "ops_load": 1,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "Raindrop.io",
    "Pinboard",
    "Pocket",
    "del.icio.us"
   ]
  },
  {
   "slug": "lldap",
   "name": "LLDAP",
   "category": "identity",
   "url": "https://techdigest.site/apps/lldap/",
   "project": "https://github.com/lldap/lldap",
   "repo": "https://github.com/lldap/lldap",
   "license": "GPL-3.0",
   "license_class": "copyleft",
   "language": "Rust",
   "first_release": "2021",
   "maturity": "stable",
   "datastore": "SQLite (default), PostgreSQL or MySQL/MariaDB",
   "default_ports": [
    3890,
    6360,
    17170
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "ldap",
   "ram_idle_mb": 15,
   "ram_typical_mb": 30,
   "ops_load": 1,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "Microsoft Active Directory",
    "JumpCloud",
    "Okta Universal Directory"
   ]
  },
  {
   "slug": "localai",
   "name": "LocalAI",
   "category": "ai",
   "url": "https://techdigest.site/apps/localai/",
   "project": "https://localai.io",
   "repo": "https://github.com/mudler/LocalAI",
   "license": "MIT",
   "license_class": "permissive",
   "language": "Go / C++ / Python",
   "first_release": "2023",
   "maturity": "stable",
   "datastore": "None; model files and per-model YAML on disk",
   "default_ports": [
    8080
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "n/a",
   "ram_idle_mb": 300,
   "ram_typical_mb": 6500,
   "ops_load": 3,
   "backup_shape": "File copy",
   "live_file_copy_safe": true,
   "replaces": [
    "OpenAI API",
    "AssemblyAI",
    "ElevenLabs",
    "Stability AI API"
   ]
  },
  {
   "slug": "mailcow",
   "name": "mailcow: dockerized",
   "category": "communication",
   "url": "https://techdigest.site/apps/mailcow/",
   "project": "https://mailcow.email/",
   "repo": "https://github.com/mailcow/mailcow-dockerized",
   "license": "GPL-3.0 for mailcow's own code; bundled components keep their own licenses",
   "license_class": "copyleft",
   "language": "PHP / shell, orchestrating Postfix, Dovecot and Rspamd",
   "first_release": "2016",
   "maturity": "mature",
   "datastore": "MariaDB 10.11 plus Redis",
   "default_ports": [
    25,
    80,
    110,
    143,
    443,
    465,
    587,
    993,
    995,
    4190
   ],
   "container_count": 18,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 3500,
   "ram_typical_mb": 6144,
   "ops_load": 4,
   "backup_shape": "MySQL dump",
   "live_file_copy_safe": false,
   "replaces": [
    "Google Workspace Gmail",
    "Microsoft 365 Exchange Online",
    "Fastmail",
    "Zoho Mail"
   ]
  },
  {
   "slug": "matrix-synapse",
   "name": "Synapse",
   "category": "communication",
   "url": "https://techdigest.site/apps/matrix-synapse/",
   "project": "https://matrix.org/",
   "repo": "https://github.com/element-hq/synapse",
   "license": "AGPL-3.0-only (or a commercial license from Element)",
   "license_class": "copyleft",
   "language": "Python / Rust",
   "first_release": "2014",
   "maturity": "mature",
   "datastore": "PostgreSQL",
   "default_ports": [
    8008,
    8448
   ],
   "container_count": 2,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 700,
   "ram_typical_mb": 2000,
   "ops_load": 4,
   "backup_shape": "Postgres dump",
   "live_file_copy_safe": false,
   "replaces": [
    "Slack",
    "Discord",
    "Microsoft Teams",
    "WhatsApp"
   ]
  },
  {
   "slug": "mattermost",
   "name": "Mattermost",
   "category": "communication",
   "url": "https://techdigest.site/apps/mattermost/",
   "project": "https://mattermost.com/",
   "repo": "https://github.com/mattermost/mattermost",
   "license": "AGPL-3.0 core, Mattermost Source Available License for `server/enterprise/`, Apache-2.0 for webapp and admin tools, MIT for official binaries",
   "license_class": "source-available",
   "language": "Go / React",
   "first_release": "2015",
   "maturity": "mature",
   "datastore": "PostgreSQL 14+",
   "default_ports": [
    8065
   ],
   "container_count": 2,
   "arm64": false,
   "sso": "oidc-native",
   "ram_idle_mb": 500,
   "ram_typical_mb": 1500,
   "ops_load": 3,
   "backup_shape": "Postgres dump",
   "live_file_copy_safe": false,
   "replaces": [
    "Slack",
    "Microsoft Teams",
    "Discord",
    "Google Chat"
   ]
  },
  {
   "slug": "mealie",
   "name": "Mealie",
   "category": "productivity",
   "url": "https://techdigest.site/apps/mealie/",
   "project": "https://mealie.io",
   "repo": "https://github.com/mealie-recipes/mealie",
   "license": "AGPL-3.0-or-later",
   "license_class": "copyleft",
   "language": "Python (FastAPI) / Vue (Nuxt 3)",
   "first_release": "2020",
   "maturity": "mature",
   "datastore": "SQLite by default, PostgreSQL optional",
   "default_ports": [
    9000
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 300,
   "ram_typical_mb": 600,
   "ops_load": 2,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "Paprika",
    "Copy Me That",
    "Samsung Food (Whisk)",
    "Pinterest recipe boards"
   ]
  },
  {
   "slug": "miniflux",
   "name": "Miniflux",
   "category": "feeds",
   "url": "https://techdigest.site/apps/miniflux/",
   "project": "https://miniflux.app",
   "repo": "https://github.com/miniflux/v2",
   "license": "Apache-2.0",
   "license_class": "permissive",
   "language": "Go",
   "first_release": "2017",
   "maturity": "mature",
   "datastore": "PostgreSQL only",
   "default_ports": [
    8080
   ],
   "container_count": 2,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 40,
   "ram_typical_mb": 90,
   "ops_load": 3,
   "backup_shape": "Postgres dump",
   "live_file_copy_safe": false,
   "replaces": [
    "Feedly",
    "Inoreader",
    "NewsBlur",
    "The Old Reader"
   ]
  },
  {
   "slug": "minio",
   "name": "MinIO",
   "category": "backup",
   "url": "https://techdigest.site/apps/minio/",
   "project": "https://www.min.io/",
   "repo": "https://github.com/minio/minio",
   "license": "AGPL-3.0 (repository archived)",
   "license_class": "copyleft",
   "language": "Go",
   "first_release": "2015",
   "maturity": "legacy",
   "datastore": "None external. Objects and their metadata live on the raw drives, with erasure coding and internal state under .minio.sys",
   "default_ports": [
    9000,
    9001
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "none",
   "ram_idle_mb": 250,
   "ram_typical_mb": 900,
   "ops_load": 4,
   "backup_shape": "File copy",
   "live_file_copy_safe": true,
   "replaces": [
    "Amazon S3",
    "Wasabi",
    "Backblaze B2",
    "DigitalOcean Spaces"
   ]
  },
  {
   "slug": "n8n",
   "name": "n8n",
   "category": "dashboards",
   "url": "https://techdigest.site/apps/n8n/",
   "project": "https://n8n.io",
   "repo": "https://github.com/n8n-io/n8n",
   "license": "Sustainable Use License 1.0 (plus n8n Enterprise License for .ee files)",
   "license_class": "source-available",
   "language": "TypeScript / Node.js",
   "first_release": "2019",
   "maturity": "mature",
   "datastore": "SQLite by default, PostgreSQL for anything serious; Redis required in queue mode",
   "default_ports": [
    5678
   ],
   "container_count": 2,
   "arm64": true,
   "sso": "none",
   "ram_idle_mb": 400,
   "ram_typical_mb": 900,
   "ops_load": 4,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "Zapier",
    "Make",
    "Microsoft Power Automate",
    "Workato"
   ]
  },
  {
   "slug": "navidrome",
   "name": "Navidrome",
   "category": "media",
   "url": "https://techdigest.site/apps/navidrome/",
   "project": "https://www.navidrome.org",
   "repo": "https://github.com/navidrome/navidrome",
   "license": "GPL-3.0",
   "license_class": "copyleft",
   "language": "Go",
   "first_release": "2020",
   "maturity": "stable",
   "datastore": "SQLite",
   "default_ports": [
    4533
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "header",
   "ram_idle_mb": 70,
   "ram_typical_mb": 200,
   "ops_load": 1,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "Spotify",
    "Apple Music",
    "Plexamp",
    "Google Play Music"
   ]
  },
  {
   "slug": "netdata",
   "name": "Netdata",
   "category": "monitoring",
   "url": "https://techdigest.site/apps/netdata/",
   "project": "https://www.netdata.cloud",
   "repo": "https://github.com/netdata/netdata",
   "license": "GPL-3.0-or-later (agent); dashboard UI under NCUL1",
   "license_class": "copyleft",
   "language": "C and Go",
   "first_release": "2013",
   "maturity": "mature",
   "datastore": "dbengine, its own tiered on-disk store, plus SQLite for metadata",
   "default_ports": [
    19999
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "proxy-only",
   "ram_idle_mb": 150,
   "ram_typical_mb": 250,
   "ops_load": 2,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "Datadog",
    "New Relic",
    "Zabbix",
    "Munin"
   ]
  },
  {
   "slug": "nextcloud",
   "name": "Nextcloud",
   "category": "photos-files",
   "url": "https://techdigest.site/apps/nextcloud/",
   "project": "https://nextcloud.com",
   "repo": "https://github.com/nextcloud/server",
   "license": "AGPL-3.0-or-later",
   "license_class": "copyleft",
   "language": "PHP, with Vue and TypeScript frontends",
   "first_release": "2016",
   "maturity": "mature",
   "datastore": "MariaDB 10.11+/11.x or PostgreSQL 14 to 18, plus Redis for file locking and caching",
   "default_ports": [
    80,
    443,
    8080
   ],
   "container_count": 4,
   "arm64": true,
   "sso": "oidc-plugin",
   "ram_idle_mb": 600,
   "ram_typical_mb": 1800,
   "ops_load": 4,
   "backup_shape": "MySQL dump",
   "live_file_copy_safe": false,
   "replaces": [
    "Google Drive",
    "Dropbox",
    "Microsoft 365 / OneDrive",
    "Box"
   ]
  },
  {
   "slug": "nginx-proxy-manager",
   "name": "Nginx Proxy Manager",
   "category": "networking",
   "url": "https://techdigest.site/apps/nginx-proxy-manager/",
   "project": "https://nginxproxymanager.com",
   "repo": "https://github.com/NginxProxyManager/nginx-proxy-manager",
   "license": "MIT",
   "license_class": "permissive",
   "language": "Node.js (Express) driving nginx/OpenResty",
   "first_release": "2018",
   "maturity": "mature",
   "datastore": "SQLite by default; MariaDB/MySQL or PostgreSQL optional",
   "default_ports": [
    80,
    443,
    81
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "none",
   "ram_idle_mb": 100,
   "ram_typical_mb": 200,
   "ops_load": 2,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "Cloudflare Tunnel",
    "Nginx Plus",
    "AWS Application Load Balancer"
   ]
  },
  {
   "slug": "node-red",
   "name": "Node-RED",
   "category": "home-automation",
   "url": "https://techdigest.site/apps/node-red/",
   "project": "https://nodered.org",
   "repo": "https://github.com/node-red/node-red",
   "license": "Apache-2.0",
   "license_class": "permissive",
   "language": "JavaScript / Node.js",
   "first_release": "2013",
   "maturity": "mature",
   "datastore": "JSON files on disk (flows.json and an encrypted credentials file)",
   "default_ports": [
    1880
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "oidc-plugin",
   "ram_idle_mb": 110,
   "ram_typical_mb": 260,
   "ops_load": 2,
   "backup_shape": "File copy",
   "live_file_copy_safe": true,
   "replaces": [
    "IFTTT",
    "Zapier",
    "Make",
    "SmartThings automations"
   ]
  },
  {
   "slug": "ntfy",
   "name": "ntfy",
   "category": "communication",
   "url": "https://techdigest.site/apps/ntfy/",
   "project": "https://ntfy.sh/",
   "repo": "https://github.com/binwiederhier/ntfy",
   "license": "Apache-2.0 (dual licensed with GPL-2.0)",
   "license_class": "permissive",
   "language": "Go",
   "first_release": "2021",
   "maturity": "stable",
   "datastore": "SQLite (PostgreSQL supported since 2.x)",
   "default_ports": [
    80
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "none",
   "ram_idle_mb": 30,
   "ram_typical_mb": 80,
   "ops_load": 1,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "Pushover",
    "Pushbullet",
    "Prowl",
    "Slack incoming webhooks"
   ]
  },
  {
   "slug": "ollama",
   "name": "Ollama",
   "category": "ai",
   "url": "https://techdigest.site/apps/ollama/",
   "project": "https://ollama.com",
   "repo": "https://github.com/ollama/ollama",
   "license": "MIT",
   "license_class": "permissive",
   "language": "Go / C++",
   "first_release": "2023",
   "maturity": "stable",
   "datastore": "None; a content-addressed blob store on disk",
   "default_ports": [
    11434
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "n/a",
   "ram_idle_mb": 150,
   "ram_typical_mb": 6000,
   "ops_load": 2,
   "backup_shape": "File copy",
   "live_file_copy_safe": true,
   "replaces": [
    "OpenAI API",
    "Anthropic API",
    "GitHub Copilot",
    "ChatGPT Plus"
   ]
  },
  {
   "slug": "open-webui",
   "name": "Open WebUI",
   "category": "ai",
   "url": "https://techdigest.site/apps/open-webui/",
   "project": "https://openwebui.com",
   "repo": "https://github.com/open-webui/open-webui",
   "license": "Open WebUI License (BSD-3-Clause plus a branding clause)",
   "license_class": "source-available",
   "language": "Python / Svelte",
   "first_release": "2023",
   "maturity": "stable",
   "datastore": "SQLite by default at DATA_DIR/webui.db, PostgreSQL optional",
   "default_ports": [
    8080
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 600,
   "ram_typical_mb": 1400,
   "ops_load": 2,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "ChatGPT",
    "Claude.ai",
    "Perplexity",
    "Poe"
   ]
  },
  {
   "slug": "outline",
   "name": "Outline",
   "category": "knowledge",
   "url": "https://techdigest.site/apps/outline/",
   "project": "https://www.getoutline.com/",
   "repo": "https://github.com/outline/outline",
   "license": "BUSL-1.1 (Change Date 2030-09-01, converts to Apache-2.0)",
   "license_class": "source-available",
   "language": "TypeScript / Node.js",
   "first_release": "2016",
   "maturity": "mature",
   "datastore": "PostgreSQL 14+ with Redis 4+",
   "default_ports": [
    3000
   ],
   "container_count": 3,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 550,
   "ram_typical_mb": 950,
   "ops_load": 4,
   "backup_shape": "Postgres dump",
   "live_file_copy_safe": false,
   "replaces": [
    "Notion",
    "Confluence",
    "Slite",
    "Coda"
   ]
  },
  {
   "slug": "paperless-ngx",
   "name": "Paperless-ngx",
   "category": "knowledge",
   "url": "https://techdigest.site/apps/paperless-ngx/",
   "project": "https://docs.paperless-ngx.com/",
   "repo": "https://github.com/paperless-ngx/paperless-ngx",
   "license": "GPL-3.0",
   "license_class": "copyleft",
   "language": "Python / Django, Angular frontend",
   "first_release": "2022",
   "maturity": "mature",
   "datastore": "PostgreSQL (SQLite and MariaDB also supported)",
   "default_ports": [
    8000
   ],
   "container_count": 5,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 450,
   "ram_typical_mb": 1200,
   "ops_load": 3,
   "backup_shape": "Postgres dump",
   "live_file_copy_safe": false,
   "replaces": [
    "Evernote (document scanning)",
    "Dropbox Scan",
    "Adobe Acrobat",
    "DEVONthink"
   ]
  },
  {
   "slug": "photoprism",
   "name": "PhotoPrism",
   "category": "photos-files",
   "url": "https://techdigest.site/apps/photoprism/",
   "project": "https://www.photoprism.app",
   "repo": "https://github.com/photoprism/photoprism",
   "license": "AGPL-3.0 (Community Edition); default images ship under the PhotoPrism Plus License",
   "license_class": "copyleft",
   "language": "Go (backend), Vue (frontend), TensorFlow (models)",
   "first_release": "2019",
   "maturity": "mature",
   "datastore": "MariaDB 10.5.12+ recommended; SQLite supported for small libraries",
   "default_ports": [
    2342
   ],
   "container_count": 2,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 450,
   "ram_typical_mb": 2000,
   "ops_load": 2,
   "backup_shape": "MySQL dump",
   "live_file_copy_safe": false,
   "replaces": [
    "Google Photos",
    "Apple Photos",
    "Adobe Lightroom (library and browse)",
    "Flickr"
   ]
  },
  {
   "slug": "pihole",
   "name": "Pi-hole",
   "category": "networking",
   "url": "https://techdigest.site/apps/pihole/",
   "project": "https://pi-hole.net",
   "repo": "https://github.com/pi-hole/pi-hole",
   "license": "EUPL-1.2",
   "license_class": "copyleft",
   "language": "C (pihole-FTL) and Bash (core), JavaScript web UI",
   "first_release": "2015",
   "maturity": "mature",
   "datastore": "SQLite (gravity.db and pihole-FTL.db) plus a TOML config file",
   "default_ports": [
    53,
    80,
    443
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "none",
   "ram_idle_mb": 100,
   "ram_typical_mb": 220,
   "ops_load": 2,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "NextDNS",
    "AdGuard DNS",
    "Cloudflare Gateway"
   ]
  },
  {
   "slug": "planka",
   "name": "PLANKA",
   "category": "productivity",
   "url": "https://techdigest.site/apps/planka/",
   "project": "https://planka.app",
   "repo": "https://github.com/plankanban/planka",
   "license": "PLANKA Community License (Fair Use License 1.1)",
   "license_class": "source-available",
   "language": "JavaScript / Node.js (Sails.js and React)",
   "first_release": "2019",
   "maturity": "stable",
   "datastore": "PostgreSQL",
   "default_ports": [
    1337
   ],
   "container_count": 2,
   "arm64": true,
   "sso": "none",
   "ram_idle_mb": 220,
   "ram_typical_mb": 400,
   "ops_load": 3,
   "backup_shape": "Postgres dump",
   "live_file_copy_safe": false,
   "replaces": [
    "Trello",
    "Asana",
    "Monday.com",
    "Jira"
   ]
  },
  {
   "slug": "plex",
   "name": "Plex Media Server",
   "category": "media",
   "url": "https://techdigest.site/apps/plex/",
   "project": "https://www.plex.tv",
   "repo": "https://github.com/plexinc/pms-docker",
   "license": "Proprietary",
   "license_class": "proprietary",
   "language": "C++ (closed source)",
   "first_release": "2008",
   "maturity": "mature",
   "datastore": "SQLite",
   "default_ports": [
    32400,
    32469
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "none",
   "ram_idle_mb": 400,
   "ram_typical_mb": 1200,
   "ops_load": 2,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "Netflix",
    "Emby",
    "Jellyfin",
    "Apple TV app"
   ]
  },
  {
   "slug": "pocket-id",
   "name": "Pocket ID",
   "category": "identity",
   "url": "https://techdigest.site/apps/pocket-id/",
   "project": "https://pocket-id.org",
   "repo": "https://github.com/pocket-id/pocket-id",
   "license": "BSD-2-Clause",
   "license_class": "permissive",
   "language": "Go / SvelteKit",
   "first_release": "2024",
   "maturity": "young",
   "datastore": "SQLite (default) or PostgreSQL",
   "default_ports": [
    1411
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 30,
   "ram_typical_mb": 60,
   "ops_load": 1,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "Okta",
    "Auth0",
    "Google Sign-In",
    "Microsoft Entra ID"
   ]
  },
  {
   "slug": "podman",
   "name": "Podman",
   "category": "platform",
   "url": "https://techdigest.site/apps/podman/",
   "project": "https://podman.io/",
   "repo": "https://github.com/podman-container-tools/podman",
   "license": "Apache-2.0",
   "license_class": "permissive",
   "language": "Go",
   "first_release": "2018",
   "maturity": "mature",
   "datastore": "SQLite state database under ~/.local/share/containers (BoltDB support removed in 6.0)",
   "default_ports": [],
   "container_count": 0,
   "arm64": true,
   "sso": "n/a",
   "ram_idle_mb": 40,
   "ram_typical_mb": 150,
   "ops_load": 2,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "Docker Desktop",
    "Docker Engine"
   ]
  },
  {
   "slug": "portainer",
   "name": "Portainer",
   "category": "platform",
   "url": "https://techdigest.site/apps/portainer/",
   "project": "https://www.portainer.io/",
   "repo": "https://github.com/portainer/portainer",
   "license": "zlib (Community Edition); Business Edition is proprietary",
   "license_class": "permissive",
   "language": "Go / TypeScript",
   "first_release": "2016",
   "maturity": "mature",
   "datastore": "BoltDB key-value file at /data/portainer.db",
   "default_ports": [
    8000,
    9000,
    9443
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 90,
   "ram_typical_mb": 220,
   "ops_load": 1,
   "backup_shape": "Embedded key-value store",
   "live_file_copy_safe": false,
   "replaces": [
    "Docker Desktop",
    "Rancher",
    "VMware vCenter"
   ]
  },
  {
   "slug": "prometheus",
   "name": "Prometheus",
   "category": "monitoring",
   "url": "https://techdigest.site/apps/prometheus/",
   "project": "https://prometheus.io",
   "repo": "https://github.com/prometheus/prometheus",
   "license": "Apache-2.0",
   "license_class": "permissive",
   "language": "Go",
   "first_release": "2015",
   "maturity": "mature",
   "datastore": "Its own TSDB on local disk, no external database",
   "default_ports": [
    9090
   ],
   "container_count": 2,
   "arm64": true,
   "sso": "proxy-only",
   "ram_idle_mb": 150,
   "ram_typical_mb": 500,
   "ops_load": 3,
   "backup_shape": "Mixed",
   "live_file_copy_safe": false,
   "replaces": [
    "Datadog",
    "New Relic",
    "Grafana Cloud",
    "Amazon CloudWatch"
   ]
  },
  {
   "slug": "prowlarr",
   "name": "Prowlarr",
   "category": "media",
   "url": "https://techdigest.site/apps/prowlarr/",
   "project": "https://prowlarr.com",
   "repo": "https://github.com/Prowlarr/Prowlarr",
   "license": "GPL-3.0",
   "license_class": "copyleft",
   "language": "C# / .NET",
   "first_release": "2021",
   "maturity": "stable",
   "datastore": "SQLite (PostgreSQL optional)",
   "default_ports": [
    9696
   ],
   "container_count": 2,
   "arm64": true,
   "sso": "none",
   "ram_idle_mb": 150,
   "ram_typical_mb": 300,
   "ops_load": 2,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "Jackett",
    "NZBHydra2",
    "per-app indexer config"
   ]
  },
  {
   "slug": "proxmox-ve",
   "name": "Proxmox VE",
   "category": "platform",
   "url": "https://techdigest.site/apps/proxmox-ve/",
   "project": "https://www.proxmox.com/en/proxmox-virtual-environment/overview",
   "repo": "https://git.proxmox.com/",
   "license": "AGPL-3.0-only",
   "license_class": "copyleft",
   "language": "Perl / Rust / JavaScript (ExtJS)",
   "first_release": "2008",
   "maturity": "mature",
   "datastore": "SQLite via pmxcfs (/var/lib/pve-cluster/config.db), replicated by Corosync",
   "default_ports": [
    22,
    111,
    3128,
    8006
   ],
   "container_count": 0,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 2048,
   "ram_typical_mb": 8192,
   "ops_load": 4,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "VMware ESXi",
    "VMware vCenter",
    "Microsoft Hyper-V",
    "Nutanix AHV"
   ]
  },
  {
   "slug": "radarr",
   "name": "Radarr",
   "category": "media",
   "url": "https://techdigest.site/apps/radarr/",
   "project": "https://radarr.video",
   "repo": "https://github.com/Radarr/Radarr",
   "license": "GPL-3.0",
   "license_class": "copyleft",
   "language": "C# / .NET",
   "first_release": "2017",
   "maturity": "mature",
   "datastore": "SQLite (PostgreSQL optional)",
   "default_ports": [
    7878
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "none",
   "ram_idle_mb": 200,
   "ram_typical_mb": 400,
   "ops_load": 3,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "CouchPotato",
    "Netflix",
    "iTunes movie rentals"
   ]
  },
  {
   "slug": "rclone",
   "name": "rclone",
   "category": "backup",
   "url": "https://techdigest.site/apps/rclone/",
   "project": "https://rclone.org/",
   "repo": "https://github.com/rclone/rclone",
   "license": "MIT",
   "license_class": "permissive",
   "language": "Go",
   "first_release": "2014",
   "maturity": "mature",
   "datastore": "None. A single INI-style config file at ~/.config/rclone/rclone.conf",
   "default_ports": [
    5572
   ],
   "container_count": 0,
   "arm64": true,
   "sso": "n/a",
   "ram_idle_mb": 40,
   "ram_typical_mb": 300,
   "ops_load": 2,
   "backup_shape": "File copy",
   "live_file_copy_safe": true,
   "replaces": [
    "Dropbox",
    "Google Drive for desktop",
    "Cyberduck",
    "Mountain Duck"
   ]
  },
  {
   "slug": "restic",
   "name": "restic",
   "category": "backup",
   "url": "https://techdigest.site/apps/restic/",
   "project": "https://restic.net/",
   "repo": "https://github.com/restic/restic",
   "license": "BSD-2-Clause",
   "license_class": "permissive",
   "language": "Go",
   "first_release": "2015",
   "maturity": "mature",
   "datastore": "Its own content-addressed repository (files in a directory or bucket), no database service",
   "default_ports": [],
   "container_count": 0,
   "arm64": true,
   "sso": "n/a",
   "ram_idle_mb": 100,
   "ram_typical_mb": 800,
   "ops_load": 2,
   "backup_shape": "Mixed",
   "live_file_copy_safe": false,
   "replaces": [
    "Backblaze Personal Backup",
    "CrashPlan",
    "Arq",
    "Carbonite"
   ]
  },
  {
   "slug": "scrutiny",
   "name": "Scrutiny",
   "category": "monitoring",
   "url": "https://techdigest.site/apps/scrutiny/",
   "project": "https://github.com/AnalogJ/scrutiny",
   "repo": "https://github.com/AnalogJ/scrutiny",
   "license": "MIT",
   "license_class": "permissive",
   "language": "Go",
   "first_release": "2020",
   "maturity": "stable",
   "datastore": "InfluxDB 2 for metrics plus SQLite for devices and settings",
   "default_ports": [
    8080,
    8086
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "proxy-only",
   "ram_idle_mb": 100,
   "ram_typical_mb": 250,
   "ops_load": 3,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "CrystalDiskInfo",
    "Hard Disk Sentinel",
    "Synology Storage Manager",
    "QNAP Storage and Snapshots"
   ]
  },
  {
   "slug": "seafile",
   "name": "Seafile",
   "category": "photos-files",
   "url": "https://techdigest.site/apps/seafile/",
   "project": "https://www.seafile.com",
   "repo": "https://github.com/haiwen/seafile",
   "license": "GPL-2.0 with an OpenSSL linking exception (server, Community Edition); Professional Edition is proprietary",
   "license_class": "copyleft",
   "language": "C (storage engine), Python/Django (Seahub web UI), React frontend",
   "first_release": "2012",
   "maturity": "mature",
   "datastore": "MariaDB/MySQL holding ccnet_db, seafile_db and seahub_db, plus Redis for cache; file content lives as blocks on disk or S3",
   "default_ports": [
    80,
    443
   ],
   "container_count": 4,
   "arm64": true,
   "sso": "oidc-plugin",
   "ram_idle_mb": 700,
   "ram_typical_mb": 1400,
   "ops_load": 3,
   "backup_shape": "MySQL dump",
   "live_file_copy_safe": false,
   "replaces": [
    "Dropbox",
    "Google Drive",
    "Box",
    "OneDrive"
   ]
  },
  {
   "slug": "searxng",
   "name": "SearXNG",
   "category": "ai",
   "url": "https://techdigest.site/apps/searxng/",
   "project": "https://docs.searxng.org",
   "repo": "https://github.com/searxng/searxng",
   "license": "AGPL-3.0-or-later",
   "license_class": "copyleft",
   "language": "Python",
   "first_release": "2021",
   "maturity": "stable",
   "datastore": "None; Valkey or Redis only if you enable the limiter",
   "default_ports": [
    8080
   ],
   "container_count": 2,
   "arm64": true,
   "sso": "n/a",
   "ram_idle_mb": 150,
   "ram_typical_mb": 350,
   "ops_load": 2,
   "backup_shape": "File copy",
   "live_file_copy_safe": true,
   "replaces": [
    "Google Search",
    "Bing",
    "Kagi",
    "DuckDuckGo"
   ]
  },
  {
   "slug": "sonarr",
   "name": "Sonarr",
   "category": "media",
   "url": "https://techdigest.site/apps/sonarr/",
   "project": "https://sonarr.tv",
   "repo": "https://github.com/Sonarr/Sonarr",
   "license": "GPL-3.0",
   "license_class": "copyleft",
   "language": "C# / .NET",
   "first_release": "2013",
   "maturity": "mature",
   "datastore": "SQLite (PostgreSQL optional)",
   "default_ports": [
    8989
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "none",
   "ram_idle_mb": 200,
   "ram_typical_mb": 400,
   "ops_load": 3,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "SickBeard",
    "Cable DVR",
    "Netflix"
   ]
  },
  {
   "slug": "stalwart",
   "name": "Stalwart",
   "category": "communication",
   "url": "https://techdigest.site/apps/stalwart/",
   "project": "https://stalw.art/",
   "repo": "https://github.com/stalwartlabs/stalwart",
   "license": "AGPL-3.0 for the Community edition, dual licensed with the proprietary Stalwart Enterprise License for gated features",
   "license_class": "copyleft",
   "language": "Rust",
   "first_release": "2023",
   "maturity": "young",
   "datastore": "RocksDB by default; PostgreSQL, MySQL, SQLite, FoundationDB, S3 and Redis also supported",
   "default_ports": [
    25,
    110,
    143,
    443,
    465,
    587,
    993,
    995,
    4190,
    8080
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "ldap",
   "ram_idle_mb": 150,
   "ram_typical_mb": 512,
   "ops_load": 3,
   "backup_shape": "Embedded key-value store",
   "live_file_copy_safe": false,
   "replaces": [
    "Google Workspace Gmail",
    "Microsoft 365 Exchange Online",
    "Zimbra",
    "Fastmail"
   ]
  },
  {
   "slug": "syncthing",
   "name": "Syncthing",
   "category": "photos-files",
   "url": "https://techdigest.site/apps/syncthing/",
   "project": "https://syncthing.net",
   "repo": "https://github.com/syncthing/syncthing",
   "license": "MPL-2.0",
   "license_class": "copyleft",
   "language": "Go",
   "first_release": "2014",
   "maturity": "mature",
   "datastore": "SQLite since 2.0 (LevelDB before that), local to each device",
   "default_ports": [
    8384,
    22000,
    21027
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "none",
   "ram_idle_mb": 60,
   "ram_typical_mb": 300,
   "ops_load": 1,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "Dropbox",
    "Resilio Sync",
    "Google Drive desktop sync",
    "BitTorrent Sync"
   ]
  },
  {
   "slug": "technitium-dns",
   "name": "Technitium DNS Server",
   "category": "networking",
   "url": "https://techdigest.site/apps/technitium-dns/",
   "project": "https://technitium.com/dns/",
   "repo": "https://github.com/TechnitiumSoftware/DnsServer",
   "license": "GPL-3.0",
   "license_class": "copyleft",
   "language": "C# / .NET 10",
   "first_release": "2017",
   "maturity": "mature",
   "datastore": "Flat files under the config directory (zone files, settings, stats); no external database",
   "default_ports": [
    53,
    5380,
    53443,
    443,
    853
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 130,
   "ram_typical_mb": 280,
   "ops_load": 3,
   "backup_shape": "File copy",
   "live_file_copy_safe": true,
   "replaces": [
    "Windows Server DNS",
    "Amazon Route 53",
    "Cloudflare DNS",
    "NextDNS"
   ]
  },
  {
   "slug": "traefik",
   "name": "Traefik",
   "category": "networking",
   "url": "https://techdigest.site/apps/traefik/",
   "project": "https://traefik.io",
   "repo": "https://github.com/traefik/traefik",
   "license": "MIT",
   "license_class": "permissive",
   "language": "Go",
   "first_release": "2015",
   "maturity": "mature",
   "datastore": "None. Certificates in a single acme.json file; routing state rebuilt from providers at every start",
   "default_ports": [
    80,
    443,
    8080
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "proxy-only",
   "ram_idle_mb": 60,
   "ram_typical_mb": 130,
   "ops_load": 3,
   "backup_shape": "File copy",
   "live_file_copy_safe": true,
   "replaces": [
    "Nginx Plus",
    "AWS Application Load Balancer",
    "HAProxy Enterprise",
    "Cloudflare Tunnel"
   ]
  },
  {
   "slug": "trilium-notes",
   "name": "Trilium Notes",
   "category": "knowledge",
   "url": "https://techdigest.site/apps/trilium-notes/",
   "project": "https://triliumnotes.org/",
   "repo": "https://github.com/TriliumNext/Trilium",
   "license": "AGPL-3.0",
   "license_class": "copyleft",
   "language": "TypeScript / Node.js (Electron desktop)",
   "first_release": "2017",
   "maturity": "mature",
   "datastore": "SQLite (`document.db`)",
   "default_ports": [
    8080
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 200,
   "ram_typical_mb": 420,
   "ops_load": 2,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "Evernote",
    "OneNote",
    "Notion",
    "Obsidian"
   ]
  },
  {
   "slug": "truenas-scale",
   "name": "TrueNAS Community Edition",
   "category": "platform",
   "url": "https://techdigest.site/apps/truenas-scale/",
   "project": "https://www.truenas.com/",
   "repo": "https://github.com/truenas/middleware",
   "license": "LGPL-3.0 (middleware)",
   "license_class": "copyleft",
   "language": "Python / TypeScript",
   "first_release": "2022",
   "maturity": "mature",
   "datastore": "SQLite configuration database on the boot pool, plus ZFS datasets for everything else",
   "default_ports": [
    80,
    443
   ],
   "container_count": 0,
   "arm64": false,
   "sso": "oidc-native",
   "ram_idle_mb": 8192,
   "ram_typical_mb": 16384,
   "ops_load": 3,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "Synology DSM",
    "QNAP QTS",
    "NetApp ONTAP",
    "Windows Server file shares"
   ]
  },
  {
   "slug": "unraid",
   "name": "Unraid",
   "category": "platform",
   "url": "https://techdigest.site/apps/unraid/",
   "project": "https://unraid.net/",
   "repo": "https://github.com/unraid",
   "license": "Proprietary, perpetual per-device licence",
   "license_class": "proprietary",
   "language": "PHP / Slackware userland",
   "first_release": "2005",
   "maturity": "mature",
   "datastore": "Flat configuration files on the boot device, loaded into a RAM filesystem at boot",
   "default_ports": [
    80,
    443
   ],
   "container_count": 0,
   "arm64": false,
   "sso": "oidc-native",
   "ram_idle_mb": 2048,
   "ram_typical_mb": 8192,
   "ops_load": 2,
   "backup_shape": "File copy",
   "live_file_copy_safe": true,
   "replaces": [
    "Synology DSM",
    "QNAP QTS",
    "Windows Storage Spaces",
    "Drobo"
   ]
  },
  {
   "slug": "uptime-kuma",
   "name": "Uptime Kuma",
   "category": "monitoring",
   "url": "https://techdigest.site/apps/uptime-kuma/",
   "project": "https://uptime.kuma.pet",
   "repo": "https://github.com/louislam/uptime-kuma",
   "license": "MIT",
   "license_class": "permissive",
   "language": "JavaScript / Node.js",
   "first_release": "2021",
   "maturity": "mature",
   "datastore": "SQLite by default, MariaDB optional in v2",
   "default_ports": [
    3001
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "none",
   "ram_idle_mb": 120,
   "ram_typical_mb": 250,
   "ops_load": 2,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "UptimeRobot",
    "Pingdom",
    "StatusCake",
    "Better Stack Uptime"
   ]
  },
  {
   "slug": "vaultwarden",
   "name": "Vaultwarden",
   "category": "identity",
   "url": "https://techdigest.site/apps/vaultwarden/",
   "project": "https://github.com/dani-garcia/vaultwarden",
   "repo": "https://github.com/dani-garcia/vaultwarden",
   "license": "AGPL-3.0",
   "license_class": "copyleft",
   "language": "Rust",
   "first_release": "2018",
   "maturity": "mature",
   "datastore": "SQLite (default), PostgreSQL or MySQL/MariaDB",
   "default_ports": [
    80,
    8000
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 40,
   "ram_typical_mb": 150,
   "ops_load": 2,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "Bitwarden (hosted)",
    "1Password",
    "LastPass",
    "Dashlane"
   ]
  },
  {
   "slug": "vikunja",
   "name": "Vikunja",
   "category": "productivity",
   "url": "https://techdigest.site/apps/vikunja/",
   "project": "https://vikunja.io",
   "repo": "https://github.com/go-vikunja/vikunja",
   "license": "AGPL-3.0-or-later",
   "license_class": "copyleft",
   "language": "Go / Vue",
   "first_release": "2018",
   "maturity": "stable",
   "datastore": "SQLite by default, PostgreSQL or MySQL/MariaDB supported",
   "default_ports": [
    3456
   ],
   "container_count": 2,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 70,
   "ram_typical_mb": 180,
   "ops_load": 2,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "Todoist",
    "Trello",
    "Microsoft To Do",
    "Asana"
   ]
  },
  {
   "slug": "wallabag",
   "name": "wallabag",
   "category": "feeds",
   "url": "https://techdigest.site/apps/wallabag/",
   "project": "https://wallabag.org",
   "repo": "https://github.com/wallabag/wallabag",
   "license": "MIT",
   "license_class": "permissive",
   "language": "PHP / Symfony",
   "first_release": "2013",
   "maturity": "mature",
   "datastore": "SQLite by default in Docker; MySQL/MariaDB or PostgreSQL supported and preferred at scale",
   "default_ports": [
    80
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "proxy-only",
   "ram_idle_mb": 180,
   "ram_typical_mb": 350,
   "ops_load": 3,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "Pocket",
    "Instapaper",
    "Readwise Reader",
    "Safari Reading List"
   ]
  },
  {
   "slug": "watchtower",
   "name": "Watchtower",
   "category": "security",
   "url": "https://techdigest.site/apps/watchtower/",
   "project": "https://containrrr.dev/watchtower/",
   "repo": "https://github.com/containrrr/watchtower",
   "license": "Apache-2.0",
   "license_class": "permissive",
   "language": "Go",
   "first_release": "2015",
   "maturity": "legacy",
   "datastore": "none, it reads the Docker API",
   "default_ports": [],
   "container_count": 1,
   "arm64": true,
   "sso": "n/a",
   "ram_idle_mb": 15,
   "ram_typical_mb": 40,
   "ops_load": 2,
   "backup_shape": "File copy",
   "live_file_copy_safe": true,
   "replaces": [
    "Renovate",
    "Dependabot",
    "Portainer auto-update"
   ]
  },
  {
   "slug": "wazuh",
   "name": "Wazuh",
   "category": "security",
   "url": "https://techdigest.site/apps/wazuh/",
   "project": "https://wazuh.com/",
   "repo": "https://github.com/wazuh/wazuh",
   "license": "GPL-2.0",
   "license_class": "copyleft",
   "language": "C / C++ / Python / Java",
   "first_release": "2015",
   "maturity": "mature",
   "datastore": "Wazuh indexer, a fork of OpenSearch 2.x",
   "default_ports": [
    443,
    514,
    1514,
    1515,
    1517,
    9200,
    55000
   ],
   "container_count": 3,
   "arm64": true,
   "sso": "oidc-plugin",
   "ram_idle_mb": 6144,
   "ram_typical_mb": 8192,
   "ops_load": 5,
   "backup_shape": "Rebuildable index",
   "live_file_copy_safe": true,
   "replaces": [
    "Splunk Enterprise Security",
    "Elastic Security",
    "Microsoft Defender for Endpoint",
    "AlienVault OSSIM"
   ]
  },
  {
   "slug": "wg-easy",
   "name": "wg-easy",
   "category": "networking",
   "url": "https://techdigest.site/apps/wg-easy/",
   "project": "https://wg-easy.github.io/wg-easy/latest/",
   "repo": "https://github.com/wg-easy/wg-easy",
   "license": "AGPL-3.0-only",
   "license_class": "copyleft",
   "language": "TypeScript / Node.js (Nuxt)",
   "first_release": "2021",
   "maturity": "stable",
   "datastore": "SQLite since v15; v14 and earlier used a JSON file",
   "default_ports": [
    51820,
    51821
   ],
   "container_count": 1,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 90,
   "ram_typical_mb": 160,
   "ops_load": 2,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "OpenVPN Access Server",
    "Tailscale",
    "NordVPN Meshnet"
   ]
  },
  {
   "slug": "wiki-js",
   "name": "Wiki.js",
   "category": "knowledge",
   "url": "https://techdigest.site/apps/wiki-js/",
   "project": "https://js.wiki/",
   "repo": "https://github.com/requarks/wiki",
   "license": "AGPL-3.0",
   "license_class": "copyleft",
   "language": "JavaScript / Node.js (Vue frontend)",
   "first_release": "2017",
   "maturity": "legacy",
   "datastore": "PostgreSQL 9.5+ recommended (MySQL, MariaDB, MSSQL and SQLite still supported in 2.x)",
   "default_ports": [
    3000
   ],
   "container_count": 2,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 260,
   "ram_typical_mb": 500,
   "ops_load": 3,
   "backup_shape": "Postgres dump",
   "live_file_copy_safe": false,
   "replaces": [
    "Confluence",
    "MediaWiki",
    "Notion",
    "GitBook"
   ]
  },
  {
   "slug": "woodpecker-ci",
   "name": "Woodpecker CI",
   "category": "developer",
   "url": "https://techdigest.site/apps/woodpecker-ci/",
   "project": "https://woodpecker-ci.org",
   "repo": "https://github.com/woodpecker-ci/woodpecker",
   "license": "Apache-2.0",
   "license_class": "permissive",
   "language": "Go / Vue",
   "first_release": "2019",
   "maturity": "stable",
   "datastore": "SQLite (default), PostgreSQL or MySQL optional",
   "default_ports": [
    8000,
    9000
   ],
   "container_count": 2,
   "arm64": true,
   "sso": "oidc-native",
   "ram_idle_mb": 90,
   "ram_typical_mb": 250,
   "ops_load": 2,
   "backup_shape": "SQLite backup",
   "live_file_copy_safe": false,
   "replaces": [
    "CircleCI",
    "Travis CI",
    "Jenkins",
    "Drone"
   ]
  },
  {
   "slug": "zigbee2mqtt",
   "name": "Zigbee2MQTT",
   "category": "home-automation",
   "url": "https://techdigest.site/apps/zigbee2mqtt/",
   "project": "https://www.zigbee2mqtt.io",
   "repo": "https://github.com/Koenkk/zigbee2mqtt",
   "license": "GPL-3.0",
   "license_class": "copyleft",
   "language": "TypeScript / Node.js",
   "first_release": "2018",
   "maturity": "mature",
   "datastore": "Flat files in the data directory (database.db, a JSON lines file)",
   "default_ports": [
    8080
   ],
   "container_count": 2,
   "arm64": true,
   "sso": "none",
   "ram_idle_mb": 90,
   "ram_typical_mb": 220,
   "ops_load": 2,
   "backup_shape": "File copy",
   "live_file_copy_safe": true,
   "replaces": [
    "Philips Hue Bridge",
    "Aqara Hub",
    "SmartThings Hub",
    "IKEA Dirigera"
   ]
  }
 ]
}