mac-intake-server
WIP(現在進行中)
Work In Progress
このプロジェクトで現在進行中の作業と、過去のスナップショットを記録する。
現在の状況
スクリプト一式は書き終わった状態。まだ対象機では一度も実行していない。
次にやること(対象機=13インチ MacBook Pro 2020 の前で作業する):
gh repo clone ichirokisanuki/mac-intake-server ~/cdev/mac-intake-serverbash scripts/provision.sh→ 出てきた「手でやること」を順に潰す- Tailscale 認証、claude / codex / gh ログイン、Notta 初回ログイン(GUI 必須)
- 母艦側から
bash scripts/sync-claude-config.sh <ホスト名> sudo bash scripts/power-setup.sh.envに NTFY_TOPIC を設定(dev-timer の .env と同じ値)bash scripts/install-launchd.sh- 動画1本で疎通確認 → iOS ショートカット作成
未検証の懸念:
- launchd の WatchPaths が実際に発火するか(保険の 30 分ポーリングはある)
- headless の Notta が SSH セッション下で動くか(プロファイルは永続なので理論上は動く)
claude -pが add-youtube スキルを確実に拾うか- FileVault / 自動ログインをどうするかは未決
過去のWIPアーカイブ
(新しい「現在の状況」を書く前に、古いものをここに追記でアーカイブする。新しいものが上)
ROADMAP(計画)
ロードマップ
今週
- 対象機(2020 MBP)でのセットアップ実行と疎通確認
- iOS ショートカットの作成
- FileVault / 自動ログインの方針決定
今月
- 実運用して、投げっぱなし運用が肌に合うか見極める
- 失敗パターンの洗い出し(Notta セッション切れの頻度など)
- 記事コンテンツ(URL を投げると記事を追加)への横展開を検討
今四半期
- dev-timer の cron / expert-brains 夜間バッチをこの箱に引き取る
- Mac mini 購入の要否を判断する
いつか
- キューの状態を見る簡易 Web UI(ib.ikapps.com か Tailscale 内に)
- Notta セッション切れを事前検知して通知する仕組み
- 書籍コンテンツ(スクショフォルダを投げる)の受け口
DECISIONS(意思決定)
意思決定記録
このプロジェクトで下した重要な意思決定を記録する。 最新が上に来る。
2026-07-26 実行環境をクラウドではなくローカル常時稼働機にする
選択肢: ① claude.ai/code(Claude Code Web)にリポジトリを繋ぐ ② VPS に寄せる ③ 家に常時稼働 Mac を置く
決定: ③。
理由:
- yt-dlp・Notta(Playwright + 保存済みログインセッション)・codex CLI がローカル資源で、 ①②では文字起こしのパイプラインが通らない
- YouTube はデータセンター IP を弾きやすいので、家庭用回線から叩けること自体に実利がある
- Claude のサブスク内に収めたいという制約とも整合する(追加課金ゼロ)
捨てたもの: Claude Code Web は既存記事の編集・タグ整理には引き続き使える。全否定はしない。
2026-07-26 当面の対象機は新規 Mac mini ではなく手持ちの 2020 MBP
決定: 13インチ MacBook Pro 2020(Intel i5 / 32GB / 512GB / 4ポート)をそのまま常時稼働機にする。
理由:
- 4ポートモデルは macOS Tahoe(26) 対応機種に残っており、OS サポートが即切れるわけではない
- メモリ 32GB はこの用途には過剰なくらいで、性能がボトルネックになる筋がない
- バッテリーの状態が「正常」であることを確認済み
買い替えの引き金として置いておくもの:
- Intel 向けの macOS 提供が終わったとき
- Xcode ビルド / シミュレータ検証をこの箱に載せたくなったとき(Intel では現実的でない)
残るリスク: 常時給電によるバッテリー膨張。年1回は目視確認する。
2026-07-26 worker の発火は定期ポーリングでなく WatchPaths で行う
決定: launchd の WatchPaths でキューファイルの更新を検知し即時起動。保険として 30 分の StartInterval も併用。
理由: 共有シートから投げて即座に動き出す体験を優先した。 Notta の処理自体に十数分かかるので、起動遅延を上乗せしたくない。 ポーリングだけだと最大待ちが積み上がる。
2026-07-26 認証情報は機械間で同期しない
決定: sync-claude-config.sh は skills / agents / CLAUDE.md / settings のみ送り、
.credentials.json・セッション・履歴は除外する。対象機で個別にログインする。
理由: 認証情報を rsync で持ち回ると、どこに何が撒かれたか追えなくなる。 ログインは一度きりの手間なので、自動化する価値より事故の方が大きい。
DEVLOG(作業ログ)
開発日誌
このプロジェクトでの作業を時系列で記録する。 最新のエントリが上に来る。
2026-07-26 プロジェクト発足・スクリプト一式を実装
背景
intelligence-bank への動画追加を携帯から指示したい、という相談が発端。 検討の結果、yt-dlp / Notta / codex CLI がローカル依存のためクラウド実行は不可と判断し、 「家に常時稼働機を置き、キュー経由で投げる」構成に決めた。
対象機は手持ちの 13インチ MacBook Pro 2020(Intel i5 / 32GB / 512GB / 4ポート)。 Gmail の購入履歴(注文番号 W996233931、2020/05/24 注文・¥228,800)で実機スペックを確定。 当初「2019年製」と認識していたが実際は 2020 の4ポートモデルで、macOS Tahoe(26) 対応機種に該当する。 バッテリーの状態は「正常」を確認済み。
やったこと
- 新規リポジトリ作成、
.devnotes/初期化 scripts/lib.sh— ログ・ntfy 通知(RFC 2047 で日本語タイトルを包む)・パス定義scripts/provision.sh— 冪等なセットアップ。認証が要るものは最後に「手でやること」として列挙scripts/power-setup.sh— pmset 一式。ノート判定して disablesleep を出し分けるscripts/sync-claude-config.sh— 母艦 → 対象機の rsync。認証情報は除外scripts/queue-add.sh— 正規表現で YouTube URL だけ抽出してキューに追記scripts/worker.sh— mkdir によるロック、git pull --ff-only、claude -p 実行、HEAD 差分で完了判定launchd/*.plist.template+scripts/install-launchd.sh— WatchPaths で即時発火、保険で 30 分ポーリングdocs/ios-shortcut.md— 共有シートからの投入手順
次にやること
対象機(2020 MBP)でのセットアップ実行。Tailscale の認証と Notta の初回ログインは対面作業が要る。
最近のコミット
- bcc26d7 Initial commit 2026/7/26
README
mac-intake-server(家の常時稼働 Mac インテークサーバー)
概要
家に置いた常時稼働の Mac を「インテークサーバー」に仕立てるためのセットアップ一式。
いま解きたい問題はこれ:
- 動画コンテンツの intelligence-bank への追加は、 yt-dlp / Notta(Playwright + ログインセッション)/ codex CLI といったローカル資源に依存していて、 クラウド実行に載せられない
- 実行環境が普段使いのノート PC だと、蓋を閉じた瞬間に終わる
- 結果として、外出先で見つけた動画をその場で投げられない
そこで、常時稼働機にキューを置き、iPhone から URL を投げ込むと勝手に記事が生えて通知が来る状態を作る。
iPhone 共有シート
│ (SSH)
▼
queue-add.sh ──> ~/ib-queue/queue.txt
│ (launchd WatchPaths が検知)
▼
worker.sh ──> claude -p "add-youtube" ──> git push
│
▼
ntfy ──> iPhone に通知
構成
| パス | 役割 |
|---|---|
scripts/provision.sh |
対象機のセットアップ(brew / node / yt-dlp / claude / codex / Tailscale ほか)。冪等 |
scripts/power-setup.sh |
スリープ無効・停電復帰・クラムシェル対策。sudo が要る |
scripts/sync-claude-config.sh |
母艦 → 対象機へ ~/.claude/(skills / agents / CLAUDE.md)を rsync。認証情報は送らない |
scripts/install-launchd.sh |
LaunchAgent の登録 / 解除 |
scripts/queue-add.sh |
キューに URL を積む。iOS ショートカットが叩くのはこれ |
scripts/worker.sh |
キューを空になるまで処理する本体 |
scripts/lib.sh |
共通部品(ログ・ntfy 通知・パス定義) |
launchd/*.plist.template |
LaunchAgent の雛形。install-launchd.sh がパスを埋めて配置する |
docs/ios-shortcut.md |
iOS ショートカットの作り方 |
セットアップ
対象機(常時稼働させる Mac)で
gh repo clone ichirokisanuki/mac-intake-server ~/cdev/mac-intake-server
cd ~/cdev/mac-intake-server
bash scripts/provision.sh # 依存の導入。手動ログインが要るものは最後に列挙される
sudo bash scripts/power-setup.sh # 電源設定
cp .env.example .env && vi .env # NTFY_TOPIC を埋める
bash scripts/install-launchd.sh # worker を登録
provision.sh は認証が要るもの(claude / codex / gh / Notta ログイン)で止まらず、
「手でやること」として最後にまとめて出す。全部済ませたらもう一度流して緑になるのを確認する。
母艦(普段の作業機)で
bash scripts/sync-claude-config.sh <対象機のホスト名>
~/.claude/ の skills / agents / CLAUDE.md を送る。
認証情報(.credentials.json)・セッション・履歴は意図的に送っていない ので、
claude / codex / gh は対象機で個別にログインする。
iPhone で
- Tailscale アプリを入れて同じ tailnet に参加する
docs/ios-shortcut.mdの手順でショートカットを作る
使い方
# 単発
bash scripts/queue-add.sh 'https://www.youtube.com/watch?v=xxxx'
# 前後編を1ページに統合(1行に複数 URL = 1記事)
bash scripts/queue-add.sh '<前編URL>' '<後編URL>'
# 手動で処理を回す(launchd を待たない)
bash scripts/worker.sh
bash scripts/worker.sh --once
投入すると launchd の WatchPaths が発火して worker が動く。
念のため 30 分ごとのポーリングも入れてあるので、検知を取りこぼしても最終的には拾われる。
運用メモ
- ログ:
~/ib-queue/logs/YYYYMMDD-HHMMSS.log(1ジョブ1ファイル)とlaunchd.{out,err}.log - 失敗したエントリ:
~/ib-queue/failed.txtに退避される。直したらqueue.txtに戻す - 多重起動:
~/ib-queue/worker.lockで排他。プロセスが死んだ場合のロック残骸は自動で剥がす - git 衝突: worker は
git pull --ff-onlyが通らなければ何もせず落ちて通知する。 母艦と対象機の両方から intelligence-bank に書くと起きるので、動画追加は対象機に寄せる - 完了判定:
claudeの終了コードだけでは信用せず、HEAD が進んだかで判定している
想定される詰まりどころ
- Notta のセッション切れ —
LOGIN_REQUIREDで失敗する。GUI が要るので対象機の前で再ログインする - FileVault と自動ログイン — FileVault が有効だと再起動後に自動ログインできず、LaunchAgent も上がらない。 停電・OS アップデート後の無人復帰を取るか、ディスク暗号化を取るかの選択
claudeのパス — launchd は PATH を継承しない。install-launchd.shが~/.local/binと Homebrew prefix を埋め込んでいるので、別の場所に入れた場合はテンプレートを直す
将来 Mac mini に移すとき
このリポジトリを clone して provision.sh → power-setup.sh → install-launchd.sh を流すだけ。
power-setup.sh はノートかどうかを判定して disablesleep の要否を切り替える。