Extensions for Ham2K contest logging and seeing where your signal is
heard. Each extension is available as a ready-to-install .h2kext bundle;
install only the ones you want.
| Extension | What it adds |
|---|---|
RBN (n1rwj-rbn) |
Reception map and sortable CW, RTTY, FT8, and FT4 reports from the Reverse Beacon Network via Vail ReRBN, using your operation's callsign and location |
CQ WW (temporary) (n1rwj-cqww) |
Preview of official CQ WW RTTY exchange, scoring, and export improvements |
CWops CWT (n1rwj-cwt) |
CWT sessions, exchange suggestions, scoring, and exports |
ICWC MST (n1rwj-mst) |
MST sessions, name suggestions, outgoing serials, scoring, and exports |
K1USN SST (n1rwj-sst) |
SST sessions, name/location suggestions, scoring, and exports |
Weekly RTTY Test (n1rwj-wrt) |
Half-hour RTTY sessions, name/QTH suggestions, callsign multipliers, and exports |
The PSK Reporter extension now builds with live MQTT reception using the published SDK and tools. It shares the reception map/UI with RBN and requires Ham2K build 171 or newer. Native app testing remains pending; see the verification record.
- Download the bundle for each extension you want from
latest GitHub release.
Choose the
.h2kextasset whose name starts with the extension key in the table above. The matching.sha256file lets you verify the download. - In Ham2K, choose Settings → Features & Extensions → Install from file
and select the
.h2kextfile. Each bundle installs separately. The host must support the hooks and shared-library versions declared in its manifest.
Then follow the steps for the extension below. Building from source is optional. GitHub downloads and catalog availability are separate; see publishing status and recovery for the catalog workflow.
After installation, search for N1RWJ in Features & Extensions to see the installed extensions and their enable switches. See the screenshot record for the captured app and extension versions; use the latest release linked above when installing.
RBN also supplies native Spots, with optional CWT/MST/SST call-history filters, skimmer selection, receiver continents/grid regions, and a distance limit in miles from your chosen grid in Settings → RBN. All calls is the default; choose the CWT call-history filter explicitly when you want it.
The My Signal panel requires a Ham2K version with native SVG panel support. If it shows App update needed, update Ham2K before using the panel. See the verification record for tested builds.
- Open an operation and choose Edit Layout → Add a Panel → My Signal. Turn on Enable Layout Customization in app settings if layout editing is unavailable. On narrow screens, Edit Layout is under Tools.
- Leave Watch callsign and Map origin grid blank to follow the operation. The panel uses its station callsign and latitude/longitude, or its grid when coordinates are unavailable. Set the operation's location for the map, distance, and bearing; the receiver listing works without it.
- Save the layout. Reports refresh automatically while the panel is visible. The defaults show the last 15 minutes on all bands, newest first.
Use panel settings (the tune icon) to choose View and Band. Use the panel controls to sort reports, page through receivers, and refresh manually. Wide panes show a table; narrow panes use receiver cards. Explicit callsign/grid overrides stay with that panel placement until cleared, so leave them blank for normal operation. The map geography is bundled; new RBN reports are provided by Vail ReRBN and need internet access. Receiver positions use cached RBN node grids, with registered grids as a fallback, so map paths, distances, and bearings are estimates. Refresh the RBN receiver directory in Settings → Data Files when needed; it becomes eligible for automatic refresh during data-file sync after seven days. See the RBN guide and historical screenshots for settings, test observations, and device-testing limits.
The temporary CQ WW extension
is being contributed to the official extension in
Ham2K/extensions PR #2. Version 0.5.0 includes the installable preview. You can also build it locally
with mise run pack n1rwj-cqww.
Disable official CQ WW while using this copy. Both use cqww references,
so saved operations can switch back when the official update ships.
- For CWT, disable the original CWops CWT extension. Both handle
cwtreferences, so enabling both creates duplicate handlers. The personal key, saved CWT references, settings, and data-file identity remain compatible with previous releases of this repository. - Refresh the extension's call-history entry under Settings → Accounts, Services & Data Sources. Its settings accept an HTTPS N1MM entry or text URL; leaving the source blank discovers the current contest-specific file.
- Add the desired session to an operation, configure your sent exchange, and log contacts. Always copy and verify the exchange actually sent.
| Contest | Exchange | Weekly sessions, UTC | Scoring |
|---|---|---|---|
| CWT | Name and CWops number, CWA, or nonmember location | Wednesday 13:00 and 19:00; Thursday 03:00 and 07:00 | QSOs × unique callsigns across the session |
| MST | Name and sequential QSO number | Monday 13:00 and 19:00; Tuesday 03:00 | QSOs × unique callsigns across the session |
| SST | Name and US state, Canadian province, or DX | Monday 00:00; Friday 20:00 | QSOs × state/province/DXCC multipliers counted once per band |
Every session lasts one hour. These contests use CW on 160, 80, 40, 20, 15,
and 10 meters; each station can be worked once per band. MST encourages
20–25 WPM; SST has a 20 WPM maximum. SST uses DX for locations outside the
lower 48 US states and Canada, including Alaska and Hawaii; the lower 48 US
and Canada do not also earn country multipliers. See the sponsors' current
CWT rules,
MST rules, and
SST rules. The
sponsor-linked SST definition
specifies per-band multipliers. Calendar suggestions follow the normal weekly
schedule; check sponsor announcements for cancellations or moved sessions.
MST suggests names from history; received serial numbers must be entered for each contact and are never reused from history or CWops membership data. Ham2K allocates your outgoing MST serials. SST suggests names and locations. Explicit edits and intentional clearing take priority. Data downloads occur during refresh, with the last successful dataset retained after a failed replacement. No download or full-log read is required for each keystroke.
QSO-history suggestions request only the active contest (CWT, MST, or SST) before the host applies its five-contact limit. This keeps newer contacts in other activities from hiding an older contest exchange. Older Ham2K builds ignore this filter; suggestions still reject unrelated contacts, but can only use matching contacts among the latest five returned for each exact/base call.
Use one callsign per contact for these exchange-based contests: batch call entry shares exchange controls. ADIF and Cabrillo exports preserve the contest exchange. MST and SST scores are reported through 3830 Scores; their sponsors do not require log uploads. The CWT, MST, and SST operator guides explain each contest, its data sources, exchange suggestions, and scoring, including how MST serial numbers work. Verification separates automated checks from tests performed in the native Ham2K app.
WRT runs Fridays 0145–0215 UTC on 80, 40, 20, 15, and 10m RTTY. Its exchange is name plus state/province for W/VE, or country prefix for DX. Score eligible QSOs × unique callsigns across the session, with one contact per station per band. Select QRP (5 W) or low power (100 W), configure your sent exchange, and report your summary on 3830 Scores.
Install the WRT bundle from v0.6.0,
or build it locally with mise run pack n1rwj-wrt.
WRT suggests exchanges from previous WRT contacts and ordinary host lookups.
It has no downloadable history file or history-file spot filter. Its guide
covers RTTY mode selection, prefix handling, exports, and verification limits.
Install mise and use its executable file tasks:
mise run install
mise run extension:list
mise run format
mise run checkcheck runs lint, strict TypeScript checking, Vitest, the official extension
build, and official package validation. CI runs the same task. Individual
tasks are lint, typecheck, test, build, and pack:
mise run build n1rwj-mst
mise run pack n1rwj-sst
mise run test -- extensions/contests/n1rwj-cwt/tests
mise run verify-host n1rwj-mst
mise run verify-host --app "/Applications/Ham2K Mac Logger (Next).app"Omit the extension key to build, package, or verify all extensions. pack
builds the workspaces and writes the selected archives and checksums to
dist/. verify-host evaluates bundles against the running or newest
installed macOS Ham2K JavaScript kernel; it does not substitute for native
installation and logging tests.
extensions/contests/n1rwj-cqww/ Temporary official CQ WW RTTY preview
extensions/contests/n1rwj-cwt/ CWT manifest, source, and tests
extensions/contests/n1rwj-mst/ MST manifest and configuration
extensions/contests/n1rwj-sst/ SST manifest and configuration
extensions/tools/n1rwj-rbn/ RBN feed, receiver directory, Spots, and panel adapter
extensions/tools/n1rwj-psk-reporter/ Live MQTT reception maps and transport
packages/reception/ Shared reception model, map, UI, and geography
packages/n1mm/ Generic N1MM parsing, callsigns, and downloads
packages/contest-history/ Shared CWT/MST/SST operation-history adapter
packages/mini-contest/ Shared MST/SST hooks, history, scoring, and tests
mise/tasks/ Executable automation and its TypeScript config
scripts/ TypeScript implementation of repository tooling
Node 24 runs TypeScript automation directly with built-in type stripping.
Type checking is a separate required step; use erasable syntax, explicit
.ts imports, and type-only imports. Extension source still needs the
official Ham2K build preset: the host runs an ES2020 JavaScript sandbox without
Node, DOM, or global fetch. Read the installed SDK's AGENTS.md, relevant
docs/, and published dist/index.d.ts before changing hooks. Host-provided
shared libraries stay declared in each manifest and externalized from bundles;
local installations of those libraries are development dependencies.
mise run extension:new n1rwj-notes --name "N1RWJ Notes"
mise run extension:new n1rwj-example --name "Example Contest" --group contests
mise run checkThe generator creates a typed panel extension, manifest, package, Vitest
test, and README, then updates the workspace lockfile. The default group is
dashboards; --group chooses a directory, while the generated hook remains
a panel until you adapt it. It refuses invalid/reserved keys and existing
extensions. Update the manifest's category and hooks when changing the
extension type. New workspaces are discovered automatically by build, check,
packaging, and release tasks.
Keep reusable parsing independent of contest meaning. For example, N1MM's
Exch1 contains a CWT membership/location exchange or an SST location;
neither is an MST serial number. New substantive behavior needs deterministic
Vitest tests. The repository uses the user's Jujutsu workflow and
commit-message-default: auto in AGENTS.md.
The personal CWT extension is temporary, pending
Ham2K/extensions PR #1.
The CQ WW preview is also temporary, on upstream branch codex/cqww-rtty;
keep its source and translations aligned with the official ham2k-cqww PR.
MST, SST, RBN, and PSK Reporter will continue to live in this repository.
While the personal CWT extension is in use, synchronize CWT behavior, fixes,
tests, translations, and relevant documentation with the source branch of
PR #1, currently
codex/cwt-call-history in ~/src/github/ham2k/extensions. Its CWT source is
extensions/contests/ham2k-cwt/. Verify the current PR branch before editing
and run upstream checks. This also applies to shared changes affecting CWT.
Backport relevant upstream fixes here, preserving personal identity and saved
data. MST, SST, RBN, monorepo tooling, and personal packaging are independent of
that CWT synchronization requirement.
All extensions and shared workspaces use one synchronized repository version. Choose an unused version; for example:
mise run release:prepare 0.3.5
mise run release:notes v0.3.5 --create
# Edit docs/releases/v0.3.5.md, then validate and preview catalog notes:
mise run release:notes v0.3.5
mise run format
mise run release v0.3.5 --dry-runrelease:prepare updates the root package, every extension's manifest and
package, shared packages, and lockfile. release --dry-run runs check and
validates matching versions and SHA-256 files without uploading anything.
Commit the prepared files, push, then publish a GitHub release tagged with
that version at the tested commit, using the notes file as its body.
Release notes have one section per extension plus optional shared changes. GitHub shows the whole document; each catalog entry shows only its own section and shared changes. Unchanged extensions explicitly say so, while root dependency updates belong in shared changes. See the release notes format.
The Release workflow responds to published releases and prereleases,
checks out the tagged commit, and runs mise run release. It attaches only
the current extensions' exact <key>-<version>.h2kext and .sha256 pairs;
unrelated or older files in dist/ are excluded. The same task can attach
assets to an existing release locally. It uses GitHub's built-in CI token and
refuses to overwrite existing assets. Draft releases do not trigger uploads.
Keep release immutability disabled while using this workflow because assets
are attached after publication. After an interrupted upload, inspect the
existing assets before retrying.
After uploading assets, a separate job attempts to submit the same bundles to the Ham2K catalog for review. See Publishing for token setup, channel selection, submission status, and recovery from failures.
The CWT extension builds on Sebastian Delmont's (KI2D) original Ham2K CWT extension. Its MPL-2.0 license and copyright notices are retained. See provenance, license, and notices for source history and attribution.
The RBN map bundles Natural Earth geometry and projection libraries with their notices. See its map attribution for the data source and licenses.
