{{template "header" .}}

Super user

Admin

Payments, license keys, and site storage. Members and site managers never see this page. Owner credentials are not printed on login.

{{if .Error}}
{{.Error}}
{{end}} {{if .OK}}
{{.OK}}
{{end}}

Update this app

Now running v{{.Version}}. Cinema: upload a Cinema zip. On-demand / Web: upload the ondemand update zip. Templates, static files, VERSION, and the binary are replaced. Data and your S3 keys stay. The process then restarts.

Default look

Visitors start on this accent. They can still pick another under Theme. Cinema TVs (cookies often blocked) stay on this until they tap a swatch.

Blender open movies

Adds Blender Studio CC BY films (YouTube embeds). Trailers go in the Trailers category — they are not played before other titles.

{{.Stats.Videos}}Videos
{{.Stats.Users}}Accounts
{{.Stats.Live}}Live channels
{{.Stats.Shows}}Slideshows
{{.Stats.Store}}Storage
{{.Stats.Pending}}Pending
{{if .License.Pro}}Pro{{else}}Free{{end}}This instance
{{.Traffic.HitsDisp}}Hits 24h
{{.Traffic.Humans}}People
{{.Traffic.Bots}}Crawlers
{{.Traffic.Unique}}Unique
{{.Traffic.AvgDisp}}Avg response
{{.Traffic.P95Disp}}p95
{{.Traffic.Errors}}HTTP 4xx/5xx
{{.SEO.Score}}SEO score
{{.Vitals.LCP.Disp}}LCP p75
{{.Vitals.INP.Disp}}INP p75
{{.Vitals.CLS.Disp}}CLS p75

Open SEO & performance Sitemap robots.txt

Issue license keys

Capped so this cannot be abused: 10 keys per click, 25 per 24 hours (override with MINT_DAILY_CAP). TV buyers mint themselves — one key per TV object, max 3 TVs per avatar.

Ignored for Unlimited / Ultimate. Standard defaults +1 year, Premium +3 years.

This instance

{{.License.Reason}}

Activate a key here Storage Guide

Owner-only routes

Anyone else (demo, Pro, register) is sent to sign-in or home. Webhooks stay public so Stripe / PayPal / Coinbase can POST.

PathWhat it does
/adminThis dashboard
/admin/keysMint Pro / Unlimited keys
/admin/keys/fileDownload a .key file
/admin/revokeCancel a key (refund / abuse)
/admin/deleteRemove a library title
/admin/paySave Stripe, PayPal + Coinbase secrets
/admin/stripe-checkRun Stripe health check
/storageLocal / S3 / Storj site storage

Accounts

{{range .Users}} {{end}}
UserNameRole
{{.Username}}{{.Name}}{{if eq .Role "super"}}super{{else if eq .Role "admin"}}manager{{else}}member{{end}}

Stripe & payments

Paste your Stripe secret key. The app then opens Stripe Checkout for cards, Apple Pay, Google Pay, Link, and other fiat methods Stripe enables. Payment Links are only a fallback.

{{if .Health.Checked}} {{if .Health.OK}}
Stripe daily check {{.Health.Checked}}: platform {{.Health.Platform}} · account {{.Health.Account}}{{if .Health.LiveMode}} (live){{end}}
{{else}}
Stripe daily check {{.Health.Checked}}: {{.Health.Platform}} · {{.Health.Account}}{{if .Health.Error}} — {{.Health.Error}}{{end}}
{{end}}

Check Stripe now Runs automatically once a day.

{{else}}

Daily Stripe check starts with the app. Run now

{{end}}
  1. Open Stripe → Payment links
  2. New link: Deimos Pro monthly — $7 / month, recurring.
  3. New link: Deimos Pro yearly — $49 / year, recurring.
  4. New link: Deimos Lifetime — $129 once (not recurring).
  5. Copy each https://buy.stripe.com/… URL into the boxes and save.
{{if .Pay.MaskedSecret}}

Secret key on file: {{.Pay.MaskedSecret}}

