SemantiClubは、1日6回(4時間ごと)自動的にホームページを再生成する動的Webサイトです。 30以上のテンプレートと90以上のテーマから組み合わせを選択し、 リアルタイムのニュースフィードと統合して、常に新鮮なコンテンツを提供します。 本仕様書は、このシステムの技術的な詳細を定義します。

Introduction

SemantiClubは「Semantic Web」の概念にインスパイアされた実験的プロジェクトです。 静的なWebサイトではなく、時間とともに変化し続ける「生きた」Webページを実現します。

Design Philosophy

  • 動的生成: 固定コンテンツではなく、自動生成による常時更新
  • 多様性: 30+テンプレート × 3テーマ = 90+のバリエーション
  • リアルタイム性: 世界中のニュースソースからのライブフィード
  • アーカイブ性: 過去の生成ページをハッシュベースURLで保存

System Architecture

Technology Stack

LayerTechnology
FrontendNext.js 15 (App Router), React 18
StylingTailwind CSS, shadcn/ui (Radix UI)
Content GenerationPython 3.11
CI/CDGitHub Actions
HostingVercel / 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

  1. 現在のpage.tsxをハッシュベースURLに保存
  2. RSSフィードからニュースを取得(最大8件)
  3. テンプレートをランダム選択
  4. テーマを時刻ベースで選択(hour % theme_count)
  5. 新しいpage.tsxを生成・書き込み
  6. 生成履歴を更新(content_history.json)
  7. 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

CategoryTemplates
Retro/Creativecyber_retro, brutalist
Businesscorporate, startup, saas, landing_page
Contentblog, magazine, podcast, news_portal
Socialsns_feed, forum, dating, fanclub
E-commerceecommerce, restaurant, real_estate
Mediavideo_platform, streaming, gaming
Professionalportfolio, travel, banking, healthcare
Educationuniversity, education, documentation
Governmentgovernment, wiki
Jobsjob_board

Theme Structure

各テンプレートは最低3つのテーマを持ちます。

{
  "name": "Dark",
  "primaryColor": "#8b5cf6",
  "backgroundColor": "#1e293b",
  "textColor": "#e2e8f0",
  "accentColor": "#10b981"
}
    

News Feed System

RSS Sources

CategorySources
Tech (Global)Hacker News, The Verge, Ars Technica, TechCrunch
World NewsBBC, The Guardian, NY Times
ScienceNature, 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

本仕様に準拠するシステムは、上記の生成パイプライン、テンプレートシステム、 およびニュースフィードシステムを正しく実装する必要があります。