[2026-05-29] remove processed wiki/ files (content patched into vault)
This commit is contained in:
Vendored
+1
-1
@@ -17,6 +17,6 @@
|
||||
"repelStrength": 10,
|
||||
"linkStrength": 1,
|
||||
"linkDistance": 250,
|
||||
"scale": 0.4474580608569524,
|
||||
"scale": 0.29629629629629894,
|
||||
"close": false
|
||||
}
|
||||
@@ -303,6 +303,8 @@ Systemd user service (`/etc/systemd/user/saves-backup.service`):
|
||||
- XNA 4.0: `/run/media/bazzite/Windows/Program Files (x86)/Microsoft XNA/`
|
||||
- .NET 4.0: `/run/media/bazzite/Windows/Microsoft.NET/Framework64/v4.0.30319/`
|
||||
- Discworld Noir source: `/run/media/bazzite/Data/downloads/zatmenie v2 [torrents.ru]/`
|
||||
- **Discworld Noir (скачан 2026-05-29):** `/run/media/bazzite/Data/downloads/Discworld Noir.isz` (ISZ, 1.1GB, Alcohol 120%)
|
||||
- **Discworld (оригинал, скопирован 2026-05-29):** `/run/media/bazzite/Data/downloads/DISCWORLD.iso` (ISO, 434MB) — с TrueNAS `/mnt/RED_2TB/backup/Downloads/Distr/games/DISCWORLD.iso`
|
||||
- FFX settings: `/run/media/bazzite/Windows/Users/mallexxx/documents/square enix/...`
|
||||
|
||||
## Open Questions
|
||||
|
||||
@@ -229,6 +229,20 @@ Imported 185 torrents from Windows Transmission-daemon into HTPC Transmission.
|
||||
|
||||
10 torrents had no data (X:\Movies\ — lost disk, permanently gone).
|
||||
|
||||
## Sudo / Пароль
|
||||
|
||||
Пароль пользователя `bazzite`: **`bazzite`**
|
||||
|
||||
Для удалённых команд через SSH:
|
||||
```bash
|
||||
ssh bazzite@192.168.1.86 'echo bazzite | sudo -S mount ...'
|
||||
```
|
||||
|
||||
Также настроен sudo без пароля для systemctl (см. [[htpc-magic4pc#Деплой и sudoers]]):
|
||||
```
|
||||
bazzite ALL=(ALL) NOPASSWD: /usr/bin/systemctl
|
||||
```
|
||||
|
||||
## OSTree / Обновления
|
||||
- `/usr/local/bin` слетает при `rpm-ostree` upgrade (новый `/usr` overlay)
|
||||
- Бинари держать в `/home/bazzite/` или пересобирать после обновлений
|
||||
|
||||
@@ -1,161 +0,0 @@
|
||||
---
|
||||
title: Watchlist Automation — Полный Flow
|
||||
namespace: personal
|
||||
created: '2026-05-20'
|
||||
updated: '2026-05-27'
|
||||
last_synced: '2026-05-27'
|
||||
type: concept
|
||||
tags:
|
||||
- kraken
|
||||
- watchlist
|
||||
- automation
|
||||
- synthesis
|
||||
confidence: 0.9
|
||||
---
|
||||
# Watchlist Automation — Полный Flow
|
||||
|
||||
Синтез: как `family/documents/movies-watchlist.md` превращается в скачанный контент. Объединяет [[tech/arr-stack-kraken]], [[concepts/kraken-media-stack]], [[tech/hermes-docker-kraken]].
|
||||
|
||||
## Полная цепочка
|
||||
|
||||
```
|
||||
[вс 09:00] watchlist-discover ← KP API топ фильмов 2024-2025
|
||||
↓ добавляет в секцию "Новинки 👍/👎"
|
||||
movies-watchlist.md
|
||||
Alex ставит 👍 / 👎
|
||||
↓
|
||||
[ежедн 09:00] watchlist-resolve ← SSH Кракен → resolve → commit
|
||||
[ежедн 10:00] watchlist-sync-down
|
||||
→ process-thumbs (перемещает 👍 → начало списка)
|
||||
→ sync-down (добавляет батч в Radarr/Sonarr)
|
||||
↓
|
||||
Radarr (7878) / Sonarr (8989)
|
||||
→ Prowlarr (9696) → RuTracker / Kinozal(M) / NoNaMe / etc.
|
||||
→ Transmission (9091)
|
||||
→ /media/movies-radarr или /media/series-sonarr
|
||||
↓
|
||||
router.py (Custom Script) → читает жанры из NFO/TMDb
|
||||
→ symlink в /media/{movies,cartoons,documentaries,...}/
|
||||
↓
|
||||
Jellyfin (8096) → rescan → виден контент
|
||||
```
|
||||
|
||||
## Статусы в movies-watchlist.md
|
||||
|
||||
| Символ | Значение | Действие |
|
||||
|--------|---------|---------|
|
||||
| `[ ]` | не смотрел, в очереди | sync-down добавляет в Radarr/Sonarr |
|
||||
| `[x]` | просмотрено | sync-up из Jellyfin watched history |
|
||||
| `⬇️` | добавлено в Radarr/Sonarr | ждёт скачки |
|
||||
| `👍` | нравится (новинка) | process-thumbs переносит в начало → попадёт в sync-down |
|
||||
| `👎` | не хочу (новинка) | process-thumbs перемещает в `## Новинки👎` |
|
||||
| `🗓️` | upcoming (ещё не вышел) | discover помечает, не скачивается |
|
||||
| `❓` | не найдено / ambiguous | ждёт ручного уточнения |
|
||||
| `🧟♀️` | horror (genre_id=27) | информационный маркер |
|
||||
|
||||
## Структура секций movies-watchlist.md
|
||||
|
||||
```
|
||||
## Новинки - 👍/👎 ← discover добавляет сюда
|
||||
## Фильмы ← основной список, отступ 2 пробела ( - [ ])
|
||||
## Мультфильмы
|
||||
## Аниме
|
||||
## Новинки👎 ← ← без пробела перед 👎
|
||||
## Связанные заметки
|
||||
```
|
||||
|
||||
**Важно:** `process_thumbs` автоматически определяет отступ из `## Фильмы` и сохраняет при переносе. `SECTION_THUMBDN = "## Новинки👎"` (без пробела) — должно точно совпадать с заголовком.
|
||||
|
||||
## Cron Jobs (2026-05-27: migrated to Kraken)
|
||||
|
||||
Watchlist pipeline runs entirely on Kraken (migrated from Eagle 2026-05-27).
|
||||
Eagle previously ran `watchlist-nightly` via SSH; now Kraken runs it locally.
|
||||
|
||||
| Job | Расписание | Хост | Скрипт |
|
||||
|-----|-----------|------|--------|
|
||||
| `watchlist-nightly` | ежедн. 01:00 | Kraken | `~/.hermes/scripts/watchlist-nightly.sh` |
|
||||
| `watchlist-discover` | вс 09:00 | Kraken | `~/.hermes/scripts/watchlist-discover.sh` |
|
||||
|
||||
**watchlist-nightly.sh** (на Kraken):
|
||||
1. `sync-vault.sh` (pull) → `process-thumbs --apply` → `sync-vault.sh` (push)
|
||||
2. `resolve --recheck --apply` → `sync-down --apply --batch 5` → `sync-up --apply` → `sync-vault.sh` (push)
|
||||
|
||||
**Paths on Kraken HDD (UUID 49e8f586-3839-4c5d-a1e1-58bfc3579ade):**
|
||||
- `/home/kraken/obsidian` → symlink to `/srv/dev-disk-by-uuid-.../obsidian`
|
||||
- watchlist-sync: `/srv/dev-disk-by-uuid-.../Developer/watchlist-sync`
|
||||
|
||||
## Discover — Фильтрация
|
||||
|
||||
| Тип | Порог |
|
||||
|-----|-------|
|
||||
| Мировые | IMDb ≥ 7.0 или KP ≥ 7.0 |
|
||||
| Российские | KP ≥ 8.5 (защита от накрутки) |
|
||||
| Upcoming | год ≥ текущий−1 |
|
||||
| Минимум голосов | IMDb ≥ 1000 или KP ≥ 500 |
|
||||
|
||||
KP API endpoint: `https://api.poiskkino.dev/v1.4/movie` (redirect с api.kinopoisk.dev).
|
||||
|
||||
## *arr Stack — Индексеры (Prowlarr)
|
||||
|
||||
| ID | Имя | Тип | Примечание |
|
||||
|----|-----|-----|-----------|
|
||||
| 1 | RuTracker | semi-private | блокирует при rate limit на сутки |
|
||||
| 2 | RuTor | public | поиск по imdbid |
|
||||
| 3 | Byrutor | public | |
|
||||
| 4 | NoNaMe Club | semi-private | анонимный |
|
||||
| 5 | Kinozal | semi-private | резерв |
|
||||
| 6 | Kinozal (M) | semi-private | магнет ✅ — без grab limit, **предпочтительный** |
|
||||
|
||||
**Pi-hole pitfall:** блокирует `skyhook.sonarr.tv` → Sonarr/Radarr поиск молча не запускается. Фикс: `dns: [8.8.8.8]` в docker-compose.yml.
|
||||
|
||||
## Router Script — Маршрутизация по жанру
|
||||
|
||||
После импорта Sonarr/Radarr: `router.py --apply` создаёт symlinks:
|
||||
- Animation (не R/18+) → `/media/cartoons/` или `/media/cartoons-series/`
|
||||
- Documentary → `/media/documentaries/` или `/media/documentaries-series/`
|
||||
- Прочее → `/media/movies/` или `/media/series/`
|
||||
|
||||
Kopirует NFO + постер рядом с symlink (Jellyfin не видит метадату через symlink напрямую).
|
||||
|
||||
## Open Tasks (2026-05-20)
|
||||
|
||||
- 🟡 Передавать Transmission locations через router script при каждом импорте (сейчас вручную)
|
||||
- 🔴 rsync невыполненных фильмов с HTPC на Кракен (`Фильмы не перенесенные с htpc на кракен.md`)
|
||||
- 🟡 Watchlist sync-up: добавить перенесённые фильмы в нужные разделы
|
||||
|
||||
## Pitfalls
|
||||
|
||||
### KP Markdown Link Parsing Bug
|
||||
Items added from Kinopoisk with full markdown link syntax
|
||||
`[Title](https://kinopoisk.ru/film/12345/) (2025)` were passed raw to TMDB
|
||||
search → not found → marked `❓` permanently (`not i.ambiguous` skips on
|
||||
next run). Fix: commit `2db1ed9` — extract plain title from markdown links
|
||||
before passing to TMDB. Items incorrectly marked ❓ require manual `--recheck`.
|
||||
|
||||
### KP API Endpoint
|
||||
`api.kinopoisk.dev` redirects to `api.poiskkino.dev/v1.4/movie`. Use the
|
||||
redirect destination directly to avoid DNS issues.
|
||||
|
||||
## watchlist-sync — Python CLI
|
||||
|
||||
Репо: `~/Developer/watchlist-sync` (GitHub: `mallexxx/watchlist-sync`).
|
||||
|
||||
```
|
||||
watchlist-sync resolve — TMDB + KP API → ID, тип (movie/tv)
|
||||
watchlist-sync sync-down — добавить батч (max 5) в Radarr/Sonarr, поставить ⬇️
|
||||
watchlist-sync sync-up — Jellyfin watched → [x] в .md
|
||||
```
|
||||
|
||||
**Резолвер:** TMDB `/search/multi` + KP fallback. Пороги: `min_rating: 6.0`, `min_score: 0.75`. При 2+ кандидатах → `❓` (LLM разрешает в cron каждые 6ч, нерешённые → уточнение в Zulip).
|
||||
|
||||
**Stage 2 (после ≥50 просмотров):** AI-curated recommendations — три списка (с женой / один / семья) на основе TMDB профиля, добавляются в конец watchlist как `## 🤖 Рекомендации (YYYY-WNN)`.
|
||||
|
||||
Jellyfin library mapping: Movies → `movies`, Cartoons → `mixed` (movies + episodes).
|
||||
|
||||
## See Also
|
||||
|
||||
- [[tech/arr-stack-kraken]] — детальные питфоллы *arr стека
|
||||
- [[tech/arr-stack-taiga]] — *arr stack на Тайге (аналогичная архитектура)
|
||||
- [[concepts/kraken-media-stack]] — полная архитектура медиасервера
|
||||
- [[tech/hermes-docker-kraken]] — Hermes на Кракене
|
||||
- [[tech/jellyfin-transcode-rpi5]] — Jellyfin PGS/ASS питфоллы
|
||||
@@ -1,195 +0,0 @@
|
||||
---
|
||||
title: HTPC — magic4pc (LG Magic Remote)
|
||||
created: '2026-05-28'
|
||||
updated: '2026-05-29'
|
||||
type: tech
|
||||
namespace: family
|
||||
tags: [htpc, how-to, pitfalls]
|
||||
sources:
|
||||
- family/how-to/htpc-magic4pc.md
|
||||
- family/how-to/magic4pc-webos.md
|
||||
confidence: medium
|
||||
related:
|
||||
- "[[htpc-bazzite-proton]]"
|
||||
- "[[tech/htpc-steam-emulators]]"
|
||||
- "[[tech/tv-luna-send]]"
|
||||
---
|
||||
|
||||
# HTPC — magic4pc (LG Magic Remote)
|
||||
|
||||
Go-client for using the LG Magic Remote (webOS TV app) as HTPC
|
||||
mouse/keyboard input. Fork: `mallexxx/magic4pc_altclient` branch
|
||||
`bazzite-linux`.
|
||||
|
||||
LG TV: `192.168.1.75`, HTPC: `192.168.1.86`.
|
||||
|
||||
## Architecture
|
||||
|
||||
- **TV server**: webOS app on LG TV → sends UDP to fixed source
|
||||
port **9106**
|
||||
- **HTPC client**: `/usr/local/bin/magic4pc`, UDP listener
|
||||
- **xdotool**: single persistent process via stdin pipe (mouse +
|
||||
keyboard)
|
||||
- **ydotool**: gamescope-specific keys (Ctrl+1, Ctrl+2) via
|
||||
`/run/user/1000/.ydotool_socket`
|
||||
|
||||
Session detection:
|
||||
- `isGamescopeSession()` — scans `/proc/*/cmdline` for `kwin_wayland`;
|
||||
if absent → gamescope (Steam Big Picture mode)
|
||||
- `activeDisplay()` — KDE uses Xwayland display from kwin args; gamescope
|
||||
uses `:1` (game) if visible windows present, else `:0` (Steam BP)
|
||||
|
||||
## Button Mapping
|
||||
|
||||
| Button | Keycode | Gamescope | KDE Desktop |
|
||||
|--------|---------|-----------|-------------|
|
||||
| Red | 403 | Ctrl+1 (Steam menu) | Super |
|
||||
| Green | 404 | Escape | Escape |
|
||||
| Yellow | 405 | Ctrl+2 (Steam QAM) | Middle click |
|
||||
| Blue | 406 | Right click | Right click |
|
||||
| Back | 461 | Mouse X1 | Mouse X1 |
|
||||
| D-pad | 37-40 | Arrow keys | Arrow keys |
|
||||
| Ch+/Ch- | 33/34 | PageUp/Down | PageUp/Down |
|
||||
| Play/Stop/Pause | 415/413/19 | XF86Audio* | XF86Audio* |
|
||||
| Touch (swipe) | — | mousemove (scaled) | mousemove |
|
||||
| Tap | — | Left click | Left click |
|
||||
|
||||
## Mouse Coordinate Mapping
|
||||
|
||||
TV sends coordinates in 0–1920 × 0–1080 space.
|
||||
|
||||
**In gamescope:** uses letterbox algorithm.
|
||||
1. Find active window: (a) under cursor via `getmouselocation`, or
|
||||
(b) largest bounding-box window (non-popup, highest ID)
|
||||
2. Compute 16:9 letterbox viewport from window width:
|
||||
`lb_h = win_w * 9/16`
|
||||
3. Compute offset: `off_y = -(lb_h - win_h) / 2`
|
||||
4. Map: `x11_x = tv_x * scale + off_x`; clip negatives to 0
|
||||
|
||||
**In KDE:** `getdisplaygeometry` → scale = display / 1920×1080.
|
||||
|
||||
## Key Pitfalls
|
||||
|
||||
| Problem | Fix |
|
||||
|---------|-----|
|
||||
| TV "service error" / won't reconnect | Fixed source UDP port 9106 |
|
||||
| TV stuck "waiting for client" | Server keepalive timeout 10s |
|
||||
| KDE XTest prompt on every click | Single persistent xdotool process |
|
||||
| KDE XTest prompt after xdotool restart | `XwaylandEisNoPrompt=true` in kwinrc |
|
||||
| Wrong mouse coordinates | Dynamic scale via `xdotool getdisplaygeometry` |
|
||||
| Binary lost after `rpm-ostree upgrade` | Rebuild and redeploy |
|
||||
|
||||
## Deploy
|
||||
|
||||
```bash
|
||||
# Build on Mac
|
||||
cd ~/Developer/magic4pc_altclient
|
||||
GOOS=linux GOARCH=amd64 go build -o magic4pc .
|
||||
|
||||
# Copy + restart on HTPC
|
||||
scp magic4pc htpc:/home/bazzite/magic4pc/magic4pc
|
||||
echo bazzite | sudo -S systemctl stop magic4pc.service
|
||||
echo bazzite | sudo -S cp /home/bazzite/magic4pc/magic4pc \
|
||||
/usr/local/bin/magic4pc
|
||||
echo bazzite | sudo -S systemctl start magic4pc.service
|
||||
```
|
||||
|
||||
Sudoers rule (no-password systemctl):
|
||||
```
|
||||
bazzite ALL=(ALL) NOPASSWD: /usr/bin/systemctl
|
||||
```
|
||||
|
||||
## WebOS TV App — Build & Deploy
|
||||
|
||||
The TV-side is a React/Enact WebOS app + Node.js service bundled into
|
||||
an IPK. Sources: `~/Developer/magic4pc/webos/`.
|
||||
|
||||
### Build
|
||||
|
||||
```bash
|
||||
cd ~/Developer/magic4pc/webos
|
||||
NODE_OPTIONS=--openssl-legacy-provider npm run build
|
||||
```
|
||||
|
||||
**Pitfall:** `--openssl-legacy-provider` is required — the old webpack
|
||||
is incompatible with Node.js 25+.
|
||||
|
||||
### Package IPK
|
||||
|
||||
```bash
|
||||
/Users/admin/webOS_TV_SDK/CLI/bin/ares-package dist/ service/ --outdir .
|
||||
```
|
||||
|
||||
**Pitfall:** both `dist/` and `service/` arguments are required —
|
||||
omitting `service/` excludes the Node.js service from the IPK.
|
||||
**Pitfall:** `npm run package` = `ares-package -n` (unsigned) — TV
|
||||
rejects unsigned packages. Use the SDK command directly.
|
||||
|
||||
### Deploy (deploy.sh)
|
||||
|
||||
```bash
|
||||
cd ~/Developer/magic4pc/webos && ./deploy.sh
|
||||
```
|
||||
|
||||
Script flow: build → package → scp → close → remove → install → launch.
|
||||
Uses [[tech/tv-luna-send]] wrapper for close/remove/launch.
|
||||
For install (subscribe mode) — direct `ssh+script` with polling on
|
||||
`"state":"installed"`.
|
||||
|
||||
**Pitfall:** `ares-install` / `ares-launch` are unreliable — they don't
|
||||
wait for completion. Use `luna-send dev/install` via `script` wrapper.
|
||||
|
||||
### Version in UI
|
||||
|
||||
Displayed as `1.1.0 (YYYY-MM-DD HH:MM)` — injected by webpack at
|
||||
build time via `process.env.BUILD_DATE`.
|
||||
|
||||
## Auto-launch on Boot/Wake
|
||||
|
||||
Magic4pc launches a configured app when the TV boots or wakes.
|
||||
|
||||
| File | Location | Purpose |
|
||||
|------|----------|---------|
|
||||
| `magic4pc-settings` | PERSISTENT_DIR | Selected app ID |
|
||||
| `magic4pc-last-app` | PERSISTENT_DIR | Last foreground app |
|
||||
| `magic4pc-run-state` | `/tmp/` | `running` after first launch |
|
||||
|
||||
`PERSISTENT_DIR = /media/developer/apps/usr/palm/services/me.wouterdek.magic4pc.service`
|
||||
|
||||
Logic:
|
||||
- **Boot/wake:** `/tmp` is cleared → no `run-state` → `freshStart=true`
|
||||
→ launches configured app
|
||||
- **Manual launch:** `run-state=running` already present → skips auto-launch
|
||||
|
||||
The `init.d` script on TV (`/var/lib/webosbrew/init.d/magic4pc`) removes
|
||||
`run-state` on suspend so wake triggers fresh launch. Always edit in
|
||||
repo (`tv-scripts/init.d-magic4pc.sh`), never directly on TV.
|
||||
|
||||
## WebOS Back Key + System Keyboard
|
||||
|
||||
When the system keyboard is open, **Back #1** is consumed by the OS
|
||||
(closes keyboard) — the `keydown` DOM event and `onButtonDown` are
|
||||
**not** fired. **Back #2** arrives normally.
|
||||
|
||||
Fix used in `MainPanel.js` (`_kbWasOpen` flag):
|
||||
|
||||
```js
|
||||
// Input.onActivate:
|
||||
this._kbWasOpen = true;
|
||||
|
||||
// onButtonDown on Back:
|
||||
if (this.state.wolMacActive || this._kbWasOpen) {
|
||||
this._kbWasOpen = false;
|
||||
return; // suppress panel close
|
||||
}
|
||||
```
|
||||
|
||||
Approaches that don't work: `Popup.noAutoDismiss`, timeout heuristic,
|
||||
polling `document.activeElement` (keyboard is a system overlay, focus
|
||||
never moves to INPUT).
|
||||
|
||||
## See Also
|
||||
|
||||
- [[htpc-bazzite-proton]] — Proton game compatibility on this HTPC
|
||||
- [[tech/htpc-steam-emulators]] — Steam, emulators, gamepad config
|
||||
- [[tech/tv-luna-send]] — luna-send SSH wrapper for WebOS TV commands
|
||||
@@ -1,103 +0,0 @@
|
||||
---
|
||||
title: WebOS TV — luna-send via SSH
|
||||
created: '2026-05-29'
|
||||
updated: '2026-05-29'
|
||||
type: tech
|
||||
namespace: family
|
||||
tags: [htpc, how-to, pitfalls]
|
||||
sources:
|
||||
- family/how-to/tv-luna-send.md
|
||||
- family/how-to/htpc-webos-luna.md
|
||||
confidence: medium
|
||||
related:
|
||||
- "[[tech/htpc-magic4pc]]"
|
||||
- "[[tech/htpc-kodi-layout]]"
|
||||
---
|
||||
|
||||
# WebOS TV — luna-send via SSH
|
||||
|
||||
`luna-send` on WebOS writes output to the TTY, not stdout. SSH without a
|
||||
PTY produces no output. The `script(1)` workaround captures output via a
|
||||
pseudo-TTY.
|
||||
|
||||
TV IP: `192.168.1.75` (aliases: `root@LGwebOSTV`, `root@tv`).
|
||||
|
||||
## The Problem
|
||||
|
||||
```bash
|
||||
ssh root@192.168.1.75 "luna-send -n 1 -f luna://..." # → silent
|
||||
ssh -t root@192.168.1.75 "luna-send -n 1 -f luna://..." # → still silent
|
||||
```
|
||||
|
||||
Root cause: `luna-send` detects whether its stdout is a TTY and refuses to
|
||||
write to a pipe.
|
||||
|
||||
## The Fix: script(1)
|
||||
|
||||
```bash
|
||||
ssh root@192.168.1.75 \
|
||||
"script -q -c \"luna-send -n 1 -f luna://com.webos.applicationManager/running '{}'\" \
|
||||
/tmp/o.txt; cat /tmp/o.txt"
|
||||
```
|
||||
|
||||
`script(1)` allocates a pseudo-TTY and records output to `/tmp/o.txt`.
|
||||
The wrapper then reads the file, filters the Script header/footer lines,
|
||||
and removes the temp file.
|
||||
|
||||
## Wrapper: tv-luna-send.sh
|
||||
|
||||
Location: `~/Automation/tv-luna-send.sh` on Eagle.
|
||||
|
||||
```bash
|
||||
# Usage (same flags as luna-send)
|
||||
~/Automation/tv-luna-send.sh [luna-send flags] luna://service/method 'json'
|
||||
|
||||
# List running apps
|
||||
~/Automation/tv-luna-send.sh \
|
||||
-n 1 -f luna://com.webos.service.applicationmanager/running '{}'
|
||||
|
||||
# Close an app
|
||||
~/Automation/tv-luna-send.sh \
|
||||
-n 1 -f luna://com.webos.service.applicationmanager/closeByAppId \
|
||||
'{"id":"me.wouterdek.magic4pc"}'
|
||||
|
||||
# Launch an app
|
||||
~/Automation/tv-luna-send.sh \
|
||||
-n 1 -f luna://com.webos.applicationManager/launch \
|
||||
'{"id":"me.wouterdek.magic4pc"}'
|
||||
|
||||
# Query magic4pc service status
|
||||
~/Automation/tv-luna-send.sh \
|
||||
-n 1 -f luna://me.wouterdek.magic4pc.service/query '{}'
|
||||
```
|
||||
|
||||
Set `TV_HOST` env to override the default target (`root@LGwebOSTV`).
|
||||
DNS resolves via home router at `192.168.1.1`.
|
||||
|
||||
## Common Luna URIs
|
||||
|
||||
| URI | Purpose |
|
||||
|-----|---------|
|
||||
| `.../applicationmanager/running` | List running apps |
|
||||
| `.../applicationmanager/closeByAppId` | Close app by ID |
|
||||
| `.../appInstallService/dev/install` | Install IPK (subscribe) |
|
||||
| `.../appInstallService/dev/remove` | Remove app |
|
||||
| `.../applicationManager/launch` | Launch app |
|
||||
| `.../applicationManager/getForegroundAppInfo` | Get active app |
|
||||
| `...magic4pc.service/query` | Magic4pc service status |
|
||||
|
||||
Full service prefix: `com.webos.service.applicationmanager`,
|
||||
`com.webos.appInstallService`, `com.webos.applicationManager`.
|
||||
|
||||
## Limitation: Subscribe Mode (-i)
|
||||
|
||||
`luna-send -i` (infinite subscribe, used for `dev/install`) does **not**
|
||||
work through the wrapper — it never terminates normally. The
|
||||
`magic4pc/webos/deploy.sh` handles install directly via `ssh+script` with
|
||||
inline polling for `"state":"installed"`.
|
||||
|
||||
## Where Used
|
||||
|
||||
`magic4pc/webos/deploy.sh` — close, remove, and launch steps in the deploy
|
||||
pipeline. See [[tech/htpc-magic4pc]] for the full magic4pc build and deploy
|
||||
workflow.
|
||||
@@ -1,120 +0,0 @@
|
||||
---
|
||||
title: WireGuard VPN — Eagle to Kraken
|
||||
created: '2026-05-23'
|
||||
updated: '2026-05-23'
|
||||
type: tech
|
||||
namespace: personal
|
||||
tags: [infra, kraken]
|
||||
sources: [family/how-to/wireguard-vpn.md]
|
||||
confidence: high
|
||||
---
|
||||
|
||||
# WireGuard VPN — Eagle to Kraken
|
||||
|
||||
Split-tunnel VPN connecting Eagle (Mac M4, home) to Kraken (RPi5, home) via
|
||||
a VPS relay. Enables SSH to Kraken from anywhere and routes Time Machine
|
||||
backups over the tunnel. Two VPS interfaces avoid hairpin forwarding.
|
||||
|
||||
## Topology
|
||||
|
||||
```
|
||||
Eagle (10.99.0.2) ←→ wg0 VPS (10.99.0.1) ←→ wg1 VPS (10.99.1.1) ←→ Kraken (10.99.1.2)
|
||||
:51820 :51821
|
||||
```
|
||||
|
||||
SNAT rewrites source address: Eagle packets arrive at Kraken with src
|
||||
`10.99.1.1` (VPS wg1), not Eagle's `10.99.0.2`. FORWARD runs wg0→wg1
|
||||
on the VPS with nftables.
|
||||
|
||||
## VPN Addresses
|
||||
|
||||
| Node | VPN IP |
|
||||
|------|--------|
|
||||
| VPS wg0 | 10.99.0.1 |
|
||||
| VPS wg1 | 10.99.1.1 |
|
||||
| Eagle | 10.99.0.2 |
|
||||
| Kraken | 10.99.1.2 |
|
||||
|
||||
`kraken` hostname resolves via dnsmasq on VPS (`DNS = 10.99.0.1` in Eagle's
|
||||
wg0.conf). DNS is scoped to the `kraken` domain only (see DNS section).
|
||||
|
||||
## Persistence
|
||||
|
||||
| Component | Node | How it survives reboot |
|
||||
|-----------|------|------------------------|
|
||||
| wg-quick@wg0 + wg-quick@wg1 | VPS | systemd enabled |
|
||||
| PostUp FORWARD + SNAT rules | VPS | embedded in `/etc/wireguard/wg0.conf` |
|
||||
| nftables (10.99.0.0/16 forward) | VPS | `/etc/nftables.conf`, systemd enabled |
|
||||
| dnsmasq (`kraken` → 10.99.1.2) | VPS | `/etc/dnsmasq.d/vpn-hosts.conf`, systemd enabled |
|
||||
| wg-quick@wg0 | Kraken | systemd enabled |
|
||||
| wg-auto LaunchDaemon | Eagle | `/Library/LaunchDaemons/top.eagle.wg-auto.plist` |
|
||||
|
||||
## Auto-Connect on Eagle
|
||||
|
||||
`/usr/local/bin/wg-auto.sh` polls every 30 seconds via launchd
|
||||
(`StartInterval`, **not** WatchPaths):
|
||||
|
||||
- At home (router MAC `f0:79:59:77:9b:70` visible on ARP) → `wg-quick down`
|
||||
- Off home network → `wg-quick up`
|
||||
|
||||
**Why StartInterval and not WatchPaths:** WatchPaths triggered a race —
|
||||
`wg-quick down` changes DNS via `networksetup`, which writes to
|
||||
`/Library/Preferences/SystemConfiguration/`, which re-fires launchd,
|
||||
tearing the tunnel down immediately after connecting.
|
||||
|
||||
## DNS (Scoped Resolver)
|
||||
|
||||
wg0.conf uses **no global `DNS =`**. PostUp/PostDown manage a
|
||||
macOS scoped resolver for the `kraken` domain only:
|
||||
|
||||
```
|
||||
PostUp = mkdir -p /etc/resolver && \
|
||||
echo "nameserver 10.99.0.1" > /etc/resolver/kraken && \
|
||||
killall -HUP mDNSResponder
|
||||
PostDown = rm -f /etc/resolver/kraken && killall -HUP mDNSResponder
|
||||
```
|
||||
|
||||
Result: only `kraken` resolves via VPS dnsmasq. Global DNS and Wi-Fi IP
|
||||
are untouched — prevents address-bar breakage during tunnel transitions.
|
||||
|
||||
## Time Machine
|
||||
|
||||
| Setting | Value |
|
||||
|---------|-------|
|
||||
| Old destination (broken) | `smb://timemachine@kraken._smb._tcp.local./TimeMachine` |
|
||||
| New destination (working) | `smb://timemachine@kraken/TimeMachine` |
|
||||
|
||||
mDNS (`_smb._tcp.local`) doesn't work off the local LAN. VPN DNS (`kraken`
|
||||
→ 10.99.1.2 via dnsmasq) works from anywhere. Container on Kraken:
|
||||
`mbentley/timemachine:smb`, `restart: unless-stopped`.
|
||||
|
||||
## Public Keys
|
||||
|
||||
| Node | Public Key |
|
||||
|------|------------|
|
||||
| VPS wg0 | `6W6hSw0JFLm0BbyeNp1g7wF7dKKTZmGvPRdir68mz0w=` |
|
||||
| VPS wg1 | `ssRV2497NQ3Lfzvx/FLO0jDlcCXdK/RReJQ36i0yuR8=` |
|
||||
| Eagle | `dDgIjBUNguodOHWoz7iFsImvKhteodHcFWM8mMe4UiE=` |
|
||||
| Kraken | `8kIdCKMIoMsW09/aQX6+pU0SS/rN4PysJL59w17eGRg=` |
|
||||
|
||||
## Diagnostics
|
||||
|
||||
```bash
|
||||
# Eagle — check tunnel state
|
||||
sudo wg show
|
||||
ping kraken
|
||||
|
||||
# VPS
|
||||
ssh root@91.207.28.205 "wg show all"
|
||||
|
||||
# Kraken
|
||||
ssh kraken "sudo wg show"
|
||||
|
||||
# Eagle auto-connect log
|
||||
cat /var/log/wg-auto.log
|
||||
```
|
||||
|
||||
## Related
|
||||
|
||||
- [[tech/kraken-network]] — Kraken SSH access, media volume paths
|
||||
- [[personal-os-architecture]] — Eagle hardware, home infra overview
|
||||
@@ -1,24 +1,19 @@
|
||||
## Inbox Triage — 2026-05-29 (since 2026-05-29 00:00)
|
||||
## Inbox Triage — 2026-05-29 (since 14:39)
|
||||
|
||||
### New / Changed — Action Required
|
||||
|
||||
**[Ship blocker]** — [Ship AI onboarding winner (Treatment B) [0.5d]](https://app.asana.com/0/0/1215009192158955) — Alessandro at 06:11, Costas at 05:12
|
||||
Alessandro flagged that shipping Treatment B *while the tracker-blocker demo experiment is still running* would change the onboarding control flow mid-experiment and compromise data. He laid out two options (1) wait until min sample size then flip remote config to assign new enrollees to New Treatment B; (2) [comment was cut off in snapshot — read the rest in Asana]. Separately Costas confirmed sticking with iPhone-only for now and proposed an iPad-specific project next week.
|
||||
**Action:** Read full Alessandro comment, pick option 1 vs 2 (or counter-propose), reply by EOD. Ack Costas on iPhone-only + add iPad spin-up as agenda item for O-N weekly. This is on your top-priority list and was due May 28 — already 1d overdue.
|
||||
|
||||
**[Close-out check]** — [Disable back button during duck.ai onboarding [1d]](https://app.asana.com/0/0/1215009192158960) — Costas at 06:13
|
||||
Costas says the back button doesn't display in your build and is disabled in Mariia's — proposes closing the task. Your own May 28 comment already asked whether this was still actual.
|
||||
**Action:** Confirm Costas's read, close the task, or reply if you want to keep it open for the debug-menu corner case you raised yesterday. Due today.
|
||||
_None._
|
||||
|
||||
### New / Changed — Monitoring
|
||||
_None._
|
||||
|
||||
- **[NA Analysis: iOS Duck.ai Onboarding Tracker Demo Experiment](https://app.asana.com/0/0/1215186850972358)** — Dax posted enrollment numbers May 28 09:46 (control 7034 / a 7191 / b 7126). No d5-7 app_use conversions yet — flagged as possibly a metric-name issue. Worth checking the metric name when you next look at the experiment, no immediate action.
|
||||
- **[iOS Address onboarding conflicts with unified input…](https://app.asana.com/0/0/1214592943696234)** — Dax auto-applied "Discovery" 3Ds tag (May 28 20:44). Automated, no action.
|
||||
- **[DRI <> Project Advisor async for Demo tracker blocking…](https://app.asana.com/0/0/1213551072611261)** — Alessandro created this for you while OOO (May 28 23:30). FYI; pick it up when you start the async.
|
||||
- **[What is your 1 Must today?](https://app.asana.com/0/0/1215228074847031)** — daily template auto-assigned (due today). Fill when you set priorities.
|
||||
- **Delegated — [Pinned tab activates in other window unpinning](https://app.asana.com/0/0/1210705465887828)** → Juan Pereira pushed due to "Tomorrow" overnight. No action — keep watching.
|
||||
### Nothing new
|
||||
Inbox quiet — nothing new.
|
||||
|
||||
### Notes
|
||||
- 0 @mentions of Alex since 14:39
|
||||
- 0 new assignments to Alex
|
||||
- 0 new human comments on Alex's open tasks or their subtasks
|
||||
- 131 total story events workspace-wide in the window, all on other people's tasks (Tom Strba project-routing, Diego / Federico / Andris on tab-broken bug, Brindy on iOS Maestro update, Dax bot noise) — none touch Alex's scope
|
||||
|
||||
- **STEP 1b/1c skipped**: postgres / envdir not available on this machine, so the cross-scope @mention DB sweep didn't run. Any @mentions on tasks outside `my_tasks` (e.g. tasks where you're a follower-only @mention recipient) are not captured here. The two snapshot comments above (Alessandro, Costas) both @-mention you and are covered.
|
||||
- **Reminder**: Treatment-B Ship Review (gid 1215009192158961) is still open in your delegated list with no movement since May 22 — once you decide on Alessandro's option 1 vs 2, that review will probably need a new request.
|
||||
### Carry-over from prior brief (still open)
|
||||
- **[Ship AI onboarding winner (Treatment B)](https://app.asana.com/0/0/1215009192158955)** — Alessandro's option-1-vs-2 question still awaiting reply (EOD).
|
||||
- **[Disable back button during duck.ai onboarding](https://app.asana.com/0/0/1215009192158960)** — Costas asked to close; awaiting Alex's confirm.
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
# Weekly Review — Week of 2026-05-25
|
||||
|
||||
> Window: Fri 2026-05-22 → Fri 2026-05-29. Shortened week (AFK Wed 2026-05-27 holiday). TP: [iOS Address onboarding conflicts with unified input and ship AI onboarding winner](https://app.asana.com/0/0/1214592943696234).
|
||||
|
||||
### ✅ Moved Forward
|
||||
|
||||
**Closed out last TP — Demo tracker (iOS Duck.ai onboarding)**
|
||||
- Project [iOS: Introduce a new screen that allows usage of the toggle with Search or Duck.ai as default](https://app.asana.com/0/0/1213320237636425) marked complete Tue 2026-05-26 with full Project Wrap-Up writeup. ~127K users in experiment.
|
||||
- [Postmortem: [iOS] Introduce a new screen...](https://app.asana.com/0/0/1213320327587346) completed Tue 2026-05-26.
|
||||
- [Ship Review: iOS: Demo tracker blocking after chat in onboarding](https://app.asana.com/0/0/1214147157456478) moved PR → Waiting for Release on Tue 2026-05-26.
|
||||
- [Kick-off: iOS Address onboarding conflicts...](https://app.asana.com/0/0/1214592851898713) for next TP completed Tue 2026-05-26 (async, per plan).
|
||||
|
||||
**Discord security postmortem — driven to close**
|
||||
- [Postmortem: Security Triage: AI Agent use via likely external Discord service](https://app.asana.com/0/0/1214996544314182) closed Thu 2026-05-28 with explicit action items captured (GDPR follow-up scheduled, environment setup tracked via O-T project). Praise from Jeanna ("thorough work"). 22 stories on the thread this week — Alex drove the discussion.
|
||||
|
||||
**New TP scoped & kicked off**
|
||||
- [iOS Address onboarding conflicts with unified input and ship AI onboarding winner](https://app.asana.com/0/0/1214592943696234) added to iOS + macOS Release Boards on 2026-05-29; subtasks scoped (Animated Assets, Try Visiting a Site Background, Persist 'You've got this', Hide Free plan, Hide stop chat button, Disable back button, Ship Treatment B).
|
||||
- Async kickoff post landed Mon 2026-05-26 ("scope is set, 2-week window fits").
|
||||
|
||||
**PRs merged (3)**
|
||||
- [PR: Simplify tab access in TabBarViewController](https://app.asana.com/0/0/1215059168411571) — Thu 2026-05-28.
|
||||
- [PR: iOS AI onboarding — Transition to Contextual + Resume Linear Flow](https://app.asana.com/0/0/1214928613949181) — Fri 2026-05-22.
|
||||
- [PR: iOS AI onboarding — New Tab Page Dialogs Refactor](https://app.asana.com/0/0/1214998530536204) — Fri 2026-05-22.
|
||||
|
||||
**Tech Designs approved (observer / Apple-team perspective)**
|
||||
- [TD: [iOS] Improve support for Wallet Pass links](https://app.asana.com/0/0/1215154761492862) — approved by Brindy, closed Fri 2026-05-29.
|
||||
- [TD: Monthly pixels for iOS and macOS](https://app.asana.com/0/0/1214950124367781) — moved Draft → Approved Thu 2026-05-28 (Jonathan Jackson + Elle).
|
||||
- [TD: PIR: Apple: Skip subscription-gated brokers on freemium scans](https://app.asana.com/0/0/1215041670216182) — approved Tue 2026-05-26.
|
||||
|
||||
**Rotations completed**
|
||||
- None active this week.
|
||||
|
||||
---
|
||||
|
||||
### 🔄 Didn't Move
|
||||
|
||||
- [PR Check is failing on main](https://app.asana.com/0/0/1214797526093576) — last activity 2026-05-18, due 2026-05-15 (14d overdue). Flagged in last week's Must-Not-Forget; never picked up. Crowded out by demo-tracker close-out + new-TP kickoff. **Next:** triage Mon, time-box 30 min before TP work.
|
||||
- [PR Check failing on main — testWhenTabWithConnectionLostError...](https://app.asana.com/0/0/1213975496167929) — last 2026-05-13. Likely same underlying flake as above.
|
||||
- [security Full Analysis](https://app.asana.com/0/0/1214962161931389) — last 2026-05-20. Ambiguous title; got crowded out by Discord postmortem.
|
||||
- [Postmortem: Security Triage AI: edit link](https://app.asana.com/0/0/1214996544314187) — last 2026-05-21. Confirm if separate from the closed Discord PM or rolls under it.
|
||||
- [Xcode build speedup skill](https://app.asana.com/0/0/1214996544314193) — no progress; defer to post-WWDC AFK per last plan.
|
||||
- [Alex Shurgin – HR](https://app.asana.com/0/0/1215056211788084) — surfaced 2026-05-22, no activity. Open privately Mon.
|
||||
|
||||
---
|
||||
|
||||
### 🔗 Open Loops Carrying Forward
|
||||
|
||||
- **Ship Review (new project)**: [Ship Review: iOS Address onboarding...](https://app.asana.com/0/0/1215009192158961) — created 2026-05-22, zero approvals (waiting on implementation to land).
|
||||
- **Treatment B blocked**: [Ship AI onboarding winner (Treatment B)](https://app.asana.com/0/0/1215009192158955) — Alessandro raised 2026-05-29 that releasing Treatment B may conflict with active tracker-blocker demo experiment. Scope decision needed Mon.
|
||||
- **Delegated overdue**: [Privacy Triage → Jake Abel](https://app.asana.com/0/0/1214965405681675) (8d overdue, not nudged); [Dependabot check → Tom](https://app.asana.com/0/0/1215057989642782) (4d overdue); [DRI <> Project Advisor async](https://app.asana.com/0/0/1213551072611261) — verify sign-off & close.
|
||||
- **Discord GDPR follow-up**: [scheduled for ~2026-06-15](https://app.asana.com/0/0/1215193471130270). Monitoring.
|
||||
- **No incidents missing postmortem.** No PFRs in flight.
|
||||
|
||||
---
|
||||
|
||||
### 📅 Next Week Setup
|
||||
|
||||
**TP Suggestion**: [iOS Address onboarding conflicts with unified input and ship AI onboarding winner](https://app.asana.com/0/0/1214592943696234) — **carry forward.** Due 2026-06-05; subtasks in flight; Treatment B is the wildcard — if blocked all week, descope and ship the rest.
|
||||
|
||||
**Rotation**: None.
|
||||
|
||||
**OOO watch**:
|
||||
- Self: [AFK Jun/8-12 WWDC'26](https://app.asana.com/0/0/1212684797790491) — land most of TP next week before WWDC.
|
||||
- Dominik (career advisor): LDX3 Jun 1–3; next 1:1 likely Jun 15+ (Jun 8–12 conflicts with own AFK).
|
||||
|
||||
**1:1 prep**: Treatment B / tracker-blocker decision; Discord postmortem outcome (praise + actions captured); WWDC AFK handoff plan; carry-overs — Project Advisor Part 1 (not started), Christie EP2/3 calibration status.
|
||||
|
||||
---
|
||||
|
||||
### 🏆 Wins
|
||||
|
||||
1. **Closed the Demo tracker O-N project end-to-end** — [project complete](https://app.asana.com/0/0/1213320237636425), [postmortem](https://app.asana.com/0/0/1213320327587346), [Ship Review → Waiting for Release](https://app.asana.com/0/0/1214147157456478). Multi-month effort wrapped with ~127K-user experiment-impact writeup.
|
||||
2. **Drove the Discord security postmortem to closure** — [postmortem](https://app.asana.com/0/0/1214996544314182). Explicit praise from Jeanna; reactions from Jonathan Jackson, Dominik, Keagan, Steve Englehardt, Isabel, Brindy. Strong cross-org visibility.
|
||||
3. **Pivoted cleanly into next TP in a 4-day week** — [Kick-off](https://app.asana.com/0/0/1214592851898713) done async Mon, [scope](https://app.asana.com/0/0/1214592943696234) fully laid out by Tue, project on both release boards. No dead air between TPs despite Wed holiday.
|
||||
|
||||
---
|
||||
*Saved to `/Users/admin/obsidian/work/briefs/weekly/2026-05-29.md`.*
|
||||
Reference in New Issue
Block a user