AltFreeStack
Self-Hosting

The HomeLab Media & Personal Cloud Stack

Your photos, your files, your video streaming and your saved articles — all on your own server, without relying on Google Photos, Dropbox or Netflix for your own media collection.

Combined minimum RAM

~5.3GB

Estimated savings

Digital sovereignty for your photos, streaming and files

Overlapping tools

  • Alternatives to each other for Pocket: Linkwarden, wallabag. You may only need one of them.

Tools in this pack (5)

Immich

AI-powered photo and video backup, a self-hosted alternative to Google Photos.

Storage100% FOSS🔴 Full · ~2GB
docker-compose.yml
version: "3.9"
services:
  immich-server:
    image: ghcr.io/immich-app/immich-server:release
    restart: unless-stopped
    ports:
      - "2283:2283"
    environment:
      - DB_HOSTNAME=immich-db
      - DB_USERNAME=immich
      - DB_PASSWORD=change-me-db-password # REQUIRED: generate a random secret before first run
      - REDIS_HOSTNAME=immich-redis
    volumes:
      - immich_uploads:/usr/src/app/upload # CHANGE THIS to a real disk path with enough space for your photo library
    depends_on:
      - immich-db
      - immich-redis
  immich-db:
    image: tensorchord/pgvecto-rs:pg15-v0.2.0
    restart: unless-stopped
    environment:
      - POSTGRES_USER=immich
      - POSTGRES_PASSWORD=change-me-db-password # must match DB_PASSWORD above
      - POSTGRES_DB=immich
    volumes:
      - immich_pg_data:/var/lib/postgresql/data
  immich-redis:
    image: redis:7-alpine
    restart: unless-stopped
volumes:
  immich_uploads:
  immich_pg_data:
View Immich's full profile
Nextcloud

File cloud and collaboration, an alternative to Google Drive.

StorageOpen-Core🟡 Standard · ~1GB
docker-compose.yml
version: "3.9"
services:
  nextcloud:
    image: nextcloud:35.0.1
    restart: unless-stopped
    ports:
      - "8080:80"
    environment:
      - NEXTCLOUD_TRUSTED_DOMAINS=cloud.yourdomain.com # CHANGE THIS TO YOUR DOMAIN
      - MYSQL_HOST=nextcloud-db
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_PASSWORD=change-me-db-password # REQUIRED: generate a random secret before first run
    volumes:
      - nextcloud_data:/var/www/html
    depends_on:
      - nextcloud-db
  nextcloud-db:
    image: mariadb:11
    restart: unless-stopped
    environment:
      - MYSQL_ROOT_PASSWORD=change-me-root-password # REQUIRED: generate a random secret before first run
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_PASSWORD=change-me-db-password # must match MYSQL_PASSWORD above
    volumes:
      - nextcloud_db_data:/var/lib/mysql
volumes:
  nextcloud_data:
  nextcloud_db_data:
View Nextcloud's full profile
Jellyfin

Personal media streaming server, a free alternative to Plex.

Storage100% FOSS🟢 Lightweight · ~256MB
docker-compose.yml
services:
  jellyfin:
    image: jellyfin/jellyfin:12.1
    restart: unless-stopped
    ports:
      - "8096:8096"
    volumes:
      - jellyfin_config:/config
      - jellyfin_cache:/cache
      - /path/to/your/media:/media # point this at your media library folder
volumes:
  jellyfin_config:
  jellyfin_cache:
View Jellyfin's full profile
Linkwarden

Bookmark manager with page archiving, an alternative to Raindrop.io.

Productivity100% FOSS🟡 Standard · ~1GB
docker-compose.yml
services:
  linkwarden:
    image: ghcr.io/linkwarden/linkwarden:v2.16.3
    restart: unless-stopped
    ports:
      - "3000:3000"
    environment:
      NEXTAUTH_SECRET: change-me-super-secret # REQUIRED: generate a random secret before first run
      NEXTAUTH_URL: http://localhost:3000 # CHANGE THIS TO YOUR DOMAIN
      DATABASE_URL: "postgresql://linkwarden:change-me-postgres-password@linkwarden-db:5432/linkwarden" # must match POSTGRES_PASSWORD below
    volumes:
      - linkwarden_data:/data/data
    depends_on:
      - linkwarden-db
  linkwarden-db:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_USER: linkwarden
      POSTGRES_PASSWORD: change-me-postgres-password # REQUIRED: generate a random secret before first run
      POSTGRES_DB: linkwarden
    volumes:
      - linkwarden_pg_data:/var/lib/postgresql/data
volumes:
  linkwarden_data:
  linkwarden_pg_data:
View Linkwarden's full profile
wallabag

Save articles to read later offline, an alternative to Pocket.

Productivity100% FOSS🟡 Standard · ~1GB
Alternative to PocketMySQL / PostgreSQL / SQLite
docker-compose.yml
services:
  wallabag:
    image: wallabag/wallabag
    restart: unless-stopped
    ports:
      - "8080:80"
    environment:
      SYMFONY__ENV__DATABASE_DRIVER: pdo_mysql
      SYMFONY__ENV__DATABASE_HOST: wallabag-db
      SYMFONY__ENV__DATABASE_NAME: wallabag
      SYMFONY__ENV__DATABASE_USER: wallabag
      SYMFONY__ENV__DATABASE_PASSWORD: change-me-mysql-password # REQUIRED: generate a random secret before first run
      SYMFONY__ENV__DOMAIN_NAME: http://localhost:8080 # CHANGE THIS TO YOUR DOMAIN
      SYMFONY__ENV__SECRET: change-me-super-secret # REQUIRED: generate a random secret before first run
    depends_on:
      - wallabag-db
  wallabag-db:
    image: mysql:8
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: wallabag
      MYSQL_USER: wallabag
      MYSQL_PASSWORD: change-me-mysql-password # must match SYMFONY__ENV__DATABASE_PASSWORD above
      MYSQL_ROOT_PASSWORD: change-me-mysql-root-password # REQUIRED: generate a random secret before first run
    volumes:
      - wallabag_db_data:/var/lib/mysql
volumes:
  wallabag_db_data:
View wallabag's full profile