Serein
Rust로 만든 가볍고 성능 좋은 Discord 전용 네이티브 클라이언트
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
買い物中に別行動になった家族・友人と、だいたいの位置を「レーダー」でざっくり共有するアプリ。 正確な地図やナビではなく、方角と距離だけを見せる。詳しい設計思想は design-spec.md を参照。 技術構成: Vite + TypeScript(フレームワークなし) + Supabase(DB。読み書きはRPC関数経由、5秒ごとのポーリングで同期)。 • Node.js(18以上) • Supabaseの無料アカウント( https://supabase.com )README 전문 보기 ↗
買い物中に別行動になった家族・友人と、だいたいの位置を「レーダー」でざっくり共有するアプリ。
正確な地図やナビではなく、方角と距離だけを見せる。詳しい設計思想は design-spec.md を参照。
技術構成: Vite + TypeScript(フレームワークなし) + Supabase(DB。読み書きはRPC関数経由、5秒ごとのポーリングで同期)。
npm install
pg_cron を有効化(古いグループの自動削除に使う)supabase/schema.sql の中身を全部貼り付けて実行
(groups テーブルと members テーブル、読み書き用のRPC関数一式、古いグループの自動削除ジョブが作られる。テーブルへの直接アクセスは塞がれていて、必ずRPC経由になる)Project URLanon public キー(新しいSupabaseでは Publishable key という名前)既存のSupabaseプロジェクトを古い方式(テーブル直アクセスを許可するRLS)から移行する場合は、supabase/harden_rls.sql を先に実行してから supabase/schema.sql を実行してください。
.env.example をコピーして .env を作り、2-2でコピーした値を入れる。
cp .env.example .env
VITE_SUPABASE_URL=https://xxxxx.supabase.co
VITE_SUPABASE_ANON_KEY=xxxxxxxxxxxxxxxxxxxx
.env はGitにコミットしない(.gitignore済み)。
npm run dev
表示されたURL(http://localhost:5173 など)をブラウザで開く。
注意: 位置情報の許可ダイアログはHTTPSでないと基本的に出ない。localhost は例外的に許可されるブラウザが多いのでローカル開発では動くはずだが、スマホ実機で試す場合は同じネットワーク上でも http:// のIPアドレスだと出ないことがある(後述のVercelデプロイ後に試すのが確実)。
VITE_SUPABASE_URL と VITE_SUPABASE_ANON_KEY を設定npm run build / Output: dist。Viteプロジェクトなので自動検出されるはず)Vercelは自動でHTTPSになるので、スマホでの位置情報許可もそのまま機能する。
| ファイル | 役割 |
|---|---|
src/main.ts | 画面遷移・位置情報の取得と送信・ポーリング・レーダー描画。ロジックの本体 |
src/lib/geo.ts | 距離(Haversine)・方角(bearing)の計算 |
src/lib/colors.ts | 参加順に応じたメンバーカラーの割り当て(6色パレット、6人目以降はループ) |
src/lib/format.ts | 距離・経過時間の表示フォーマット、グループコード生成 |
src/lib/supabase.ts | Supabaseクライアントの初期化 |
src/style.css | デザイントークン(色・フォント・角丸など)を含む全スタイル |
supabase/schema.sql | DBスキーマ・RPC関数(読み書きの唯一の窓口) |
supabase/harden_rls.sql | 古い設定からの移行スクリプト(初回セットアップでは不要) |
groups/members に「誰でも読み書きOK」というRLSを設定していたが、これだと「グループコードを知らない第三者でも、Supabaseに直接問い合わせれば全グループ・全メンバーの現在地を丸ごと取得できてしまう」という問題があった。今は直接のテーブルアクセスを塞ぎ、get_group_members(p_code) のような「指定したグループの情報だけ返す」RPC関数だけを公開している。ただし4文字のグループコードを総当たりされるリスクはゼロではない(仕様書の「コードを知っている人には見える」というモデル自体がそういう前提)。postgres_changes)は「テーブルへの直接読み取り許可」が必要な仕組みで、上記のアクセス制限と両立しないため。仕様書 5.2 に書かれているもう一つの選択肢(3〜5秒間隔のポーリング)を採用した。pg_cronでcleanup_stale_groups()を毎日実行し、7日間誰も位置情報を更新していないグループをメンバーごと削除している(有効化手順は下記コメント参照)。仕様書7章と同じ:招待方法(QRコードなど)、グループの自動解散、プライバシー同意文言の整備、オフライン時の挙動。