---
layout: base.njk
title: KST4Contest – ON4KST Contest Client for VHF, UHF and SHF
description: KST4Contest combines ON4KST chat, candidate prioritisation, sked planning, AirScout data and logger integration in one desktop client.
heroFx: true
---

<section class="hero hero-split">
  <canvas class="hero-radio-fx" data-hero-radio-fx aria-hidden="true"></canvas>
  <div class="hero-fx-vignette" aria-hidden="true"></div>

  <div class="hero-copy">
    <p class="badge">ON4KST contest workflow for 144 MHz and above</p>
    <h1>KST4Contest</h1>

    <p class="lead">
      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.
    </p>

    <p>
      The available information is filtered, related to active stations and
      presented in a contest-oriented workflow. The final decision still
      belongs to the operator.
    </p>

    <div class="actions">
      <a class="button" href="/download/">Download KST4Contest</a>
      <a class="button secondary" href="/manual/">Read the manual</a>
      <a class="button ghost" href="https://github.com/praktimarc/kst4contest">View source code</a>
    </div>
  </div>

  <div class="hero-panel">
    <div class="terminal-bar">
      <span></span><span></span><span></span>
      <strong>Functions sharing the same station context</strong>
    </div>

    <div class="mock-grid">
      {% for feature in collections.sortedFeatures %}
        {% if loop.index <= 6 %}
          <div class="mini-card">
            <strong>{{ feature.data.icon }} {{ feature.data.title }}</strong>
            <small>{{ feature.data.summary }}</small>
          </div>
        {% endif %}
      {% endfor %}
    </div>
  </div>
</section>

<section class="section">
  <div class="section-heading">
    <p class="eyebrow">The operating problem</p>
    <h2>The useful station is rarely the only station in the chat</h2>
    <p>
      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.
    </p>
  </div>

  <div class="grid">
    <article class="card">
      <h3>Observe</h3>
      <p>
        Messages, locators, detected frequencies and known band activity are
        assigned to stations across as many as two ON4KST chat categories.
      </p>
    </article>

    <article class="card">
      <h3>Evaluate</h3>
      <p>
        Direction, distance, worked status, NOT-QRV information, chat activity,
        sked context and aircraft scatter data feed filters and candidate scores.
      </p>
    </article>

    <article class="card">
      <h3>Act</h3>
      <p>
        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.
      </p>
    </article>
  </div>
</section>

<section class="section">
  <div class="section-heading">
    <p class="eyebrow">Functions</p>
    <h2>One workflow, shared context</h2>
    <p>
      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.
    </p>
  </div>

  <div class="grid">
    {% for feature in collections.sortedFeatures %}
      <article class="card feature-card">
        <div class="feature-icon">{{ feature.data.icon }}</div>
        <p class="eyebrow">{{ feature.data.category }}</p>
        <h3><a href="{{ feature.url }}">{{ feature.data.title }}</a></h3>
        <p>{{ feature.data.summary }}</p>
        <a href="{{ feature.url }}">Read how it works →</a>
      </article>
    {% endfor %}
  </div>
</section>

<section class="section">
  <div class="cta-panel">
    <p class="eyebrow">Limits</p>
    <h2>A priority score is not a propagation forecast</h2>
    <p>
      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.
    </p>

    <div class="actions">
      <a class="button" href="/features/">Explore the functions</a>
      <a class="button secondary" href="/manual/">Read the technical details</a>
    </div>
  </div>
</section>

<section class="section">
  <div class="cta-panel">
    <p class="eyebrow">Project status</p>
    <h2>Stable for operation, Nightly for testing</h2>
    <p>
      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.
    </p>

    <div class="actions">
      <a class="button" href="/download/">Download the stable release</a>
      <a class="button secondary" href="/roadmap/">Development status</a>
      <a class="button ghost" href="/support/">Support development</a>
    </div>
  </div>
</section>

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "SoftwareApplication",
  "name": "KST4Contest",
  "applicationCategory": "CommunicationApplication",
  "operatingSystem": "Windows, Linux, macOS",
  "url": "https://kst4contest.hamradioonline.de/",
  "downloadUrl": "https://github.com/praktimarc/kst4contest/releases/latest",
  "description": "KST4Contest combines ON4KST chat, candidate prioritisation, sked planning, AirScout data and logger integration for VHF, UHF and SHF contest operation.",
  "license": "https://github.com/praktimarc/kst4contest/blob/main/LICENSE"
}
</script>