Fathom admin DEV MODE
Fathom Admin console

Sign in

Use your admin username and password.

or
Sign in with a one-time email link

DEV QUICK SIGN-IN

Bypasses the magic-link flow. Disabled in production.

Sign in as admin@local.test

Need access? Contact an existing administrator.

Settings

Values stored in DB override .env. Secrets are encrypted at rest with SETTINGS_KEY.

Content

Inventory of corpus, detailed companions, and audio coverage per course. Reflects the live filesystem on every load.

Audio narration

Generate, review, and approve per-lesson narration via ElevenLabs. Approved files are what the PWA serves.

Generate new audio

Voices

Generating audio

    ElevenLabs API key isn't set - generation requires it.

    SSML script
    
          

    Batch generate audio

    Scope

    Batch generation

      0 selected

      Inline illustrations

      Analyzes each lesson and proposes editorial still-life images at the spots where they'll do real psychological work — regulation, anchoring, pivot marking, or repair. Review prompts, pick a model, generate, approve. Approved images appear inline in the lesson on the next reader load.

      Loading…
      Batch generate images — pick a model below to fill every draft suggestion in one click.

      Users

      Export ▾
      Download CSV Download JSON
      EmailCreatedLast loginStatusActions

      Subscriptions

      Export ▾
      Download CSV Download JSON
      EmailStatusPeriod endStripe subActions

      Coupons

      User-redeemable codes typed at checkout. One code per redemption; percent / amount / free-period rules; optional plan + audience + window. Counter ticks on Stripe webhook confirmation.

      CodeNameKindValuePlanAudience UsedWindowStatusActions

      Discount campaigns

      Auto-apply rules — no code typed by the user. Match by audience + plan + time window; best discount wins. Useful for "first-month free for new signups" or "holiday sale".

      NameKindValuePlanAudience UsedWindowStatusActions

      Access codes & grants

      For subscribers who want no email-linked account. Provision a code + initial PIN, communicate them out-of-band (the PIN is shown once), and grant a subscription window. PINs lock for 15 min after 5 failed attempts.

      Active grants

      Access codePlanGrantedExpires PaymentAmountStatusActions

      Refund queue

      User-submitted refund requests. Approve, deny, or mark refunded — each action audits + emails the user. Idempotency-keyed so double-clicks won't duplicate emails or audit entries.

      RequestedEmailReasonStatusActions

      Course R&D

      Proposal → outline → corpus → review → approve → publish. The publish step writes content files and registers the course in catalog.json; the course goes live in /courses immediately.

      SlugTitleStatusUpdatedActions

      How the pipeline works
      1. Draft — create a proposal with slug, title, tagline, description, target segments.
      2. Outline — generate (or paste) the 6-volume / 30-lesson outline JSON via the AI orchestration pipeline.
      3. Drafting → drafted — attach the full corpus (lesson hooks, frames, stories, takeaways, quizzes, challenges) and the wisdom items.
      4. In review — editorial pass.
      5. Approved — passes review. Publish becomes available.
      6. Published — content files written, catalog updated. Live in /courses.
      7. Rejected — declined with a reason. Can be deleted or duplicated.

      Endpoints: POST /api/admin/course-proposals, PUT /api/admin/course-proposals/:id, POST /:id/approve, POST /:id/reject, POST /:id/publish.

      Generate detailed companion essays

      Each lesson gets a Fathom-quality companion essay (SCENE 1 → [Annotation] → SCENE 2 → [Annotation], 700-1100 words), generated with an iterative refine loop and safe-exit on quality.

      Course
      Lessons to generate
      Model
      Max iterations per lesson
      Estimated cost
      Estimated time

      The request runs synchronously — keep this tab open until it finishes. The coverage table refreshes automatically when generation completes.

      Detailed companion essays

      Per-lesson long-form essays (SCENE 1 → [Annotation] → SCENE 2 → [Annotation], 700-1100 words). Generated with an iterative refine loop — initial draft, then critique-and-rewrite passes until the quality score crosses the threshold or 5 iterations elapse. Safe-exit keeps the best version produced.

      CourseLessonsDetailedCoverageActions

      New course — paste a brief

      Describe the course in your own words — who it's for, what it covers, what makes it distinct. Don't worry about slug, segments, or wording. The AI extracts all that and creates a draft proposal you can refine.

      What the AI extracts
      • slug — lowercase kebab-case, derived from the title
      • title — 1-3 words preferred, brand voice
      • tagline — one observational line, ≤12 words
      • description — 2-3 sentences, who it's for and what it covers
      • segments — 2-5 ids from the existing taxonomy

      Uses OpenAI gpt-4o-mini (~$0.0005 per call). Configure the key under Settings → OpenAI.

      New coupon

      Provision an access code

      Creates an anonymous user. You will receive a fresh access code + initial PIN, which you transmit out-of-band (the PIN is shown once). You may optionally bundle the first paid subscription window.

      Initial grant

      Save these now — they will not be shown again

      Access code
      Initial PIN

      Transmit the access code and the PIN to the user via a separate channel (postcard, voice, vendor dashboard). The PIN can be changed on first login. The access code is permanent.

      Grant subscription window

      Choose an access-code user and a period. Use this for renewals or first-time activations of an existing code.

      Are you sure?

      Promote

      Generate catchy, subscribe-driving posts built from real course content, then schedule and publish per platform.

      Drafts

      Queue & schedule

      Monitor

      Connections

      Add tokens under Settings → Social to enable auto-publish. Unconnected platforms still generate + schedule; you copy/export and post manually.

      Newsletter subscribers

      Export ▾
      Download CSV Download JSON
      EmailSourceSubscribedStatus

      Audit log

      Export ▾
      Download CSV (filtered) Download JSON (filtered)
      WhenActorActionIPData

      Backup & export

      Download data and bundles. CSV/JSON for spreadsheets & analysis. Zip bundles for migration or off-site backup.

      Backup password

      Required before any backup download. The same password unlocks the encrypted file (AES-256-GCM, PBKDF2). It's stored as a salted hash - there is no recovery. Forgetting it means setting a new one and re-downloading.

      Status: checking…

      Full backup

      SQLite snapshot + content + audio + settings, in a single zip. Use this to migrate to another server or store off-site. The downloaded file is AES-256-GCM encrypted with your backup password - file extension .zip.enc. Decrypt with tools/dev/decrypt_backup.sh.

      ⚠ Plaintext secrets will be included in the encrypted file. The encryption protects them in transit and at rest; whoever has the password can read them.

      ⚠ Set a backup password above before downloading.

      Content bundle

      All lessons, wisdom encyclopedia, checklists, legal docs.

      Download content.zip

      Audio bundle

      All approved + candidate narration files plus manifest.

      Download audio.zip

      Settings (config)

      All admin-configured settings as JSON. Secrets redacted by default.

      Redacted JSON JSON with secrets

      Tabular exports

      Drop straight into Excel, Numbers, or a SQL import.

      Users CSV Users JSON Subs CSV Subs JSON Audit CSV (all) Audit JSON (all)