Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ jobs:

- uses: actions/setup-node@v4
with:
node-version: 20
node-version: 24
cache: pnpm

- name: Install dependencies
Expand Down Expand Up @@ -52,7 +52,7 @@ jobs:

- uses: actions/setup-node@v4
with:
node-version: 20
node-version: 24
cache: pnpm

- uses: supabase/setup-cli@v1
Expand All @@ -62,6 +62,9 @@ jobs:
- name: Start local Supabase (db + REST only)
run: supabase start -x gotrue,realtime,storage-api,imgproxy,studio,edge-runtime,logflare,vector,supavisor,mailpit,postgres-meta

- name: Test atomic configuration replacement
run: docker exec -i supabase_db_stremlist psql -U postgres -v ON_ERROR_STOP=1 < supabase/tests/replace_user_config.sql

- name: Start local R2-compatible store
run: |
docker run --rm -d --name stremlist-e2e-r2 \
Expand Down Expand Up @@ -113,7 +116,7 @@ jobs:

- uses: actions/setup-node@v4
with:
node-version: 20
node-version: 24

- name: Compute version bump from Conventional Commits
id: bump
Expand Down
1 change: 1 addition & 0 deletions .node-version
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
24
55 changes: 42 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,36 @@ Stremlist is a Stremio addon that turns your IMDb watchlist into a Stremio catal

- Browse IMDb watchlist items in Stremio
- Supports one or multiple IMDb watchlists
- Supports sorting by title, year, rating, runtime, and random order
- Supports sorting by title, year, complete release date, rating, runtime, and random order
- Filter by genre or decade, or choose a sort directly from Stremio's Discover genre dropdown (one option at a time)
- Combine genre, decade, maximum runtime and minimum IMDb rating in each catalog configuration
- Search your configured lists from Stremio search
- Optional extra home catalogs: 90 min or less, Top rated, and Shuffle
- Optional Rating Poster Database (RPDB) poster support via API key
- Simple install flow through a hosted configuration UI
- Cache-first watchlist serving with periodic auto-refresh and a manual "Refresh now" control
- Lightweight backend with Supabase for user configuration and Cloudflare R2 for watchlist caching
- Monorepo architecture with Turborepo (`apps` + `packages`)

Reinstall an existing addon to load the new dropdown options. Selecting a genre
or decade preserves the configured sort; selecting a sort temporarily overrides
it. Saved filters always apply together, including to search and extra catalogs.
The dropdown adds one further filter or overrides the sort; None clears only
that temporary selection. Extra catalogs reuse the original list and cache.

Release Year sorts by the IMDb year; Release Date sorts by the complete date
returned by IMDb (which may differ from the original release year). Incomplete
dates sort last, without inventing a day or month. Refresh an older cache to
populate release dates. Date-added sorting uses IMDb list order. Shuffle stays
stable within a cache generation so scrolling does not repeat items. Popularity
is not offered: the tested IMDb meterRanking field reported an entitlement denial.

Apply `supabase/migrations/20260914230000_catalog_settings.sql` before deploying
this version. The new JSON column defaults to an empty configuration. Older
clients that omit these settings preserve them; sending an empty object clears
them. Reinstall after enabling/disabling extra catalogs or adding search support;
changing only saved filters does not require reinstalling.

## Monorepo Structure

This repository follows the Turborepo recommended structure:
Expand All @@ -41,7 +64,7 @@ This repository follows the Turborepo recommended structure:

### Prerequisites

- Node.js 20+
- Node.js 24+ for development with Portless (`.node-version`)
- pnpm 10+

### Install
Expand All @@ -52,23 +75,29 @@ pnpm install

### Run in Development

Run both apps:
Decrypt the backend environment first (see below), then run:

```bash
pnpm dev
pnpm dev # both apps through Portless
pnpm dev:tailnet # both apps; share the frontend over Tailscale HTTPS
pnpm dev:backend # backend only
pnpm dev:frontend # frontend only (requires a running backend)
pnpm exec portless list
```

Run only one app:

```bash
pnpm dev:backend
pnpm dev:frontend
```
Portless 0.15.6 is pinned as a dev dependency. In the main checkout, the
local names are `https://stremlist.localhost` and
`https://api.stremlist.localhost`. Linked worktrees receive a branch prefix;
use the printed URLs or `pnpm exec portless list` instead of hardcoding them.
A previously configured proxy port (such as 1355) appears in these URLs too.

Default local URLs:
For access from another tailnet device, open the **Tailscale URL** printed for
the frontend. The browser uses `/api` on that same origin, and Vite forwards
requests to the matching worktree's backend. Stremio install links and configure
redirects use that origin too. No machine-specific browser API URL is needed.

- Backend: `http://localhost:7001`
- Frontend: Vite default (`http://localhost:5173` unless overridden)
See [the Portless development guide](docs/portless-development.md) for first-run
setup, HTTPS, environment overrides, plain-port fallback, and cleanup.

### Decrypt environment files

Expand Down
11 changes: 9 additions & 2 deletions apps/backend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
}
},
"scripts": {
"dev": "tsx watch --env-file=.env src/dev.ts",
"dev": "portless",
"build": "tsx build.ts",
"lint": "eslint .",
"format": "prettier . --write",
Expand All @@ -21,7 +21,9 @@
"test": "vitest run --exclude '**/*.stress.test.ts'",
"test:stress": "vitest run src/services/__tests__/imdb-scraper.stress.test.ts",
"typecheck": "tsc --noEmit",
"cleanup:invalid-users": "tsx src/scripts/cleanup-invalid-users.ts"
"cleanup:invalid-users": "tsx src/scripts/cleanup-invalid-users.ts",
"dev:app": "tsx watch --env-file=.env src/dev.ts",
"dev:tailnet": "portless"
},
"dependencies": {
"@aws-sdk/client-s3": "^3.1118.0",
Expand All @@ -48,5 +50,10 @@
"tsx": "^4.7.1",
"typescript": "^5.8.3",
"vitest": "^4.0.18"
},
"portless": {
"name": "api.stremlist",
"script": "dev:app",
"proxy": true
}
}
Loading
Loading