← 一覧に戻る

mac-intake-server

GitHub ↗ Shell 最終push: 2026/7/26 14:26

WIP(現在進行中)

Work In Progress

このプロジェクトで現在進行中の作業と、過去のスナップショットを記録する。

現在の状況

スクリプト一式は書き終わった状態。まだ対象機では一度も実行していない

次にやること(対象機=13インチ MacBook Pro 2020 の前で作業する):

  1. gh repo clone ichirokisanuki/mac-intake-server ~/cdev/mac-intake-server
  2. bash scripts/provision.sh → 出てきた「手でやること」を順に潰す
    • Tailscale 認証、claude / codex / gh ログイン、Notta 初回ログイン(GUI 必須)
  3. 母艦側から bash scripts/sync-claude-config.sh <ホスト名>
  4. sudo bash scripts/power-setup.sh
  5. .env に NTFY_TOPIC を設定(dev-timer の .env と同じ値)
  6. bash scripts/install-launchd.sh
  7. 動画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 の初回ログインは対面作業が要る。

最近のコミット

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 で

  1. Tailscale アプリを入れて同じ tailnet に参加する
  2. 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 が進んだかで判定している

想定される詰まりどころ

  1. Notta のセッション切れLOGIN_REQUIRED で失敗する。GUI が要るので対象機の前で再ログインする
  2. FileVault と自動ログイン — FileVault が有効だと再起動後に自動ログインできず、LaunchAgent も上がらない。 停電・OS アップデート後の無人復帰を取るか、ディスク暗号化を取るかの選択
  3. claude のパス — launchd は PATH を継承しない。install-launchd.sh~/.local/bin と Homebrew prefix を埋め込んでいるので、別の場所に入れた場合はテンプレートを直す

将来 Mac mini に移すとき

このリポジトリを clone して provision.shpower-setup.shinstall-launchd.sh を流すだけ。 power-setup.sh はノートかどうかを判定して disablesleep の要否を切り替える。