
SO4R Interlock
wa1hco/SO4R_Interlock
Baseline capability for one SSB/CW radio plus 3 WSJTX radios

The WIMS window opens. Start Operate or the site server there, and the console opens in the browser at . If that window is already open, double-clicking the icon brings it to the front.
Keyline Interface is an open-source printed circuit board by wa1hco, from the wa1hco/WIMS repository on GitHub, published under the GPL-3.0 licence. It is a 2-layer board of 35.8 × 22.5 mm with 25 parts on 29 nets, routed with 155 tracks and 24 vias.
It is built around the FT230XS-R, MM3Z3V6 and MM3Z4V7. Its parts include 7 capacitors, 7 resistors, 5 diodes, 3 connectors and 2 ICs. It belongs with the interfaces and adapters boards of this library.
Step 1. Put WIMS on the Desktop and in the Start menu (Linux: the app menu).
| Windows | Double-click scripts\Add WIMS to Desktop.bat |
| Linux | Double-click scripts/Add WIMS to Desktop.desktop |
Step 2. Double-click WIMS.
The WIMS window opens. Start Operate or the site server there, and the console opens in the browser at http://localhost:8787/. If that window is already open, double-clicking the icon brings it to the front.
Every file you can double-click is listed in scripts/README.md.
Supervised, human-in-the-loop console for multi-instance VHF contesting: one operator sees a ranked call roster across the fleet and clicks to work stations (S&P / tailend via WSJT-X UDP Reply). Works with N1MM+, optional GridTracker, and rotators. Not an autobot — a human starts every exchange; run/CQ stays in the seat WSJT-X UI (design §2.12).
On Setup, Goal is what you want from the stations you hear (a contest, an award, just operating, or your own list). The line under it is the rule in plain language. Changing it applies immediately. Just operating uses a Checklist: tick what is worth working, each line overall, on each band, or on each mode. Advanced holds a custom rule, and station state and county. The log WIMS checks is on Log: which file, and whether to count the whole log, contacts from now, or this year. To compare log files, double-click Check logs, or open Log → Check logs. The first line says how many logs were read and what is missing. WIMS only reads logs.
| Where the choice is saved | |
|---|---|
| Linux | ~/.config/wims/ |
| Windows | %APPDATA%\wims\ |
The checklist is checked against the log you chose. A contest goal suggests the newest matching contest log only when you have not chosen one. Your choice stays until you change it.
Design: docs/plan/wims_design.md · Status: docs/plan/wims_status.md
Short install guide: INSTALL.md — Release package or ZIP, then the double-click installer for your system.
Testers / home evaluation:
docs/tester_quickstart.md — tracks from no radio apps → WSJT-X only → WSJT-X+N1MM → optional multi-PC.
What you install (roles): docs/tester_roles.md — solo vs server vs N1MM agent / WSJT monitor.
Seat setup (WSJT-X · N1MM · Keyline): docs/operator_setup.md.
Full instructions for a new machine with nothing installed (except Windows or Linux itself).
WIMS is stdlib-only (no pip install); the Windows installer brings in Python/Git/firewall.
Versioned packages (when cut): GitHub Releases
(wims-<ver>-windows-x86_64.zip, wims-<ver>-linux-x86_64.tar.gz).
Design: docs/plan/wims_release_packages.md.
Installer (pick one):
| Entry | Notes |
|---|---|
scripts/windows/Install-Wims.cmd | Double-click; allow UAC (recommended) |
install.ps1 | Repo-root wrapper (map144-style); same logic |
Prefer the .cmd path. It starts PowerShell with -ExecutionPolicy Bypass for that run only. You do not need to change machine policy, and scripts are not Authenticode-signed yet.
GitHub Release ZIPs and browser downloads often carry a Mark of the Web. Windows may block .ps1 / warn on first run.
Install-Wims.cmd (not install.ps1 alone).Install-Wims.cmd / install.ps1 → Properties → check Unblock → OK.C:\WIMS:
Unblock-File -Path .\scripts\windows\*.cmd, .\scripts\windows\*.ps1, .\install.ps1.ps1:
powershell -NoProfile -ExecutionPolicy Bypass -File .\install.ps1Do not set a permanent Set-ExecutionPolicy Unrestricted unless you already manage that on the PC.
| If missing, install adds | How |
|---|---|
| Python ≥ 3.10 | winget, else silent download of python.org 3.12.x |
| Git | winget — clone and launcher “Update available” (git fetch origin/main). Skipped for Release ZIP trees (no .git) |
| Firewall rule TCP 8787 | so browsers on the LAN can open the console |
| Start launchers + desktop shortcut | pins the real python.exe path in python-path.txt (PATH not required; LibreOffice / Store stub ignored) |
Not installed by WIMS: N1MM Logger+, WSJT-X, GridTracker, radio drivers — install those separately if this PC is a radio seat.
| Method | Steps |
|---|---|
| USB / network share (offline-friendly) | Copy a full WIMS folder to e.g. C:\WIMS |
| GitHub Release ZIP | Releases → wims-*-windows-x86_64.zip → extract to C:\WIMS |
GitHub ZIP of main | main.zip, extract to e.g. C:\WIMS |
| Git already installed | git clone https://github.com/wa1hco/WIMS.git C:\WIMS |
You only need the folder that contains src\wims\ and scripts\windows\.
C:\WIMS\scripts\windows\ (or your path).Install-Wims.cmd.scripts\windows\install-log.txt.Start-WimsServer.cmd./overview · WSJT-X /wsjt · Log /log · N1MM /n1mm (several stations) · Setup /setupUse the contest LAN IP for --iface when other hosts must reach the server (the Start script
defaults are lab-oriented; details in scripts/windows/README.md).
| Role | What to install / do |
|---|---|
| This PC = site server only | WIMS install above is enough. Optional: copy an N1MM contest file onto the server, then choose it on the Log page. |
| Radio seat (N1MM + WSJT-X) | Install N1MM/WSJT-X yourself. Multicast + Outgoing interface = LAN. Browser → http://<server-ip>:8787/. Seat agent pack: same scripts\windows\ folder — see Full Windows guide below. |
| Operator laptop | Browser only → http://<server-ip>:8787/ (no WIMS install). |
Full Windows guide (seat auto-start, agent, offline flags, troubleshooting):
scripts/windows/README.md
Fleet networking (ports, N1MM, WSJT-X settings, readiness):
docs/plan/wims_networking.md
WIMS is then on the desktop and in the app menu. Double-click WIMS.
The file manager may ask once before that first file runs:
If the file opens as a page of text, the download dropped the permission to run it. Right-click Add WIMS to Desktop, open Properties, allow it to run as a program, and double-click it again.
If Python or the window library is missing, a message names what to install. Install that, then do what the message says.
Double-click WIMS. On Windows the same window is Start-WimsLauncher in scripts\windows\. On one PC with WSJT-X, Start-Wims-Solo opens Operate and the browser.
WSJT-X #1 (6m FT8) ┐
WSJT-X #2 (6m MSK) ┤ ┌──────────────────────────┐
WSJT-X #3 (2m FT8) ┼─UDP──▶ │ WIMS │ ◀── human override (SSB/CW op)
WSJT-X #N ... ┘ │ - UDP parse/control │
▲ │ - multi-instance mgr │
│ Reply / HaltTx / │ - INTERLOCK (TX arbiter)│──▶ Dashboard
│ FreeText / Replay │ - decision engine │
└────────────────────────│ - safety / watchdog │
└───────┬─────────┬────────┘
│ │
N1MM+ (log, ◀┘ └▶ Rotators (seat agent → rotctld)
dupe/needed)Site server = multicast consumer + console control (Reply / Halt / Free Text — not Call CQ). Consoles are browsers. Soft claim who may command TX from the console; local seat run/CQ (Enable Tx in WSJT-X) is attended by the seat op. 10 ms SSB/CW mute runs on the radio host agent, not through the server. Design §2.12 / §4 / §4.5. Rotator control is designed and not built yet: the seat agent speaks hamlib rotctld, and the console never sees a port (design §2.10).
Phase-1 read-only console is live (roster, interlock, N1MM sync, agents, three-page UI). Operate also has a separate Spotted list of DX cluster spots (other bands included; a click does not transmit or retune). PSK Reporter and the other hint lists are not built. Command path (click-to-work) and later milestones: wims_status.md.
WIMS/
├── docs/plan/ design · status · networking
├── scripts/ double-click launchers (see scripts/README.md)
├── tools/dev/ tests, packaging, lab helpers
├── src/wims/ server, udp, engine, interlock, n1mm, agent, …
├── testbed/ WSJT-X emulator, interlock bench
└── tests/unit/ no-pytest unit suitesTyped commands, path variables, and flags are for people changing WIMS. Operators use the Desktop icon.
On a Mac, double-click is not available. From the WIMS folder: scripts/add-wims-to-desktop.sh.
# from the repo root; the checkout shim finds src/ with no path variable
python3 -m wims version
python3 -m wims solo --no-open
python3 -m wims.logaudit
tools/dev/validate.shset PYTHONPATH=src
python -m wims soloLog compare flags (--adif, --n1mm-db, --lotw, --json) are optional. With no arguments the compare tool uses the WSJT-X logs it can find on this PC.
WIMS is free software licensed under the GNU General Public License v3.0 or later (GPL-3.0-or-later). See LICENSE for the full text.
Copyright (C) 2026 Jeff Millar, WA1HCO
This program is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the Free
Software Foundation, either version 3 of the License, or (at your option)
any later version. It is distributed WITHOUT ANY WARRANTY; see the license
for details.| Qty | Value | Footprint | References |
|---|---|---|---|
| 5 | .1u | Capacitor_SMD:C_0402_1005Metric | C1, C3, C4, C11, C14 |
| 3 | 1K | Resistor_SMD:R_0402_1005Metric | R3, R4, R43 |
| 2 | 27 | Resistor_SMD:R_0402_1005Metric | R10, R11 |
| 2 | 47p | Capacitor_SMD:C_0402_1005Metric | C2, C6 |
| 2 | 5K1 | Resistor_SMD:R_0402_1005Metric | R1, R2 |
| 2 | MM3Z3V6 | Diode_SMD:D_SOD-323 | D1, D10 |
| 2 | RBQ161QS-40 | Diode_SMD:D_0402_1005Metric | D2, D9 |
| 1 | AT3H4X | Package_SO:SSOP-4_4.4x2.6mm_P1.27mm | U3 |
| 1 | FT230XS | Package_SO:SSOP-16_3.9x4.9mm_P0.635mm | U1 |
| 1 | FerriteBead | Inductor_SMD:L_0805_2012Metric | FB4 |
| 1 | Inhibit | Connector_Audio:Jack_3.5mm_PJ320E_Horizontal | J3 |
| 1 | Key | Connector_Audio:Jack_3.5mm_PJ320E_Horizontal | J1 |
| 1 | MM3Z4V7 | Diode_SMD:D_SOD-323 | D20 |
| 1 | USB-C 2.0 16P | Interlock:USB_C_Receptacle_G-Switch_GT-USB-7010ASV | J2 |

