SpotLink

https://github.com/ru-se/58Hack-SpotLink

Next.js

Go

GitHub

Figma

PostgreSQL

リアルタイム文字起こしで会話の輪が見える、ハッカソン懇親会専用ア

Ryusei Uetani

Masachika Ura

小林 航世

Rikuto Makihara

推しアイデア

「会話の可視化」と「脱出の正当化」を実現。 リアルタイム文字起こしで「今何話してる?」を可視化し、会話の輪に入る障壁を撤廃。さらに「緊急クエスト」が移動の口実を強制通知。「抜けたいけど気まずい」状況を打破し、心理的安全性を守りつつ会場の流動性を生み出す仕掛けを搭載しました。

作った背景

ハッカソンは楽しいのに、懇親会だけ「気まずい」のはなぜ? 最大の障壁は「誰と何を話せばいいか」という情報の不透明さでした。 私たちはここに着目し、会話と興味を可視化。「懇親会のためにハッカソンに出たい」と思えるほど、交流ハードルを極限まで下げた最高のパーティー体験を作ります。

推し技術

「リアルタイム音声解析」×「GitHub連携」 会話の可視化:マイク入力で会話を文字起こしし、盛り上がりを光や振動で演出。 AIレコメンド:GitHub一発ログインで技術スタックを解析し、最適な話し相手を提案。 開発者ならではの技術で、開発者が最も交流しやすい空間を構築しま

プロジェクト詳細

コンセプト: The Blind Swipe

地図は見ない!!!! 空気感で探す!!! 地図上のピンを頼りに移動するのはもう古いです。

SpotLinkは、画面上の「すりガラス越しの景色」と「スマホの振動」だけで、その場の盛り上がりを直感的に伝えます。 Tinderのようにスワイプするたびに「会話のチャンネル」が切り替わり、自分の興味とマッチした瞬間、スマホが共鳴(バイブレーション)する。視覚情報に頼らない、聴覚と触覚のインターフェースです。

心理的安全性:緊急脱出クエスト

「抜けたい」を「ミッション」に変える。 会話の輪から抜け出す時の気まずさを完全に排除しました。 「そろそろ移動したいな…」と思った時、運営から「【緊急指令】窓際のRustチームを偵察せよ!」というクエスト通知が届きます。

これにより、「飽きたから抜ける」のではなく「ミッションのために行かなければならない」という正当な口実が生まれ、会場全体の流動性が劇的に向上します。

AIアシスト:「最初の一言」

コミュ障のための「武器」を配る。 輪に入る直前、AIがこれまでの会話ログを分析し、「今、Goの並行処理の話で盛り上がってますよ。『goroutineのリークって怖いですよね』と話しかけてみてください」と、具体的な最初の一言を提案してくれます。

あなたはただ、その画面を見せて、読むだけ。

技術的なこと

image

Go & WebSocketによる超低遅延同期

何十人が同時に喋り、移動するカオスな状況を捌くため、バックエンドにはGo言語を採用。

会話ログや「場の熱量(Energy)」といった高頻度で更新されるデータは、DBではなくオンメモリで管理。sync.RWMutexによる厳密な排他制御と、Gorilla WebSocketによるブロードキャストを組み合わせ、データベースのI/Oボトルネックを回避した爆速のレスポンスを実現しました。

「単語」ではなく「文脈」をハックする

GeminiAI APIをバックグラウンドワーカーとして統合。

単に文字起こしをするだけでなく、流れる会話ログから「今、何について議論しているか」と「重要なキーワード」をリアルタイムに抽出・更新し続けます。 この構造化されたコンテキストデータが、ユーザーの興味タグとマッチングし、スマホを振動させるトリガーとなります。

ハッカソンでも「きれいなコード」を!!!

短期間の開発でも保守性を捨てません。 ドメイン駆動設計に基づき、オニオンアーキテクチャを採用。 「会話の解析ロジック」と「Webフレームワーク」や「DB」を疎結合に保つことで、開発途中での仕様変更や機能追加にも柔軟に対応できる堅牢なバックエンドを構築しました。

DB設計頑張りました!

image

figmaとかNotionもめっちゃ書いてます!!

多分どのチームよりも!! https://www.notion.so/d92e065c805f4615a37c1f2989cc045a https://www.figma.com/board/bZt4m3EYhjM714Hg9tFkkG/58hack_2025-11?node-id=0-1&p=f&t=09iAq7M8MRySc0st-0

imageimageimage

そして中々に追いやられてました...

image

Ryusei Uetani

@e7ae5f1008274bdb