chore: release v0.11

This commit is contained in:
2026-06-16 20:00:15 +02:00
parent 957182611d
commit 75ee5344a4
3 changed files with 23 additions and 21 deletions
+3 -3
View File
@@ -1,6 +1,6 @@
// Single source of truth for the app version shown in the UI (header + About). // Single source of truth for the app version shown in the UI (header + About).
// Bump this on a release (the release script updates it alongside telemetry.go). // Bump this on a release (the release script updates it alongside telemetry.go).
export const APP_VERSION = '0.1'; export const APP_VERSION = '0.11';
// Author / credits, shown in Help About. // Author / credits, shown in Help → About.
export const APP_AUTHOR = 'F4BPO'; export const APP_AUTHOR = 'F4BPO';
+16 -14
View File
@@ -278,36 +278,38 @@ func stripAnnotation(s string, open, close rune, cb func(string)) string {
// suffixModifiers are non-DXCC-relevant callsign suffixes we strip before // suffixModifiers are non-DXCC-relevant callsign suffixes we strip before
// matching. /P /M /QRP /A and single-digit area changes (/5 …) all keep the // matching. /P /M /QRP /A and single-digit area changes (/5 …) all keep the
// operator's home DXCC. NOTE: "MM" and "AM" are NOT here — a TRAILING /MM or // operator's home DXCC. A TRAILING /MM or /AM (maritime/aeronautical mobile) is
// /AM (maritime/aeronautical mobile) means "no DXCC entity", while a LEADING // handled in normalizeCallsign (stripped, home entity kept) so a LEADING "MM"
// "MM" is the Scotland operating prefix; both are handled in normalizeCallsign. // (the Scotland prefix) isn't mistaken for it.
var suffixModifiers = map[string]bool{ var suffixModifiers = map[string]bool{
"P": true, "M": true, "QRP": true, "A": true, "P": true, "M": true, "QRP": true, "A": true,
"PM": true, "LH": true, "PM": true, "LH": true,
} }
// normalizeCallsign uppercases, trims, and resolves the "active" call when // normalizeCallsign uppercases, trims, and resolves the "active" call when the
// the operator uses slashes (DL/F4NIE → DL; F4NIE/P → F4NIE). Returns "" for // operator uses slashes (DL/F4NIE → DL; F4NIE/P → F4NIE). A trailing /MM or /AM
// maritime/aeronautical mobile (.../MM, .../AM), which count for no DXCC. // (maritime/aeronautical mobile) is stripped so the home entity still resolves
// (YB1SCY/AM → YB1SCY → Indonesia) — strict DXCC says no entity, but the log
// should still show the operator's country.
func normalizeCallsign(s string) string { func normalizeCallsign(s string) string {
s = strings.ToUpper(strings.TrimSpace(s)) s = strings.ToUpper(strings.TrimSpace(s))
if !strings.ContainsRune(s, '/') { if !strings.ContainsRune(s, '/') {
return s return s
} }
parts := strings.Split(s, "/") parts := strings.Split(s, "/")
// A trailing /MM or /AM is maritime/aeronautical mobile → no DXCC entity.
// (A leading "MM" is the Scotland prefix and must NOT trigger this.)
for i, p := range parts {
if i > 0 && (p == "MM" || p == "AM") {
return ""
}
}
keep := parts[:0] keep := parts[:0]
var areaDigit byte // a single-digit "/N" re-homes the call to call area N var areaDigit byte // a single-digit "/N" re-homes the call to call area N
for _, p := range parts { for i, p := range parts {
if p == "" { if p == "" {
continue continue
} }
// A TRAILING /MM (maritime) or /AM (aeronautical) mobile is stripped and
// the operator's home entity is kept, so the contact still resolves to a
// country in the log (e.g. YB1SCY/AM → Indonesia). A LEADING "MM" is the
// Scotland operating prefix (MM/F4NIE) and must NOT be stripped.
if i > 0 && (p == "MM" || p == "AM") {
continue
}
if suffixModifiers[p] { if suffixModifiers[p] {
continue continue
} }
+4 -4
View File
@@ -1,4 +1,4 @@
package main package main
import ( import (
"bytes" "bytes"
@@ -13,15 +13,15 @@ import (
"hamlog/internal/applog" "hamlog/internal/applog"
) )
// Anonymous usage telemetry a once-a-day "app_opened" heartbeat to PostHog so // Anonymous usage telemetry — a once-a-day "app_opened" heartbeat to PostHog so
// the OpsLog author can see how many people actively use it. Privacy by design: // the OpsLog author can see how many people actively use it. Privacy by design:
// only a random install ID + app version + OS are sent (no callsign, no QSO // only a random install ID + app version + OS are sent (no callsign, no QSO
// data, no IP beyond what any HTTP request reveals). Users can disable it in // data, no IP beyond what any HTTP request reveals). Users can disable it in
// Preferences General. See [[user-analytics-posthog]] notes in MEMORY. // Preferences → General. See [[user-analytics-posthog]] notes in MEMORY.
const ( const (
// appVersion is stamped on every heartbeat (and could feed the About box). // appVersion is stamped on every heartbeat (and could feed the About box).
appVersion = "0.1" appVersion = "0.11"
// posthogHost is the PostHog ingestion endpoint. EU cloud by default; change // posthogHost is the PostHog ingestion endpoint. EU cloud by default; change
// to https://us.i.posthog.com for a US project. // to https://us.i.posthog.com for a US project.