Onboarderr
Self-hosted user onboarding site for Plex and Audiobookshelf server owners
Install / Use
/learn @secretlycarl/OnboarderrREADME
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.
[ Example Docker Setup Video ] ----- [ Example Mobile User Video ] ----- [ Docker Hub Repo ]



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 default10000 - Tweak mounts on
compose.yml, thendocker compose up -dand 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
- Default login attempt limit is 5 wrong in 15 min per IP
- 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
/serviceshas a new 2 column layout, and a new "jump to:" panel to quickly jump to your desired section- Improved and adaptive
/setup_completepage, 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
- This replaces the old method of having to edit
- 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!
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
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:
- Add volume mounts for each drive in your
compose.ymlunder thevolumes:section:
- Linux Example:
volumes: - .:/app - /mnt/e:/mnt/e - /mnt/f:/mnt/f - Windows Example:
volumes: - .:/app - E:\:/mnt/e - F:\:/mnt/f
- **Set the
DRIVESDuring 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:
- Setting
APP_PORTin yourempty.envfile - Updating the port mapping in
compose.yml - Updating the
EXPOSEdirective inDockerfile(optional, for manual docker runs)
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
Restarting the App
- After setup or changing settings, the app will automatically restart itself to apply changes
- Submission goes to
/setup_completewhere the status of settings changes and poster downloads will be monitored - When ready, it will redirect to login
- Submission goes to
- 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+Cthenpython app.pyagain (for manual/venv use)
Manual Startup
Create and activate a venv (conda or through system python), then:
pip
