diff --git a/GHzTagung_KST4Contest_Skript2025.odt b/GHzTagung_KST4Contest_Skript2025.odt
new file mode 100644
index 00000000..e8c0e35a
Binary files /dev/null and b/GHzTagung_KST4Contest_Skript2025.odt differ
diff --git a/GHzTagung_KST4Contest_Skript2026.odt b/GHzTagung_KST4Contest_Skript2026.odt
new file mode 100644
index 00000000..650fe25a
Binary files /dev/null and b/GHzTagung_KST4Contest_Skript2026.odt differ
diff --git a/docs/PROJECT_CONTEXT.md b/docs/PROJECT_CONTEXT.md
index 608014c8..52862965 100644
--- a/docs/PROJECT_CONTEXT.md
+++ b/docs/PROJECT_CONTEXT.md
@@ -170,6 +170,9 @@ After implementation use targeted documentation-impact checks. Do not run a comp
The repository contains the KST4Contest website under `website/`, published separately from the desktop application build.
+- Historical GHz-Tagung papers are published as German and English PDF assets below `website/src/assets/papers/` and explained on `/background/`. Their editable ODT sources remain outside the public Eleventy input tree and must never be copied into the generated site.
+- The home-page news teaser is derived from the date-sorted Eleventy `news` tag collection. It deliberately renders nothing when that collection is empty; it must not be pinned to a release version.
+
Current website/deployment scripts and update-feed behaviour must be inspected before changes; do not rely on historical assumptions.
- `APPLICATION_CURRENT_VERSION` is the user-visible semantic version and must use the dotted `major.minor.patch` form. `APPLICATION_CURRENTVERSIONNUMBER` is retained only for older feeds and encodes patch releases by appending the patch digit, for example `1.43.1` as `1.431`.
diff --git a/website/.eleventy.js b/website/.eleventy.js
index 05653041..d7f2eee5 100644
--- a/website/.eleventy.js
+++ b/website/.eleventy.js
@@ -73,6 +73,12 @@ function getManualPageOrder(lang, slug) {
return index >= 0 ? index : 999;
}
+function selectLatestNews(newsItems) {
+ return [...(newsItems || [])]
+ .sort((first, second) => second.date - first.date)
+ .slice(0, 1);
+}
+
function githubCompatibleSlug(value) {
return (value || "")
.trim()
@@ -152,6 +158,12 @@ module.exports = function (eleventyConfig) {
});
});
+ eleventyConfig.addCollection("latestNews", function (collectionApi) {
+ return selectLatestNews(
+ collectionApi.getFilteredByTag("news")
+ );
+ });
+
eleventyConfig.addFilter("whereTag", function(collection, tag) {
return collection.filter(item => item.data.tags && item.data.tags.includes(tag));
});
@@ -231,3 +243,5 @@ module.exports = function (eleventyConfig) {
htmlTemplateEngine: "njk"
};
};
+
+module.exports.selectLatestNews = selectLatestNews;
diff --git a/website/src/about/index.njk b/website/src/about/index.njk
index 09487d56..15af8471 100644
--- a/website/src/about/index.njk
+++ b/website/src/about/index.njk
@@ -25,6 +25,8 @@ description: About KST4Contest and its contest-oriented ON4KST workflow.
The project is open source and focused on practical contest station workflows.
Features are designed around real operating pressure, not theoretical UI concepts.
+ The background and conference papers explain how
+ work at DM5M and later analysis of archived ON4KST chat data influenced the client.
Community supported
@@ -42,4 +44,4 @@ description: About KST4Contest and its contest-oriented ON4KST workflow.
-
\ No newline at end of file
+
diff --git a/website/src/assets/papers/kst4contest-ghz-tagung-2025-de.pdf b/website/src/assets/papers/kst4contest-ghz-tagung-2025-de.pdf
new file mode 100644
index 00000000..c12d7db9
Binary files /dev/null and b/website/src/assets/papers/kst4contest-ghz-tagung-2025-de.pdf differ
diff --git a/website/src/assets/papers/kst4contest-ghz-tagung-2025-en.pdf b/website/src/assets/papers/kst4contest-ghz-tagung-2025-en.pdf
new file mode 100644
index 00000000..842b41fa
Binary files /dev/null and b/website/src/assets/papers/kst4contest-ghz-tagung-2025-en.pdf differ
diff --git a/website/src/assets/papers/kst4contest-ghz-tagung-2026-de.pdf b/website/src/assets/papers/kst4contest-ghz-tagung-2026-de.pdf
new file mode 100644
index 00000000..4ebf83ac
Binary files /dev/null and b/website/src/assets/papers/kst4contest-ghz-tagung-2026-de.pdf differ
diff --git a/website/src/assets/papers/kst4contest-ghz-tagung-2026-en.pdf b/website/src/assets/papers/kst4contest-ghz-tagung-2026-en.pdf
new file mode 100644
index 00000000..33ca89eb
Binary files /dev/null and b/website/src/assets/papers/kst4contest-ghz-tagung-2026-en.pdf differ
diff --git a/website/src/background/index.njk b/website/src/background/index.njk
new file mode 100644
index 00000000..c6ee1a87
--- /dev/null
+++ b/website/src/background/index.njk
@@ -0,0 +1,98 @@
+---
+layout: base.njk
+lang: en
+title: Background and conference papers
+description: The operating background of KST4Contest and the German and English papers presented at GHz-Tagung Dorsten in 2025 and 2026.
+---
+
+
+ Project background
+ Background and conference papers
+
+ KST4Contest grew out of practical contest operation at DM5M. Individual
+ functions started with concrete problems encountered while using the ON4KST
+ chat; later development was also influenced by analysis of archived chat data.
+
+
+
+
+
+
Two points in the project history
+
What the papers document
+
+ These papers preserve the implementation and knowledge available at the
+ respective GHz-Tagung. Their historical version references and plans have
+ deliberately not been rewritten to match the current application.
+
+
+
+
+
+ GHz-Tagung Dorsten · 2025
+ Softwaregestützte Optimierung der Betriebstechnik von Conteststationen am Beispiel von KST4Contest
+ English title: Software-assisted optimisation of contest station operating practice using KST4Contest
+
+ The paper covers the development of KST4Contest, practical contest
+ operating technique, the limits of conventional chat clients, Worked
+ information, Genius frequency and message analysis, AirScout, logger,
+ rotator and DX Cluster integration, and the operating and UI concept.
+
+
+ Marc Fröhlich, “Softwaregestützte Optimierung der Betriebstechnik von
+ Conteststationen am Beispiel von KST4Contest”, paper for the presentation
+ at GHz-Tagung Dorsten 2025.
+
+
+ The English edition is a translation of the German original, not a
+ separate publication.
+
+
+ German PDF · 3.4 MB · English PDF · 3.4 MB
+
+
+
+ GHz-Tagung Dorsten · 2026
+ Chat-Mining: Jagdinstinkte wecken mit KST4Contest
+ English title: Chat mining: awakening hunting instincts with KST4Contest
+
+ The paper examines archived ON4KST chats, presence in both categories,
+ activity periods, sked requests and reply behaviour, the relationship
+ between useful information and reply rate, and the functions derived
+ from those observations.
+
+
+ Marc Fröhlich, “Chat-Mining: Jagdinstinkte wecken mit KST4Contest”, paper
+ for the presentation at GHz-Tagung
+ Dorsten 2026, including section “Erfolgsrezept”.
+
+
+ The English edition is a translation of the German original, not a
+ separate study.
+
+
+ German PDF · 1.8 MB · English PDF · 1.7 MB
+
+
+
+
+
+
+
Current software
+
The papers explain the background, not today's complete feature set
+
+ For current behaviour and configuration, use the complete function
+ overview and the manual. The conference papers remain historical sources.
+
+
+
+
diff --git a/website/src/index.njk b/website/src/index.njk
index 95f90d57..b934031d 100644
--- a/website/src/index.njk
+++ b/website/src/index.njk
@@ -15,15 +15,15 @@ visitorCount: true
KST4Contest
- ON4KST shows you the traffic. KST4Contest helps turn it into an operating
- decision by combining chat, candidate prioritisation, sked planning,
- AirScout data and logger integration in one desktop client.
+ KST4Contest is an ON4KST client for VHF, UHF and SHF contest operation
+ on 144 MHz and above. It keeps active stations, frequencies, skeds and
+ aircraft-scatter opportunities in view while connecting chat information
+ with logger and station interfaces.
- The available information is filtered, related to active stations and
- presented in a contest-oriented workflow. The final decision still
- belongs to the operator.
+ The client helps the operator choose the next useful station and prepare
+ the next operating step. It does not automate the radio contact itself.
@@ -36,57 +36,71 @@ visitorCount: true
- Functions sharing the same station context
+ Contest information ready for the next decision
- {% for feature in collections.sortedFeatures %}
- {% if loop.index <= 6 %}
-
- {{ feature.data.icon }} {{ feature.data.title }}
- {{ feature.data.summary }}
-
- {% endif %}
- {% endfor %}
+
+ Active stations and QRGs
+ Chat messages, recognised frequencies and known bands stay connected to the station.
+
+
+ Skeds and AP windows
+ Scheduled contacts and AirScout timing remain visible while the contest continues.
+
+
+ Logger and station status
+ Worked information, the current TRX QRG and rotor direction inform the same workflow.
+
+{% if collections.latestNews.length %}
+ {% set latestPost = collections.latestNews[0] %}
+
+
+ Latest news · {{ latestPost.date | readableDate }}
+
+ {{ latestPost.data.summary }}
+ Open this update →
+
+
+{% endif %}
+
-
The operating problem
-
The useful station is rarely the only station in the chat
+
Practical tasks
+
From chat traffic to the next operating step
- During an active contest, messages, sked requests, frequency information
- and band changes arrive continuously. The task is to identify which part
- of that traffic matters now, which candidate should be monitored and
- which contact is better scheduled for later.
+ Messages, station activity and station interfaces provide different
+ pieces of the same operating situation. KST4Contest brings them together
+ where they are needed.
- Observe
+ Keep track of chat and active stations
- Messages, locators, detected frequencies and known band activity are
- assigned to stations across as many as two ON4KST chat categories.
+ Follow messages across two ON4KST categories, see active bands and keep
+ recognised frequencies attached to the callsign that sent them.
- Evaluate
+ Select and plan contacts
- Direction, distance, worked status, NOT-QRV information, chat activity,
- sked context and aircraft scatter data feed filters and candidate scores.
+ Use filters and priorities to find candidates, schedule skeds and keep
+ their timing visible in the timeline together with AirScout data.
- Act
+ Connect logger and station components
- Candidates can be contacted, scheduled or monitored. Skeds remain
- visible, while supported loggers and station interfaces receive the
- information required for the next operating step.
+ Synchronise Worked status with supported loggers and pass useful context
+ to the TRX, rotator and local DX Cluster interfaces.
@@ -94,25 +108,77 @@ visitorCount: true
-
Functions
-
One workflow, shared context
+
What the chat data showed
+
Useful detail makes a reply easier
- The individual functions are not isolated tools. They use the same
- station, message, band and timing information, so that a change in one
- part of the workflow can also affect filters, priorities and reminders.
+ Archived ON4KST chat logs from several IARU contests in the preceding two
+ years were analysed. The concrete example comes from the July 2025 contest
+ and combines the 144/432 MHz and Microwave categories. It compares sked
+ requests with the replies and sked windows they produced.
+
+
+ The text analysis considered action and sked words, frequency, timing,
+ beam direction, aircraft-scatter information, locator, mode and courtesy
+ or anchor words. Within this sample, requests containing AP and beam
+ information were associated with an almost 30% higher chat reply rate
+ than short, unspecific requests such as “Hi noname, try 2m?”.
+
+
+ This measures chat replies, not completed QSOs. It is a correlation within
+ the investigated sample, not general proof of causation and not a promise
+ that an individual sked will succeed. The practical point is modest:
+ information that can be used immediately saves the other operator from
+ having to ask for it first. KST4Contest supplies part of that context when
+ preparing messages and skeds.
+
+
+ Source: Marc Fröhlich, “Chat-Mining: Jagdinstinkte wecken mit KST4Contest”,
+ conference paper for GHz-Tagung Dorsten 2026, section “Erfolgsrezept”.
+ Read the background and download the paper.
+
+
+
+
+
+
+
Selected functions
+
The parts most often used during a contest
+
+ These examples show how station, band, message and timing information is
+ used in practice. The complete function overview remains available for
+ configuration details and less frequently used tools.
- {% for feature in collections.sortedFeatures %}
-
- {{ feature.data.icon }}
- {{ feature.data.category }}
-
- {{ feature.data.summary }}
- Read how it works →
-
- {% endfor %}
+
+
+ Separate global and private views keep the traffic readable, while station filters narrow the candidate list without hiding the underlying chat context.
+
+
+
+ Candidate scores combine available station information with Worked and band state so that a useful next call is easier to find.
+
+
+
+ Manual skeds, reminders and aircraft-scatter windows remain visible instead of disappearing in the continuing chat stream.
+
+
+
+ AirScout data adds timing and path context to a selected station without turning that assessment into a propagation promise.
+
+
+
+ Supported logger data updates global and per-band Worked information across the active callsign variants.
+
+
+
+ The current QRG, rotor direction and local spots carry selected station information into the next manual operating step.
+
+
+
+
@@ -121,10 +187,9 @@ visitorCount: true
Limits
A priority score is not a propagation forecast
- KST4Contest can only evaluate the information it knows. Scores, AP
- windows, filters and path profiles support the operator's decision; they
- do not guarantee a contact. If the input data is incomplete or outdated,
- the result can be incomplete or outdated as well.
+ Priorities are not a propagation forecast. Scores, filters and AP windows
+ depend on the data available to the client. They help with sorting and
+ timing, but they do not guarantee a QSO.
@@ -139,11 +204,9 @@ visitorCount: true
Project status
Stable for operation, Nightly for testing
- KST4Contest is open-source software. The current stable release is the
- normal choice for contest operation. Nightly builds follow ongoing
- development and are useful when a particular fix or feature needs
- testing. A few minutes before a contest is not the ideal time to discover
- what changed.
+ Stable is the normal choice for contest operation. Nightly contains the
+ latest development state and is intended for testing. Changing versions
+ immediately before a contest is still not recommended.
diff --git a/website/test/homepage.test.js b/website/test/homepage.test.js
new file mode 100644
index 00000000..a333f4a0
--- /dev/null
+++ b/website/test/homepage.test.js
@@ -0,0 +1,62 @@
+const assert = require("node:assert/strict");
+const fs = require("node:fs");
+const path = require("node:path");
+const test = require("node:test");
+
+const eleventyConfig = require("../.eleventy.js");
+
+test("selects the newest news article without relying on a version", () => {
+ const older = { date: new Date("2026-08-22"), data: { title: "Older" } };
+ const newest = { date: new Date("2026-09-03"), data: { title: "Newest" } };
+
+ assert.deepEqual(
+ eleventyConfig.selectLatestNews([older, newest]),
+ [newest]
+ );
+});
+
+test("an empty news collection omits the latest-news item safely", () => {
+ assert.deepEqual(eleventyConfig.selectLatestNews([]), []);
+ assert.deepEqual(eleventyConfig.selectLatestNews(), []);
+});
+
+test("homepage keeps the statistical result tied to its limits", () => {
+ const source = fs.readFileSync(
+ path.join(__dirname, "../src/index.njk"),
+ "utf8"
+ );
+
+ assert.match(source, /almost 30% higher chat reply rate/);
+ assert.match(source, /chat replies, not completed QSOs/);
+ assert.match(source, /correlation within[\s\S]*not general proof of causation/);
+ assert.match(source, /July 2025 contest/);
+ assert.match(source, /144\/432 MHz and Microwave categories/);
+});
+
+test("background page links all public papers and no ODT source", () => {
+ const source = fs.readFileSync(
+ path.join(__dirname, "../src/background/index.njk"),
+ "utf8"
+ );
+
+ 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(source, new RegExp(name.replaceAll(".", "\\.")));
+ }
+ assert.doesNotMatch(source, /\.odt\b/i);
+});
+
+test("homepage contains one selected function grid and a complete-overview link", () => {
+ const source = fs.readFileSync(
+ path.join(__dirname, "../src/index.njk"),
+ "utf8"
+ );
+
+ assert.equal((source.match(/
The parts most often used during a contest<\/h2>/g) || []).length, 1);
+ assert.match(source, /href="\/features\/"[^>]*>Open the complete function overview/);
+ assert.doesNotMatch(source, /Observe|Evaluate|>Act<|One workflow, shared context/);
+});