gitea/enhancements.md
logikonline 7eba24ea27 docs: add feature enhancement specifications
Add two specification documents for planned Gitea enhancements:

- enhancements.md: Organization public profile pages and Gitea Pages
  (repository landing pages with custom domains)

- ai_enhancements.md: AI and developer experience improvements
  including structured API errors, Scalar API docs, batch operations,
  AI-powered wiki generation, and SDK tooling

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 10:16:33 -05:00

45 KiB

Feature Enhancements Specification

Version: 1.0 Date: January 2026 Status: Approved for Development


Table of Contents

  1. Organization Public Profile Page
  2. Repository Landing Pages (Gitea Pages)
  3. Database Schema Changes
  4. API Endpoints
  5. Implementation Phases

1. Organization Public Profile Page

Overview

A new Overview tab becomes the default landing page for organizations, replacing the Repositories tab as the first view. This page showcases the organization's identity, featured projects, and public members.

Tab Structure

[Overview] [Repositories] [Projects] [Packages] [People] [Settings]
    ↑
  DEFAULT

1.1 Pinned Repositories

Organizations can pin and group unlimited repositories to highlight on their profile.

Features

Feature Specification
Count Unlimited pinned repos
Grouping Repos can be organized into named groups
Ordering Drag-and-drop reordering within groups
Metadata Displayed Stars, forks, primary language badge, description

Data Model

// models/organization/pinned_repo.go
type OrgPinnedRepo struct {
    ID           int64  `xorm:"pk autoincr"`
    OrgID        int64  `xorm:"INDEX NOT NULL"`
    RepoID       int64  `xorm:"INDEX NOT NULL"`
    GroupName    string `xorm:"DEFAULT ''"` // Empty = ungrouped
    DisplayOrder int    `xorm:"DEFAULT 0"`
    CreatedUnix  timeutil.TimeStamp `xorm:"created"`
}

type OrgPinnedGroup struct {
    ID           int64  `xorm:"pk autoincr"`
    OrgID        int64  `xorm:"INDEX NOT NULL"`
    Name         string `xorm:"NOT NULL"`
    DisplayOrder int    `xorm:"DEFAULT 0"`
    Collapsed    bool   `xorm:"DEFAULT false"` // Allow collapsible groups
}

UI Layout

┌─────────────────────────────────────────────────────────────────────┐
│  📌 Featured Projects                                               │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  ▼ Core Products                                                    │
│  ┌───────────────┐ ┌───────────────┐ ┌───────────────┐             │
│  │ [icon]        │ │ [icon]        │ │ [icon]        │             │
│  │ main-app      │ │ api-server    │ │ web-client    │             │
│  │ ⭐ 2.1k 🍴 432│ │ ⭐ 1.8k 🍴 289│ │ ⭐ 956 🍴 178 │             │
│  │ ● TypeScript  │ │ ● Go          │ │ ● React       │             │
│  │ "Our flagship │ │ "Backend API  │ │ "Frontend     │             │
│  │  application" │ │  services"    │ │  application" │             │
│  └───────────────┘ └───────────────┘ └───────────────┘             │
│                                                                     │
│  ▼ Libraries & Tools                                                │
│  ┌───────────────┐ ┌───────────────┐                               │
│  │ [icon]        │ │ [icon]        │                               │
│  │ shared-utils  │ │ cli-tool      │                               │
│  │ ⭐ 445 🍴 67  │ │ ⭐ 312 🍴 45  │                               │
│  │ ● TypeScript  │ │ ● Rust        │                               │
│  └───────────────┘ └───────────────┘                               │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

1.2 Public Members Display

Members can opt-in to be displayed publicly on the organization profile.

Features

Feature Specification
Visibility Member chooses to be displayed (opt-in)
Roles Shown Owner, Admin, Member
Overflow "and X more" with link to People tab
Layout Avatar grid with username and role

Data Model

// Add to existing OrgUser model
type OrgUser struct {
    // ... existing fields
    IsPublic bool `xorm:"DEFAULT false"` // Member opts in to public display
}

UI Layout

