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
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 -d
and set all initial settings on the site itself - Customize HTML content, CSS, whatever you'd like
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.
/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
- 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 :)
- 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
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.
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
git clone https://github.com/secretlycarl/onboarderr
cd onboarderr
A compose.yml
file is included for use with Docker Compose.
Before running docker compose up -d
, see below
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.yml
under 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
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).
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_PORT
in yourempty.env
file - Updating the port mapping in
compose.yml
- Updating the
EXPOSE
directive inDockerfile
(optional, for manual docker runs)
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
- 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
- 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+C
thenpython app.py
again (for manual/venv use)
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 withchangeport.py
) - Go to
http://127.0.0.1:10000
(or your configured port)
- 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 topSITE_PASSWORD
will not allow access to admin page
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
andaudiobookshelf_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.
When ready,
- Activate your tailscale funnel, cloudflare tunnel, or bingle tube
- Share the public URL with friends
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!
There are debugging options to help with troubleshooting:
- 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
- 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
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 :)