Communitygithub.com

jvdburgh/AmputatorBot

AmputatorBot移行計画v7 — 確定済みの決定事項、マイルストーンM1~M6、API契約、スキーマ、移植メモ。AmputatorBotのアーキテクチャ、リライト、M6デプロイに取り組む際に読み込んでください。

AmputatorBot とは?

AmputatorBotは、Reddit上のAMP URLを検出して正規URLで返信するボットです。このスキーマは、PythonベースのPRAW実装からDevvit(TypeScript)とRustバックエンドへの完全な移行計画(v7)を文書化しています。移行の主な目標は、最新スタック(Rust、Devvit、Astro)への移行と、バックワード互換性の維持、そして2026年12月末までに提供される$1,000の移行バウンティの獲得です。計画は6つのマイルストーン(M1~M6)に分割され、M1~M5はローカル開発(Rustエンジン、API互換性、Astroサイトなど)、M6はScalewayクラウドへのデプロイと公開ローンチです。重要な決定事項として、per-subredditオプトインモデル、Cloudflareによるレート制限、Mozila Readabilityに準拠した記事抽出(dom_smoothie)、API認証なし(すべて公開)などが含まれています。このドキュメントは、Claude CodeなどのAIエージェントがアーキテクチャ上の決定を相談しながら作業を進めるためのものです。

対応✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/jvdburgh/AmputatorBot/tree/HEAD/.claude/skills/amputatorbot-migration

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

AmputatorBot → Devvit 移行計画 v7

ステータス: 生きたドラフト — M1~M5は出荷済み、M6(クラウドデプロイ + ローンチ)は進行中。 作成日: 2026-05-25 予算上限: 月額€15


作業スタイル — 最初にこれをお読みください

Dev は、コードを書く前にアーキテクチャ上の決定について相談されることを好みます。以下のような選択については:

  • どのライブラリ、フレームワーク、またはパターンを使うか
  • データモデルの設計やスキーマの決定
  • 新しいモジュールやレイヤーの構造化方法
  • コストと複雑さのトレードオフ
  • この計画から逸脱するような重要な変更

…一旦止めて、進める前に確認してください。選択肢を提示し、トレードオフを正直に説明し(反対意見があればそれも含めて)、決定を待ってください。機械的な実装作業は相談不要ですが、アーキテクチャの形状に関わるものは必要です。

Devが手動で行う外部アクション(Claudeは行わない):

  • 本番MySQL / Postgresデータベースへのクエリ実行(ClaudeはSQLを書き、Devが実行する)
  • サービスへのサインアップ(Scaleway、Reddit開発者アカウント、App Directory提出、バウンティプログラム登録)
  • DevのIDに関わる外部アカウントへのアクセス(OAuthログイン、devvit login、scw init、課金変更)
  • CloudflareでのDNS変更
  • 本番PythonAnywhereボットの停止/起動
  • 本番に影響を与えるリモートへのgit push
  • Devvitアプリの公開(devvit upload --publish)

Claudeは正確なコマンドを準備し、Devに実行タイミングを伝えます。コードの読み取り、コードの作成、ローカルテスト、ローカルDockerビルド、ローカルcargo/npm — これらはClaudeが行います。


プロジェクトの背景

AmputatorBotとは: コメント/投稿/PM内のAMP URLを検出し、正規(非AMP)リンクで返信するRedditボット。Dev(u/Killed_Mufasa)によってメンテナンスされています。https://github.com/jvdburgh/AmputatorBot で公開中。約181のGitHubスター。スケールして動作中。RedditのDeveloper Platform移行プログラムは、Data APIからDevvitに移行するボットに2026年12月31日までに$1,000を提供します。

移行対象:

  • Redditボット(Python + PRAW) → Devvitアプリ(TypeScript、@devvit/web)
  • HTTP API(Flask) → Rust(Axum + Mozilla-Readability-port + sqlx)
  • ウェブサイト(Flask + Bootstrap) → Astro 5 + Tailwind 4 + shadcn/ui
  • データベース(PythonAnywhere上のMySQL) → Scaleway Managed Database上のPostgres 17
  • ホスト(PythonAnywhere) → Scaleway(パリ、フランス — EUオリジンのマネージドクラウド)

アーキテクチャモデルの変更点: Devvitはサブレディットごとのオプトインであり、グローバルではありません。モデレーターがサブごとにアプリをインストールします。インストールされていない場所のコンテンツは見えません。返信はインストールごとのアプリIDとして投稿され、u/AmputatorBot としては投稿されません。この変更は受け入れられています。推定返信量の減少:30~60%。

