1行ピッチ: 「検索履歴から"好きになる前"を可視化する」
| ホーム | マイページ | マイマップ |
|---|---|---|
![]() |
![]() |
![]() |
| 項目 | 内容 |
|---|---|
| チーム名 | Nice to meet U! |
| プロダクト名 | Curio |
| 担当メンター | jnsk |
| GitHub | 氏名 | 大学 / 学部 | 担当役割 |
|---|---|---|---|
| @SomaTakata | Soma Takata | 芝浦工業大学 理工学研究科 システム理工学専攻 | PM, FE, Design, Presentation |
| @jk99k | Jokei Kota | 同志社大学 情報工学専攻 | FE, BE, Infra |
| @Bioinfo-Rafael | Mugi Rafael Suzuki | 東北大学 医学部 | Data , Biz |
| @NazmulHayat | Nazmul Hayat | 九州大学 工学部 | FE, BE |
| @Riochin | Rio Ichikawa | 津田塾大学 学芸学部 | FE, BE |
Curio は Chrome 拡張で閲覧履歴を自動収集し、AI が関心テーマを「ステッカー」として可視化するサービス。「好きになる前」の好奇心の軌跡をタイムラインで振り返りつつ、同じステッカーを持つ他ユーザーの閲覧テーマに偶然出会える。embedding+pgvector によるオンラインクラスタリングと fal.ai FLUX.1 によるステッカー画像生成で、検索履歴を「偏愛のステッカーブック」に変える。
毎日のブラウジングには「好きになる前」の好奇心が宿っているが、それは履歴として消えていくだけで誰にも共有されない。「なんとなく気になって調べた」段階の関心を可視化し、同じ場所を通った人と出会えるようにしたい。
- 知的好奇心が旺盛で、日常的に幅広いWebブラウジングをしている人
- ニッチな趣味・偏愛を持ち、同好の士を探している人
- SNSのフォロー関係ではなく「何かに興味を持ち始めた瞬間」で繋がりたい人
- 自動ステッカー生成:Chrome拡張が閲覧履歴を収集し、AI(embedding + pgvector コサイン類似度クラスタリング)が関心テーマを「ステッカー」として自動生成
- ステッカービジュアライズ:fal.ai FLUX.1 [schnell] でステッカー画像を生成し、タイムラインで好奇心の軌跡を可視化
- 共鳴発見:ステッカーをクリックすると同テーマを持つ他ユーザーの閲覧軌跡を閲覧でき、「好きになる前」の段階で偶然出会える
- Curiosity Map:全ユーザーの関心テーマをマップで俯瞰し、好奇心の地形を探索
- Day1 終了時:テーマ確定(プロダクト名・解決課題・ターゲットを記入済み)
- Day2 終了時:MVP 動作(デプロイ済み URL が下記「デモ環境」欄に入っている)
- Day3 終了時:提出完了(プレゼン資料 URL / デモ動画 URL / AI 活用ログ完成)
- 動くデモ(デプロイ済み URL を「デモ環境」欄に記載)
- ソースコード(このリポに push 済み)
-
AI_USAGE_LOG.md(AI 活用ログ、開発期間中の追記必須) - プレゼン資料(PDF or Slides URL を記載)
| 種別 | URL |
|---|---|
| デモ環境 | Backend(Render), Frontend(Vercel) |
| プレゼン資料 | リンク |
- 拡張機能:WXT 0.19 + React 18 + TypeScript
- フロント:Next.js 15 (App Router) + Tailwind v4 + Framer Motion
- バックエンド:FastAPI 0.115 + Python 3.11 + Pydantic v2 + psycopg3 (async)
- DB:Neon Postgres (pgvector)
- オブジェクトストレージ:Cloudflare R2 (S3 互換, 公開バケット)
- AI:OpenAI
text-embedding-3-small/gpt-4o-mini/ fal.ai FLUX.1 [schnell] + rembg - モノレポ:pnpm workspaces + Devbox (Node22/Python3.11/poetry)
- Lint/Format:Biome
- デプロイ:Vercel (FE) / Render (BE) / Neon (DB) / Cloudflare R2 (画像)
| サービス名 | 用途 | プラン | 備考 |
|---|---|---|---|
| OpenAI API | embedding / 命名 LLM(ステッカーオブジェクト抽出) | Pay-as-you-go | 新規ステッカー時のみ |
| fal.ai | FLUX.1 [schnell] 画像生成 + rembg 背景除去 | Pay-as-you-go | 新規ステッカー作成時のみ |
| Neon | Postgres + pgvector | Free tier | サーバーレス Postgres |
| Cloudflare R2 | ステッカー透明 PNG 配信 | Free tier | public bucket |
| Render | FastAPI ホスティング | Free | スリープあり |
| Vercel | Next.js ホスティング | Hobby |
→ API キー・秘匿情報は .env(.gitignore 対象)で管理。公開リポ化に備えて漏らさないこと。
curl -fsSL https://get.jetify.com/devbox | bash
# 詳細: https://www.jetify.com/devboxdevbox shell # Node22/Python3.11/pnpm/poetry/psql が PATH に入る
devbox run install:all # pnpm install + (cd packages/backend && poetry install)
install:allは pnpm の postinstall フックでも自動実行されるので、pnpm installだけでも全部入る。
cp .env.example .env
cp packages/backend/.env.example packages/backend/.env
cp packages/extension/.env.example packages/extension/.env
cp packages/frontend/.env.example packages/frontend/.env.localOPENAI_API_KEYをバックエンドの.envに書く- Neon: ダッシュボードから接続文字列を取得し
packages/backend/.envのDATABASE_URLに貼る(?sslmode=require付き) - Cloudflare R2: アカウントID・アクセスキー・公開URL (
pub-xxxx.r2.devまたは独自ドメイン) をpackages/backend/.envのR2_*に貼り、フロントの.env.localNEXT_PUBLIC_R2_PUBLIC_HOSTにホスト名(プロトコル抜き)を入れる
export DATABASE_URL='postgresql://USER:PASS@ep-xxxx.neon.tech/neondb?sslmode=require'
psql "$DATABASE_URL" -f db/schema.sql
psql "$DATABASE_URL" -f db/seed.sql # 開発用シード (任意)詳細は db/README.md。
devbox run dev:all
# - Backend: http://localhost:8000 (docs: /docs)
# - Frontend: http://localhost:3000
# - Extension: packages/extension/.output/chrome-mv3 を Chrome に「読み込む」個別起動:
devbox run dev:backend # FastAPI のみ
devbox run dev:frontend # Next.js のみ
devbox run dev:extension # WXT 開発モード(Chrome 自動起動)chrome://extensionsを開く- 右上「デベロッパーモード」を ON
- 「パッケージ化されていない拡張機能を読み込む」
packages/extension/.output/chrome-mv3を選択- ポップアップで「今すぐ同期」、または5分待って自動同期
devbox run lint # biome check
devbox run typecheck # 全ワークスペース tsc --noEmit
devbox run release:ext # 拡張機能 zip を packages/frontend/public/extension.zip にコピー
cd packages/backend && poetry run pytest # backend テスト詳細は docs/architecture.md と docs/ml-pipeline.md を参照。
開発期間が短いため、Day3 提出時点で「ここまでやった/ここは諦めた」を正直に書く。 正直に書くことは減点ではなく加点要素(自己評価力として審査される)。
- 拡張機能のプレゼンス向上:ブラウジング中に「同期された」ことをユーザーが気づけるような通知風インタラクション — 開発期間内に未着手
- Chrome Web Store への正式公開:ストア審査が必要なため未提出。現状は手動ロードでの動作確認のみで、一般ユーザーへの導線として現実的でない
- こっそりモード:ユーザーが閲覧履歴の収集を一時停止できる設定。プライバシー配慮として当初構想していたが期間内に不採用
- ステッカー交換機能:他ユーザーのニッチなステッカーをクリック・閲覧することでそのステッカーを獲得できるソーシャル機能
- プライバシーを考慮したデータ収集:現在は生のquery / url / titleをそのままhistory_nodesに保存しており、ユーザーが送信する情報を選択・除外できる機能が未実装
- レアリティ設計の実装:仕様上定義していたCommon / Rare / Epic(好奇心スコア連動)や「珍しい探索ルートそのもののレア度」の判定ロジックが未実装
- 閲覧履歴提供の動機付けが弱い:個人情報を渡す代わりに得られる体験の訴求が不十分で、初回オンボーディングのUXに改善余地がある
- データ販売モデルの実現性が未検討:企業への集計データ販売を構想しているが、必要なデータ収集量・達成見込み・プライバシー設計が未整理
- ユーザー間のソーシャルUXが薄い:同じステッカーを持つ他ユーザーとの接点が「閲覧のみ」に留まっており、繋がりを実感できる体験になっていない
- ステッカーの粒度が粗い:1日分のURLと検索クエリを平均ベクトルで集約しているため、ユーザーの「興味」を正確に抽出できていない可能性がある
- ノイズの混入:マルチタスクで複数テーマを並行して調べていたり、誤ってクリックしたURLも記録されるため、ステッカーの精度が下がることがある
- レアステッカー狙いの不健全なHack:レアリティ設計が「興味のない項目を意図的に検索し続ける」などの行動を誘発するリスクがある
- ステッカー生成画像の品質が不安定:プロンプトエンジニアリングで対応しているが、生成結果にばらつきがあり一定品質を保証できていない
メンター壁打ちの議事録。スポンサー側が事後に振り返る材料にもなるので、要点だけでも記入する。
| 日時 | メンター | 議論内容(要点) | 採用 / 一部採用 / 不採用 |
|---|---|---|---|
| Day2 10:30 | jnsk | こっそりモード実装検討 → 期間内は不採用 / 収益モデルの弱さ(課金理由・ユーザー継続)/ 将来性(AI検索移行リスク)/ プロダクトコア体験の明確化 / Eコマース連携の可能性 | 一部採用(Eコマース展開とステッカー偏愛可視化をアイデアとして検討継続) |
| Day2 16:30 | jnsk | データ販売モデルの具体化(生データではなく集計トレンドを販売)/ 各画面のUX・体験整理(ジャーニーマップ)/ 個人情報提供の説得力向上 / プレゼン戦略 | 採用(集計データ販売モデル・UX整理・実例作成) |
審査項目「AI 活用度」の根拠資料 → AI_USAGE_LOG.md
開発期間中に最低 1 日 3 件以上の追記を目安に。
提出後の運営側での扱いに関するチーム全員合意です。いずれも N で構いません(審査に一切影響なし)。
| 項目 | 許諾 (Y/N) | 補足・条件 |
|---|---|---|
| ① このリポを Public 化してよい(コードがすべて公開される) | Y | |
| ② プロダクト名・スクリーンショット・1行ピッチを HTV / Mercari の SNS・記事で掲載してよい | Y | |
| ③ スポンサー企業(Mercari, P&G 等)の広報・採用ページでプロダクト紹介してよい | Y |
メンターの jnsk さん、スポンサー企業の皆様、および Engineer Guild Hackathon 2026 運営チームの皆様に心より感謝いたします。
- Slack:
#eg-hackathon-2026-05(または#pjt_swe_event) - 緊急時: 運営メンバー(Mercari HQ 受付 → 運営呼び出し)