{{end}} {{if .Pay.MaskedWhsec}}

Webhook secret on file: {{.Pay.MaskedWhsec}}

{{end}}

In Stripe Payment Link → After completion → Redirect to https://YOUR-DOMAIN/pay/thanks?session_id={CHECKOUT_SESSION_ID} · Webhook URL: https://YOUR-DOMAIN/pay/stripe events checkout.session.completed, invoice.paid, customer.subscription.deleted. Renewal mints a fresh key (32 days for monthly, 1 year for yearly). Cancelled subs revoke the Pro key. Add metadata email on the Stripe product if you want cancel to match the buyer.

Coinbase Commerce (crypto)

Best path: paste the Commerce API key. Pay with Coinbase then creates a live charge (BTC, ETH, USDC, …) and sends the buyer back here. Static checkout URLs still work as a fallback.

{{if .Pay.CoinbaseReady}}
Coinbase checkout is on. Test: Open crypto checkout
{{else}}
No Coinbase checkout yet — crypto pay is off until you paste a link.
{{end}}
  1. Open commerce.coinbase.com and sign in.
  2. Checkouts → New checkout: Deimos Pro $49.
  3. Another checkout: Deimos Lifetime $129.
  4. Copy each https://commerce.coinbase.com/checkout/… URL.
{{if .Pay.MaskedCoinbase}}

Commerce API key on file: {{.Pay.MaskedCoinbase}}

{{end}} {{if .Pay.MaskedCBHook}}

Webhook shared secret on file: {{.Pay.MaskedCBHook}}

{{end}}

Webhook URL: https://YOUR-DOMAIN/pay/coinbase · events charge:confirmed, charge:resolved. After pay, Coinbase should return to /pay/thanks?charge=CODE (set as the charge redirect; API charges already do this).

PayPal

Use the PayPal account you already have. Paste the REST Client ID and Secret from a Live app. Checkout then opens PayPal (balance, cards PayPal has on file). After pay, the key is minted on the thanks page — same as Stripe.

{{if .Pay.PayPalReady}}
PayPal checkout is on. Test: $49/year · $7/mo · Lifetime $129
{{else}}
No PayPal yet — paste Client ID and Secret below.
{{end}}
  1. Open developer.paypal.com → Apps & Credentials → Live
  2. Create app named Deimos.TV (or use an existing one). Leave it on Live.
  3. Copy Client ID and Secret into the boxes. Save.
  4. Optional webhook: https://YOUR-DOMAIN/pay/paypal · event PAYMENT.CAPTURE.COMPLETED. Return URL is set automatically.
{{if .Pay.MaskedPayPal}}

Secret on file: {{.Pay.MaskedPayPal}}

{{end}}

From the Live webhook you create at developer.paypal.com. Without it, keys still mint only after PayPal confirms the capture over HTTPS.

Fallback hosted buttons (optional). Only used if the API credentials are missing.

Monthly is a $7 PayPal checkout that mints 32 days. Yearly mints 1 year. Lifetime never expires. Buy again to renew. Return URL: /pay/paypal/return.

Issued keys

{{if .Keys}} {{range .Keys}} {{end}}
CustomerPlanExpiresFile
{{.Customer}}{{if .Note}}
{{.Note}}
{{end}}{{if .Revoked}}
Cancelled: {{.Reason}}
{{end}}
{{.Plan}} {{if .Expires}}{{.Expires}}{{else}}lifetime{{end}} {{if not .Revoked}} Download
{{else}} revoked {{end}}
{{else}}

No keys minted yet.

{{end}}

Public requests

Members’ uploads are private until they request public. Approve lists it. Reject keeps it private (does not delete).

{{range .Videos}} {{if eq .Status "pending"}} {{end}} {{end}}
TitleAccount
{{.Title}} {{.Owner}} · {{.Channel}}

Library

{{range .Videos}} {{if ne .Status "pending"}} {{end}} {{end}}
TitleChannelViews
{{.Title}} {{.Channel}} {{.Views}}
{{template "footer" .}}