┌─────────────────────────────────────────────────────────────────────┐
│  👥 Public Members                                      [View All →]│
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐                   │
│  │ 👤  │ │ 👤  │ │ 👤  │ │ 👤  │ │ 👤  │ │ 👤  │  ... and 18 more  │
│  └─────┘ └─────┘ └─────┘ └─────┘ └─────┘ └─────┘                   │
│  @alice  @bob    @carol  @david  @emma   @frank                    │
│  Owner   Admin   Admin   Member  Member  Member                    │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

1.3 Promotional Region / About Section

Organizations can create a rich profile page with custom content.

Storage

Content is stored in a private repository within the organization:

Repository: {org}/.profile (private)
Files:
  - README.md           # Main profile content (Markdown)
  - assets/             # Images, videos, badges
    - logo.png
    - banner.jpg
    - team-photo.jpg
  - style.css           # Optional custom CSS (sandboxed)

Features

Feature Specification
Content Format Markdown (README.md)
Editor Markdown editor + optional WYSIWYG toggle
Media Images, videos, badges stored in .profile repo
Custom CSS Allowed within sandboxed constraints
Version Control Full Git history via .profile repo

Content Capabilities

# Allowed in README.md:

## Standard Markdown
- Headers, lists, links, code blocks
- Tables, blockquotes
- Task lists

