From 72e18471a78b0789c50b9618b89ac696bba4bc5d Mon Sep 17 00:00:00 2001 From: codevski <1435321+codevski@users.noreply.github.com> Date: Wed, 29 Apr 2026 13:25:23 +1000 Subject: [PATCH 1/5] Rename project to sleeparr MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change module path, package imports, and build artifacts to use "sleeparr". Update Dockerfile, docker-compose, entrypoint and .gitignore to reflect the new binary/image/name. Adjust frontend text, release URL, and package version. Migrate config and types fields (Stalk → Agent, stalks → runs, lastStalk → lastRun) and rename related job/status identifiers. Remove obsolete bruno collection files. --- .air.toml | 6 +- .env.example | 2 +- .gitignore | 2 +- Dockerfile | 6 +- README.md | 14 +- bruno/stalkarr/.gitignore | 1 - bruno/stalkarr/README.md | 24 --- bruno/stalkarr/auth/login.bru | 31 ---- bruno/stalkarr/auth/setup.bru | 22 --- bruno/stalkarr/bruno.json | 15 -- bruno/stalkarr/collection.bru | 0 bruno/stalkarr/environments/Local.bru | 4 - .../stalkarr/settings/add-sonarr-instance.bru | 27 ---- bruno/stalkarr/settings/get-settings.bru | 18 --- bruno/stalkarr/settings/get-version.bru | 19 --- bruno/stalkarr/settings/save-settings.bru | 28 ---- .../settings/test-sonarr-instance.bru | 15 -- bruno/stalkarr/sonarr/get-missing.bru | 19 --- bruno/stalkarr/sonarr/trigger-hunt.bru | 19 --- cmd/server/main.go | 22 +-- docker-compose.yml | 6 +- docker/entrypoint.sh | 16 +- frontend/index.html | 2 +- frontend/package.json | 4 +- frontend/src/components/Footer.tsx | 4 +- frontend/src/components/Layout.tsx | 2 +- frontend/src/pages/DashboardPage.tsx | 16 +- frontend/src/pages/LoginPage.tsx | 2 +- frontend/src/pages/SettingsPage.tsx | 56 ++++--- frontend/src/pages/SetupPage.tsx | 2 +- frontend/src/pages/SonarrPage.tsx | 36 ++--- frontend/src/pages/StatsPage.tsx | 12 +- frontend/src/types.ts | 4 +- go.mod | 2 +- internal/api/api_test.go | 2 +- internal/api/auth.go | 4 +- internal/api/router.go | 56 +++---- internal/api/settings.go | 14 +- internal/arr/sonarr_stalk.go | 61 -------- internal/config/config.go | 6 +- internal/jobs/cooldown.go | 20 +-- internal/jobs/stalker.go | 143 ------------------ internal/jobs/status.go | 2 +- internal/version/version.go | 2 +- 44 files changed, 159 insertions(+), 609 deletions(-) delete mode 100644 bruno/stalkarr/.gitignore delete mode 100644 bruno/stalkarr/README.md delete mode 100644 bruno/stalkarr/auth/login.bru delete mode 100644 bruno/stalkarr/auth/setup.bru delete mode 100644 bruno/stalkarr/bruno.json delete mode 100644 bruno/stalkarr/collection.bru delete mode 100644 bruno/stalkarr/environments/Local.bru delete mode 100644 bruno/stalkarr/settings/add-sonarr-instance.bru delete mode 100644 bruno/stalkarr/settings/get-settings.bru delete mode 100644 bruno/stalkarr/settings/get-version.bru delete mode 100644 bruno/stalkarr/settings/save-settings.bru delete mode 100644 bruno/stalkarr/settings/test-sonarr-instance.bru delete mode 100644 bruno/stalkarr/sonarr/get-missing.bru delete mode 100644 bruno/stalkarr/sonarr/trigger-hunt.bru delete mode 100644 internal/arr/sonarr_stalk.go delete mode 100644 internal/jobs/stalker.go diff --git a/.air.toml b/.air.toml index 14f15b8..60055d6 100644 --- a/.air.toml +++ b/.air.toml @@ -1,9 +1,9 @@ root = "." tmp_dir = "tmp" [build] - cmd = "go build -o ./tmp/stalkarr ./cmd/server" - bin = "./tmp/stalkarr" - full_bin = "DATA_DIR=./config ./tmp/stalkarr" + cmd = "go build -o ./tmp/sleeparr ./cmd/server" + bin = "./tmp/sleeparr" + full_bin = "DATA_DIR=./config ./tmp/sleeparr" delay = 1000 exclude_dir = ["frontend", "tmp", "data", "internal/static/dist"] include_ext = ["go"] diff --git a/.env.example b/.env.example index 95c03f2..b065889 100644 --- a/.env.example +++ b/.env.example @@ -1,5 +1,5 @@ # ----------------------------------------------- -# stalkarr — environment configuration +# sleeparr — environment configuration # ----------------------------------------------- # REQUIRED — generate with: openssl rand -hex 32 diff --git a/.gitignore b/.gitignore index 3a6b3bd..6522342 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ # Build output -/stalkarr +/sleeparr frontend/dist internal/static/dist/* !internal/static/dist/.gitkeep diff --git a/Dockerfile b/Dockerfile index f6d1612..ff3397a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -21,8 +21,8 @@ COPY --from=frontend-builder /app/frontend/dist ./internal/static/dist ARG VERSION=dev RUN CGO_ENABLED=0 GOOS=linux go build \ - -ldflags="-s -w -X stalkarr/internal/version.Version=${VERSION}" \ - -o stalkarr ./cmd/server + -ldflags="-s -w -X sleeparr/internal/version.Version=${VERSION}" \ + -o sleeparr ./cmd/server # ---- Stage 3: Final image ---- FROM alpine:3.19 @@ -30,7 +30,7 @@ FROM alpine:3.19 RUN apk add --no-cache su-exec tzdata WORKDIR /app -COPY --from=go-builder /app/stalkarr . +COPY --from=go-builder /app/sleeparr . COPY docker/entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh diff --git a/README.md b/README.md index 7da9b7a..c5e1013 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# STALKARR +# SLEEPARR > **Personal project in BETA!** I built this for my own homelab using the tools I use daily: [Zed](https://zed.dev), [Claude](https://claude.ai), and [OpenCode](https://opencode.ai). AI is part of my regular workflow the same way Stack Overflow and docs always have been. If you spot any issues, chuck in a ticket and I'll get to it. @@ -7,8 +7,8 @@ A self-hosted dashboard for searching missing media across your arr stack. > Currently supports **Sonarr**. Radarr support coming soon.

