Serein
Rust로 만든 가볍고 성능 좋은 Discord 전용 네이티브 클라이언트
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
本番: https://surechigai.kimito.link GitHub リポジトリ: kimito-link/surechigai-romi.link 移動の副産物として封筒(すれ違い)が溜まり、帰宅後にまとめて開封する受動体験アプリ。 DSすれちがい通信の本質「開いた時に既に何かが起きている」をコアに据え、Xログインのみ・アプリ内DM禁止で運営する。 コンセプトを「移動の足あとを正確に残し、後で思い出の場所をたどれる/推しの軌跡を聖地巡礼できる」へ転換。 当初の「生座標を保存しない・48h削除」は廃止した。 1. 正確な座標を残す — lat/lng/accuracyM を保存。後でその場所に行ける精度。マッチング用に丸め値も併せて保持 2. 消さない(永続保存) — locations は削除しない。日を重ねるほど軌跡が積み上がる 3. タイムシフトマッチング — 同時刻同地点が不要。過去30日同セル通過者と成立 4. 自衛はユーザーに委ねる — 隠したい場所は「移動専用アカウント」の利用で(Xで名前を出してやる前提のため) • Node.js 22.x 以上 • pnpm 9.x 以上README 전문 보기 ↗
本番: https://surechigai.kimito.link
GitHub リポジトリ: kimito-link/surechigai-romi.link
移動の副産物として封筒(すれ違い)が溜まり、帰宅後にまとめて開封する受動体験アプリ。 DSすれちがい通信の本質「開いた時に既に何かが起きている」をコアに据え、Xログインのみ・アプリ内DM禁止で運営する。
設計書: ../_archive/surechigai-nico/docs/V2-SURECHIGAI-DESIGN.md
| 特性 | 内容 |
|---|---|
| コンセプト | 移動の副産物としてすれ違い体験を積み重ねる |
| ログイン | X (Twitter) OAuth 2.0 のみ |
| 位置情報 | 正確な座標(lat/lng/accuracy)を保存し、後でその思い出の場所に行ける精度で残す。すれ違いマッチング用に H3 res8(約460m)+ 500m グリッドの丸め値も併せて保持 |
| マッチング | オンデマンド即時 + タイムシフト(過去30日同セル)の2本柱 |
| 削除ポリシー | 永続保存(48h削除は廃止)。足あとを思い出として残す方針 |
| 交流 | X に委譲。アプリ内は定型スタンプ一方向リアクションのみ。DM禁止 |
| インフラ | Vercel (フロント+API Functions) + Railway PostgreSQL + GitHub Actions スイープ |
コンセプトを「移動の足あとを正確に残し、後で思い出の場所をたどれる/推しの軌跡を聖地巡礼できる」へ転換。 当初の「生座標を保存しない・48h削除」は廃止した。
lat/lng/accuracyM を保存。後でその場所に行ける精度。マッチング用に丸め値も併せて保持locations は削除しない。日を重ねるほど軌跡が積み上がる| レイヤー | 採用技術 |
|---|---|
| フロントエンド | Expo Router (web/iOS/Android 1コードベース), NativeWind, tRPC client |
| バックエンド | tRPC + Express (Vercel Functions に同居), Drizzle ORM |
| DB | Railway PostgreSQL, H3 + B-tree (PostGIS 非依存)。DATABASE_URL は Railway 外部URL *.proxy.rlwy.net。詳細は CLAUDE.md「Railway / データベースについて」 |
| 認証 | Clerk + Twitter OAuth 2.0 PKCE |
| 位置精度 | H3 res8 (約460m), h3-js ライブラリ |
| モデレーション | Groq llama-3.1-8b-instant (14,400 RPD) 主 + Gemini Flash-Lite 控え |
| 地図 (フェーズ2) | MapLibre + OpenFreeMap (キー不要・無制限) |
| 通知 (フェーズ2) | Expo Push (完全無料) |
pnpm install
*.proxy.rlwy.net)を取得(内部URL *.railway.internal はローカルから接続不可)DATABASE_URL に設定# DB スキーマを Railway PostgreSQL に適用
pnpm db:push
EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY と CLERK_SECRET_KEY を取得https://clerk.kimito.link/v1/oauth_callbackhttp://localhost:8081/oauth/twitter-callbackTWITTER_CLIENT_ID と TWITTER_CLIENT_SECRET を取得.env.example をコピーして .env.local を作成:
cp .env.example .env.local
# 各変数を編集
pnpm dev
| 変数名 | 必須 | 説明 |
|---|---|---|
DATABASE_URL | 必須 | Railway PostgreSQL 接続文字列(外部URL *.proxy.rlwy.net) |
EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY | 必須 | Clerk 公開キー |
CLERK_SECRET_KEY | 必須 | Clerk シークレットキー |
TWITTER_CLIENT_ID | 必須 | Twitter OAuth 2.0 クライアント ID |
TWITTER_CLIENT_SECRET | 必須 | Twitter OAuth 2.0 クライアントシークレット |
ENCRYPTION_KEY | 必須 | Twitter トークン暗号化用 64 文字 hex キー (openssl rand -hex 32) |
SESSION_SECRET | 必須 | セッション署名用シークレット |
SWEEP_SECRET | 必須 | GitHub Actions スイープ Webhook 認証トークン |
NODE_ENV | 任意 | development / production |
PORT | 任意 | バックエンドポート (デフォルト: 3000) |
SENTRY_DSN | 任意 | Sentry エラー監視 DSN |
GROQ_API_KEY | 任意 | Groq API キー (ひとこと NGワードモデレーション) |
GEMINI_API_KEY | 任意 | Gemini API キー (モデレーション控え) |
# 本番向け guest smoke + 全ページ監査(mobile + desktop)
PLAYWRIGHT_BASE_URL=https://surechigai.kimito.link pnpm e2e
# 監査のみ
pnpm e2e:audit
# 認証済み E2E 用 — ブラウザで X ログイン完了後 .auth/auth-state.json を保存
pnpm e2e:auth-save
手動チェックリスト(認証 6タブ): docs/critical-features-checklist.md
監査結果: docs/investigation/full-site-audit-results.md
| 設定項目 | 値 |
|---|---|
| ドメイン | surechigai.kimito.link |
| Framework Preset | Other |
| Build Command | pnpm expo export -p web |
| Output Directory | dist |
| Install Command | pnpm install |
| Node.js Version | 22.x |
Vercel の Environment Variables に上記の「環境変数一覧」を全て設定すること。
スイープワークフロー (sweep.yml) に以下の secrets が必要:
| Secret 名 | 内容 |
|---|---|
DATABASE_URL | Railway PostgreSQL 接続文字列 |
SWEEP_SECRET | スイープ Webhook 認証トークン (.env.local の値と一致させる) |
API_BASE_URL | 本番 API URL (例: https://surechigai.kimito.link) |
surechigai-romi.link/
├── app/
│ ├── (tabs)/ # 5タブ画面
│ │ ├── index.tsx # ポスト(封筒開封UI)
│ │ ├── checkin.tsx # チェックイン(位置送信)
│ │ ├── zukan.tsx # 図鑑(47都道府県グリッド)
│ │ ├── map.tsx # 軌跡マップ
│ │ └── mypage.tsx # マイページ
│ └── oauth/
│ └── twitter-callback.tsx
├── modules/
│ └── encounter/ # すれ違いコアロジック
│ ├── core/ # 純TS: geo/tiers/matching/moderation/geocoding/privacy
│ └── db/ # Drizzle クエリ
├── server/
│ ├── routers/
│ │ ├── encounter.ts # tRPC encounter ルーター
│ │ ├── safety.ts # ブロック・通報
│ │ └── zukan.ts # 図鑑・訪問エリア
│ └── db/ # DB クエリ層
├── drizzle/
│ └── schema.ts # Railway PostgreSQL スキーマ定義
├── .github/workflows/
│ └── sweep.yml # 日次スイープ: DB keepalive・タイムシフトマッチング回収(48h削除は廃止)
├── .env.example # 環境変数テンプレート
└── CLAUDE.md # AIアシスタント向けコア・ディレクティブ
pnpm add maplibre-gl 後、app/(tabs)/map.web.tsx で H3 セルを GeoJSON → maplibre-gl レイヤーとして描画safety.listBlocked を追加して mypage.tsx に接続modules/encounter/ を doin-challenge.com に移植MIT License