JP / EN / PT
Kaimono
https://p0r6iz89.cloud
Github
日常の買い物で、こんなふうに感じたことはありませんか?
出費を1つずつ記録するのは面倒で、合計も把握しづらい。候補が増えるほど判断に迷って、なかなか購入に進めない。
この課題に向き合うため、買い物の計画、予算の可視化、共同管理に対応した多言語 Web アプリ Kaimono を開発しました。
日用品は、繰り返し購入するものや直近で必要なものを扱う軽量な買い物リストです。タイトル、価格、数量、購入状況を記録し、未購入分の支出を把握できます。
比較や予算検討が必要な商品には、優先度、商品 URL、画像、説明、コメント、いいね、関連プロジェクトなどの詳しい情報を保存できます。
購入予定品を目的ごとにまとめ、合計予算を分かりやすくします。たとえば部屋の模様替えなら、照明、家具、装飾品の候補を1つのプロジェクトで整理できます。
ワークスペースのオーナーと管理者は、メールでメンバーを招待できます。メンバーシップとテナントの検証はサーバー側で行い、別ワークスペースのデータへアクセスしたり移動したりできないようにしています。
すべての項目を手入力する代わりに、公開されている商品 URL を送信できます。Kaimono は構造化された商品メタデータを読み取り、AI でテキストを整え、有効な商品画像があれば取り込みます。
抽出処理には URL の安全性検証、リダイレクト回数とレスポンスサイズの制限、タイムアウト、任意のレート制限を実装しています。また、簡単なクレジット残高で利用回数を管理し、無制限の抽出リクエストを防いでいます。
Auth.js を利用し、GitHub、Google、メールのマジックリンクによるログインに対応しています。ユーザーはアカウント設定から TOTP 二要素認証を任意で有効化できます。
設定時には認証アプリ用 QR コードと、1回のみ使えるリカバリーコードを生成します。有効化したアカウントは、保護されたワークスペースへ進む前に二要素認証を完了する必要があります。
本番環境ではワークスペースごとにサブドメインを利用します。
workspace.p0r6iz89.cloud
workspace がテナントを識別するサブドメインp0r6iz89.cloud がルートドメインmiddleware は、ロケール処理、認証確認、二要素認証、ワークスペースルーティングをまとめて扱います。
/{locale}/s/{subdomain} へ rewrite。middleware.ts Request Flow
これにより、公開 URL を簡潔に保ちながら、1つの多言語 App Router 構成でワークスペースを管理できます。
Server Actions と Prisma を採用し、各フォームのために個別の REST API を用意せず、型付きの検証とデータベース処理をページのワークフロー内で共有できる構成にしました。
テナントが所有する操作では、認証ユーザーとワークスペースのメンバーシップをサーバー側で必ず確認します。更新入力は Zod で検証し、複合リレーションによって別ワークスペースのプロジェクトへ購入予定品を割り当てられないようにしています。
特に難しかったのは、認証、ロケールルーティング、ワークスペースのサブドメインを1つの仕組みとして動かすことでした。この境界を自分で実装したことで、ホストベースルーティング、認可、安全な URL 処理、状態を持つ認証フローへの理解を深めました。
Kaimono は npm と Docker でローカル起動できます。
npm install
docker compose up -d db
npx prisma migrate dev
npm run dev
リンク:
ローカル URL:
http://localhost:3000/jahttp://workspace.localhost:3000/jaDocker Compose では PostgreSQL を起動し、Next.js アプリ本体は npm run dev で実行します。