diff --git a/website/src/_data/screenshots.js b/website/src/_data/screenshots.js
index 9b876804..989a2618 100644
--- a/website/src/_data/screenshots.js
+++ b/website/src/_data/screenshots.js
@@ -1,23 +1,32 @@
module.exports = [
{
- id: "main-window",
- title: "Main Window",
- image: "/assets/screenshots/main-window.png",
- alt: "KST4Contest ON4KST contest chat client main window",
- caption: "Contest-oriented ON4KST chat workflow with candidate awareness."
+ id: "main-window-light",
+ title: "Main window · Light theme",
+ image: "/assets/completeViewLight.png",
+ alt: "KST4Contest main window in the light theme with ON4KST chat, station filters, priority candidates and sked controls",
+ caption: "The complete contest view brings chat messages, active bands, filters and priority candidates together."
},
{
- id: "priority-candidates",
- title: "Priority Candidates",
- image: "/assets/screenshots/priority-candidates.png",
- alt: "Priority candidate list in KST4Contest",
- caption: "Score-based candidate ranking for faster operator decisions."
+ id: "main-window-dark",
+ title: "Main window · Dark theme",
+ image: "/assets/completeViewDark.png",
+ alt: "KST4Contest main window in the dark theme with ON4KST chat, station filters, priority candidates and sked controls",
+ caption: "The same operating view in the dark theme, including worked status, candidate priorities and message preparation."
},
{
id: "timeline",
- title: "Timeline View",
- image: "/assets/screenshots/timeline.png",
- alt: "KST4Contest AP timeline view",
- caption: "Timeline support for AP windows and candidate timing."
+ title: "AP and sked timeline",
+ image: "/assets/timeline.png",
+ alt: "KST4Contest timeline showing scheduled contacts and Aircraft Scatter crossing windows",
+ caption: "Skeds and Aircraft Scatter opportunities share one time axis, making upcoming operating windows easier to coordinate.",
+ wide: true
+ },
+ {
+ id: "airscout",
+ title: "KST4Contest with AirScout",
+ image: "/assets/complete_incl_AS.png",
+ alt: "KST4Contest main window alongside AirScout path and aircraft information",
+ caption: "AirScout adds path and aircraft information while KST4Contest keeps the related chat and station context visible.",
+ wide: true
}
-];
\ No newline at end of file
+];
diff --git a/website/src/_layouts/base.njk b/website/src/_layouts/base.njk
index b19ec2c2..8d3fb76c 100644
--- a/website/src/_layouts/base.njk
+++ b/website/src/_layouts/base.njk
@@ -61,6 +61,7 @@
Features
Download
Manual
+ Background
Roadmap
diff --git a/website/src/assets/completeViewDark.png b/website/src/assets/completeViewDark.png
new file mode 100644
index 00000000..d4bbaad3
Binary files /dev/null and b/website/src/assets/completeViewDark.png differ
diff --git a/website/src/assets/completeViewLight.png b/website/src/assets/completeViewLight.png
new file mode 100644
index 00000000..6b9ea841
Binary files /dev/null and b/website/src/assets/completeViewLight.png differ
diff --git a/website/src/assets/complete_incl_AS.png b/website/src/assets/complete_incl_AS.png
new file mode 100644
index 00000000..6d31fd11
Binary files /dev/null and b/website/src/assets/complete_incl_AS.png differ
diff --git a/website/src/assets/css/main.css b/website/src/assets/css/main.css
index 99cf7ab0..2e564c55 100644
--- a/website/src/assets/css/main.css
+++ b/website/src/assets/css/main.css
@@ -641,18 +641,31 @@ a:hover {
margin-top: 30px;
}
-.screenshot-placeholder {
- display: grid;
- place-items: center;
- min-height: 180px;
+.screenshot-grid {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+}
+
+.screenshot-card--wide {
+ grid-column: 1 / -1;
+}
+
+.screenshot-link {
+ display: block;
margin-bottom: 16px;
border-radius: 18px;
- background:
- linear-gradient(135deg, rgba(56, 189, 248, 0.20), rgba(168, 85, 247, 0.20)),
- rgba(2, 6, 23, 0.7);
+ overflow: hidden;
border: 1px solid var(--border);
- color: white;
- font-weight: 800;
+ background: rgba(2, 6, 23, 0.7);
+}
+
+.screenshot-image {
+ display: block;
+ width: 100%;
+ height: auto;
+}
+
+.screenshot-card h3 {
+ margin-bottom: 8px;
}
.cta-panel {
@@ -718,6 +731,14 @@ code {
align-items: flex-start;
flex-direction: column;
}
+
+ .screenshot-grid {
+ grid-template-columns: 1fr;
+ }
+
+ .screenshot-card--wide {
+ grid-column: auto;
+ }
}
@media (prefers-reduced-motion: no-preference) {
diff --git a/website/src/assets/timeline.png b/website/src/assets/timeline.png
new file mode 100644
index 00000000..13352e62
Binary files /dev/null and b/website/src/assets/timeline.png differ
diff --git a/website/src/download/index.njk b/website/src/download/index.njk
index 8ec340ee..29fe663c 100644
--- a/website/src/download/index.njk
+++ b/website/src/download/index.njk
@@ -212,6 +212,45 @@ description: Download the latest stable KST4Contest packages for Windows, Linux
+
+
+
Conference papers
+
Background from GHz-Tagung Dorsten
+
+ These historical conference papers document KST4Contest at the time of the 2025 and 2026 talks.
+ They provide project background, not a complete description of the current feature set.
+
+
+
+
+
+ GHz-Tagung 2025
+
+ How KST4Contest grew from practical contest operation and addressed limitations of conventional
+ chat clients.
+
+
+ Background and source details →
+
+
+
+ GHz-Tagung 2026
+
+ How archived ON4KST chat data was evaluated and how the findings influenced later KST4Contest
+ functions.
+
+
+ Background and source details →
+
+
+
+
Choosing a package
diff --git a/website/src/screenshots/index.njk b/website/src/screenshots/index.njk
index 45e507ba..ff16c773 100644
--- a/website/src/screenshots/index.njk
+++ b/website/src/screenshots/index.njk
@@ -14,15 +14,26 @@ description: Screenshots of KST4Contest, the contest-optimized ON4KST chat clien
-
+
+
Four working views
+
From chat overview to Aircraft Scatter timing
+
+ These screenshots were captured in a test environment. Version-like text inside chat messages is
+ test data, not an announcement of a published KST4Contest version.
+
+
+
+
{% for shot in screenshots %}
-
-
- {{ shot.title }}
-
+
+
+
+
{{ shot.title }}
{{ shot.caption }}
+ Open full-size image →
{% endfor %}
-
\ No newline at end of file
+
diff --git a/website/test/homepage.test.js b/website/test/homepage.test.js
index a333f4a0..9c96480d 100644
--- a/website/test/homepage.test.js
+++ b/website/test/homepage.test.js
@@ -60,3 +60,61 @@ test("homepage contains one selected function grid and a complete-overview link"
assert.match(source, /href="\/features\/"[^>]*>Open the complete function overview/);
assert.doesNotMatch(source, /Observe|Evaluate|>Act<|One workflow, shared context/);
});
+
+test("screenshot page uses the four approved originals as full-size links", () => {
+ const page = fs.readFileSync(
+ path.join(__dirname, "../src/screenshots/index.njk"),
+ "utf8"
+ );
+ const css = fs.readFileSync(
+ path.join(__dirname, "../src/assets/css/main.css"),
+ "utf8"
+ );
+ const screenshots = require("../src/_data/screenshots.js");
+
+ assert.equal(screenshots.length, 4);
+ assert.deepEqual(
+ screenshots.map(({ image }) => image),
+ [
+ "/assets/completeViewLight.png",
+ "/assets/completeViewDark.png",
+ "/assets/timeline.png",
+ "/assets/complete_incl_AS.png"
+ ]
+ );
+ assert.ok(screenshots.every(({ alt, caption }) => alt && caption));
+ assert.equal(screenshots.find(({ id }) => id === "timeline").wide, true);
+ assert.doesNotMatch(JSON.stringify(screenshots), /Priority Candidates/);
+ assert.match(page, /href="{{ shot\.image }}"[\s\S]*
![]()
]*src="{{ shot\.image }}"/);
+ assert.match(page, /Version-like text inside chat messages is[\s\S]*not an announcement/);
+ assert.match(css, /\.screenshot-image\s*\{[\s\S]*?width:\s*100%;[\s\S]*?height:\s*auto;/);
+ assert.match(css, /\.screenshot-card--wide\s*\{\s*grid-column:\s*1\s*\/\s*-1;/);
+});
+
+test("footer and download page expose background and conference papers", () => {
+ const layout = fs.readFileSync(
+ path.join(__dirname, "../src/_layouts/base.njk"),
+ "utf8"
+ );
+ const download = fs.readFileSync(
+ path.join(__dirname, "../src/download/index.njk"),
+ "utf8"
+ );
+
+ assert.match(layout, /
Background<\/a><\/p>/);
+ for (const name of [
+ "kst4contest-ghz-tagung-2025-de.pdf",
+ "kst4contest-ghz-tagung-2025-en.pdf",
+ "kst4contest-ghz-tagung-2026-de.pdf",
+ "kst4contest-ghz-tagung-2026-en.pdf"
+ ]) {
+ assert.match(download, new RegExp(`/assets/papers/${name.replaceAll(".", "\\.")}`));
+ }
+ assert.match(download, /href="\/background\/#paper-2025"/);
+ assert.match(download, /href="\/background\/#paper-2026"/);
+ assert.match(download, /historical conference papers[\s\S]*not a complete description of the current feature set/);
+ assert.ok(
+ download.indexOf("Background from GHz-Tagung Dorsten") >
+ download.indexOf('')
+ );
+});