# go-vikunja/website architecture

> Architecture diagram of the GitHub repository go-vikunja/website, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-28). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/go-vikunja/website
- Repository: https://github.com/go-vikunja/website

## Overview

Vikunja Homepage is the public website for Vikunja. The main visitor workflow is reading site content and searching documentation or help: the browser search client fetches a generated index, then searches it locally and prepares highlighted results. Other supported capabilities include a changelog RSS feed, newsletter signup with Turnstile verification, and an install wizard. The tree and sampled source establish these backend flows, but do not expose the page templates or install-wizard behavior in detail.

Main entry points: [`src/pages/api/search-index.json.ts`](https://github.com/go-vikunja/website/blob/main/src/pages/api/search-index.json.ts) (Search Index API), [`src/pages`](https://github.com/go-vikunja/website/tree/main/src/pages) (Public Website), [`src/scripts/search-client.ts`](https://github.com/go-vikunja/website/blob/main/src/scripts/search-client.ts) (Search Client), [`src/pages/api/newsletter-signup.ts`](https://github.com/go-vikunja/website/blob/main/src/pages/api/newsletter-signup.ts) (Newsletter Signup API)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_site["Website"]
  node_website["Public Website"]
  node_install["Install Wizard<br/>[install-wizard.js]"]
end

subgraph group_content["Content and Search"]
  node_content_config["Content Collections<br/>[content.config.ts]"]
  node_search_api["Search Index API"]
  node_mdx_text["MDX Text Parser<br/>[mdx-to-text.ts]"]
  node_headings["Heading Extractor"]
  node_search_ui["Search Interface<br/>[search-ui.ts]"]
  node_search_client["Search Client<br/>[search-client.ts]"]
  node_minisearch["MiniSearch"]
  node_rss["Changelog RSS<br/>[rss.xml.js]"]
  node_changelog_content["Changelog Entries<br/>[content.config.ts]"]
end

subgraph group_engagement["Visitor Services"]
  node_signup["Newsletter Signup API"]
  node_turnstile["Turnstile Verification"]
  node_newsletter["Newsletter Service"]
end

node_visitor(("Visitor"))

node_visitor -->|"visits"| node_website
node_website -->|"offers search"| node_search_ui
node_website -->|"loads wizard"| node_install
node_search_ui -->|"uses"| node_search_client
node_search_client -->|"fetches index"| node_search_api
node_search_api -->|"reads collections"| node_content_config
node_search_api -->|"converts content"| node_mdx_text
node_search_api -->|"extracts headings"| node_headings
node_search_client -->|"indexes and searches"| node_minisearch
node_visitor -->|"requests feed"| node_rss
node_rss -->|"reads collection"| node_content_config
node_visitor -->|"submits signup"| node_signup
node_signup -->|"verifies token"| node_turnstile
node_signup -->|"submits subscription"| node_newsletter

click node_website "https://github.com/go-vikunja/website/tree/main/src/pages"
click node_install "https://github.com/go-vikunja/website/blob/main/src/scripts/install-wizard.js"
click node_content_config "https://github.com/go-vikunja/website/blob/main/src/content.config.ts"
click node_search_api "https://github.com/go-vikunja/website/blob/main/src/pages/api/search-index.json.ts"
click node_mdx_text "https://github.com/go-vikunja/website/blob/main/src/helpers/mdx-to-text.ts"
click node_headings "https://github.com/go-vikunja/website/blob/main/src/helpers/extract-headings.ts"
click node_search_ui "https://github.com/go-vikunja/website/blob/main/src/scripts/search-ui.ts"
click node_search_client "https://github.com/go-vikunja/website/blob/main/src/scripts/search-client.ts"
click node_rss "https://github.com/go-vikunja/website/blob/main/src/pages/changelog/rss.xml.js"
click node_signup "https://github.com/go-vikunja/website/blob/main/src/pages/api/newsletter-signup.ts"
click node_changelog_content "https://github.com/go-vikunja/website/blob/main/src/content.config.ts"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_website,node_install toneBlue
class node_content_config,node_search_api,node_mdx_text,node_headings,node_search_ui,node_search_client,node_minisearch,node_rss,node_changelog_content toneAmber
class node_signup,node_turnstile,node_newsletter toneMint
class node_visitor toneIndigo
```

## Components

### Website

- [Public Website](https://github.com/go-vikunja/website/tree/main/src/pages): `src/pages`
- [Install Wizard](https://github.com/go-vikunja/website/blob/main/src/scripts/install-wizard.js): `src/scripts/install-wizard.js`

### Content and Search

- [Content Collections](https://github.com/go-vikunja/website/blob/main/src/content.config.ts): `src/content.config.ts`
- [Search Index API](https://github.com/go-vikunja/website/blob/main/src/pages/api/search-index.json.ts): `src/pages/api/search-index.json.ts`
- [MDX Text Parser](https://github.com/go-vikunja/website/blob/main/src/helpers/mdx-to-text.ts): `src/helpers/mdx-to-text.ts`
- [Heading Extractor](https://github.com/go-vikunja/website/blob/main/src/helpers/extract-headings.ts): `src/helpers/extract-headings.ts`
- [Search Interface](https://github.com/go-vikunja/website/blob/main/src/scripts/search-ui.ts): `src/scripts/search-ui.ts`
- [Search Client](https://github.com/go-vikunja/website/blob/main/src/scripts/search-client.ts): `src/scripts/search-client.ts`
- **MiniSearch**
- [Changelog RSS](https://github.com/go-vikunja/website/blob/main/src/pages/changelog/rss.xml.js): `src/pages/changelog/rss.xml.js`
- [Changelog Entries](https://github.com/go-vikunja/website/blob/main/src/content.config.ts): `src/content.config.ts`

### Visitor Services

- [Newsletter Signup API](https://github.com/go-vikunja/website/blob/main/src/pages/api/newsletter-signup.ts): `src/pages/api/newsletter-signup.ts`
- **Turnstile Verification**
- **Newsletter Service**

### Other components

- **Visitor**

## Connections

- Visitor → Public Website: visits
- Public Website → Search Interface: offers search
- Public Website → Install Wizard: loads wizard
- Search Interface → Search Client: uses
- Search Client → Search Index API: fetches index
- Search Index API → Content Collections: reads collections
- Search Index API → MDX Text Parser: converts content
- Search Index API → Heading Extractor: extracts headings
- Search Client → MiniSearch: indexes and searches
- Visitor → Changelog RSS: requests feed
- Changelog RSS → Content Collections: reads collection
- Visitor → Newsletter Signup API: submits signup
- Newsletter Signup API → Turnstile Verification: verifies token
- Newsletter Signup API → Newsletter Service: submits subscription
