diff --git a/README.md b/README.md
index e302604..d4ec3fc 100644
--- a/README.md
+++ b/README.md
@@ -57,21 +57,13 @@ history and a third, wildcard recommendation to expand your horizons.
## Configuration
-All secrets are passed as environment variables. `make setup` creates
-`.env.local` from `.env.example` automatically. Edit it to fill in your API
-keys before starting the app. Use `.env` for the production secret delivery.
+App configuration is largely kept in the SQLite database. The only env var you need to get the app working is the path to the SQLite database.
+
+The first time you run the app, there's a config procedure that will walk you through the setup.
| Variable | Description |
|---|---|
| `DATABASE_URL` | SQLite path β `file:./data/datenight.db` locally, `file:/app/data/datenight.db` in Docker |
-| `TMDB_API_KEY` | [TMDB API v3 key](https://developer.themoviedb.org/docs/getting-started) (free) |
-| `SEERR_URL` | Base URL of your Seerr instance, e.g. `http://seerr:5055` |
-| `SEERR_API_KEY` | Seerr API key (Settings β API Key) |
-| `PLEX_URL` | Base URL of your Plex server, e.g. `http://plex:32400` |
-| `PLEX_TOKEN` | [Plex authentication token](https://support.plex.tv/articles/204059436-finding-an-authentication-token-x-plex-token/) |
-| `USER1_NAME` | Display name for the first user (default: `User 1`) |
-| `USER2_NAME` | Display name for the second user (default: `User 2`) |
-| `ANTHROPIC_API_KEY` | [Anthropic API key](https://console.anthropic.com/) β required for the Recommendations feature; the rest of the app works without it |
## Running Locally
@@ -134,13 +126,13 @@ make help # full list of available commands
Streaming data hasn't synced yet. It runs automatically on movie add and every 12 hours thereafter, but a fresh install or a newly added subscription won't have data until the first sync completes. Click **π‘ Refresh Streaming** in the sidebar to trigger an immediate re-sync. Configure which services to track in Settings β Streaming.
**Movies show "Not Requested" and never download**
-Seerr integration is failing silently. Check that `SEERR_URL` and `SEERR_API_KEY` are correct and that the container can reach Seerr. The sync job runs every 5 minutes β check logs: `make docker-logs`.
+Seerr integration is failing silently. Check that the Seerr URL and Seerr API key are correct in the Configuration section of the application and that the container can reach Seerr. The sync job runs every 5 minutes β check logs: `make docker-logs`.
**Plex collection isn't updating**
-Check `PLEX_URL` and `PLEX_TOKEN`. The Plex token expires occasionally; get a fresh one from Settings β Troubleshooting β Get Token in the Plex UI. The collection syncs as part of the same 5-minute cron job as Seerr, or use the **π Sync Plex** button in the sidebar for an immediate update.
+Check the Plex URL and the Plex token. The Plex token expires occasionally; get a fresh one from Settings β Troubleshooting β Get Token in the Plex UI. The collection syncs as part of the same 5-minute cron job as Seerr, or use the **π Sync Plex** button in the sidebar for an immediate update.
**Add Movie shows an error for a valid URL**
-The `TMDB_API_KEY` is likely missing or wrong. Test it: `curl "https://api.themoviedb.org/3/movie/550?api_key=YOUR_KEY"` β should return JSON, not an auth error.
+The Movie Database API key is likely missing or wrong. Test it: `curl "https://api.themoviedb.org/3/movie/550?api_key=YOUR_KEY"` β should return JSON, not an auth error.
**The app starts but the database is empty after a restart**
The data volume isn't persisted. With the named volume (`datenight-data`) in `docker-compose.yml`, data survives restarts automatically. If you switched from a bind mount, the old data is still at the bind mount path.
@@ -153,7 +145,7 @@ make docker-shell # production β shell inside the running container
```
**Recommendations page shows an error or returns nothing useful**
-Make sure `ANTHROPIC_API_KEY` is set and valid. The feature works best after you've rated a few films together β the more you've agreed on, the sharper the recommendations.
+Make sure the Anthropoic API key is set and valid. Note, you cannot use a long lived OAuth key on your plan for this. Anthropic will insist you use an API key that's attached to pay-as-go credits. The feature works best after you've rated a few films together β the more you've agreed on, the sharper the recommendations.
**Container won't start / exits immediately**
Run `make docker-logs`. The most common cause is a missing environment variable or a database migration failure on first boot.
diff --git a/docs/superpowers/plans/2026-04-18-ui-ux-review.md b/docs/superpowers/plans/2026-04-18-ui-ux-review.md
deleted file mode 100644
index cd98ec2..0000000
--- a/docs/superpowers/plans/2026-04-18-ui-ux-review.md
+++ /dev/null
@@ -1,1360 +0,0 @@
-# UI/UX Review Implementation Plan
-
-> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
-
-**Goal:** Address 9 UI/UX review findings across two PRs β PR 1 fixes usability (high/medium priority), PR 2 fixes polish and accessibility (low priority).
-
-**Architecture:** All changes are purely presentational β no API routes, no Prisma schema changes, no new endpoints. Tests live in `tests/` and use `@testing-library/react` + Vitest + jsdom. The `makeMovie()` helper pattern from `tests/movie-card.test.tsx` is the established way to build Movie fixtures.
-
-**Tech Stack:** Next.js 14 Β· TypeScript Β· Tailwind CSS Β· Vitest Β· @testing-library/react
-
----
-
-## PR 1 β Usability Fixes (Fixes 1β5)
-
----
-
-### Task 1: Status pill color hierarchy (Fix 5)
-
-**Files:**
-- Create: `tests/movie-row.test.tsx`
-- Modify: `src/components/movie-row.tsx`
-
-- [ ] **Step 1: Write the failing tests**
-
-Create `tests/movie-row.test.tsx`:
-
-```tsx
-// tests/movie-row.test.tsx
-import { render, screen } from '@testing-library/react'
-import { describe, it, expect, vi } from 'vitest'
-import { MovieRow } from '@/components/movie-row'
-import type { Movie, User } from '@/types'
-
-vi.mock('next/image', () => ({
- default: ({ src, alt }: { src: string; alt: string }) => ,
-}))
-
-vi.stubGlobal('fetch', vi.fn())
-
-function makeMovie(overrides: Partial = {}): Movie {
- return {
- id: 1,
- title: 'Jeanne Dielman',
- year: 1975,
- runtime: 201,
- description: '',
- posterUrl: '',
- imdbId: 'tt0073198',
- tmdbId: 11650,
- criterionUrl: null,
- imdbUrl: null,
- sortOrder: 1,
- status: 'watchlist',
- seerrRequestId: null,
- seerrMediaId: null,
- seerrStatus: 'not_requested',
- watchedAt: null,
- createdAt: new Date().toISOString(),
- streamingLastChecked: new Date().toISOString(),
- streamingLink: null,
- ratings: [],
- streamingProviders: [],
- ...overrides,
- }
-}
-
-const defaultProps = {
- position: 1,
- seerrUrl: null,
- streamingProviders: [],
- streamingLink: null,
- onMarkWatched: vi.fn(),
- onForceDownload: vi.fn(),
- onRemove: vi.fn(),
-}
-
-describe('MovieRow status pill colors', () => {
- it('renders not_requested pill with stone classes', () => {
- render()
- const pill = screen.getByText('Not Requested')
- expect(pill).toHaveClass('bg-stone-100', 'text-stone-500', 'border-stone-200')
- })
-
- it('renders pending pill with indigo classes', () => {
- render()
- const pill = screen.getByText('Queued')
- expect(pill).toHaveClass('bg-indigo-50', 'text-indigo-600', 'border-indigo-200')
- })
-
- it('renders processing pill with amber classes', () => {
- render()
- const pill = screen.getByText('Downloading')
- expect(pill).toHaveClass('bg-amber-50', 'text-amber-600', 'border-amber-200')
- })
-
- it('renders available pill with green classes', () => {
- render()
- const pill = screen.getByText('Ready')
- expect(pill).toHaveClass('bg-green-50', 'text-green-700', 'border-green-200')
- })
-})
-```
-
-- [ ] **Step 2: Run tests to verify they fail**
-
-```bash
-cd /home/user/src/ianchesal/datenight && npm run test:run -- tests/movie-row.test.tsx
-```
-
-Expected: 4 FAIL β pills have wrong colour classes.
-
-- [ ] **Step 3: Replace seerrPillClass with a full map in movie-row.tsx**
-
-In `src/components/movie-row.tsx`, replace lines 50β53:
-
-```tsx
-// Remove this:
-const seerrPillClass =
- movie.seerrStatus === "available"
- ? "bg-amber-50 text-amber-700 border-amber-200"
- : "bg-stone-100 text-stone-500 border-stone-200";
-
-// Add this:
-const SEERR_PILL_CLASS: Record = {
- not_requested: "bg-stone-100 text-stone-500 border-stone-200",
- pending: "bg-indigo-50 text-indigo-600 border-indigo-200",
- processing: "bg-amber-50 text-amber-600 border-amber-200",
- available: "bg-green-50 text-green-700 border-green-200",
- deleted: "bg-stone-100 text-stone-500 border-stone-200",
-};
-const seerrPillClass = SEERR_PILL_CLASS[movie.seerrStatus] ?? "bg-stone-100 text-stone-500 border-stone-200";
-```
-
-- [ ] **Step 4: Run tests to verify they pass**
-
-```bash
-npm run test:run -- tests/movie-row.test.tsx
-```
-
-Expected: 4 PASS.
-
-- [ ] **Step 5: Commit**
-
-```bash
-git add tests/movie-row.test.tsx src/components/movie-row.tsx
-git commit -m "fix: add stepped colour system to Seerr status pills"
-```
-
----
-
-### Task 2: MovieRow layout restructure β pills into info section (Fix 1)
-
-**Files:**
-- Modify: `tests/movie-row.test.tsx`
-- Modify: `src/components/movie-row.tsx`
-
-- [ ] **Step 1: Add failing tests**
-
-Append to the `describe('MovieRow status pill colors')` block in `tests/movie-row.test.tsx`:
-
-```tsx
-describe('MovieRow layout', () => {
- it('renders streaming badge inside the info section (not actions column)', () => {
- render(
-
- )
- const infoSection = screen.getByText('Jeanne Dielman').closest('div')
- expect(infoSection).toContainElement(screen.getByText('Streaming'))
- })
-
- it('renders the Seerr status pill inside the info section', () => {
- render()
- const infoSection = screen.getByText('Jeanne Dielman').closest('div')
- expect(infoSection).toContainElement(screen.getByText('Queued'))
- })
-})
-```
-
-- [ ] **Step 2: Run tests to verify they fail**
-
-```bash
-npm run test:run -- tests/movie-row.test.tsx
-```
-
-Expected: 2 FAIL β pills are currently in the actions column, not the info div.
-
-- [ ] **Step 3: Restructure MovieRow JSX**
-
-Replace the entire return JSX in `src/components/movie-row.tsx` (from `
` through the closing `>`) with:
-
-```tsx
- return (
- <>
-