## Extended Features
- ![Images](./assets/logo.png)
- ![Badges](https://img.shields.io/badge/...)
- Embedded videos (iframe allowlist: YouTube, Vimeo)
- HTML subset (safe tags only)

## Organization-specific
- {{MEMBER_COUNT}} - Dynamic member count
- {{REPO_COUNT}} - Dynamic repo count
- {{PINNED_REPOS}} - Renders pinned repos widget

CSS Sandboxing

/* style.css - Allowed properties */
.profile-content {
    /* Typography */
    font-family: ...; /* From approved list */
    font-size: ...;
    color: ...;

    /* Layout */
    margin: ...;
    padding: ...;

    /* Backgrounds */
    background-color: ...;
    background-image: url('./assets/...'); /* Local only */

    /* Borders */
    border: ...;
    border-radius: ...;
}

/* Blocked: position:fixed, z-index manipulation, external URLs,
   animations (except approved), JavaScript injection */

UI Layout

┌─────────────────────────────────────────────────────────────────────┐
│ ┌────────────┐                                                      │
│ │            │  Acme Corporation                                    │
│ │   [LOGO]   │  ━━━━━━━━━━━━━━━━                                    │
│ │            │  "Building the future, one commit at a time"         │
│ └────────────┘                                                      │
│                                                                     │
│  🌐 acme.com   📍 San Francisco, CA   📧 hello@acme.com            │
│  🐦 @acmecorp  💼 500+ employees                                    │
│                                                                     │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  ## About Us                                                        │
│                                                                     │
│  We are a team of passionate developers building open source        │
│  tools that empower developers worldwide. Founded in 2015,          │
│  we've grown to become a leader in developer productivity.          │
│                                                                     │
│  ### What We Do                                                     │
│                                                                     │
│  🚀 **Developer Tools** - IDE plugins, CLI utilities                │
│  🔧 **Infrastructure** - Deployment, monitoring, scaling            │
│  📚 **Education** - Tutorials, documentation, courses               │
│                                                                     │
│  ┌──────────────────────────────────────────────────────┐          │
│  │                   [TEAM PHOTO]                        │          │
│  │                                                       │          │
│  └──────────────────────────────────────────────────────┘          │
│                                                                     │
│  ### Join Us                                                        │
│  We're always looking for talented people! Check out our            │
│  [careers page](https://acme.com/careers).                          │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

2. Repository Landing Pages (Gitea Pages)

Overview

Repository owners can create a standalone landing page that acts as a public-facing project website. This page is independent of the repository's visibility—a private repo can have a public landing page.

Key Characteristics

Aspect Specification
Independence Landing page visibility separate from repo visibility
Domain Custom domain OR auto-generated subdomain
SSL/TLS Automatic via Let's Encrypt
Templates 4 built-in templates, switchable without data loss
Configuration .gitea/landing.yaml (precedence) + DB fallback

2.1 Domain Mapping

Option 1: Auto-Generated Subdomain

Format: {repo}.{owner}.pages.{gitea-domain}
Example: myproject.acme.pages.gitea.example.com
  • Automatically available when landing page is enabled
  • No DNS configuration required
  • SSL certificate auto-provisioned

Option 2: Custom Domain

User Configuration:
1. Add CNAME record: myproject.com → pages.gitea.example.com
2. Configure domain in repo settings
3. SSL certificate auto-provisioned via Let's Encrypt

DNS Verification

// Verify domain ownership before enabling
type PagesDomain struct {
    ID              int64  `xorm:"pk autoincr"`
    RepoID          int64  `xorm:"INDEX NOT NULL"`
    Domain          string `xorm:"UNIQUE NOT NULL"`
    Verified        bool   `xorm:"DEFAULT false"`
    VerificationTXT string // TXT record for verification
    SSLCertID       string // Reference to cert storage
    CreatedUnix     timeutil.TimeStamp
    VerifiedUnix    timeutil.TimeStamp
}

2.2 Templates

Four built-in templates with consistent configuration:

Template 1: Simple

Clean, minimal design focused on the README.

┌─────────────────────────────────────────────────────────────────────┐
│                                                                     │
│                           [PROJECT LOGO]                            │
│                                                                     │
│                            MyProject                                │
│                  "A better way to do things"                        │
│                                                                     │
│              [⬇️ Download v2.1.0]    [📖 View Docs]                 │
│                                                                     │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  # MyProject                                                        │
│                                                                     │
│  MyProject is a tool that helps you accomplish X faster and         │
│  more reliably than ever before.                                    │
│                                                                     │
│  ## Installation                                                    │
│  ```bash                                                            │
│  npm install myproject                                              │
│  ```                                                                │
│                                                                     │
│  ## Quick Start                                                     │
│  ...                                                                │
│                                                                     │
├─────────────────────────────────────────────────────────────────────┤
│  ⭐ 2,341 stars  │  🍴 456 forks  │  📝 MIT License  │  v2.1.0     │
└─────────────────────────────────────────────────────────────────────┘

Template 2: Documentation

Sidebar navigation with documentation pages from /docs folder.

┌──────────────┬──────────────────────────────────────────────────────┐
│              │                                                      │
│  [Logo]      │  Getting Started                                     │
│  MyProject   │  ══════════════════════════════════════════════════ │
│              │                                                      │
│  🔍 Search   │  Welcome to MyProject! This guide will walk you     │
│              │  through installation and basic usage.               │
│  ──────────  │                                                      │
│              │  ## Prerequisites                                    │
│  📖 DOCS     │                                                      │
│   Getting    │  Before you begin, ensure you have:                  │
│   Started ●  │  - Node.js 18+                                       │
│   Install    │  - npm or yarn                                       │
│   Config     │                                                      │
│   Usage      │  ## Installation                                     │
│              │                                                      │
│  📚 API      │  ```bash                                             │
│   Overview   │  npm install -g myproject                            │
│   Reference  │  ```                                                 │
│   Examples   │                                                      │
│              │  ## Verify Installation                              │
│  ──────────  │                                                      │
│  📦 v2.1.0   │  ```bash                                             │
│  ⭐ 2,341    │  myproject --version                                 │
│              │  ```                                                 │
│  [GitHub]    │                                                      │
│  [Discord]   │  [Next: Configuration →]                             │
│              │                                                      │
└──────────────┴──────────────────────────────────────────────────────┘

Template 3: Product

Marketing-style landing page with features, screenshots, and CTAs.

┌─────────────────────────────────────────────────────────────────────┐
│░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
│░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
│░░░░░░░░░░░░░░░░░░░░ [HERO BACKGROUND] ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
│░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
│░░░░░░░░░░░░░░░░░░░░░ MyProject ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
│░░░░░░░░░░░░░ "Ship faster with confidence" ░░░░░░░░░░░░░░░░░░░░░░░░░│
│░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
│░░░░░░░░░░░░░ [Get Started]  [View Source] ░░░░░░░░░░░░░░░░░░░░░░░░░░│
│░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│    ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐     │
│    │     🚀          │ │     🔒          │ │     🔌          │     │
│    │  Blazing Fast   │ │  Secure         │ │  Extensible     │     │
│    │                 │ │                 │ │                 │     │
│    │  Built on Rust  │ │  SOC2 compliant │ │  Plugin system  │     │
│    │  for maximum    │ │  with E2E       │ │  with 200+      │     │
│    │  performance    │ │  encryption     │ │  integrations   │     │
│    └─────────────────┘ └─────────────────┘ └─────────────────┘     │
│                                                                     │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│    ┌───────────────────────────────────────────────────────────┐   │
│    │                                                           │   │
│    │                   [SCREENSHOT/DEMO]                       │   │
│    │                                                           │   │
│    └───────────────────────────────────────────────────────────┘   │
│                                                                     │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│    Latest Releases                    Contributors                  │
│    ────────────────                   ────────────                  │
│    📦 v2.1.0 - Jan 8, 2026           [👤][👤][👤][👤][👤] +47     │
│    📦 v2.0.2 - Dec 15, 2025                                        │
│    📦 v2.0.1 - Dec 1, 2025           Trusted by 10,000+ developers │
│                                                                     │
│                        [⭐ Star on Gitea]                          │
│                                                                     │
├─────────────────────────────────────────────────────────────────────┤
│  [Home] [Docs] [Blog] [GitHub] [Discord]     © 2026 Acme Corp      │
└─────────────────────────────────────────────────────────────────────┘

Template 4: Portfolio/Gallery

Visual showcase for design, art, or media projects.

┌─────────────────────────────────────────────────────────────────────┐
│                                                                     │
│                         Design System                               │
│                    "A visual component library"                     │
│                                                                     │
│                  [View Components]  [Download]                      │
│                                                                     │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐              │
│  │          │ │          │ │          │ │          │              │
│  │ [img 1]  │ │ [img 2]  │ │ [img 3]  │ │ [img 4]  │              │
│  │          │ │          │ │          │ │          │              │
│  │ Buttons  │ │ Forms    │ │ Cards    │ │ Modals   │              │
│  └──────────┘ └──────────┘ └──────────┘ └──────────┘              │
│                                                                     │
│  ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐              │
│  │          │ │          │ │          │ │          │              │
│  │ [img 5]  │ │ [img 6]  │ │ [img 7]  │ │ [img 8]  │              │
│  │          │ │          │ │          │ │          │              │
│  │ Tables   │ │ Nav      │ │ Icons    │ │ Colors   │              │
│  └──────────┘ └──────────┘ └──────────┘ └──────────┘              │
│                                                                     │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  ## About This Project                                              │
│                                                                     │
│  A comprehensive design system built for modern web applications.   │
│  Includes 50+ components, dark mode support, and full              │
│  accessibility compliance.                                          │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

2.3 Configuration

Configuration lives in .gitea/landing.yaml with DB fallback. File takes precedence.

Full Configuration Schema

# .gitea/landing.yaml
# Landing Page Configuration for Gitea Pages

#──────────────────────────────────────────────────────────────────────
# BASIC SETTINGS
#──────────────────────────────────────────────────────────────────────

enabled: true
template: product  # simple | documentation | product | portfolio

# Custom domain (optional - subdomain is always available)
domain: myproject.com

#──────────────────────────────────────────────────────────────────────
# BRANDING
#──────────────────────────────────────────────────────────────────────

branding:
  logo: ./assets/logo.png
  logo_dark: ./assets/logo-dark.png  # Optional dark mode variant
  favicon: ./assets/favicon.ico

  # Color scheme
  primary_color: "#4a90d9"
  secondary_color: "#2ecc71"
  accent_color: "#e74c3c"

  # Theme
  dark_mode: auto  # auto | light | dark | both (toggle)

  # Custom fonts (from approved list)
  heading_font: "Inter"
  body_font: "system-ui"

#──────────────────────────────────────────────────────────────────────
# HERO SECTION
#──────────────────────────────────────────────────────────────────────

hero:
  title: "MyProject"
  tagline: "The best thing since sliced bread"

  # Background options
  background: ./assets/hero-bg.jpg
  # OR gradient: "linear-gradient(135deg, #667eea 0%, #764ba2 100%)"
  # OR color: "#1a1a2e"

  # Call-to-action buttons
  cta_primary:
    text: "Get Started"
    link: "#installation"
    # OR link: releases/latest (auto-resolves to latest release)

  cta_secondary:
    text: "View Documentation"
    link: /docs
    style: outline  # outline | ghost

#──────────────────────────────────────────────────────────────────────
# FEATURES (for product template)
#──────────────────────────────────────────────────────────────────────

features:
  - icon: rocket        # Built-in icons: rocket, shield, puzzle, zap, etc.
    title: "Blazingly Fast"
    description: "Built with performance in mind from day one."

  - icon: shield
    title: "Secure by Default"
    description: "Enterprise-grade security out of the box."

  - icon: ./assets/custom-icon.svg  # Custom icon
    title: "Extensible"
    description: "Plugin system for unlimited customization."

  - icon: puzzle
    title: "Easy Integration"
    description: "Works with your existing tools and workflows."

#──────────────────────────────────────────────────────────────────────
# SECTIONS
#──────────────────────────────────────────────────────────────────────

sections:
  - type: features      # Renders features array above

  - type: screenshot
    image: ./assets/screenshot.png
    caption: "MyProject in action"

  - type: readme
    file: README.md     # Default

  - type: releases
    limit: 3
    show_notes: true    # Show release notes excerpt

  - type: contributors
    limit: 12
    show_count: true    # "and 47 more contributors"

  - type: custom
    file: ./docs/features.md
    title: "Why MyProject?"

#──────────────────────────────────────────────────────────────────────
# DOCUMENTATION (for documentation template)
#──────────────────────────────────────────────────────────────────────

documentation:
  source: ./docs        # Folder containing markdown files

  # Search
  search: true

  # Table of contents in each page
  toc: true

  # Sidebar navigation
  sidebar:
    - title: "Getting Started"
      items:
        - intro.md
        - installation.md
        - quick-start.md

    - title: "Guides"
      items:
        - configuration.md
        - deployment.md
        - troubleshooting.md

    - title: "API Reference"
      collapsed: true   # Collapsed by default
      items:
        - api/overview.md
        - api/authentication.md
        - api/endpoints.md

  # "Edit this page" links
  edit_links:
    enabled: true
    text: "Edit this page"
    # Link auto-generated to repo file

#──────────────────────────────────────────────────────────────────────
# GALLERY (for portfolio template)
#──────────────────────────────────────────────────────────────────────

gallery:
  source: ./gallery     # Folder containing images
  columns: 4            # 2, 3, or 4
  lightbox: true        # Click to enlarge
  captions: true        # Show image filename as caption

  # Or explicit items:
  items:
    - image: ./gallery/buttons.png
      title: "Button Components"
      link: /docs/buttons

    - image: ./gallery/forms.png
      title: "Form Elements"
      link: /docs/forms

#──────────────────────────────────────────────────────────────────────
# FOOTER
#──────────────────────────────────────────────────────────────────────

footer:
  # Link columns
  links:
    - title: "Resources"
      items:
        - text: "Documentation"
          url: /docs
        - text: "API Reference"
          url: /docs/api
        - text: "Examples"
          url: /examples

    - title: "Community"
      items:
        - text: "Discord"
          url: https://discord.gg/xxx
        - text: "Twitter"
          url: https://twitter.com/myproject
        - text: "GitHub Discussions"
          url: https://github.com/org/repo/discussions

    - title: "Company"
      items:
        - text: "About"
          url: https://company.com/about
        - text: "Blog"
          url: https://company.com/blog
        - text: "Careers"
          url: https://company.com/careers

  # Copyright
  copyright: "© 2026 Acme Corporation. Released under MIT License."

  # Show "Powered by Gitea" badge
  show_powered_by: true

#──────────────────────────────────────────────────────────────────────
# SEO & SOCIAL
#──────────────────────────────────────────────────────────────────────

seo:
  title: "MyProject - Ship Faster with Confidence"
  description: "MyProject helps development teams ship code faster and more reliably."
  keywords:
    - developer tools
    - productivity
    - open source

  # Open Graph / Social sharing
  og_image: ./assets/og-image.png
  twitter_card: summary_large_image
  twitter_site: "@myproject"

#──────────────────────────────────────────────────────────────────────
# ANALYTICS (optional)
#──────────────────────────────────────────────────────────────────────

analytics:
  # Privacy-friendly options
  plausible: myproject.com
  # OR
  umami:
    website_id: "xxx"
    url: "https://analytics.example.com"
  # OR
  google_analytics: "G-XXXXXXXXXX"

#──────────────────────────────────────────────────────────────────────
# ADVANCED
#──────────────────────────────────────────────────────────────────────

advanced:
  # Custom CSS file
  custom_css: ./assets/custom.css

  # Custom head content (limited HTML)
  custom_head: |
    <link rel="preconnect" href="https://fonts.googleapis.com">    

  # Redirects
  redirects:
    /old-docs: /docs
    /github: https://github.com/org/repo

2.4 URL Structure & Routing

Standalone Architecture

Landing pages are completely independent of the repository view:

Landing Page:  https://myproject.com
               https://repo.owner.pages.gitea.example.com

Repository:    https://gitea.example.com/owner/repo
               (May be private - landing page still accessible)

Routing Flow

                    ┌─────────────────────┐
    Request ──────► │   Gitea Router      │
                    └──────────┬──────────┘
                               │
              ┌────────────────┼────────────────┐
              │                │                │
              ▼                ▼                ▼
    ┌─────────────────┐ ┌───────────┐ ┌───────────────────┐
    │ pages.gitea.com │ │ Custom    │ │ gitea.example.com │
    │ *.pages.gitea.. │ │ Domain    │ │ (main app)        │
    └────────┬────────┘ └─────┬─────┘ └───────────────────┘
             │                │
             ▼                ▼
    ┌─────────────────────────────────┐
    │      Pages Handler              │
    │  - Lookup repo by domain        │
    │  - Load .gitea/landing.yaml     │
    │  - Render template              │
    └─────────────────────────────────┘

Navigation Between Landing and Repo

The landing page is responsible for providing links to the source repository:

# In landing.yaml
hero:
  cta_secondary:
    text: "View Source"
    link: https://gitea.example.com/owner/repo

footer:
  links:
    - title: "Developers"
      items:
        - text: "Source Code"
          url: https://gitea.example.com/owner/repo
        - text: "Issues"
          url: https://gitea.example.com/owner/repo/issues

3. Database Schema Changes

New Tables

-- Organization pinned repositories
CREATE TABLE org_pinned_repo (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    org_id BIGINT NOT NULL,
    repo_id BIGINT NOT NULL,
    group_id BIGINT DEFAULT NULL,
    display_order INT DEFAULT 0,
    created_unix BIGINT,
    FOREIGN KEY (org_id) REFERENCES organization(id),
    FOREIGN KEY (repo_id) REFERENCES repository(id),
    FOREIGN KEY (group_id) REFERENCES org_pinned_group(id),
    UNIQUE KEY (org_id, repo_id)
);

-- Organization pinned repo groups
CREATE TABLE org_pinned_group (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    org_id BIGINT NOT NULL,
    name VARCHAR(255) NOT NULL,
    display_order INT DEFAULT 0,
    collapsed BOOLEAN DEFAULT FALSE,
    FOREIGN KEY (org_id) REFERENCES organization(id)
);

-- Pages domain mapping
CREATE TABLE pages_domain (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    repo_id BIGINT NOT NULL,
    domain VARCHAR(255) NOT NULL UNIQUE,
    verified BOOLEAN DEFAULT FALSE,
    verification_token VARCHAR(64),
    ssl_status VARCHAR(32) DEFAULT 'pending',
    ssl_cert_expiry BIGINT,
    created_unix BIGINT,
    verified_unix BIGINT,
    FOREIGN KEY (repo_id) REFERENCES repository(id)
);

-- Pages configuration cache (parsed from .gitea/landing.yaml)
CREATE TABLE pages_config (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    repo_id BIGINT NOT NULL UNIQUE,
    enabled BOOLEAN DEFAULT FALSE,
    template VARCHAR(32) DEFAULT 'simple',
    config_json TEXT,  -- Cached parsed config
    config_hash VARCHAR(64),  -- For invalidation
    updated_unix BIGINT,
    FOREIGN KEY (repo_id) REFERENCES repository(id)
);

Modified Tables

-- Add to org_user table
ALTER TABLE org_user ADD COLUMN is_public BOOLEAN DEFAULT FALSE;

-- Add to repository table
ALTER TABLE repository ADD COLUMN pages_enabled BOOLEAN DEFAULT FALSE;
ALTER TABLE repository ADD COLUMN pages_subdomain VARCHAR(255);

4. API Endpoints

Organization Profile API

# Pinned repos
GET    /api/v1/orgs/{org}/pinned
POST   /api/v1/orgs/{org}/pinned
PUT    /api/v1/orgs/{org}/pinned/reorder
DELETE /api/v1/orgs/{org}/pinned/{repo}

# Pinned groups
GET    /api/v1/orgs/{org}/pinned/groups
POST   /api/v1/orgs/{org}/pinned/groups
PUT    /api/v1/orgs/{org}/pinned/groups/{id}
DELETE /api/v1/orgs/{org}/pinned/groups/{id}

# Public members
GET    /api/v1/orgs/{org}/public_members
PUT    /api/v1/orgs/{org}/public_members/{username}  # Opt-in
DELETE /api/v1/orgs/{org}/public_members/{username}  # Opt-out

# Profile content (via .profile repo)
# Uses standard repo file API

Pages API

# Pages configuration
GET    /api/v1/repos/{owner}/{repo}/pages
PUT    /api/v1/repos/{owner}/{repo}/pages
DELETE /api/v1/repos/{owner}/{repo}/pages

# Custom domains
GET    /api/v1/repos/{owner}/{repo}/pages/domains
POST   /api/v1/repos/{owner}/{repo}/pages/domains
DELETE /api/v1/repos/{owner}/{repo}/pages/domains/{domain}
POST   /api/v1/repos/{owner}/{repo}/pages/domains/{domain}/verify

# SSL certificates
GET    /api/v1/repos/{owner}/{repo}/pages/domains/{domain}/ssl
POST   /api/v1/repos/{owner}/{repo}/pages/domains/{domain}/ssl/renew

5. Implementation Phases

Phase 1: Organization Profile (4-6 weeks)

  1. Week 1-2: Database schema, models, migrations
  2. Week 2-3: Pinned repos API and UI
  3. Week 3-4: Public members opt-in system
  4. Week 4-5: Profile content from .profile repo
  5. Week 5-6: WYSIWYG editor integration, CSS sandboxing

Phase 2: Gitea Pages Foundation (6-8 weeks)

  1. Week 1-2: Pages router, subdomain handling
  2. Week 2-3: Configuration parser (.gitea/landing.yaml)
  3. Week 3-4: Simple template implementation
  4. Week 4-6: Documentation template with sidebar
  5. Week 6-7: Product and Portfolio templates
  6. Week 7-8: Settings UI, template switching

Phase 3: Custom Domains & SSL (3-4 weeks)

  1. Week 1: Domain verification system
  2. Week 2: Let's Encrypt integration
  3. Week 3: DNS routing and Host header handling
  4. Week 4: SSL certificate renewal, monitoring

Phase 4: Polish & Advanced Features (2-3 weeks)

  1. Analytics integration
  2. Search functionality (docs template)
  3. Image optimization
  4. CDN integration options
  5. Performance optimization

Appendix: File Structure

Organization .profile Repository

{org}/.profile/
├── README.md              # Main profile content
├── style.css              # Optional custom CSS
└── assets/
    ├── logo.png
    ├── logo-dark.png
    ├── banner.jpg
    └── team-photo.jpg

Repository Landing Page

{repo}/
├── .gitea/
│   └── landing.yaml       # Landing page configuration
├── docs/                  # Documentation (for docs template)
│   ├── intro.md
│   ├── installation.md
│   └── api/
│       └── endpoints.md
├── gallery/               # Images (for portfolio template)
│   ├── screenshot1.png
│   └── screenshot2.png
└── assets/                # Landing page assets
    ├── logo.png
    ├── favicon.ico
    ├── hero-bg.jpg
    ├── og-image.png
    └── custom.css

End of Specification