Skip to content

secretlycarl/onboarderr

Repository files navigation

Onboarderr v2

Onboarderr is a customizable onboarding site for a host's Plex and (optional) Audiobookshelf servers. It includes user instructions, server highlights, and an admin dashboard.

New Features

[ Example Docker Setup Video ] ----- [ Example Mobile User Video ] ----- [ Docker Hub Repo ]

mainpage

Customization 1

Customization 2

More Screenshots

As someone who's never made a website before, I wanted to:

  • Learn about HTML, CSS, websites in general, and self-hosting
  • Improve on a few "new user setup" guides I've seen for Plex
  • Offer a more appealing way for friends to join my Plex
  • Give me something constructive to do while unemployed lol

Admittedly, most of the code was generated by AI (ChatGPT, Gemini, Cursor).

I handled the layout, all copywriting/instructions, collected and edited screenshots, made tons of tweaks to the CSS, and came up with this whole thing.

Huge thanks to @mon5termatt for making the first big PR, testing, and giving feedback for v2

Thanks to reddit user u/Jeffizzleforshizzle for intial testing of v1

New Features in v2.1

Quicker Setup

Setup is much easier now!

  • Set port with python changeport.py [PORT_NUMBER] if you don't want to use the default 10000
  • Tweak mounts on compose.yml, then docker compose up -d and set all initial settings on the site itself
  • Customize HTML content, CSS, whatever you'd like

Security Features

Added new security features:

  • Rate limiting on login and forms to prevent brute force attacks
    • Default login attempt limit is 5 wrong in 15 min per IP
      • 1hr lockout when limit is reached
    • Default form submission is 2 submissions each to Plex and ABS forms per user per hour
    • Customizable on setup
  • IP white/blacklisting - you can now block specific IPs or ranges, or whitelist only trusted ones
    • Whitelisting excludes from rate limiting. I put in 127.0.0.1 to disable it for me in testing
    • Blacklisting causes 24hr lockout whenever a page is loaded from the specified IP
  • Discord notifications on security events - get alerts for rate limits and other events

A new security_log.json is created to track the security events.

This is the start of my security improvements. Check the to-do issues to see what I'll be working on next.

Misc Frontend and Backend Tweaks

  • /services has a new 2 column layout, and a new "jump to:" panel to quickly jump to your desired section
  • Improved and adaptive /setup_complete page, no longer 15s wait every time. Adapts to library poster downloads.
  • Improved poster and info grabbing logic, smart poster refresh every 12hr and on app restart
  • Options to customize carousel order and hide certain plex carousels
  • Email fields on Plex and ABS request forms no longer accept duplicate emails
  • Added #settings-sections hashed links to /services
    • Used for new "jump to" menu
    • Used in plex and abs request discord notifs so you are redirected and jump to that section after admin login
  • Changed Plex onboarding "Requests" section logic to show generic text if no requesting services are configured
  • Added settings section for personal message at bottom of Plex Onboarding
    • This replaces the old method of having to edit section7.html
  • Changed Pulsarr body text to reflect new Pulsarr behavior
    • Worked with Pulsarr dev to fix certain Plex Mobile app notifs not working
    • Now users can receive per-ep notifications, no need to use Tautulli for that directly anymore
  • And more!

How to Update

Let me know of any bugs and other feedback :)

Features

  • Docker & UNRAID support (also Win/Mac/Linux)
  • Customizable branding
  • Setup instructions for Plex and Audiobookshelf users
  • User access request forms for Plex and ABS
  • Carousel previews and media lists pulled from your server
  • Discord notifications when users request access
  • Admin dashboard with tools and info
    • Links to other services
    • User request log
    • Invite Plex users
    • Add Audiobookshelf users
    • Storage bars
    • Change settings

To-Do List

Requirements

Docker or Python (3.10+)

Plex Media Server

Method of making your local server publicly accessible:

  • Tailscale w/ Tailscale Funnel if you're new to self-hosting. Simple and free.
  • I use Cloudflared now to handle a few local service URLs I want to make public.

Optional Requirements

Audiobookshelf Server and public URL to share with users

Pulsarr v0.5.1+ - Per-user content requests integrated w/ Sonarr & Radarr via Plex watchlist

  • Pulsarr is also able to push "movie/show/episode added" notifications through the Plex Mobile App via Tautulli notification agent.

Overseerr - User media requesting site

Jellyseerr - Overseerr fork

Depending if you have Pulsarr, Overseerr, Jellyseerr, or none, some body content (5. Requests on /onboarding) will change.

Tautulli - Required for Pulsarr notifications, useful in general

  • I use it if users want notifications for content added to non-movie/show libraries

Sonarr & Radarr - to grab the watchlisted content

Tokybook Downloader - On ABS page, I direct users to tokybook.com to search for books that I can grab easily with this program. There are other programs that have similar functions.

Discord - To serve security, access request, and other notifications from Onboarderr and Tautulli

First Time Setup

git clone https://github.com/secretlycarl/onboarderr

cd onboarderr

Docker Compose Startup (Recommended)

A compose.yml file is included for use with Docker Compose.

Before running docker compose up -d, see below

Mounting Drives for Storage Bars

