Itemized movies
Mini poster, movie title, Rotten Tomatoes critic score, and audience score.
A Mac-specific Docker Desktop package for installing, testing, scheduling, and safely operating TautWeekly for Plex without QNAP, Unraid, Windows BAT files, or host-installed PowerShell.
$ ./tautweekly.sh verify [OK] Docker Desktop connected [OK] Tautulli API connected [OK] Animated GIF assets valid [OK] Preview web assets served [OK] Six email states supported NEXT: ./tautweekly.sh preview-all No real Plex user email will be sent. $ |
Both archives contain the same Mac package. Choose based on how you prefer to extract it.
Best when downloading and extracting through Finder. Run the documented chmod command afterward.
Better at preserving Unix executable permissions when extracted from Terminal.
Keeping both as backups is fine, but extracting both into the same folder is unnecessary.
All runtime dependencies stay inside Docker. macOS only needs Docker Desktop and network access.
arm64 Macs are detected automatically.
x86_64 Macs use the same package.
The Docker engine and Compose must be running.
Use a provider port such as 587, not implicit SMTPS 465.
PowerShell 7, ImageMagick, Python, and the scheduler run entirely inside the Linux container.
The installer creates Mac-specific environment settings, starts the container, opens setup, and verifies the result.
Example: ~/Applications/TautWeekly.
chmod +x INSTALL-MAC.command mac-install.sh tautweekly.sh
./mac-install.sh
It detects Apple silicon or Intel, uses your macOS UID/GID, and binds previews to localhost.
Enter Tautulli, choose any users to exclude from weekly delivery, then finish SMTP, branding, and schedule values. The direct Plex token remains optional.
./tautweekly.sh verify ./tautweekly.sh list-users ./tautweekly.sh exclude-users ./tautweekly.sh preview-all ./tautweekly.sh send-test-all ./tautweekly.sh schedule-status
./tautweekly.sh schedule-enable
Inside the container, localhost points back to TautWeekly for Plex—not to macOS or Tautulli.
http://host.docker.internal:8181
http://tautulli:8181
http://media.example.test:8181
Use http://host.docker.internal:32400. The Plex token is optional and may be left blank.
Safe actions, TestEmail-only actions, and real-recipient actions are separated clearly.
| Command | Purpose | Risk |
|---|---|---|
verify | Checks config, Tautulli, assets, SMTP reachability, preview web root, and schedule syntax. | SAFE |
list-users | Lists users and recipient addresses exposed by Tautulli. | SAFE |
exclude-users | Revises stable user exclusions without rerunning SMTP or schedule setup. | CONFIG |
preview / preview-all | Creates one branch or all six HTML states. | NO EMAIL |
send-test / send-test-all | Sends one or six messages exclusively to TestEmail. | TESTEMAIL |
welcome | Sends a real welcome to the selected Plex user. | REAL USER |
send-all | Sends separate newsletters to all eligible users. | BULK SEND |
schedule-enable | Authorizes automatic weekly SendAll. | AUTOMATION |
backup / update | Backs up data or rebuilds the service while preserving data. | SYSTEM |
open-preview | Opens the local preview service in the default Mac browser. | SAFE |
Run ./tautweekly.sh exclude-users, select rows or ranges, press Enter to keep the current list, or type none to clear it. The roster contains private names and email addresses.
All states share the production renderer and actual MIME/CID test pipeline.
One-off onboarding without weekly stats.
WELCOMEONLYFirst-Friday onboarding replaces empty stats.
RECENTACCESS + ZEROFirst-Friday layout with populated personal stats.
RECENTACCESS + ACTIVITYNormal active-user weekly newsletter.
ACTIVITYZero activity after the initial warm-up period.
QUIET IN THIS SECTORZero activity during TautWeekly for Plex’s initial data window.
STATS ARE WARMING UPThe scheduler lives inside the container, so launchd is unnecessary—but the Mac still has to be awake.
Day, time, timezone, and grace window come from config and .env.
A sleeping or powered-off Mac cannot send.
The attempt is recorded before sending to suppress unsafe retries.
Docker Desktop should start when you sign in if this Mac is the permanent host.
A short interruption may still be handled after wake if the configured grace period remains open. Do not rely on this for long sleep periods.
The container is disposable. The project’s data folder carries configuration, state, output, and history.
./tautweekly.sh update./tautweekly.sh backup ./tautweekly.sh update ./tautweekly.sh repair-assets ./tautweekly.sh verify ./tautweekly.sh preview-all
The underlying data schema is compatible, so history and access state can move with you.
Avoid copying state while either scheduler or sender is active.
Preserve config, state, access-state, scheduler-state, assets, logs, and output.
Native Mac services normally change to host.docker.internal.
Run the full preview and TestEmail acceptance sequence.
Most failures are Docker startup, file permissions, host addressing, or SMTP settings.
docker info and ./tautweekly.sh status.chmod +x INSTALL-MAC.command mac-install.sh tautweekly.sh followed by ./mac-install.sh.host.docker.internal for Tautulli running natively on the Mac. Do not use 127.0.0.1 from inside the container../tautweekly.sh status, ./tautweekly.sh logs, and ./tautweekly.sh verify. The default URL is http://localhost:8787.The shortest safe path from extraction to automatic weekly delivery.
cd ~/Applications/TautWeekly chmod +x INSTALL-MAC.command mac-install.sh tautweekly.sh ./mac-install.sh ./tautweekly.sh verify ./tautweekly.sh list-users ./tautweekly.sh exclude-users ./tautweekly.sh preview-all ./tautweekly.sh send-test-all ./tautweekly.sh schedule-status ./tautweekly.sh open-preview # Enable only after all six TestEmail messages are approved: ./tautweekly.sh schedule-enable
Review the browser preview index and all six TestEmail messages on desktop and mobile before enabling the scheduler.
Light viewing weeks reveal more detail without making heavy viewing weeks excessively tall.
Mini poster, movie title, Rotten Tomatoes critic score, and audience score.
Mini show poster, show title, Sxx EPxx episode title, and IMDb score.
At four or more, the card returns to the large-number format to protect email length.
The user with the most qualifying watch time wins; total plays break an exact-time tie. Every scheduled weekly email shows the same anonymous movie-play, TV-play, and total-time aggregate. Only the winner’s card receives the gold border, larger trophy, and “YOU WON” treatment.
Trending ranks a media title and displays its server-wide play count once. Binge Champion ranks a person by qualifying watch time, but never reveals that person’s name, user ID, or watched titles.
The compact 1–3 movie recap now matches the rest of the newsletter’s movie hierarchy.
Each row includes a mini poster, title, genre, and Rotten Tomatoes critic and audience scores.
Show the first two genres and append “, and more” when additional genres exist.
When metadata has no genre, the rating line moves up automatically with no blank space.
This includes production and portable previews, individual tests, six-state test suites, scheduled weekly newsletters, and all applicable recipient states.
Exactly one watched movie or one streamed episode no longer becomes a scalar under strict mode.
MovieItems and EpisodeItems are initialized and assigned explicitly as arrays before the adaptive renderer checks their counts.
Retains a valid zero-length array.
Remains an array instead of being unwrapped into a scalar.
Continues to render the adaptive poster rows normally.