0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【個人開発】Discordでテスター集まらない問題を、相互テストアプリで解決を目指した話

Posted at

Android アプリを複数開発していると、毎回「Discord に投稿 → 数人しか集まらない → クローズドテストが滞る」というループに陥ります。

そこで「開発者同士がお互いのアプリをテストし合う」プラットフォーム TestCrew を作りました。このアイデア自体は一般的なもので、日本には既に 相互テスト Discord コミュニティもありますが、手動運用をより効率化・自動化できるアプリとしてシステム化を目指しました。

この記事では、なぜ作ったのか、どんな仕組みにしたのか、技術スタックを共有します。

この記事でわかること

  • 個人開発者視点での「テスター募集のつらさ」と解決アプローチ
  • React Native × Cloudflare Workers × Discord Bot で構成した相互テストプラットフォーム
  • クレジット制を使った持続可能なエコシステム設計

具体的な課題:

  • クローズドテストの人数要件(12人×14日など)を満たすのが地味に大変
  • テスター側に見返りがないと使ってもらいづらい
  • アプリが増えるほど募集&案内の手間が指数関数的に増える
  • 日本語圏の絶対数が限られる

既存の 相互テスト Discord コミュニティ は素晴らしい試みですが、手動運用をより効率化・自動化できる余地があると考えました。

解決方針:アプリ化した相互テスト

開発者同士がお互いのアプリをテストし合う仕組みをアプリ化しました。

テストする(クレジット獲得) → 自分のアプリを掲載(クレジット消費)

クレジットルール

新規登録:+8クレジット
アプリ掲載:-20クレジット
テスト完了:通常+4クレジット、プレミアム掲載+5クレジット
フィードバックテスト:基本報酬+2クレジットボーナス

4〜5回テストすれば1回掲載可能

システム構成(3層アーキテクチャ)

┌─────────────────┐    HTTP/JWT    ┌─────────────────┐    Webhook    ┌──────────┐
│  React Native   │◄──────────────►│ Cloudflare API  │◄────────────►│ Discord  │
│     App         │                 │   (Workers)     │              │   Bot    │
│   (Android)     │                 └─────────┬───────┘              └────┬───┘
└─────────┬───────┘                         │ Discord API               │
          │ TURSO DB                        │                           │
          └─────────────────────────────────┼───────────────────────────┘
                                            │
                                     クレジット計算・データ管理

1. モバイルアプリ(React Native 0.82.1 + TypeScript)

主要画面:
├── ホーム:テスト一覧(参加可能 / 実施中)
├── アプリ掲載:20クレジット消費で新規作成
├── プロフィール:クレジット残高・Discord連携
└── テスト完了:フィードバック送信
  • Android 専用、多言語(日本語/英語)
  • AsyncStorage で JWT トークン管理
  • ダークモード専用 UI

2. API バックエンド(Cloudflare Workers + Hono)

主要エンドポイント

POST /api/auth/register    # 登録(+8クレジット)
POST /api/apps             # アプリ掲載(-20クレジット)
POST /api/tests/start      # テスト参加開始
POST /api/tests/:id/complete # テスト完了(+4〜5クレジット)
POST /api/discord/webhook/feedback # Discord Bot からの通知

データベース(TURSO / libSQL):

users: クレジット残高、discord_id
app_listings: アプリ情報、discord_thread_id
testing_records: テスト履歴、フィードバック内容
credit_transactions: 全取引ログ(監査用)

クレジット計算例

// api/src/services/credit.ts
export function calculateTestCredit(
  isPremiumListing: boolean,
  hasFeedback: boolean
): number {
  const base = isPremiumListing ? 5 : 4;
  return base + (hasFeedback ? 2 : 0);
}

3. Discord Bot(Node.js + discord.js v14)

Oracle Cloud VM(無料枠)で PM2 常駐

1. フォーラムチャンネル監視 → 新規スレッド検知
2. 自動参加&スレッドIDをDB保存
3. スレッド内メッセージ監視 → フィードバック検知
4. APIにWebhook送信 → クレジット付与
5. 💰リアクション+メンションで通知
// 簡易実装例
client.on('messageCreate', async (message) => {
  if (message.channel.isThread() && isFeedbackPost(message)) {
    await api.post('/api/discord/webhook/feedback', {
      discordId: message.author.id,
      threadId: message.channel.id,
      content: message.content
    });
    message.react('💰');
  }
});

運用コスト:ほぼ無料

Cloudflare Workers:月100万リクエスト無料 → 十分
TURSO:月500MB無料 → 十分
Discord Bot:Oracle Cloud Always Free → 無料
Google Play:年間$25(初年度のみ)
→ 月額ほぼ0円

現状:ユーザー集めが次の課題

TestCrew自体はリリース直後でユーザー数はまだ少ないです。

相互テストの宿命として、ある程度のクリティカルマスがないと回らないため:

フェーズ1:Discordコミュニティで初期ユーザー集め
https://discord.gg/SF8JBExGq5
フェーズ2:20〜30人規模で運用検証
フェーズ3:改善サイクル高速回転

まとめ

テスター募集のつらさを、アプリ化した相互テストで効率化を目指しました。

TestCrewの価値

  • 開発者同士でコストゼロでテストし合える
  • DiscordコミュニティとAPIが自動連携
  • クレジット制で持続可能なエコシステム

同じ悩みを持つ個人開発者の方はぜひ:

  1. Discordコミュニティに参加https://discord.gg/SF8JBExGq5
  2. TestCrewをインストールhttps://play.google.com/store/apps/details?id=com.testcrew
  3. お互いテストし合おう

初期ユーザー大募集中です!フィードバックお待ちしています。


0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?