SemantiClubは、1日6回(4時間ごと)自動的にホームページを再生成する動的Webサイトです。 30以上のテンプレートと90以上のテーマから組み合わせを選択し、 リアルタイムのニュースフィードと統合して、常に新鮮なコンテンツを提供します。 本仕様書は、このシステムの技術的な詳細を定義します。
Introduction
SemantiClubは「Semantic Web」の概念にインスパイアされた実験的プロジェクトです。 静的なWebサイトではなく、時間とともに変化し続ける「生きた」Webページを実現します。
Design Philosophy
- 動的生成: 固定コンテンツではなく、自動生成による常時更新
- 多様性: 30+テンプレート × 3テーマ = 90+のバリエーション
- リアルタイム性: 世界中のニュースソースからのライブフィード
- アーカイブ性: 過去の生成ページをハッシュベースURLで保存
System Architecture
Technology Stack
| Layer | Technology |
|---|---|
| Frontend | Next.js 15 (App Router), React 18 |
| Styling | Tailwind CSS, shadcn/ui (Radix UI) |
| Content Generation | Python 3.11 |
| CI/CD | GitHub Actions |
| Hosting | Vercel / GitHub Pages |
Directory Structure
semanticlub/
├── src/app/ # Next.js App Router
│ ├── page.tsx # 動的生成されるホームページ
│ ├── gallery/ # ギャラリーページ
│ ├── spec/ # 本仕様書ページ
│ └── [hash]/ # アーカイブページ(動的ルート)
├── scripts/
│ ├── generate_dynamic_content.py # メイン生成スクリプト
│ ├── fetch_news.py # RSSニュース取得
│ ├── page_storage.py # ページアーカイブ管理
│ └── templates/ # テンプレートモジュール
│ ├── base_template.py # 基底クラス
│ ├── cyber_retro.py # サイバーレトロ
│ ├── saas.py # SaaS Dashboard
│ ├── news_portal.py # ニュースポータル
│ └── ... (30+ templates)
├── .github/workflows/
│ └── daily-content-update.yml # 4時間ごと実行
└── CLAUDE.md # AI Agent用設定
Automatic Generation System
GitHub Actions Schedule
GitHub Actionsのcronスケジュールにより、1日6回自動実行されます。
schedule:
# UTC 0:00, 4:00, 8:00, 12:00, 16:00, 20:00
- cron: '0 0,4,8,12,16,20 * * *'
Generation Pipeline
- 現在のpage.tsxをハッシュベースURLに保存
- RSSフィードからニュースを取得(最大8件)
- テンプレートをランダム選択
- テーマを時刻ベースで選択(hour % theme_count)
- 新しいpage.tsxを生成・書き込み
- 生成履歴を更新(content_history.json)
- Git commit & push
Template System
BaseTemplate Interface
class BaseTemplate(ABC):
name: str # テンプレート名
description: str # 説明
category: str # カテゴリ(retro, academic, news等)
themes: List[Dict] # テーマ配列(各3テーマ以上)
@abstractmethod
def generate(
self,
news: List[Dict],
previous_hash: Optional[str],
theme_index: Optional[int]
) -> str:
"""page.tsxコンテンツを生成"""
pass
Available Templates
| Category | Templates |
|---|---|
| Retro/Creative | cyber_retro, brutalist |
| Business | corporate, startup, saas, landing_page |
| Content | blog, magazine, podcast, news_portal |
| Social | sns_feed, forum, dating, fanclub |
| E-commerce | ecommerce, restaurant, real_estate |
| Media | video_platform, streaming, gaming |
| Professional | portfolio, travel, banking, healthcare |
| Education | university, education, documentation |
| Government | government, wiki |
| Jobs | job_board |
Theme Structure
各テンプレートは最低3つのテーマを持ちます。
{
"name": "Dark",
"primaryColor": "#8b5cf6",
"backgroundColor": "#1e293b",
"textColor": "#e2e8f0",
"accentColor": "#10b981"
}
News Feed System
RSS Sources
| Category | Sources |
|---|---|
| Tech (Global) | Hacker News, The Verge, Ars Technica, TechCrunch |
| World News | BBC, The Guardian, NY Times |
| Science | Nature, NASA |
| Tech (JP) | Hatena Bookmark |
News Item Structure
{
"title": "記事タイトル(最大120文字)",
"link": "https://example.com/article",
"date": "2025.12.31",
"source": "Hacker News",
"category": "Tech"
}
Fallback Mechanism
RSSフィード取得に失敗した場合(3件未満)、静的なフォールバックデータを使用します。
Page Archive System
Hash-based URLs
生成された各ページは、コンテンツのSHA-256ハッシュ(先頭10文字)をURLとして保存されます。
例: https://semanti.club/2ad56427ab
Previous Page Link
各ページのフッターには、前のバージョンへのリンクが含まれます。
UX Design Principles
本プロジェクトは ui_concepts.md に定義されたUX心理学コンセプトを参照しています。
Key Concepts Applied
- 好奇心ギャップ: 4時間ごとの更新で「次は何が来るか」という期待感
- 変動報酬: ランダムなテンプレート選択による予測不能性
- ツァイガルニク効果: 過去ページへのリンクで探索を促進
- 美的ユーザビリティ効果: 多様なデザインテーマによる視覚的魅力
Conformance
本仕様に準拠するシステムは、上記の生成パイプライン、テンプレートシステム、 およびニュースフィードシステムを正しく実装する必要があります。