Provider-scoped access codes
Every login gates on a code your provider issues — separate from the underlying service credentials. Revoke the code and the customer is locked out instantly, even if their stream line still authenticates upstream.
Provider-controlled access, deterministic parsing, dead-channel detection, and AI-assisted cleanup that never touches your data without your sign-off. The modern playlist platform built for operators who actually care about their feed.
Why PlaylistForge
Six things the legacy m3u tools don't give you, and we won't ship without.
Every login gates on a code your provider issues — separate from the underlying service credentials. Revoke the code and the customer is locked out instantly, even if their stream line still authenticates upstream.
Pure-Python M3U/M3U8 parser with line-level warnings. Every import becomes an immutable version with a SHA-256 stamp. Roll back any time.
Five deterministic detectors find duplicates, dead streams, blank names, quality-tag noise, and region-prefix clutter. AI suggestions ship in the same review queue — never auto-applied.
Generate, rotate, and revoke time-limited URLs that point at the latest active version. Per-token rate-limited; per-token usage analytics built in.
manage.py refresh_playlists re-fetches every
authorized account hourly, only writing a new version when
the upstream actually changed. Health checks ship as a
parallel command.
Provider access codes are stored as Django password hashes; Xtream credentials are Fernet-encrypted with a key you control. No plaintext, ever.
Deterministic cleanup detectors
Plaintext credentials at rest
Tests covering the gate behaviour
Distinct UIs: client, provider, staff
How it works
Your provider issues you a code. Enter it once; we hash it at rest and remember the authorization until they revoke it.
Enter your Xtream Codes username and password. We validate them upstream once, encrypt them at rest, and never expose them again.
We pull your playlist, parse it deterministically, and let you clean it up. Generate a private URL when you're happy.
FAQ
No. We Fernet-encrypt it at rest with a key sourced from
XTREAM_FIELD_KEY on the deployment. The plaintext
only exists in memory long enough to make the upstream
authentication call.
You're locked out of PlaylistForge AI immediately, even though your underlying service credentials still authenticate upstream. That's deliberate — it's the whole point of the provider-scoped gate. Your existing playlists stay in your account so you can re-redeem under another provider later.
Never. AI suggestions land in the same review queue as
deterministic detector findings, marked source=AI
and status=PENDING. Nothing changes on a channel
until you click Accept.
Per-token, per-IP sliding-window rate limiting (default 30 hits/minute, configurable per deployment). Throttled requests return HTTP 429 with a Retry-After header, don't bump the token's last-accessed timestamp, and don't pollute the audit log.
Yes. The repo ships a hardened systemd unit, a gunicorn config,
a Caddyfile snippet, and a release/rollback procedure under
deploy/ and docs/DEPLOYMENT.md.
No credit card. Self-host or use a hosted instance.