ログインのいらない共有カレンダー
このカレンダーは、ログイン不要で部屋を作成・参加し、ニックネームだけで予定を共有できるWebアプリです。
月表示カレンダー、日単位のタイムライン可視化、外部カレンダー向けICS連携までを1つのアプリで完結させています。
特徴
1. チーム全体が集まれる時間を表示できる
人数が増えれば増えるほど、チーム全体で予定を合わせるのが困難になってきます。そういう時でも、このカレンダーがあれば自動でみんなの予定がない時間を見つけてくれます。
2. マークダウンでメモができる
各予定のメモ欄には、マークダウンで記述することができます。
3. スマホカレンダーとの連携
チーム全体の予定を、スマホのカレンダーに自動で反映させることができます(現在はiOSのみ動作確認)。これでチームの予定を見逃すことはありません。
背景
ハッカソンや小規模チームでは、参加者ごとにアカウント基盤が揃っていないことが多く、日程調整の前段で手間が発生しがちです。
そこで、URL共有だけですぐ使えること、個人予定と全体予定を分けて扱えること、スマホのカレンダーにも連携できることを目的に実装しました。
Features
room_idベースの部屋作成 / 参加- 予定の追加・更新・削除(日時、タイトル、詳細、終日、全体予定フラグ)
- 月間カレンダー表示と日別タイムライン表示
- 混雑度サマリー、候補日ランキング、空き状況バーの可視化
- 予定詳細のMarkdown表示(見出し・リスト・リンク・コード対応)
- ICSエクスポート(ダウンロード / URLコピー /
webcal://起動) token検証付きICS配信(グループ全体予定のみ出力)
Architecture
構成はバックエンドとフロントエンドを分離したシンプルな設計です。
- Backend: Python + Aisaba/Nexom系ルータ
- Database: SQLite(
rooms,events) - Frontend: Vanilla JavaScript + HTMLテンプレート + CSS
- Export: サーバー側でiCalendar(
.ics)を生成
データフロー:
1. フロントエンドが/api/*へJSON POST(部屋操作・予定CRUD・一覧取得)
2. バックエンドが入力検証/サニタイズ後にSQLiteへ反映
3. フロントエンドが月単位・全件データを使ってサマリーとタイムラインを再描画
4. ICS配信時にroom_id + feed_tokenを検証してカレンダーデータを返却
Implementation
- スキーマ差分を吸収するDB初期化(不足カラム追加、
feed_token補完) - 共通の入力サニタイズと厳密な日付/時刻バリデーション
- 終日予定(
00:00-23:59)の正規化とICSでのVALUE=DATE変換 - Markdownの簡易パース(一覧プレビュー + 詳細リッチ表示)
- 予定境界を分割するタイムライン可視化(空き/重なり/全体予定)
- モバイル向け操作(モーダル、シート、入力ステージ)
- 40秒間隔の自動リロードで共同編集時の鮮度を維持
Role
要件定義から実装までを一貫して担当しました。
- 画面設計(トップ/部屋UI、操作導線、レスポンシブ)
- API設計・実装(部屋管理、予定CRUD、一覧取得)
- データモデル設計(SQLiteスキーマ、インデックス、移行吸収)
- 可視化ロジック実装(候補日算出、混雑表示、タイムライン分割)
- ICS連携実装(トークン保護、出力生成、クライアント起動導線)
Tech Stack
- Backend: Python
- Framework / Routing: Aisaba apps + Nexom app components
- Database: SQLite
- Frontend: HTML, CSS, Vanilla JavaScript (ES Modules)
- Templating: ObjectHTMLTemplates
- Calendar Format: iCalendar(
.ics,webcal://)