aite
AI に聞いて、貼るだけ。aite は、アカウント登録なしで使える軽量な日程調整サービスです。作成者が候補日時または候補日を用意し、回答者は手入力または AI が返した JSON で参加可能な予定をまとめて入力できます。
GitHub: TetsuakiBaba/aite
主な機能
- 時間帯を含む日程調整と、日付だけを確認する日程調整
- 月カレンダーからの候補作成、手入力、10 分刻みの時間指定
- 最低必要時間の設定。回答者の OK 範囲と AI の回答に同じ制約を適用
- ドラッグ操作による参加可能時間の入力と、AI 用プロンプトからの一括反映
- 回答者ごとの編集用パスワードと、前回回答の再読み込み
- 回答 URL・管理 URL のコピー、集計表示、CSV ダウンロード
- このブラウザで最近開いたイベントへのリンクを localStorage に保存
- 日本語・英語の自動表示。
?lang=ja または ?lang=en で明示的に切り替え可能
- 管理者モードでの全イベント一覧、個別削除、データベース全消去
- トップページへのアクセス時、更新から 1 か月を過ぎたイベントを自動削除
Google Calendar などの外部カレンダー API とは連携しません。AI 用プロンプトを各自が使う AI に渡し、その結果を貼り付ける設計です。
動作環境
- PHP 8.x
- SQLite PDO 拡張
- JavaScript が有効なモダンブラウザ
外部ライブラリ、npm、Composer は不要です。
設置方法
- このディレクトリを PHP が動く Web サーバーへ配置します。
- Web サーバーの実行ユーザーが
data/ に書き込めるようにします。
- ブラウザで
index.php を開きます。
data/aite.sqlite は初回アクセス時に自動作成されます。本番環境では、事前に data/ を作成して権限を設定しておくのが確実です。
chmod 775 data
管理者トークンとデータ保護
管理者モードはトップページ右上の設定アイコンから開けます。トークンはフォームから POST で送信し、ログイン後は HttpOnly Cookie のセッション(2 時間で失効)で認証します。URL にトークンは含まれません。ログイン失敗は IP ごとに 15 分間で 10 回までです。認証には、次の順で管理者トークンを使用します。
AITE_ADMIN_TOKEN 環境変数
data/admin_token.txt
環境変数を設定できないサーバーでは、あらかじめ data/admin_token.txt を作成し、十分に長いランダム値を 1 行だけ保存してください。存在しない場合は、初回アクセス時にアプリがトークンを生成します。
mkdir -p data
openssl rand -hex 32 > data/admin_token.txt
chmod 600 data/admin_token.txt
data/ は必ず Web 公開の対象外にするか、Web サーバー設定で HTTP アクセスを拒否してください。このリポジトリには Apache 用の data/.htaccess が含まれます。Nginx など .htaccess が効かない環境では、同等のアクセス拒否設定が必要です。admin_token.txt と SQLite データベースは Git にコミットしません。
イベント作成
- トップページからイベントを作成します。
- イベント名を入力すると候補日時の設定を開始できます。説明は必要なときだけ追加します。
- 通常モードでは、カレンダーで日付を選び、タイムラインを 10 分単位でドラッグして候補時間を作ります。手入力では
2026-07-01 13:00-14:00 の形式を使います。
- 必要に応じて最低必要時間を 10 分刻みで設定します。候補時間もこの長さ以上である必要があります。
- 日程だけを確認したい場合は「日程だけ確認する」を有効にし、候補日を選びます。時間指定と最低必要時間はこのモードでは使いません。
- 保存すると回答 URL とイベント管理 URL が発行されます。管理 URL は作成者だけが保管してください。
候補日時、回答可能時間、AI で反映する時間はすべて 10 分刻みです。
回答と集計
回答者は名前と編集用パスワードを入力して回答します。編集用パスワードは表示された状態で入力できます。同じ名前とパスワードを使うと、前回の回答を読み込んで編集できます。名前は他の回答者にも表示されるため、新規回答では名前と同じパスワードは使えません。パスワードの誤入力は、同じ回答に対して 15 分間で 10 回までです。
- 時間帯モード: 白い候補範囲をドラッグして、参加可能な範囲を指定します。作成済みの範囲はクリックで削除できます。
- 日程のみモード: 参加可能な日だけを選択します。
- 一度回答したブラウザで回答 URL を開くと、回答済みであることと集計を先に表示します。再編集が必要なときだけ、名前・パスワード・前回回答の読み込みを使えます。
イベント管理 URL では回答の集計、各回答、CSV ダウンロードを確認できます。管理者モードでは全イベントの一覧、個別イベントの強制削除、全データのリセットが可能です。
イベントの updated_at から 1 か月更新がない場合、誰かが index.php にアクセスしたタイミングで自動削除されます。回答の保存はイベントの更新として扱われます。
AI 一括入力
回答画面で「AIで一括入力」を開き、プロンプトをコピーして利用中の AI に渡してください。AI が返した JSON をモーダル内に貼り付けると、該当する候補に反映されます。
時間帯モードでは、参加できる時間を ok_ranges に入れます。busy_events は AI が確認した予定を表示するためだけの情報で、回答データとしては保存されません。
[
{
"slot_id": "slot_xxx",
"ok_ranges": [{"start": "13:30", "end": "15:00"}],
"busy_events": [{"title": "定例MTG", "start": "13:00", "end": "13:30"}]
}
]
日程のみモードでは、完全に参加可能な日だけを "status": "o" にします。完全には空いていないが予定名から参加できそうな予定は、"status": "x" のまま busy_events に残せます。これは結果画面で判断材料として表示されます。
[
{
"slot_id": "slot_xxx",
"status": "x",
"busy_events": [{"title": "移動を伴わない定例", "start": "13:00", "end": "14:00"}]
}
]
GitHub Actions でのデプロイ
.github/workflows/deploy.yml は FTP または FTPS で任意の Web サーバーへデプロイします。GitHub リポジトリの Settings -> Secrets and variables -> Actions で、次の Secrets を設定してください。
| Secret | 内容 |
|---|
FTP_SERVER | FTP サーバーのホスト名 |
FTP_USERNAME | FTP アカウント名 |
FTP_PASSWORD | FTP パスワード |
FTP_SERVER_DIR | デプロイ先ディレクトリ。未設定時は ./ |
FTP_PORT | FTP ポート。未設定時は 21 |
FTP_PROTOCOL | ftp または ftps。未設定時は ftp |
main ブランチへの push で自動デプロイされます。Actions 画面から手動実行もでき、dry_run を有効にするとサーバーを変更せず転送対象だけ確認できます。
ワークフローは data/*.sqlite と data/admin_token.txt をデプロイ対象から除外します。これらはサーバー上で維持してください。
ファイル構成
/
index.php # トップページ・期限切れイベントの掃除
create.php # イベント作成
event.php # 回答・AI 一括入力・集計
admin.php # イベント管理 URL / 管理者モード
api.php # SQLite、API、翻訳、認可
app.js # クライアント側の操作
style.css
assets/
aite-icon.png
aite-ogp.png
iconoir/ # UI 用アイコン(MIT License)
data/
.htaccess
aite.sqlite # 実行時に作成、Git 管理外
admin_token.txt # 実行時に作成、Git 管理外
.github/workflows/deploy.yml