目標(ユーザー発言):

  1. 最新スタックに移行し、その過程で学ぶ(Rust、Devvit、Astro/Tailwind4/shadcn)
  2. API契約は後方互換性を維持
  3. リライト中(M1~M5)は、古いボットはPythonAnywhere上で動作を継続し、新しい側は自由に壊せるようにする(ユーザーに影響なし)。古いボットはM6の切り替え時に退役 — 恒久的な並行稼働はなし。
  4. リライトは強行突破。古いコードは praw-python-archive/ に保存。

確定済みの決定事項

パスサブレディットごとのオプトイン。M6で直接切り替え(古いボットはM1〜M5の開発中のみ生存)
Devvit SDK@devvit/web(モダンサーバーモデル)
Devvit設定devvit.json($schema付きの公式フォーマット)
Devvitスキャフォールドreddit/devvit-template-bare、投稿/メニューUIを除去
バックエンド言語Rust
バックエンドフレームワークAxum 0.8(Tokio + Hyper)
記事抽出dom_smoothie クレート(≈0.17、Mozillaのreadability.jsを密に追従するRust Readabilityポート、2026年3月時点で活発にメンテナンス中)
HTML解析scraper クレート(html5ever上に構築)
HTTPクライアントreqwest
Postgresドライバsqlx(コンパイル時チェッククエリ)
データベースScaleway Managed Database上のPostgres 17(DB DEV-S相当またはワンランク上、約2GB + 成長用ヘッドルームにサイジング)。170万行確認済み。
ウェブサイトAstro 5 + Tailwind 4 + shadcn/ui
ホスティングScaleway Serverless Containers(パリ/AMS、EUオリジンのフレンチクラウド)
単一サービス1つのRustバイナリが /api/* とAstro静的ファイルを tower-http::ServeDir で提供
可観測性初期はScaleway Cockpit(組み込みのログ + メトリクス)のみ
コードホスティングGitHub(既存のモノレポ)
DNSCloudflare(既存)— レート制限も処理
API認証どのルートもなし — 完全にオープン。Cloudflareが悪用を処理。
レート制限Cloudflareのみ、Rustミドルウェアなし
ドメイン単一 — すべて www.amputatorbot.com
テストサブレディットr/test
AIツールClaude Code + Devvit MCP + IntelliJ上のJetBrains MCP
ユーザーごとのオプトアウト削除。ユーザーはボットアカウントをブロックします。インストールごとのアプリIDにより、ブロックベースのオプトアウトはインストールレベルで機能します。
サブレディットごとのオプトアウト削除(モデレーターはアンインストールするか、インストール設定で autoReply をオフに切り替える)
Modmail / DMなし。受信Modmailハンドラー、ウェルカムModmail、DMはなし — Redditの「アプリ」バッジがボット開示を処理し、Devvit App Directoryリストがオンボーディングをカバーします。
カルマ閾値なし
App Directory提出者u/Killed_Mufasa

これらの選択の理由

上記の決定の背後にある根拠。それぞれは、信頼できる代替案よりも意図的に選ばれました。

  • Node/TSやPythonではなくRust + Axum。 単一の静的バイナリ、実行時不要、virtualenv不要、node_modules不要。Rustの難しい部分(ライフタイム、unsafe、高度なジェネリクス)はこの種のサービス(HTTPフェッチ + 正規表現 + HTMLクエリ + DB書き込み)ではほとんど現れないため、学習曲線は主に Result/?、async/Tokio、sqlxマクロです — すべて知る価値があります。Axum 0.8は2026年のコンセンサスフレームワークです(Tokio + Hyper + Towerミドルウェア)。sqlxはコンパイル時チェッククエリを提供します。

  • rs-trafilaturaや他のReadabilityポートではなくdom_smoothie。 既存のボットは、推測と確認の信頼度スコアリング(helpers/article_comparer.py)に newspaper3k + difflib.SequenceMatcher を使用しています。Rustポートでは、Mozilla-Readabilityに準拠した抽出器が必要です。2026年5月時点の候補:

    • dom_smoothie 0.17(最終リリース2026年3月、約40kの最近のダウンロード、リポジトリ niklak/dom_smoothie)— readability.js に密に従い、2つのモード(Mozilla模倣 + カスタム)、JSON-LD + OGメタデータ解析、活発にメンテナンス中。
    • readability 0.3 by kumabook(最終リリース2023年12月、停滞)— arc90のオリジナルReadabilityのポート(Mozillaのフォークより前)。ダウンロード数は多いがメンテナンスされていない。
    • readable-readability 0.4(最終リリース2022年12月、停滞)。
    • llm_readability 0.0.17(活発だが0.0.x — 本番には時期尚早)。

    dom_smoothie は、活発なメンテナンス + 明示的なMozilla readability.js 系統で勝利。類似度スコアリングには標準(Mozilla模倣)モードを使用します。スパイクは不要。M2で `dom_smoothie =

関連スキル