- stalkarr desktop - stalkarr mobile + sleeparr desktop + sleeparr mobile

## Quick start @@ -27,9 +27,9 @@ docker compose up -d ## docker-compose.yml ```yaml services: - stalkarr: - image: ghcr.io/codevski/stalkarr:latest - container_name: stalkarr + sleeparr: + image: ghcr.io/codevski/sleeparr:latest + container_name: sleeparr restart: unless-stopped ports: - "${PORT:-8080}:8080" @@ -82,7 +82,7 @@ air cd frontend && bun run dev ``` -See `bruno/stalkarr/` for the API collection. +See `bruno/sleeparr/` for the API collection. ## License diff --git a/bruno/stalkarr/.gitignore b/bruno/stalkarr/.gitignore deleted file mode 100644 index 02b73ba..0000000 --- a/bruno/stalkarr/.gitignore +++ /dev/null @@ -1 +0,0 @@ -environments/secrets.bru diff --git a/bruno/stalkarr/README.md b/bruno/stalkarr/README.md deleted file mode 100644 index bd05870..0000000 --- a/bruno/stalkarr/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# Stalkarr — Bruno Collection - -API tests for the Stalkarr backend. Uses [Bruno](https://www.usebruno.com/) a git-friendly API client. - -## Setup - -1. Install Bruno: https://www.usebruno.com/downloads -2. Open Bruno → **Open Collection** → select this `bruno/stalkarr` folder -3. Select the **Local** environment (top right dropdown) - -## First run order - -Run requests in this order when setting up a fresh instance: - -1. `auth/Setup User` - creates the admin account (once only) -2. `auth/Login` - logs in and **automatically saves the token** to the environment -3. `settings/Save Settings` - add your Sonarr URL + API key -4. `sonarr/Get Missing Episodes` - verify the Sonarr connection works - -## Notes - -- The **Login** request auto-saves the JWT token via a post-response script — no copy/pasting needed -- API keys are never returned in plaintext `Get Settings` only shows the last 4 chars -- The `Local` environment `token` variable is populated automatically on login diff --git a/bruno/stalkarr/auth/login.bru b/bruno/stalkarr/auth/login.bru deleted file mode 100644 index f68ed8d..0000000 --- a/bruno/stalkarr/auth/login.bru +++ /dev/null @@ -1,31 +0,0 @@ -meta { - name: Login - type: http - seq: 2 -} - -post { - url: {{base_url}}/api/login - body: json - auth: none -} - -body:json { - { - "username": "admin", - "password": "yourpassword" - } -} - -script:post-response { - const token = res.getBody()?.token; - if (token) { - bru.setEnvVar("token", token); - console.log("Token saved to environment"); - } -} - -docs { - Logs in and automatically saves the JWT token to the Local environment. - Run this before any protected endpoints. -} diff --git a/bruno/stalkarr/auth/setup.bru b/bruno/stalkarr/auth/setup.bru deleted file mode 100644 index 821167b..0000000 --- a/bruno/stalkarr/auth/setup.bru +++ /dev/null @@ -1,22 +0,0 @@ -meta { - name: Setup User - type: http - seq: 1 -} - -post { - url: {{base_url}}/api/setup - body: json - auth: none -} - -body:json { - { - "username": "admin", - "password": "yourpassword" - } -} - -docs { - Creates the initial admin user. Only works once subsequent calls are rejected. -} diff --git a/bruno/stalkarr/bruno.json b/bruno/stalkarr/bruno.json deleted file mode 100644 index c0d5434..0000000 --- a/bruno/stalkarr/bruno.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "version": "1", - "name": "Stalkarr", - "type": "collection", - "ignore": [ - "node_modules", - ".git" - ], - "size": 0.0018472671508789062, - "filesCount": 7, - "presets": { - "requestType": "http", - "requestUrl": "" - } -} \ No newline at end of file diff --git a/bruno/stalkarr/collection.bru b/bruno/stalkarr/collection.bru deleted file mode 100644 index e69de29..0000000 diff --git a/bruno/stalkarr/environments/Local.bru b/bruno/stalkarr/environments/Local.bru deleted file mode 100644 index 52793c7..0000000 --- a/bruno/stalkarr/environments/Local.bru +++ /dev/null @@ -1,4 +0,0 @@ -vars { - base_url: http://localhost:8080 - token: -} diff --git a/bruno/stalkarr/settings/add-sonarr-instance.bru b/bruno/stalkarr/settings/add-sonarr-instance.bru deleted file mode 100644 index f22433b..0000000 --- a/bruno/stalkarr/settings/add-sonarr-instance.bru +++ /dev/null @@ -1,27 +0,0 @@ -meta { - name: Add Sonarr Instance - type: http - seq: 3 -} - -post { - url: {{base_url}}/api/settings/sonarr - body: json - auth: bearer -} - -auth:bearer { - token: {{token}} -} - -body:json { - { - "name": "Sonarr", - "url": "http://localhost:8989", - "api_key": "your-api-key-here" - } -} - -docs { - Adds a new Sonarr instance. -} diff --git a/bruno/stalkarr/settings/get-settings.bru b/bruno/stalkarr/settings/get-settings.bru deleted file mode 100644 index e5a6af9..0000000 --- a/bruno/stalkarr/settings/get-settings.bru +++ /dev/null @@ -1,18 +0,0 @@ -meta { - name: Get Settings - type: http - seq: 1 -} - -get { - url: {{base_url}}/api/settings - auth: bearer -} - -auth:bearer { - token: {{token}} -} - -docs { - Returns current config. API keys are masked, only last 4 chars shown. -} diff --git a/bruno/stalkarr/settings/get-version.bru b/bruno/stalkarr/settings/get-version.bru deleted file mode 100644 index a733b29..0000000 --- a/bruno/stalkarr/settings/get-version.bru +++ /dev/null @@ -1,19 +0,0 @@ -meta { - name: Get Version - type: http - seq: 4 -} - -get { - url: {{base_url}}/api/version - auth: bearer -} - -auth:bearer { - token: {{token}} -} - -docs { - Returns current version and whether an update is available. - Update check is cached for 6 hours. -} diff --git a/bruno/stalkarr/settings/save-settings.bru b/bruno/stalkarr/settings/save-settings.bru deleted file mode 100644 index d3dc9b5..0000000 --- a/bruno/stalkarr/settings/save-settings.bru +++ /dev/null @@ -1,28 +0,0 @@ -meta { - name: Save Settings - type: http - seq: 2 -} - -post { - url: {{base_url}}/api/settings - body: json - auth: bearer -} - -auth:bearer { - token: {{token}} -} - -body:json { - { - "sonarr": { - "url": "http://localhost:8989", - "api_key": "your-sonarr-api-key-here" - } - } -} - -docs { - Leave api_key blank to keep the existing key without overwriting it. -} diff --git a/bruno/stalkarr/settings/test-sonarr-instance.bru b/bruno/stalkarr/settings/test-sonarr-instance.bru deleted file mode 100644 index 5ac1e52..0000000 --- a/bruno/stalkarr/settings/test-sonarr-instance.bru +++ /dev/null @@ -1,15 +0,0 @@ -meta { - name: Test Sonarr Instance - type: http - seq: 4 -} - -post { - url: {{base_url}}/api/settings/sonarr/sonarr-1/test - body: none - auth: bearer -} - -auth:bearer { - token: {{token}} -} diff --git a/bruno/stalkarr/sonarr/get-missing.bru b/bruno/stalkarr/sonarr/get-missing.bru deleted file mode 100644 index 3ca2284..0000000 --- a/bruno/stalkarr/sonarr/get-missing.bru +++ /dev/null @@ -1,19 +0,0 @@ -meta { - name: Get Missing Episodes - type: http - seq: 1 -} - -get { - url: {{base_url}}/api/sonarr/missing - auth: bearer -} - -auth:bearer { - token: {{token}} -} - -docs { - Returns missing episodes from Sonarr. - Requires Sonarr URL and API key saved in settings first. -} diff --git a/bruno/stalkarr/sonarr/trigger-hunt.bru b/bruno/stalkarr/sonarr/trigger-hunt.bru deleted file mode 100644 index 4517475..0000000 --- a/bruno/stalkarr/sonarr/trigger-hunt.bru +++ /dev/null @@ -1,19 +0,0 @@ -meta { - name: Trigger Stalk - type: http - seq: 2 -} - -post { - url: {{base_url}}/api/sonarr/stalk - body: none - auth: bearer -} - -auth:bearer { - token: {{token}} -} - -docs { - Triggers a stalk job. Currently a stub returns {"status": "stalking"}. -} diff --git a/cmd/server/main.go b/cmd/server/main.go index b9d26db..187dbe0 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -6,9 +6,9 @@ import ( "net/http" "os" "os/signal" - "stalkarr/internal/api" - "stalkarr/internal/config" - "stalkarr/internal/jobs" + "sleeparr/internal/api" + "sleeparr/internal/config" + "sleeparr/internal/jobs" "syscall" "time" @@ -29,12 +29,12 @@ func main() { log.Fatalf("failed to load config: %v", err) } - stalkerCtx, stalkerCancel := context.WithCancel(context.Background()) - defer stalkerCancel() - stalker := jobs.NewStalkerJob(config.Get) - go stalker.Start(stalkerCtx) + agentCtx, agentCancel := context.WithCancel(context.Background()) + defer agentCancel() + agent := jobs.NewAgentJob(config.Get) + go agent.Start(agentCtx) - r := api.NewRouter(stalker) + r := api.NewRouter(agent) r.SetTrustedProxies(nil) port := os.Getenv("PORT") @@ -48,7 +48,7 @@ func main() { } go func() { - log.Printf("Stalkarr running on :%s (data: %s)", port, dataDir) + log.Printf("Sleeparr running on :%s (data: %s)", port, dataDir) if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Fatalf("server error: %v", err) } @@ -62,9 +62,9 @@ func main() { ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() - stalkerCancel() + agentCancel() if err := srv.Shutdown(ctx); err != nil { log.Fatalf("forced shutdown: %v", err) } - log.Println("Stalkarr stopped") + log.Println("Sleeparr stopped") } diff --git a/docker-compose.yml b/docker-compose.yml index 3ec9fe4..98686a5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ services: - stalkarr: - image: ghcr.io/codevski/stalkarr:latest - container_name: stalkarr + sleeparr: + image: ghcr.io/codevski/sleeparr:latest + container_name: sleeparr restart: unless-stopped ports: - "${PORT:-8080}:8080" diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index 16218f0..208dce7 100644 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -6,23 +6,23 @@ PGID=${PGID:-1000} echo " ───────────────────────────────────── - stalkarr +sleeparr ───────────────────────────────────── User UID: ${PUID} User GID: ${PGID} ───────────────────────────────────── " -if ! getent group stalkarr > /dev/null 2>&1; then - addgroup -g "$PGID" stalkarr +if ! getent group sleeparr > /dev/null 2>&1; then + addgroup -g "$PGID" sleeparr fi -if ! getent passwd stalkarr > /dev/null 2>&1; then - adduser -D -u "$PUID" -G stalkarr stalkarr +if ! getent passwd sleeparr > /dev/null 2>&1; then + adduser -D -u "$PUID" -G sleeparr sleeparr fi mkdir -p /config -chown -R stalkarr:stalkarr /config -chown -R stalkarr:stalkarr /app +chown -R sleeparr:sleeparr /config +chown -R sleeparr:sleeparr /app -exec su-exec stalkarr:stalkarr /app/stalkarr +exec su-exec sleeparr:sleeparr /app/sleeparr diff --git a/frontend/index.html b/frontend/index.html index d967bed..19b2eb9 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -4,7 +4,7 @@ - stalkarr + sleeparr
diff --git a/frontend/package.json b/frontend/package.json index 87da994..5e56be3 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { - "name": "stalkarr", + "name": "sleeparr", "private": true, - "version": "0.0.1", + "version": "0.0.2", "type": "module", "scripts": { "dev": "vite", diff --git a/frontend/src/components/Footer.tsx b/frontend/src/components/Footer.tsx index c1b4234..d497d53 100644 --- a/frontend/src/components/Footer.tsx +++ b/frontend/src/components/Footer.tsx @@ -3,7 +3,7 @@ import { ExternalLink } from "lucide-react"; import api from "@/lib/api"; import type { VersionInfo } from "@/types"; -const RELEASES_URL = "https://github.com/codevski/stalkarr/releases/latest"; +const RELEASES_URL = "https://github.com/codevski/sleeparr/releases/latest"; export default function Footer() { const [version, setVersion] = useState(null); @@ -18,7 +18,7 @@ export default function Footer() { return (