To display storage bars for specific drives (e.g., E: and F: on Windows, or /mnt/e and /mnt/f on Linux), you must:

  1. Add volume mounts for each drive in your compose.yml under the volumes: section:
  • Linux Example:
    volumes:
      - .:/app
      - /mnt/e:/mnt/e
      - /mnt/f:/mnt/f
    
  • Windows Example:
    volumes:
      - .:/app
      - E:\:/mnt/e
      - F:\:/mnt/f
    
  1. **Set the DRIVES During setup after running the app to the mount points inside the container (e.g., /mnt/e,/mnt/f).

Note: On Windows, you may need to allow Docker Desktop access to your drives (Docker Desktop > Settings > Resources > File Sharing).

Port Used

It runs on port 10000 by default. You can change this using the included port configuration script:

python changeport.py 8080  # Change to port 8080
python changeport.py 9000  # Change to port 9000

This script will automatically update all necessary files (compose.yml, Dockerfile, empty.env).

Alternatively, you can manually change the port by:

  1. Setting APP_PORT in your empty.env file
  2. Updating the port mapping in compose.yml
  3. Updating the EXPOSE directive in Dockerfile (optional, for manual docker runs)

Go to Site Setup Instructions

Hosting on UNRAID

Note: I'm not familiar with UNRAID, but I believe this will get you up and running. Waiting on CA approval. Tell me about issues if you have any.

Once it's approved, you can install this app directly from the Unraid Community Applications plugin:

  • On your Unraid server, open the Apps tab

  • Search for Onboarderr

  • Click Install, and adjust any configuration options (ports, volumes, variables)

  • Click Apply to start the container

Note: For now, you can manually add it:

  • Navigate to the Apps page

  • Search for Onboarderr in the search bar. Nothing will come up at first.

  • Next to the search bar, a button titled DockerHub will pop up, select that and Onboarderr will appear.

  • Select and install it, and unraid will ask if you want to do any custom configuration.

To update the docker image:

docker pull secretlycarl/onboarderr:latest
docker run -d -p 10000:10000 secretlycarl/onboarderr:latest

Go to Site Setup Instructions

Restarting the App

  • After setup or changing settings, the app will automatically restart itself to apply changes
    • Submission goes to /setup_complete where the status of settings changes and poster downloads will be monitored
    • When ready, it will redirect to login
  • You do not need to manually restart the container after setup or settings changes
  • If you ever need to restart manually (e.g., after updating code), use:
    • docker restart onboarderr (for Docker)
    • CTRL+C then python app.py again (for manual/venv use)

Manual Startup

Create and activate a venv (conda or through system python), then:

pip install -r requirements.txt

python app.py
  • It runs on port 10000 by default (change it with changeport.py)
  • Go to http://127.0.0.1:10000 (or your configured port)

Setup Form

  • First run will bring you to /setup. Everything here can be changed afterwards from Settings on /services
  • The library descriptions you write are saved to library_notes.json, and displayed on the Plex onboarding page in section 1
  • After submission, the app will restart to apply the new .env, wait for poster downloads, then direct to /login
    • The poster and metadata download can take a while for large libraries
  • ADMIN_PASSWORD will take you to services page, but you can browse the others from the links at the top
  • SITE_PASSWORD will not allow access to admin page

Per-Host Tweaks

Most customization is done on setup and settings in the admin panel, but you may want to tweak some HTML contents or instructional images it comes with.

  • Delete the example placeholder submissions from plex_submissions.json and audiobookshelf_submissions.json from the appropriate requests section on /services

  • I have my Pulsarr instance set up to use the "First Season Rolling" Sonarr monitoring option, so my instructions for Pulsarr watchlist requesting reflect that. Change if you use a different monitoring option.

Sharing

When ready,

  • Activate your tailscale funnel, cloudflare tunnel, or bingle tube
  • Share the public URL with friends

Updates

Option 1: git pull will try to update the repo and notify you if there are any incompatible changes, like if your customizations will overlap with anything from the update

Option 2:

git stash	# temporarily saves your changes (html, css, etc)
git pull	# gets updates
git stash pop	# re-applies your changes on top

If you ever have trouble with an update, just make a new clean instance, copy/paste your previous .env, library_notes.json, any log files, and any custom files to the correct locations in the new one and it should bring everything you need to skip setup.

Keep copies of custom assets in another folder!

Debugging

There are debugging options to help with troubleshooting:

Server-Side Debugging

  • Enable Flask debugging: Set FLASK_DEBUG=1 in your .env file
  • Disable Flask debugging: Set FLASK_DEBUG=0 in your .env file
  • This controls Python server-side logging and error messages
  • On by default

Client-Side Debugging

  • Enable JavaScript debugging: Set JS_DEBUG=1 in your .env file
  • Disable JavaScript debugging: Set JS_DEBUG=0 in your .env file
  • This controls browser console logging (reduces performance when enabled)
  • Off by default

After changing these settings, restart the app

Thank You!

Thanks for your interest in my project! I hope you find it useful. If you want to make it better, please do! Fork, PR, make an issue :)

ko-fi.com/secretlycarl

Star History

Star History Chart