selfhost.directory

The index of self-hostable projects — ranked, categorized and served with live updates.
Own your data and stop giving it to big tech.

GitHub
Erin logo

Self-host Erin

v1.22.0

TikTok-style vertical feed for your own media

ReleaseOpen SourceMIT
Updated2 months ago
LanguageJavaScript
Setup difficultyEasy
Stars
364
Ports
443 (HTTPS (Caddy automatic HTTPS)), 80 (HTTP (behind proxy))
Docker
mosswill/erin
Install with Docker
Erin main feed view showing vertical swipe interface with video playbackErin feed with media metadata display showing channel, caption, and linkErin interface in fullscreen mode

What is Erin?

Erin is a self-hosted web application that presents your personal image and video collection in a TikTok-style vertical swipe interface. You organize media into folders to create playlists, and Erin serves them through a React frontend powered by Caddy, which handles HTTPS, authentication, and static file serving in a single container. Features include autoplay, keyboard and touch navigation, fullscreen mode, media masking, custom metadata via JSON sidecar files, optional custom CSS theming, and configurable scroll direction. Deployment is via Docker or Docker Compose with a mounted media directory. Authentication uses a Caddy-generated password hash. The project is MIT-licensed and actively maintained.

Should you self-host Erin?

Erin scores 49/100 on selfhost.directory (how scoring works) and ranks #36 of 54 in Media Streaming. It has 364 GitHub stars.

It shipped 10 stable releases in the past year. The latest, v1.22.0, came out on 15 August 2026. New versions land roughly every 1 days.

Setup is easy: most people get it running in one sitting. An official Docker image is available. It is MIT-licensed and written mostly in JavaScript.

Its closest alternative on selfhost.directory is Invidious (81/100, 25 801 stars). It scores higher overall, so compare the two before you pick. See Erin vs Invidious side by side.

Features

  • Automatic media naming
  • Autoplay
  • Configurable video start position
  • Custom CSS theming
  • Direct media sharing
  • Folder-level metadata inheritance
  • Horizontal and vertical scroll
  • HTTP and HTTPS support
  • Keyboard and touch navigation
  • Lazy Loading
  • Media masking
  • Media metadata via JSON sidecars
  • Password Protection
  • Playlists via folder structure
  • TikTok-style vertical swipe feed

Erin README

How to install Erin

Install Erin with Docker

Environment variables
PUBLIC_URL, AUTH_ENABLED, AUTH_SECRET, APP_TITLE, AUTOPLAY_ENABLED, IMAGE_DISPLAY_DURATION, START_MUTED, PROGRESS_BAR_POSITION, IGNORE_HIDDEN_PATHS, SCROLL_DIRECTION, USE_CUSTOM_SKIN, VIDEO_START_POSITION

Create a .env file

touch .env

Edit .env file ...

Option 1 : Run Erin attached to the terminal (useful for debugging)

docker run --env-file .env -p -v ./videos:/srv/videos:ro mosswill/erin

Option 2 : Run Erin as a daemon

docker run -d --env-file .env -p -v ./videos:/srv/videos:ro mosswill/erin

Requires a videos directory with media files. Remove quotes around AUTH_ENABLED and AUTH_SECRET when using --env-file.

How to configure Erin

  • APP_TITLEErin - TikTok feed for your own mediaThe custom title to display in the browser's tab. Can use [VIDEO_TITLE] placeholder.

    The custom title to display in the browser's tab. Can use [VIDEO_TITLE] placeholder.

  • AUTH_ENABLEDtrueWhether Basic Authentication should be enabled. Case sensitive.

    Whether Basic Authentication should be enabled. Case sensitive.

    values: true, false

  • AUTH_SECRETHash of `secure-password`The secure hash of the password used to protect your instance of Erin.

    The secure hash of the password used to protect your instance of Erin.

  • AUTOPLAY_ENABLEDfalseWhether autoplay should be enabled. Case sensitive.

    Whether autoplay should be enabled. Case sensitive.

    values: true, false

  • IGNORE_HIDDEN_PATHSfalseWhether all hidden files and directories (starting with a dot) should be ignored by Erin.

    Whether all hidden files and directories (starting with a dot) should be ignored by Erin.

    values: true, false

  • IMAGE_DISPLAY_DURATION5How many seconds an image remains on screen before its timeline restarts or autoplay advances the feed. Positive decimals supported.

    How many seconds an image remains on screen before its timeline restarts or autoplay advances the feed. Positive decimals supported.

  • PROGRESS_BAR_POSITIONbottomWhere the progress bar should be located on the screen. Case sensitive.

    Where the progress bar should be located on the screen. Case sensitive.

    values: bottom, top

  • PUBLIC_URLhttps://localhostThe public URL used to remotely access your instance of Erin. Include HTTP/HTTPS and port if not standard 80 or 443. No trailing slash.

    The public URL used to remotely access your instance of Erin. Include HTTP/HTTPS and port if not standard 80 or 443. No trailing slash.

  • SCROLL_DIRECTIONverticalThe scroll direction of your media feed.

    The scroll direction of your media feed.

    values: vertical, horizontal

  • START_MUTEDtrueWhether videos should start muted. Case sensitive.

    Whether videos should start muted. Case sensitive.

    values: true, false

  • USE_CUSTOM_SKINfalseWhether a custom skin should be loaded on startup.

    Whether a custom skin should be loaded on startup.

    values: true, false

  • VIDEO_START_POSITIONstartWhere videos start playing.

    Where videos start playing.

    values: start, middle, random

Erin releases & version history

More in Photo Management

Rate this project

Click to rate — no account needed.

0 comments

Posting as guest
Loading comments…