# しくみの詳細

> goodnight-web の部品ごとに、何をするか、どう動くか、なぜそう作るかを説明します。

部品ごとに 1 ページずつ、動きの要点、実際のコードの抜粋、そう作った理由をまとめています。

コードの抜粋は短く、リポジトリからそのまま写したものです。抜粋の上にファイルのパスがあるので、リポジトリでファイル全体を確認できます。

- [問い合わせフォームの保護](https://goodnight-web.dev/ja/docs/how-it-works/contact-protection.md): サーバー側での Turnstile の検証、honeypot、ルールによるスパムスコア、Rate Limiting binding。
- [Passkey でのログイン](https://goodnight-web.dev/ja/docs/how-it-works/passkeys.md): Better Auth の Passkey でログインするしくみと、パスワードを使わない理由。
- [最初の管理者の作成](https://goodnight-web.dev/ja/docs/how-it-works/first-admin.md): `APP_SECRET` と `ADMIN_EMAILS` で、知らない人が最初の管理者になるのを防ぐしくみ。
- [Passkey が使えないとき、失くしたとき](https://goodnight-web.dev/ja/docs/how-it-works/passkey-recovery.md): Passkey が使える環境と、D1 を手で書き換えて管理者を取り戻す手順。
- [Cron を使わない古いデータの削除](https://goodnight-web.dev/ja/docs/how-it-works/data-pruning.md): 定期実行のジョブなしで保持期間を守るしくみ。
- [Slack 通知](https://goodnight-web.dev/ja/docs/how-it-works/notifications.md): 応答の後に送る、個人情報を含まない短い通知。
- [生の IP アドレスを保存しない](https://goodnight-web.dev/ja/docs/how-it-works/ip-hashing.md): IP アドレスを保存せず、HMAC だけを残すしくみと理由。
