Cosoado Lab Blog
個人開発スタジオが、プロダクト設計・ユーザー体験・グロースの現場から見た率直な記録を書き残していきます。理想論ではなく "実際どうだったか" を中心に。
-
謎かけの作り方 完全ガイド — AIと「整いました!」を 1 分で作る練習法
「○○とかけまして〜と解きます。その心は…」の作り方を、3 要素分解 + うまい謎かけの 3 条件 + 5 つの例題 + 自分で作る 5 ステップで解説。最後に 謎かけメーカー(AI なぞかけアプリ)と毎日 1 分で語彙力を磨く実践フローまで。
-
Tokyo Omakase Guide for First-Timers: Etiquette, Cost, Reservations & What to Expect
A first-timer's walk-through of omakase sushi in Tokyo — how much it costs (¥3,000 – ¥30,000+), how to book 1–4 weeks ahead, the 7 counter etiquette rules that matter, the 10 most common neta names, five Japanese phrases, and five rookie mistakes to skip. Companion guide to the Omakase Master app.
-
「LP に書いた機能、実装してありますか?」— ピアコネクト LP を全面リライトした話
未実装機能を訴求していた LP を撤去し、利用規約・プライバシーポリシーとの食い違いも整え、医療系の sensitivity に合わせて「お便りのような和風」デザインへ作り直した記録。景表法・薬機法の優良誤認のラインの引き方と、和紙トーン + 落款 SVG で実装した経緯を 6 分で振り返ります。
-
Supabase CLI の db push でマイグレーションを本番に安全に流す運用パターン
Supabase CLI の
db pushでマイグレーションを安全に本番適用する運用フロー。db pullで既存スキーマ取り込み、migration newで差分管理、--dry-runで事前確認、--include-allの落とし穴回避まで、supabase_migrations.schema_migrationsを中心に置く設計を実装と一緒にまとめる。同時掲載: Qiita
-
Supabase pooler URL を migration/runtime で正しく使い分ける方法
migration には
DIRECT_URL(port 5432)、runtime にはDATABASE_URL(port 6543 Transaction mode) を使い分ける。Drizzle はprepare: false必須。2025 年 2 月以降 Session mode は廃止。Prisma v6 / v7 / Drizzle 各 ORM の設定実例。同時掲載: Zenn
-
Supabase RLS の UPDATE ポリシーで USING を省くと他人データを乗っ取れる
UPDATE ポリシーで
WITH CHECKだけ書いてUSINGを省くと、攻撃者が任意の行を自分の所有に転換できてしまう。USING(触れる行) とWITH CHECK(書ける行) の違いを整理し、コマンド別正解パターンとpg_policiesでの棚卸し SQL までを示す。同時掲載: Zenn
-
Next.js App Router: fetch に no-store を設定しないと静かに古いデータが出る理由
Next.js 14 以前の App Router で
fetchをcache指定なしで使うと、ビルド時のキャッシュが永続して新しいデータが返らない。no-store/no-cache/force-cacheの違いと、データ性質別の正解、Next.js 15 でのデフォルト変更までを実装と一緒にまとめる。同時掲載: Qiita
-
Supabase RLS で auth.uid() を毎行呼び出さないための 1 行の書き換え
Supabase の Row Level Security は、書き方を間違えると行数に比例して遅くなる。
(select auth.uid())で包むだけで公式ベンチで 179ms → 9ms (94.97% 改善)。to authenticatedとpg_policiesでの棚卸しまでの 1 行修正レシピ。同時掲載: Zenn
-
Vercel で 1 リポジトリを 4 プロジェクトに紐付け、env var だけで別アプリ化する実例
Next.js 1 リポジトリから 4 つのアプリ (格闘技・お笑い・ボドゲ + staging) を Vercel で並列稼働。
NEXT_PUBLIC_GENRE1 つで分岐する具体的な構成と、Hobby プランの concurrent build / build cache 非共有 / preview deploy 連鎖など 4 つの落とし穴を実例で解説。同時掲載: Qiita
-
4 本目のマッチングアプリ — 釣り仲間マッチング「TsuriMate」ロンチで学んだ 5 つの地雷
3 本目を作ったときは「これでテンプレ化は完成」と思っていた。4 本目の釣り仲間マッチング TsuriMate を立ち上げて、まだ見えていない穴が 5 つあったことに気づいた話。船割りマッチングという釣り固有のウェッジと、genre-split スキーマや CHECK サブクエリ禁止などの地雷を開示する。
-
3 つのマッチングアプリを 1 つのコードから作った話 — 格闘技・お笑い・ボドゲを同時運用してわかったこと
Next.js + Supabase の単一コードベースから SparMate・NetaPair・BoardLink の 3 アプリを並列デプロイ。同時運用で初めて見えた "距離の意味の違い" や "年齢フィルターの誤解" など、5 つの現場知を率直に記録。
同時掲載: Zenn / Qiita