mirror of
https://github.com/praktimarc/kst4contest.git
synced 2026-09-12 04:05:34 +02:00
Compare commits
12
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
250290a1eb | ||
|
|
052cfea7ad
|
||
|
|
d930b57196 | ||
|
|
eb29d56f4e | ||
|
|
eb2a7f88a4 | ||
|
|
8c3e4c15af | ||
|
|
c8b1f97872 | ||
|
|
b47fd21dd0 | ||
|
|
f009ed4b3d | ||
|
|
47126f4ae1
|
||
|
|
7d3177ba8a | ||
|
|
ff71623b90
|
@@ -25,7 +25,7 @@ concurrency:
|
|||||||
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: read
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-website:
|
build-website:
|
||||||
@@ -35,6 +35,8 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4.1.7
|
uses: actions/checkout@v4.1.7
|
||||||
|
with:
|
||||||
|
ssh-key: ${{ secrets.WEBSITE_DEPLOY_KEY }}
|
||||||
|
|
||||||
- name: Set up Node.js
|
- name: Set up Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ concurrency:
|
|||||||
cancel-in-progress: false
|
cancel-in-progress: false
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: read
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
rebuild-roadmap:
|
rebuild-roadmap:
|
||||||
@@ -27,6 +27,7 @@ jobs:
|
|||||||
uses: actions/checkout@v4.1.7
|
uses: actions/checkout@v4.1.7
|
||||||
with:
|
with:
|
||||||
ref: main
|
ref: main
|
||||||
|
ssh-key: ${{ secrets.WEBSITE_DEPLOY_KEY }}
|
||||||
|
|
||||||
- name: Set up Node.js
|
- name: Set up Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
|
|||||||
@@ -64,6 +64,8 @@ import javafx.scene.shape.Polygon;
|
|||||||
import javafx.stage.Screen;
|
import javafx.stage.Screen;
|
||||||
|
|
||||||
import kst4contest.utils.ApplicationFileUtils;
|
import kst4contest.utils.ApplicationFileUtils;
|
||||||
|
import kst4contest.view.map.MapCallsignRawSnapshot;
|
||||||
|
import kst4contest.view.map.MapCallsignRawSnapshotBuilder;
|
||||||
import kst4contest.view.map.StationMapBridge;
|
import kst4contest.view.map.StationMapBridge;
|
||||||
import kst4contest.view.map.StationMapView;
|
import kst4contest.view.map.StationMapView;
|
||||||
import kst4contest.view.map.OfflineDemImportService;
|
import kst4contest.view.map.OfflineDemImportService;
|
||||||
@@ -116,6 +118,8 @@ public class Kst4ContestApplication extends Application implements StatusUpdateL
|
|||||||
private final Tooltip tipSkedWarnIndicator = new Tooltip();
|
private final Tooltip tipSkedWarnIndicator = new Tooltip();
|
||||||
private Timeline skedWarnBlinkTimeline;
|
private Timeline skedWarnBlinkTimeline;
|
||||||
|
|
||||||
|
private final MapCallsignRawSnapshotBuilder mainViewBandMarkerSnapshotBuilder = new MapCallsignRawSnapshotBuilder();
|
||||||
|
|
||||||
|
|
||||||
// Timeline: show at most N priority markers per minute bucket (minute 0/1 often has many planes)
|
// Timeline: show at most N priority markers per minute bucket (minute 0/1 often has many planes)
|
||||||
private static final int TIMELINE_PRIORITY_MARKERS_PER_MINUTE = 2;
|
private static final int TIMELINE_PRIORITY_MARKERS_PER_MINUTE = 2;
|
||||||
@@ -414,6 +418,55 @@ public class Kst4ContestApplication extends Application implements StatusUpdateL
|
|||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether a station has known activity on the given band and that band is
|
||||||
|
* one of my own currently enabled bands, i.e. a new-band opportunity worth flagging
|
||||||
|
* with a star in that band's table cell.
|
||||||
|
*
|
||||||
|
* @param chatMember station row
|
||||||
|
* @param band band to check
|
||||||
|
* @return true if the band cell should show a star
|
||||||
|
*/
|
||||||
|
private boolean isBandOfferForMainView(ChatMember chatMember, Band band) {
|
||||||
|
if (chatMember == null
|
||||||
|
|| band == null
|
||||||
|
|| chatcontroller == null
|
||||||
|
|| chatcontroller.getReachabilityService() == null
|
||||||
|
|| chatMember.getCallSignRaw() == null
|
||||||
|
|| chatMember.getCallSignRaw().isBlank()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
EnumSet<Band> enabledBands = chatcontroller.getReachabilityService().getEnabledStationBands();
|
||||||
|
if (enabledBands == null || !enabledBands.contains(band)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<ChatMember> variants = new ArrayList<>();
|
||||||
|
synchronized (chatcontroller.getLst_chatMemberList()) {
|
||||||
|
for (ChatMember variant : chatcontroller.getLst_chatMemberList()) {
|
||||||
|
if (variant == null || variant.getCallSignRaw() == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (variant.getCallSignRaw().equalsIgnoreCase(chatMember.getCallSignRaw())) {
|
||||||
|
variants.add(variant);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (variants.isEmpty()) {
|
||||||
|
variants = List.of(chatMember);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<MapCallsignRawSnapshot> snapshots = mainViewBandMarkerSnapshotBuilder.buildSnapshots(
|
||||||
|
variants,
|
||||||
|
null,
|
||||||
|
EnumSet.of(band)
|
||||||
|
);
|
||||||
|
|
||||||
|
return snapshots.stream().anyMatch(MapCallsignRawSnapshot::offersSelectedBand);
|
||||||
|
}
|
||||||
|
|
||||||
private String bandToHumanLabel(kst4contest.model.Band b) {
|
private String bandToHumanLabel(kst4contest.model.Band b) {
|
||||||
// Human-friendly labels for VHF/UHF/microwave contesting
|
// Human-friendly labels for VHF/UHF/microwave contesting
|
||||||
return switch (b) {
|
return switch (b) {
|
||||||
@@ -1204,14 +1257,18 @@ public class Kst4ContestApplication extends Application implements StatusUpdateL
|
|||||||
public ObservableValue<String> call(CellDataFeatures<ChatMember, String> cellDataFeatures) {
|
public ObservableValue<String> call(CellDataFeatures<ChatMember, String> cellDataFeatures) {
|
||||||
SimpleStringProperty callsgn = new SimpleStringProperty();
|
SimpleStringProperty callsgn = new SimpleStringProperty();
|
||||||
|
|
||||||
if (cellDataFeatures.getValue().getState() == 1) {
|
ChatMember member = cellDataFeatures.getValue();
|
||||||
callsgn.setValue("(" + cellDataFeatures.getValue().getCallSign() + ")"); //away user
|
String baseCallsign;
|
||||||
} else {
|
|
||||||
|
|
||||||
callsgn.setValue(cellDataFeatures.getValue().getCallSign());
|
if (member.getState() == 1) {
|
||||||
|
baseCallsign = "(" + member.getCallSign() + ")"; //away user
|
||||||
|
} else {
|
||||||
|
baseCallsign = member.getCallSign();
|
||||||
}
|
}
|
||||||
|
|
||||||
// System.out.println(cellDataFeatures.getValue().getCallSign() + " / " + cellDataFeatures.getValue().getState()+ " <<<<<<<<<<<<<<<<<< state ");
|
callsgn.setValue(baseCallsign);
|
||||||
|
|
||||||
|
// System.out.println(member.getCallSign() + " / " + member.getState()+ " <<<<<<<<<<<<<<<<<< state ");
|
||||||
|
|
||||||
return callsgn;
|
return callsgn;
|
||||||
}
|
}
|
||||||
@@ -1656,30 +1713,6 @@ public class Kst4ContestApplication extends Application implements StatusUpdateL
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
|
||||||
* Shows the compact worked/grid status and explains it by tooltip.
|
|
||||||
*/
|
|
||||||
wkdAny_subcol.setCellFactory(column -> new TableCell<ChatMember, String>() {
|
|
||||||
@Override
|
|
||||||
protected void updateItem(String item, boolean empty) {
|
|
||||||
super.updateItem(item, empty);
|
|
||||||
|
|
||||||
if (empty) {
|
|
||||||
setText(null);
|
|
||||||
setTooltip(null);
|
|
||||||
setStyle("");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ChatMember member = getTableRow() == null ? null : getTableRow().getItem();
|
|
||||||
|
|
||||||
setText(item);
|
|
||||||
setTooltip(new Tooltip(buildWorkedAnyGridStatusTooltip(member)));
|
|
||||||
setAlignment(Pos.CENTER);
|
|
||||||
setStyle("-fx-font-weight: bold;");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
TableColumn<ChatMember, String> vhfCol_subcol = new TableColumn<ChatMember, String>("144");
|
TableColumn<ChatMember, String> vhfCol_subcol = new TableColumn<ChatMember, String>("144");
|
||||||
vhfCol_subcol
|
vhfCol_subcol
|
||||||
@@ -1691,6 +1724,8 @@ public class Kst4ContestApplication extends Application implements StatusUpdateL
|
|||||||
|
|
||||||
if (cellDataFeatures.getValue().isWorked144()) {
|
if (cellDataFeatures.getValue().isWorked144()) {
|
||||||
wkd.setValue("X");
|
wkd.setValue("X");
|
||||||
|
} else if (isBandOfferForMainView(cellDataFeatures.getValue(), Band.B_144)) {
|
||||||
|
wkd.setValue("B+");
|
||||||
} else {
|
} else {
|
||||||
wkd.setValue("");
|
wkd.setValue("");
|
||||||
}
|
}
|
||||||
@@ -1710,6 +1745,8 @@ public class Kst4ContestApplication extends Application implements StatusUpdateL
|
|||||||
|
|
||||||
if (cellDataFeatures.getValue().isWorked432()) {
|
if (cellDataFeatures.getValue().isWorked432()) {
|
||||||
wkd.setValue("X");
|
wkd.setValue("X");
|
||||||
|
} else if (isBandOfferForMainView(cellDataFeatures.getValue(), Band.B_432)) {
|
||||||
|
wkd.setValue("B+");
|
||||||
} else {
|
} else {
|
||||||
wkd.setValue("");
|
wkd.setValue("");
|
||||||
}
|
}
|
||||||
@@ -1729,6 +1766,8 @@ public class Kst4ContestApplication extends Application implements StatusUpdateL
|
|||||||
|
|
||||||
if (cellDataFeatures.getValue().isWorked1240()) {
|
if (cellDataFeatures.getValue().isWorked1240()) {
|
||||||
wkd.setValue("X");
|
wkd.setValue("X");
|
||||||
|
} else if (isBandOfferForMainView(cellDataFeatures.getValue(), Band.B_1296)) {
|
||||||
|
wkd.setValue("B+");
|
||||||
} else {
|
} else {
|
||||||
wkd.setValue("");
|
wkd.setValue("");
|
||||||
}
|
}
|
||||||
@@ -1747,6 +1786,8 @@ public class Kst4ContestApplication extends Application implements StatusUpdateL
|
|||||||
|
|
||||||
if (cellDataFeatures.getValue().isWorked2300()) {
|
if (cellDataFeatures.getValue().isWorked2300()) {
|
||||||
wkd.setValue("X");
|
wkd.setValue("X");
|
||||||
|
} else if (isBandOfferForMainView(cellDataFeatures.getValue(), Band.B_2320)) {
|
||||||
|
wkd.setValue("B+");
|
||||||
} else {
|
} else {
|
||||||
wkd.setValue("");
|
wkd.setValue("");
|
||||||
}
|
}
|
||||||
@@ -1765,6 +1806,8 @@ public class Kst4ContestApplication extends Application implements StatusUpdateL
|
|||||||
|
|
||||||
if (cellDataFeatures.getValue().isWorked3400()) {
|
if (cellDataFeatures.getValue().isWorked3400()) {
|
||||||
wkd.setValue("X");
|
wkd.setValue("X");
|
||||||
|
} else if (isBandOfferForMainView(cellDataFeatures.getValue(), Band.B_3400)) {
|
||||||
|
wkd.setValue("B+");
|
||||||
} else {
|
} else {
|
||||||
wkd.setValue("");
|
wkd.setValue("");
|
||||||
}
|
}
|
||||||
@@ -1783,6 +1826,8 @@ public class Kst4ContestApplication extends Application implements StatusUpdateL
|
|||||||
|
|
||||||
if (cellDataFeatures.getValue().isWorked5600()) {
|
if (cellDataFeatures.getValue().isWorked5600()) {
|
||||||
wkd.setValue("X");
|
wkd.setValue("X");
|
||||||
|
} else if (isBandOfferForMainView(cellDataFeatures.getValue(), Band.B_5760)) {
|
||||||
|
wkd.setValue("B+");
|
||||||
} else {
|
} else {
|
||||||
wkd.setValue("");
|
wkd.setValue("");
|
||||||
}
|
}
|
||||||
@@ -1801,6 +1846,8 @@ public class Kst4ContestApplication extends Application implements StatusUpdateL
|
|||||||
|
|
||||||
if (cellDataFeatures.getValue().isWorked10G()) {
|
if (cellDataFeatures.getValue().isWorked10G()) {
|
||||||
wkd.setValue("X");
|
wkd.setValue("X");
|
||||||
|
} else if (isBandOfferForMainView(cellDataFeatures.getValue(), Band.B_10G)) {
|
||||||
|
wkd.setValue("B+");
|
||||||
} else {
|
} else {
|
||||||
wkd.setValue("");
|
wkd.setValue("");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ public record MapCallsignRawSnapshot(
|
|||||||
double longitudeDeg,
|
double longitudeDeg,
|
||||||
String bandSummary,
|
String bandSummary,
|
||||||
Map<String, String> lastKnownFrequenciesByBand,
|
Map<String, String> lastKnownFrequenciesByBand,
|
||||||
|
boolean offersSelectedBand,
|
||||||
boolean warningToMyDirection,
|
boolean warningToMyDirection,
|
||||||
boolean worked,
|
boolean worked,
|
||||||
boolean selected,
|
boolean selected,
|
||||||
@@ -59,9 +60,10 @@ public record MapCallsignRawSnapshot(
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String markerLabel() {
|
public String markerLabel() {
|
||||||
return bandSummary.isBlank()
|
String baseLabel = bandSummary.isBlank()
|
||||||
? displayCallSign
|
? displayCallSign
|
||||||
: displayCallSign + " (" + bandSummary + ")";
|
: displayCallSign + " (" + bandSummary + ")";
|
||||||
|
return offersSelectedBand ? baseLabel + " B+" : baseLabel;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String detailFrequencyText() {
|
public String detailFrequencyText() {
|
||||||
|
|||||||
@@ -8,11 +8,13 @@ import kst4contest.model.ChatMember;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
|
import java.util.EnumSet;
|
||||||
import java.util.EnumMap;
|
import java.util.EnumMap;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Builds immutable map snapshots from the currently visible chat members.
|
* Builds immutable map snapshots from the currently visible chat members.
|
||||||
@@ -22,8 +24,11 @@ import java.util.Map;
|
|||||||
*/
|
*/
|
||||||
public final class MapCallsignRawSnapshotBuilder {
|
public final class MapCallsignRawSnapshotBuilder {
|
||||||
|
|
||||||
|
private static final Pattern TOKEN_SPLIT_PATTERN = Pattern.compile("[^A-Z0-9]+");
|
||||||
|
|
||||||
public List<MapCallsignRawSnapshot> buildSnapshots(Collection<ChatMember> visibleChatMembers,
|
public List<MapCallsignRawSnapshot> buildSnapshots(Collection<ChatMember> visibleChatMembers,
|
||||||
ChatMember selectedChatMember) {
|
ChatMember selectedChatMember,
|
||||||
|
EnumSet<Band> selectedBands) {
|
||||||
|
|
||||||
if (visibleChatMembers == null || visibleChatMembers.isEmpty()) {
|
if (visibleChatMembers == null || visibleChatMembers.isEmpty()) {
|
||||||
return List.of();
|
return List.of();
|
||||||
@@ -69,7 +74,9 @@ public final class MapCallsignRawSnapshotBuilder {
|
|||||||
Location location = new Location(locator6);
|
Location location = new Location(locator6);
|
||||||
|
|
||||||
LinkedHashMap<String, String> frequenciesByBand = collectLastKnownFrequenciesByBand(variants);
|
LinkedHashMap<String, String> frequenciesByBand = collectLastKnownFrequenciesByBand(variants);
|
||||||
String bandSummary = String.join(", ", frequenciesByBand.keySet());
|
EnumSet<Band> sureBands = collectSureBands(variants, frequenciesByBand);
|
||||||
|
String bandSummary = buildBandSummary(sureBands);
|
||||||
|
boolean offersSelectedBand = hasAnySelectedBand(sureBands, selectedBands);
|
||||||
|
|
||||||
boolean warningToMyDirection = variants.stream().anyMatch(ChatMember::isInAngleAndRange);
|
boolean warningToMyDirection = variants.stream().anyMatch(ChatMember::isInAngleAndRange);
|
||||||
boolean worked = variants.stream().anyMatch(this::isWorkedAtAnyBand);
|
boolean worked = variants.stream().anyMatch(this::isWorkedAtAnyBand);
|
||||||
@@ -92,6 +99,7 @@ public final class MapCallsignRawSnapshotBuilder {
|
|||||||
location.getLongitude().toDegrees(),
|
location.getLongitude().toDegrees(),
|
||||||
bandSummary,
|
bandSummary,
|
||||||
frequenciesByBand,
|
frequenciesByBand,
|
||||||
|
offersSelectedBand,
|
||||||
warningToMyDirection,
|
warningToMyDirection,
|
||||||
worked,
|
worked,
|
||||||
selected,
|
selected,
|
||||||
@@ -182,6 +190,101 @@ public final class MapCallsignRawSnapshotBuilder {
|
|||||||
return ordered;
|
return ordered;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private EnumSet<Band> collectSureBands(List<ChatMember> variants,
|
||||||
|
LinkedHashMap<String, String> frequenciesByBand) {
|
||||||
|
EnumSet<Band> sureBands = EnumSet.noneOf(Band.class);
|
||||||
|
|
||||||
|
if (frequenciesByBand != null) {
|
||||||
|
for (String label : frequenciesByBand.keySet()) {
|
||||||
|
Band mappedBand = bandFromDisplayLabel(label);
|
||||||
|
if (mappedBand != null) {
|
||||||
|
sureBands.add(mappedBand);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (ChatMember variant : variants) {
|
||||||
|
if (variant == null || variant.getName() == null || variant.getName().isBlank()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
sureBands.addAll(detectBandsFromStationName(variant.getName()));
|
||||||
|
}
|
||||||
|
|
||||||
|
return sureBands;
|
||||||
|
}
|
||||||
|
|
||||||
|
private EnumSet<Band> detectBandsFromStationName(String stationName) {
|
||||||
|
EnumSet<Band> detectedBands = EnumSet.noneOf(Band.class);
|
||||||
|
if (stationName == null || stationName.isBlank()) {
|
||||||
|
return detectedBands;
|
||||||
|
}
|
||||||
|
|
||||||
|
String normalized = stationName.toUpperCase(Locale.ROOT);
|
||||||
|
String[] tokens = TOKEN_SPLIT_PATTERN.split(normalized);
|
||||||
|
for (String token : tokens) {
|
||||||
|
if (token == null || token.isBlank()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (token) {
|
||||||
|
case "2", "2M", "144", "144MHZ" -> detectedBands.add(Band.B_144);
|
||||||
|
case "70", "70CM", "432", "432MHZ" -> detectedBands.add(Band.B_432);
|
||||||
|
case "23", "23CM", "1296", "1296MHZ" -> detectedBands.add(Band.B_1296);
|
||||||
|
case "13", "13CM", "2300", "2320", "2320MHZ" -> detectedBands.add(Band.B_2320);
|
||||||
|
case "9", "9CM", "3400", "3400MHZ" -> detectedBands.add(Band.B_3400);
|
||||||
|
case "6", "6CM", "5600", "5760", "5760MHZ" -> detectedBands.add(Band.B_5760);
|
||||||
|
case "3", "3CM", "10G", "10GHZ", "10368", "10368MHZ" -> detectedBands.add(Band.B_10G);
|
||||||
|
case "24G", "24GHZ", "24048", "24048MHZ" -> detectedBands.add(Band.B_24G);
|
||||||
|
default -> {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return detectedBands;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String buildBandSummary(EnumSet<Band> sureBands) {
|
||||||
|
if (sureBands == null || sureBands.isEmpty()) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
List<String> labels = sureBands.stream()
|
||||||
|
.sorted()
|
||||||
|
.map(this::toBandDisplayLabel)
|
||||||
|
.toList();
|
||||||
|
return String.join(", ", labels);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean hasAnySelectedBand(EnumSet<Band> sureBands, EnumSet<Band> selectedBands) {
|
||||||
|
if (sureBands == null || sureBands.isEmpty() || selectedBands == null || selectedBands.isEmpty()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (Band band : selectedBands) {
|
||||||
|
if (sureBands.contains(band)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Band bandFromDisplayLabel(String label) {
|
||||||
|
if (label == null || label.isBlank()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return switch (label) {
|
||||||
|
case "144" -> Band.B_144;
|
||||||
|
case "432" -> Band.B_432;
|
||||||
|
case "1296" -> Band.B_1296;
|
||||||
|
case "2320" -> Band.B_2320;
|
||||||
|
case "3400" -> Band.B_3400;
|
||||||
|
case "5760" -> Band.B_5760;
|
||||||
|
case "10368" -> Band.B_10G;
|
||||||
|
case "24048" -> Band.B_24G;
|
||||||
|
default -> null;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fallback for stations where the current displayed QRG exists but the
|
* Fallback for stations where the current displayed QRG exists but the
|
||||||
* knownActiveBands history has not yet been filled.
|
* knownActiveBands history has not yet been filled.
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import kst4contest.model.ChatPreferences;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
|
import java.util.EnumSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
@@ -142,8 +143,13 @@ public final class StationMapBridge {
|
|||||||
private void refreshNow() {
|
private void refreshNow() {
|
||||||
List<ChatMember> visibleChatMembers = new ArrayList<>(chatController.getLst_chatMemberSortedFilteredList());
|
List<ChatMember> visibleChatMembers = new ArrayList<>(chatController.getLst_chatMemberSortedFilteredList());
|
||||||
ChatMember selectedChatMember = chatController.getScoreService().getSelectedChatMember();
|
ChatMember selectedChatMember = chatController.getScoreService().getSelectedChatMember();
|
||||||
|
EnumSet<Band> selectedBands = chatController.getReachabilityService().getEnabledStationBands();
|
||||||
|
|
||||||
List<MapCallsignRawSnapshot> snapshots = snapshotBuilder.buildSnapshots(visibleChatMembers, selectedChatMember);
|
List<MapCallsignRawSnapshot> snapshots = snapshotBuilder.buildSnapshots(
|
||||||
|
visibleChatMembers,
|
||||||
|
selectedChatMember,
|
||||||
|
selectedBands
|
||||||
|
);
|
||||||
|
|
||||||
MapCallsignRawSnapshot selectedSnapshot = null;
|
MapCallsignRawSnapshot selectedSnapshot = null;
|
||||||
if (selectedChatMember != null && selectedChatMember.getCallSignRaw() != null) {
|
if (selectedChatMember != null && selectedChatMember.getCallSignRaw() != null) {
|
||||||
|
|||||||
@@ -855,7 +855,11 @@ public final class StationMapView {
|
|||||||
detailLocatorValue.setText(selectedSnapshot.locator6());
|
detailLocatorValue.setText(selectedSnapshot.locator6());
|
||||||
detailQrbValue.setText(String.format(Locale.US, "%.0f km", selectedSnapshot.qrbKm()));
|
detailQrbValue.setText(String.format(Locale.US, "%.0f km", selectedSnapshot.qrbKm()));
|
||||||
detailQtfValue.setText(String.format(Locale.US, "%.0f°", selectedSnapshot.qtfDeg()));
|
detailQtfValue.setText(String.format(Locale.US, "%.0f°", selectedSnapshot.qtfDeg()));
|
||||||
detailBandsValue.setText(selectedSnapshot.bandSummary().isBlank() ? "-" : selectedSnapshot.bandSummary());
|
String bandText = selectedSnapshot.bandSummary().isBlank() ? "-" : selectedSnapshot.bandSummary();
|
||||||
|
if (selectedSnapshot.offersSelectedBand()) {
|
||||||
|
bandText += " B+";
|
||||||
|
}
|
||||||
|
detailBandsValue.setText(bandText);
|
||||||
detailFrequenciesArea.setText(selectedSnapshot.detailFrequencyText());
|
detailFrequenciesArea.setText(selectedSnapshot.detailFrequencyText());
|
||||||
detailAirplanesValue.setText(String.valueOf(selectedSnapshot.reachableAirplanes()));
|
detailAirplanesValue.setText(String.valueOf(selectedSnapshot.reachableAirplanes()));
|
||||||
triggerClusterSpotButton.setDisable(false);
|
triggerClusterSpotButton.setDisable(false);
|
||||||
|
|||||||
@@ -0,0 +1,56 @@
|
|||||||
|
package kst4contest.test;
|
||||||
|
|
||||||
|
import kst4contest.model.Band;
|
||||||
|
import kst4contest.model.ChatMember;
|
||||||
|
import kst4contest.view.map.MapCallsignRawSnapshot;
|
||||||
|
import kst4contest.view.map.MapCallsignRawSnapshotBuilder;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.util.EnumSet;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
|
class MapCallsignRawSnapshotBuilderTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void marksSnapshotWhenNameAdvertisesSelectedBand() {
|
||||||
|
ChatMember station = buildStation("DL1ABC", "QRV 2-70-23", "JN58TD", 1_000L);
|
||||||
|
|
||||||
|
MapCallsignRawSnapshotBuilder builder = new MapCallsignRawSnapshotBuilder();
|
||||||
|
List<MapCallsignRawSnapshot> snapshots = builder.buildSnapshots(
|
||||||
|
List.of(station),
|
||||||
|
null,
|
||||||
|
EnumSet.of(Band.B_1296)
|
||||||
|
);
|
||||||
|
|
||||||
|
assertEquals(1, snapshots.size());
|
||||||
|
assertTrue(snapshots.get(0).offersSelectedBand());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void keepsSnapshotUnmarkedWhenNoSelectedBandMatches() {
|
||||||
|
ChatMember station = buildStation("DL1ABC", "QRV 2m only", "JN58TD", 1_000L);
|
||||||
|
|
||||||
|
MapCallsignRawSnapshotBuilder builder = new MapCallsignRawSnapshotBuilder();
|
||||||
|
List<MapCallsignRawSnapshot> snapshots = builder.buildSnapshots(
|
||||||
|
List.of(station),
|
||||||
|
null,
|
||||||
|
EnumSet.of(Band.B_2320)
|
||||||
|
);
|
||||||
|
|
||||||
|
assertEquals(1, snapshots.size());
|
||||||
|
assertFalse(snapshots.get(0).offersSelectedBand());
|
||||||
|
}
|
||||||
|
|
||||||
|
private ChatMember buildStation(String callSign, String name, String locator, long activityEpoch) {
|
||||||
|
ChatMember chatMember = new ChatMember();
|
||||||
|
chatMember.setCallSign(callSign);
|
||||||
|
chatMember.setName(name);
|
||||||
|
chatMember.setQra(locator);
|
||||||
|
chatMember.setActivityTimeLastInEpoch(activityEpoch);
|
||||||
|
return chatMember;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="About KST4Contest">
|
<meta name="twitter:title" content="About KST4Contest">
|
||||||
<meta name="twitter:description" content="About KST4Contest and its contest-oriented ON4KST workflow.">
|
<meta name="twitter:description" content="About KST4Contest and its contest-oriented ON4KST workflow.">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
@@ -415,6 +415,18 @@ a:hover {
|
|||||||
color: var(--muted);
|
color: var(--muted);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.roadmap-version + .roadmap-version {
|
||||||
|
margin-top: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.roadmap-version ul {
|
||||||
|
padding-left: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.roadmap-version li {
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
.roadmap-done a {
|
.roadmap-done a {
|
||||||
color: var(--muted);
|
color: var(--muted);
|
||||||
text-decoration: line-through;
|
text-decoration: line-through;
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="Contact | KST4Contest">
|
<meta name="twitter:title" content="Contact | KST4Contest">
|
||||||
<meta name="twitter:description" content="Contact options for KST4Contest.">
|
<meta name="twitter:description" content="Contact options for KST4Contest.">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="Download KST4Contest">
|
<meta name="twitter:title" content="Download KST4Contest">
|
||||||
<meta name="twitter:description" content="Download KST4Contest releases for Windows, Linux and macOS.">
|
<meta name="twitter:description" content="Download KST4Contest releases for Windows, Linux and macOS.">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
@@ -95,7 +95,7 @@
|
|||||||
<p><strong>ZIP x64</strong></p>
|
<p><strong>ZIP x64</strong></p>
|
||||||
<p>Best choice for most Windows users.</p>
|
<p>Best choice for most Windows users.</p>
|
||||||
|
|
||||||
<a class="button secondary" href="https://github.com/praktimarc/kst4contest/releases/download/v1.41.0/praktiKST-v1.41.0-windows-x64.zip">Download →</a>
|
<a class="button secondary" href="https://github.com/praktimarc/kst4contest/releases/download/v1.41.1/praktiKST-v1.41.1-windows-x64.zip">Download →</a>
|
||||||
</article>
|
</article>
|
||||||
|
|
||||||
<article class="card download-card">
|
<article class="card download-card">
|
||||||
@@ -109,7 +109,7 @@
|
|||||||
<p><strong>Flatpak (.flatpakref)</strong></p>
|
<p><strong>Flatpak (.flatpakref)</strong></p>
|
||||||
<p>Recommended for most Linux users. Open the file with GNOME Software / Discover, or run: flatpak install de.x08.KST4Contest.flatpakref</p>
|
<p>Recommended for most Linux users. Open the file with GNOME Software / Discover, or run: flatpak install de.x08.KST4Contest.flatpakref</p>
|
||||||
|
|
||||||
<a class="button secondary" href="https://github.com/praktimarc/kst4contest/releases/download/v1.41.0/de.x08.KST4Contest.flatpakref">Download →</a>
|
<a class="button secondary" href="https://github.com/praktimarc/kst4contest/releases/download/v1.41.1/de.x08.KST4Contest.flatpakref">Download →</a>
|
||||||
</article>
|
</article>
|
||||||
|
|
||||||
<article class="card download-card">
|
<article class="card download-card">
|
||||||
@@ -121,7 +121,7 @@
|
|||||||
<p><strong>AppImage x86_64</strong></p>
|
<p><strong>AppImage x86_64</strong></p>
|
||||||
<p>Portable Linux build without package installation.</p>
|
<p>Portable Linux build without package installation.</p>
|
||||||
|
|
||||||
<a class="button secondary" href="https://github.com/praktimarc/kst4contest/releases/download/v1.41.0/KST4Contest-v1.41.0-linux-x86_64.AppImage">Download →</a>
|
<a class="button secondary" href="https://github.com/praktimarc/kst4contest/releases/download/v1.41.1/KST4Contest-v1.41.1-linux-x86_64.AppImage">Download →</a>
|
||||||
</article>
|
</article>
|
||||||
|
|
||||||
<article class="card download-card">
|
<article class="card download-card">
|
||||||
@@ -133,7 +133,7 @@
|
|||||||
<p><strong>DEB amd64</strong></p>
|
<p><strong>DEB amd64</strong></p>
|
||||||
<p>Native package for Debian and Ubuntu based systems.</p>
|
<p>Native package for Debian and Ubuntu based systems.</p>
|
||||||
|
|
||||||
<a class="button secondary" href="https://github.com/praktimarc/kst4contest/releases/download/v1.41.0/KST4Contest-v1.41.0-debian-amd64.deb">Download →</a>
|
<a class="button secondary" href="https://github.com/praktimarc/kst4contest/releases/download/v1.41.1/KST4Contest-v1.41.1-debian-amd64.deb">Download →</a>
|
||||||
</article>
|
</article>
|
||||||
|
|
||||||
<article class="card download-card">
|
<article class="card download-card">
|
||||||
@@ -145,7 +145,7 @@
|
|||||||
<p><strong>RPM x86_64</strong></p>
|
<p><strong>RPM x86_64</strong></p>
|
||||||
<p>Native package for Fedora/RPM based systems.</p>
|
<p>Native package for Fedora/RPM based systems.</p>
|
||||||
|
|
||||||
<a class="button secondary" href="https://github.com/praktimarc/kst4contest/releases/download/v1.41.0/KST4Contest-v1.41.0-fedora-x86_64.rpm">Download →</a>
|
<a class="button secondary" href="https://github.com/praktimarc/kst4contest/releases/download/v1.41.1/KST4Contest-v1.41.1-fedora-x86_64.rpm">Download →</a>
|
||||||
</article>
|
</article>
|
||||||
|
|
||||||
<article class="card download-card">
|
<article class="card download-card">
|
||||||
@@ -157,7 +157,7 @@
|
|||||||
<p><strong>pkg.tar.zst</strong></p>
|
<p><strong>pkg.tar.zst</strong></p>
|
||||||
<p>Package build for Arch Linux users.</p>
|
<p>Package build for Arch Linux users.</p>
|
||||||
|
|
||||||
<a class="button secondary" href="https://github.com/praktimarc/kst4contest/releases/download/v1.41.0/KST4Contest-v1.41.0-archlinux-x86_64.pkg.tar.zst">Download →</a>
|
<a class="button secondary" href="https://github.com/praktimarc/kst4contest/releases/download/v1.41.1/KST4Contest-v1.41.1-archlinux-x86_64.pkg.tar.zst">Download →</a>
|
||||||
</article>
|
</article>
|
||||||
|
|
||||||
<article class="card download-card">
|
<article class="card download-card">
|
||||||
@@ -169,7 +169,7 @@
|
|||||||
<p><strong>DMG arm64</strong></p>
|
<p><strong>DMG arm64</strong></p>
|
||||||
<p>For Apple Silicon Macs.</p>
|
<p>For Apple Silicon Macs.</p>
|
||||||
|
|
||||||
<a class="button secondary" href="https://github.com/praktimarc/kst4contest/releases/download/v1.41.0/KST4Contest-v1.41.0-macos-arm64.dmg">Download →</a>
|
<a class="button secondary" href="https://github.com/praktimarc/kst4contest/releases/download/v1.41.1/KST4Contest-v1.41.1-macos-arm64.dmg">Download →</a>
|
||||||
</article>
|
</article>
|
||||||
|
|
||||||
<article class="card download-card">
|
<article class="card download-card">
|
||||||
@@ -181,7 +181,7 @@
|
|||||||
<p><strong>DMG x86_64</strong></p>
|
<p><strong>DMG x86_64</strong></p>
|
||||||
<p>For Intel-based Macs.</p>
|
<p>For Intel-based Macs.</p>
|
||||||
|
|
||||||
<a class="button secondary" href="https://github.com/praktimarc/kst4contest/releases/download/v1.41.0/KST4Contest-v1.41.0-macos-x86_64.dmg">Download →</a>
|
<a class="button secondary" href="https://github.com/praktimarc/kst4contest/releases/download/v1.41.1/KST4Contest-v1.41.1-macos-x86_64.dmg">Download →</a>
|
||||||
</article>
|
</article>
|
||||||
|
|
||||||
<article class="card download-card">
|
<article class="card download-card">
|
||||||
@@ -193,7 +193,7 @@
|
|||||||
<p><strong>PDF</strong></p>
|
<p><strong>PDF</strong></p>
|
||||||
<p>English PDF manual.</p>
|
<p>English PDF manual.</p>
|
||||||
|
|
||||||
<a class="button secondary" href="https://github.com/praktimarc/kst4contest/releases/download/v1.41.0/KST4Contest-v1.41.0-manual-en.pdf">Download →</a>
|
<a class="button secondary" href="https://github.com/praktimarc/kst4contest/releases/download/v1.41.1/KST4Contest-v1.41.1-manual-en.pdf">Download →</a>
|
||||||
</article>
|
</article>
|
||||||
|
|
||||||
<article class="card download-card">
|
<article class="card download-card">
|
||||||
@@ -205,7 +205,7 @@
|
|||||||
<p><strong>PDF</strong></p>
|
<p><strong>PDF</strong></p>
|
||||||
<p>German PDF manual.</p>
|
<p>German PDF manual.</p>
|
||||||
|
|
||||||
<a class="button secondary" href="https://github.com/praktimarc/kst4contest/releases/download/v1.41.0/KST4Contest-v1.41.0-manual-de.pdf">Download →</a>
|
<a class="button secondary" href="https://github.com/praktimarc/kst4contest/releases/download/v1.41.1/KST4Contest-v1.41.1-manual-de.pdf">Download →</a>
|
||||||
</article>
|
</article>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="KST4Contest FAQ">
|
<meta name="twitter:title" content="KST4Contest FAQ">
|
||||||
<meta name="twitter:description" content="Frequently asked questions about KST4Contest, ON4KST contest operation, AirScout integration and VHF/UHF/SHF contest workflow.">
|
<meta name="twitter:description" content="Frequently asked questions about KST4Contest, ON4KST contest operation, AirScout integration and VHF/UHF/SHF contest workflow.">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="AirScout Integration">
|
<meta name="twitter:title" content="AirScout Integration">
|
||||||
<meta name="twitter:description" content="AirScout information helps operators evaluate AP windows, aircraft scatter timing and candidate stations during VHF/UHF/SHF contests.">
|
<meta name="twitter:description" content="AirScout information helps operators evaluate AP windows, aircraft scatter timing and candidate stations during VHF/UHF/SHF contests.">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="Dual Chat Categories">
|
<meta name="twitter:title" content="Dual Chat Categories">
|
||||||
<meta name="twitter:description" content="Dual category support gives contest operators better overview when working across multiple ON4KST chat rooms.">
|
<meta name="twitter:description" content="Dual category support gives contest operators better overview when working across multiple ON4KST chat rooms.">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="DXCluster Server">
|
<meta name="twitter:title" content="DXCluster Server">
|
||||||
<meta name="twitter:description" content="KST4Contest includes DXCluster functionality to support situational awareness during contest operation.">
|
<meta name="twitter:description" content="KST4Contest includes DXCluster functionality to support situational awareness during contest operation.">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="KST4Contest Features">
|
<meta name="twitter:title" content="KST4Contest Features">
|
||||||
<meta name="twitter:description" content="Contest-optimized ON4KST features for VHF, UHF and SHF operation.">
|
<meta name="twitter:description" content="Contest-optimized ON4KST features for VHF, UHF and SHF operation.">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="Log Synchronization">
|
<meta name="twitter:title" content="Log Synchronization">
|
||||||
<meta name="twitter:description" content="Log synchronization helps KST4Contest understand worked stations, active bands and contest context.">
|
<meta name="twitter:description" content="Log synchronization helps KST4Contest understand worked stations, active bands and contest context.">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="Macros and Variables">
|
<meta name="twitter:title" content="Macros and Variables">
|
||||||
<meta name="twitter:description" content="Macros reduce repetitive typing and help operators respond quickly during active ON4KST contest sessions.">
|
<meta name="twitter:description" content="Macros reduce repetitive typing and help operators respond quickly during active ON4KST contest sessions.">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="Priority Score System">
|
<meta name="twitter:title" content="Priority Score System">
|
||||||
<meta name="twitter:description" content="KST4Contest ranks stations by activity, direction, sked context, band information, QRG hints and operator workflow signals.">
|
<meta name="twitter:description" content="KST4Contest ranks stations by activity, direction, sked context, band information, QRG hints and operator workflow signals.">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="Sked Reminder">
|
<meta name="twitter:title" content="Sked Reminder">
|
||||||
<meta name="twitter:description" content="KST4Contest keeps skeds in focus while the operator handles chat traffic, logging, bands and aircraft scatter timing.">
|
<meta name="twitter:description" content="KST4Contest keeps skeds in focus while the operator handles chat traffic, logging, bands and aircraft scatter timing.">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="Timeline View">
|
<meta name="twitter:title" content="Timeline View">
|
||||||
<meta name="twitter:description" content="The timeline view helps operators understand short propagation windows and candidate timing during active contest operation.">
|
<meta name="twitter:description" content="The timeline view helps operators understand short propagation windows and candidate timing during active contest operation.">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
@@ -7,6 +7,14 @@
|
|||||||
<language>en</language>
|
<language>en</language>
|
||||||
|
|
||||||
|
|
||||||
|
<item>
|
||||||
|
<title>Hotfix Version 1.41.1</title>
|
||||||
|
<link>https://kst4contest.hamradioonline.de/news/2026-07-08-hotfix-version-1-41-1/</link>
|
||||||
|
<guid>https://kst4contest.hamradioonline.de/news/2026-07-08-hotfix-version-1-41-1/</guid>
|
||||||
|
<pubDate>Wed, 08 Jul 2026 00:00:00 GMT</pubDate>
|
||||||
|
<description>Hotfix of a bug in Version 1.41</description>
|
||||||
|
</item>
|
||||||
|
|
||||||
<item>
|
<item>
|
||||||
<title>KST4Contest Website Launch</title>
|
<title>KST4Contest Website Launch</title>
|
||||||
<link>https://kst4contest.hamradioonline.de/news/2026-07-website-launch/</link>
|
<link>https://kst4contest.hamradioonline.de/news/2026-07-website-launch/</link>
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="KST4Contest – Contest-Optimized ON4KST Chat Client">
|
<meta name="twitter:title" content="KST4Contest – Contest-Optimized ON4KST Chat Client">
|
||||||
<meta name="twitter:description" content="KST4Contest is a modern ON4KST chat client built for VHF, UHF and SHF contest operation.">
|
<meta name="twitter:description" content="KST4Contest is a modern ON4KST chat client built for VHF, UHF and SHF contest operation.">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="Legal Notice | KST4Contest">
|
<meta name="twitter:title" content="Legal Notice | KST4Contest">
|
||||||
<meta name="twitter:description" content="Legal notice for the KST4Contest website.">
|
<meta name="twitter:description" content="Legal notice for the KST4Contest website.">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
||||||
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
||||||
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
||||||
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
||||||
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
||||||
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
||||||
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="KST4Contest Deutsches Handbuch">
|
<meta name="twitter:title" content="KST4Contest Deutsches Handbuch">
|
||||||
<meta name="twitter:description" content="Deutsches Benutzerhandbuch für KST4Contest.">
|
<meta name="twitter:description" content="Deutsches Benutzerhandbuch für KST4Contest.">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
||||||
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
||||||
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
||||||
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
||||||
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
||||||
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
||||||
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
||||||
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
||||||
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
||||||
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
||||||
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="KST4Contest English Manual">
|
<meta name="twitter:title" content="KST4Contest English Manual">
|
||||||
<meta name="twitter:description" content="English user manual for KST4Contest.">
|
<meta name="twitter:description" content="English user manual for KST4Contest.">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
||||||
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
||||||
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
||||||
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
<meta name="twitter:title" content="{{ manual.title }} | KST4Contest Manual">
|
||||||
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
<meta name="twitter:description" content="KST4Contest manual page: {{ manual.title }}">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="KST4Contest Manual">
|
<meta name="twitter:title" content="KST4Contest Manual">
|
||||||
<meta name="twitter:description" content="Online manual for KST4Contest, the contest-optimized ON4KST chat client.">
|
<meta name="twitter:description" content="Online manual for KST4Contest, the contest-optimized ON4KST chat client.">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
@@ -0,0 +1,111 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>Hotfix Version 1.41.1</title>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<meta name="description" content="KST4Contest is a contest-optimized ON4KST chat client for VHF, UHF and SHF ham radio contests.">
|
||||||
|
<link rel="canonical" href="https://kst4contest.hamradioonline.de/news/2026-07-08-hotfix-version-1-41-1/">
|
||||||
|
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:title" content="Hotfix Version 1.41.1">
|
||||||
|
<meta property="og:description" content="Contest-optimized ON4KST chat client for VHF, UHF and SHF ham radio contests.">
|
||||||
|
<meta property="og:url" content="https://kst4contest.hamradioonline.de/news/2026-07-08-hotfix-version-1-41-1/">
|
||||||
|
<meta property="og:site_name" content="KST4Contest">
|
||||||
|
|
||||||
|
<meta name="twitter:card" content="summary_large_image">
|
||||||
|
<meta name="twitter:title" content="Hotfix Version 1.41.1">
|
||||||
|
<meta name="twitter:description" content="Contest-optimized ON4KST chat client for VHF, UHF and SHF ham radio contests.">
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
<meta property="og:image:width" content="1200">
|
||||||
|
<meta property="og:image:height" content="630">
|
||||||
|
<meta name="twitter:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div class="site-bg"></div>
|
||||||
|
|
||||||
|
<header class="site-header">
|
||||||
|
<a class="brand" href="/">
|
||||||
|
<span class="brand-mark">◎</span>
|
||||||
|
<span>
|
||||||
|
<strong>KST4Contest</strong>
|
||||||
|
<small>ON4KST Contest Client</small>
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<nav class="site-nav">
|
||||||
|
|
||||||
|
<a href="/">Home</a>
|
||||||
|
|
||||||
|
<a href="/features/">Features</a>
|
||||||
|
|
||||||
|
<a href="/screenshots/">Screenshots</a>
|
||||||
|
|
||||||
|
<a href="/manual/">Manual</a>
|
||||||
|
|
||||||
|
<a href="/news/">News</a>
|
||||||
|
|
||||||
|
<a href="/roadmap/">Roadmap</a>
|
||||||
|
|
||||||
|
<a href="/about/">About</a>
|
||||||
|
|
||||||
|
<a href="/faq/">FAQ</a>
|
||||||
|
|
||||||
|
<a class="nav-cta" href="/download/">Download</a>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<main>
|
||||||
|
|
||||||
|
<section class="hero">
|
||||||
|
<p class="badge">News · July 8, 2026</p>
|
||||||
|
<h1>Hotfix Version 1.41.1</h1>
|
||||||
|
<p class="lead">Hotfix of a bug in Version 1.41</p>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="section narrow">
|
||||||
|
<article class="card content-card">
|
||||||
|
<h2>Version 1.41.1</h2>
|
||||||
|
<p>We had a bug, where KST4Contest would clear out the text field, where you would send your messages after a period. It also happend to set your Cursor back to the Sending Field, when you were filtering for a station. We fixed this bug today. The new release is <a href="https://github.com/praktimarc/kst4contest/releases/tag/v1.41.1">here</a>. You can also download the artifacts as always via the <a href="/download/">Downloads-Page</a>.</p>
|
||||||
|
|
||||||
|
</article>
|
||||||
|
</section>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<footer class="site-footer">
|
||||||
|
<div class="footer-grid">
|
||||||
|
<div>
|
||||||
|
<strong>KST4Contest</strong>
|
||||||
|
<p>Contest-optimized ON4KST workflow for VHF/UHF/SHF operators.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<strong>Project</strong>
|
||||||
|
<p><a href="/features/">Features</a></p>
|
||||||
|
<p><a href="/download/">Download</a></p>
|
||||||
|
<p><a href="/manual/">Manual</a></p>
|
||||||
|
<p><a href="/roadmap/">Roadmap</a></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<strong>Community</strong>
|
||||||
|
<p><a href="https://github.com/praktimarc/kst4contest">GitHub Repository</a></p>
|
||||||
|
<p><a href="https://github.com/praktimarc/kst4contest/issues">Issues</a></p>
|
||||||
|
<p><a href="/contact/">Contact</a></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<strong>Legal</strong>
|
||||||
|
<p><a href="/legal-notice/">Legal Notice</a></p>
|
||||||
|
<p><a href="/privacy/">Privacy Policy</a></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="KST4Contest Website Launch">
|
<meta name="twitter:title" content="KST4Contest Website Launch">
|
||||||
<meta name="twitter:description" content="Contest-optimized ON4KST chat client for VHF, UHF and SHF ham radio contests.">
|
<meta name="twitter:description" content="Contest-optimized ON4KST chat client for VHF, UHF and SHF ham radio contests.">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="KST4Contest News">
|
<meta name="twitter:title" content="KST4Contest News">
|
||||||
<meta name="twitter:description" content="News, release updates and development notes for KST4Contest.">
|
<meta name="twitter:description" content="News, release updates and development notes for KST4Contest.">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
@@ -74,6 +74,13 @@
|
|||||||
<section class="section">
|
<section class="section">
|
||||||
<div class="grid">
|
<div class="grid">
|
||||||
|
|
||||||
|
<article class="card">
|
||||||
|
<p class="eyebrow">July 8, 2026</p>
|
||||||
|
<h3><a href="/news/2026-07-08-hotfix-version-1-41-1/">Hotfix Version 1.41.1</a></h3>
|
||||||
|
<p>Hotfix of a bug in Version 1.41</p>
|
||||||
|
<a href="/news/2026-07-08-hotfix-version-1-41-1/">Read more →</a>
|
||||||
|
</article>
|
||||||
|
|
||||||
<article class="card">
|
<article class="card">
|
||||||
<p class="eyebrow">July 7, 2026</p>
|
<p class="eyebrow">July 7, 2026</p>
|
||||||
<h3><a href="/news/2026-07-website-launch/">KST4Contest Website Launch</a></h3>
|
<h3><a href="/news/2026-07-website-launch/">KST4Contest Website Launch</a></h3>
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="Privacy Policy | KST4Contest">
|
<meta name="twitter:title" content="Privacy Policy | KST4Contest">
|
||||||
<meta name="twitter:description" content="Privacy policy for the KST4Contest website.">
|
<meta name="twitter:description" content="Privacy policy for the KST4Contest website.">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="KST4Contest Roadmap">
|
<meta name="twitter:title" content="KST4Contest Roadmap">
|
||||||
<meta name="twitter:description" content="Planned enhancements for upcoming KST4Contest versions, generated from GitHub milestones and issues.">
|
<meta name="twitter:description" content="Planned enhancements for upcoming KST4Contest versions, generated from GitHub milestones and issues.">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
@@ -77,28 +77,59 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
<article class="card content-card">
|
<article class="card content-card roadmap-version">
|
||||||
|
|
||||||
<h2><a href="https://github.com/praktimarc/kst4contest/milestone/2">v1.42</a></h2>
|
<h2><a href="https://github.com/praktimarc/kst4contest/milestone/2">v1.42</a></h2>
|
||||||
|
|
||||||
|
<p>next Version</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
|
|
||||||
<li>
|
<li>
|
||||||
<a href="https://github.com/praktimarc/kst4contest/issues/22">Displaying where an Station is active.</a>
|
<a href="https://github.com/praktimarc/kst4contest/issues/52">[FEATURE] center horizontal slider</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<a href="https://github.com/praktimarc/kst4contest/issues/49">[FEATURE] QTF degree, manual change</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="roadmap-done">
|
||||||
|
<a href="https://github.com/praktimarc/kst4contest/issues/22">Displaying where an Station is active.</a> ✓
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
</ul>
|
</ul>
|
||||||
</article>
|
</article>
|
||||||
|
|
||||||
<article class="card content-card">
|
<article class="card content-card roadmap-version">
|
||||||
|
|
||||||
|
<h2><a href="https://github.com/praktimarc/kst4contest/milestone/3">v1.50</a></h2>
|
||||||
|
|
||||||
|
<p>Greater Overhaul</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<a href="https://github.com/praktimarc/kst4contest/issues/57">[FEATURE] User Config</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<a href="https://github.com/praktimarc/kst4contest/issues/21">QRB greater than Distance Button in the Userfield</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<a href="https://github.com/praktimarc/kst4contest/issues/20">i18n - Possible Translations?</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</article>
|
||||||
|
|
||||||
|
<article class="card content-card roadmap-version">
|
||||||
|
|
||||||
<h2><a href="https://github.com/praktimarc/kst4contest/milestone/1">v1.41</a></h2>
|
<h2><a href="https://github.com/praktimarc/kst4contest/milestone/1">v1.41</a></h2>
|
||||||
|
|
||||||
<p>next Version 1.41</p>
|
<p>Latest Version</p>
|
||||||
|
|
||||||
<p class="eyebrow">Released July 6, 2026</p>
|
<p class="eyebrow">Released July 5, 2026</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
|
|
||||||
@@ -109,7 +140,7 @@
|
|||||||
</ul>
|
</ul>
|
||||||
</article>
|
</article>
|
||||||
|
|
||||||
<article class="card content-card">
|
<article class="card content-card roadmap-version">
|
||||||
|
|
||||||
<h2>Planned, no version yet</h2>
|
<h2>Planned, no version yet</h2>
|
||||||
|
|
||||||
@@ -121,14 +152,6 @@
|
|||||||
<a href="https://github.com/praktimarc/kst4contest/issues/55">[FEATURE] Reset-Button for the map</a>
|
<a href="https://github.com/praktimarc/kst4contest/issues/55">[FEATURE] Reset-Button for the map</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li>
|
|
||||||
<a href="https://github.com/praktimarc/kst4contest/issues/52">[FEATURE] center horizontal slider</a>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
<li>
|
|
||||||
<a href="https://github.com/praktimarc/kst4contest/issues/49">[FEATURE] QTF degree, manual change</a>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
<li>
|
<li>
|
||||||
<a href="https://github.com/praktimarc/kst4contest/issues/47">[FEATURE] Sked push for UCXLOG</a>
|
<a href="https://github.com/praktimarc/kst4contest/issues/47">[FEATURE] Sked push for UCXLOG</a>
|
||||||
</li>
|
</li>
|
||||||
@@ -137,14 +160,6 @@
|
|||||||
<a href="https://github.com/praktimarc/kst4contest/issues/46">[FEATURE] SO2R Operation</a>
|
<a href="https://github.com/praktimarc/kst4contest/issues/46">[FEATURE] SO2R Operation</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li>
|
|
||||||
<a href="https://github.com/praktimarc/kst4contest/issues/21">QRB greater than Distance Button in the Userfield</a>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
<li>
|
|
||||||
<a href="https://github.com/praktimarc/kst4contest/issues/20">i18n - Possible Translations?</a>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
<li class="roadmap-done">
|
<li class="roadmap-done">
|
||||||
<a href="https://github.com/praktimarc/kst4contest/issues/19">Broadcast Messages (To ALL Station in Contest) in seperate Window</a> (not planned)
|
<a href="https://github.com/praktimarc/kst4contest/issues/19">Broadcast Messages (To ALL Station in Contest) in seperate Window</a> (not planned)
|
||||||
</li>
|
</li>
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<meta name="twitter:title" content="KST4Contest Screenshots">
|
<meta name="twitter:title" content="KST4Contest Screenshots">
|
||||||
<meta name="twitter:description" content="Screenshots of KST4Contest, the contest-optimized ON4KST chat client for VHF, UHF and SHF operators.">
|
<meta name="twitter:description" content="Screenshots of KST4Contest, the contest-optimized ON4KST chat client for VHF, UHF and SHF operators.">
|
||||||
|
|
||||||
<link rel="stylesheet" href="/assets/css/main.css?v=1783539256714">
|
<link rel="stylesheet" href="/assets/css/main.css?v=1783552468141">
|
||||||
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
<link rel="alternate" type="application/rss+xml" title="KST4Contest News" href="/feed.xml">
|
||||||
|
|
||||||
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
<meta property="og:image" content="https://kst4contest.hamradioonline.de/assets/social/kst4contest-og.png">
|
||||||
|
|||||||
+79
-75
@@ -1,95 +1,99 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||||
<url>
|
|
||||||
<loc>https://kst4contest.hamradioonline.de/faq/</loc>
|
|
||||||
<lastmod>2026-07-06</lastmod>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://kst4contest.hamradioonline.de/manual/de/airscout-integration/</loc>
|
|
||||||
<lastmod>2026-07-06</lastmod>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://kst4contest.hamradioonline.de/manual/de/</loc>
|
|
||||||
<lastmod>2026-07-06</lastmod>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://kst4contest.hamradioonline.de/manual/en/</loc>
|
|
||||||
<lastmod>2026-07-06</lastmod>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://kst4contest.hamradioonline.de/manual/</loc>
|
|
||||||
<lastmod>2026-07-06</lastmod>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://kst4contest.hamradioonline.de/features/airscout/</loc>
|
|
||||||
<lastmod>2026-07-06</lastmod>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://kst4contest.hamradioonline.de/features/dual-chat/</loc>
|
|
||||||
<lastmod>2026-07-06</lastmod>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://kst4contest.hamradioonline.de/features/dx-cluster/</loc>
|
|
||||||
<lastmod>2026-07-06</lastmod>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://kst4contest.hamradioonline.de/features/</loc>
|
|
||||||
<lastmod>2026-07-06</lastmod>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://kst4contest.hamradioonline.de/features/log-sync/</loc>
|
|
||||||
<lastmod>2026-07-06</lastmod>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://kst4contest.hamradioonline.de/features/macros/</loc>
|
|
||||||
<lastmod>2026-07-06</lastmod>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://kst4contest.hamradioonline.de/features/priority-score/</loc>
|
|
||||||
<lastmod>2026-07-06</lastmod>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://kst4contest.hamradioonline.de/features/sked-reminder/</loc>
|
|
||||||
<lastmod>2026-07-06</lastmod>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://kst4contest.hamradioonline.de/features/timeline/</loc>
|
|
||||||
<lastmod>2026-07-06</lastmod>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://kst4contest.hamradioonline.de/screenshots/</loc>
|
|
||||||
<lastmod>2026-07-06</lastmod>
|
|
||||||
</url>
|
|
||||||
<url>
|
<url>
|
||||||
<loc>https://kst4contest.hamradioonline.de/news/2026-07-website-launch/</loc>
|
<loc>https://kst4contest.hamradioonline.de/news/2026-07-website-launch/</loc>
|
||||||
<lastmod>2026-07-07</lastmod>
|
<lastmod>2026-07-07</lastmod>
|
||||||
</url>
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://kst4contest.hamradioonline.de/news/2026-07-08-hotfix-version-1-41-1/</loc>
|
||||||
|
<lastmod>2026-07-08</lastmod>
|
||||||
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://kst4contest.hamradioonline.de/about/</loc>
|
<loc>https://kst4contest.hamradioonline.de/about/</loc>
|
||||||
<lastmod>2026-07-07</lastmod>
|
<lastmod>2026-07-08</lastmod>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://kst4contest.hamradioonline.de/contact/</loc>
|
<loc>https://kst4contest.hamradioonline.de/contact/</loc>
|
||||||
<lastmod>2026-07-07</lastmod>
|
<lastmod>2026-07-08</lastmod>
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://kst4contest.hamradioonline.de/legal-notice/</loc>
|
|
||||||
<lastmod>2026-07-07</lastmod>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://kst4contest.hamradioonline.de/privacy/</loc>
|
|
||||||
<lastmod>2026-07-07</lastmod>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://kst4contest.hamradioonline.de/</loc>
|
|
||||||
<lastmod>2026-07-07</lastmod>
|
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://kst4contest.hamradioonline.de/download/</loc>
|
<loc>https://kst4contest.hamradioonline.de/download/</loc>
|
||||||
<lastmod>2026-07-07</lastmod>
|
<lastmod>2026-07-08</lastmod>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://kst4contest.hamradioonline.de/faq/</loc>
|
||||||
|
<lastmod>2026-07-08</lastmod>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://kst4contest.hamradioonline.de/features/airscout/</loc>
|
||||||
|
<lastmod>2026-07-08</lastmod>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://kst4contest.hamradioonline.de/features/dual-chat/</loc>
|
||||||
|
<lastmod>2026-07-08</lastmod>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://kst4contest.hamradioonline.de/features/dx-cluster/</loc>
|
||||||
|
<lastmod>2026-07-08</lastmod>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://kst4contest.hamradioonline.de/features/</loc>
|
||||||
|
<lastmod>2026-07-08</lastmod>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://kst4contest.hamradioonline.de/features/log-sync/</loc>
|
||||||
|
<lastmod>2026-07-08</lastmod>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://kst4contest.hamradioonline.de/features/macros/</loc>
|
||||||
|
<lastmod>2026-07-08</lastmod>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://kst4contest.hamradioonline.de/features/priority-score/</loc>
|
||||||
|
<lastmod>2026-07-08</lastmod>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://kst4contest.hamradioonline.de/features/sked-reminder/</loc>
|
||||||
|
<lastmod>2026-07-08</lastmod>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://kst4contest.hamradioonline.de/features/timeline/</loc>
|
||||||
|
<lastmod>2026-07-08</lastmod>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://kst4contest.hamradioonline.de/</loc>
|
||||||
|
<lastmod>2026-07-08</lastmod>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://kst4contest.hamradioonline.de/legal-notice/</loc>
|
||||||
|
<lastmod>2026-07-08</lastmod>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://kst4contest.hamradioonline.de/manual/de/airscout-integration/</loc>
|
||||||
|
<lastmod>2026-07-08</lastmod>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://kst4contest.hamradioonline.de/manual/de/</loc>
|
||||||
|
<lastmod>2026-07-08</lastmod>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://kst4contest.hamradioonline.de/manual/en/</loc>
|
||||||
|
<lastmod>2026-07-08</lastmod>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://kst4contest.hamradioonline.de/manual/</loc>
|
||||||
|
<lastmod>2026-07-08</lastmod>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://kst4contest.hamradioonline.de/privacy/</loc>
|
||||||
|
<lastmod>2026-07-08</lastmod>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://kst4contest.hamradioonline.de/roadmap/</loc>
|
<loc>https://kst4contest.hamradioonline.de/roadmap/</loc>
|
||||||
<lastmod>2026-07-08</lastmod>
|
<lastmod>2026-07-08</lastmod>
|
||||||
</url>
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://kst4contest.hamradioonline.de/screenshots/</loc>
|
||||||
|
<lastmod>2026-07-08</lastmod>
|
||||||
|
</url>
|
||||||
</urlset>
|
</urlset>
|
||||||
@@ -1,7 +1,33 @@
|
|||||||
const latestTag = "v1.41.0";
|
const REPO = "praktimarc/kst4contest";
|
||||||
const base = `https://github.com/praktimarc/kst4contest/releases/download/${latestTag}`;
|
const API = `https://api.github.com/repos/${REPO}`;
|
||||||
|
const FALLBACK_TAG = "v1.41.1";
|
||||||
|
|
||||||
module.exports = [
|
async function fetchLatestReleaseTag() {
|
||||||
|
const headers = { Accept: "application/vnd.github+json" };
|
||||||
|
if (process.env.GITHUB_TOKEN) {
|
||||||
|
headers.Authorization = `Bearer ${process.env.GITHUB_TOKEN}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const res = await fetch(`${API}/releases/latest`, { headers });
|
||||||
|
if (!res.ok) {
|
||||||
|
throw new Error(`GitHub API /releases/latest failed: ${res.status}`);
|
||||||
|
}
|
||||||
|
const release = await res.json();
|
||||||
|
return release.tag_name || FALLBACK_TAG;
|
||||||
|
} catch (err) {
|
||||||
|
console.warn(`[downloads] Could not load latest release tag, falling back to ${FALLBACK_TAG}: ${err.message}`);
|
||||||
|
return FALLBACK_TAG;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Builds the download list from the latest GitHub release tag so it never
|
||||||
|
// drifts out of sync with what tagged-release.yml actually published.
|
||||||
|
module.exports = async function () {
|
||||||
|
const latestTag = await fetchLatestReleaseTag();
|
||||||
|
const base = `https://github.com/${REPO}/releases/download/${latestTag}`;
|
||||||
|
|
||||||
|
return [
|
||||||
{
|
{
|
||||||
os: "Windows",
|
os: "Windows",
|
||||||
format: "ZIP x64",
|
format: "ZIP x64",
|
||||||
@@ -82,4 +108,5 @@ module.exports = [
|
|||||||
note: "German PDF manual.",
|
note: "German PDF manual.",
|
||||||
url: `${base}/KST4Contest-${latestTag}-manual-de.pdf`
|
url: `${base}/KST4Contest-${latestTag}-manual-de.pdf`
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
};
|
||||||
|
|||||||
@@ -415,6 +415,18 @@ a:hover {
|
|||||||
color: var(--muted);
|
color: var(--muted);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.roadmap-version + .roadmap-version {
|
||||||
|
margin-top: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.roadmap-version ul {
|
||||||
|
padding-left: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.roadmap-version li {
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
.roadmap-done a {
|
.roadmap-done a {
|
||||||
color: var(--muted);
|
color: var(--muted);
|
||||||
text-decoration: line-through;
|
text-decoration: line-through;
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
title: Hotfix Version 1.41.1
|
||||||
|
summary: Hotfix of a bug in Version 1.41
|
||||||
|
date: 2026-07-08
|
||||||
|
---
|
||||||
|
|
||||||
|
## Version 1.41.1
|
||||||
|
We had a bug, where KST4Contest would clear out the text field, where you would send your messages after a period. It also happend to set your Cursor back to the Sending Field, when you were filtering for a station. We fixed this bug today. The new release is [here](https://github.com/praktimarc/kst4contest/releases/tag/v1.41.1). You can also download the artifacts as always via the [Downloads-Page](/download/).
|
||||||
|
|
||||||
@@ -16,7 +16,7 @@ description: Planned enhancements for upcoming KST4Contest versions, generated f
|
|||||||
|
|
||||||
<section class="section narrow">
|
<section class="section narrow">
|
||||||
{% if roadmap.length == 0 %}
|
{% if roadmap.length == 0 %}
|
||||||
<article class="card content-card">
|
<article class="card content-card roadmap-version">
|
||||||
<p>No planned enhancements are currently assigned to a version milestone.</p>
|
<p>No planned enhancements are currently assigned to a version milestone.</p>
|
||||||
<p>
|
<p>
|
||||||
See all open feature requests on
|
See all open feature requests on
|
||||||
@@ -26,7 +26,7 @@ description: Planned enhancements for upcoming KST4Contest versions, generated f
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% for version in roadmap %}
|
{% for version in roadmap %}
|
||||||
<article class="card content-card">
|
<article class="card content-card roadmap-version">
|
||||||
{% if version.version %}
|
{% if version.version %}
|
||||||
<h2><a href="{{ version.url }}">{{ version.version }}</a></h2>
|
<h2><a href="{{ version.url }}">{{ version.version }}</a></h2>
|
||||||
{% else %}
|
{% else %}
|
||||||
|
|||||||
Reference in New Issue
Block a user