同じコードベースから 4 本の
4 本目は「釣り」に決めた
これまでに
4 本目に
きっかけは
「タイラバ 船、 4 人で 割れば 1 人 8,500 円。でも 毎回 2 人しか 集まらない」
これが
船割り という明確な
既存アプリと違う "条件の語彙"
3 本目までで
| 項目 | 釣り固有の |
|---|---|
| ジャンル | 海釣り(ショア) |
| 釣法 | ショアジギング・ |
| 魚種 | ブリ、 |
| レベル | ビギナー(釣り歴 |
| 装備・ | マイボート |
| 安全 | 天候悪化時は |
ここで 1 つ強いルールを
たとえば
船割りモード — TsuriMate 固有の機能
釣り仲間
釣行募集を
- 船名
(例: 館山◯◯丸) - 船の
定員 (4〜20 名) - 1 人あたりの
目安料金 (例: ¥8,500) - 費用分担方法
(船代割り勘/エサ・ 仕掛けは 各自/全額主催者負担…)
カード
これはfeatureFlags でなく
釣果ログと魚種図鑑 — リテンションの仕掛け
もう 1 つ、
TsuriMate には 23 種の
月間・
- 総釣果数 TOP10: 表彰台
(1/2/3 位) + 4〜10 位の リスト - 魚種別 最大
サイズ TOP3 : マダイ部門、 ブリ 部門、 ブラックバス 部門… 各魚種で 最大 サイズを 競う
自分の
テンプレに乗るはずが、乗らなかった
3 本目をnode scripts/add-genre.mjs fishing 1 行で
地雷 1: genre-split スキーマの bootstrap
テンプレの DB は 1 Supabase プロジェクトにジャンルsparmate.profiles / netapair.profiles / boardlink.profiles が
僕はpublic.profiles にpublic.profiles は
正しいtsurimate をgenre_schema_template.sql を sed 's/@SCHEMA@/tsurimate/g' でdb_schemas に
地雷 2: PostgreSQL CHECK 制約で SELECT サブクエリが使えない
釣果写真の URL を
ALTER TABLE catch_logs ADD CONSTRAINT ... CHECK (
photo_urls IS NULL OR
(SELECT bool_and(u ~ '^https://...') FROM unnest(photo_urls) AS u)
);
結果: ERROR: cannot use subquery in check constraint (SQLSTATE 0A000)
正しくは IMMUTABLE 関数に
CREATE OR REPLACE FUNCTION catches_urls_valid(urls text[])
RETURNS boolean LANGUAGE sql IMMUTABLE AS $$
SELECT urls IS NULL OR (SELECT bool_and(u ~ '...') FROM unnest(urls) AS u);
$$;
ALTER TABLE ... ADD CONSTRAINT ... CHECK (catches_urls_valid(photo_urls));
CHECK 内の
地雷 3: migration ファイル名の version 衝突
Supabase CLI はschema_migrations.version に INSERT する。20260424_catch_logs.sql と 20260424_fish_species_seed.sql は20260424 で UNIQUE 制約違反。
14 桁YYYYMMDDhhmmss_... に
地雷 4: OG/Twitter image alt のフォールバック
本番にsrc/app/opengraph-image.tsx の alt が martial / comedy / boardgame の 3 ブランチしかなく、fishing は SparMate の fallback に
地雷 5: favicon 一式の手動生成
public/icons/<genre>/{favicon.png, icon-192.png, icon.png} は add-genre.mjs が
学んだことをスクリプトに戻す
5 つ全部をadd-genre.mjs を
preflight フェーズで Vercel を
src/config/genre.tsに<genre>エントリがあるか src/lib/supabase/schema.tsに分岐が あるか opengraph-image.tsx/twitter-image.tsxに分岐が あるか(これが 最初に )弾けていれば 地雷 4 は 発火しなかった public/icons/<genre>/が揃っているか (不足なら sharp で 自動生成)
後工程 で:
- Supabase Management API トークンが
あれば、 Auth Redirect URL を 自動追加 - なければ
手動手順を 表示 - 最後に
「genre-split bootstrap migration は 別途必要」 等の チェックリストを echo
失敗 1 回で
SEO キーワードは完全にジャンル固有
最後に
TsuriMate で
- 釣り仲間 / 釣り仲間 募集 / 釣り 同行者 / 釣り マッチング
- 船釣り 割り勘 / 船釣り 相乗り / 乗合船 仲間
- タイラバ 仲間 / ジギング 仲間 / バス
釣り 同船 / 霞ヶ 浦 バス - エギング 仲間 / サーフ ヒラメ 仲間 / 渓流 釣り 仲間
- 釣果 記録 アプリ / 釣果
ログ / 魚種図鑑 - 釣りガール / ファミリーフィッシング
- 東京湾 釣り 仲間 / 玄界灘 釣り / 琵琶湖 バス
- fishing buddy app / split charter fishing / bass fishing buddy
SparMate の
FAQ 構造化
ロードマップ
β0 で
- 釣行募集・
船割り・ 釣果 ログ・ 魚種図鑑・ 月間/年間 ランキングが 稼働 - 完全無料
(クレカ 不要) - 10 人の
デモユーザーが 仕込まれていて、 初 ログインからすぐ使える
次の
/spots釣り場マップ (国土地理院 タイル + 遊漁船 DB) - 本人確認
バッジと 相互 レビュー - 釣行当日のみ有効な GPS 共有
- β3 で
課金 live 切り替え (月額 800 円 / 釣果記録無制限・ 優先 マッチング)
おわりに
ただし、
その "まだ見えていない
TsuriMate は、
もし釣りをやっていて、今週末の 1 人分が
ジャンルは