wa1hco/SO4R_Interlock
Baseline capability for one SSB/CW radio plus 3 WSJTX radios

dario0603/power_supply
Progetto universitario per la realizzazione e simulazione di un Alimentatore da Banco Stabilizzato , completo di schemi elettrici KiCad, simulazioni LTspice, documentazione tecnica e file Gerber per la produzione del…


eddyem/mmpp
MMPP (Multimode photometer-polarimeter) for the telescope Zeiss-1000 of SAO RAS.

wa1hco/Synthesizer-VHF
35 MHz–4.4 GHz ADF4351 synthesizer: ATtiny1616 + USB-C, 10 MHz ref in/out, JLCPCB-ready KiCad board for a Hammond die-cast box

wa1hco/VOX
External VOX using voice activity detection and automatic echo cancellation

eddyem/stm32samples
Code samples and ready projects based on bare-metal STM32

It measures 35.8 × 22.5 mm and has 2 copper layers, 1.6 mm thick.
25 parts, built around the FT230XS-R, MM3Z3V6 and MM3Z4V7. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the wa1hco/WIMS repository on GitHub, at the commit this page was made from: the board is hardware/keyline_interface/Keyline_Interface.kicad_pcb and its schematic hardware/keyline_interface/Keyline_Interface.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository publishes it under the GPL-3.0 licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).