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] %} +
+ +
+{% 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 %} - - {% endfor %} +
+

Chat overview and station filters

+

Separate global and private views keep the traffic readable, while station filters narrow the candidate list without hiding the underlying chat context.

+
+
+

Priority and band opportunities

+

Candidate scores combine available station information with Worked and band state so that a useful next call is easier to find.

+
+
+

Skeds and AP timeline

+

Manual skeds, reminders and aircraft-scatter windows remain visible instead of disappearing in the continuing chat stream.

+
+
+

AirScout and path information

+

AirScout data adds timing and path context to a selected station without turning that assessment into a propagation promise.

+
+ + +
+ +
@@ -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/); +});