Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
259 changes: 212 additions & 47 deletions .github/workflows/sync-release.yml

Large diffs are not rendered by default.

51 changes: 51 additions & 0 deletions .github/workflows/website-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
name: Website CI

# The website's own CI gate. It runs on every pull request against `main` and on
# every push to `main`, and it can be dispatched explicitly on any branch.
#
# The release-sync workflow creates its metadata PR with GITHUB_TOKEN, which does
# not re-trigger `pull_request` runs, so it calls this workflow with
# `workflow_dispatch` on the metadata branch; that dispatch always runs and
# reports the CI check on the branch head, satisfying the protected-branch
# required check.
on:
pull_request:
branches:
- main
push:
branches:
- main
workflow_dispatch:

permissions:
contents: read

concurrency:
group: website-ci-${{ github.ref }}
cancel-in-progress: true

jobs:
ci:
name: CI
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up Node
uses: actions/setup-node@v4
with:
node-version: 24
cache: npm

- name: Install dependencies
run: npm ci

- name: Lint
run: npm run lint

- name: Build
run: npm run build

- name: Test
run: npm test
27 changes: 18 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,12 @@ Official website and developer portal for **Veltis**, the optimization-focused M
## Features

- **Developer-Centric Visual Identity:** Deep charcoal/near-black theme with electric violet accents, geometric typography, and zero SaaS fluff.
- **PaperMC-Inspired Downloads:** Compact build browser with Minecraft version tabs, Stable/Beta/Nightly channel toggle, direct JAR downloads, and SHA-256 copy action.
- **Release Metadata Sync:** A `veltis-release` repository event from `VeltisMC/Veltis` writes the published build into `public/releases/<channel>.json`; the download page reads that first, falls back to the GitHub releases API, and never fabricates a build when neither is available.
- **PaperMC-Inspired Downloads:** Compact build browser with Minecraft version tabs, a pre-alpha/alpha/beta/release channel toggle, direct JAR downloads, and SHA-256 copy action.
- **Release Metadata Sync:** A `veltis-release` repository event from `VeltisMC/Veltis` validates the published build's metadata and stages it as a pull request into `public/releases/<channel>.json`; the download page reads that first, falls back to the GitHub releases API, and never fabricates a build when neither is available.
- **Searchable Documentation:** Complete multi-section documentation covering Getting Started, Server Administration, System Architecture, and Migration.
- **Global Command Palette (`Ctrl+K` / `⌘K`):** Instant client-side search across documentation articles, subheadings, and site pages.
- **Developer Portal:** Proposed native capability-based plugin API specification, multithreading guidelines, and Gradle/Maven setup examples.
- **Architecture & Shulker Deep-Dive:** Interactive SVG system topology map and comprehensive guide to the Shulker patch engine.
- **Roadmap & Community Hub:** Filterable milestone board, contribution instructions, changelog timeline, and GPL-3.0 license statement.
- **Community Hub:** Contribution instructions, changelog timeline, and GPL-3.0 license statement.
- **Vercel-Ready Deployment:** Client-side SPA routing (`vercel.json`), semantic markup, Open Graph tags, `robots.txt`, and `sitemap.xml`.

---
Expand All @@ -35,18 +34,28 @@ Official website and developer portal for **Veltis**, the optimization-focused M

The server repository builds and publishes each release, then sends this site a
`veltis-release` repository event. `.github/workflows/sync-release.yml` validates
the payload, writes `public/releases/<channel>.json` (latest build plus capped
history for that channel only), and commits. Vercel redeploys on the push.
the payload, stages `public/releases/<channel>.json` (latest build plus capped
history for that channel only) on a dedicated `release-metadata/<channel>`
branch, opens a pull request against `main`, and lets the protected-branch rules
decide when the metadata lands. Vercel deploys a preview for the PR and the
production site on merge.

At read time the download page prefers those files, falls back to the GitHub
releases API, and finally shows an honest "no published releases" state. It never
invents a version, a filename, or a download URL.

### Required setup

- `main` must be a protected branch with a required status check named `CI`
(from `.github/workflows/website-ci.yml`) and, if desired, a required review.
The sync workflow never disables or bypasses those rules.
- The `release-metadata/*` branch prefix must be writable by the workflow's
`GITHUB_TOKEN` (it is not itself protected).
- The server repository must be granted a token that can send `repository_dispatch`
to this repository (`contents: write`). This workflow writes with the
repository's own `GITHUB_TOKEN`; only the sender needs a secret.
to this repository. Only the sender needs a secret; this workflow runs entirely
on its own `GITHUB_TOKEN`, with no repository secret.
- The metadata commit is signed by GitHub through the GraphQL
`createCommitOnBranch` mutation, so it shows as *Verified* without GPG.
- No repository files under `public/releases/` should be edited by hand.

---
Expand Down Expand Up @@ -105,7 +114,7 @@ export const siteConfig = {
github: 'https://github.com/VeltisMC/Veltis',
discord: 'https://discord.com/invite/239MkjVmZw',
defaultMinecraftVersion: '26.3',
javaRequirement: 'Java 25+ (JDK 26)',
javaRequirement: 'Java 25+',
...
}
```
Expand Down
15 changes: 0 additions & 15 deletions public/sitemap.xml
Original file line number Diff line number Diff line change
Expand Up @@ -65,21 +65,6 @@
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://www.veltismc.org/architecture</loc>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://www.veltismc.org/shulker</loc>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://www.veltismc.org/roadmap</loc>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://www.veltismc.org/community</loc>
<changefreq>monthly</changefreq>
Expand Down
6 changes: 0 additions & 6 deletions src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,6 @@ const CommunityPage = lazy(() => import('./pages/CommunityPage'))
const ContributingPage = lazy(() => import('./pages/ContributingPage'))
const ChangelogPage = lazy(() => import('./pages/ChangelogPage'))
const LicensePage = lazy(() => import('./pages/LicensePage'))
const RoadmapPage = lazy(() => import('./pages/RoadmapPage'))
const ShulkerPage = lazy(() => import('./pages/ShulkerPage'))
const ArchitecturePage = lazy(() => import('./pages/ArchitecturePage'))
const NotFoundPage = lazy(() => import('./pages/NotFoundPage'))

function RouteFallback() {
Expand Down Expand Up @@ -44,9 +41,6 @@ export default function App() {
<Route path="/contributing" element={<ContributingPage />} />
<Route path="/changelog" element={<ChangelogPage />} />
<Route path="/license" element={<LicensePage />} />
<Route path="/roadmap" element={<RoadmapPage />} />
<Route path="/shulker" element={<ShulkerPage />} />
<Route path="/architecture" element={<ArchitecturePage />} />

{/* 404 Catch-All */}
<Route path="*" element={<NotFoundPage />} />
Expand Down
Loading
Loading