Easy-to-manage touch screens
무료 오픈소스 터치스크린으로 USB 설정 가이드, 드래그‑드롭 편집기, 로컬 제어를 제공하며 Home Assistant용으로 제작되었습니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기車旅のしおり。旅程と車中泊マップ
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗This is a Next.js project bootstrapped with create-next-app.
旅行計画の作成から実施までをサポートするウェブアプリケーションで、Google Maps 連携により効率的な旅程管理を実現します。カーナビゲーション(Android Auto・Apple CarPlay)との連携を前提に設計されており、旅行中の移動をスムーズにサポートします。
全国の車中泊スポット情報(トイレ・入浴施設、安全性、静けさなど)を地図で検索でき、気になるスポットは旅程に直接追加可能。ユーザー投稿機能により、コミュニティで情報を共有できます。
📱 Android アプリを Google Play で公開中: 車中泊スポットマップ|車旅のしおり(アプリのソースは別リポジトリ
tns-mobileで管理。詳細は後述の「モバイルアプリ(Android)」を参照)
34.1560076,132.3973073)をクリップボード経由で簡単インポート。ITINERARY_DRAFT_ALLOWED_EMAILS で指定)で、将来的にはプレミアム会員特典として提供予定です(プレミアム会員機能自体はまだ未提供)。詳細は ADR-0008 / ADR-0009 を参照。車中泊スポットを地図で手軽に探せる Android アプリ 「車中泊スポットマップ|車旅のしおり」 を Google Play で公開しています。
club.over40web.tabi.spots)tns-web)とは別リポジトリ tns-mobile で管理(Expo / React Native)。/api/v1/*)を利用して車中泊スポット情報を取得します。API は固定 API キーで保護されており、アプリ側は EXPO_PUBLIC_SPOTS_API_KEY、Web 側は SPOTS_API_KEY に同じ値を設定します(「モバイルアプリ向け API」の項および ADR-0006 を参照)。Google Maps とシームレスに連携することで、旅行計画から実際の移動までをスムーズにサポートします。
個人開発ながら実際のユーザーがいる本番サービスとして運用しており、思いつきではなく計測・比較検討に基づいて設計判断を行っています。主な判断は ADR(Architecture Decision Record) として記録しています。
%%{init: {'theme':'neutral'}}%%
flowchart LR
U["利用者 / Android アプリ"] --> CF["Cloudflare<br/>(プロキシ・キャッシュ・WAF)"]
CF --> T["Cloudflare Tunnel"]
T --> D["ConoHa VPS の Docker<br/>Next.js standalone"]
D --> M["MongoDB Atlas"]
D --> A["Auth0 (認証)"]
D --> MB["Mapbox (地図・ジオコーディング)"]
D --> LLM["Anthropic API<br/>(AI旅程ドラフト生成)"]
D -.-> S["Sentry (エラー監視)"]
D -.-> P["PostHog (アクセス解析)"]
出発地・目的地・泊数から旅程ドラフトを LLM で生成する機能。「実在しない場所をでっち上げる」という LLM 特有のリスクを、検索と検証をコード側に寄せることで抑えています。
$geoWithin)で実在する車中泊スポットを検索し、ユーザーの好み(ペルソナ)や車両制約でスコアリング・絞り込み。$inc)で二重実行を防止し、成功時のみ消費する「ポイント制」で従量コストを制御。詳細設計は ADR-0008(アーキテクチャ)・ADR-0009(コスト・アクセス制御)・ADR-0010(ポイント制)を参照。
無料枠(Vercel Hobby)の CPU 使用量が利用増加に伴い恒常的に超過するようになったため、複数の移行先を比較検討した上で ConoHa VPS + Cloudflare Tunnel 構成へ移行(2026-09-20)。
| 検討した選択肢 | 見送った理由 |
|---|---|
| Cloudflare Workers | PoC で Mongoose の共有接続が並列アクセス時に不安定。データアクセス層の書き換えが必須かつ Worker サイズが無料枠を超過 |
| Netlify | 試験デプロイで日本からの応答速度が実用上厳しく、リージョン選択には有料プランが必要 |
| 自宅ミニPC | セルフホスト自体は検証済みだが、初期費用とVPSとの損益分岐が約4年後。停電・回線障害・セキュリティリスクを自宅で負うことになる |
| Vercel Pro | 運用の手間は最小だが、利用量に応じた課金で収支を予測しづらい(広告収入主体の小規模サービスのため) |
移行前にアプリ側の CPU 削減(詳細ページの ISR 化、トップページのクエリキャッシュ、地図操作時の不要な RSC リクエスト削減)にも取り組んでおり、インフラ変更の前にアプリ側でできることを尽くす判断をしています。DNS の切り替えのみで Vercel へ即時ロールバックできる構成にして移行リスクを抑えました。詳細は docs/self-hosting/migration-plan.md を参照。
updatedAt の比較で古いキャッシュを検出する stale-while-revalidate 方式(src/lib/itineraryCache.ts)。Content-Security-Policy は、広告(AdSense)や地図などサードパーティ接続先が多く「最初から全ブロック」では本番が壊れるリスクが高いため、段階的に適用しています。
Content-Security-Policy-Report-Only で本番稼働させ、違反レポートを Sentry に集約して観測。base-uri / object-src / frame-ancestors / form-action)だけを Content-Security-Policy(ブロック)として先行適用。ブラウザは複数の CSP ヘッダーを独立に評価するため、実運用への影響なく段階適用が成立します。本番環境では Mongoose の autoIndex を無効化しています(サーバーレス的なコールドスタートのたびに索引同期が走るのを避けるため)。そのため索引追加はコードの schema.index() だけでは本番に反映されず、専用スクリプト(scripts/sync-indexes.cjs)でドライラン確認後に明示的に同期する運用にしています。ユニーク制約は索引だけに頼らずアプリケーション層でも重複チェックを行い、索引未作成環境でも制約が機能するようにしています。
AUTH0_SECRET:
APP_BASE_URL:
AUTH0_CLIENT_ID:
AUTH0_CLIENT_SECRET:
AUTH0_DOMAIN:
your-tenant.auth0.comnext.config.mjs がビルド時にも参照し、CSP の form-action / connect-src に許可するオリジンを組み立てる(ビルド時に読めなかった場合に備えて同ファイルに既定値あり)。AUTH0_SCOPE:
openid profile email read:showsAUTH0_M2M_CLIENT_ID:
AUTH0_M2M_CLIENT_SECRET:
AUTH0_WEBHOOK_SECRET:
/api/auth/user-registered)を検証する共有シークレット。Authorization: Bearer <secret> ヘッダーに付けて送る。NEXT_PUBLIC_MAPBOX_ACCESS_TOKEN:
MAPBOX_SERVER_TOKEN(任意・AI旅程ドラフト生成を使う場合は推奨):
NEXT_PUBLIC_MAPBOX_ACCESS_TOKEN はサーバーからのリクエスト(Origin/Referer なし)が 403 になるため。NEXT_PUBLIC_MAPBOX_ACCESS_TOKEN にフォールバックするが、URL 制限があると 403 で座標解決に失敗しうる。pk.xxxxxxxx...MONGODB_URI:
/データベース名?の形式)mongodb+srv://username:[email protected]/itinerary_db_dev?retryWrites=true&w=majoritymongodb+srv://username:[email protected]/itinerary_db?retryWrites=true&w=majorityAPP_MONGODB_URI(開発環境のみ):
MONGODB_URI を上書きする場合の回避策。MONGODB_URI より優先して使用されます。環境別のデータベース設定:
.env.local): itinerary_db_dev を使用。MCP サーバーとの競合を避けるため APP_MONGODB_URI も設定を推奨。itinerary_db を使用。MONGODB_URI のみで OK。ENVIRONMENT_SETUP.md を参照してください。SPOTS_API_KEY(必須):
/api/v1/*(モバイルアプリ向け公開API)を保護する固定APIキー。src/proxy.ts で検証される。x-api-key が一致しない場合に 401 を返す。未設定の環境では /api/v1/* は全て 401(fail-closed。設定漏れで保護が静かに無効化されるのを防ぐ)。EXPO_PUBLIC_SPOTS_API_KEY に同じ値を設定する(tns-mobile リポジトリ参照)。/api/v1/spots は Cache-Control: s-maxage=3600 を返しており、最大1時間 CDN にキャッシュされる。
そのためスポットの投稿・更新がアプリに反映されるまで最大1時間かかる場合がある。
セルフホスト環境(VPS + Cloudflare Tunnel)では、Cloudflare の WAF カスタムルールがエッジでキーを検証してから
Cache Rules がキャッシュする構成になっており、鍵検証とキャッシュを両立している(詳細は
docs/self-hosting/migration-plan.md を参照)。APP_ENV(Vercel 以外で必須):
production / staging など)。Sentry の有効化と、CSP のレポート環境名の判定に使う(src/lib/appEnv.ts)。VERCEL_ENV が自動で設定されるため不要。セルフホスト(VPS の Docker)では VERCEL_ENV が空になるので、
本番では APP_ENV=production を設定しないと、サーバー側のエラーが Sentry に届かない。next.config.mjs はビルド時にしか評価されないため、ビルド時にも渡す必要がある(scripts/deploy-vps.sh が build args で渡す)。SENTRY_AUTH_TOKEN:
NEXT_PUBLIC_POSTHOG_KEY:
phc_XXXXXXXXXXXXXXXXNEXT_PUBLIC_POSTHOG_HOST:
https://us.i.posthog.com。https://eu.i.posthog.com。POSTHOG_PERSONAL_API_KEY / POSTHOG_PROJECT_ID / POSTHOG_API_HOST(任意):
POSTHOG_API_HOST の既定は https://us.posthog.com(EU は https://eu.posthog.com)。NEXT_PUBLIC_ADS_ENABLED:
false で停止(既定)。true で再開。NEXT_PUBLIC_SHOW_AD_LINK の両方が true の場合だけ表示します。true に変更し、再ビルド・デプロイしてください。NEXT_PUBLIC_ADSENSE_CLIENT_ID:
ca-pub-XXXXXXXXXXXXXXXXNEXT_PUBLIC_ADSENSE_SLOT_DETAIL_TOP / NEXT_PUBLIC_ADSENSE_SLOT_DETAIL_BOTTOM:
1234567890ADMIN_EMAIL:
[email protected]ADMIN_EMAILS:
[email protected],[email protected]「AIで下書き」機能(実在の車中泊スポットを軸に旅程ドラフトを生成する機能)で使用する。設計の詳細は docs/adr/0008-itinerary-draft-generation-architecture.md および docs/adr/0009-ai-generation-cost-and-access-policy.md を参照。
ANTHROPIC_API_KEY(この機能を使う場合は必須):
claude-haiku-4-5、1 回あたり約 1〜2 円)。sk-ant-xxxxxxxx...ITINERARY_DRAFT_ALLOWED_EMAILS(この機能を使う場合は必須):
ADMIN_EMAILS とは別枠の管理。[email protected],[email protected]MAPBOX_SERVER_TOKEN(「地図」の項を参照)も使用する。RESEND_API_KEY:
over40web.club に限定)。re_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxRESEND_FROM_EMAIL:
over40web.club ドメインのアドレスを指定。[email protected]RESEND_FROM_NAME:
車旅のしおりお問い合わせフォームから送信されたメールは以下の流れで処理されます:
[email protected] から送信over40web.clubドメイン)[email protected] に転送メール転送設定の管理:
[email protected] → [email protected] の転送設定この設定により、お問い合わせ内容が確実に管理者チームに届きます。
$ docker-compose up --build
First, run the development server:
npm run dev
# or
yarn dev
# or
pnpm dev
# or
bun dev
Open http://localhost:3000 with your browser to see the result.
You can start editing the page by modifying app/page.tsx. The page auto-updates as you edit the file.
This project uses next/font to automatically optimize and load Inter, a custom Google Font.
To learn more about Next.js, take a look at the following resources:
You can check out the Next.js GitHub repository - your feedback and contributions are welcome!
The easiest way to deploy your Next.js app is to use the Vercel Platform from the creators of Next.js.
Check out our Next.js deployment documentation for more details.
Claude Code で MongoDB Atlas データベースを安全に探索・分析するためのセットアップ手順
Model Context Protocol (MCP) を使用して、Claude Code から MongoDB Atlas データベースに読み取り専用でアクセスできるようにする設定方法です。これにより、自然言語でデータベースの探索、スキーマ分析、データ分析が可能になります。
Authentication Method: Password
Username: claude_readonly
Password: 強力なパスワード(保存しておく)
Database User Privileges: Only read any database
0.0.0.0/0(開発用)を追加mongodb+srv://claude_readonly:[email protected]/?retryWrites=true&w=majority&appName=ClaudeMCP
機密情報を安全に管理するため、接続文字列を環境変数で設定します。
# プロジェクトルートに .env.mcp ファイルを作成
echo "MONGODB_URI_READONLY=mongodb+srv://claude_readonly:[email protected]/?appName=ClaudeMCP" > .env.mcp
# .gitignore に機密情報ファイルを追加
echo ".env.mcp" >> .gitignore
echo "setting.local.json" >> .gitignore
# プロジェクトルートディレクトリで実行
claude mcp add -s project mongodb-readonly \
--env-file .env.mcp \
-e MDB_MCP_READ_ONLY="true" \
-- npx -y @mongodb-js/mongodb-mcp-server --readOnly
# 機密情報を直接指定(本番環境では非推奨)
claude mcp add -s project mongodb-readonly \
-e MDB_MCP_CONNECTION_STRING="mongodb+srv://claude_readonly:[email protected]/?appName=ClaudeMCP" \
-e MDB_MCP_READ_ONLY="true" \
-- npx -y @mongodb-js/mongodb-mcp-server --readOnly
# MCP サーバー一覧を確認
claude mcp list
# 出力例:
# mongodb-readonly: npx -y @mongodb-js/mongodb-mcp-server - ✓ Connected
claude
/mcp
データベース一覧を表示して
itinerary_dbデータベースのコレクション一覧を教えて
itinerariesコレクションのフィールド一覧と各フィールドのデータ型を教えて
itinerariesコレクションに何件のドキュメントがありますか?
itinerariesコレクションのサンプルデータを3件表示して
itinerary_dbitineraries (4 件のドキュメント)| フィールド | データ型 | 説明 |
|---|---|---|
_id | ObjectId | MongoDB 標準 ID |
createdAt | String/Date | 作成日時 |
dayPlans | Array | 日別プラン |
description | String | 旅行の説明 |
isPublic | Boolean | 公開設定 |
numberOfDays | Number | 旅行日数 |
owner | Document | 作成者情報 |
sharedWith | Array | 共有ユーザー |
startDate | String | 開始日 |
title | String | 旅行タイトル |
updatedAt | Date | 更新日時 |
「最も人気のある旅行先を分析して」
「過去1ヶ月の新規作成された旅行プラン数は?」
「平均的な旅行日数を教えて」
「このスキーマに基づいてTypeScript型定義を生成して」
「Next.jsでitinerariesを取得するAPIルートのコードを書いて」
「MongoDB Aggregationパイプラインで人気の旅行先TOP5を取得するクエリを作成して」
「MongooseスキーマでItineraryモデルを定義して」
「React コンポーネントでitinerary一覧を表示するコードを書いて」
ユーザー権限の確認
ネットワークアクセス
接続文字列
# サーバーを削除
claude mcp remove mongodb-readonly
# 再度追加
claude mcp add -s project mongodb-readonly \
-e MDB_MCP_CONNECTION_STRING="your-connection-string" \
-e MDB_MCP_READ_ONLY="true" \
-- npx -y @mongodb-js/mongodb-mcp-server --readOnly
.mcp.json - チーム共有の MCP 設定(機密情報なし)README.md - セットアップ手順# MCP関連の機密情報
.env.mcp
setting.local.json
# Next.js環境変数
.env.local
.env.*.local
# その他
node_modules/
.next/
# .env.local(開発環境)
# APP_MONGODB_URI: MCP サーバーとの競合回避のため設定(開発環境のみ)
APP_MONGODB_URI=mongodb+srv://app_user:[email protected]/itinerary_db_dev
MONGODB_URI=mongodb+srv://app_user:[email protected]/itinerary_db_dev
# 本番環境(Vercel等)では MONGODB_URI のみ設定すれば OK
# MONGODB_URI=mongodb+srv://app_user:[email protected]/itinerary_db
# .env.mcp
MONGODB_URI_READONLY=mongodb+srv://claude_readonly:[email protected]/?appName=ClaudeMCP
チーム共有用の設定(機密情報を環境変数で参照):
{
"mcpServers": {
"next-devtools": {
"command": "npx",
"args": ["-y", "next-devtools-mcp@latest"]
},
"Sentry": {
"type": "http",
"url": "https://mcp.sentry.dev/mcp"
},
"mongodb-readonly": {
"type": "stdio",
"command": "cmd",
"args": ["/c", "npx", "-y", "@mongodb-js/mongodb-mcp-server"],
"env": {
"MDB_MCP_CONNECTION_STRING": "${MONGODB_URI}",
"MDB_MCP_READ_ONLY": "true"
}
}
}
}
注意: 上記は Windows 環境用の設定です。
{
"mcpServers": {
"next-devtools": {
"command": "npx",
"args": ["-y", "next-devtools-mcp@latest"]
},
"Sentry": {
"type": "http",
"url": "https://mcp.sentry.dev/mcp"
},
"mongodb-readonly": {
"type": "stdio",
"command": "cmd",
"args": ["/c", "npx", "-y", "@mongodb-js/mongodb-mcp-server"],
"env": {
"MDB_MCP_CONNECTION_STRING": "${MONGODB_URI}",
"MDB_MCP_READ_ONLY": "true"
}
},
"context7-project": {
"type": "http",
"url": "https://mcp.context7.com/mcp",
"headers": {
"CONTEXT7_API_KEY": "${CONTEXT7_API_KEY}",
"X-Project-Context": "travel-itinerary-nextjs"
}
}
}
}
注意: Windows 環境では cmd /c npx の形式でコマンドを実行する必要があります。macOS/Linux では "command": "npx" と "args": ["-y", "@mongodb-js/mongodb-mcp-server"] の形式で設定してください。
# Claude Code MCP用の読み取り専用接続文字列
MONGODB_URI_READONLY=mongodb+srv://claude_readonly:[email protected]/?appName=ClaudeMCP
Next.js DevTools MCP サーバーを使用すると、Claude Code から Next.js アプリケーションの内部情報(ルート一覧、設定、ビルド情報など)に直接アクセスできます。
.mcp.json に以下の設定が含まれています:
{
"mcpServers": {
"next-devtools": {
"command": "npx",
"args": ["-y", "next-devtools-mcp@latest"]
}
}
}
注意: type を省略した場合は stdio として扱われます。
Sentry MCP サーバーを使用すると、Claude Code から Sentry のエラー監視データに直接アクセスできます。
.mcp.json に以下の設定が含まれています:
{
"mcpServers": {
"Sentry": {
"type": "http",
"url": "https://mcp.sentry.dev/mcp"
}
}
}
初回使用時に Sentry アカウントでの認証が必要です:
# Claude Code を起動
claude
# MCP 接続状況を確認
/mcp
# → "Authentication successful. Connected to Sentry." と表示されれば OK
# 本日のエラーを検索
「本日発生したエラーを表示して」
# 特定の Issue の詳細を取得
「TABI-NO-SHIORI-56 の詳細を教えて」
# 根本原因の分析
「この Issue の Root Cause 分析をして」
Context7 は AI アシスタント向けのコンテキスト管理サービスです。Claude Code との統合により、プロジェクトの履歴管理や高度なコンテキスト検索機能を提供します。
このプロジェクトでは、使用している技術スタック(Next.js 16、React 19、Tailwind CSS、Jotai、MongoDB、Auth0 など)の最新ドキュメントを参照できるよう、プロジェクト固有の Context7 設定を行っています。
環境変数の設定
# .env.mcp.exampleを.env.mcpにコピー
cp .env.mcp.example .env.mcp
# 実際のAPIキーを設定
# CONTEXT7_API_KEY=your-actual-api-key
MCP 設定ファイル
.mcp.jsonにプロジェクト専用の Context7 設定が含まれています:
{
"mcpServers": {
"context7-project": {
"type": "http",
"url": "https://mcp.context7.com/mcp",
"headers": {
"CONTEXT7_API_KEY": "${CONTEXT7_API_KEY}",
"X-Project-Context": "travel-itinerary-nextjs"
}
}
}
}
接続確認
# MCPサーバー一覧を確認
claude mcp list
正常に接続されている場合:
mongodb-readonly: npx -y @mongodb-js/mongodb-mcp-server - ✓ Connected
context7-project: https://mcp.context7.com/mcp (HTTP) - ✓ Connected
Context7 から最新ドキュメントを取得可能な技術: