find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/player -name '*[...redacted 24 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui -name '*.kt'[...redacted 20 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/remote -name '*[...redacted 24 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/core -name '*.k[...redacted 22 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app -name '*.kt' | [...redacted 5 bytes]


find /home/rurouni/Unspooled/app/src/main/res -type f | wc -l


find /home/rurouni/Unspooled/app/src/test/java/com/unspooled/app -name '*.kt' 2>[...redacted 17 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui -maxdepth 1 [...redacted 14 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/cards -name [...redacted 26 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/components -[...redacted 31 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/focus -name [...redacted 26 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/navigation -[...redacted 31 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/screens -nam[...redacted 28 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/settings -na[...redacted 29 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/sidebar -nam[...redacted 28 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/theme -name [...redacted 26 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/audio -name [...redacted 26 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/util -name '[...redacted 25 bytes]


cd /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/screens && fin[...redacted 30 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/data -maxdepth [...redacted 16 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/data/addon -nam[...redacted 28 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/data/debrid -na[...redacted 29 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/data/local -nam[...redacted 28 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/data/network -n[...redacted 30 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/data/profile -n[...redacted 30 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/data/provider -[...redacted 31 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/data/scraper -n[...redacted 30 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/data/source -na[...redacted 29 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/data/subtitle -[...redacted 31 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/data/trakt -nam[...redacted 28 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/data/cache -nam[...redacted 28 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/domain -maxdept[...redacted 18 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/domain/model -n[...redacted 30 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/domain/usecase [...redacted 32 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/domain/playback[...redacted 33 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/domain/cloud -n[...redacted 30 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/domain/util -na[...redacted 29 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/domain/reposito[...redacted 35 bytes]


cd /home/rurouni/Unspooled && find . -maxdepth 3 -name '*.md' -not -path './.git[...redacted 62 bytes]


find /home/rurouni/Unspooled/.reference -type f | sort


find /home/rurouni/Unspooled/test-bench -type f | head -20


find /home/rurouni/Unspooled/worker -type f | head -20


find /home/rurouni/.hermes/cache/documents -name '*.md' -newer /home/rurouni/Uns[...redacted 30 bytes]


find /home/rurouni/.hermes -name '*.md' -maxdepth 3 | grep -i 'unspool\|blueprin[...redacted 19 bytes]


cd /home/rurouni/Unspooled && git log --oneline | wc -l


ls -la /home/rurouni/.hermes/plans/ 2>/dev/null | head -20


# Remove stale Hermes blueprint docs from cache
rm -f /home/rurouni/.hermes/cach[...redacted 501 bytes]


cd /home/rurouni/Unspooled && ./gradlew :app:assembleDebug :app:testDebugUnitTes[...redacted 17 bytes]


cd /home/rurouni/Unspooled && git add -A && git status --short


cd /home/rurouni/Unspooled && git commit -m "docs: clean handoff — PROJECT_STA[...redacted 675 bytes]


cd /home/rurouni/Unspooled && git push 2>&1


JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gradlew :app:clean :app:assembleD[...redacted 4 bytes]


find ~/Unspooled -maxdepth 2 -type f -name "*.md" -o -name "*.kt" -o -name "*.ya[...redacted 31 bytes]


find ~/Unspooled/app/src -type f \( -name "*Theme*" -o -name "*Color*" -o -name [...redacted 176 bytes]


find ~/Unspooled/app/src/main/java/com/unspooled/app/ui -type f -name "*.kt" | w[...redacted 86 bytes]


git diff -- app/src/main/java/com/unspooled/app/ui/components/topbar/DebridStrea[...redacted 452 bytes]


test -f app/build/outputs/apk/debug/app-debug.apk && du -h app/build/outputs/apk[...redacted 20 bytes]


git diff --stat && test -f app/build/outputs/apk/debug/app-debug.apk && du -h ap[...redacted 39 bytes]


git diff --stat && du -h app/build/outputs/apk/debug/app-debug.apk


printf 'refs:\n'; for d in /home/rurouni/projects/NuvioTV /home/rurouni/projects[...redacted 259 bytes]


python3 - <<'PY'
import urllib.request
urls=[
'https://developer.android.com/tra[...redacted 562 bytes]


JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gradlew :app:assembleDebug >/tmp/[...redacted 178 bytes]


git status --short && printf '\nbranch/remotes:\n' && git branch --show-current [...redacted 69 bytes]


git diff -- app/src/main/java/com/unspooled/app/ui/components/topbar/DebridStrea[...redacted 248 bytes]


git diff --stat && printf '\nchanged md:\n' && git diff -- README.md PROJECT_STA[...redacted 28 bytes]


printf 'banned scan:\n'; rg 'NuvioModernSidebar|HomeTopBar\(|TvLazyRow|focusMana[...redacted 102 bytes]


git status -sb && git add -A && git commit -m "docs: capture UI UX audit and foc[...redacted 17 bytes]


git push origin HEAD && git status -sb && git log -2 --oneline


set -e
printf '== git ==\n'; git status -sb
printf '\n== ports ==\n'; (ss -ltnp [...redacted 212 bytes]


set -e
printf '== health ==\n'
curl -fsS --max-time 10 http://127.0.0.1:3091/hea[...redacted 598 bytes]


printf '== config sanitized ==\n'; curl -fsS --max-time 10 http://127.0.0.1:3091[...redacted 158 bytes]


python3 - <<'PY'
from pathlib import Path
p=Path('.env')
if p.exists():
    for [...redacted 198 bytes]


set -e
printf '== Android build ==\n'
JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd[...redacted 642 bytes]


set -e
printf '== listeners/process ==\n'
ss -ltnp | grep ':3091' || true
printf[...redacted 168 bytes]


set -e
printf '== patched health ==\n'
curl -fsS --max-time 10 http://127.0.0.1:[...redacted 629 bytes]


python3 - <<'PY'
from pathlib import Path
for line in Path('.env').read_text().s[...redacted 267 bytes]


set -e
JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gradlew :app:assembleDebug[...redacted 440 bytes]


set -e
printf '== diff stat ==\n'; git diff --stat
printf '\n== backend live 309[...redacted 364 bytes]


set -e
printf '== docker containers 3091 ==\n'
docker ps --format '{{.ID}} {{.Im[...redacted 381 bytes]


docker exec nexstream-scraper sh -lc 'pwd; ls -la /app | sed -n "1,40p"; ls -la [...redacted 110 bytes]


set -e
for f in src/config.js src/cache.js src/index.js src/pipeline/orchestrato[...redacted 693 bytes]


docker ps -a --filter name=nexstream-scraper --format '{{.ID}} {{.Status}} {{.Na[...redacted 72 bytes]


docker exec -u root nexstream-scraper sh -lc 'chown nexstream:nexstream /app/src[...redacted 674 bytes]


set -e
docker update --restart=no nexstream-scraper >/dev/null || true
docker st[...redacted 942 bytes]


set -e
printf '== live stream ==\n'
curl -fsS --max-time 30 'http://127.0.0.1:30[...redacted 377 bytes]


sleep 5; docker ps --filter name=nexstream-scraper --format '{{.Names}} {{.Statu[...redacted 110 bytes]


git status --short && git diff --summary


git status --short && git branch --show-current && git diff --stat


git diff -- app/build.gradle.kts app/src/main/java/com/unspooled/app/domain/play[...redacted 459 bytes]


git add app/build.gradle.kts app/src/main/java/com/unspooled/app/domain/playback[...redacted 529 bytes]


git status --short && git rev-parse --short HEAD


JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gradlew :app:assembleDebug && git[...redacted 15 bytes]


git diff --stat && git add ARCHITECTURE.md PROJECT_STATE.md UNSPOOLED_SSTEM_BRIE[...redacted 949 bytes]


git status --short && git rev-parse --short HEAD && test -f app/build/outputs/ap[...redacted 72 bytes]


ls -d ~/NuvioTV ~/projects/NuvioTV ~/DebridStream ~/FudgeTV ~/Lumera 2>/dev/null[...redacted 49 bytes]


ls ~/projects/NuvioTV/app/src/main/java/com/nuvio/tv/data/ 2>/dev/null | sort; l[...redacted 84 bytes]


ls ~/Unspooled/services/addon-config-worker/ 2>/dev/null; cat ~/Unspooled/servic[...redacted 59 bytes]


ls ~/projects/NuvioTV/app/src/main/java/com/nuvio/tv/data/repository/ 2>/dev/nul[...redacted 94 bytes]


cat ~/Unspooled/services/addon-config-worker/src/index.ts 2>/dev/null | head -60


curl -s -o /dev/null -w '%{http_code}' 'https://unspooled-config-v3.tw24fr.worke[...redacted 142 bytes]


curl -s -o /dev/null -w '%{http_code}' 'https://aiometadata.elfhosted.com/stremi[...redacted 479 bytes]


cat ~/Unspooled/services/addon-config-worker/src/index.ts 2>/dev/null | head -15[...redacted 1 bytes]


grep -n 'ADDON_CONFIG_WORKER_URL\|ADDON_AUTH_WORKER_URL\|addonConfigWorkerUrl\|a[...redacted 63 bytes]


grep -n 'WORKER_BASE_URL\|ADDON_AUTH_WORKER_URL\|ADDON_CONFIG_WORKER_URL\|addon-[...redacted 105 bytes]


curl -s 'https://aiometadata.elfhosted.com/stremio/a4fc9e72-11b6-44f6-82bc-1239a[...redacted 257 bytes]


# Test the actual worker URLs
echo "=== Worker health checks ==="
curl -s -o /de[...redacted 866 bytes]


# Test addon URL session flow
curl -s -X POST 'https://unspooled-config-v3.tw24f[...redacted 117 bytes]


# Check build secrets
grep -n 'ADDON_CONFIG_WORKER_URL\|ADDON_AUTH_WORKER_URL' ~[...redacted 395 bytes]


cat ~/Unspooled/services/addon-config-worker/deploy.sh 2>/dev/null; echo "---"; [...redacted 235 bytes]


grep -n 'catalogBackendUrl\|CATALOG_BACKEND' ~/Unspooled/app/build.gradle.kts


JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gradlew :app:compileDebugKotlin 2[...redacted 13 bytes]


git diff --stat && git add -A && git commit -m "fix: repair QR addon worker URLs[...redacted 55 bytes]


# Test AIOMeta catalog data quality — compare a "Popular" row from AIOMeta vs [...redacted 1155 bytes]


JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gradlew :app:compileDebugKotlin 2[...redacted 14 bytes]


cd ~/Unspooled && echo "=== Banned-pattern scan ===" && echo "NuvioModernSidebar[...redacted 544 bytes]


JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gradlew :app:assembleDebug 2>&1 |[...redacted 74 bytes]


git diff --stat && git add -A && git commit -m "improve: catalog dedup, AIOMeta [...redacted 128 bytes]


grep -n 'ifBlank.*TMDB\|TMDB_API_KEY.*ifBlank\|tmdbApiKey.*ifBlank\|ifBlank.*tmd[...redacted 128 bytes]


grep -rn 'eyJ\|sk-\|api_key\|apiKey\|API_KEY.*=.*"[a-zA-Z0-9]\{20,\}"' ~/Unspool[...redacted 218 bytes]


echo "=== local.properties ==="; grep -c 'TRAKT_CLIENT_ID\|TRAKT_CLIENT_SECRET\|[...redacted 668 bytes]


cd ~/Unspooled && git check-ignore local.properties 2>/dev/null && echo "✓ git[...redacted 53 bytes]


grep -rn 'TRAKT_CLIENT_ID\|traktClientId\|BuildConfig.TRAKT' ~/Unspooled/app/src[...redacted 80 bytes]


JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gradlew :app:compileDebugKotlin 2[...redacted 163 bytes]


grep 'TRAKT_CLIENT_SECRET\|TRAKT_CLIENT_ID\|RD_CLIENT_ID\|REAL_DEBRID' ~/Unspool[...redacted 19 bytes]


git add -A && git commit -m "security: remove hardcoded secrets, empty-string fa[...redacted 67 bytes]


# Check scraper for hardcoded secrets in env/config templates
grep -rn 'RD_API_K[...redacted 249 bytes]


# Check scraper .env for actual values
echo "=== Scraper .env ==="
grep -E 'RD_A[...redacted 487 bytes]


JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gradlew :app:compileDebugKotlin 2[...redacted 13 bytes]


git add -A && git commit -m "fix: critical/high audit fixes — AIOStreams seedi[...redacted 151 bytes]


JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gradlew :app:compileDebugKotlin 2[...redacted 23 bytes]


JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gradlew :app:compileDebugKotlin 2[...redacted 3 bytes]


git add -A && git commit -m "fix: orchestrator double-ranking, scraper L2 cache [...redacted 44 bytes]


JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gradlew :app:assembleDebug 2>&1 |[...redacted 8 bytes]


git add -A && git commit -m "feat: addon catalogs in Movies/TV tabs, RowType imp[...redacted 233 bytes]


git add -A && git commit -m "docs: security notes for debrid tokens + trakt Data[...redacted 74 bytes]


# Check what Trakt needs the client ID for
grep -n 'TRAKT_CLIENT_ID\|traktClient[...redacted 597 bytes]


# Scan ALL Kotlin files for any remaining .ifBlank with long strings (potential [...redacted 760 bytes]


JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gradlew :app:compileDebugKotlin 2[...redacted 144 bytes]


find ~/Unspooled/app/src/main/java/com/unspooled/app/ui/screens/settings -name '[...redacted 24 bytes]


git add -A && git commit -m "fix: wire DebridSettingsViewModel to DebridService,[...redacted 70 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 44 bytes]


find /home/rurouni/.gradle/caches -path '*/media3-datasource-1.5*' -name '*.jar'[...redacted 22 bytes]


cd /home/rurouni/Unspooled && jar tf /home/rurouni/.gradle/caches/8.13/transform[...redacted 123 bytes]


cd /home/rurouni/Unspooled && javap -classpath /home/rurouni/.gradle/caches/8.13[...redacted 175 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 46 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 39 bytes]


curl -s "https://raw.githubusercontent.com/Stremio/stremio-addon-sdk/master/docs[...redacted 48 bytes]


curl -s "https://raw.githubusercontent.com/Stremio/stremio-addon-sdk/master/docs[...redacted 47 bytes]


curl -s "https://raw.githubusercontent.com/TheBeastLT/torrentio-scraper/master/a[...redacted 32 bytes]


curl -s "https://api.github.com/search/repositories?q=torrentio+stremio+addon&so[...redacted 166 bytes]


curl -s "https://raw.githubusercontent.com/iceblinker/aiostreams/main/addon.js" [...redacted 23 bytes]


curl -s "https://api.github.com/repos/iceblinker/aiostreams/contents/" 2>/dev/nu[...redacted 100 bytes]


curl -s "https://api.github.com/repos/iceblinker/aiostreams/contents/packages" 2[...redacted 108 bytes]


curl -s "https://raw.githubusercontent.com/iceblinker/aiostreams/main/packages/a[...redacted 47 bytes]


curl -sL "https://raw.githubusercontent.com/iceblinker/aiostreams/main/README.md[...redacted 79 bytes]


curl -sL "https://raw.githubusercontent.com/iceblinker/aiostreams/main/packages/[...redacted 44 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 43 bytes]


curl -s "https://raw.githubusercontent.com/Kotlin/kotlinx.coroutines/master/docs[...redacted 125 bytes]


curl -s "https://raw.githubusercontent.com/Kotlin/kotlinx.coroutines/master/kotl[...redacted 72 bytes]


grep -rn "encryptedsharedpreferences\|EncryptedSharedPreferences\|security-crypt[...redacted 150 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 44 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 46 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 38 bytes]


curl -s "https://developer.android.com/develop/ui/compose/touch-input/focus" 2>/[...redacted 46 bytes]


curl -s "https://developer.android.com/reference/kotlin/androidx/compose/ui/focu[...redacted 71 bytes]


curl -sL "https://developer.android.com/develop/ui/compose/touch-input/focus/cha[...redacted 73 bytes]


curl -sL "https://raw.githubusercontent.com/android/tv-samples/main/ReferenceApp[...redacted 181 bytes]


curl -sL "https://raw.githubusercontent.com/android/tv-samples/main/ReferenceApp[...redacted 95 bytes]


curl -sL "https://cs.android.com/androidx/platform/frameworks/support/+/androidx[...redacted 198 bytes]


curl -sL "https://raw.githubusercontent.com/androidx/tv/main/tv-material/samples[...redacted 162 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 39 bytes]


cd /home/rurouni/Unspooled && grep -rn "TvLazyRow\|HomeTopBar\|NuvioModernSideba[...redacted 175 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 50 bytes]


cd /home/rurouni/Unspooled && find app/src/main/java -name "*.kt" | xargs grep -[...redacted 93 bytes]


cd /home/rurouni/Unspooled && python3 -c "
import re

with open('app/src/main/ja[...redacted 1516 bytes]


cd /home/rurouni/Unspooled && python3 << 'PYEOF'
import re

# Fix UnspooledHomeS[...redacted 2979 bytes]


cd /home/rurouni/Unspooled && python3 << 'PYEOF'
with open("app/src/main/java/co[...redacted 3055 bytes]


cd /home/rurouni/Unspooled && grep -n "import.*PremiumContentCard" app/src/main/[...redacted 135 bytes]


cd /home/rurouni/Unspooled && sed -i 's|import com.unspooled.app.ui.cards.Premiu[...redacted 217 bytes]


cd /home/rurouni/Unspooled && grep -n '\bposterUrl\b\|\bbackdropUrl\b\|\bbackdro[...redacted 210 bytes]


cd /home/rurouni/Unspooled && python3 << 'PYEOF'
from pathlib import Path

# Cou[...redacted 1692 bytes]


cd /home/rurouni/Unspooled && python3 << 'PYEOF'
import re

# Count native TMDB [...redacted 1022 bytes]


ls -lh /home/rurouni/Unspooled/app/build/outputs/apk/debug/app-debug.apk && grep[...redacted 108 bytes]


grep -n "companion object\|MAX_CATALOG_CONCURRENCY" /home/rurouni/Unspooled/app/[...redacted 68 bytes]


grep -n "companion object\|MAX_CATALOG_CONCURRENCY" /home/rurouni/Unspooled/app/[...redacted 70 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app -name "BlurTran[...redacted 32 bytes]


cat /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/util/BlurTran[...redacted 13 bytes]


head -20 /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/componen[...redacted 24 bytes]


grep -n "AsyncImage\|ImageRequest\|crossfade" /home/rurouni/Unspooled/app/src/ma[...redacted 72 bytes]


find /home/rurouni/Unspooled/app -name "NetflixHeroSection.kt" -o -name "HeroCar[...redacted 21 bytes]


grep -n "LocalContext" /home/rurouni/Unspooled/app/src/main/java/com/unspooled/a[...redacted 48 bytes]


grep -n "AsyncImage\|ImageRequest\|crossfade" /home/rurouni/Unspooled/app/src/ma[...redacted 69 bytes]


grep -n "import.*Precision" /home/rurouni/Unspooled/app/src/main/java/com/unspoo[...redacted 51 bytes]


grep -n "ImageRequest\|crossfade\|AsyncImage" /home/rurouni/Unspooled/app/src/ma[...redacted 56 bytes]


grep -n "import.*Precision" /home/rurouni/Unspooled/app/src/main/java/com/unspoo[...redacted 38 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 44 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 39 bytes]


ls -lh /home/rurouni/Unspooled/app/build/outputs/apk/debug/app-debug.apk && stri[...redacted 124 bytes]


cd /home/rurouni/Unspooled && grep -rn "moveFocus\|TvLazyRow\|HomeTopBar\|NuvioM[...redacted 180 bytes]


cd /home/rurouni/Unspooled && grep -rn "verticalScroll\|rememberScrollState\|Laz[...redacted 133 bytes]


cat -n /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/screens/se[...redacted 24 bytes]


grep -n "verticalScroll\|LazyColumn\|LazyVerticalGrid" /home/rurouni/Unspooled/a[...redacted 737 bytes]


grep -n "rememberScrollState\|verticalScroll" /home/rurouni/Unspooled/app/src/ma[...redacted 63 bytes]


head -60 /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/screens/[...redacted 26 bytes]


grep -n "verticalScroll\|LazyColumn\|LazyVerticalGrid\|rememberScrollState" /hom[...redacted 89 bytes]


sed -n '230,250p' /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui[...redacted 31 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 38 bytes]


echo "=== build.gradle.kts NEXSTREAM_SCRAPER_URL ==="
grep -n -A3 -B3 "NEXSTREAM[...redacted 691 bytes]


grep -n -A15 "private fun normalizeUrl\|fun normalizeUrl" /home/rurouni/Unspoole[...redacted 74 bytes]


echo "=== All 192.168.1.50 references (with and without port 3091) ==="
grep -rn[...redacted 471 bytes]


grep -n -A30 "fun refreshAllSystemManifests\|fun seedSystemAddons\|fun initializ[...redacted 142 bytes]


find /home/rurouni/Unspooled/app/src -name "UnifiedAddonStore*" -type f 2>/dev/n[...redacted 3 bytes]


grep -n "refreshAllSystemManifests\|nexstream\|NEXSTREAM\|manifestUrl" /home/rur[...redacted 94 bytes]


sed -n '224,260p' /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/da[...redacted 29 bytes]


grep -n -A30 "fun ensureSeeded\|nexstream" /home/rurouni/Unspooled/app/src/main/[...redacted 77 bytes]


grep -n -A20 "private fun seedToEntity" /home/rurouni/Unspooled/app/src/main/jav[...redacted 51 bytes]


grep -n -B5 -A15 "class SeedDef\|data class SeedDef\|val baseUrl" /home/rurouni/[...redacted 89 bytes]


find /home/rurouni/Unspooled/app/src -name "ManifestUpdateManager*" -type f 2>/d[...redacted 7 bytes]


cat -n /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/data/addon/Ma[...redacted 22 bytes]


grep -n -A30 "fun loadManifest" /home/rurouni/Unspooled/app/src/main/java/com/un[...redacted 48 bytes]


grep -n -A30 "fun loadAllSystemAddonInstances" /home/rurouni/Unspooled/app/src/m[...redacted 56 bytes]


grep -n -A40 "private fun configureAIOStreams\\(\\|private suspend fun configure[...redacted 112 bytes]


grep -n "configureAIOStreams\|buildAIOStreams" /home/rurouni/Unspooled/app/src/m[...redacted 56 bytes]


grep -n "getManifest\|fun getManifest\|interface.*AddonApi\|interface.*StremioAp[...redacted 110 bytes]


grep -n -B10 -A15 "api.getManifest(manifestUrlFor" /home/rurouni/Unspooled/app/s[...redacted 67 bytes]


grep -n -A30 "private.*fun runCatchingWithTimeout\|fun runCatchingWithTimeout" /[...redacted 95 bytes]


grep -n "runCatchingWithTimeout" /home/rurouni/Unspooled/app/src/main/java/com/u[...redacted 49 bytes]


sed -n '433,475p' /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/da[...redacted 34 bytes]


sed -n '1,30p' /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/data/[...redacted 31 bytes]


sed -n '25,45p' /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/doma[...redacted 32 bytes]


head -15 /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/data/addon/[...redacted 450 bytes]


find /home/rurouni/Unspooled/app/src -name "network_security_config*" -type f 2>[...redacted 173 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 44 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 120 bytes]


grep -n "fun update\|fun setHealth\|fun upsert" /home/rurouni/Unspooled/app/src/[...redacted 65 bytes]


grep -n "updateManifest\|updateHealth\|@Query.*UPDATE.*health" /home/rurouni/Uns[...redacted 69 bytes]


sed -n '81,100p' /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/dat[...redacted 23 bytes]


sed -n '50,80p' /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/data[...redacted 22 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 43 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 38 bytes]


ls -lh /home/rurouni/Unspooled/app/build/outputs/apk/debug/app-debug.apk && stri[...redacted 124 bytes]


sed -n '19,40p' /home/rurouni/Unspooled/app/build.gradle.kts


cd /home/rurouni/Unspooled && git log --all --oneline --follow -20 -- app/build.[...redacted 546 bytes]


cd /home/rurouni/Unspooled && git log --all -p --follow -S "nexstream_scraper" -[...redacted 93 bytes]


cd /home/rurouni/Unspooled && git log --all -p --follow -S "nexstream_scraper" -[...redacted 162 bytes]


echo "=== Searching for http://192.168 (without port) ==="
grep -rn '"http://192[...redacted 949 bytes]


echo "=== Check if previous session changes are still in place ==="

echo "1. ru[...redacted 1435 bytes]


echo "=== SystemAddonUpdateWorker ==="
find /home/rurouni/Unspooled/app/src -nam[...redacted 939 bytes]


cat /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/data/addon/Syste[...redacted 21 bytes]


head -150 /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/data/addon[...redacted 22 bytes]


grep -n "checkHealth\|cleartext\|BLOCKED\|UnknownService\|manifestUrl" /home/rur[...redacted 94 bytes]


sed -n '313,340p' /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/da[...redacted 34 bytes]


sed -n '275,305p' /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/da[...redacted 30 bytes]


sed -n '85,98p' /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/s[...redacted 38 bytes]


sed -n '75,95p' /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/s[...redacted 38 bytes]


grep -n "companion object\|DEFAULT_TIMEOUT_MS" /home/rurouni/Unspooled/app/src/m[...redacted 73 bytes]


sed -n '35,48p' /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/data[...redacted 32 bytes]


sed -n '320,350p' /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/da[...redacted 34 bytes]


grep -n "^class\|^}\|companion object" /home/rurouni/Unspooled/app/src/main/java[...redacted 55 bytes]


sed -n '75,100p' /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/dat[...redacted 33 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 43 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 38 bytes]


echo "=== 1. NexStream Scraper health check ==="
curl -s http://192.168.1.50:309[...redacted 664 bytes]


echo "=== APK fix verification ==="
echo "1. BuildConfig NEXSTREAM_SCRAPER_URL:"[...redacted 948 bytes]


echo "=== Final network_security_config (all domains) ==="
grep -n "<domain" /ho[...redacted 830 bytes]


echo "=== UnspooledHomeScreen: savedScrollPosition LazyListState (line ~208) ===[...redacted 521 bytes]


echo "=== Need total item count for clamping ==="
sed -n '208,225p' /home/ruroun[...redacted 615 bytes]


echo "=== NuvioButtons.kt SourceFilterRow (lines 44-86) ==="
sed -n '44,86p' /ho[...redacted 280 bytes]


grep -rn "GlassSourceFilterRow\|entryFocusRequester.*override\|focusRequester.*i[...redacted 118 bytes]


sed -n '40,72p' /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/c[...redacted 39 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 44 bytes]


stat /home/rurouni/Unspooled/app/build/outputs/apk/debug/app-debug.apk 2>&1 | he[...redacted 5 bytes]


cd /home/rurouni/Unspooled && git log --oneline -10


docker ps --filter name=nexstream --format '{{.Names}} {{.Status}} {{.Ports}}' 2[...redacted 3 bytes]


cd /home/rurouni/Unspooled && git status --short


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 39 bytes]


ls -lh /home/rurouni/Unspooled/app/build/outputs/apk/debug/app-debug.apk && cd /[...redacted 46 bytes]


cd /home/rurouni/Unspooled && git add -A && git diff --cached --stat


cd /home/rurouni/Unspooled && git commit -m "fix: comprehensive crash/stability [...redacted 2768 bytes]


cd /home/rurouni/Unspooled && git branch --show-current && git log --oneline -5 [...redacted 51 bytes]


cd /home/rurouni/Unspooled && git add PROJECT_STATE.md ARCHITECTURE.md && git co[...redacted 193 bytes]


find /etc/nginx -maxdepth 3 -type f 2>/dev/null | head -200 && echo '---' && fin[...redacted 190 bytes]


ps -ao pid,user,comm,args | grep -E 'cloudflared|flared|tunnel|caddy|nginx|hapro[...redacted 26 bytes]


find /root /home -maxdepth 4 \( -iname 'cloudflared*' -o -path '*/.cloudflared/*[...redacted 70 bytes]


which cloudflared || echo 'missing'; cloudflared --version 2>/dev/null || true


grep -n "import urllib2\|import urllib.request\|import urlopen\|import requests"[...redacted 184 bytes]


host 192.168.1.50 2>/dev/null || true; host debian-ai 2>/dev/null || true; host [...redacted 76 bytes]


curl -k -sS -D /tmp/ns-hdr.out -o /tmp/ns-manifest.json https://192.168.1.50:309[...redacted 43 bytes]


mkdir -p /etc/ssl/nexstream-scraper && mkcert -cert-file /etc/ssl/nexstream-scra[...redacted 113 bytes]


mkdir -p /etc/ssl/nexstream-scraper && chmod 755 /etc/ssl/nexstream-scraper


mkcert -cert-file ~/.local/share/nexstream-scraper/fullchain.pem -key-file ~/.lo[...redacted 163 bytes]


pwd && mkdir -p /home/rurouni/.local/share/nexstream-ssl && ls -ld /home/rurouni[...redacted 27 bytes]


mkcert -cert-file /home/rurouni/.local/share/nexstream-ssl/fullchain.pem -key-fi[...redacted 92 bytes]


openssl s_client -connect 192.168.1.50:443 -servername 192.168.1.50 </dev/null 2[...redacted 27 bytes]


ls -l /etc/nginx/sites-available /etc/nginx/sites-enabled


ss -tulpn | grep -E ':443|:8099|:3091'; echo '---'; ls -l /etc/nginx/sites-avail[...redacted 169 bytes]


which tailscale && tailscale status 2>/dev/null | head -40 || true; echo '---'; [...redacted 133 bytes]


sudo openssl req -x509 -nodes -newkey rsa:2048 -keyout /etc/ssl/private/nexstrea[...redacted 246 bytes]


cd ~/Unspooled/services/nexstream-scraper && ( [ -f /home/rurouni/.local/share/n[...redacted 210 bytes]


sudo tailscale funnel reset && sudo tailscale funnel 3091


tailscale funnel --bg 3091 && tailscale funnel status


curl -sS -D /tmp/manifest-hdr.out -o /tmp/manifest-body.out -w '%{http_code}\n' [...redacted 49 bytes]


which adb && adb devices 2>&1 | tail -10


adb devices -l; echo '---'; ls ~/Unspooled/app/build/outputs/apk/debug/app-debug[...redacted 24 bytes]


adb kill-server; sleep 2; adb start-server; adb devices -l; sleep 5; adb devices[...redacted 3 bytes]


adb tcpip 5555 2>&1 || true; adb connect 192.168.1.50:5555 2>&1 || true; adb dev[...redacted 7 bytes]


ls -l ~/Unspooled/app/src/main/java/com/unspooled/app/ui/screens/home/UnifiedChr[...redacted 527 bytes]


grep -n -r 'haze\|Haze' ~/Unspooled/app/build.gradle.kts


find ~/.gradle -path '*/dev.chrisbanes.haze*haze-android*' -name '*.jar' -o -nam[...redacted 31 bytes]


find /home/rurouni/.gradle -name '*haze*' 2>/dev/null | head -20; find /home/rur[...redacted 65 bytes]


jar tf /home/rurouni/.gradle/caches/8.13/transforms/e40762245109d4e86792b43c70df[...redacted 95 bytes]


javap -c /home/rurouni/.gradle/caches/8.13/transforms/11978681ce7e74e01dc80a51f2[...redacted 252 bytes]


jar tf /home/rurouni/.gradle/caches/8.13/transforms/11978681ce7e74e01dc80a51f2d0[...redacted 375 bytes]


mkdir -p /tmp/haze-api-classes 2>/dev/null; cd /tmp/haze-api-classes && jar xf /[...redacted 380 bytes]


cd /tmp/haze-api-classes && java -XX:+CrashOnOutOfMemoryError -Xmx32m -jar /home[...redacted 230 bytes]


jar tf /home/rurouni/.gradle/caches/8.13/transforms/11978681ce7e74e01dc80a51f2d0[...redacted 90 bytes]


JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gradlew :app:compileDebugKotlin 2[...redacted 27 bytes]


ls -d /home/rurouni/"Repos to copy"/NuvioTV/ 2>/dev/null && echo "EXISTS" || ech[...redacted 113 bytes]


JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gradlew :app:assembleDebug 2>&1 |[...redacted 9 bytes]


find /home/rurouni/Unspooled -maxdepth 4 -type f \( -name '*.kt' -o -name '*.kts[...redacted 33 bytes]


rg -n "UnspooledHomeScreen|HtmlHomeScreen|HtmlCatalogRow|HtmlInspiredTvScaffold|[...redacted 75 bytes]


git status --short && git log --oneline -8 --decorate --stat


git diff --stat && git diff --name-status


test -f app/build/outputs/apk/debug/app-debug.apk && stat -c 'APK %n size=%s mod[...redacted 73 bytes]


printf 'Tracked diff summary:\n'; git diff --shortstat; printf '\nUntracked file[...redacted 63 bytes]


git status --short && git diff --stat && git log --oneline -12


python3 - <<'PY'
from pathlib import Path
root=Path('/home/rurouni/Unspooled')
f[...redacted 423 bytes]


git -C /home/rurouni/Unspooled status --short


JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gradlew :app:compileDebugKotlin 2[...redacted 14 bytes]


JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gradlew :app:compileDebugKotlin 2[...redacted 15 bytes]


git diff --stat && git diff -- app/src/main/java/com/unspooled/app/MainActivity.[...redacted 454 bytes]


git status --short && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gradlew :ap[...redacted 37 bytes]


JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gradlew :app:assembleDebug 2>&1 |[...redacted 10 bytes]


stat -c '%n %s bytes %y' app/build/outputs/apk/debug/app-debug.apk && JAVA_HOME=[...redacted 84 bytes]


git diff -- app/src/test/java/com/unspooled/app/data/addon/SystemAddonCatalogTes[...redacted 165 bytes]


JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gradlew :app:testDebugUnitTest --[...redacted 160 bytes]


JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gradlew :app:testDebugUnitTest :a[...redacted 103 bytes]


git status --short && git branch --show-current


pwd && python3 - <<'PY'
import os
for root, dirs, files in os.walk('/home/ruroun[...redacted 342 bytes]


python3 - <<'PY'
import os
root='/home/rurouni/Unspooled'
for dirpath, dirs, fil[...redacted 307 bytes]


python3 - <<'PY'
from pathlib import Path
for p in ['README.md','ARCHITECTURE.md[...redacted 551 bytes]


python3 - <<'PY'
import urllib.request, re
urls = [
'https://developer.android.c[...redacted 2295 bytes]


python3 - <<'PY'
try:
 import bs4; print('bs4 ok')
except Exception as e: print([...redacted 5 bytes]


python3 - <<'PY'
import urllib.request,re,html
u='https://developer.android.com/[...redacted 537 bytes]


python3 - <<'PY'
import urllib.request,re,html,textwrap
urls=[
'https://develope[...redacted 2748 bytes]


python3 - <<'PY'
from pathlib import Path
root=Path('/home/rurouni/Unspooled/app[...redacted 839 bytes]


python3 - <<'PY'
import urllib.request,re,html,time,textwrap
urls=['https://deve[...redacted 1413 bytes]


python3 - <<'PY'
import urllib.request,json
urls=['https://maven.google.com/web/[...redacted 352 bytes]


python3 - <<'PY'
from pathlib import Path
for p in [Path('/home/rurouni/Unspoole[...redacted 361 bytes]


python3 - <<'PY'
import urllib.request,re,html,textwrap
u='https://developer.and[...redacted 553 bytes]


python3 - <<'PY'
from pathlib import Path
for rel in ['app/src/main/java/com/uns[...redacted 778 bytes]


python3 - <<'PY'
import urllib.request,re,html,textwrap
for u in ['https://devel[...redacted 623 bytes]


python3 - <<'PY'
import urllib.request,re,html,textwrap
urls=['https://developer[...redacted 693 bytes]


python3 - <<'PY'
from pathlib import Path
root=Path('/home/rurouni/Repos to copy[...redacted 551 bytes]


python3 - <<'PY'
from pathlib import Path
root=Path('/home/rurouni/Repos to copy[...redacted 473 bytes]


rm -rf \
  app/src/main/java/com/unspooled/app/ui/html \
  app/src/main/java/com[...redacted 1455 bytes]


rm -f app/src/main/java/com/unspooled/app/ui/settings/PremiumSettingsHub.kt app/[...redacted 64 bytes]


mv app/src/main/java/com/unspooled/app/ui/screens/search/NetflixSearchScreen.kt [...redacted 155 bytes]


mv app/src/main/java/com/unspooled/app/ui/components/netflix/SidebarRouting.kt a[...redacted 238 bytes]


JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gradlew :app:testDebugUnitTest :a[...redacted 16 bytes]


python3 - <<'PY'
import glob, xml.etree.ElementTree as ET
cases=fail=err=skip=0
[...redacted 407 bytes]


git add -A && git commit -m "refactor: unify TV UI focus baseline

- remove dead[...redacted 464 bytes]


git add PROJECT_STATE.md && git commit --amend --no-edit


git add PROJECT_STATE.md && git commit --amend --no-edit && git log -1 --oneline[...redacted 22 bytes]


git status --short && git log -1 --stat --oneline --summary | head -40 && stat -[...redacted 77 bytes]


curl -s "https://developer.android.com/reference/kotlin/androidx/compose/ui/focu[...redacted 230 bytes]


curl -s "https://raw.githubusercontent.com/android/tv-samples/main/TvMaterialCat[...redacted 230 bytes]


cd /home/rurouni/Unspooled && ls -la app/src/main/java/com/unspooled/app/ui/scre[...redacted 214 bytes]


wc -l /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/screens/pla[...redacted 218 bytes]


cat /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/screens/playe[...redacted 26 bytes]


sed -n '1,150p' /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/s[...redacted 31 bytes]


sed -n '200,350p' /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui[...redacted 33 bytes]


grep -n "FocusRequester\|focusRequester\|focusProperties\|focusable\|FocusLinks\[...redacted 108 bytes]


grep -rl "NuvioSubtitlePanel\|NuvioAudioPanel\|NuvioSourceSidePanel\|NuvioEpisod[...redacted 103 bytes]


grep -n "FocusRequester\|focusRequester\|focusProperties\|focusable\|FocusLinks\[...redacted 253 bytes]


wc -l /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/screens/sea[...redacted 323 bytes]


echo "=== SearchScreen Focus Audit ===" && grep -n "FocusRequester\|focusRequest[...redacted 678 bytes]


cat /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/screens/playe[...redacted 25 bytes]


sed -n '210,300p' /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui[...redacted 33 bytes]


sed -n '380,560p' /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui[...redacted 33 bytes]


sed -n '319,340p' /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui[...redacted 33 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 44 bytes]


cat /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/screens/searc[...redacted 17 bytes]


cat /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/screens/setti[...redacted 21 bytes]


grep -n "FocusRequester\|focusRequester\|focusProperties" /home/rurouni/Unspoole[...redacted 102 bytes]


grep -rn "SettingsRailButton" /home/rurouni/Unspooled/app/src/main/java/com/unsp[...redacted 50 bytes]


grep -n -A30 "fun SettingsRailButton" /home/rurouni/Unspooled/app/src/main/java/[...redacted 61 bytes]


cat /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/components/Ca[...redacted 21 bytes]


grep -n "FocusRequester\|focusRequester\|focusProperties\|focusGroup\|focusResto[...redacted 127 bytes]


grep -n "FocusRequester\|focusRequester\|focusProperties\|focusGroup\|focusResto[...redacted 136 bytes]


sed -n '70,95p' /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/c[...redacted 32 bytes]


sed -n '1,50p' /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/co[...redacted 36 bytes]


grep -n "focusProperties\|FocusLinks\|links\.\|focusRequester" /home/rurouni/Uns[...redacted 84 bytes]


grep -n -A3 "Card(" /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/[...redacted 86 bytes]


sed -n '224,270p' /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui[...redacted 41 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 46 bytes]


grep -n "class\|val\|fun" /home/rurouni/Unspooled/app/src/main/java/com/unspoole[...redacted 209 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 43 bytes]


mkdir -p /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/feedback[...redacted 152 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 39 bytes]


stat -c '%s bytes %y' /home/rurouni/Unspooled/app/build/outputs/apk/debug/app-de[...redacted 7 bytes]


cd /home/rurouni/Unspooled && echo "=== BANNED PATTERNS ===" && grep -rn "moveFo[...redacted 497 bytes]


cd /home/rurouni/Unspooled && git add -A && git diff --cached --stat && echo "--[...redacted 12 bytes]


cd /home/rurouni/Unspooled && git commit -m "feat: wire player panel focus graph[...redacted 1060 bytes]


cd /home/rurouni/Unspooled && find . -name "*.md" -not -path "*/build/*" -not -p[...redacted 372 bytes]


for f in ARCHITECTURE.md HTML_TV_ARCHITECTURE_MIGRATION_PLAN.md PROJECT_STATE.md[...redacted 156 bytes]


cd /home/rurouni/Unspooled && cat ARCHITECTURE.md


cd /home/rurouni/Unspooled && rm -v UI_AUDIT.md UNSPOOLED_SSTEM_BRIEF.md UNSPOOL[...redacted 107 bytes]


cd /home/rurouni/Unspooled && echo "=== BANNED PATTERNS ===" && grep -rn "moveFo[...redacted 507 bytes]


cd /home/rurouni/Unspooled && git add -A && git commit -m "chore: compress archi[...redacted 693 bytes]


cd /home/rurouni/Unspooled && git log --oneline -15


cd /home/rurouni/Unspooled && git branch -a


cd /home/rurouni/Unspooled && find app/src -name '*.kt' | wc -l && echo "---" &&[...redacted 405 bytes]


cd /home/rurouni/Unspooled && git log --oneline -1 && echo "---" && git log --on[...redacted 82 bytes]


cd /home/rurouni/Unspooled && find app/src -name '*.kt' | wc -l


cd /home/rurouni/Unspooled && find app/src -name '*.kt' -path '*/ui/*' | wc -l &[...redacted 218 bytes]


cd /home/rurouni/Unspooled && find app/src -name '*NavigationRail*' -o -name '*C[...redacted 156 bytes]


cd /home/rurouni/Unspooled && grep -r "moveFocus\|FocusRequester.Default\|TvLazy[...redacted 133 bytes]


cd /home/rurouni/Unspooled && grep -n "moveFocus\|FocusRequester.Default\|TvLazy[...redacted 156 bytes]


cd /home/rurouni/Unspooled && grep -n "moveFocus\|FocusRequester.Default\|TvLazy[...redacted 296 bytes]


cd /home/rurouni/Unspooled && find app/src/main/java/com/unspooled/app/player -n[...redacted 17 bytes]


cd /home/rurouni/Unspooled && grep -rn "FocusRequester.Default" app/src --includ[...redacted 8 bytes]


cd /home/rurouni/Unspooled && find app/src/main/java/com/unspooled/app/player -n[...redacted 114 bytes]


cd /home/rurouni/Unspooled && find app/src/main/java/com/unspooled/app/domain -n[...redacted 17 bytes]


cd /home/rurouni/Unspooled && grep -rn "FocusRequester.Default\b" app/src --incl[...redacted 10 bytes]


cd /home/rurouni/Unspooled && grep -rn "focusManager\.moveFocus" app/src --inclu[...redacted 9 bytes]


cd /home/rurouni/Unspooled && find app/src -name '*NavigationRail*' -o -name '*C[...redacted 25 bytes]


cd /home/rurouni/Unspooled && find app/src/test -name '*.kt' | wc -l && echo "--[...redacted 43 bytes]


cd /home/rurouni/Unspooled && grep -rn "UNSPOOLED_UI_UX_FULL_AUDIT_REBUILD\|UI_A[...redacted 59 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 44 bytes]


cd /home/rurouni/Unspooled && grep -rn "Deprecated\|@Deprecated\|TODO\|FIXME\|HA[...redacted 72 bytes]


cd /home/rurouni/Unspooled && find app/src -name '*DeadCode*' -o -name '*Unused*[...redacted 57 bytes]


cd /home/rurouni/Unspooled && grep -n "tv-material\|tv-foundation\|compose-bom\|[...redacted 79 bytes]


cd /home/rurouni/Unspooled && grep -n "version\|Version" gradle/libs.versions.to[...redacted 86 bytes]


cd /home/rurouni/Unspooled && find app/src -name '*NavigationRail*' -o -name '*C[...redacted 75 bytes]


cd /home/rurouni/Unspooled && grep -c "route\|Screen\." app/src/main/java/com/un[...redacted 45 bytes]


cd /home/rurouni/Unspooled && grep -rn "Screen\." app/src/main/java/com/unspoole[...redacted 72 bytes]


cd /home/rurouni/Unspooled && grep -rn "FocusVelocityTracker" app/src --include=[...redacted 6 bytes]


cd /home/rurouni/Unspooled && grep -rn "Room\|room" app/build.gradle.kts | grep [...redacted 10 bytes]


cd /home/rurouni/Unspooled && grep -rn "tv-material:1\|tv-foundation:1" app/buil[...redacted 12 bytes]


cd /home/rurouni/Unspooled && grep -rn "import.*FocusVelocityTracker" app/src --[...redacted 14 bytes]


cd /home/rurouni/Unspooled && grep -A2 -B2 "room" app/build.gradle.kts | head -2[...redacted 1 bytes]


cd /home/rurouni/Unspooled && find app/src -name '*.kt' -path '*/ui/screens/*' |[...redacted 51 bytes]


cd /home/rurouni/Unspooled && find app/src -name '*.kt' -path '*/ui/screens/*' -[...redacted 24 bytes]


cd /home/rurouni/Unspooled && wc -l HTML_TV_ARCHITECTURE_MIGRATION_PLAN.md


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 43 bytes]


cd /home/rurouni/Unspooled && grep -rn "CoroutineScope\|viewModelScope\|lifecycl[...redacted 79 bytes]


cd /home/rurouni/Unspooled && grep -rn "SoundPool\|FocusAudioFeedback" app/src -[...redacted 18 bytes]


cd /home/rurouni/Unspooled && grep -rn "SoundPool\|soundPool\|playSound\|audioFe[...redacted 97 bytes]


cd /home/rurouni/Unspooled && grep -rn "NavigationStyle\|CircularRail\|circularR[...redacted 49 bytes]


cd /home/rurouni/Unspooled && grep -rn "ProfileKids\|KidsProfile\|kidsProfile" a[...redacted 26 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 83 bytes]


cd /home/rurouni/Unspooled && grep -rn "TvAppScaffold\|UnifiedChromeScaffold\|Gl[...redacted 44 bytes]


cd /home/rurouni/Unspooled && grep -rn "SidebarItems\|sidebarItems\|sidebar_item[...redacted 30 bytes]


cd /home/rurouni/Unspooled && find app/src/main/java/com/unspooled/app/ui/sideba[...redacted 123 bytes]


cd /home/rurouni/Unspooled && grep -rn "Screen\.NavigationStyle\|NavigationStyle[...redacted 68 bytes]


cd /home/rurouni/Unspooled && grep -rn "trailer\|Trailer" app/src/main/java/com/[...redacted 63 bytes]


cd /home/rurouni/Unspooled && curl -s --max-time 5 http://localhost:3091/health [...redacted 49 bytes]


cd /home/rurouni/Unspooled && grep -rn "static\|companion object" app/src/main/j[...redacted 56 bytes]


cd /home/rurouni/Unspooled && grep -rn "@Deprecated" app/src/main --include='*.k[...redacted 2 bytes]


cd /home/rurouni/Unspooled && grep -rn "NetworkResult\|Result<" app/src/main --i[...redacted 24 bytes]


cd /home/rurouni/Unspooled && grep -rn "@Test" app/src/test --include='*.kt' | w[...redacted 4 bytes]


cd /home/rurouni/Unspooled && grep -rn "Screen\.MyList\|Screen\.Library" app/src[...redacted 33 bytes]


cd /home/rurouni/Unspooled && grep -rn "Result<\|NetworkResult" app/src/main/jav[...redacted 54 bytes]


cd /home/rurouni/Unspooled && grep -rn "Result<" app/src/main/java/com/unspooled[...redacted 111 bytes]


cd /home/rurouni/Unspooled && grep -rn "import.*SourcePreferences" app/src/main [...redacted 16 bytes]


cd /home/rurouni/Unspooled && grep -rn "TvAppScaffold\|UnifiedChromeScaffold\|se[...redacted 61 bytes]


cd /home/rurouni/Unspooled && grep -rn "NetflixHomeScreen\|ModernHomeContent\|Ci[...redacted 159 bytes]


cd /home/rurouni/Unspooled && grep -rn "UnspooledHomeScreen\|DebridStreamTopBar\[...redacted 220 bytes]


cd /home/rurouni/Unspooled && grep -rn "UnifiedChromeScaffold\|TvAppScaffold" ap[...redacted 47 bytes]


cd /home/rurouni/Unspooled && head -50 app/src/main/java/com/unspooled/app/ui/sc[...redacted 33 bytes]


cd /home/rurouni/Unspooled && grep -rn "NavigationStyleSettings\|NavigationStyle[...redacted 34 bytes]


cd /home/rurouni/Unspooled && grep -n "NAVIGATION\|NavigationStyle\|navigation-s[...redacted 107 bytes]


cd /home/rurouni/Unspooled && grep -rn "SettingsPanel\." app/src/main --include=[...redacted 6 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 44 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 43 bytes]


cd /home/rurouni/Unspooled && grep -rn -i "html" app/src/main --include='*.kt' |[...redacted 62 bytes]


cd /home/rurouni/Unspooled && grep -rn -i "html" . --include='*.md' | grep -v "H[...redacted 7 bytes]


cd /home/rurouni/Unspooled && find . -path '*/ui/html*' -o -path '*/html/*' 2>/d[...redacted 18 bytes]


cd /home/rurouni/Unspooled && ls app/build/intermediates/project_dex_archive/deb[...redacted 61 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 25 bytes]


cd /home/rurouni/Unspooled && find app/build -path '*ui/html*' 2>/dev/null


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 39 bytes]


cd /home/rurouni/Unspooled && echo "=== 1. ui/html/ source ===" && find app/src [...redacted 669 bytes]


cd /home/rurouni/Unspooled && echo "=== 6. MediaCard/NetflixMediaCard ===" && gr[...redacted 535 bytes]


cd /home/rurouni/Unspooled && echo "=== 10. FocusZone legacy enum ===" && grep -[...redacted 549 bytes]


cd /home/rurouni/Unspooled && echo "=== 13. SidebarRouting in ui/navigation/ ===[...redacted 939 bytes]


cd /home/rurouni/Unspooled && echo "=== 18. FocusRequester.Default zero matches [...redacted 222 bytes]


cd /home/rurouni/Unspooled && echo "=== 15. Player panels FocusRequester counts [...redacted 643 bytes]


cd /home/rurouni/Unspooled && echo "=== 2. GlassSidebar visual polish ===" && gr[...redacted 740 bytes]


cd /home/rurouni/Unspooled && echo "=== 6. TalkBack wired ===" && grep -rn "cont[...redacted 355 bytes]


ls /home/rurouni/Repos/ 2>/dev/null && echo "---" && ls "/home/rurouni/I want th[...redacted 30 bytes]


find /home/rurouni -maxdepth 3 -type d -name "Repos" -o -name "I want this ui" -[...redacted 126 bytes]


ls -d "/home/rurouni/Repos to copy"/*/ 2>/dev/null && echo "---" && ls "/home/ru[...redacted 257 bytes]


ls "/home/rurouni/Repos to copy/JetStreamCompose" 2>/dev/null && echo "---found-[...redacted 231 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/screens/ -na[...redacted 34 bytes]


curl -sL --max-time 10 "https://developer.android.com/develop/ui/compose/touch-i[...redacted 86 bytes]


curl -sL --max-time 10 "https://d.android.com/r/androidx/tv/tv-material/release-[...redacted 179 bytes]


echo "=== NuvioTV 0.7.0 focus ===" && find "/home/rurouni/Repos to copy/NuvioTV-[...redacted 390 bytes]


ls "/home/rurouni/Repos to copy/NuvioTV-0.7.0-beta/app/src/main/java/com/nuvio/t[...redacted 159 bytes]


grep -rn "FocusRequester\|focusRequester\|FocusLinks\|focusProperties" "/home/ru[...redacted 125 bytes]


JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gradlew :app:compileDebugKotlin 2[...redacted 3 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 44 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 60 bytes]


cd /home/rurouni/Unspooled && grep -n "FocusRequester\|ExperimentalTvMaterial3Ap[...redacted 89 bytes]


cd /home/rurouni/Unspooled && grep -n "getOrNull\|Error\|mismatch" app/src/main/[...redacted 73 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 50 bytes]


cd /home/rurouni/Unspooled && git checkout -- app/src/main/java/com/unspooled/ap[...redacted 489 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 43 bytes]


cd /home/rurouni/Unspooled && grep -rn "haze\|Haze\|blur\|Blur" app/build.gradle[...redacted 87 bytes]


cd /home/rurouni/Unspooled && grep -rn "dev.chrisbanes.haze\|haze" app/build.gra[...redacted 7 bytes]


cd /home/rurouni/Unspooled && grep -n "GlassSidebar\|Fun\|fun\|feedback\|audio\|[...redacted 82 bytes]


cd /home/rurouni/Unspooled && grep -n "haze\|Haze\|glassHaze" app/src/main/java/[...redacted 46 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 61 bytes]


cd /home/rurouni/Unspooled && grep "blockContentFocusWhenInactive" app/src/main/[...redacted 51 bytes]


cd /home/rurouni/Unspooled && grep -rn "backdropExpandEnabled\s*=\s*false" app/s[...redacted 279 bytes]


cd /home/rurouni/Unspooled && grep -n "FocusRing\|FocusBorder\|Accent\|Glow" app[...redacted 70 bytes]


cd /home/rurouni/Unspooled && grep "CinematicTheme\|GlassBorder" app/src/main/ja[...redacted 61 bytes]


cd /home/rurouni/Unspooled && grep -n "import.*CinematicTheme\|GlassBorder\|Stro[...redacted 88 bytes]


cd /home/rurouni/Unspooled && head -35 app/src/main/java/com/unspooled/app/ui/ca[...redacted 39 bytes]


cd /home/rurouni/Unspooled && grep -n "^import" app/src/main/java/com/unspooled/[...redacted 44 bytes]


cd /home/rurouni/Unspooled && echo "=== Phase 7: Search zones ===" && grep -c "S[...redacted 1012 bytes]


cd /home/rurouni/Unspooled && echo "=== Search zone usage ===" && grep -n "TvFoc[...redacted 557 bytes]


cd /home/rurouni/Unspooled && grep -rn "DetailsActions" app/src/main --include='[...redacted 15 bytes]


cd /home/rurouni/Unspooled && find app -name 'baseline*' 2>/dev/null | head -5


cd /home/rurouni/Unspooled && wc -l app/src/main/java/com/unspooled/app/ui/acces[...redacted 102 bytes]


cd /home/rurouni/Unspooled && grep -rh '^import androidx' app/src/main/java/com/[...redacted 92 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 44 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 67 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 39 bytes]


cd /home/rurouni/Unspooled && git diff --name-only && echo "---" && git ls-files[...redacted 59 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 43 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 62 bytes]


cd /home/rurouni/Unspooled && grep -rl '^import androidx\.compose\.material3\.' [...redacted 42 bytes]


cd /home/rurouni/Unspooled && for f in $(grep -rl '^import androidx\.compose\.ma[...redacted 140 bytes]


cd /home/rurouni/Unspooled && grep -n '^import' app/src/main/java/com/unspooled/[...redacted 37 bytes]


cd /home/rurouni/Unspooled && grep -n 'import androidx.compose.material3\.' app/[...redacted 59 bytes]


cd /home/rurouni/Unspooled && grep -n 'import androidx.tv.material3\.' app/src/m[...redacted 54 bytes]


cd /home/rurouni/Unspooled && grep -n 'FontWeight\|\.dp\|\.sp' app/src/main/java[...redacted 67 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 66 bytes]


cd /home/rurouni/Unspooled && grep -n 'import.*draw.clip' app/src/main/java/com/[...redacted 56 bytes]


cd /home/rurouni/Unspooled && grep -n 'import.*MaterialTheme\|import.*Text\|impo[...redacted 140 bytes]


cd /home/rurouni/Unspooled && sed -n '38,62p' app/src/main/java/com/unspooled/ap[...redacted 44 bytes]


cd /home/rurouni/Unspooled && grep -n 'import' app/src/main/java/com/unspooled/a[...redacted 56 bytes]


cd /home/rurouni/Unspooled && grep -c 'Icon(' app/src/main/java/com/unspooled/ap[...redacted 368 bytes]


cd /home/rurouni/Unspooled && grep -c 'Modifier.clickable\|Modifier.focusable' a[...redacted 216 bytes]


ls -la /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/screens/pr[...redacted 146 bytes]


cd /home/rurouni/Unspooled && grep -n 'clickable\|focusable\|Surface\|material3'[...redacted 90 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 43 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 67 bytes]


cd /home/rurouni/Unspooled && grep -n 'selected = ' app/src/main/java/com/unspoo[...redacted 45 bytes]


cd /home/rurouni/Unspooled && grep -n 'rememberSaveable\|mutableIntStateOf' app/[...redacted 69 bytes]


cd /home/rurouni/Unspooled && grep -n 'import.*saveable\|import.*mutableIntState[...redacted 101 bytes]


cd /home/rurouni/Unspooled && grep -n 'GlassTokens\|animateFloatAsState\|tween' [...redacted 80 bytes]


cd /home/rurouni/Unspooled && grep -n 'clip\|fillMaxHeight' app/src/main/java/co[...redacted 70 bytes]


cd /home/rurouni/Unspooled && grep -n '\.clip(' app/src/main/java/com/unspooled/[...redacted 48 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 62 bytes]


cat -n /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/focus/Home[...redacted 19 bytes]


cat -n /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/screens/mo[...redacted 20 bytes]


cat -n /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/screens/tv[...redacted 22 bytes]


cat -n /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/components[...redacted 22 bytes]


cat -n /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/components[...redacted 24 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 39 bytes]


head -60 /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/screens/[...redacted 31 bytes]


cat -n /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/components[...redacted 27 bytes]


cat -n /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/components[...redacted 23 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 57 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 51 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 45 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 60 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 69 bytes]


find /home/rurouni/Unspooled/app/build/test-results -name '*.xml' -exec grep -oP[...redacted 46 bytes]


cd /home/rurouni/Unspooled && grep -roP 'tests="\K[0-9]+' app/build/test-results[...redacted 54 bytes]


cd /home/rurouni/Unspooled && grep -roP 'tests="\K[0-9]+' app/build/test-results[...redacted 65 bytes]


grep -n -B2 -A2 'focusedIndex' /home/rurouni/Unspooled/app/src/main/java/com/uns[...redacted 43 bytes]


grep -n -B3 -A3 'focusedIndex' /home/rurouni/Unspooled/app/src/main/java/com/uns[...redacted 41 bytes]


grep -n -B3 -A3 'var key by remember' /home/rurouni/Unspooled/app/src/main/java/[...redacted 61 bytes]


grep -rn '@Parcelize' /home/rurouni/Unspooled/app/src/main/java/com/unspooled/ap[...redacted 27 bytes]


grep -rn 'data class Profile' /home/rurouni/Unspooled/app/src/main/java/com/unsp[...redacted 23 bytes]


grep -rn '@Parcelize' /home/rurouni/Unspooled/app/src/main/java/com/unspooled/ -[...redacted 33 bytes]


grep -n -A15 'data class Profile(' /home/rurouni/Unspooled/app/src/main/java/com[...redacted 37 bytes]


grep -n 'pinTarget' /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/[...redacted 42 bytes]


grep -n 'pinTarget = null' /home/rurouni/Unspooled/app/src/main/java/com/unspool[...redacted 49 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 39 bytes]


sed -n '248,270p' /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui[...redacted 40 bytes]


sed -n '75,120p' /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/[...redacted 39 bytes]


grep 'rememberSaveable\|import.*runtime' /home/rurouni/Unspooled/app/src/main/ja[...redacted 64 bytes]


grep 'rememberSaveable\|import.*runtime' /home/rurouni/Unspooled/app/src/main/ja[...redacted 74 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 41 bytes]


head -50 /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/screens/[...redacted 31 bytes]


cd /home/rurouni/Unspooled && git diff HEAD -- app/src/main/java/com/unspooled/a[...redacted 56 bytes]


grep 'import.*runtime' /home/rurouni/Unspooled/app/src/main/java/com/unspooled/a[...redacted 46 bytes]


sed -n '255,275p' /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui[...redacted 41 bytes]


grep 'import.*runtime' /home/rurouni/Unspooled/app/src/main/java/com/unspooled/a[...redacted 32 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 38 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 47 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 45 bytes]


cd /home/rurouni/Unspooled && grep -oP 'tests="\K[0-9]+' app/build/test-results/[...redacted 140 bytes]


cd /home/rurouni/Unspooled && grep -l 'failures="[^0]' app/build/test-results/te[...redacted 50 bytes]


cd /home/rurouni/Unspooled && cat app/build/test-results/testDebugUnitTest/*.xml[...redacted 249 bytes]


cd /home/rurouni/Unspooled && for f in app/build/test-results/testDebugUnitTest/[...redacted 55 bytes]


ls -la /home/rurouni/Unspooled/*.md /home/rurouni/Unspooled/**/*.md 2>/dev/null;[...redacted 155 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui -type d | so[...redacted 2 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app -name '*.kt' | [...redacted 5 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui -name '*.kt'[...redacted 8 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/data -name '*.k[...redacted 10 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/domain -name '*[...redacted 12 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/player -name '*[...redacted 12 bytes]


find /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/core -name '*.k[...redacted 10 bytes]


find /home/rurouni/Unspooled/app/src/test -name '*.kt' | wc -l


cd /home/rurouni/Unspooled && git log --oneline -5


cd /home/rurouni/Unspooled && git rev-parse --abbrev-ref HEAD


cd /home/rurouni/Unspooled && grep -n 'route = ' app/src/main/java/com/unspooled[...redacted 39 bytes]


cd /home/rurouni/Unspooled && grep -n 'composable.*route.*Screen\.' app/src/main[...redacted 68 bytes]


cd /home/rurouni/Unspooled && grep 'version \|kotlin\|agp\|compileSdk\|minSdk\|t[...redacted 67 bytes]


cd /home/rurouni/Unspooled && grep 'Screen\.' app/src/main/java/com/unspooled/ap[...redacted 25 bytes]


cd /home/rurouni/Unspooled && grep -n 'object\|data object\|sealed\|val route\|f[...redacted 85 bytes]


cd /home/rurouni/Unspooled && grep -E 'kotlin =|agp =|versionName|versionCode|bo[...redacted 60 bytes]


cd /home/rurouni/Unspooled && grep -E 'kotlin =|agp =|bom' build.gradle.kts


cd /home/rurouni/Unspooled && grep -E 'kotlin|compose-bom|agp' gradle/libs.versi[...redacted 114 bytes]


cd /home/rurouni/Unspooled && rm -v PROJECT_STATE.md ARCHITECTURE.md HTML_TV_ARC[...redacted 37 bytes]


cd /home/rurouni/Unspooled && ls *.md && echo "---" && ls -la /home/rurouni/Unsp[...redacted 50 bytes]


cd /home/rurouni/Unspooled && JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gra[...redacted 42 bytes]


grep -c 'val\|var' /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/u[...redacted 146 bytes]


grep -n 'data object\|enum\|sealed\|object ' /home/rurouni/Unspooled/app/src/mai[...redacted 48 bytes]


cat /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/ui/focus/TvFocus[...redacted 7 bytes]


sed -n '118,145p' /home/rurouni/Unspooled/PROJECT_STATE.md


cd /home/rurouni/Unspooled && grep -c 'Lines' PROJECT_STATE.md; echo "---"; wc -[...redacted 191 bytes]


find /home/rurouni/Unspooled -name '*.md' -not -path '*/.git/*' -not -path '*/no[...redacted 25 bytes]


echo "=== Zones ===" && grep -c 'object\|enum' /home/rurouni/Unspooled/app/src/m[...redacted 414 bytes]


grep 'data object' /home/rurouni/Unspooled/app/src/main/java/com/unspooled/app/u[...redacted 22 bytes]


grep -n '34' /home/rurouni/Unspooled/PROJECT_STATE.md


hermes config edit --print 2>/dev/null || cat ~/.hermes/config.yaml


grep -n "DEFAULT_CONFIG\|memory_char_limit\|user_char_limit\|tool_output\|max_by[...redacted 83 bytes]


du -sh ~/.hermes/sessions/ ~/.hermes/skills/ ~/.hermes/logs/ ~/.hermes/cache/ 2>[...redacted 79 bytes]


df -h ~/.hermes; ls -lh ~/.hermes/state.db 2>/dev/null || echo "no state.db at r[...redacted 4 bytes]


python3 - <<'PY'
import yaml
with open('/home/rurouni/.hermes/config.yaml') as f[...redacted 768 bytes]


hermes config set memory.memory_char_limit 1600 && hermes config set memory.user[...redacted 270 bytes]


hermes sessions prune --help 2>&1 || hermes sessions prune --older-than 30 --for[...redacted 15 bytes]


hermes sessions prune --older-than 30 --yes


ls -la ~/.hermes/memories/ 2>/dev/null && wc -c ~/.hermes/memories/MEMORY.md ~/.[...redacted 59 bytes]


python3 - <<'PY'
import yaml
with open('/home/rurouni/.hermes/config.yaml') as f[...redacted 342 bytes]


python3 - <<'PY'
import sqlite3
con = sqlite3.connect('/home/rurouni/.hermes/sta[...redacted 65 bytes]


systemctl status llama-swap.service --no-pager -l && echo '=== MODELS ===' && cu[...redacted 136 bytes]


grep -oP -- '-m \K\S+' ~/.config/llama-swap/config.yaml | sort


python3 - << 'PY'
import yaml, os
c = yaml.safe_load(open('/home/rurouni/.hermes[...redacted 139 bytes]


ls -lh /models/downloads/*.gguf | awk '{print $5, $9}' | sort -k2


find ~/ -maxdepth 3 \( -iname '*model*test*' -o -iname '*bench*' -o -iname '*lla[...redacted 49 bytes]


cat > /tmp/bench_actual_fleet.py << 'PY'
import json, time, urllib.request, sys
[...redacted 4096 bytes]


python3 - << 'PY'
import yaml
p = '/home/rurouni/.hermes/config.yaml'
c = yaml.s[...redacted 594 bytes]


systemctl daemon-reload && systemctl restart llama-swap.service && sleep 2 && cu[...redacted 58 bytes]


rm -f /models/downloads/Qwen3.6-35B-A3B-uncensored-heretic-Native-MTP-Preserved.[...redacted 144 bytes]


sed -n '/qwen36-35b-mtp:/,/^  [^ ]/p' ~/.config/llama-swap/config.yaml | head -6[...redacted 1 bytes]


hf search gemma-4-12b-it --file-name '*.gguf' --limit 10 2>/dev/null || echo 'hf[...redacted 19 bytes]


which hf || which huggingface-cli || pip show huggingface-hub 2>/dev/null | grep[...redacted 12 bytes]


python3 - << 'PY'
from huggingface_hub import HfApi
api = HfApi()
for m in api.l[...redacted 80 bytes]


find ~/.cache/huggingface/hub -maxdepth 2 -iname '*gemma-4-12*' 2>/dev/null; fin[...redacted 54 bytes]


python3 - << 'PY'
from huggingface_hub import HfApi
api = HfApi()
for repo in ['[...redacted 318 bytes]


python3 -m huggingface_hub.cli.login --help >/dev/null 2>&1
huggingface-cli down[...redacted 121 bytes]


hf download --include gemma-4-12b-it-Q4_K_M.gguf unsloth/gemma-4-12b-it-GGUF --l[...redacted 57 bytes]


huggingface-cli download unsloth/gemma-4-12b-it-GGUF gemma-4-12b-it-Q4_K_M.gguf [...redacted 82 bytes]


hf download --help && echo '---' && which hf && hf auth whoami 2>/dev/null || tr[...redacted 2 bytes]


ls -la ~/.cache/huggingface/ 2>/dev/null; cat ~/.huggingface/token 2>/dev/null; [...redacted 36 bytes]


hf download --local-dir /models/downloads unsloth/gemma-4-12b-it-GGUF gemma-4-12[...redacted 16 bytes]


python3 - << 'PY'
import yaml
p = '/home/rurouni/.hermes/config.yaml'
c = yaml.s[...redacted 617 bytes]


curl -s http://localhost:9292/v1/models 2>&1 | head -50


cat ~/.hermes/config.yaml 2>/dev/null | grep -A 20 'local-llm\|llama-swap\|gemma[...redacted 22 bytes]


cat ~/.config/llama-swap/config.yaml 2>/dev/null || cat ~/llama-swap/config.yaml[...redacted 99 bytes]


ls -lh /models/downloads/gemma-4-12b-it-Q4_K_M.gguf 2>&1


curl -s http://localhost:9292/v1/chat/completions -d '{"model":"gemma-12b","mess[...redacted 75 bytes]


grep -n 'custom_providers\|local-llm\|provider:' ~/.hermes/config.yaml | head -2[...redacted 1 bytes]


/usr/local/bin/llama-server-sm75 --version 2>&1 | head -3


/usr/local/bin/llama-server-sm75 -m /models/downloads/gemma-4-12b-it-Q4_K_M.gguf[...redacted 387 bytes]


pkill -HUP llama-swap 2>&1; sleep 2; curl -s http://localhost:9292/v1/models | p[...redacted 35 bytes]


curl -s http://localhost:9292/v1/chat/completions -d '{"model":"gemma-12b","mess[...redacted 105 bytes]


curl -s http://localhost:9292/v1/chat/completions -d '{"model":"gemma-12b","mess[...redacted 460 bytes]


python3 -c "
import requests, json
r = requests.post('http://127.0.0.1:9292/v1/c[...redacted 769 bytes]


python3 -c "
import requests, json
r = requests.post('http://127.0.0.1:9292/v1/c[...redacted 768 bytes]


python3 << 'PYEOF'
import requests, json, time

model = "gemma-12b"
base = "http[...redacted 2522 bytes]


curl -s https://api.github.com/repos/ggml-org/llama.cpp/pulls/24057 | python3 -c[...redacted 207 bytes]


python3 << 'PYEOF'
# Check if gemma-4-12b GGUF has MTP head tensors
import struc[...redacted 2479 bytes]


python3 << 'PYEOF'
import struct

with open('/models/downloads/gemma-4-12b-it-Q4[...redacted 2284 bytes]


/usr/local/bin/llama-server-sm75 --help 2>&1 | grep -i "mtp\|spec\|draft" | head[...redacted 4 bytes]


python3 -c "
# Quick binary search for 'mtp' in the GGUF file
with open('/models[...redacted 647 bytes]


python3 << 'PYEOF'
import requests, json

base = "http://127.0.0.1:9292/v1"

# B[...redacted 1736 bytes]


ps aux | grep llama-server | grep -v grep


ls /home/rurouni/.config/llama-swap/ && cat /home/rurouni/.config/llama-swap/*.y[...redacted 45 bytes]


curl -sL https://huggingface.co/google/gemma-4-12B-it/raw/main/README.md | head [...redacted 4 bytes]


curl -sL "https://ai.google.dev/gemma/docs/core/hardware_requirements" 2>/dev/nu[...redacted 14 bytes]


curl -sL "https://ai.google.dev/gemma/docs" 2>/dev/null | grep -oP 'href="[^"]*g[...redacted 22 bytes]


curl -sL "https://ai.google.dev/gemma/docs/core" 2>/dev/null | grep -oP 'href="[[...redacted 72 bytes]


curl -sL "https://ai.google.dev/gemma/docs/core/model_card_4" 2>/dev/null | grep[...redacted 120 bytes]


curl -sL "https://ai.google.dev/gemma/docs/integrations/llamacpp" 2>/dev/null | [...redacted 48 bytes]


curl -sL "https://ai.google.dev/gemma/docs/integrations/llamacpp" 2>/dev/null | [...redacted 391 bytes]


curl -sL "https://ai.google.dev/gemma/docs/core/model_card_4" 2>/dev/null | pyth[...redacted 706 bytes]


curl -s http://127.0.0.1:9292/models | python3 -m json.tool 2>/dev/null || echo [...redacted 29 bytes]


ss -tlnp | grep -E '9292|5800|8080' && ps aux | grep -E 'llama-server|llama-swap[...redacted 16 bytes]


curl -s http://127.0.0.1:9292/status 2>/dev/null | python3 -m json.tool 2>/dev/n[...redacted 211 bytes]


# Check for the swap endpoint
curl -s http://127.0.0.1:9292/v1/chat/completions [...redacted 532 bytes]


# Kill current gemma-12b instance (PID 99546)
kill 99546 && sleep 2 && ps -p 995[...redacted 58 bytes]


# Trigger cold-start: send a minimal request. This will cause llama-swap to resp[...redacted 323 bytes]


timeout 30 curl -s http://127.0.0.1:9292/v1/chat/completions \
  -X POST -H "Con[...redacted 229 bytes]


/usr/local/bin/llama-server-sm75 --help 2>&1 | grep -i -A 1 'reasoning\|no-reaso[...redacted 2 bytes]


ps aux | grep 'llama-server.*gemma-4-12b' | grep -v grep


kill 56044 114830 2>/dev/null; sleep 1; ps aux | grep -E 'llama-swap|llama-serve[...redacted 43 bytes]


/usr/local/bin/llama-swap --config /home/rurouni/.config/llama-swap/config.yaml [...redacted 14 bytes]


sleep 2 && curl -s http://127.0.0.1:9292/v1/models 2>/dev/null | python3 -m json[...redacted 17 bytes]


# Trigger cold-start and wait for model to load
timeout 90 curl -s http://127.0.[...redacted 252 bytes]


# VRAM usage
nvidia-smi --query-gpu=memory.used,memory.total --format=csv,nohead[...redacted 169 bytes]


# Find llama-bench
find /home/rurouni/src/llama.cpp -name 'llama-bench' -type f [...redacted 21 bytes]


# Generate a ~2000 token prompt for benchmarking
python3 -c "
import random, str[...redacted 1042 bytes]


# Benchmark: prompt processing + generation
timeout 120 curl -s http://127.0.0.1[...redacted 179 bytes]


# Benchmark 2: Longer generation to measure sustained throughput
timeout 120 cur[...redacted 496 bytes]


nvidia-smi --query-gpu=memory.used,memory.total,gpu.utilization,power.draw --for[...redacted 16 bytes]


nvidia-smi -q -d MEMORY,UTILIZATION,POWER | grep -E 'Used|Total|Gpu|Power Draw' [...redacted 10 bytes]


# Kill current gemma-12b and restart llama-swap
kill 114986 2>/dev/null
sleep 1
[...redacted 128 bytes]


# Wait for llama-swap readiness + trigger cold-start
sleep 3 && timeout 120 curl[...redacted 273 bytes]


# Verify 256K flags in running process + VRAM check
ps aux | grep 'llama-server.[...redacted 103 bytes]


# Benchmark 1: Prompt processing (~2K prompt)
timeout 120 curl -s http://127.0.0[...redacted 158 bytes]


# Benchmark 2: Long generation (500 tokens)
timeout 120 curl -s http://127.0.0.1[...redacted 475 bytes]


# Final VRAM check
nvidia-smi -q -d MEMORY,POWER | grep -E 'Used|Power Draw' |[...redacted 8 bytes]


# Research Qwen3.6-35B-A3B official context size
curl -sL "https://huggingface.c[...redacted 77 bytes]


# Qwen3.6 base model context + Qwopus + Qwen3.5
curl -sL "https://huggingface.co[...redacted 355 bytes]


# Qwen3.5-9B context specs
curl -sL "https://huggingface.co/Qwen/Qwen3.5-9B/raw/[...redacted 332 bytes]


# Kill all current processes
kill $(pgrep llama-swap) 2>/dev/null
kill $(pgrep -[...redacted 95 bytes]


/usr/local/bin/llama-swap --config /home/rurouni/.config/llama-swap/config.yaml [...redacted 14 bytes]


sleep 3 && timeout 60 curl -s http://127.0.0.1:9292/v1/chat/completions \
  -X P[...redacted 210 bytes]


sleep 2 && curl -s http://127.0.0.1:9292/v1/models 2>/dev/null | python3 -m json[...redacted 17 bytes]


/tmp/bench_all.sh 1 2>&1 | tee /tmp/bench_results.txt


ls -la /tmp/bench_all.sh && bash -x /tmp/bench_all.sh 2>&1 | head -20


bash /tmp/bench_all.sh 2>&1 | tee /tmp/bench_results.txt


cat /tmp/bench_results.txt 2>/dev/null | tail -40


sleep 15 && wc -l /tmp/bench_results.txt && tail -20 /tmp/bench_results.txt


kill $(pgrep llama-swap) 2>/dev/null; kill $(pgrep -f llama-server) 2>/dev/null;[...redacted 57 bytes]


sleep 3 && bash /tmp/bench.sh 2>&1 | tee /tmp/bench_results2.txt


sleep 10 && wc -l /tmp/bench_results2.txt 2>/dev/null && tail -10 /tmp/bench_res[...redacted 9 bytes]


sleep 30 && wc -l /tmp/bench_results2.txt && tail -20 /tmp/bench_results2.txt


sleep 45 && wc -l /tmp/bench_results2.txt && tail -20 /tmp/bench_results2.txt


sleep 60 && wc -l /tmp/bench_results2.txt && tail -25 /tmp/bench_results2.txt


ps aux | grep -E 'llama-swap|llama-server.*gemma' | grep -v grep || echo "Nothin[...redacted 10 bytes]


docker ps -a --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" 2>/dev/null; e[...redacted 212 bytes]


docker inspect open-webui --format '{{.Config.Env}}' 2>&1; echo "---"; docker in[...redacted 150 bytes]


docker inspect open-webui --format '{{.Config.Image}}' 2>&1; echo "---"; docker [...redacted 526 bytes]


# Check if nginx is configured for Open WebUI
ls /etc/nginx/sites-enabled/ 2>&1;[...redacted 850 bytes]


# Check nginx config for openwebui
cat /etc/nginx/sites-enabled/openwebui 2>&1; [...redacted 573 bytes]


sudo cat /etc/nginx/sites-enabled/openwebui 2>&1; echo "==="; cat ~/projects/ope[...redacted 410 bytes]


# host.docker.internal doesn't resolve from the bridge network - that's the issu[...redacted 624 bytes]


# Check Open WebUI version
docker exec open-webui cat /app/backend/version.txt 2[...redacted 427 bytes]


# Check Open WebUI version from image labels
docker inspect open-webui --format [...redacted 453 bytes]


# Check nginx config - default site is blocking port 80
sudo cat /etc/nginx/site[...redacted 337 bytes]


# FULL SCRAPER AUDIT — document everything before changes
echo "=== SCRAPER CO[...redacted 1596 bytes]


# Check how Tailscale Funnel is set up for the scraper
tailscale funnels --help [...redacted 838 bytes]


# Check how Tailscale Funnel is configured — it's likely via tailscale serve
t[...redacted 600 bytes]


# Check tailscale serve status to see how the scraper is exposed
tailscale serve[...redacted 578 bytes]


cd ~/projects/openwebui && docker compose down 2>&1


cd ~/projects/openwebui && docker compose pull 2>&1


cd ~/projects/openwebui && docker compose up -d 2>&1


# Verify WebUI is running with host networking
docker inspect open-webui --forma[...redacted 637 bytes]


# Check if WebUI is actually listening on port 3081
ss -tlnp | grep 3081 2>&1
ec[...redacted 305 bytes]


# Check what port Open WebUI actually uses internally
docker exec open-webui cat[...redacted 283 bytes]


# Wait a moment for startup, then verify
sleep 10 && docker inspect open-webui -[...redacted 438 bytes]


curl -s http://127.0.0.1:3081/api/models 2>&1 | python3 -c "import sys,json; d=j[...redacted 79 bytes]


# Verify scraper still works
curl -sk https://debian-ai.tailf83ed5.ts.net/health[...redacted 546 bytes]


cat /etc/nginx/sites-available/openwebui 2>&1
echo "=== DEFAULT ==="
cat /etc/ng[...redacted 87 bytes]


sudo cat /etc/nginx/sites-available/openwebui 2>&1


cat > /etc/nginx/sites-available/openwebui << 'NGINX_EOF'
# Open WebUI reverse p[...redacted 1553 bytes]


sudo bash -c 'cat > /etc/nginx/sites-available/openwebui << '"'"'NGINX_EOF'"'"'
[...redacted 1576 bytes]


# Remove default site (conflicts with default_server)
sudo rm -f /etc/nginx/site[...redacted 147 bytes]


# Verify nginx now serves WebUI on port 80
curl -s http://127.0.0.1:80/ -o /dev/[...redacted 443 bytes]


# Check if WebUI has an admin setup endpoint
curl -s http://127.0.0.1:3081/api/v[...redacted 474 bytes]


# Check what the API returns
curl -v http://127.0.0.1:3081/api/v1/auth/signup 2>[...redacted 325 bytes]


# The API might be on a different path - check the Open WebUI docs
# Try the act[...redacted 615 bytes]


# First, create the admin user via the signup endpoint
# Open WebUI requires POS[...redacted 286 bytes]


# Check the actual signup endpoint path
curl -s -X POST http://127.0.0.1:3081/ap[...redacted 230 bytes]


# Try the auth endpoint directly
curl -s -X POST http://127.0.0.1:3081/api/v1/au[...redacted 746 bytes]


# The API might be behind nginx which is rewriting. Let me check the actual API [...redacted 628 bytes]


# Let me check the actual API routes from the Open WebUI app
docker exec open-we[...redacted 384 bytes]


# Let me just look at the actual API routes
docker exec open-webui python3 -c "
[...redacted 409 bytes]


# Let me find the actual API routes by checking the source
docker exec open-webu[...redacted 320 bytes]


# Check the auth router for signup endpoints
docker exec open-webui grep -n "sig[...redacted 86 bytes]


# Check the actual route definition
docker exec open-webui sed -n '740,790p' /ap[...redacted 42 bytes]


# Check what the SignupForm looks like
docker exec open_webui grep -A 10 "class [...redacted 161 bytes]


docker exec open-webui grep -A 10 "class SignupForm" /app/backend/open_webui/rou[...redacted 18 bytes]


docker exec open-webui grep -B 5 -A 10 "SignupForm" /app/backend/open_webui/rout[...redacted 28 bytes]


# SignupForm is imported from models - let me find it
docker exec open-webui gre[...redacted 69 bytes]


docker exec open-webui grep -A 10 "class SignupForm" /app/backend/open_webui/mod[...redacted 17 bytes]


# Signup requires form-data, not JSON
curl -s -X POST http://127.0.0.1:3081/api/[...redacted 171 bytes]


# Check the actual route prefix - maybe it's not /api/v1
docker exec open-webui [...redacted 212 bytes]


# Correct endpoint: /api/v1/auths/signup
curl -s -X POST http://127.0.0.1:3081/a[...redacted 175 bytes]


curl -s -X POST http://127.0.0.1:3081/api/v1/auths/signup \
  -H "Content-Type: [...redacted 135 bytes]


# Extract the token
TOKEN=$(curl -s -X POST http://127.0.0.1:3081/api/v1/auths/s[...redacted 1226 bytes]


# Let me find the correct config endpoint
curl -s http://127.0.0.1:3081/api/v1/c[...redacted 380 bytes]


# Check the configs router for actual endpoints
docker exec open-webui grep -n "[...redacted 69 bytes]


# The configs router has /connections, /models, /tool_servers etc.
# Let me chec[...redacted 295 bytes]


# The settings are in env.py - let me check how to update them
# They're environ[...redacted 353 bytes]


cd ~/projects/openwebui && docker compose down 2>&1


cd ~/projects/openwebui && docker compose up -d 2>&1


# Wait for startup and verify
sleep 15 && docker logs open-webui --tail 10 2>&1
[...redacted 168 bytes]


# Check the Docker bridge gateway
docker inspect openwebui_default --format '{{r[...redacted 375 bytes]


echo "=== SCRAPER ==="
curl -sk https://debian-ai.tailf83ed5.ts.net/health -o /d[...redacted 753 bytes]


echo "=== WEBUI CONTAINER ==="
docker ps -a --filter name=open-webui --format '{[...redacted 420 bytes]


sleep 15 && docker logs open-webui --tail 15 2>&1


sleep 10 && docker logs open-webui --tail 5 2>&1


sleep 10 && curl -s http://127.0.0.1:3081/health 2>&1; echo "---"; curl -s http:[...redacted 133 bytes]


echo "=== SCRAPER HEALTHCHECK ==="
docker inspect nexstream-scraper --format 'He[...redacted 663 bytes]


curl -sL "https://raw.githubusercontent.com/open-webui/open-webui/main/README.md[...redacted 25 bytes]


curl -sL "https://raw.githubusercontent.com/ggerganov/llama.cpp/master/gguf-py/R[...redacted 33 bytes]


curl -sL "https://raw.githubusercontent.com/open-webui/open-webui/main/backend/o[...redacted 111 bytes]


curl -sL "https://raw.githubusercontent.com/ggerganov/llama.cpp/master/examples/[...redacted 110 bytes]


curl -sL "https://raw.githubusercontent.com/ggerganov/llama.cpp/master/examples/[...redacted 41 bytes]


curl -sL "https://raw.githubusercontent.com/ggerganov/llama.cpp/master/examples/[...redacted 292 bytes]


# Let's look at the llama.cpp server help for flags
# First, check if llama.cpp [...redacted 184 bytes]


# Check Open WebUI docs for timeout settings
curl -sL "https://docs.openwebui.co[...redacted 135 bytes]


/usr/local/bin/llama-server --help 2>&1 | head -200


# Get llama-server help for all flags, focusing on relevant ones
/usr/local/bin/[...redacted 172 bytes]


# Let's look at Open WebUI docs on GitHub for environment configuration
curl -sL[...redacted 232 bytes]


/usr/local/bin/llama-server --help 2>&1 | tail -n +200 | head -200


# Look at Open WebUI's config for OpenAI/Ollama client timeout settings
curl -sL[...redacted 207 bytes]


# Check for Open WebUI env vars related to Ollama/LM timeouts in the source
curl[...redacted 447 bytes]


/usr/local/bin/llama-server --help 2>&1 | tail -n +400 | head -200


# Check llama-swap documentation and known issues
curl -sL "https://raw.githubus[...redacted 75 bytes]


# Check for common llama.cpp hanging issues - look at GitHub issues
curl -sL "ht[...redacted 320 bytes]


# Check GitHub issues for llama.cpp server hangs
curl -sL "https://api.github.co[...redacted 574 bytes]


# Check Open WebUI config for model timeout/stream settings more closely
curl -s[...redacted 220 bytes]


# Check for Open WebUI env documentation from their GitHub wiki/docs
curl -sL "h[...redacted 208 bytes]


# Find where Open WebUI docs live
find /home/rurouni -path "*/open-webui*" -name[...redacted 422 bytes]


# Check Open WebUI's actual HTTP client usage with Ollama
curl -sL "https://raw.[...redacted 371 bytes]


# Check llama-swap config options for TTL/timeout/keepalive
curl -sL "https://ra[...redacted 278 bytes]


cat /home/rurouni/.hermes/skills/productivity/librechat/references/open-webui-en[...redacted 33 bytes]


# Check Open WebUI's ollama proxy handler for timeout logic
curl -sL "https://ra[...redacted 124 bytes]


# Get the full Open WebUI config.py to find timeout settings
curl -sL "https://r[...redacted 673 bytes]


# Check Open WebUI config for whether there's an HTTP request timeout for the Ol[...redacted 252 bytes]


# Check Open WebUI's main app for chat/ollama request handlers - how requests ar[...redacted 652 bytes]


# Look at the OpenAI integration for request timeout settings
curl -sL "https://[...redacted 401 bytes]


# Get the actual timeout config values from config.py
curl -sL "https://raw.gith[...redacted 200 bytes]


# Check the session_pool for the stream_wrapper logic
curl -sL "https://raw.gith[...redacted 110 bytes]


# Check the full session_pool for timeout/cleanup logic
curl -sL "https://raw.gi[...redacted 100 bytes]


# Find the env.py file which has the actual default values
curl -sL "https://raw[...redacted 148 bytes]


# Check how Open WebUI handles streaming timeouts specifically in the ollama/ope[...redacted 190 bytes]


# Check the local open-webui-env-vars reference fully
cat /home/rurouni/.hermes/[...redacted 156 bytes]


# Check the Open WebUI env.py file for the full list
curl -sL "https://raw.githu[...redacted 82 bytes]


echo "=== LLAMA-SWAP SYSTEMD STATUS ==="
systemctl status llama-swap 2>&1 | head[...redacted 253 bytes]


echo "=== SCRAPER HEALTHCHECK COMMAND ==="
docker inspect nexstream-scraper --fo[...redacted 426 bytes]


docker volume ls | grep open-webui 2>&1
echo "---"
docker ps -a --filter name=op[...redacted 95 bytes]


# Check if host.docker.internal resolves inside the webui container
docker exec [...redacted 391 bytes]


# Test if scraper listens on IPv6
docker exec nexstream-scraper ss -tlnp 2>&1 | [...redacted 459 bytes]


# Fix the scraper healthcheck to use 127.0.0.1 instead of localhost
docker inspe[...redacted 600 bytes]


echo "=== FINAL VERIFICATION ==="
echo ""
echo "--- Services Health ---"
echo -n[...redacted 1352 bytes]


# Check the actual running container's env vars for the boolean fields
docker ex[...redacted 226 bytes]


cd ~/projects/openwebui && docker compose down 2>&1


cd ~/projects/openwebui && docker compose up -d 2>&1


sleep 15 && curl -s http://127.0.0.1:3081/health 2>&1
echo "---"
docker exec ope[...redacted 369 bytes]


sleep 20 && docker logs open-webui --tail 10 2>&1


docker exec open-webui getent hosts host.docker.internal 2>&1
echo "---"
docker [...redacted 49 bytes]


# Test if llama-swap is reachable from inside the container
docker exec open-web[...redacted 164 bytes]


docker exec open-webui curl -4 --connect-timeout 3 -s http://172.19.0.1:9292/v1/[...redacted 25 bytes]


# Check WUI status now
sleep 5
curl -s http://127.0.0.1:3081/health 2>&1
echo "-[...redacted 148 bytes]


echo "=== CURRENT LLAMA-SWAP ==="
ps aux | grep llama-swap | grep -v grep 2>&1
e[...redacted 323 bytes]


echo "=== PID 120548 (standalone) ==="
ps -p 120548 -o pid,etime,cmd --no-header[...redacted 277 bytes]


# Gracefully kill standalone llama-swap - it will clean up its child model proce[...redacted 536 bytes]


nvidia-smi --query-gpu=memory.used,memory.total,utilization.gpu,utilization.memo[...redacted 144 bytes]


sudo systemctl enable llama-swap 2>&1
echo "---"
sudo systemctl reset-failed lla[...redacted 328 bytes]


# Manually check what the watchdog would report
echo "systemctl is-active: $(sys[...redacted 281 bytes]


sudo systemctl restart llama-swap 2>&1
echo "---"
sleep 5
systemctl is-active ll[...redacted 171 bytes]


# Trigger model load by asking for a completion on the 35B model
curl -s -X POST[...redacted 387 bytes]


# Benchmark: generate 200 tokens and report speed
curl -s -X POST http://127.0.0[...redacted 724 bytes]


# Check model metrics endpoint for speed data
curl -s http://127.0.0.1:9292/v1/m[...redacted 1047 bytes]


nvidia-smi --query-gpu=memory.used,memory.total,utilization.gpu,utilization.memo[...redacted 474 bytes]


sudo systemctl restart llama-swap 2>&1
echo "---"
sleep 3
nvidia-smi --query-gpu[...redacted 175 bytes]


echo "=== Qwen3.6 35B MTP ==="
time curl -s -X POST http://127.0.0.1:9292/v1/cha[...redacted 656 bytes]


nvidia-smi --query-gpu=memory.used,memory.total,utilization.gpu,utilization.memo[...redacted 778 bytes]


echo "=== Gemma 4 12B ==="
time curl -s -X POST http://127.0.0.1:9292/v1/chat/co[...redacted 1172 bytes]


python3 -c "
import json
for f, name in [('/tmp/bench_g12.json','Gemma 12B'),('/[...redacted 1142 bytes]


echo "=== Qwen3.5 9B MTP ==="
time curl -s -X POST http://127.0.0.1:9292/v1/chat[...redacted 1332 bytes]


python3 -c "
import json
data = {
    'qwen35-9b-mtp': '/tmp/bench_q35.json',
  [...redacted 474 bytes]


# Proper gemma-12b bench - force load it (reset others)
curl -s -X POST http://1[...redacted 1472 bytes]


# Final GPU and speed summary
nvidia-smi --query-gpu=memory.used,memory.total,ut[...redacted 526 bytes]


# Get qwen35-9b-mtp warm speed (17.4s run had longer prompt)
curl -s -X POST htt[...redacted 695 bytes]


python3 -c "
# Final compiled results
results = [
    ('gemma-12b',       200,  [...redacted 533 bytes]


# Check what gemma-26b model file we have
ls -la /models/downloads/gemma-4-26B-A[...redacted 345 bytes]


# Check if llama-quantize is bundled with our llama.cpp
find /usr/local -name "l[...redacted 652 bytes]


cd /models/downloads && python3 -c "
from huggingface_hub import hf_hub_download[...redacted 393 bytes]


# Check metadata of the current gemma-26b model
python3 -c "
import struct, os
p[...redacted 1342 bytes]


# Check what files are in the repo
curl -s "https://huggingface.co/api/models/me[...redacted 293 bytes]


# Check what files are in the spicyricecaker repo
curl -s "https://huggingface.c[...redacted 310 bytes]


# Try downloading from spicyricecaker
cd /models/downloads && python3 -c "
from [...redacted 496 bytes]


# Check if we have the llama-quantize binary anywhere
find / -name "llama-quanti[...redacted 635 bytes]


cd /models/downloads && python3 << 'PYEOF'
from huggingface_hub import hf_hub_do[...redacted 342 bytes]


# While downloading, prepare llama-quantize as backup
cd /home/rurouni/src/llama[...redacted 370 bytes]


ls -lh /models/downloads/gemma-4-26b-a4b-it-q4_k_m.gguf 2>&1
echo "---"
ls -lh /[...redacted 141 bytes]


# Kill the stalled download
kill 326632 2>/dev/null
echo "Killed"
# Try majentik[...redacted 387 bytes]


# Build llama-quantize from existing source
cd /home/rurouni/src/llama.cpp && ls[...redacted 513 bytes]


# Build quantize without CUDA (only needs CPU for quantization)
cd /home/rurouni[...redacted 265 bytes]


cd /home/rurouni/src/llama.cpp/build-quantize-cpu && cmake --build . --target he[...redacted 177 bytes]


/home/rurouni/src/llama.cpp/build-quantize-cpu/bin/llama-quantize --help 2>&1 | [...redacted 151 bytes]


# Try wget directly on the spicyricecaker file
curl -L -o /dev/null -s -w "Size:[...redacted 235 bytes]


cd /models/downloads && nice -n 19 \
  /home/rurouni/src/llama.cpp/build-quantiz[...redacted 142 bytes]


ps aux | grep 'llama-swap' | grep -v grep


sudo systemctl restart llama-swap && sleep 2 && systemctl status llama-swap --no[...redacted 20 bytes]


curl -s http://localhost:9292/props | python3 -m json.tool | grep -E '"id"|"name[...redacted 13 bytes]


curl -s http://localhost:9292/v1/models | python3 -m json.tool 2>/dev/null || cu[...redacted 37 bytes]


sudo systemctl restart llama-swap && sleep 3 && curl -s http://localhost:9292/v1[...redacted 30 bytes]


curl -s http://localhost:9292/v1/chat/completions \
  -H 'Content-Type: applicat[...redacted 417 bytes]


free -h && nvidia-smi --query-gpu=memory.used,memory.total,temperature.gpu --for[...redacted 16 bytes]


# Benchmark gemma-26b baseline: measure TTFT + tokens/sec
curl -s -w "\n---HTTP_[...redacted 874 bytes]


nvidia-smi --query-gpu=utilization.gpu,memory.used,utilization.memory --format=c[...redacted 11 bytes]


curl -s http://localhost:9292/v1/chat/completions   -H 'Content-Type: applicati[...redacted 206 bytes]


sudo systemctl restart llama-swap && sleep 3 && curl -s http://localhost:9292/v1[...redacted 99 bytes]


curl -s --max-time 60 http://localhost:9292/v1/chat/completions \
  -H 'Content-[...redacted 163 bytes]


ps aux | grep llama-server | grep -v grep


curl -s --max-time 120 http://localhost:9292/v1/chat/completions \
  -H 'Content[...redacted 348 bytes]


journalctl -u llama-swap --no-pager -n 50 --since "5 min ago" 2>/dev/null | tail[...redacted 4 bytes]


sudo -u rurouni timeout 10 /usr/local/bin/llama-server-sm75 \
  -m /models/downl[...redacted 519 bytes]


sudo -u rurouni timeout 15 /usr/local/bin/llama-server-sm75 \
  -m /models/downl[...redacted 505 bytes]


# Warmup - force model load
curl -s --max-time 120 http://localhost:9292/v1/chat[...redacted 192 bytes]


# Check VRAM
nvidia-smi --query-gpu=utilization.gpu,memory.used,utilization.memo[...redacted 24 bytes]


# Benchmark: 150 token generation
curl -s -w '\n---TIME:%{time_total}---' \
  ht[...redacted 817 bytes]


nvidia-smi --query-gpu=utilization.gpu,memory.used,utilization.memory,temperatur[...redacted 27 bytes]


sudo systemctl restart llama-swap && sleep 3 && curl -s --max-time 90 http://loc[...redacted 211 bytes]


# n-cpu-moe=8 benchmark
curl -s -w '\n---TIME:%{time_total}---' \
  http://local[...redacted 601 bytes]


journalctl -u llama-swap --no-pager -n 15 --since "1 min ago" 2>/dev/null


sudo -u rurouni timeout 10 /usr/local/bin/llama-server-sm75 \
  -m /models/downl[...redacted 504 bytes]


# batch 2048 benchmark
curl -s -w '\n---TIME:%{time_total}---' \
  http://localh[...redacted 610 bytes]


sudo systemctl restart llama-swap && sleep 3 && curl -s --max-time 90 http://loc[...redacted 204 bytes]


# Final verification - benchmark + GPU stats
echo "=== FINAL BENCH ==="
curl -s [...redacted 636 bytes]


# Verify llama-swap is running with correct models
curl -s http://localhost:9292[...redacted 107 bytes]


# Check if Open WebUI lists gemma-26b
curl -s http://localhost:3081/api/models -[...redacted 309 bytes]


docker exec open-webui sh -c 'ls /app/backend/data/' 2>/dev/null | head -10


# Try to login to Open WebUI to get a token
curl -s -X POST http://localhost:308[...redacted 328 bytes]


# Check Open WebUI model list via its admin API (no auth needed for health)
curl[...redacted 202 bytes]


# Check if I can find the admin password from the DB
docker exec open-webui sh -[...redacted 100 bytes]


# Copy the DB out and check admin credentials
docker cp open-webui:/app/backend/[...redacted 126 bytes]


python3 -c "
import sqlite3
conn = sqlite3.connect('/tmp/webui.db')
cur = conn.c[...redacted 250 bytes]


python3 -c "
import sqlite3
conn = sqlite3.connect('/tmp/webui.db')
cur = conn.c[...redacted 251 bytes]


python3 -c "
import sqlite3
conn = sqlite3.connect('/tmp/webui.db')
cur = conn.c[...redacted 159 bytes]


python3 -c "
import sqlite3
conn = sqlite3.connect('/tmp/webui.db')
cur = conn.c[...redacted 196 bytes]


python3 -c "
import sqlite3
conn = sqlite3.connect('/tmp/webui.db')
cur = conn.c[...redacted 110 bytes]


python3 -c "
import sqlite3
conn = sqlite3.connect('/tmp/webui.db')
cur = conn.c[...redacted 204 bytes]


python3 -c "
import sqlite3, uuid, secrets
conn = sqlite3.connect('/tmp/webui.db[...redacted 550 bytes]


# Copy updated DB back to container and restart
docker cp /tmp/webui.db open-web[...redacted 91 bytes]


# Get the actual API key
python3 -c "
import sqlite3
conn = sqlite3.connect('/tm[...redacted 144 bytes]


python3 << 'PYEOF'
import sqlite3
conn = sqlite3.connect('/tmp/webui.db')
cur = [...redacted 139 bytes]


sqlite3 /tmp/webui.db "SELECT hex(key) FROM api_key ORDER BY created_at DESC LIM[...redacted 246 bytes]


# Use the API key to check Open WebUI model list
curl -s http://localhost:3081/a[...redacted 178 bytes]


KEY=$(python3 -c "
import sqlite3
conn = sqlite3.connect('/tmp/webui.db')
cur = [...redacted 346 bytes]


pip install werkzeug -q && python3 /tmp/set_password.py


python3 -c "
import sqlite3
conn = sqlite3.connect('/tmp/webui.db')
cur = conn.c[...redacted 101 bytes]


python3 -c "import bcrypt; print('bcrypt available')" 2>/dev/null || echo "no bc[...redacted 5 bytes]


python3 -c "
import sqlite3
conn = sqlite3.connect('/tmp/webui.db')
cur = conn.c[...redacted 474 bytes]


# Check if Open WebUI can reach llama-swap
docker exec open-webui curl -s --max-[...redacted 151 bytes]


docker exec open-webui sh -c 'curl -v --max-time 5 http://host.docker.internal:9[...redacted 30 bytes]


# Check what llama-swap is listening on
ss -tlnp | grep 9292

# Check if docker [...redacted 126 bytes]


# Check the actual gateway for Open WebUI
docker inspect open-webui --format '{{[...redacted 76 bytes]


# Check host.docker.internal resolution and test connectivity
docker exec open-w[...redacted 336 bytes]


# Check if the host can reach itself on the compose bridge
curl -s --connect-tim[...redacted 218 bytes]


# Check container routing
docker exec open-webui sh -c '
ip route | head -5
echo[...redacted 67 bytes]


# Check if container can reach host LAN IP
docker exec open-webui sh -c 'wget -q[...redacted 67 bytes]


# Retry 192.168.1.50 with longer timeout
docker exec open-webui curl -s --connec[...redacted 76 bytes]


cd /home/rurouni/projects/openwebui && docker compose up -d


sleep 3 && docker ps --filter name=open-webui --format '{{.Status}}' && docker e[...redacted 100 bytes]


sleep 10 && docker ps --filter name=open-webui --format '{{.Status}}' && echo "-[...redacted 115 bytes]


# Check the host.docker.internal resolution
docker exec open-webui sh -c 'cat /e[...redacted 28 bytes]


# Wait for health and retry
sleep 15 && docker ps --filter name=open-webui --for[...redacted 17 bytes]


# Test from container with verbose curl
docker exec open-webui curl -v --connect[...redacted 84 bytes]


# Check iptables rules for the compose bridge network
sudo iptables -L DOCKER-US[...redacted 148 bytes]


sudo ufw status verbose 2>/dev/null | head -20


# Allow Docker compose bridge to reach host port 9292
sudo ufw route allow in on[...redacted 48 bytes]


docker exec open-webui curl -s --connect-timeout 5 --max-time 10 http://host.doc[...redacted 42 bytes]


# Check the new UFW rule and test
sudo ufw status verbose | grep -i "9292\|docke[...redacted 195 bytes]


# Need to allow incoming on the bridge interface too
sudo ufw allow in on br-02a[...redacted 41 bytes]


docker ps --filter name=open-webui --format '{{.Status}}'


# Try login with common passwords
for pw in admin admin123 password; do
  result[...redacted 618 bytes]


# Generate a bcrypt hash using the container's Python
NEW_HASH=$(docker exec ope[...redacted 141 bytes]


# Copy DB out, update password, copy back
docker cp open-webui:/app/backend/data[...redacted 450 bytes]


python3 << 'PYEOF'
import json, urllib.request

data = json.dumps({"email": "adm[...redacted 572 bytes]


sleep 10 && docker ps --filter name=open-webui --format '{{.Status}}'


# Login and check models
TOKEN=$(curl -s -X POST http://localhost:3081/api/v1/au[...redacted 489 bytes]


# Generate hash directly inside container and write to a file
docker exec open-w[...redacted 155 bytes]


# Copy DB out, update with clean hash, copy back
docker cp open-webui:/app/backe[...redacted 490 bytes]


# Check what endpoints llama-swap supports
curl -s http://localhost:9292/api/tag[...redacted 145 bytes]


# Check config table for OpenAI API settings
python3 << 'PYEOF'
import sqlite3, [...redacted 488 bytes]


python3 << 'PYEOF'
import sqlite3, json
conn = sqlite3.connect('/tmp/webui3.db')[...redacted 374 bytes]


# Check what Open WebUI recognizes for OpenAI API
docker exec open-webui sh -c '[...redacted 59 bytes]


cd /home/rurouni/projects/openwebui && docker compose up -d


sleep 15 && docker ps --filter name=open-webui --format '{{.Status}}'