<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.simtx.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sophie-developer</id>
	<title>SimTX Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.simtx.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sophie-developer"/>
	<link rel="alternate" type="text/html" href="https://wiki.simtx.net/index.php/Special:Contributions/Sophie-developer"/>
	<updated>2026-11-04T20:57:31Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://wiki.simtx.net/index.php?title=News_Coverage&amp;diff=2595</id>
		<title>News Coverage</title>
		<link rel="alternate" type="text/html" href="https://wiki.simtx.net/index.php?title=News_Coverage&amp;diff=2595"/>
		<updated>2026-11-04T12:38:33Z</updated>

		<summary type="html">&lt;p&gt;Sophie-developer: /* Inzynieriada / InzynieRanek (2026-11-02) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary table ==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Outlet&lt;br /&gt;
!Title&lt;br /&gt;
!Author&lt;br /&gt;
!Language&lt;br /&gt;
!Type&lt;br /&gt;
|-&lt;br /&gt;
|2026-10-29&lt;br /&gt;
|[https://www.rtl-sdr.com/ RTL-SDR Blog]&lt;br /&gt;
|[https://www.rtl-sdr.com/simtx-a-multiplayer-shortwave-radio-simulator-with-realistic-propagation-and-rtl_tcp-support/ SimTX: A Multiplayer Shortwave Radio Simulator with Realistic Propagation and rtl_tcp Support]&lt;br /&gt;
|admin&lt;br /&gt;
|English&lt;br /&gt;
|News post&lt;br /&gt;
|-&lt;br /&gt;
|2026-10-29&lt;br /&gt;
|[https://hamradio.my/ HamRadio.my]&lt;br /&gt;
|[https://hamradio.my/simtx-multiplayer-shortwave-radio-simulator/ SimTX: The Multiplayer Shortwave Radio Simulator With One Shared Band and Real Propagation]&lt;br /&gt;
|9M2PJU&lt;br /&gt;
|English&lt;br /&gt;
|Long-form overview / guide&lt;br /&gt;
|-&lt;br /&gt;
|2026-10-29&lt;br /&gt;
|[https://techspeeltuin.nl/ TechSpeeltuin]&lt;br /&gt;
|[https://techspeeltuin.nl/hamnieuws/2262/simtx-biedt-realistische-propagatie-in-multiplayer-simulator SimTX biedt realistische propagatie in multiplayer simulator]&lt;br /&gt;
|AI-redactie TechSpeeltuin (AI-generated)&lt;br /&gt;
|Dutch&lt;br /&gt;
|News brief (summary of RTL-SDR Blog)&lt;br /&gt;
|-&lt;br /&gt;
|2026-10-30&lt;br /&gt;
|[https://nexttechworld.com/ NextTechWorld]&lt;br /&gt;
|[https://nexttechworld.com/ham-radio/simtx-shortwave-radio-simulator/ SimTX: Shortwave Radio With a Virtual Ionosphere]&lt;br /&gt;
|&#039;&#039;not credited&#039;&#039;&lt;br /&gt;
|English (also translated)&lt;br /&gt;
|Feature / analysis&lt;br /&gt;
|-&lt;br /&gt;
|2026-11-02&lt;br /&gt;
|[https://www.youtube.com/channel/UChIWXQckj5EO9jEHhe4Q7Wg Marcin Stolarski - Inzynieriada (YouTube)]&lt;br /&gt;
|[https://www.youtube.com/watch?v=TQpfMwdHfhc InzynieRanek 2026-11-02 – Radio bez radia? SimTX i wirtualny eter]&lt;br /&gt;
|Marcin Stolarski (channel), with Grażynka&lt;br /&gt;
|Polish&lt;br /&gt;
|Video discussion (not an independent test)&lt;br /&gt;
|-&lt;br /&gt;
|2026-11-04&lt;br /&gt;
|[https://radiomesh.pl/ RadioMesh.pl]&lt;br /&gt;
|[https://radiomesh.pl/krotkofalarstwo/kazdy-moze-nadawac-nic-nie-idzie-w-eter-simtx-symuluje-fale-krotkie/ Każdy może nadawać, nic nie idzie w eter. SimTX symuluje fale krótkie]&lt;br /&gt;
|MarWoj (SP9MAW)&lt;br /&gt;
|Polish&lt;br /&gt;
|Feature / hands-on guide&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Coverage details ==&lt;br /&gt;
&lt;br /&gt;
=== RTL-SDR Blog (2026-10-29) ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Link:&#039;&#039;&#039; https://www.rtl-sdr.com/simtx-a-multiplayer-shortwave-radio-simulator-with-realistic-propagation-and-rtl_tcp-support/&lt;br /&gt;
* &#039;&#039;&#039;Summary:&#039;&#039;&#039; Short news post introducing SimTX as an open-beta multiplayer shortwave simulator in which all users share one simulated band. It lists the propagation stack (IRI-2020 with live ionosonde data, ITU-R groundwave and noise, Watterson fading), the transmit sources (mic, audio file, GNU Radio IQ), the supported modes and the virtual satellites. It highlights the local rtl_tcp bridge that lets SDR++ and similar programs tune the simulated band.&lt;br /&gt;
* &#039;&#039;&#039;Notes:&#039;&#039;&#039; States that the software does not appear to be open source. Embeds the official demo video (Amsterdam to Budapest, 1145 km). This post is the source for the TechSpeeltuin brief below.&lt;br /&gt;
&lt;br /&gt;
=== HamRadio.my (2026-10-29) ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Link:&#039;&#039;&#039; https://hamradio.my/simtx-multiplayer-shortwave-radio-simulator/&lt;br /&gt;
* &#039;&#039;&#039;Author:&#039;&#039;&#039; 9M2PJU&lt;br /&gt;
* &#039;&#039;&#039;Summary:&#039;&#039;&#039; The most detailed third-party guide so far. It covers:&lt;br /&gt;
** the &amp;quot;hear it&amp;quot; audio clips (clean rig, overdriven rig, calm band, Kp 7.5 storm)&lt;br /&gt;
** a modulation-mode reference table&lt;br /&gt;
** propagation basics (groundwave, skywave, skip zone, LUF/MUF, NVIS, grey line)&lt;br /&gt;
** desktop app vs legacy Java client, with a download table&lt;br /&gt;
** a five-step first-transmission walkthrough&lt;br /&gt;
** stations and satellites&lt;br /&gt;
** receiving with SDR++&lt;br /&gt;
** Lua extensions, CLI and API&lt;br /&gt;
** accounts and community&lt;br /&gt;
** a comparison with WebSDR/KiwiSDR, OpenWebRX and HamSphere&lt;br /&gt;
** a limitations section&lt;br /&gt;
* &#039;&#039;&#039;Versions mentioned:&#039;&#039;&#039; desktop app 0.1.0-alpha-14, legacy Java client 0.4.1.&lt;br /&gt;
* &#039;&#039;&#039;Notes:&#039;&#039;&#039; Links to the official wiki pages and a Hacker News discussion (item 49890503).&lt;br /&gt;
&lt;br /&gt;
=== TechSpeeltuin (2026-10-29) ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Link:&#039;&#039;&#039; https://techspeeltuin.nl/hamnieuws/2262/simtx-biedt-realistische-propagatie-in-multiplayer-simulator&lt;br /&gt;
* &#039;&#039;&#039;Summary:&#039;&#039;&#039; Three-paragraph Dutch news brief. It covers the shared virtual spectrum, the propagation models, the transmit modes, the rtl_tcp bridge, Windows/macOS/Linux support, Discord accounts and the Amsterdam to Budapest demo.&lt;br /&gt;
* &#039;&#039;&#039;Notes:&#039;&#039;&#039; Labelled as written by the site&#039;s AI editorial desk. It credits RTL-SDR Blog as its source and adds no new reporting.&lt;br /&gt;
&lt;br /&gt;
=== NextTechWorld (2026-10-30) ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Link:&#039;&#039;&#039; https://nexttechworld.com/ham-radio/simtx-shortwave-radio-simulator/&lt;br /&gt;
* &#039;&#039;&#039;Summary:&#039;&#039;&#039; Long analytical feature (about 25 minutes reading time) discussing SimTX as a shared virtual RF medium rather than a voice-chat style app. Topics include:&lt;br /&gt;
** the shared-spectrum design&lt;br /&gt;
** IRI-2020 plus ionosonde assimilation, and the limits of empirical models&lt;br /&gt;
** Watterson fading, Doppler and multipath&lt;br /&gt;
** ITU-R noise and groundwave&lt;br /&gt;
** transmitter modelling (PA compression, heating, splatter)&lt;br /&gt;
** rtl_tcp and GNU Radio as an architectural choice&lt;br /&gt;
** FT8/WSPR and virtual satellites&lt;br /&gt;
** use in training&lt;br /&gt;
** open questions: model validation, scaling, latency and the lack of published source code&lt;br /&gt;
* &#039;&#039;&#039;Notes:&#039;&#039;&#039; No author is credited. The page says its images are AI-generated or from royalty-free sources. Available in a dozen languages (de, fr, it, nl, es, pt, tr, ru, ar, ja, hu).&lt;br /&gt;
&lt;br /&gt;
=== Inzynieriada / InzynieRanek (2026-11-02) ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Link:&#039;&#039;&#039; https://www.youtube.com/watch?v=TQpfMwdHfhc&lt;br /&gt;
* &#039;&#039;&#039;Channel:&#039;&#039;&#039; Marcin Stolarski - Inzynieriada (published 2026-11-02, 06:00 UTC; Polish)&lt;br /&gt;
* &#039;&#039;&#039;Summary:&#039;&#039;&#039; Episode of the channel&#039;s InzynieRanek series in which the host and a co-presenter named Grażynka discuss SimTX as a communications simulator with a shared virtual band, a modelled ionosphere and reception through SDR software. According to the description, they cover educational uses, experimenting without an antenna and the limits of simulation. They also show excerpts of the developer&#039;s demonstration (virtual stations in Amsterdam and Budapest, the effect of propagation conditions and transmitter overdrive).&lt;br /&gt;
&lt;br /&gt;
=== RadioMesh.pl (2026-11-04) ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Link:&#039;&#039;&#039; https://radiomesh.pl/krotkofalarstwo/kazdy-moze-nadawac-nic-nie-idzie-w-eter-simtx-symuluje-fale-krotkie/&lt;br /&gt;
* &#039;&#039;&#039;Author:&#039;&#039;&#039; MarWoj (SP9MAW)&lt;br /&gt;
* &#039;&#039;&#039;Summary:&#039;&#039;&#039; Polish hands-on article (about 6 minutes reading time). It explains how to listen with SDR++ and how to set up your own receiver and station. It covers the antenna options and NEC import, how the server computes each path, an SNR-threshold table by mode, satellites, and the terms of service (pirate and numbers stations and jamming are allowed within limits; unlicensed music and impersonating real stations are not).&lt;br /&gt;
* &#039;&#039;&#039;Facts reported that other coverage does not include:&#039;&#039;&#039;&lt;br /&gt;
** open beta since 14 August 2026&lt;br /&gt;
** download page offered version 0.1.0-alpha-16 on 1 November 2026&lt;br /&gt;
** run by a single private individual in Hungary&lt;br /&gt;
** accounts can be created by e-mail with a code login since 1 November 2026 (previously Discord only)&lt;br /&gt;
** a public receiver in simulated Budapest that needs no account (&amp;lt;code&amp;gt;argon.simtx.net&amp;lt;/code&amp;gt;, port 1240)&lt;br /&gt;
** minimum age 13, with parental consent for minors&lt;br /&gt;
** the author notes the demo video&#039;s route, levels, storm, clock and overdriven transmitter were set by script, and calls it a demonstration&lt;br /&gt;
** a licence is only needed if the simulator&#039;s audio is fed into a real transmitter&lt;br /&gt;
&lt;br /&gt;
== Related media ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.youtube.com/watch?v=ZFBshce4I1Y &amp;quot;We broadcast a song through a simulated ionosphere&amp;quot;] (qrmcat): the official demo video embedded or referenced by RTL-SDR Blog, HamRadio.my, TechSpeeltuin, Inzynieriada and RadioMesh.pl.&lt;br /&gt;
* [https://news.ycombinator.com/item?id=49890503 Hacker News discussion] (referenced by HamRadio.my).&lt;br /&gt;
* [https://simtx.net/ Official site] and [https://wiki.simtx.net/ official wiki].&lt;br /&gt;
&lt;br /&gt;
== Differences between reports ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Topic&lt;br /&gt;
!Reported&lt;br /&gt;
!Source&lt;br /&gt;
|-&lt;br /&gt;
|Desktop app version&lt;br /&gt;
|0.1.0-alpha-14 (29 Oct)&lt;br /&gt;
|HamRadio.my&lt;br /&gt;
|-&lt;br /&gt;
|Desktop app version&lt;br /&gt;
|0.1.0-alpha-16 (1 Nov)&lt;br /&gt;
|RadioMesh.pl&lt;br /&gt;
|-&lt;br /&gt;
|Account creation&lt;br /&gt;
|Discord&lt;br /&gt;
|RTL-SDR Blog, HamRadio.my, TechSpeeltuin&lt;br /&gt;
|-&lt;br /&gt;
|Account creation&lt;br /&gt;
|E-mail login added 1 Nov 2026&lt;br /&gt;
|RadioMesh.pl&lt;br /&gt;
|-&lt;br /&gt;
|Source availability&lt;br /&gt;
|Not presented as open source&lt;br /&gt;
|RTL-SDR Blog, NextTechWorld, RadioMesh.pl&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Main Page]]&lt;/div&gt;</summary>
		<author><name>Sophie-developer</name></author>
	</entry>
	<entry>
		<id>https://wiki.simtx.net/index.php?title=News_Coverage&amp;diff=2594</id>
		<title>News Coverage</title>
		<link rel="alternate" type="text/html" href="https://wiki.simtx.net/index.php?title=News_Coverage&amp;diff=2594"/>
		<updated>2026-11-04T12:38:01Z</updated>

		<summary type="html">&lt;p&gt;Sophie-developer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary table ==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Outlet&lt;br /&gt;
!Title&lt;br /&gt;
!Author&lt;br /&gt;
!Language&lt;br /&gt;
!Type&lt;br /&gt;
|-&lt;br /&gt;
|2026-10-29&lt;br /&gt;
|[https://www.rtl-sdr.com/ RTL-SDR Blog]&lt;br /&gt;
|[https://www.rtl-sdr.com/simtx-a-multiplayer-shortwave-radio-simulator-with-realistic-propagation-and-rtl_tcp-support/ SimTX: A Multiplayer Shortwave Radio Simulator with Realistic Propagation and rtl_tcp Support]&lt;br /&gt;
|admin&lt;br /&gt;
|English&lt;br /&gt;
|News post&lt;br /&gt;
|-&lt;br /&gt;
|2026-10-29&lt;br /&gt;
|[https://hamradio.my/ HamRadio.my]&lt;br /&gt;
|[https://hamradio.my/simtx-multiplayer-shortwave-radio-simulator/ SimTX: The Multiplayer Shortwave Radio Simulator With One Shared Band and Real Propagation]&lt;br /&gt;
|9M2PJU&lt;br /&gt;
|English&lt;br /&gt;
|Long-form overview / guide&lt;br /&gt;
|-&lt;br /&gt;
|2026-10-29&lt;br /&gt;
|[https://techspeeltuin.nl/ TechSpeeltuin]&lt;br /&gt;
|[https://techspeeltuin.nl/hamnieuws/2262/simtx-biedt-realistische-propagatie-in-multiplayer-simulator SimTX biedt realistische propagatie in multiplayer simulator]&lt;br /&gt;
|AI-redactie TechSpeeltuin (AI-generated)&lt;br /&gt;
|Dutch&lt;br /&gt;
|News brief (summary of RTL-SDR Blog)&lt;br /&gt;
|-&lt;br /&gt;
|2026-10-30&lt;br /&gt;
|[https://nexttechworld.com/ NextTechWorld]&lt;br /&gt;
|[https://nexttechworld.com/ham-radio/simtx-shortwave-radio-simulator/ SimTX: Shortwave Radio With a Virtual Ionosphere]&lt;br /&gt;
|&#039;&#039;not credited&#039;&#039;&lt;br /&gt;
|English (also translated)&lt;br /&gt;
|Feature / analysis&lt;br /&gt;
|-&lt;br /&gt;
|2026-11-02&lt;br /&gt;
|[https://www.youtube.com/channel/UChIWXQckj5EO9jEHhe4Q7Wg Marcin Stolarski - Inzynieriada (YouTube)]&lt;br /&gt;
|[https://www.youtube.com/watch?v=TQpfMwdHfhc InzynieRanek 2026-11-02 – Radio bez radia? SimTX i wirtualny eter]&lt;br /&gt;
|Marcin Stolarski (channel), with Grażynka&lt;br /&gt;
|Polish&lt;br /&gt;
|Video discussion (not an independent test)&lt;br /&gt;
|-&lt;br /&gt;
|2026-11-04&lt;br /&gt;
|[https://radiomesh.pl/ RadioMesh.pl]&lt;br /&gt;
|[https://radiomesh.pl/krotkofalarstwo/kazdy-moze-nadawac-nic-nie-idzie-w-eter-simtx-symuluje-fale-krotkie/ Każdy może nadawać, nic nie idzie w eter. SimTX symuluje fale krótkie]&lt;br /&gt;
|MarWoj (SP9MAW)&lt;br /&gt;
|Polish&lt;br /&gt;
|Feature / hands-on guide&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Coverage details ==&lt;br /&gt;
&lt;br /&gt;
=== RTL-SDR Blog (2026-10-29) ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Link:&#039;&#039;&#039; https://www.rtl-sdr.com/simtx-a-multiplayer-shortwave-radio-simulator-with-realistic-propagation-and-rtl_tcp-support/&lt;br /&gt;
* &#039;&#039;&#039;Summary:&#039;&#039;&#039; Short news post introducing SimTX as an open-beta multiplayer shortwave simulator in which all users share one simulated band. It lists the propagation stack (IRI-2020 with live ionosonde data, ITU-R groundwave and noise, Watterson fading), the transmit sources (mic, audio file, GNU Radio IQ), the supported modes and the virtual satellites. It highlights the local rtl_tcp bridge that lets SDR++ and similar programs tune the simulated band.&lt;br /&gt;
* &#039;&#039;&#039;Notes:&#039;&#039;&#039; States that the software does not appear to be open source. Embeds the official demo video (Amsterdam to Budapest, 1145 km). This post is the source for the TechSpeeltuin brief below.&lt;br /&gt;
&lt;br /&gt;
=== HamRadio.my (2026-10-29) ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Link:&#039;&#039;&#039; https://hamradio.my/simtx-multiplayer-shortwave-radio-simulator/&lt;br /&gt;
* &#039;&#039;&#039;Author:&#039;&#039;&#039; 9M2PJU&lt;br /&gt;
* &#039;&#039;&#039;Summary:&#039;&#039;&#039; The most detailed third-party guide so far. It covers:&lt;br /&gt;
** the &amp;quot;hear it&amp;quot; audio clips (clean rig, overdriven rig, calm band, Kp 7.5 storm)&lt;br /&gt;
** a modulation-mode reference table&lt;br /&gt;
** propagation basics (groundwave, skywave, skip zone, LUF/MUF, NVIS, grey line)&lt;br /&gt;
** desktop app vs legacy Java client, with a download table&lt;br /&gt;
** a five-step first-transmission walkthrough&lt;br /&gt;
** stations and satellites&lt;br /&gt;
** receiving with SDR++&lt;br /&gt;
** Lua extensions, CLI and API&lt;br /&gt;
** accounts and community&lt;br /&gt;
** a comparison with WebSDR/KiwiSDR, OpenWebRX and HamSphere&lt;br /&gt;
** a limitations section&lt;br /&gt;
* &#039;&#039;&#039;Versions mentioned:&#039;&#039;&#039; desktop app 0.1.0-alpha-14, legacy Java client 0.4.1.&lt;br /&gt;
* &#039;&#039;&#039;Notes:&#039;&#039;&#039; Links to the official wiki pages and a Hacker News discussion (item 49890503).&lt;br /&gt;
&lt;br /&gt;
=== TechSpeeltuin (2026-10-29) ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Link:&#039;&#039;&#039; https://techspeeltuin.nl/hamnieuws/2262/simtx-biedt-realistische-propagatie-in-multiplayer-simulator&lt;br /&gt;
* &#039;&#039;&#039;Summary:&#039;&#039;&#039; Three-paragraph Dutch news brief. It covers the shared virtual spectrum, the propagation models, the transmit modes, the rtl_tcp bridge, Windows/macOS/Linux support, Discord accounts and the Amsterdam to Budapest demo.&lt;br /&gt;
* &#039;&#039;&#039;Notes:&#039;&#039;&#039; Labelled as written by the site&#039;s AI editorial desk. It credits RTL-SDR Blog as its source and adds no new reporting.&lt;br /&gt;
&lt;br /&gt;
=== NextTechWorld (2026-10-30) ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Link:&#039;&#039;&#039; https://nexttechworld.com/ham-radio/simtx-shortwave-radio-simulator/&lt;br /&gt;
* &#039;&#039;&#039;Summary:&#039;&#039;&#039; Long analytical feature (about 25 minutes reading time) discussing SimTX as a shared virtual RF medium rather than a voice-chat style app. Topics include:&lt;br /&gt;
** the shared-spectrum design&lt;br /&gt;
** IRI-2020 plus ionosonde assimilation, and the limits of empirical models&lt;br /&gt;
** Watterson fading, Doppler and multipath&lt;br /&gt;
** ITU-R noise and groundwave&lt;br /&gt;
** transmitter modelling (PA compression, heating, splatter)&lt;br /&gt;
** rtl_tcp and GNU Radio as an architectural choice&lt;br /&gt;
** FT8/WSPR and virtual satellites&lt;br /&gt;
** use in training&lt;br /&gt;
** open questions: model validation, scaling, latency and the lack of published source code&lt;br /&gt;
* &#039;&#039;&#039;Notes:&#039;&#039;&#039; No author is credited. The page says its images are AI-generated or from royalty-free sources. Available in a dozen languages (de, fr, it, nl, es, pt, tr, ru, ar, ja, hu).&lt;br /&gt;
&lt;br /&gt;
=== Inzynieriada / InzynieRanek (2026-11-02) ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Link:&#039;&#039;&#039; https://www.youtube.com/watch?v=TQpfMwdHfhc&lt;br /&gt;
* &#039;&#039;&#039;Channel:&#039;&#039;&#039; Marcin Stolarski - Inzynieriada (published 2026-11-02, 06:00 UTC; Polish)&lt;br /&gt;
* &#039;&#039;&#039;Summary:&#039;&#039;&#039; Episode of the channel&#039;s InzynieRanek series in which the host and a co-presenter named Grażynka discuss SimTX as a communications simulator with a shared virtual band, a modelled ionosphere and reception through SDR software. According to the description, they cover educational uses, experimenting without an antenna and the limits of simulation. They also show excerpts of the developer&#039;s demonstration (virtual stations in Amsterdam and Budapest, the effect of propagation conditions and transmitter overdrive).&lt;br /&gt;
* &#039;&#039;&#039;Notes:&#039;&#039;&#039; The description states that this is a discussion of the project and the producer&#039;s demo, not the channel&#039;s own independent test. It adds no new facts about the software that the description makes visible. The summary is based on the video description only, as the video itself was not reviewed.&lt;br /&gt;
&lt;br /&gt;
=== RadioMesh.pl (2026-11-04) ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Link:&#039;&#039;&#039; https://radiomesh.pl/krotkofalarstwo/kazdy-moze-nadawac-nic-nie-idzie-w-eter-simtx-symuluje-fale-krotkie/&lt;br /&gt;
* &#039;&#039;&#039;Author:&#039;&#039;&#039; MarWoj (SP9MAW)&lt;br /&gt;
* &#039;&#039;&#039;Summary:&#039;&#039;&#039; Polish hands-on article (about 6 minutes reading time). It explains how to listen with SDR++ and how to set up your own receiver and station. It covers the antenna options and NEC import, how the server computes each path, an SNR-threshold table by mode, satellites, and the terms of service (pirate and numbers stations and jamming are allowed within limits; unlicensed music and impersonating real stations are not).&lt;br /&gt;
* &#039;&#039;&#039;Facts reported that other coverage does not include:&#039;&#039;&#039;&lt;br /&gt;
** open beta since 14 August 2026&lt;br /&gt;
** download page offered version 0.1.0-alpha-16 on 1 November 2026&lt;br /&gt;
** run by a single private individual in Hungary&lt;br /&gt;
** accounts can be created by e-mail with a code login since 1 November 2026 (previously Discord only)&lt;br /&gt;
** a public receiver in simulated Budapest that needs no account (&amp;lt;code&amp;gt;argon.simtx.net&amp;lt;/code&amp;gt;, port 1240)&lt;br /&gt;
** minimum age 13, with parental consent for minors&lt;br /&gt;
** the author notes the demo video&#039;s route, levels, storm, clock and overdriven transmitter were set by script, and calls it a demonstration&lt;br /&gt;
** a licence is only needed if the simulator&#039;s audio is fed into a real transmitter&lt;br /&gt;
&lt;br /&gt;
== Related media ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.youtube.com/watch?v=ZFBshce4I1Y &amp;quot;We broadcast a song through a simulated ionosphere&amp;quot;] (qrmcat): the official demo video embedded or referenced by RTL-SDR Blog, HamRadio.my, TechSpeeltuin, Inzynieriada and RadioMesh.pl.&lt;br /&gt;
* [https://news.ycombinator.com/item?id=49890503 Hacker News discussion] (referenced by HamRadio.my).&lt;br /&gt;
* [https://simtx.net/ Official site] and [https://wiki.simtx.net/ official wiki].&lt;br /&gt;
&lt;br /&gt;
== Differences between reports ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Topic&lt;br /&gt;
!Reported&lt;br /&gt;
!Source&lt;br /&gt;
|-&lt;br /&gt;
|Desktop app version&lt;br /&gt;
|0.1.0-alpha-14 (29 Oct)&lt;br /&gt;
|HamRadio.my&lt;br /&gt;
|-&lt;br /&gt;
|Desktop app version&lt;br /&gt;
|0.1.0-alpha-16 (1 Nov)&lt;br /&gt;
|RadioMesh.pl&lt;br /&gt;
|-&lt;br /&gt;
|Account creation&lt;br /&gt;
|Discord&lt;br /&gt;
|RTL-SDR Blog, HamRadio.my, TechSpeeltuin&lt;br /&gt;
|-&lt;br /&gt;
|Account creation&lt;br /&gt;
|E-mail login added 1 Nov 2026&lt;br /&gt;
|RadioMesh.pl&lt;br /&gt;
|-&lt;br /&gt;
|Source availability&lt;br /&gt;
|Not presented as open source&lt;br /&gt;
|RTL-SDR Blog, NextTechWorld, RadioMesh.pl&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Main Page]]&lt;/div&gt;</summary>
		<author><name>Sophie-developer</name></author>
	</entry>
	<entry>
		<id>https://wiki.simtx.net/index.php?title=News_Coverage&amp;diff=2593</id>
		<title>News Coverage</title>
		<link rel="alternate" type="text/html" href="https://wiki.simtx.net/index.php?title=News_Coverage&amp;diff=2593"/>
		<updated>2026-11-04T11:20:46Z</updated>

		<summary type="html">&lt;p&gt;Sophie-developer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Summary table ==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Outlet&lt;br /&gt;
!Title&lt;br /&gt;
!Author&lt;br /&gt;
!Language&lt;br /&gt;
!Type&lt;br /&gt;
|-&lt;br /&gt;
|2026-10-29&lt;br /&gt;
|[https://www.rtl-sdr.com/ RTL-SDR Blog]&lt;br /&gt;
|[https://www.rtl-sdr.com/simtx-a-multiplayer-shortwave-radio-simulator-with-realistic-propagation-and-rtl_tcp-support/ SimTX: A Multiplayer Shortwave Radio Simulator with Realistic Propagation and rtl_tcp Support]&lt;br /&gt;
|admin&lt;br /&gt;
|English&lt;br /&gt;
|News post&lt;br /&gt;
|-&lt;br /&gt;
|2026-10-29&lt;br /&gt;
|[https://hamradio.my/ HamRadio.my]&lt;br /&gt;
|[https://hamradio.my/simtx-multiplayer-shortwave-radio-simulator/ SimTX: The Multiplayer Shortwave Radio Simulator With One Shared Band and Real Propagation]&lt;br /&gt;
|9M2PJU&lt;br /&gt;
|English&lt;br /&gt;
|Long-form overview / guide&lt;br /&gt;
|-&lt;br /&gt;
|2026-10-29&lt;br /&gt;
|[https://techspeeltuin.nl/ TechSpeeltuin]&lt;br /&gt;
|[https://techspeeltuin.nl/hamnieuws/2262/simtx-biedt-realistische-propagatie-in-multiplayer-simulator SimTX biedt realistische propagatie in multiplayer simulator]&lt;br /&gt;
|AI-redactie TechSpeeltuin (AI-generated)&lt;br /&gt;
|Dutch&lt;br /&gt;
|News brief (summary of RTL-SDR Blog)&lt;br /&gt;
|-&lt;br /&gt;
|2026-10-30&lt;br /&gt;
|[https://nexttechworld.com/ NextTechWorld]&lt;br /&gt;
|[https://nexttechworld.com/ham-radio/simtx-shortwave-radio-simulator/ SimTX: Shortwave Radio With a Virtual Ionosphere]&lt;br /&gt;
|&#039;&#039;not credited&#039;&#039;&lt;br /&gt;
|English (also translated)&lt;br /&gt;
|Feature / analysis&lt;br /&gt;
|-&lt;br /&gt;
|2026-11-04&lt;br /&gt;
|[https://radiomesh.pl/ RadioMesh.pl]&lt;br /&gt;
|[https://radiomesh.pl/krotkofalarstwo/kazdy-moze-nadawac-nic-nie-idzie-w-eter-simtx-symuluje-fale-krotkie/ Każdy może nadawać, nic nie idzie w eter. SimTX symuluje fale krótkie]&lt;br /&gt;
|MarWoj (SP9MAW)&lt;br /&gt;
|Polish&lt;br /&gt;
|Feature / hands-on guide&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Coverage details ==&lt;br /&gt;
&lt;br /&gt;
=== RTL-SDR Blog (2026-10-29) ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Link:&#039;&#039;&#039; https://www.rtl-sdr.com/simtx-a-multiplayer-shortwave-radio-simulator-with-realistic-propagation-and-rtl_tcp-support/&lt;br /&gt;
* &#039;&#039;&#039;Summary:&#039;&#039;&#039; Short news post introducing SimTX as an open-beta multiplayer shortwave simulator in which all users share one simulated band. It lists the propagation stack (IRI-2020 with live ionosonde data, ITU-R groundwave and noise, Watterson fading), the transmit sources (mic, audio file, GNU Radio IQ), the supported modes and the virtual satellites. It highlights the local rtl_tcp bridge that lets SDR++ and similar programs tune the simulated band.&lt;br /&gt;
* &#039;&#039;&#039;Notes:&#039;&#039;&#039; States that the software does not appear to be open source. Embeds the official demo video (Amsterdam to Budapest, 1145 km). This post is the source for the TechSpeeltuin brief below.&lt;br /&gt;
&lt;br /&gt;
=== HamRadio.my (2026-10-29) ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Link:&#039;&#039;&#039; https://hamradio.my/simtx-multiplayer-shortwave-radio-simulator/&lt;br /&gt;
* &#039;&#039;&#039;Author:&#039;&#039;&#039; 9M2PJU&lt;br /&gt;
* &#039;&#039;&#039;Summary:&#039;&#039;&#039; The most detailed third-party guide so far. It covers:&lt;br /&gt;
** the &amp;quot;hear it&amp;quot; audio clips (clean rig, overdriven rig, calm band, Kp 7.5 storm)&lt;br /&gt;
** a modulation-mode reference table&lt;br /&gt;
** propagation basics (groundwave, skywave, skip zone, LUF/MUF, NVIS, grey line)&lt;br /&gt;
** desktop app vs legacy Java client, with a download table&lt;br /&gt;
** a five-step first-transmission walkthrough&lt;br /&gt;
** stations and satellites&lt;br /&gt;
** receiving with SDR++&lt;br /&gt;
** Lua extensions, CLI and API&lt;br /&gt;
** accounts and community&lt;br /&gt;
** a comparison with WebSDR/KiwiSDR, OpenWebRX and HamSphere&lt;br /&gt;
** a limitations section&lt;br /&gt;
* &#039;&#039;&#039;Versions mentioned:&#039;&#039;&#039; desktop app 0.1.0-alpha-14, legacy Java client 0.4.1.&lt;br /&gt;
* &#039;&#039;&#039;Notes:&#039;&#039;&#039; Links to the official wiki pages and a Hacker News discussion (item 49890503).&lt;br /&gt;
&lt;br /&gt;
=== TechSpeeltuin (2026-10-29) ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Link:&#039;&#039;&#039; https://techspeeltuin.nl/hamnieuws/2262/simtx-biedt-realistische-propagatie-in-multiplayer-simulator&lt;br /&gt;
* &#039;&#039;&#039;Summary:&#039;&#039;&#039; Three-paragraph Dutch news brief. It covers the shared virtual spectrum, the propagation models, the transmit modes, the rtl_tcp bridge, Windows/macOS/Linux support, Discord accounts and the Amsterdam to Budapest demo.&lt;br /&gt;
* &#039;&#039;&#039;Notes:&#039;&#039;&#039; Labelled as written by the site&#039;s AI editorial desk. It credits RTL-SDR Blog as its source and adds no new reporting.&lt;br /&gt;
&lt;br /&gt;
=== NextTechWorld (2026-10-30) ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Link:&#039;&#039;&#039; https://nexttechworld.com/ham-radio/simtx-shortwave-radio-simulator/&lt;br /&gt;
* &#039;&#039;&#039;Summary:&#039;&#039;&#039; Long analytical feature (about 25 minutes reading time) discussing SimTX as a shared virtual RF medium rather than a voice-chat style app. Topics include:&lt;br /&gt;
** the shared-spectrum design&lt;br /&gt;
** IRI-2020 plus ionosonde assimilation, and the limits of empirical models&lt;br /&gt;
** Watterson fading, Doppler and multipath&lt;br /&gt;
** ITU-R noise and groundwave&lt;br /&gt;
** transmitter modelling (PA compression, heating, splatter)&lt;br /&gt;
** rtl_tcp and GNU Radio as an architectural choice&lt;br /&gt;
** FT8/WSPR and virtual satellites&lt;br /&gt;
** use in training&lt;br /&gt;
** open questions: model validation, scaling, latency and the lack of published source code&lt;br /&gt;
* &#039;&#039;&#039;Notes:&#039;&#039;&#039; No author is credited. The page says its images are AI-generated or from royalty-free sources. Available in a dozen languages (de, fr, it, nl, es, pt, tr, ru, ar, ja, hu).&lt;br /&gt;
&lt;br /&gt;
=== RadioMesh.pl (2026-11-04) ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Link:&#039;&#039;&#039; https://radiomesh.pl/krotkofalarstwo/kazdy-moze-nadawac-nic-nie-idzie-w-eter-simtx-symuluje-fale-krotkie/&lt;br /&gt;
* &#039;&#039;&#039;Author:&#039;&#039;&#039; MarWoj (SP9MAW)&lt;br /&gt;
* &#039;&#039;&#039;Summary:&#039;&#039;&#039; Polish hands-on article (about 6 minutes reading time). It explains how to listen with SDR++ and how to set up your own receiver and station. It covers the antenna options and NEC import, how the server computes each path, an SNR-threshold table by mode, satellites, and the terms of service (pirate and numbers stations and jamming are allowed within limits; unlicensed music and impersonating real stations are not).&lt;br /&gt;
* &#039;&#039;&#039;Facts reported that other coverage does not include:&#039;&#039;&#039;&lt;br /&gt;
** open beta since 14 August 2026&lt;br /&gt;
** download page offered version 0.1.0-alpha-16 on 1 November 2026&lt;br /&gt;
** run by a single private individual in Hungary&lt;br /&gt;
** accounts can be created by e-mail with a code login since 1 November 2026 (previously Discord only)&lt;br /&gt;
** a public receiver in simulated Budapest that needs no account (&amp;lt;code&amp;gt;argon.simtx.net&amp;lt;/code&amp;gt;, port 1240)&lt;br /&gt;
** minimum age 13, with parental consent for minors&lt;br /&gt;
** the author notes the demo video&#039;s route, levels, storm, clock and overdriven transmitter were set by script, and calls it a demonstration&lt;br /&gt;
** a licence is only needed if the simulator&#039;s audio is fed into a real transmitter&lt;br /&gt;
&lt;br /&gt;
=== YouTube video (unverified) ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Link:&#039;&#039;&#039; https://www.youtube.com/watch?v=TQpfMwdHfhc&lt;br /&gt;
* &#039;&#039;&#039;Notes:&#039;&#039;&#039; Title, channel and date have not been verified. Please fill these in.&lt;br /&gt;
&lt;br /&gt;
== Related media ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.youtube.com/watch?v=ZFBshce4I1Y &amp;quot;We broadcast a song through a simulated ionosphere&amp;quot;] (qrmcat): the official demo video embedded or referenced by RTL-SDR Blog, HamRadio.my, TechSpeeltuin and RadioMesh.pl.&lt;br /&gt;
* [https://news.ycombinator.com/item?id=49890503 Hacker News discussion] (referenced by HamRadio.my).&lt;br /&gt;
* [https://simtx.net/ Official site] and [https://wiki.simtx.net/ official wiki].&lt;br /&gt;
&lt;br /&gt;
== Differences between reports ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Topic&lt;br /&gt;
!Reported&lt;br /&gt;
!Source&lt;br /&gt;
|-&lt;br /&gt;
|Desktop app version&lt;br /&gt;
|0.1.0-alpha-14 (29 Oct)&lt;br /&gt;
|HamRadio.my&lt;br /&gt;
|-&lt;br /&gt;
|Desktop app version&lt;br /&gt;
|0.1.0-alpha-16 (1 Nov)&lt;br /&gt;
|RadioMesh.pl&lt;br /&gt;
|-&lt;br /&gt;
|Account creation&lt;br /&gt;
|Discord&lt;br /&gt;
|RTL-SDR Blog, HamRadio.my, TechSpeeltuin&lt;br /&gt;
|-&lt;br /&gt;
|Account creation&lt;br /&gt;
|E-mail login added 1 Nov 2026&lt;br /&gt;
|RadioMesh.pl&lt;br /&gt;
|-&lt;br /&gt;
|Source availability&lt;br /&gt;
|Not presented as open source&lt;br /&gt;
|RTL-SDR Blog, NextTechWorld, RadioMesh.pl&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Main Page]]&lt;/div&gt;</summary>
		<author><name>Sophie-developer</name></author>
	</entry>
	<entry>
		<id>https://wiki.simtx.net/index.php?title=News_Coverage&amp;diff=2592</id>
		<title>News Coverage</title>
		<link rel="alternate" type="text/html" href="https://wiki.simtx.net/index.php?title=News_Coverage&amp;diff=2592"/>
		<updated>2026-11-04T11:20:36Z</updated>

		<summary type="html">&lt;p&gt;Sophie-developer: Created page with &amp;quot; = News Coverage =  == Summary table == {| class=&amp;quot;wikitable sortable&amp;quot; !Date !Outlet !Title !Author !Language !Type |- |2026-10-29 |[https://www.rtl-sdr.com/ RTL-SDR Blog] |[https://www.rtl-sdr.com/simtx-a-multiplayer-shortwave-radio-simulator-with-realistic-propagation-and-rtl_tcp-support/ SimTX: A Multiplayer Shortwave Radio Simulator with Realistic Propagation and rtl_tcp Support] |admin |English |News post |- |2026-10-29 |[https://hamradio.my/ HamRadio.my] |[https://h...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= News Coverage =&lt;br /&gt;
&lt;br /&gt;
== Summary table ==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
!Date&lt;br /&gt;
!Outlet&lt;br /&gt;
!Title&lt;br /&gt;
!Author&lt;br /&gt;
!Language&lt;br /&gt;
!Type&lt;br /&gt;
|-&lt;br /&gt;
|2026-10-29&lt;br /&gt;
|[https://www.rtl-sdr.com/ RTL-SDR Blog]&lt;br /&gt;
|[https://www.rtl-sdr.com/simtx-a-multiplayer-shortwave-radio-simulator-with-realistic-propagation-and-rtl_tcp-support/ SimTX: A Multiplayer Shortwave Radio Simulator with Realistic Propagation and rtl_tcp Support]&lt;br /&gt;
|admin&lt;br /&gt;
|English&lt;br /&gt;
|News post&lt;br /&gt;
|-&lt;br /&gt;
|2026-10-29&lt;br /&gt;
|[https://hamradio.my/ HamRadio.my]&lt;br /&gt;
|[https://hamradio.my/simtx-multiplayer-shortwave-radio-simulator/ SimTX: The Multiplayer Shortwave Radio Simulator With One Shared Band and Real Propagation]&lt;br /&gt;
|9M2PJU&lt;br /&gt;
|English&lt;br /&gt;
|Long-form overview / guide&lt;br /&gt;
|-&lt;br /&gt;
|2026-10-29&lt;br /&gt;
|[https://techspeeltuin.nl/ TechSpeeltuin]&lt;br /&gt;
|[https://techspeeltuin.nl/hamnieuws/2262/simtx-biedt-realistische-propagatie-in-multiplayer-simulator SimTX biedt realistische propagatie in multiplayer simulator]&lt;br /&gt;
|AI-redactie TechSpeeltuin (AI-generated)&lt;br /&gt;
|Dutch&lt;br /&gt;
|News brief (summary of RTL-SDR Blog)&lt;br /&gt;
|-&lt;br /&gt;
|2026-10-30&lt;br /&gt;
|[https://nexttechworld.com/ NextTechWorld]&lt;br /&gt;
|[https://nexttechworld.com/ham-radio/simtx-shortwave-radio-simulator/ SimTX: Shortwave Radio With a Virtual Ionosphere]&lt;br /&gt;
|&#039;&#039;not credited&#039;&#039;&lt;br /&gt;
|English (also translated)&lt;br /&gt;
|Feature / analysis&lt;br /&gt;
|-&lt;br /&gt;
|2026-11-04&lt;br /&gt;
|[https://radiomesh.pl/ RadioMesh.pl]&lt;br /&gt;
|[https://radiomesh.pl/krotkofalarstwo/kazdy-moze-nadawac-nic-nie-idzie-w-eter-simtx-symuluje-fale-krotkie/ Każdy może nadawać, nic nie idzie w eter. SimTX symuluje fale krótkie]&lt;br /&gt;
|MarWoj (SP9MAW)&lt;br /&gt;
|Polish&lt;br /&gt;
|Feature / hands-on guide&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Coverage details ==&lt;br /&gt;
&lt;br /&gt;
=== RTL-SDR Blog (2026-10-29) ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Link:&#039;&#039;&#039; https://www.rtl-sdr.com/simtx-a-multiplayer-shortwave-radio-simulator-with-realistic-propagation-and-rtl_tcp-support/&lt;br /&gt;
* &#039;&#039;&#039;Summary:&#039;&#039;&#039; Short news post introducing SimTX as an open-beta multiplayer shortwave simulator in which all users share one simulated band. It lists the propagation stack (IRI-2020 with live ionosonde data, ITU-R groundwave and noise, Watterson fading), the transmit sources (mic, audio file, GNU Radio IQ), the supported modes and the virtual satellites. It highlights the local rtl_tcp bridge that lets SDR++ and similar programs tune the simulated band.&lt;br /&gt;
* &#039;&#039;&#039;Notes:&#039;&#039;&#039; States that the software does not appear to be open source. Embeds the official demo video (Amsterdam to Budapest, 1145 km). This post is the source for the TechSpeeltuin brief below.&lt;br /&gt;
&lt;br /&gt;
=== HamRadio.my (2026-10-29) ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Link:&#039;&#039;&#039; https://hamradio.my/simtx-multiplayer-shortwave-radio-simulator/&lt;br /&gt;
* &#039;&#039;&#039;Author:&#039;&#039;&#039; 9M2PJU&lt;br /&gt;
* &#039;&#039;&#039;Summary:&#039;&#039;&#039; The most detailed third-party guide so far. It covers:&lt;br /&gt;
** the &amp;quot;hear it&amp;quot; audio clips (clean rig, overdriven rig, calm band, Kp 7.5 storm)&lt;br /&gt;
** a modulation-mode reference table&lt;br /&gt;
** propagation basics (groundwave, skywave, skip zone, LUF/MUF, NVIS, grey line)&lt;br /&gt;
** desktop app vs legacy Java client, with a download table&lt;br /&gt;
** a five-step first-transmission walkthrough&lt;br /&gt;
** stations and satellites&lt;br /&gt;
** receiving with SDR++&lt;br /&gt;
** Lua extensions, CLI and API&lt;br /&gt;
** accounts and community&lt;br /&gt;
** a comparison with WebSDR/KiwiSDR, OpenWebRX and HamSphere&lt;br /&gt;
** a limitations section&lt;br /&gt;
* &#039;&#039;&#039;Versions mentioned:&#039;&#039;&#039; desktop app 0.1.0-alpha-14, legacy Java client 0.4.1.&lt;br /&gt;
* &#039;&#039;&#039;Notes:&#039;&#039;&#039; Links to the official wiki pages and a Hacker News discussion (item 49890503).&lt;br /&gt;
&lt;br /&gt;
=== TechSpeeltuin (2026-10-29) ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Link:&#039;&#039;&#039; https://techspeeltuin.nl/hamnieuws/2262/simtx-biedt-realistische-propagatie-in-multiplayer-simulator&lt;br /&gt;
* &#039;&#039;&#039;Summary:&#039;&#039;&#039; Three-paragraph Dutch news brief. It covers the shared virtual spectrum, the propagation models, the transmit modes, the rtl_tcp bridge, Windows/macOS/Linux support, Discord accounts and the Amsterdam to Budapest demo.&lt;br /&gt;
* &#039;&#039;&#039;Notes:&#039;&#039;&#039; Labelled as written by the site&#039;s AI editorial desk. It credits RTL-SDR Blog as its source and adds no new reporting.&lt;br /&gt;
&lt;br /&gt;
=== NextTechWorld (2026-10-30) ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Link:&#039;&#039;&#039; https://nexttechworld.com/ham-radio/simtx-shortwave-radio-simulator/&lt;br /&gt;
* &#039;&#039;&#039;Summary:&#039;&#039;&#039; Long analytical feature (about 25 minutes reading time) discussing SimTX as a shared virtual RF medium rather than a voice-chat style app. Topics include:&lt;br /&gt;
** the shared-spectrum design&lt;br /&gt;
** IRI-2020 plus ionosonde assimilation, and the limits of empirical models&lt;br /&gt;
** Watterson fading, Doppler and multipath&lt;br /&gt;
** ITU-R noise and groundwave&lt;br /&gt;
** transmitter modelling (PA compression, heating, splatter)&lt;br /&gt;
** rtl_tcp and GNU Radio as an architectural choice&lt;br /&gt;
** FT8/WSPR and virtual satellites&lt;br /&gt;
** use in training&lt;br /&gt;
** open questions: model validation, scaling, latency and the lack of published source code&lt;br /&gt;
* &#039;&#039;&#039;Notes:&#039;&#039;&#039; No author is credited. The page says its images are AI-generated or from royalty-free sources. Available in a dozen languages (de, fr, it, nl, es, pt, tr, ru, ar, ja, hu).&lt;br /&gt;
&lt;br /&gt;
=== RadioMesh.pl (2026-11-04) ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Link:&#039;&#039;&#039; https://radiomesh.pl/krotkofalarstwo/kazdy-moze-nadawac-nic-nie-idzie-w-eter-simtx-symuluje-fale-krotkie/&lt;br /&gt;
* &#039;&#039;&#039;Author:&#039;&#039;&#039; MarWoj (SP9MAW)&lt;br /&gt;
* &#039;&#039;&#039;Summary:&#039;&#039;&#039; Polish hands-on article (about 6 minutes reading time). It explains how to listen with SDR++ and how to set up your own receiver and station. It covers the antenna options and NEC import, how the server computes each path, an SNR-threshold table by mode, satellites, and the terms of service (pirate and numbers stations and jamming are allowed within limits; unlicensed music and impersonating real stations are not).&lt;br /&gt;
* &#039;&#039;&#039;Facts reported that other coverage does not include:&#039;&#039;&#039;&lt;br /&gt;
** open beta since 14 August 2026&lt;br /&gt;
** download page offered version 0.1.0-alpha-16 on 1 November 2026&lt;br /&gt;
** run by a single private individual in Hungary&lt;br /&gt;
** accounts can be created by e-mail with a code login since 1 November 2026 (previously Discord only)&lt;br /&gt;
** a public receiver in simulated Budapest that needs no account (&amp;lt;code&amp;gt;argon.simtx.net&amp;lt;/code&amp;gt;, port 1240)&lt;br /&gt;
** minimum age 13, with parental consent for minors&lt;br /&gt;
** the author notes the demo video&#039;s route, levels, storm, clock and overdriven transmitter were set by script, and calls it a demonstration&lt;br /&gt;
** a licence is only needed if the simulator&#039;s audio is fed into a real transmitter&lt;br /&gt;
&lt;br /&gt;
=== YouTube video (unverified) ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Link:&#039;&#039;&#039; https://www.youtube.com/watch?v=TQpfMwdHfhc&lt;br /&gt;
* &#039;&#039;&#039;Notes:&#039;&#039;&#039; Title, channel and date have not been verified. Please fill these in.&lt;br /&gt;
&lt;br /&gt;
== Related media ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.youtube.com/watch?v=ZFBshce4I1Y &amp;quot;We broadcast a song through a simulated ionosphere&amp;quot;] (qrmcat): the official demo video embedded or referenced by RTL-SDR Blog, HamRadio.my, TechSpeeltuin and RadioMesh.pl.&lt;br /&gt;
* [https://news.ycombinator.com/item?id=49890503 Hacker News discussion] (referenced by HamRadio.my).&lt;br /&gt;
* [https://simtx.net/ Official site] and [https://wiki.simtx.net/ official wiki].&lt;br /&gt;
&lt;br /&gt;
== Differences between reports ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Topic&lt;br /&gt;
!Reported&lt;br /&gt;
!Source&lt;br /&gt;
|-&lt;br /&gt;
|Desktop app version&lt;br /&gt;
|0.1.0-alpha-14 (29 Oct)&lt;br /&gt;
|HamRadio.my&lt;br /&gt;
|-&lt;br /&gt;
|Desktop app version&lt;br /&gt;
|0.1.0-alpha-16 (1 Nov)&lt;br /&gt;
|RadioMesh.pl&lt;br /&gt;
|-&lt;br /&gt;
|Account creation&lt;br /&gt;
|Discord&lt;br /&gt;
|RTL-SDR Blog, HamRadio.my, TechSpeeltuin&lt;br /&gt;
|-&lt;br /&gt;
|Account creation&lt;br /&gt;
|E-mail login added 1 Nov 2026&lt;br /&gt;
|RadioMesh.pl&lt;br /&gt;
|-&lt;br /&gt;
|Source availability&lt;br /&gt;
|Not presented as open source&lt;br /&gt;
|RTL-SDR Blog, NextTechWorld, RadioMesh.pl&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Main Page]]&lt;/div&gt;</summary>
		<author><name>Sophie-developer</name></author>
	</entry>
	<entry>
		<id>https://wiki.simtx.net/index.php?title=API&amp;diff=2591</id>
		<title>API</title>
		<link rel="alternate" type="text/html" href="https://wiki.simtx.net/index.php?title=API&amp;diff=2591"/>
		<updated>2026-11-04T07:33:45Z</updated>

		<summary type="html">&lt;p&gt;Sophie-developer: Redirected page to SimTX API&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[SimTX_API]]&lt;/div&gt;</summary>
		<author><name>Sophie-developer</name></author>
	</entry>
	<entry>
		<id>https://wiki.simtx.net/index.php?title=User:Admin&amp;diff=2580</id>
		<title>User:Admin</title>
		<link rel="alternate" type="text/html" href="https://wiki.simtx.net/index.php?title=User:Admin&amp;diff=2580"/>
		<updated>2026-10-30T21:53:27Z</updated>

		<summary type="html">&lt;p&gt;Sophie-developer: Protected &amp;quot;User:Admin&amp;quot;: Excessive vandalism: vandalism ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite)) [cascading]&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Administrator of SimTX. This is qrmcat.&lt;/div&gt;</summary>
		<author><name>Sophie-developer</name></author>
	</entry>
	<entry>
		<id>https://wiki.simtx.net/index.php?title=User:Admin&amp;diff=2579</id>
		<title>User:Admin</title>
		<link rel="alternate" type="text/html" href="https://wiki.simtx.net/index.php?title=User:Admin&amp;diff=2579"/>
		<updated>2026-10-30T21:53:07Z</updated>

		<summary type="html">&lt;p&gt;Sophie-developer: get rid of abuse&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Administrator of SimTX. This is qrmcat.&lt;/div&gt;</summary>
		<author><name>Sophie-developer</name></author>
	</entry>
	<entry>
		<id>https://wiki.simtx.net/index.php?title=CLI&amp;diff=2535</id>
		<title>CLI</title>
		<link rel="alternate" type="text/html" href="https://wiki.simtx.net/index.php?title=CLI&amp;diff=2535"/>
		<updated>2026-10-27T20:22:38Z</updated>

		<summary type="html">&lt;p&gt;Sophie-developer: Protected &amp;quot;CLI&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= CLI =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;simtx-cli&amp;lt;/code&amp;gt; is the headless companion to SimTX Transmitter. It can transmit&lt;br /&gt;
audio files, generated white noise, or GNU Radio IQ from one of your persistent&lt;br /&gt;
stations, serve the simulated world over rtl-tcp, manage your stations and&lt;br /&gt;
satellites, predict satellite passes, sign in to a SimTX account, query a&lt;br /&gt;
server, and check for updates. It speaks SimTX client protocol v25.&lt;br /&gt;
&lt;br /&gt;
This document covers every command, option, environment variable, preset key,&lt;br /&gt;
output format, and exit condition.&lt;br /&gt;
&lt;br /&gt;
== Contents ==&lt;br /&gt;
&lt;br /&gt;
* [[#quick start|Quick start]]&lt;br /&gt;
* [[#command summary|Command summary]]&lt;br /&gt;
* [[#output conventions|Output conventions]]&lt;br /&gt;
* [[#global options|Global options]]&lt;br /&gt;
* [[#environment variables|Environment variables]]&lt;br /&gt;
* [[#transmitter commands|Transmitter commands]]&lt;br /&gt;
* [[#receiver command rx|Receiver command: &amp;lt;code&amp;gt;rx&amp;lt;/code&amp;gt;]]&lt;br /&gt;
* [[#station commands stations passes|Station commands: &amp;lt;code&amp;gt;stations&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;passes&amp;lt;/code&amp;gt;]]&lt;br /&gt;
* [[#account command login|Account command: &amp;lt;code&amp;gt;login&amp;lt;/code&amp;gt;]]&lt;br /&gt;
* [[#query commands|Query commands]]&lt;br /&gt;
* [[#version and update commands|Version and update commands]]&lt;br /&gt;
* [[#multiplexed serve mode serve|Multiplexed Serve Mode: &amp;lt;code&amp;gt;serve&amp;lt;/code&amp;gt;]]&lt;br /&gt;
* [[#presets|Presets]]&lt;br /&gt;
* [[#exit status and signals|Exit status and signals]]&lt;br /&gt;
* [[#troubleshooting|Troubleshooting]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Quick start ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Sign in once (stores credentials in the OS keyring by default)&lt;br /&gt;
simtx-cli login&lt;br /&gt;
&lt;br /&gt;
# Create a ground station (or use the app&#039;s station editor)&lt;br /&gt;
simtx-cli --name Home --callsign N0CALL --lat 52.37 --lon 4.90 \&lt;br /&gt;
  --antenna-type efhw stations create&lt;br /&gt;
&lt;br /&gt;
# List your stations (ids, antennas, rigs)&lt;br /&gt;
simtx-cli stations&lt;br /&gt;
&lt;br /&gt;
# Transmit a WAV file on 40 m USB from your station &amp;quot;Home&amp;quot;&lt;br /&gt;
simtx-cli --server-id myserver --station Home audio argon.simtx.net 5556 \&lt;br /&gt;
  7100000 message.wav USB&lt;br /&gt;
&lt;br /&gt;
# Transmit generated white noise on 80 m AM&lt;br /&gt;
simtx-cli --server-id myserver --station Home white argon.simtx.net 5556 3700000 AM_DSB_FC&lt;br /&gt;
&lt;br /&gt;
# Feed IQ from GNU Radio into SimTX on a local loopback port&lt;br /&gt;
simtx-cli --server-id myserver --station Home iq argon.simtx.net 5556 7100000 4567&lt;br /&gt;
&lt;br /&gt;
# Serve the simulated world to SDR++ over rtl-tcp (ad-hoc receiver)&lt;br /&gt;
simtx-cli --server-id myserver rx argon.simtx.net 5556 1234 N0CALL 7100000 1024000&lt;br /&gt;
&lt;br /&gt;
# ... or receive at a persistent station (yours or a PUBLIC one)&lt;br /&gt;
simtx-cli --server-id myserver --station Home rx argon.simtx.net 5556 1234&lt;br /&gt;
&lt;br /&gt;
# Launch a satellite and predict its passes over your station&lt;br /&gt;
simtx-cli --name Cube --callsign CUBE1 --altitude-km 550 --inclination 97.6 stations launch&lt;br /&gt;
simtx-cli --sat Cube --station Home passes&lt;br /&gt;
&lt;br /&gt;
# One-shot queries&lt;br /&gt;
simtx-cli stations argon.simtx.net 5556&lt;br /&gt;
simtx-cli health argon.simtx.net 5556&lt;br /&gt;
simtx-cli catalog argon.simtx.net 5556&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Command summary ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Command&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;&lt;br /&gt;
| Print the local build version. No network access.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt;&lt;br /&gt;
| Print update metadata and whether an update is available.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;login&amp;lt;/code&amp;gt;&lt;br /&gt;
| Sign in with the device authorization flow and store credentials.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;audio&amp;lt;/code&amp;gt;&lt;br /&gt;
| Stream a local audio file from one of your stations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;white&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whitenoise&amp;lt;/code&amp;gt;&lt;br /&gt;
| Transmit a generated white-noise signal from one of your stations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;iq&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;gnuradio&amp;lt;/code&amp;gt;&lt;br /&gt;
| Stream IQ from a local GNU Radio TCP sink via one of your stations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rx&amp;lt;/code&amp;gt;&lt;br /&gt;
| Serve the simulated world over rtl-tcp (ad-hoc or station-bound).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;stations&amp;lt;/code&amp;gt;&lt;br /&gt;
| List/create/launch/delete/deorbit your stations, or (with &amp;lt;code&amp;gt;&amp;lt;host&amp;gt; &amp;lt;port&amp;gt;&amp;lt;/code&amp;gt;) fetch a server&#039;s live station list.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;passes&amp;lt;/code&amp;gt;&lt;br /&gt;
| Predict passes of a satellite over a ground station.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;health&amp;lt;/code&amp;gt;&lt;br /&gt;
| Fetch a server health report as JSON.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;catalog&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;catalogue&amp;lt;/code&amp;gt;&lt;br /&gt;
| Fetch the catalog listing as JSON.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;serve&amp;lt;/code&amp;gt;&lt;br /&gt;
| Run a multiplexed NDJSON session engine for game integration.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
All commands except &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; require an exact version match with&lt;br /&gt;
the update service. If the CLI is outdated or the update service is&lt;br /&gt;
unreachable, the command refuses to run. Upgrade the CLI, then retry.&lt;br /&gt;
&lt;br /&gt;
Unknown commands fail before any network access.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Output conventions ==&lt;br /&gt;
&lt;br /&gt;
* Human-readable logs and progress messages always go to &#039;&#039;&#039;stderr&#039;&#039;&#039;.&lt;br /&gt;
* Machine-readable results go to &#039;&#039;&#039;stdout&#039;&#039;&#039;.&lt;br /&gt;
* Query results and update metadata are printed as one compact line beginning&lt;br /&gt;
with &amp;lt;code&amp;gt;J:&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
  simtx-cli stations argon.simtx.net 5556 | grep &#039;^J:&#039; | cut -c3- | jq .&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; prints plain text, not JSON.&lt;br /&gt;
* &amp;lt;code&amp;gt;login&amp;lt;/code&amp;gt; prints the verification URL and code as plain text.&lt;br /&gt;
* Transmitter commands (&amp;lt;code&amp;gt;audio&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;white&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;iq&amp;lt;/code&amp;gt;) print nothing to stdout unless&lt;br /&gt;
&amp;lt;code&amp;gt;--telemetry-json&amp;lt;/code&amp;gt; is enabled.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Global options ==&lt;br /&gt;
&lt;br /&gt;
These options work before or after the subcommand. Explicit flags win over&lt;br /&gt;
environment variables, which win over preset values, which win over built-in&lt;br /&gt;
defaults.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Option&lt;br /&gt;
! Default&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--lat DEG&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;52.3676&amp;lt;/code&amp;gt;&lt;br /&gt;
| Station latitude, &amp;lt;code&amp;gt;-90..90&amp;lt;/code&amp;gt;. Receiver default is &amp;lt;code&amp;gt;47.50&amp;lt;/code&amp;gt;; see &amp;lt;code&amp;gt;rx&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--lon DEG&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;4.9041&amp;lt;/code&amp;gt;&lt;br /&gt;
| Station longitude, &amp;lt;code&amp;gt;-180..180&amp;lt;/code&amp;gt;. Receiver default is &amp;lt;code&amp;gt;19.04&amp;lt;/code&amp;gt;; see &amp;lt;code&amp;gt;rx&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--power W&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt;&lt;br /&gt;
| Transmit power in watts.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--sample-rate HZ&amp;lt;/code&amp;gt;&lt;br /&gt;
| auto (&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;)&lt;br /&gt;
| Transmission sample rate (&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; = automatic wire rate based on mode/bandwidth).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--rate HZ&amp;lt;/code&amp;gt;&lt;br /&gt;
| unset&lt;br /&gt;
| Alias for &amp;lt;code&amp;gt;--sample-rate&amp;lt;/code&amp;gt; when greater than zero.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--gain GAIN&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0.9&amp;lt;/code&amp;gt;&lt;br /&gt;
| Transmission audio/carrier gain (or from preset &amp;lt;code&amp;gt;source.gain&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--duty-cycle DC&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0.5&amp;lt;/code&amp;gt;&lt;br /&gt;
| PA duty cycle &amp;lt;code&amp;gt;0.0..1.0&amp;lt;/code&amp;gt; (or from preset &amp;lt;code&amp;gt;source.dutyCycle&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--radio-preset P&amp;lt;/code&amp;gt;&lt;br /&gt;
| empty&lt;br /&gt;
| Radio model preset override (&amp;lt;code&amp;gt;GENERIC_HF&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CLEAN_LAB&amp;lt;/code&amp;gt;, etc.).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--debug&amp;lt;/code&amp;gt;&lt;br /&gt;
| off&lt;br /&gt;
| Verbose logging. Also logs every telemetry frame instead of only the first.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--telemetry-json&amp;lt;/code&amp;gt;&lt;br /&gt;
| off&lt;br /&gt;
| Stream every transmitter telemetry frame to stdout as JSON.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--plain-tcp&amp;lt;/code&amp;gt;&lt;br /&gt;
| off&lt;br /&gt;
| Connect using unencrypted TCP instead of TLS on custom server ports.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--account-url URL&amp;lt;/code&amp;gt;&lt;br /&gt;
| official service&lt;br /&gt;
| Account service to use for login and tickets.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--server-id ID&amp;lt;/code&amp;gt;&lt;br /&gt;
| empty&lt;br /&gt;
| Game server ID used to mint an authenticated ticket. Requires &amp;lt;code&amp;gt;login&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--ticket T&amp;lt;/code&amp;gt;&lt;br /&gt;
| empty&lt;br /&gt;
| Use a literal game ticket instead of account authentication.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--auth-file PATH&amp;lt;/code&amp;gt;&lt;br /&gt;
| empty&lt;br /&gt;
| Store credentials in a plaintext JSON file instead of the OS keyring.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--preset FILE&amp;lt;/code&amp;gt;&lt;br /&gt;
| empty&lt;br /&gt;
| Load defaults from a preset file.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--save-preset OUT&amp;lt;/code&amp;gt;&lt;br /&gt;
| empty&lt;br /&gt;
| Write the effective settings to a preset file and continue.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Station options ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Option&lt;br /&gt;
! Default&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--station REF&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;SIMTX_STATION&amp;lt;/code&amp;gt;&lt;br /&gt;
| Persistent station id or name (or callsign). Required for TX; makes &amp;lt;code&amp;gt;rx&amp;lt;/code&amp;gt; station-bound.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--antenna REF&amp;lt;/code&amp;gt;&lt;br /&gt;
| first antenna&lt;br /&gt;
| Station antenna id or name.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--rig REF&amp;lt;/code&amp;gt;&lt;br /&gt;
| none&lt;br /&gt;
| Station rig id or name. Without a rig the generic HF defaults and the account PA limit apply.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--track ID&amp;lt;/code&amp;gt;&lt;br /&gt;
| none&lt;br /&gt;
| Point the antenna at and Doppler-correct toward this station id (usually a satellite).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--name N&amp;lt;/code&amp;gt;&lt;br /&gt;
| —&lt;br /&gt;
| &amp;lt;code&amp;gt;stations create&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;stations launch&amp;lt;/code&amp;gt;: station name.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--callsign C&amp;lt;/code&amp;gt;&lt;br /&gt;
| —&lt;br /&gt;
| &amp;lt;code&amp;gt;stations create&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;stations launch&amp;lt;/code&amp;gt;: station callsign.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--visibility V&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;PUBLIC&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;stations create&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;stations launch&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;PUBLIC&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;UNLISTED&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--altitude-km KM&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;550&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;stations launch&amp;lt;/code&amp;gt;: circular orbit altitude above the 6371 km sphere.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--inclination DEG&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;97.6&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;stations launch&amp;lt;/code&amp;gt;: orbit inclination.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--raan DEG&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;stations launch&amp;lt;/code&amp;gt;: right ascension of the ascending node.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--sat REF&amp;lt;/code&amp;gt;&lt;br /&gt;
| —&lt;br /&gt;
| &amp;lt;code&amp;gt;passes&amp;lt;/code&amp;gt;: satellite id or name (yours or the public catalog).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--hours H&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;24&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;passes&amp;lt;/code&amp;gt;: prediction window (max 168).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--min-el DEG&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;passes&amp;lt;/code&amp;gt;: minimum elevation.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--yes&amp;lt;/code&amp;gt;&lt;br /&gt;
| off&lt;br /&gt;
| &amp;lt;code&amp;gt;stations deorbit&amp;lt;/code&amp;gt;: fire the burn without the confirmation question.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Boolean options accept &amp;lt;code&amp;gt;--flag&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;--flag=true&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;--flag=false&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Flags can appear before or after the subcommand. Use &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt; to stop flag parsing&lt;br /&gt;
before positional values that begin with &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Antenna options ===&lt;br /&gt;
&lt;br /&gt;
Antenna options describe the inline antenna of &#039;&#039;&#039;ad-hoc receivers&#039;&#039;&#039; (&amp;lt;code&amp;gt;rx&amp;lt;/code&amp;gt;&lt;br /&gt;
without &amp;lt;code&amp;gt;--station&amp;lt;/code&amp;gt;) and the first antenna of &amp;lt;code&amp;gt;stations create&amp;lt;/code&amp;gt;. Transmissions&lt;br /&gt;
always use the antenna stored on the station, so these options do not apply to&lt;br /&gt;
&amp;lt;code&amp;gt;audio&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;white&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;iq&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Option&lt;br /&gt;
! Default&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--antenna-type TYPE&amp;lt;/code&amp;gt;&lt;br /&gt;
| default EFHW&lt;br /&gt;
| Antenna template. See the list below.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--antenna-height M&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt;&lt;br /&gt;
| Antenna height in metres.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--wire-length M&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Wire or element length in metres. &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; selects a resonant length.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--azimuth DEG&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Azimuth in degrees clockwise from north.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--feedline-loss DB&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Feedline loss in dB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--nec-deck PATH&amp;lt;/code&amp;gt;&lt;br /&gt;
| empty&lt;br /&gt;
| Path to a custom NEC-2 deck file (.nec). Alias: &amp;lt;code&amp;gt;--nec&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Antenna types (case-insensitive, &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; are interchangeable):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dipole&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;inverted-v&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vertical&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;yagi-3el&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;yagi-5el&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;loop&amp;lt;/code&amp;gt;,&lt;br /&gt;
&amp;lt;code&amp;gt;beverage&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;longwire&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;efhw&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Leaving &amp;lt;code&amp;gt;--antenna-type&amp;lt;/code&amp;gt; empty uses the default shortwave EFHW antenna.&lt;br /&gt;
&lt;br /&gt;
Built-in antenna templates automatically synthesize a resonant NEC-2 deck at the&lt;br /&gt;
transmission frequency so servers requiring NEC models radiate properly without&lt;br /&gt;
manual deck configuration. Supplying &amp;lt;code&amp;gt;--nec-deck&amp;lt;/code&amp;gt; (or &amp;lt;code&amp;gt;--nec&amp;lt;/code&amp;gt;) overrides the&lt;br /&gt;
built-in template with a custom NEC-2 deck.&lt;br /&gt;
&lt;br /&gt;
=== Identity and authentication ===&lt;br /&gt;
&lt;br /&gt;
* With no &amp;lt;code&amp;gt;--server-id&amp;lt;/code&amp;gt; and no &amp;lt;code&amp;gt;--ticket&amp;lt;/code&amp;gt;, sessions are anonymous. Anonymous&lt;br /&gt;
sessions are intended for local or test servers and may be rejected by&lt;br /&gt;
official servers. Anonymous sessions are receive-only: transmitting needs a&lt;br /&gt;
station-bound ticket.&lt;br /&gt;
* Transmitter tickets are minted bound to &amp;lt;code&amp;gt;--station&amp;lt;/code&amp;gt; (and the resolved&lt;br /&gt;
antenna and rig); every reconnect mints a fresh bound ticket. A literal&lt;br /&gt;
&amp;lt;code&amp;gt;--ticket&amp;lt;/code&amp;gt; must already be bound to the same station, and then &amp;lt;code&amp;gt;--station&amp;lt;/code&amp;gt;,&lt;br /&gt;
&amp;lt;code&amp;gt;--antenna&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;--rig&amp;lt;/code&amp;gt; must be ids.&lt;br /&gt;
* Station management (&amp;lt;code&amp;gt;stations create/launch/delete/deorbit&amp;lt;/code&amp;gt;) needs the&lt;br /&gt;
&amp;lt;code&amp;gt;station.manage&amp;lt;/code&amp;gt; scope. Sessions signed in before stations existed lack it;&lt;br /&gt;
run &amp;lt;code&amp;gt;simtx-cli login&amp;lt;/code&amp;gt; again (after &amp;lt;code&amp;gt;simtx-cli&amp;lt;/code&amp;gt; has been updated) when the&lt;br /&gt;
account service answers &amp;lt;code&amp;gt;scope_required&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;--server-id&amp;lt;/code&amp;gt; mints a fresh game ticket through the signed-in account. Run&lt;br /&gt;
&amp;lt;code&amp;gt;simtx-cli login&amp;lt;/code&amp;gt; first.&lt;br /&gt;
* &amp;lt;code&amp;gt;--ticket&amp;lt;/code&amp;gt; passes a literal ticket. For long-lived sessions such as &amp;lt;code&amp;gt;rx&amp;lt;/code&amp;gt;,&lt;br /&gt;
a reused single-use ticket may stop working after the first reconnect.&lt;br /&gt;
* &amp;lt;code&amp;gt;--auth-file PATH&amp;lt;/code&amp;gt; (or &amp;lt;code&amp;gt;SIMTX_AUTH_FILE&amp;lt;/code&amp;gt;) stores the account session in a&lt;br /&gt;
plaintext JSON file with owner-only permissions. This is intended for&lt;br /&gt;
headless servers without an OS keyring. Anyone who can read that file can&lt;br /&gt;
act as the signed-in device.&lt;br /&gt;
&lt;br /&gt;
=== Preset precedence and positional filling ===&lt;br /&gt;
&lt;br /&gt;
Precedence is:&lt;br /&gt;
&lt;br /&gt;
# Explicit command-line flags and positional arguments.&lt;br /&gt;
# &amp;lt;code&amp;gt;SIMTX_*&amp;lt;/code&amp;gt; environment variables.&lt;br /&gt;
# Values loaded with &amp;lt;code&amp;gt;--preset&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Built-in defaults.&lt;br /&gt;
&lt;br /&gt;
Missing trailing positional arguments are filled left-to-right from preset&lt;br /&gt;
keys. Leading positionals cannot be skipped. For example, if a preset provides&lt;br /&gt;
&amp;lt;code&amp;gt;cli.audioFile&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;rf.modulation&amp;lt;/code&amp;gt;, you can supply only the connection and&lt;br /&gt;
station positionals:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
simtx-cli --preset station.stxpreset audio argon.simtx.net 5556 7100000&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The audio file, modulation, bandwidth, and low cut then come from the preset.&lt;br /&gt;
A preset containing every required positional also allows a bare command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
simtx-cli --preset station.stxpreset audio&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Environment variables ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Variable&lt;br /&gt;
! Equivalent option&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SIMTX_TX_LAT&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--lat&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SIMTX_TX_LON&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--lon&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SIMTX_TX_POWER&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--power&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SIMTX_SAMPLE_RATE&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--sample-rate&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SIMTX_PLAIN_TCP&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--plain-tcp&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SIMTX_FORCE_PLAIN_TCP&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--plain-tcp&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SIMTX_ACCOUNT_URL&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--account-url&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SIMTX_AUTH_FILE&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--auth-file&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SIMTX_SERVICE_CREDENTIAL&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--service-credential&amp;lt;/code&amp;gt; (receiver only)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SIMTX_STATION&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--station&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Environment variables apply to every command. The receiver location&lt;br /&gt;
(&amp;lt;code&amp;gt;47.50&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;19.04&amp;lt;/code&amp;gt;) only applies when none of &amp;lt;code&amp;gt;--lat&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--lon&amp;lt;/code&amp;gt;,&lt;br /&gt;
&amp;lt;code&amp;gt;SIMTX_TX_LAT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SIMTX_TX_LON&amp;lt;/code&amp;gt;, or the preset latitude/longitude keys are set.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Transmitter commands ==&lt;br /&gt;
&lt;br /&gt;
All transmitter commands run on one of your persistent stations:&lt;br /&gt;
&amp;lt;code&amp;gt;--station&amp;lt;/code&amp;gt; is required (else the command fails with &amp;quot;transmitting needs&lt;br /&gt;
--station&amp;quot;), together with &amp;lt;code&amp;gt;--server-id&amp;lt;/code&amp;gt; (or a station-bound &amp;lt;code&amp;gt;--ticket&amp;lt;/code&amp;gt;). The&lt;br /&gt;
station dictates callsign, location, antenna and pointing, the PA cap and the&lt;br /&gt;
rig&#039;s realism; the session chooses modulation, frequency, power (up to the&lt;br /&gt;
cap), source, sample rate, gain, bandwidth, low cut, tone and duty. Only the PA&lt;br /&gt;
knobs you give (a radio preset, positional overrides or &amp;lt;code&amp;gt;rf.*&amp;lt;/code&amp;gt; preset keys)&lt;br /&gt;
are sent; with a rig the server takes final drive, audio compression,&lt;br /&gt;
frequency offset and AM index from them and everything else from the rig.&lt;br /&gt;
Ad-hoc transmission (inline callsign/location/antenna) no longer exists.&lt;br /&gt;
&lt;br /&gt;
Transmitter commands use the global power and sample-rate options and run&lt;br /&gt;
until interrupted with Ctrl-C (SIGINT) or SIGTERM or until the session ends.&lt;br /&gt;
The server confirms the station with a &amp;lt;code&amp;gt;session status&amp;lt;/code&amp;gt; log line (&amp;lt;code&amp;gt;BOUND&amp;lt;/code&amp;gt;,&lt;br /&gt;
station name, callsign, PA cap); rejections carry the server&#039;s reason and code&lt;br /&gt;
(for example &amp;lt;code&amp;gt;FORBIDDEN&amp;lt;/code&amp;gt; for a station that is not yours or a ticket bound to&lt;br /&gt;
another station).&lt;br /&gt;
&lt;br /&gt;
Ports must be in &amp;lt;code&amp;gt;1..65535&amp;lt;/code&amp;gt;. Frequency must be positive and power must be&lt;br /&gt;
non-negative. Sample rates at or below zero fall back to &amp;lt;code&amp;gt;48000&amp;lt;/code&amp;gt;. Bandwidth values below the modulation minimum&lt;br /&gt;
are raised to the minimum; values above 10,000,000 Hz are capped.&lt;br /&gt;
&lt;br /&gt;
A session can be queued. The CLI logs queue position, acceptance, live update&lt;br /&gt;
acknowledgements, kicks, and telemetry.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;audio&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
simtx-cli [global flags] --station S audio &amp;lt;host&amp;gt; &amp;lt;port&amp;gt; &amp;lt;freqHz&amp;gt; &amp;lt;file&amp;gt; \&lt;br /&gt;
  [MOD] [BW] [LOWCUT] [PRESET|DRIVE ...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Streams a local audio file.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;host&amp;gt; &amp;lt;port&amp;gt;&amp;lt;/code&amp;gt; — SimTX server address.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;freqHz&amp;gt;&amp;lt;/code&amp;gt; — transmit frequency in Hz; must be positive.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;file&amp;gt;&amp;lt;/code&amp;gt; — local WAV, AIFF, or MP3 file.&lt;br /&gt;
* &amp;lt;code&amp;gt;[MOD]&amp;lt;/code&amp;gt; — modulation; defaults to &amp;lt;code&amp;gt;AM_DSB_FC&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;[BW]&amp;lt;/code&amp;gt; — occupied bandwidth in Hz; defaults to the modulation&#039;s typical&lt;br /&gt;
bandwidth.&lt;br /&gt;
* &amp;lt;code&amp;gt;[LOWCUT]&amp;lt;/code&amp;gt; — audio low cut in Hz; defaults to the modulation&#039;s typical&lt;br /&gt;
low cut.&lt;br /&gt;
* &amp;lt;code&amp;gt;[PRESET|DRIVE ...]&amp;lt;/code&amp;gt; — optional radio preset and PA knobs; see&lt;br /&gt;
[[#radio presets and pa knobs|Radio presets and PA knobs]].&lt;br /&gt;
&lt;br /&gt;
The file is streamed once. The session ends when the file ends, when the&lt;br /&gt;
server disconnects, or when you interrupt the command. For WFM, only the first&lt;br /&gt;
channel is used.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
simtx-cli --server-id myserver --station Home audio argon.simtx.net 5556 7100000 \&lt;br /&gt;
  message.wav USB&lt;br /&gt;
&lt;br /&gt;
simtx-cli --server-id myserver --station Home --antenna Yagi --rig IC-7300 \&lt;br /&gt;
  audio argon.simtx.net 5556 145500000 fm.wav NFM 12500 200&lt;br /&gt;
&lt;br /&gt;
simtx-cli --server-id myserver --station Home audio argon.simtx.net 5556 7100000 \&lt;br /&gt;
  message.wav LSB 2700 350 ICOM_IC_7300&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;white&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;whitenoise&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
simtx-cli [global flags] --station S white &amp;lt;host&amp;gt; &amp;lt;port&amp;gt; &amp;lt;freqHz&amp;gt; \&lt;br /&gt;
  [MOD] [BW] [LOWCUT] [PRESET|DRIVE ...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Transmits a generated white-noise signal. No audio samples are sent by the&lt;br /&gt;
client; the signal is generated for the session. Positional arguments are the&lt;br /&gt;
same as &amp;lt;code&amp;gt;audio&amp;lt;/code&amp;gt; without the file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
simtx-cli --server-id myserver --station Home white argon.simtx.net 5556 3700000 AM_DSB_FC 10000 80&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;iq&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;gnuradio&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
simtx-cli [global flags] --station S iq &amp;lt;host&amp;gt; &amp;lt;port&amp;gt; &amp;lt;freqHz&amp;gt; &amp;lt;localIqPort&amp;gt; \&lt;br /&gt;
  [sampleRate] [BW] [PRESET|DRIVE ...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Streams IQ from a local GNU Radio TCP sink into a transmitter session.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;localIqPort&amp;gt;&amp;lt;/code&amp;gt; — TCP port on &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; where GNU Radio connects.&lt;br /&gt;
* &amp;lt;code&amp;gt;[sampleRate]&amp;lt;/code&amp;gt; — IQ sample rate. Overrides the global sample rate.&lt;br /&gt;
* &amp;lt;code&amp;gt;[BW]&amp;lt;/code&amp;gt; — transmit bandwidth in Hz; defaults to the sample rate.&lt;br /&gt;
* &amp;lt;code&amp;gt;[PRESET|DRIVE ...]&amp;lt;/code&amp;gt; — optional radio preset and PA knobs.&lt;br /&gt;
&lt;br /&gt;
The input stream must be interleaved little-endian 32-bit float I/Q pairs&lt;br /&gt;
(&amp;lt;code&amp;gt;gr_complex&amp;lt;/code&amp;gt;). The CLI listens only on loopback. One producer can stream at a&lt;br /&gt;
time; a restarted flowgraph can reconnect and take over.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
simtx-cli --server-id myserver --station Home iq argon.simtx.net 5556 7100000 4567&lt;br /&gt;
&lt;br /&gt;
simtx-cli --server-id myserver --station Home iq argon.simtx.net 5556 7100000 4567 \&lt;br /&gt;
  96000 96000 GENERIC_HF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In GNU Radio, use a TCP sink pointed at &amp;lt;code&amp;gt;127.0.0.1:4567&amp;lt;/code&amp;gt; with the matching&lt;br /&gt;
sample rate and complex float output.&lt;br /&gt;
&lt;br /&gt;
=== Modulations ===&lt;br /&gt;
&lt;br /&gt;
Modulation names are case-insensitive. The default is &amp;lt;code&amp;gt;AM_DSB_FC&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Common name&lt;br /&gt;
! Typical bandwidth&lt;br /&gt;
! Typical low cut&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AM_DSB_FC&amp;lt;/code&amp;gt;&lt;br /&gt;
| AM double sideband, full carrier&lt;br /&gt;
| 10000 Hz&lt;br /&gt;
| 80 Hz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AM_DSB_SC&amp;lt;/code&amp;gt;&lt;br /&gt;
| AM double sideband, suppressed carrier&lt;br /&gt;
| 6000 Hz&lt;br /&gt;
| 100 Hz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;USB&amp;lt;/code&amp;gt;&lt;br /&gt;
| Upper sideband&lt;br /&gt;
| 2700 Hz&lt;br /&gt;
| 350 Hz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;LSB&amp;lt;/code&amp;gt;&lt;br /&gt;
| Lower sideband&lt;br /&gt;
| 2700 Hz&lt;br /&gt;
| 350 Hz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CW&amp;lt;/code&amp;gt;&lt;br /&gt;
| Continuous wave&lt;br /&gt;
| 150 Hz&lt;br /&gt;
| 300 Hz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;NFM&amp;lt;/code&amp;gt;&lt;br /&gt;
| Narrow FM&lt;br /&gt;
| 12500 Hz&lt;br /&gt;
| 200 Hz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;WFM&amp;lt;/code&amp;gt;&lt;br /&gt;
| Wide FM&lt;br /&gt;
| 180000 Hz&lt;br /&gt;
| 30 Hz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;IQ&amp;lt;/code&amp;gt;&lt;br /&gt;
| External complex IQ&lt;br /&gt;
| 48000 Hz&lt;br /&gt;
| 0 Hz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;WSPR&amp;lt;/code&amp;gt;&lt;br /&gt;
| Weak Signal Propagation Reporter&lt;br /&gt;
| 6 Hz&lt;br /&gt;
| 0.5 Hz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;FT8&amp;lt;/code&amp;gt;&lt;br /&gt;
| Franke-Taylor FT8&lt;br /&gt;
| 50 Hz&lt;br /&gt;
| 20 Hz&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Radio presets and PA knobs ===&lt;br /&gt;
&lt;br /&gt;
The optional trailing arguments start with a radio preset name, followed by&lt;br /&gt;
up to 15 numeric overrides in the order shown below. The preset name is&lt;br /&gt;
case-insensitive and &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; are interchangeable. Missing or unparseable&lt;br /&gt;
values use the preset&#039;s defaults.&lt;br /&gt;
&lt;br /&gt;
Which knobs are sent: naming a radio preset (positionally, with&lt;br /&gt;
&amp;lt;code&amp;gt;--radio-preset&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;rf.radioPreset&amp;lt;/code&amp;gt;) sends all 15; otherwise only the&lt;br /&gt;
positional values and &amp;lt;code&amp;gt;rf.*&amp;lt;/code&amp;gt; preset keys you give are sent and the rest come&lt;br /&gt;
from the station&#039;s rig (or the generic HF preset when the session has no rig).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Preset&lt;br /&gt;
! Character&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GENERIC_HF&amp;lt;/code&amp;gt;&lt;br /&gt;
| Generic HF transceiver&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CLEAN_LAB&amp;lt;/code&amp;gt;&lt;br /&gt;
| Clean lab exciter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ICOM_IC_7300&amp;lt;/code&amp;gt;&lt;br /&gt;
| Icom IC-7300 class HF rig&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ICOM_IC_705&amp;lt;/code&amp;gt;&lt;br /&gt;
| Icom IC-705 class QRP SDR&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ICOM_IC_7610&amp;lt;/code&amp;gt;&lt;br /&gt;
| Icom IC-7610 class base SDR&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;YAESU_FTDX10&amp;lt;/code&amp;gt;&lt;br /&gt;
| Yaesu FTDX10 class HF SDR&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ELECRAFT_KX3&amp;lt;/code&amp;gt;&lt;br /&gt;
| Elecraft KX2/KX3 class QRP&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;YAESU_FT_817&amp;lt;/code&amp;gt;&lt;br /&gt;
| Yaesu FT-817/818 class QRP&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;KENWOOD_TS_590&amp;lt;/code&amp;gt;&lt;br /&gt;
| Kenwood TS-590 class HF rig&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;XIEGU_G90&amp;lt;/code&amp;gt;&lt;br /&gt;
| Xiegu G90 class portable HF&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;USDX_QRP&amp;lt;/code&amp;gt;&lt;br /&gt;
| (tr)uSDX / uSDX QRP Class-E&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MIL_MANPACK&amp;lt;/code&amp;gt;&lt;br /&gt;
| Rugged HF manpack&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;VINTAGE_TUBE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Vintage tube SSB&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;COLLINS_KWM2&amp;lt;/code&amp;gt;&lt;br /&gt;
| Collins KWM-2 class tube SSB&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;BOAT_ANCHOR_AM&amp;lt;/code&amp;gt;&lt;br /&gt;
| Vintage AM boatanchor&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CB_EXPORT_AM&amp;lt;/code&amp;gt;&lt;br /&gt;
| Overdriven export AM/SSB&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;VHF_HANDHELD_FM&amp;lt;/code&amp;gt;&lt;br /&gt;
| Budget VHF/UHF handheld FM&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;HOME_BREW_CLASS_E_AM&amp;lt;/code&amp;gt;&lt;br /&gt;
| Homebrew Class-E AM&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DIRTY_DRIVER&amp;lt;/code&amp;gt;&lt;br /&gt;
| Overdriven driver / poor ALC&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Numeric override order:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! #&lt;br /&gt;
! Knob&lt;br /&gt;
! Unit&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Final drive&lt;br /&gt;
| dB&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| PA headroom&lt;br /&gt;
| dB&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Audio compression&lt;br /&gt;
| dB&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| PA softness&lt;br /&gt;
| —&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| PA AM/PM&lt;br /&gt;
| degrees&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Carrier leak&lt;br /&gt;
| dB&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| Opposite-sideband suppression&lt;br /&gt;
| dB&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| Frequency offset&lt;br /&gt;
| Hz&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| Mains hum level&lt;br /&gt;
| dB&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| Mains hum frequency&lt;br /&gt;
| Hz&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| AM modulation index&lt;br /&gt;
| —&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| PA supply sag&lt;br /&gt;
| dB&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| TX noise floor&lt;br /&gt;
| dB&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| Oscillator phase noise&lt;br /&gt;
| dB&lt;br /&gt;
|-&lt;br /&gt;
| 15&lt;br /&gt;
| CW key rise time&lt;br /&gt;
| ms&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example: &amp;lt;code&amp;gt;... USB 2700 350 ICOM_IC_7300 1.5 9&amp;lt;/code&amp;gt; selects the IC-7300 preset&lt;br /&gt;
and overrides final drive to 1.5 dB and PA headroom to 9 dB.&lt;br /&gt;
&lt;br /&gt;
=== Telemetry ===&lt;br /&gt;
&lt;br /&gt;
Transmitter sessions receive server-reported telemetry. By default the first&lt;br /&gt;
frame is logged at info level and later frames at debug level. Use &amp;lt;code&amp;gt;--debug&amp;lt;/code&amp;gt; to&lt;br /&gt;
log every frame.&lt;br /&gt;
&lt;br /&gt;
With &amp;lt;code&amp;gt;--telemetry-json&amp;lt;/code&amp;gt;, every frame is also written to stdout as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
J:{&amp;quot;type&amp;quot;:&amp;quot;telemetry&amp;quot;,&amp;quot;telemetry&amp;quot;:{...}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The full telemetry object:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! JSON field&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sequence&amp;lt;/code&amp;gt;&lt;br /&gt;
| Frame sequence number.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ServerTimeMillis&amp;lt;/code&amp;gt;&lt;br /&gt;
| Server timestamp in milliseconds.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ActualFrequencyHz&amp;lt;/code&amp;gt;&lt;br /&gt;
| Actual transmit frequency.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RequestedPowerWatts&amp;lt;/code&amp;gt;&lt;br /&gt;
| Requested power.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ForwardPowerWatts&amp;lt;/code&amp;gt;&lt;br /&gt;
| Forward power at the finals.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DeliveredPowerWatts&amp;lt;/code&amp;gt;&lt;br /&gt;
| Delivered power.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ReflectedPowerWatts&amp;lt;/code&amp;gt;&lt;br /&gt;
| Reflected power.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;VSWR&amp;lt;/code&amp;gt;&lt;br /&gt;
| Standing-wave ratio.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MismatchLossDb&amp;lt;/code&amp;gt;&lt;br /&gt;
| Mismatch loss in dB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TransformerLossDb&amp;lt;/code&amp;gt;&lt;br /&gt;
| Transformer loss in dB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;FoldbackLossDb&amp;lt;/code&amp;gt;&lt;br /&gt;
| Foldback loss in dB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AlcDb&amp;lt;/code&amp;gt;&lt;br /&gt;
| Automatic level control, in dB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;BufferSeconds&amp;lt;/code&amp;gt;&lt;br /&gt;
| Server-side buffer depth in seconds.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;FinalsTemperatureC&amp;lt;/code&amp;gt;&lt;br /&gt;
| Finals temperature in °C.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ThermalFoldbackDb&amp;lt;/code&amp;gt;&lt;br /&gt;
| Thermal foldback in dB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;PaCompressionDb&amp;lt;/code&amp;gt;&lt;br /&gt;
| PA compression in dB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;PaHeatWatts&amp;lt;/code&amp;gt;&lt;br /&gt;
| PA heat dissipation in watts.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;PaEfficiencyPercent&amp;lt;/code&amp;gt;&lt;br /&gt;
| PA efficiency in percent.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;PaThermalFaultActive&amp;lt;/code&amp;gt;&lt;br /&gt;
| True when the PA thermal fault is active.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Human-readable log lines use these short field names: &amp;lt;code&amp;gt;seq&amp;lt;/code&amp;gt;,&lt;br /&gt;
&amp;lt;code&amp;gt;serverTimeMillis&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;freqHz&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;requestedW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;forwardW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;deliveredW&amp;lt;/code&amp;gt;,&lt;br /&gt;
&amp;lt;code&amp;gt;reflectedW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vswr&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mismatchLossDb&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;transformerLossDb&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;foldbackLossDb&amp;lt;/code&amp;gt;,&lt;br /&gt;
&amp;lt;code&amp;gt;alcDb&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bufferS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tempC&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;thermalFoldbackDb&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;paCompressionDb&amp;lt;/code&amp;gt;,&lt;br /&gt;
&amp;lt;code&amp;gt;paHeatW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;paEfficiencyPct&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;paThermalFault&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
simtx-cli --telemetry-json --server-id myserver --station Home audio argon.simtx.net 5556 \&lt;br /&gt;
  7100000 message.wav USB \&lt;br /&gt;
  | grep &#039;^J:&#039; | cut -c3- | jq &#039;.telemetry.FinalsTemperatureC&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Receiver command: &amp;lt;code&amp;gt;rx&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
simtx-cli [global flags] rx &amp;lt;simtxHost&amp;gt; &amp;lt;simtxPort&amp;gt; [rtlTcpPort] [callsign] \&lt;br /&gt;
  [centerHz] [bandwidthHz]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Serves the simulated world over rtl-tcp so an SDR application such as SDR++&lt;br /&gt;
can tune around the requested center frequency and bandwidth. Point the SDR&lt;br /&gt;
client at the local rtl-tcp endpoint.&lt;br /&gt;
&lt;br /&gt;
Defaults:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Positional&lt;br /&gt;
! Default&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rtlTcpPort&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;1234&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;callsign&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;RTLTCP&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;centerHz&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;7100000&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;bandwidthHz&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;1024000&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| location&lt;br /&gt;
| Budapest (&amp;lt;code&amp;gt;47.50&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;19.04&amp;lt;/code&amp;gt;)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Without &amp;lt;code&amp;gt;--station&amp;lt;/code&amp;gt; the receiver is ad-hoc: it uses the antenna options, the&lt;br /&gt;
callsign positional and &amp;lt;code&amp;gt;--lat&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--lon&amp;lt;/code&amp;gt;, and works anonymously. With&lt;br /&gt;
&amp;lt;code&amp;gt;--station&amp;lt;/code&amp;gt; (your own station by id or name, or someone else&#039;s PUBLIC station&lt;br /&gt;
by id) every upstream session mints a fresh receiver ticket bound to that&lt;br /&gt;
station (needs &amp;lt;code&amp;gt;--server-id&amp;lt;/code&amp;gt;, or a station-bound &amp;lt;code&amp;gt;--ticket&amp;lt;/code&amp;gt;): the station&#039;s&lt;br /&gt;
location, antenna and rig apply and the callsign positional and antenna&lt;br /&gt;
options are ignored. &amp;lt;code&amp;gt;--antenna&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--rig&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;--track&amp;lt;/code&amp;gt; work as for TX.&lt;br /&gt;
&amp;lt;code&amp;gt;--timestamped&amp;lt;/code&amp;gt; sets the v25 &amp;lt;code&amp;gt;timestamped&amp;lt;/code&amp;gt; flag of the receiver session (there&lt;br /&gt;
is no separate timestamped role any more). The upstream&lt;br /&gt;
connection is to the SimTX server given by &amp;lt;code&amp;gt;&amp;lt;simtxHost&amp;gt; &amp;lt;simtxPort&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
The callsign follows the same rules as transmitter sessions. The center&lt;br /&gt;
frequency must be zero or greater, the bandwidth must be positive, and both&lt;br /&gt;
ports must be in &amp;lt;code&amp;gt;1..65535&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
simtx-cli --server-id myserver rx argon.simtx.net 5556 1234 N0CALL 7100000 1024000&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then connect SDR++ to &amp;lt;code&amp;gt;127.0.0.1:1234&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Receiver options ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Option&lt;br /&gt;
! Default&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--hardware-profile PATH&amp;lt;/code&amp;gt;&lt;br /&gt;
| generic R820T&lt;br /&gt;
| RTL tuner/oscillator profile file.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--service-credential VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
| empty&lt;br /&gt;
| Service credential for authenticated receiver access. Requires &amp;lt;code&amp;gt;--server-id&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--service-credential-file PATH&amp;lt;/code&amp;gt;&lt;br /&gt;
| empty&lt;br /&gt;
| Read the service credential from an owner-only (&amp;lt;code&amp;gt;0600&amp;lt;/code&amp;gt;) file.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--timestamped&amp;lt;/code&amp;gt;&lt;br /&gt;
| off&lt;br /&gt;
| Use the timestamped receiver mode.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--rx-read-timeout-ms N&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;5000&amp;lt;/code&amp;gt;&lt;br /&gt;
| Upstream read timeout, &amp;lt;code&amp;gt;1..60000&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; uses the default.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--rx-max-retries N&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
| Upstream attempts before failing. &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; retries forever. &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; uses the default.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--rx-retry-base-ms N&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;250&amp;lt;/code&amp;gt;&lt;br /&gt;
| Base retry delay, &amp;lt;code&amp;gt;1..5000&amp;lt;/code&amp;gt;. Retries back off with jitter. &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; uses the default.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--rx-jitter-ms N&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;300&amp;lt;/code&amp;gt;&lt;br /&gt;
| Jitter buffer, &amp;lt;code&amp;gt;1..2000&amp;lt;/code&amp;gt;. Negative disables prefetch. &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; uses the default.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--rx-auto-stepdown&amp;lt;/code&amp;gt;&lt;br /&gt;
| off&lt;br /&gt;
| Narrow the upstream request after repeated stalls.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--rx-no-lossy-link&amp;lt;/code&amp;gt;&lt;br /&gt;
| off&lt;br /&gt;
| Disable all lossy-link tuning at once: synchronous reads, fixed backoff, and resets on reconnect.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--rx-listen-host IP&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;&lt;br /&gt;
| rtl-tcp bind address. Must be an IP literal.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
WARNING: &amp;lt;code&amp;gt;--rx-listen-host 0.0.0.0&amp;lt;/code&amp;gt; exposes the bridge to the LAN. The&lt;br /&gt;
rtl-tcp bridge is unauthenticated, so anyone who can reach the port can&lt;br /&gt;
retune it.&lt;br /&gt;
&lt;br /&gt;
Service credential notes:&lt;br /&gt;
&lt;br /&gt;
* A service credential requires &amp;lt;code&amp;gt;--server-id&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;--service-credential&amp;lt;/code&amp;gt; can also come from &amp;lt;code&amp;gt;SIMTX_SERVICE_CREDENTIAL&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;--service-credential-file&amp;lt;/code&amp;gt; must be readable only by its owner (&amp;lt;code&amp;gt;chmod 600&amp;lt;/code&amp;gt;)&lt;br /&gt;
on Unix-like systems.&lt;br /&gt;
* Service credentials are never written to preset files.&lt;br /&gt;
* With a credential or account identity, the receiver asks for a fresh ticket&lt;br /&gt;
on each upstream reconnect.&lt;br /&gt;
&lt;br /&gt;
Press Ctrl-C to stop the bridge.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Station commands: &amp;lt;code&amp;gt;stations&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;passes&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
simtx-cli [global flags] stations [list]&lt;br /&gt;
simtx-cli [global flags] stations show &amp;lt;id|name&amp;gt;&lt;br /&gt;
simtx-cli [global flags] --name N --callsign C --lat L --lon L [antenna options] \&lt;br /&gt;
  [--visibility PUBLIC|UNLISTED] stations create&lt;br /&gt;
simtx-cli [global flags] --name N --callsign C [--altitude-km KM] [--inclination DEG] \&lt;br /&gt;
  [--raan DEG] [--visibility PUBLIC|UNLISTED] stations launch&lt;br /&gt;
simtx-cli [global flags] stations delete &amp;lt;id|name&amp;gt;&lt;br /&gt;
simtx-cli [global flags] [--yes] stations deorbit &amp;lt;id|name&amp;gt;&lt;br /&gt;
simtx-cli [global flags] --sat &amp;lt;id|name&amp;gt; --station &amp;lt;id|name&amp;gt; [--hours H] [--min-el DEG] passes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These commands talk to the account service through your signed-in session&lt;br /&gt;
(run &amp;lt;code&amp;gt;login&amp;lt;/code&amp;gt; first) and print one &amp;lt;code&amp;gt;J:&amp;lt;/code&amp;gt; line:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Command&lt;br /&gt;
! &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;&lt;br /&gt;
! Payload&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;stations&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;list&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;my-stations&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;stations: [StationView]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;show&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;station&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;station: StationView&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;create&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;station.created&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;station: StationView&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;launch&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;station.launched&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;station: StationView&amp;lt;/code&amp;gt; (orbit epoch = launch)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;station.deleted&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;stationId&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;deorbit&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;station.deorbiting&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;station: StationView&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;state: DEORBITING&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;deorbit&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;passes&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;passes&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;satellite&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;station&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;from&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;to&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;reentryAt&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;passes&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;StationView&amp;lt;/code&amp;gt; is the account service&#039;s JSON (camelCase): &amp;lt;code&amp;gt;stationId&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;kind&amp;lt;/code&amp;gt;&lt;br /&gt;
(&amp;lt;code&amp;gt;GROUND&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;SATELLITE&amp;lt;/code&amp;gt;), &amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;callsign&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;visibility&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;revision&amp;lt;/code&amp;gt;,&lt;br /&gt;
&amp;lt;code&amp;gt;limits&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;location&amp;lt;/code&amp;gt; (ground) or &amp;lt;code&amp;gt;orbit&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;attitude&amp;lt;/code&amp;gt; (satellite), &amp;lt;code&amp;gt;antennas&amp;lt;/code&amp;gt;&lt;br /&gt;
(&amp;lt;code&amp;gt;antennaId&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ordinal&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;heightMeters&amp;lt;/code&amp;gt;, … &amp;lt;code&amp;gt;mount&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pointing&amp;lt;/code&amp;gt;)&lt;br /&gt;
and &amp;lt;code&amp;gt;rigs&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;rigId&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;paMaxWatts&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;noiseFigureDb&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tx&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;create&amp;lt;/code&amp;gt; makes a ground station with one antenna built from the antenna&lt;br /&gt;
options (default EFHW) at &amp;lt;code&amp;gt;--lat&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--lon&amp;lt;/code&amp;gt;. Add more antennas and rigs, or&lt;br /&gt;
edit them, in the app&#039;s station editor.&lt;br /&gt;
* &amp;lt;code&amp;gt;launch&amp;lt;/code&amp;gt; puts a satellite on a circular &amp;lt;code&amp;gt;simtx-j2-v1&amp;lt;/code&amp;gt; orbit (&amp;lt;code&amp;gt;--altitude-km&amp;lt;/code&amp;gt;&lt;br /&gt;
above the 6371 km sphere, &amp;lt;code&amp;gt;--inclination&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--raan&amp;lt;/code&amp;gt;; the mean anomaly is 0&lt;br /&gt;
at the launch instant), nadir-pointing with one turnstile antenna. The&lt;br /&gt;
perigee must be at least 200 km and the apogee at most 40,000 km.&lt;br /&gt;
&#039;&#039;&#039;Satellites are sealed at launch&#039;&#039;&#039;: only name, callsign, visibility and&lt;br /&gt;
limits can change afterwards; deorbit and relaunch to change anything else.&lt;br /&gt;
Use the app&#039;s mission designer for custom orbits, attitudes and antennas.&lt;br /&gt;
* &amp;lt;code&amp;gt;deorbit&amp;lt;/code&amp;gt; fires a real retrograde burn. It first fetches a preview and&lt;br /&gt;
prints the burn (delta-v) and when and where the satellite will reenter,&lt;br /&gt;
then asks &amp;lt;code&amp;gt;Fire the deorbit burn? This cannot be undone. [y/N]&amp;lt;/code&amp;gt; on stderr;&lt;br /&gt;
only &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; fires it. &amp;lt;code&amp;gt;--yes&amp;lt;/code&amp;gt; skips the question (needed when stdin is&lt;br /&gt;
not a terminal). The satellite becomes &amp;lt;code&amp;gt;DEORBITING&amp;lt;/code&amp;gt; on its falling orbit,&lt;br /&gt;
stays fully usable (tickets, sessions, passes) and burns up at&lt;br /&gt;
&amp;lt;code&amp;gt;deorbit.reentryAt&amp;lt;/code&amp;gt; (80 km), after which it is &amp;lt;code&amp;gt;DEORBITED&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;StationView&amp;lt;/code&amp;gt;&lt;br /&gt;
carries `deorbit: {burnAt, reentryAt, reentryLocation: {latitudeDeg,&lt;br /&gt;
longitudeDeg}, deltaVMps}&amp;lt;code&amp;gt;. A second burn fails with &amp;lt;/code&amp;gt;already_deorbiting`.&lt;br /&gt;
* &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; removes ground stations (satellites must be deorbited and reenter&lt;br /&gt;
first).&lt;br /&gt;
* &amp;lt;code&amp;gt;passes&amp;lt;/code&amp;gt; predicts locally with the Go port of &amp;lt;code&amp;gt;simtx-j2-v1&amp;lt;/code&amp;gt; (the server is&lt;br /&gt;
authoritative). Each pass has &amp;lt;code&amp;gt;aos&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tca&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;los&amp;lt;/code&amp;gt; (RFC 3339 UTC),&lt;br /&gt;
&amp;lt;code&amp;gt;maxElevationDeg&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;aosAzimuthDeg&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;losAzimuthDeg&amp;lt;/code&amp;gt; and&lt;br /&gt;
&amp;lt;code&amp;gt;maxDopplerHzPerMHz&amp;lt;/code&amp;gt; (multiply by the carrier in MHz). For a deorbiting&lt;br /&gt;
satellite the window ends at &amp;lt;code&amp;gt;reentryAt&amp;lt;/code&amp;gt; (also printed), a pass in progress&lt;br /&gt;
at reentry ends there, and after reentry the list is empty.&lt;br /&gt;
&lt;br /&gt;
Without arguments &amp;lt;code&amp;gt;stations&amp;lt;/code&amp;gt; lists &#039;&#039;&#039;your&#039;&#039;&#039; stations; &amp;lt;code&amp;gt;stations &amp;lt;host&amp;gt; &amp;lt;port&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
is the live server query described under [[#query commands|Query commands]].&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Account command: &amp;lt;code&amp;gt;login&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
simtx-cli [--account-url URL] [--auth-file PATH] login&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Starts a device authorization flow:&lt;br /&gt;
&lt;br /&gt;
# The CLI prints a verification URL and a short code.&lt;br /&gt;
# Open the URL and approve the code in a browser.&lt;br /&gt;
# The CLI stores the account session and exits.&lt;br /&gt;
&lt;br /&gt;
If a usable session is already stored, &amp;lt;code&amp;gt;login&amp;lt;/code&amp;gt; reports that you are signed in&lt;br /&gt;
and exits successfully.&lt;br /&gt;
&lt;br /&gt;
By default the session is stored in the OS keyring. With &amp;lt;code&amp;gt;--auth-file PATH&amp;lt;/code&amp;gt;,&lt;br /&gt;
it is stored in a plaintext JSON file with owner-only permissions. The CLI&lt;br /&gt;
logs a warning when the plaintext store is used.&lt;br /&gt;
&lt;br /&gt;
If the code expires, run &amp;lt;code&amp;gt;login&amp;lt;/code&amp;gt; again.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Query commands ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
simtx-cli [global flags] stations &amp;lt;host&amp;gt; &amp;lt;port&amp;gt;&lt;br /&gt;
simtx-cli [global flags] health &amp;lt;host&amp;gt; &amp;lt;port&amp;gt;&lt;br /&gt;
simtx-cli [global flags] catalog &amp;lt;host&amp;gt; &amp;lt;port&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Queries are one-shot. Each opens a session to the server, requests the data,&lt;br /&gt;
prints a single &amp;lt;code&amp;gt;J:&amp;lt;/code&amp;gt; line, and exits. The request waits up to 10 seconds for a&lt;br /&gt;
response.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;catalogue&amp;lt;/code&amp;gt; is an alias for &amp;lt;code&amp;gt;catalog&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Queries accept the identity options: anonymous by default, &amp;lt;code&amp;gt;--ticket&amp;lt;/code&amp;gt; for a&lt;br /&gt;
literal ticket, or &amp;lt;code&amp;gt;--server-id&amp;lt;/code&amp;gt; to mint a ticket through the signed-in&lt;br /&gt;
account. If the server bans the session, the command fails with the server&#039;s&lt;br /&gt;
message.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;stations&amp;lt;/code&amp;gt; output ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;stations &amp;lt;host&amp;gt; &amp;lt;port&amp;gt;&amp;lt;/code&amp;gt; lists what the server sees: persistent stations with&lt;br /&gt;
their live sessions, every active PUBLIC satellite (even with nobody attached;&lt;br /&gt;
&amp;lt;code&amp;gt;latDeg&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;lonDeg&amp;lt;/code&amp;gt; is the sub-satellite point), and ad-hoc sessions (&amp;lt;code&amp;gt;kind&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ADHOC&amp;lt;/code&amp;gt;, no &amp;lt;code&amp;gt;stationId&amp;lt;/code&amp;gt;, one session). UNLISTED stations appear as ad-hoc&lt;br /&gt;
sessions with the callsign only.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;stations&amp;quot;,&lt;br /&gt;
  &amp;quot;host&amp;quot;: &amp;quot;argon.simtx.net&amp;quot;,&lt;br /&gt;
  &amp;quot;port&amp;quot;: 5556,&lt;br /&gt;
  &amp;quot;capturedAtMs&amp;quot;: 1792843466892,&lt;br /&gt;
  &amp;quot;count&amp;quot;: 1,&lt;br /&gt;
  &amp;quot;stations&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;stationId&amp;quot;: &amp;quot;…&amp;quot;,&lt;br /&gt;
      &amp;quot;kind&amp;quot;: &amp;quot;GROUND&amp;quot;,&lt;br /&gt;
      &amp;quot;callsign&amp;quot;: &amp;quot;N0CALL&amp;quot;,&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;Home&amp;quot;,&lt;br /&gt;
      &amp;quot;ownerHandle&amp;quot;: &amp;quot;n0call&amp;quot;,&lt;br /&gt;
      &amp;quot;visibility&amp;quot;: &amp;quot;PUBLIC&amp;quot;,&lt;br /&gt;
      &amp;quot;latDeg&amp;quot;: 52.37,&lt;br /&gt;
      &amp;quot;lonDeg&amp;quot;: 4.9,&lt;br /&gt;
      &amp;quot;altitudeMeters&amp;quot;: 0,&lt;br /&gt;
      &amp;quot;revision&amp;quot;: 3,&lt;br /&gt;
      &amp;quot;sessions&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;sessionId&amp;quot;: &amp;quot;…&amp;quot;,&lt;br /&gt;
          &amp;quot;role&amp;quot;: &amp;quot;TX&amp;quot;,&lt;br /&gt;
          &amp;quot;antennaId&amp;quot;: &amp;quot;…&amp;quot;,&lt;br /&gt;
          &amp;quot;callsign&amp;quot;: &amp;quot;N0CALL&amp;quot;,&lt;br /&gt;
          &amp;quot;frequencyHz&amp;quot;: 7100000,&lt;br /&gt;
          &amp;quot;modulation&amp;quot;: &amp;quot;LSB&amp;quot;,&lt;br /&gt;
          &amp;quot;powerWatts&amp;quot;: 100,&lt;br /&gt;
          &amp;quot;bandwidthHz&amp;quot;: 2700,&lt;br /&gt;
          &amp;quot;latDeg&amp;quot;: 52.37,&lt;br /&gt;
          &amp;quot;lonDeg&amp;quot;: 4.9&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt; appears on sessions only for moderation sessions.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;health&amp;lt;/code&amp;gt; output ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;health&amp;quot;,&lt;br /&gt;
  &amp;quot;host&amp;quot;: &amp;quot;argon.simtx.net&amp;quot;,&lt;br /&gt;
  &amp;quot;port&amp;quot;: 5556,&lt;br /&gt;
  &amp;quot;health&amp;quot;: {&lt;br /&gt;
    &amp;quot;capturedAtEpochMillis&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
    &amp;quot;uptimeMillis&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;connectedClients&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;connectedStations&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;activeTransmitters&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;receiverGroups&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;acceptorAlive&amp;quot;: true,&lt;br /&gt;
    &amp;quot;worldTick&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;processCpuLoad&amp;quot;: 0.0,&lt;br /&gt;
    &amp;quot;systemCpuLoad&amp;quot;: 0.0,&lt;br /&gt;
    &amp;quot;heapUsedBytes&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;heapMaxBytes&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;transmitters&amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;stationUuid&amp;quot;: &amp;quot;…&amp;quot;,&lt;br /&gt;
        &amp;quot;callsign&amp;quot;: &amp;quot;N0CALL&amp;quot;,&lt;br /&gt;
        &amp;quot;address&amp;quot;: &amp;quot;…&amp;quot;,&lt;br /&gt;
        &amp;quot;sourceType&amp;quot;: &amp;quot;AUDIO_STREAM&amp;quot;,&lt;br /&gt;
        &amp;quot;frequencyHz&amp;quot;: 7100000,&lt;br /&gt;
        &amp;quot;modulation&amp;quot;: &amp;quot;LSB&amp;quot;,&lt;br /&gt;
        &amp;quot;sampleRate&amp;quot;: 48000&lt;br /&gt;
      }&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;receivers&amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;stationUuid&amp;quot;: &amp;quot;…&amp;quot;,&lt;br /&gt;
        &amp;quot;callsign&amp;quot;: &amp;quot;RTLTCP&amp;quot;,&lt;br /&gt;
        &amp;quot;address&amp;quot;: &amp;quot;…&amp;quot;,&lt;br /&gt;
        &amp;quot;centerFrequencyHz&amp;quot;: 7100000,&lt;br /&gt;
        &amp;quot;sampleRate&amp;quot;: 1024000,&lt;br /&gt;
        &amp;quot;wideband&amp;quot;: false,&lt;br /&gt;
        &amp;quot;framesWritten&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;framesDropped&amp;quot;: 0&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;catalog&amp;lt;/code&amp;gt; output ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;catalog&amp;quot;,&lt;br /&gt;
  &amp;quot;host&amp;quot;: &amp;quot;argon.simtx.net&amp;quot;,&lt;br /&gt;
  &amp;quot;port&amp;quot;: 5556,&lt;br /&gt;
  &amp;quot;count&amp;quot;: 1,&lt;br /&gt;
  &amp;quot;entries&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;id&amp;quot;: 1,&lt;br /&gt;
      &amp;quot;kind&amp;quot;: &amp;quot;…&amp;quot;,&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;…&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;…&amp;quot;,&lt;br /&gt;
      &amp;quot;author&amp;quot;: &amp;quot;…&amp;quot;,&lt;br /&gt;
      &amp;quot;sizeBytes&amp;quot;: 0,&lt;br /&gt;
      &amp;quot;fileCount&amp;quot;: 0,&lt;br /&gt;
      &amp;quot;types&amp;quot;: [],&lt;br /&gt;
      &amp;quot;categories&amp;quot;: [],&lt;br /&gt;
      &amp;quot;packageId&amp;quot;: &amp;quot;…&amp;quot;,&lt;br /&gt;
      &amp;quot;packageVersion&amp;quot;: &amp;quot;…&amp;quot;,&lt;br /&gt;
      &amp;quot;dependencies&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;id&amp;quot;: &amp;quot;…&amp;quot;,&lt;br /&gt;
          &amp;quot;versionRange&amp;quot;: &amp;quot;…&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;revision&amp;quot;: 0,&lt;br /&gt;
      &amp;quot;uploadedAtEpochMillis&amp;quot;: 0&lt;br /&gt;
    }&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Empty station, transmitter, receiver, catalog, type, category, and dependency&lt;br /&gt;
lists are always encoded as &amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;, never &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Version and update commands ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
simtx-cli version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prints &amp;lt;code&amp;gt;simtx-cli &amp;lt;version&amp;gt;&amp;lt;/code&amp;gt; using the local build version, including build&lt;br /&gt;
metadata. No network access and no version gate.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
simtx-cli update&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prints one &amp;lt;code&amp;gt;J:&amp;lt;/code&amp;gt; line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;current&amp;quot;: &amp;quot;…&amp;quot;,&lt;br /&gt;
  &amp;quot;latest&amp;quot;: &amp;quot;…&amp;quot;,&lt;br /&gt;
  &amp;quot;updateAvailable&amp;quot;: true,&lt;br /&gt;
  &amp;quot;appimageUrl&amp;quot;: &amp;quot;…&amp;quot;,&lt;br /&gt;
  &amp;quot;zsyncUrl&amp;quot;: &amp;quot;…&amp;quot;,&lt;br /&gt;
  &amp;quot;sha256&amp;quot;: &amp;quot;…&amp;quot;,&lt;br /&gt;
  &amp;quot;builtAt&amp;quot;: &amp;quot;…&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Behaviour:&lt;br /&gt;
&lt;br /&gt;
* Exits successfully and logs that the build is up to date when no update is&lt;br /&gt;
available.&lt;br /&gt;
* Exits with a non-zero status when an update is available.&lt;br /&gt;
* Exits with a non-zero status when update metadata cannot be fetched.&lt;br /&gt;
* Bypasses the strict version gate.&lt;br /&gt;
* The CLI never modifies its own installation. AppImage users can use the&lt;br /&gt;
printed URLs or a standard AppImage delta update tool.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Presets ==&lt;br /&gt;
&lt;br /&gt;
Preset files are plain-text Java-properties-style files. The recommended&lt;br /&gt;
extensions are &amp;lt;code&amp;gt;.stxpreset&amp;lt;/code&amp;gt; for transmit sessions and &amp;lt;code&amp;gt;.srxpreset&amp;lt;/code&amp;gt; for&lt;br /&gt;
receiver sessions.&lt;br /&gt;
&lt;br /&gt;
Format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
# Comments start with # or !&lt;br /&gt;
station.id=Home&lt;br /&gt;
rf.frequencyHz=7100000&lt;br /&gt;
rf.modulation=LSB&lt;br /&gt;
rf.bandwidthHz=2700&lt;br /&gt;
rf.lowCutHz=350&lt;br /&gt;
rf.powerWatts=100&lt;br /&gt;
rf.radioPreset=ICOM_IC_7300&lt;br /&gt;
cli.host=argon.simtx.net&lt;br /&gt;
cli.port=5556&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
* Lines are &amp;lt;code&amp;gt;key=value&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;key:value&amp;lt;/code&amp;gt; is also accepted.&lt;br /&gt;
* Lines beginning with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt; are comments.&lt;br /&gt;
* Blank lines are ignored.&lt;br /&gt;
* &amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;\r&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;\t&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;\\&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;\uXXXX&amp;lt;/code&amp;gt; escapes are supported.&lt;br /&gt;
* Unknown keys are ignored.&lt;br /&gt;
* Preset values are overridden by environment variables and explicit flags.&lt;br /&gt;
&lt;br /&gt;
Load and save:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
simtx-cli --preset station.stxpreset audio argon.simtx.net 5556 \&lt;br /&gt;
  7100000 message.wav USB&lt;br /&gt;
simtx-cli --station Home --save-preset station.stxpreset audio argon.simtx.net 5556 \&lt;br /&gt;
  7100000 message.wav USB&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--save-preset&amp;lt;/code&amp;gt; writes the effective settings and continues running the&lt;br /&gt;
command. Files are written with owner-only permissions and sorted by key.&lt;br /&gt;
The literal &amp;lt;code&amp;gt;--ticket&amp;lt;/code&amp;gt; value and service credentials are never written to a&lt;br /&gt;
preset; the CLI warns when a ticket was supplied but not saved.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;rx&amp;lt;/code&amp;gt; can write an &amp;lt;code&amp;gt;.srxpreset&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
simtx-cli --save-preset receiver.srxpreset rx argon.simtx.net 5556 1234&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Transmit preset keys ===&lt;br /&gt;
&lt;br /&gt;
Common keys:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Key&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;station.id&amp;lt;/code&amp;gt;&lt;br /&gt;
| Persistent station id or name (&amp;lt;code&amp;gt;--station&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;station.callsign&amp;lt;/code&amp;gt;&lt;br /&gt;
| Receiver callsign (ad-hoc &amp;lt;code&amp;gt;rx&amp;lt;/code&amp;gt;); ignored for TX.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;station.lat&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;station.latitude&amp;lt;/code&amp;gt;&lt;br /&gt;
| Latitude (ad-hoc &amp;lt;code&amp;gt;rx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;stations create&amp;lt;/code&amp;gt;); ignored for TX.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;station.lon&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;station.longitude&amp;lt;/code&amp;gt;&lt;br /&gt;
| Longitude (ad-hoc &amp;lt;code&amp;gt;rx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;stations create&amp;lt;/code&amp;gt;); ignored for TX.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.frequencyHz&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rf.frequency&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rf.freq&amp;lt;/code&amp;gt;&lt;br /&gt;
| Frequency in Hz.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.modulation&amp;lt;/code&amp;gt;&lt;br /&gt;
| Modulation name.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.bandwidthHz&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rf.bandwidth&amp;lt;/code&amp;gt;&lt;br /&gt;
| Bandwidth in Hz.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.lowCutHz&amp;lt;/code&amp;gt;&lt;br /&gt;
| Audio low cut in Hz.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.powerWatts&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rf.power&amp;lt;/code&amp;gt;&lt;br /&gt;
| Power in watts.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.radioPreset&amp;lt;/code&amp;gt;&lt;br /&gt;
| Radio preset name.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;antenna.type&amp;lt;/code&amp;gt;&lt;br /&gt;
| Antenna type.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;antenna.height&amp;lt;/code&amp;gt;&lt;br /&gt;
| Antenna height in metres.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;antenna.length&amp;lt;/code&amp;gt;&lt;br /&gt;
| Wire or element length in metres.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;antenna.azimuth&amp;lt;/code&amp;gt;&lt;br /&gt;
| Azimuth in degrees clockwise from north.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;antenna.feedlineLossDb&amp;lt;/code&amp;gt;&lt;br /&gt;
| Feedline loss in dB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;antenna.necDeck&amp;lt;/code&amp;gt;&lt;br /&gt;
| Custom NEC-2 antenna deck text.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;antenna.necFile&amp;lt;/code&amp;gt;&lt;br /&gt;
| Path to custom NEC-2 antenna deck file (.nec).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;source.tone&amp;lt;/code&amp;gt;&lt;br /&gt;
| Reserved for tone-controlled sources; accepted but currently unused by the built-in commands.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cli.host&amp;lt;/code&amp;gt;&lt;br /&gt;
| Server host.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cli.port&amp;lt;/code&amp;gt;&lt;br /&gt;
| Server port.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cli.accountUrl&amp;lt;/code&amp;gt;&lt;br /&gt;
| Account service URL.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cli.serverId&amp;lt;/code&amp;gt;&lt;br /&gt;
| Game server ID.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cli.ticket&amp;lt;/code&amp;gt;&lt;br /&gt;
| Literal ticket. Loaded, but never saved.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cli.authFile&amp;lt;/code&amp;gt;&lt;br /&gt;
| Plaintext credential file path.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cli.audioFile&amp;lt;/code&amp;gt;&lt;br /&gt;
| Audio file path.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cli.iqLocalPort&amp;lt;/code&amp;gt;&lt;br /&gt;
| Local IQ loopback port.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cli.iqSampleRate&amp;lt;/code&amp;gt;&lt;br /&gt;
| IQ sample rate.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cli.sampleRate&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;source.sampleRate&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rf.sampleRate&amp;lt;/code&amp;gt;&lt;br /&gt;
| General sample rate.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cli.debug&amp;lt;/code&amp;gt;&lt;br /&gt;
| Enable verbose logging.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cli.telemetryJson&amp;lt;/code&amp;gt;&lt;br /&gt;
| Enable telemetry JSON output.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
PA knob keys, in the same order as the positional overrides:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Key&lt;br /&gt;
! Knob&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.finalDriveDb&amp;lt;/code&amp;gt;&lt;br /&gt;
| Final drive, dB&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.paHeadroomDb&amp;lt;/code&amp;gt;&lt;br /&gt;
| PA headroom, dB&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.audioCompressionDb&amp;lt;/code&amp;gt;&lt;br /&gt;
| Audio compression, dB&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.paSoftness&amp;lt;/code&amp;gt;&lt;br /&gt;
| PA softness&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.paAmPmDeg&amp;lt;/code&amp;gt;&lt;br /&gt;
| PA AM/PM, degrees&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.carrierLeakDb&amp;lt;/code&amp;gt;&lt;br /&gt;
| Carrier leak, dB&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.sidebandSuppressionDb&amp;lt;/code&amp;gt;&lt;br /&gt;
| Opposite-sideband suppression, dB&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.frequencyOffsetHz&amp;lt;/code&amp;gt;&lt;br /&gt;
| Frequency offset, Hz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.mainsHumDb&amp;lt;/code&amp;gt;&lt;br /&gt;
| Mains hum level, dB&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.mainsHumHz&amp;lt;/code&amp;gt;&lt;br /&gt;
| Mains hum frequency, Hz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.amModulationIndex&amp;lt;/code&amp;gt;&lt;br /&gt;
| AM modulation index&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.paSupplySagDb&amp;lt;/code&amp;gt;&lt;br /&gt;
| PA supply sag, dB&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.txNoiseFloorDb&amp;lt;/code&amp;gt;&lt;br /&gt;
| TX noise floor suppression below peak carrier, dBc (0–160, higher = cleaner)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.oscillatorPhaseNoiseDb&amp;lt;/code&amp;gt;&lt;br /&gt;
| Oscillator phase noise suppression at 10 kHz offset, dBc/Hz (0–160, higher = cleaner)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.cwKeyRiseMs&amp;lt;/code&amp;gt;&lt;br /&gt;
| CW key rise time, ms&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Receiver preset keys ===&lt;br /&gt;
&lt;br /&gt;
Receiver presets accept the shared &amp;lt;code&amp;gt;station.*&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rf.frequencyHz&amp;lt;/code&amp;gt;,&lt;br /&gt;
&amp;lt;code&amp;gt;rf.bandwidthHz&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;antenna.&#039;&#039;&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;cli.&#039;&#039;&amp;lt;/code&amp;gt; keys, plus:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Key&lt;br /&gt;
! Equivalent option&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rx.rtlPort&amp;lt;/code&amp;gt;&lt;br /&gt;
| Local rtl-tcp port.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rx.hardwareProfile&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--hardware-profile&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rx.serviceCredential&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--service-credential&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rx.serviceCredentialFile&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--service-credential-file&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rx.timestamped&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--timestamped&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rx.readTimeoutMs&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--rx-read-timeout-ms&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rx.maxRetries&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--rx-max-retries&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rx.retryBaseMs&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--rx-retry-base-ms&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rx.jitterMs&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--rx-jitter-ms&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rx.autoStepdown&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--rx-auto-stepdown&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rx.noLossyLink&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--rx-no-lossy-link&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rx.listenHost&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--rx-listen-host&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Receiver location defaults to Budapest (&amp;lt;code&amp;gt;47.50&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;19.04&amp;lt;/code&amp;gt;) unless overridden.&lt;br /&gt;
Service credentials are never saved to receiver presets.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Exit status and signals ==&lt;br /&gt;
&lt;br /&gt;
* Successful commands exit with status &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Invalid arguments, network failures, authentication failures, server kicks,&lt;br /&gt;
disconnects, query timeouts, and update availability exit with status &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; never contacts the network and always exits successfully.&lt;br /&gt;
* Ctrl-C (SIGINT) and SIGTERM stop transmitter and receiver sessions cleanly.&lt;br /&gt;
The CLI exits successfully (status &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;) after an interrupt.&lt;br /&gt;
* When a transmitter audio file stream finishes playing to completion (EOF), the CLI&lt;br /&gt;
exits cleanly with status &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
* An abnormal session termination (such as an upstream server kick or network drop)&lt;br /&gt;
exits with status &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Query commands print their JSON result before exiting.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Symptom&lt;br /&gt;
! Likely cause&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;update required&amp;lt;/code&amp;gt;&lt;br /&gt;
| CLI version does not exactly match the update service. Upgrade, then retry.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;update check failed&amp;lt;/code&amp;gt;&lt;br /&gt;
| Update service unreachable. Check network access.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;run &#039;simtx-cli login&#039; first&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--server-id&amp;lt;/code&amp;gt; was used without a signed-in account.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;transmitting needs --station&amp;lt;/code&amp;gt;&lt;br /&gt;
| TX always runs on a persistent station; pass &amp;lt;code&amp;gt;--station&amp;lt;/code&amp;gt; (see &amp;lt;code&amp;gt;stations&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--server-id is required to mint a station-bound ticket&amp;lt;/code&amp;gt;&lt;br /&gt;
| Station-bound sessions need an account ticket.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;scope_required&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;sign in again&amp;lt;/code&amp;gt;&lt;br /&gt;
| The stored session predates station management; run &amp;lt;code&amp;gt;login&amp;lt;/code&amp;gt; again.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;The account service does not support station-bound sessions yet&amp;lt;/code&amp;gt;&lt;br /&gt;
| The account service predates v25 stations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rejected: … (FORBIDDEN)&amp;lt;/code&amp;gt;&lt;br /&gt;
| Not your station (TX), an UNLISTED station of someone else (RX), or a mismatched ticket.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;server did not answer with a protocol v25 hello&amp;lt;/code&amp;gt;&lt;br /&gt;
| The server runs an older protocol; it needs the v25 update.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--server-id is required with a service credential&amp;lt;/code&amp;gt;&lt;br /&gt;
| Receiver credential supplied without a game server ID.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;service credential file must be owner-only&amp;lt;/code&amp;gt;&lt;br /&gt;
| Run &amp;lt;code&amp;gt;chmod 600&amp;lt;/code&amp;gt; on the credential file.&lt;br /&gt;
|-&lt;br /&gt;
| Connection refused on rtl-tcp&lt;br /&gt;
| The SDR client is pointed at the wrong host/port, or &amp;lt;code&amp;gt;rx&amp;lt;/code&amp;gt; is not running.&lt;br /&gt;
|-&lt;br /&gt;
| IQ connection refused&lt;br /&gt;
| GNU Radio is not connected to &amp;lt;code&amp;gt;127.0.0.1:&amp;lt;localIqPort&amp;gt;&amp;lt;/code&amp;gt;, or the sample rate does not match.&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Multiplexed Serve Mode (&amp;lt;code&amp;gt;serve&amp;lt;/code&amp;gt;) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;simtx-cli serve&amp;lt;/code&amp;gt; runs a single long-lived multiplexing process designed for game engines and integration layers (such as C#/.NET on Windows and Linux). Rather than spawning a separate process per radio or session, &amp;lt;code&amp;gt;serve&amp;lt;/code&amp;gt; manages multiple concurrent receivers, scope panadapters, and persistent control channels over standard input/output using newline-delimited JSON (NDJSON), accompanied by local loopback binary TCP streaming sockets for high-rate float32 IQ data.&lt;br /&gt;
&lt;br /&gt;
=== Standard I/O Protocol (NDJSON) ===&lt;br /&gt;
&lt;br /&gt;
Communication occurs over two streams:&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;stdin&amp;lt;/code&amp;gt;&#039;&#039;&#039;: Receives single-line JSON commands from the controlling game or application.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;stdout&amp;lt;/code&amp;gt;&#039;&#039;&#039;: Emits single-line JSON responses, events, and push notifications. Lines are newline-terminated and thread-safe.&lt;br /&gt;
&lt;br /&gt;
==== Command Format (Application -&amp;gt; CLI) ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;id&amp;quot;: &amp;quot;req-101&amp;quot;,&lt;br /&gt;
  &amp;quot;cmd&amp;quot;: &amp;quot;rx.open&amp;quot;,&lt;br /&gt;
  &amp;quot;session&amp;quot;: &amp;quot;radio-1&amp;quot;,&lt;br /&gt;
  &amp;quot;params&amp;quot;: { ... }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;&lt;br /&gt;
| string (optional)&lt;br /&gt;
| Correlates responses to requests. Echoed back in the corresponding event.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
| string (required)&lt;br /&gt;
| Command identifier (e.g. &amp;lt;code&amp;gt;rx.open&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;control.subscribe_health&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;serve.ping&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt;&lt;br /&gt;
| string (optional)&lt;br /&gt;
| Session identifier chosen by the application (e.g. &amp;lt;code&amp;gt;radio-1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;panadapter&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ctl-main&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;params&amp;lt;/code&amp;gt;&lt;br /&gt;
| object (optional)&lt;br /&gt;
| Command-specific arguments.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Event &amp;amp; Response Format (CLI -&amp;gt; Application) ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;event&amp;quot;: &amp;quot;rx.opened&amp;quot;,&lt;br /&gt;
  &amp;quot;session&amp;quot;: &amp;quot;radio-1&amp;quot;,&lt;br /&gt;
  &amp;quot;id&amp;quot;: &amp;quot;req-101&amp;quot;,&lt;br /&gt;
  &amp;quot;data&amp;quot;: { ... }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;event&amp;lt;/code&amp;gt;&lt;br /&gt;
| string (required)&lt;br /&gt;
| Event type (e.g. &amp;lt;code&amp;gt;serve.ready&amp;lt;/code&amp;gt; (its &amp;lt;code&amp;gt;data.version&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;&amp;quot;v25&amp;quot;&amp;lt;/code&amp;gt;), &amp;lt;code&amp;gt;rx.opened&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;control.health&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt;&lt;br /&gt;
| string (optional)&lt;br /&gt;
| Associated session identifier.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;&lt;br /&gt;
| string (optional)&lt;br /&gt;
| Corresponds to the request &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; for direct command replies. Omitted for asynchronous pushes.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
| object (optional)&lt;br /&gt;
| Event payload data.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt;&lt;br /&gt;
| string (optional)&lt;br /&gt;
| Error description when &amp;lt;code&amp;gt;event&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;&amp;quot;error&amp;quot;&amp;lt;/code&amp;gt; or a command fails.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Command Reference ===&lt;br /&gt;
&lt;br /&gt;
==== 1. System Lifecycle ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;serve.ready&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
Emitted immediately upon startup to advertise protocol and engine capabilities:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;event&amp;quot;: &amp;quot;serve.ready&amp;quot;,&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
      &amp;quot;serve_version&amp;quot;: 2,&lt;br /&gt;
      &amp;quot;protocol_version&amp;quot;: 24,&lt;br /&gt;
      &amp;quot;app_version&amp;quot;: &amp;quot;0.1.0-alpha-14&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;serve.ping&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
Checks serve process responsiveness and fetches system clock times.&lt;br /&gt;
** Request: &amp;lt;code&amp;gt;{&amp;quot;id&amp;quot;: &amp;quot;p1&amp;quot;, &amp;quot;cmd&amp;quot;: &amp;quot;serve.ping&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
** Response:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;event&amp;quot;: &amp;quot;serve.pong&amp;quot;,&lt;br /&gt;
      &amp;quot;id&amp;quot;: &amp;quot;p1&amp;quot;,&lt;br /&gt;
      &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;time_unix_nanos&amp;quot;: 1792686378727327947,&lt;br /&gt;
        &amp;quot;time_utc&amp;quot;: &amp;quot;2026-10-22T16:26:18.727342195Z&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;serve.stop&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;exit&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;quit&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
Closes all active receiver, transmitter, and control sessions, frees resources, and terminates the serve process with exit code &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
** Request: &amp;lt;code&amp;gt;{&amp;quot;id&amp;quot;: &amp;quot;p2&amp;quot;, &amp;quot;cmd&amp;quot;: &amp;quot;serve.stop&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
** Response: &amp;lt;code&amp;gt;{&amp;quot;event&amp;quot;: &amp;quot;serve.stopped&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;p2&amp;quot;, &amp;quot;data&amp;quot;: {&amp;quot;ok&amp;quot;: true}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2. Receiver Sessions (&amp;lt;code&amp;gt;rx.*&amp;lt;/code&amp;gt;) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;rx.open&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
Opens an upstream receiver session (v25 &amp;lt;code&amp;gt;ReceiverStart&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;timestamped&amp;lt;/code&amp;gt; flag set by default) to the SimTX server and starts a local loopback TCP listener on &amp;lt;code&amp;gt;127.0.0.1:&amp;lt;port&amp;gt;&amp;lt;/code&amp;gt; for zero-copy binary IQ streaming. The receiver is ad-hoc unless &amp;lt;code&amp;gt;station_id&amp;lt;/code&amp;gt; is given.&lt;br /&gt;
** Parameters:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Parameter&lt;br /&gt;
! Type&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;argon.simtx.net&amp;lt;/code&amp;gt;&lt;br /&gt;
| SimTX upstream server host.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;port&amp;lt;/code&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| &amp;lt;code&amp;gt;5556&amp;lt;/code&amp;gt;&lt;br /&gt;
| SimTX upstream server port.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ticket&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Single-use session ticket (anonymous if blank).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;callsign&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;HAMSIMTEST&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Receiver station callsign.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;lat&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lon&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Receiver geographic latitude and longitude.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;altitude&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Receiver antenna altitude in meters.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;noise_figure_db&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Front-end noise figure in dB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;frequency_hz&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;7093000&amp;lt;/code&amp;gt;&lt;br /&gt;
| Center tuned frequency in Hz.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sample_rate&amp;lt;/code&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| &amp;lt;code&amp;gt;24000&amp;lt;/code&amp;gt;&lt;br /&gt;
| IQ sample rate in Hz (e.g. 24000 for voice radio, 64000 for panadapter, 2400000 for SDR view).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;bandwidth_hz&amp;lt;/code&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Receiver filter bandwidth in Hz (&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; defaults to &amp;lt;code&amp;gt;sample_rate&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;chunk_samples&amp;lt;/code&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Samples per chunk (&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; defaults to 512).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;plain_tcp&amp;lt;/code&amp;gt;&lt;br /&gt;
| bool&lt;br /&gt;
| &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;&lt;br /&gt;
| Force plain TCP connection instead of TLS.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;hardware_profile&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Optional hardware calibration profile path.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;timestamped&amp;lt;/code&amp;gt;&lt;br /&gt;
| bool&lt;br /&gt;
| &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;&lt;br /&gt;
| Enables nanosecond server timestamping on IQ blocks.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;antenna_type&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;DIPOLE&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Template type (&amp;lt;code&amp;gt;DIPOLE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;INVERTED_V&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;VERTICAL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;YAGI_3EL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;YAGI_5EL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LOOP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;BEVERAGE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LONGWIRE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EFHW_32M_49_1&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;antenna_height&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;10.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Height above ground in meters.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;antenna_length&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Wire length in meters (0 = resonant).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;azimuth&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Antenna azimuth heading in degrees.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;feedline_loss_db&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Feedline transmission loss in dB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ground&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;AVERAGE&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Ground model (&amp;lt;code&amp;gt;AVERAGE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FREESPACE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PERFECT&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;nec_deck&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Raw NEC-2 deck card text (GW/GE/EX cards). Overrides template parameters.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;nec_file&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Path to a local &amp;lt;code&amp;gt;.nec&amp;lt;/code&amp;gt; antenna file.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;station_id&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Bind the receiver to this persistent station (UUID). &amp;lt;code&amp;gt;ticket&amp;lt;/code&amp;gt; must then be a receiver ticket minted for the same station (and antenna/rig); callsign, location and antenna parameters are ignored.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;antenna_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rig_id&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Station antenna (default: first) and rig (default: none) for &amp;lt;code&amp;gt;station_id&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
** Response:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;event&amp;quot;: &amp;quot;rx.opened&amp;quot;,&lt;br /&gt;
      &amp;quot;session&amp;quot;: &amp;quot;radio-1&amp;quot;,&lt;br /&gt;
      &amp;quot;id&amp;quot;: &amp;quot;req-101&amp;quot;,&lt;br /&gt;
      &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;stream_addr&amp;quot;: &amp;quot;127.0.0.1:41235&amp;quot;,&lt;br /&gt;
        &amp;quot;sample_rate&amp;quot;: 24000,&lt;br /&gt;
        &amp;quot;chunk_samples&amp;quot;: 512,&lt;br /&gt;
        &amp;quot;antenna_accepted&amp;quot;: {&lt;br /&gt;
          &amp;quot;source&amp;quot;: &amp;quot;synthesized&amp;quot;,&lt;br /&gt;
          &amp;quot;type&amp;quot;: &amp;quot;DIPOLE&amp;quot;,&lt;br /&gt;
          &amp;quot;wire_count&amp;quot;: 1,&lt;br /&gt;
          &amp;quot;segment_count&amp;quot;: 21,&lt;br /&gt;
          &amp;quot;deck_bytes&amp;quot;: 191&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
** Rejection / Error:&lt;br /&gt;
If the server limits or refuses the receiver connection, &amp;lt;code&amp;gt;rx.rejected&amp;lt;/code&amp;gt; is emitted with the upstream reason:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;event&amp;quot;: &amp;quot;rx.rejected&amp;quot;,&lt;br /&gt;
      &amp;quot;session&amp;quot;: &amp;quot;radio-1&amp;quot;,&lt;br /&gt;
      &amp;quot;id&amp;quot;: &amp;quot;req-101&amp;quot;,&lt;br /&gt;
      &amp;quot;error&amp;quot;: &amp;quot;upstream receiver session refused: limit exceeded&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;rx.retune&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
Retunes an active receiver to a new frequency without reconnecting or tearing down the loopback streaming socket.&lt;br /&gt;
** Request: &amp;lt;code&amp;gt;{&amp;quot;id&amp;quot;: &amp;quot;r2&amp;quot;, &amp;quot;cmd&amp;quot;: &amp;quot;rx.retune&amp;quot;, &amp;quot;session&amp;quot;: &amp;quot;radio-1&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;frequency_hz&amp;quot;: 7095000}}&amp;lt;/code&amp;gt;&lt;br /&gt;
** Response: &amp;lt;code&amp;gt;{&amp;quot;event&amp;quot;: &amp;quot;rx.retuned&amp;quot;, &amp;quot;session&amp;quot;: &amp;quot;radio-1&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;r2&amp;quot;, &amp;quot;data&amp;quot;: {&amp;quot;frequency_hz&amp;quot;: 7095000}}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;rx.close&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
Closes the local loopback TCP listener and disconnects the upstream receiver session.&lt;br /&gt;
** Request: &amp;lt;code&amp;gt;{&amp;quot;id&amp;quot;: &amp;quot;r3&amp;quot;, &amp;quot;cmd&amp;quot;: &amp;quot;rx.close&amp;quot;, &amp;quot;session&amp;quot;: &amp;quot;radio-1&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
** Response: &amp;lt;code&amp;gt;{&amp;quot;event&amp;quot;: &amp;quot;rx.closed&amp;quot;, &amp;quot;session&amp;quot;: &amp;quot;radio-1&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;r3&amp;quot;, &amp;quot;data&amp;quot;: {&amp;quot;ok&amp;quot;: true}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3. Control Sessions &amp;amp; Subscriptions (&amp;lt;code&amp;gt;control.*&amp;lt;/code&amp;gt;) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;control.open&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
Establishes a persistent control connection (role &amp;lt;code&amp;gt;CONTROL&amp;lt;/code&amp;gt;) to the server. The CLI pings the server every 15 s to keep the link alive.&lt;br /&gt;
** Parameters: &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;port&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ticket&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;plain_tcp&amp;lt;/code&amp;gt;.&lt;br /&gt;
** Response: &amp;lt;code&amp;gt;{&amp;quot;event&amp;quot;: &amp;quot;control.opened&amp;quot;, &amp;quot;session&amp;quot;: &amp;quot;ctl-1&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;c1&amp;quot;, &amp;quot;data&amp;quot;: {&amp;quot;host&amp;quot;: &amp;quot;argon.simtx.net&amp;quot;, &amp;quot;port&amp;quot;: 5556}}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;control.subscribe_stations&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
Starts periodic polling of the server station list (v25: persistent stations with live sessions, public satellites, ad-hoc sessions).&lt;br /&gt;
** Parameters: &amp;lt;code&amp;gt;interval_sec&amp;lt;/code&amp;gt; (default &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;), &amp;lt;code&amp;gt;on_change_only&amp;lt;/code&amp;gt; (bool, default &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;).&lt;br /&gt;
** Response: &amp;lt;code&amp;gt;{&amp;quot;event&amp;quot;: &amp;quot;control.subscribed_stations&amp;quot;, &amp;quot;session&amp;quot;: &amp;quot;ctl-1&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;c2&amp;quot;, &amp;quot;data&amp;quot;: {&amp;quot;interval_sec&amp;quot;: 5}}&amp;lt;/code&amp;gt;&lt;br /&gt;
** Push Event (&amp;lt;code&amp;gt;control.stations&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;event&amp;quot;: &amp;quot;control.stations&amp;quot;,&lt;br /&gt;
      &amp;quot;session&amp;quot;: &amp;quot;ctl-1&amp;quot;,&lt;br /&gt;
      &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;count&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;stations&amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;kind&amp;quot;: &amp;quot;ADHOC&amp;quot;,&lt;br /&gt;
            &amp;quot;callsign&amp;quot;: &amp;quot;HAMSIMTEST&amp;quot;,&lt;br /&gt;
            &amp;quot;visibility&amp;quot;: &amp;quot;UNLISTED&amp;quot;,&lt;br /&gt;
            &amp;quot;latDeg&amp;quot;: 39.53,&lt;br /&gt;
            &amp;quot;lonDeg&amp;quot;: -119.81,&lt;br /&gt;
            &amp;quot;altitudeMeters&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;sessions&amp;quot;: [&lt;br /&gt;
              {&lt;br /&gt;
                &amp;quot;sessionId&amp;quot;: &amp;quot;a4b1...&amp;quot;,&lt;br /&gt;
                &amp;quot;role&amp;quot;: &amp;quot;TX&amp;quot;,&lt;br /&gt;
                &amp;quot;callsign&amp;quot;: &amp;quot;HAMSIMTEST&amp;quot;,&lt;br /&gt;
                &amp;quot;frequencyHz&amp;quot;: 7093000,&lt;br /&gt;
                &amp;quot;modulation&amp;quot;: &amp;quot;USB&amp;quot;,&lt;br /&gt;
                &amp;quot;powerWatts&amp;quot;: 100.0,&lt;br /&gt;
                &amp;quot;bandwidthHz&amp;quot;: 2700,&lt;br /&gt;
                &amp;quot;latDeg&amp;quot;: 39.53,&lt;br /&gt;
                &amp;quot;lonDeg&amp;quot;: -119.81&lt;br /&gt;
              }&lt;br /&gt;
            ]&lt;br /&gt;
          }&lt;br /&gt;
        ]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;control.subscribe_health&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
Starts periodic polling of server health, computing the real-time simulation clock offset $\Delta_{\text{sim}} = T_{\text{sim}} - T_{\text{local}}$.&lt;br /&gt;
** Parameters: &amp;lt;code&amp;gt;interval_sec&amp;lt;/code&amp;gt; (default &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt;).&lt;br /&gt;
** Push Event (&amp;lt;code&amp;gt;control.health&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;event&amp;quot;: &amp;quot;control.health&amp;quot;,&lt;br /&gt;
      &amp;quot;session&amp;quot;: &amp;quot;ctl-1&amp;quot;,&lt;br /&gt;
      &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;health&amp;quot;: {&lt;br /&gt;
          &amp;quot;SimulationTimeEpochMillis&amp;quot;: 1729600000123,&lt;br /&gt;
          &amp;quot;CapturedAtEpochMillis&amp;quot;: 1729600000120,&lt;br /&gt;
          &amp;quot;WorldTicks&amp;quot;: 45129,&lt;br /&gt;
          &amp;quot;ActiveTransmitters&amp;quot;: 1,&lt;br /&gt;
          &amp;quot;ActiveReceivers&amp;quot;: 3&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;time_sync&amp;quot;: {&lt;br /&gt;
          &amp;quot;simulation_time_millis&amp;quot;: 1729600000123,&lt;br /&gt;
          &amp;quot;server_captured_millis&amp;quot;: 1729600000120,&lt;br /&gt;
          &amp;quot;local_time_millis&amp;quot;: 1729600000000,&lt;br /&gt;
          &amp;quot;offset_millis&amp;quot;: 123&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;control.weather&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
Requests a regional weather map raster from the server.&lt;br /&gt;
** Parameters:&lt;br /&gt;
*** &amp;lt;code&amp;gt;center_lat&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;center_lon&amp;lt;/code&amp;gt;: Center geographic coordinates.&lt;br /&gt;
*** &amp;lt;code&amp;gt;lat_span&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lon_span&amp;lt;/code&amp;gt;: Extent in degrees (default &amp;lt;code&amp;gt;5.0&amp;lt;/code&amp;gt;).&lt;br /&gt;
*** &amp;lt;code&amp;gt;width&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;height&amp;lt;/code&amp;gt;: Grid dimensions (e.g. &amp;lt;code&amp;gt;64&amp;lt;/code&amp;gt; $\times$ &amp;lt;code&amp;gt;32&amp;lt;/code&amp;gt;).&lt;br /&gt;
*** &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;: Raster layer type: &amp;lt;code&amp;gt;&amp;quot;RAIN_RATE&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;DUCT_STRENGTH&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;CLOUD_WATER&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;SURFACE_TEMPERATURE&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;LIGHTNING_RATE&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
** Push Event (&amp;lt;code&amp;gt;control.weather&amp;lt;/code&amp;gt;):&lt;br /&gt;
Carries grid bounds (&amp;lt;code&amp;gt;SouthLatDeg&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NorthLatDeg&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WestLonDeg&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EastLonDeg&amp;lt;/code&amp;gt;), surface parameters, and raw raster values array (&amp;lt;code&amp;gt;Values&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;control.catalog&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;control.catalog_fetch&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
Browses community presets and downloads specific items by &amp;lt;code&amp;gt;entry_id&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;control.close&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
Closes the control connection and cancels all subscription polling.&lt;br /&gt;
&lt;br /&gt;
==== 4. Transmitter Sessions (&amp;lt;code&amp;gt;tx.*&amp;lt;/code&amp;gt;) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;tx.open&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
Opens an upstream transmitter session (&amp;lt;code&amp;gt;RoleTransmitter&amp;lt;/code&amp;gt;) using protocol v24 and starts a local loopback TCP listener on &amp;lt;code&amp;gt;127.0.0.1:&amp;lt;port&amp;gt;&amp;lt;/code&amp;gt; for zero-copy streaming of live microphone audio or complex IQ baseband.&lt;br /&gt;
** Parameters:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Parameter&lt;br /&gt;
! Type&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;argon.simtx.net&amp;lt;/code&amp;gt;&lt;br /&gt;
| Upstream server hostname.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;port&amp;lt;/code&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| &amp;lt;code&amp;gt;5556&amp;lt;/code&amp;gt;&lt;br /&gt;
| Upstream server port.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;plain_tcp&amp;lt;/code&amp;gt;&lt;br /&gt;
| bool&lt;br /&gt;
| &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;&lt;br /&gt;
| Force plain TCP connection instead of TLS.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ticket&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Single-use session ticket (anonymous if blank).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;callsign&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;HAMSIMTEST&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Transmitter station callsign.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;lat&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lon&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Geographic coordinates.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;altitude&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Antenna altitude in meters.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;frequency_hz&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;7093000&amp;lt;/code&amp;gt;&lt;br /&gt;
| Center transmission carrier frequency in Hz.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;power_watts&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;100.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Transmit power in watts.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sample_rate&amp;lt;/code&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| &amp;lt;code&amp;gt;48000&amp;lt;/code&amp;gt;&lt;br /&gt;
| Declared input sample rate (e.g. 22050 for voice or up to 10000000 for IQ).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;bandwidth_hz&amp;lt;/code&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| &amp;lt;code&amp;gt;2700&amp;lt;/code&amp;gt;&lt;br /&gt;
| Occupied RF bandwidth in Hz.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;low_cut_hz&amp;lt;/code&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| &amp;lt;code&amp;gt;350&amp;lt;/code&amp;gt;&lt;br /&gt;
| Audio low-frequency cutoff in Hz.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;modulation&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;USB&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Modulation (&amp;lt;code&amp;gt;USB&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LSB&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AM_DSB_FC&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NFM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WFM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IQ&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;audio_gain&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Input audio gain factor.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tone_hz&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Test tone frequency in Hz (0 to disable).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;duty_cycle&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| PA duty cycle factor (0.0 to 1.0).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;clean_lab&amp;lt;/code&amp;gt;&lt;br /&gt;
| bool&lt;br /&gt;
| &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;&lt;br /&gt;
| Enable clean lab mode (disables driver distortion).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;antenna_type&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;DIPOLE&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Template type (&amp;lt;code&amp;gt;DIPOLE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;INVERTED_V&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;VERTICAL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;YAGI_3EL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;YAGI_5EL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LOOP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;BEVERAGE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LONGWIRE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EFHW_32M_49_1&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;antenna_height&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;10.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Height in meters.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;antenna_length&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Wire length in meters (0 = resonant).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;azimuth&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Azimuth heading in degrees.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;feedline_loss_db&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Feedline loss in dB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ground&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;AVERAGE&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Ground model (&amp;lt;code&amp;gt;AVERAGE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FREESPACE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PERFECT&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;nec_deck&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Raw NEC-2 deck card text (GW/GE/EX cards). Overrides template parameters.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;nec_file&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Path to a local &amp;lt;code&amp;gt;.nec&amp;lt;/code&amp;gt; antenna file.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mode_name&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Custom mode info identifier.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mode_description&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Custom mode info human-readable description.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mode_bandwidth_hz&amp;lt;/code&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Custom mode bandwidth limit.&lt;br /&gt;
|-&lt;br /&gt;
| Impairment fields:&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;final_drive_db&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Final driver stage level in dB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;pa_headroom_db&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;6.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| PA headroom in dB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;audio_compression_db&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Mic audio speech compressor level in dB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;pa_softness&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| PA saturation softness curve factor.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;pa_am_pm_deg&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| PA AM-to-PM phase conversion in degrees.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;carrier_leak_db&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;-50.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Residual carrier leak level in dB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;opposite_sideband_suppression_db&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;50.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Opposite sideband suppression in dB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;freq_offset_hz&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Local oscillator frequency offset in Hz.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mains_hum_level_db&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;-60.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Power supply mains hum level in dB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mains_hum_freq_hz&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;50.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Mains hum base frequency in Hz (e.g. 50 or 60).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;am_modulation_index&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;0.85&amp;lt;/code&amp;gt;&lt;br /&gt;
| AM modulation index.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;pa_supply_sag_db&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| PA power supply voltage sag in dB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tx_noise_floor_db&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;120.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Broadband noise floor suppression in dBc.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;oscillator_phase_noise_db&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;120.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Oscillator phase noise suppression at 10 kHz in dBc/Hz.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cw_key_rise_ms&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;5.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| CW keying rise/fall time envelope in ms.&lt;br /&gt;
|}&lt;br /&gt;
** Responses / Events:&lt;br /&gt;
*** &#039;&#039;&#039;&amp;lt;code&amp;gt;tx.opened&amp;lt;/code&amp;gt;&#039;&#039;&#039;: Session accepted and on-air or ready.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;event&amp;quot;: &amp;quot;tx.opened&amp;quot;,&lt;br /&gt;
        &amp;quot;session&amp;quot;: &amp;quot;tx-1&amp;quot;,&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;t1&amp;quot;,&lt;br /&gt;
        &amp;quot;data&amp;quot;: {&lt;br /&gt;
          &amp;quot;stream_addr&amp;quot;: &amp;quot;127.0.0.1:43521&amp;quot;,&lt;br /&gt;
          &amp;quot;sample_rate&amp;quot;: 22050,&lt;br /&gt;
          &amp;quot;wire_rate&amp;quot;: 48000,&lt;br /&gt;
          &amp;quot;audio_in&amp;quot;: true,&lt;br /&gt;
          &amp;quot;iq_in&amp;quot;: false,&lt;br /&gt;
          &amp;quot;antenna_accepted&amp;quot;: { ... }&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*** &#039;&#039;&#039;&amp;lt;code&amp;gt;tx.queued&amp;lt;/code&amp;gt;&#039;&#039;&#039;: Session queued by server if channel or server capacity is full.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
      {&amp;quot;event&amp;quot;: &amp;quot;tx.queued&amp;quot;, &amp;quot;session&amp;quot;: &amp;quot;tx-1&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;t1&amp;quot;, &amp;quot;data&amp;quot;: {&amp;quot;queue_position&amp;quot;: 2}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*** &#039;&#039;&#039;&amp;lt;code&amp;gt;tx.rejected&amp;lt;/code&amp;gt;&#039;&#039;&#039;: Connection refused by server.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
      {&amp;quot;event&amp;quot;: &amp;quot;tx.rejected&amp;quot;, &amp;quot;session&amp;quot;: &amp;quot;tx-1&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;t1&amp;quot;, &amp;quot;error&amp;quot;: &amp;quot;callsign already in use&amp;quot;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*** &#039;&#039;&#039;&amp;lt;code&amp;gt;tx.kicked&amp;lt;/code&amp;gt;&#039;&#039;&#039;: Disconnected during session.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
      {&amp;quot;event&amp;quot;: &amp;quot;tx.kicked&amp;quot;, &amp;quot;session&amp;quot;: &amp;quot;tx-1&amp;quot;, &amp;quot;data&amp;quot;: {&amp;quot;reason&amp;quot;: &amp;quot;time limit expired&amp;quot;}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;tx.key&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
Keys the transmitter (&amp;lt;code&amp;gt;keyed: true&amp;lt;/code&amp;gt;). Incoming audio or IQ on the loopback socket is actively processed, modulated, and pushed to the upstream server.&lt;br /&gt;
** Request: &amp;lt;code&amp;gt;{&amp;quot;id&amp;quot;: &amp;quot;t2&amp;quot;, &amp;quot;cmd&amp;quot;: &amp;quot;tx.key&amp;quot;, &amp;quot;session&amp;quot;: &amp;quot;tx-1&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
** Response: &amp;lt;code&amp;gt;{&amp;quot;event&amp;quot;: &amp;quot;tx.keyed&amp;quot;, &amp;quot;session&amp;quot;: &amp;quot;tx-1&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;t2&amp;quot;, &amp;quot;data&amp;quot;: {&amp;quot;keyed&amp;quot;: true}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;tx.unkey&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
Unkeys the transmitter (&amp;lt;code&amp;gt;keyed: false&amp;lt;/code&amp;gt;). The session remains warm and active:&lt;br /&gt;
** Loopback audio/IQ ingestion is muted, and the CLI automatically pumps warm silence heartbeats (20ms frames) to keep server lease renewed.&lt;br /&gt;
** Server buffer behavior: Any already-buffered audio or IQ in the server finishes draining through playout without being cut off mid-packet or triggering timeouts.&lt;br /&gt;
** Request: &amp;lt;code&amp;gt;{&amp;quot;id&amp;quot;: &amp;quot;t3&amp;quot;, &amp;quot;cmd&amp;quot;: &amp;quot;tx.unkey&amp;quot;, &amp;quot;session&amp;quot;: &amp;quot;tx-1&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
** Response: &amp;lt;code&amp;gt;{&amp;quot;event&amp;quot;: &amp;quot;tx.unkeyed&amp;quot;, &amp;quot;session&amp;quot;: &amp;quot;tx-1&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;t3&amp;quot;, &amp;quot;data&amp;quot;: {&amp;quot;keyed&amp;quot;: false}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;tx.set&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
Applies live mid-session parameter modifications without interrupting the connection or closing sockets.&lt;br /&gt;
** Parameters: &amp;lt;code&amp;gt;frequency_hz&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;power_watts&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bandwidth_hz&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;low_cut_hz&amp;lt;/code&amp;gt;, and any of the 15 impairment fields.&lt;br /&gt;
** Request:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;id&amp;quot;: &amp;quot;t4&amp;quot;,&lt;br /&gt;
      &amp;quot;cmd&amp;quot;: &amp;quot;tx.set&amp;quot;,&lt;br /&gt;
      &amp;quot;session&amp;quot;: &amp;quot;tx-1&amp;quot;,&lt;br /&gt;
      &amp;quot;params&amp;quot;: {&lt;br /&gt;
        &amp;quot;frequency_hz&amp;quot;: 7094000,&lt;br /&gt;
        &amp;quot;power_watts&amp;quot;: 80.0,&lt;br /&gt;
        &amp;quot;bandwidth_hz&amp;quot;: 2400&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
** Response: &amp;lt;code&amp;gt;{&amp;quot;event&amp;quot;: &amp;quot;tx.set_applied&amp;quot;, &amp;quot;session&amp;quot;: &amp;quot;tx-1&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;t4&amp;quot;, &amp;quot;data&amp;quot;: {&amp;quot;ok&amp;quot;: true}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;tx.close&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
Stops loopback streaming and closes the upstream transmitter session.&lt;br /&gt;
** Request: &amp;lt;code&amp;gt;{&amp;quot;id&amp;quot;: &amp;quot;t5&amp;quot;, &amp;quot;cmd&amp;quot;: &amp;quot;tx.close&amp;quot;, &amp;quot;session&amp;quot;: &amp;quot;tx-1&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
** Response: &amp;lt;code&amp;gt;{&amp;quot;event&amp;quot;: &amp;quot;tx.closed&amp;quot;, &amp;quot;session&amp;quot;: &amp;quot;tx-1&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;t5&amp;quot;, &amp;quot;data&amp;quot;: {&amp;quot;ok&amp;quot;: true}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;tx.telemetry&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
Asynchronous push event carrying full RF and PA telemetry from the server on every frame:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;event&amp;quot;: &amp;quot;tx.telemetry&amp;quot;,&lt;br /&gt;
    &amp;quot;session&amp;quot;: &amp;quot;tx-1&amp;quot;,&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
      &amp;quot;sequence&amp;quot;: 104,&lt;br /&gt;
      &amp;quot;server_time_millis&amp;quot;: 1792686379220,&lt;br /&gt;
      &amp;quot;actual_frequency_hz&amp;quot;: 7093000,&lt;br /&gt;
      &amp;quot;requested_power_watts&amp;quot;: 100.0,&lt;br /&gt;
      &amp;quot;forward_power_watts&amp;quot;: 78.4,&lt;br /&gt;
      &amp;quot;delivered_power_watts&amp;quot;: 76.1,&lt;br /&gt;
      &amp;quot;reflected_power_watts&amp;quot;: 2.3,&lt;br /&gt;
      &amp;quot;vswr&amp;quot;: 1.25,&lt;br /&gt;
      &amp;quot;mismatch_loss_db&amp;quot;: 0.12,&lt;br /&gt;
      &amp;quot;transformer_loss_db&amp;quot;: 0.08,&lt;br /&gt;
      &amp;quot;foldback_loss_db&amp;quot;: 0.0,&lt;br /&gt;
      &amp;quot;alc_db&amp;quot;: -0.5,&lt;br /&gt;
      &amp;quot;buffer_seconds&amp;quot;: 0.42,&lt;br /&gt;
      &amp;quot;finals_temperature_c&amp;quot;: 46.5,&lt;br /&gt;
      &amp;quot;thermal_foldback_db&amp;quot;: 0.0,&lt;br /&gt;
      &amp;quot;pa_compression_db&amp;quot;: 0.4,&lt;br /&gt;
      &amp;quot;pa_heat_watts&amp;quot;: 21.6,&lt;br /&gt;
      &amp;quot;pa_efficiency_percent&amp;quot;: 78.0,&lt;br /&gt;
      &amp;quot;pa_thermal_fault_active&amp;quot;: false&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Loopback Streaming Protocols ===&lt;br /&gt;
&lt;br /&gt;
==== Receiver Output Protocol (CLI -&amp;gt; Application) ====&lt;br /&gt;
&lt;br /&gt;
For receiver sessions, high-bandwidth complex samples are transmitted over a dedicated loopback TCP socket (&amp;lt;code&amp;gt;stream_addr&amp;lt;/code&amp;gt;) rather than base64-encoded on standard I/O. This avoids JSON parser CPU overhead, memory allocations, and garbage collection stalls when streaming at high sample rates (e.g. 2.4 Msps $\approx$ 153 Mbit/s).&lt;br /&gt;
&lt;br /&gt;
===== Packet Header &amp;amp; Payload Layout =====&lt;br /&gt;
&lt;br /&gt;
Each chunk sent across the local TCP socket consists of a 12-byte header followed by raw interleaved 32-bit floating-point samples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
+-------------------------------------------------------------+&lt;br /&gt;
| Field                         | Size    | Byte Order        |&lt;br /&gt;
+-------------------------------------------------------------+&lt;br /&gt;
| ServerTimestampUnixNanos      | 8 bytes | Big-Endian (BE)   |&lt;br /&gt;
| FloatCount (samples * 2)      | 4 bytes | Big-Endian (BE)   |&lt;br /&gt;
| Interleaved float32[] I/Q     | N bytes | Little-Endian(LE) |&lt;br /&gt;
+-------------------------------------------------------------+&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;&amp;lt;code&amp;gt;ServerTimestampUnixNanos&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;int64&amp;lt;/code&amp;gt;, 8 bytes, Big-Endian)&#039;&#039;&#039;:&lt;br /&gt;
The authoritative simulation clock timestamp of the first sample in the block. Used for FT8/FT4 synchronization and synchronized voice audio playout.&lt;br /&gt;
# &#039;&#039;&#039;&amp;lt;code&amp;gt;FloatCount&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;uint32&amp;lt;/code&amp;gt;, 4 bytes, Big-Endian)&#039;&#039;&#039;:&lt;br /&gt;
The number of &amp;lt;code&amp;gt;float32&amp;lt;/code&amp;gt; values in the payload ($= \text{ChunkSamples} \times 2$).&lt;br /&gt;
# **&amp;lt;code&amp;gt;I/Q Samples&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;float32[]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FloatCount * 4&amp;lt;/code&amp;gt; bytes, Little-Endian)**:&lt;br /&gt;
Alternating real and imaginary components: $[I_0, Q_0, I_1, Q_1, I_2, Q_2, \dots]$.&lt;br /&gt;
&lt;br /&gt;
==== Transmitter Ingest Protocol (Application -&amp;gt; CLI) ====&lt;br /&gt;
&lt;br /&gt;
For transmitter sessions (&amp;lt;code&amp;gt;tx.open&amp;lt;/code&amp;gt;), the application connects to the local TCP listener (&amp;lt;code&amp;gt;stream_addr&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Audio Streams (Microphone / Voice Modes)&#039;&#039;&#039;:&lt;br /&gt;
** When opened with voice/analog modulations (&amp;lt;code&amp;gt;USB&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LSB&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AM_DSB_FC&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NFM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WFM&amp;lt;/code&amp;gt;), the socket accepts continuous 32-bit Little-Endian IEEE-754 float mono PCM audio at the declared &amp;lt;code&amp;gt;sample_rate&amp;lt;/code&amp;gt; (e.g. 22,050 Hz or 48,000 Hz).&lt;br /&gt;
** Audio is resampled internally in real time to the RF pipeline wire rate via &amp;lt;code&amp;gt;RatePump&amp;lt;/code&amp;gt;, where microphone compression, frequency response, and exciter impairments are applied before modulation.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;IQ Streams (GNU Radio / Digital Modes)&#039;&#039;&#039;:&lt;br /&gt;
** When opened with &amp;lt;code&amp;gt;modulation: &amp;quot;IQ&amp;quot;&amp;lt;/code&amp;gt;, the socket accepts complex baseband samples (interleaved float32 real and imaginary pairs).&lt;br /&gt;
** Ingest supports two modes:&lt;br /&gt;
*** &#039;&#039;&#039;Framed packets with 12-byte header&#039;&#039;&#039;: Same format as receiver packets (&amp;lt;code&amp;gt;[ServerTimestampUnixNanos (int64 BE)][FloatCount (uint32 BE)][samples float32 LE]&amp;lt;/code&amp;gt;). This allows precise scheduling of FT8/JS8 blocks at specific server time slots ($T_{\text{server}}$). Block sizes up to 65,536 values are supported.&lt;br /&gt;
*** &#039;&#039;&#039;Raw stream&#039;&#039;&#039;: Continuous stream of interleaved float32 pairs sent directly into the RF chain.&lt;br /&gt;
&lt;br /&gt;
==== Server Buffer Drain at Unkey ====&lt;br /&gt;
&lt;br /&gt;
When a transmitter is unkeyed via &amp;lt;code&amp;gt;tx.unkey&amp;lt;/code&amp;gt;:&lt;br /&gt;
* The client CLI stops reading audio/IQ from the loopback socket and immediately switches to emitting 20 ms frames of silence (&amp;lt;code&amp;gt;holdSilence&amp;lt;/code&amp;gt;) upstream.&lt;br /&gt;
* This serves two functions:&lt;br /&gt;
## It acts as an active keep-alive heartbeat, preventing session timeouts and lease expiration between overs.&lt;br /&gt;
## The server&#039;s internal audio buffer drains gracefully to the simulated air. The trailing 0.5–1.0 s of voice audio is never truncated or abruptly silenced mid-sentence.&lt;br /&gt;
* When &amp;lt;code&amp;gt;tx.key&amp;lt;/code&amp;gt; is reissued, normal audio/IQ ingest resumes instantly with no need to renegotiate tickets or reconnect.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Serve Protocol Changelog ===&lt;br /&gt;
&lt;br /&gt;
==== Version 2 (CLI alpha-14 / Protocol v24) ====&lt;br /&gt;
* Added full transmitter session control: &amp;lt;code&amp;gt;tx.open&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tx.key&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tx.unkey&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tx.set&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tx.close&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Added real-time audio loopback streaming with automatic resampling from game rates (e.g. 22,050 Hz) to internal wire rates.&lt;br /&gt;
* Added IQ loopback streaming supporting sample rates up to 10 MS/s and server timestamped scheduling blocks.&lt;br /&gt;
* Added live mid-session knob adjustment via &amp;lt;code&amp;gt;tx.set&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Added complete 18-parameter telemetry event emissions (&amp;lt;code&amp;gt;tx.telemetry&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Added &amp;lt;code&amp;gt;serve.ready&amp;lt;/code&amp;gt; banner containing &amp;lt;code&amp;gt;serve_version: 2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;protocol_version: 24&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;app_version&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Added receiver options to &amp;lt;code&amp;gt;rx.open&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;altitude&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;noise_figure_db&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bandwidth_hz&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;chunk_samples&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;plain_tcp&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Added &amp;lt;code&amp;gt;rx.rejected&amp;lt;/code&amp;gt; event when upstream receiver sessions are refused by server quotas or limits.&lt;br /&gt;
* Added &amp;lt;code&amp;gt;--plain-tcp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;SIMTX_PLAIN_TCP&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;SIMTX_FORCE_PLAIN_TCP&amp;lt;/code&amp;gt; for environments operating over unencrypted TCP.&lt;br /&gt;
* Fixed informational server health banners (&amp;lt;code&amp;gt;BannerInfo&amp;lt;/code&amp;gt;) causing query commands to fail.&lt;br /&gt;
&lt;br /&gt;
==== C# (.NET) Zero-Copy Read Example ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
using System;&lt;br /&gt;
using System.Buffers.Binary;&lt;br /&gt;
using System.Net.Sockets;&lt;br /&gt;
using System.Runtime.InteropServices;&lt;br /&gt;
&lt;br /&gt;
public async Task ReadIqStreamAsync(string host, int port, CancellationToken ct)&lt;br /&gt;
{&lt;br /&gt;
    using var client = new TcpClient();&lt;br /&gt;
    await client.ConnectAsync(host, port, ct);&lt;br /&gt;
    using var stream = client.GetStream();&lt;br /&gt;
&lt;br /&gt;
    byte[] header = new byte[12];&lt;br /&gt;
    byte[] payload = new byte[65536];&lt;br /&gt;
&lt;br /&gt;
    while (!ct.IsCancellationRequested)&lt;br /&gt;
    {&lt;br /&gt;
        // 1. Read 12-byte header&lt;br /&gt;
        await stream.ReadExactlyAsync(header, 0, 12, ct);&lt;br /&gt;
        long timestampNanos = BinaryPrimitives.ReadInt64BigEndian(header.AsSpan(0, 8));&lt;br /&gt;
        uint floatCount = BinaryPrimitives.ReadUInt32BigEndian(header.AsSpan(8, 4));&lt;br /&gt;
&lt;br /&gt;
        int byteCount = (int)floatCount * 4;&lt;br /&gt;
        if (payload.Length &amp;lt; byteCount)&lt;br /&gt;
            Array.Resize(ref payload, byteCount);&lt;br /&gt;
&lt;br /&gt;
        // 2. Read float32 payload&lt;br /&gt;
        await stream.ReadExactlyAsync(payload, 0, byteCount, ct);&lt;br /&gt;
&lt;br /&gt;
        // 3. Zero-copy cast into float span (x86_64 and arm64 are Little-Endian)&lt;br /&gt;
        ReadOnlySpan&amp;lt;float&amp;gt; iqSpan = MemoryMarshal.Cast&amp;lt;byte, float&amp;gt;(payload.AsSpan(0, byteCount));&lt;br /&gt;
&lt;br /&gt;
        // iqSpan[0] = I0, iqSpan[1] = Q0, iqSpan[2] = I1, iqSpan[3] = Q1...&lt;br /&gt;
        ProcessIqBlock(timestampNanos, iqSpan);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== RF Impairment Knob Conventions ===&lt;br /&gt;
&lt;br /&gt;
Fields 14 through 28 define the transmitter simulation impairments. In particular:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Field 26 (&amp;lt;code&amp;gt;rf.txNoiseFloorDb&amp;lt;/code&amp;gt;)&#039;&#039;&#039;: Broadband exciter noise floor suppression below peak carrier power, expressed in &#039;&#039;&#039;dBc&#039;&#039;&#039; (positive values, typically 0–160 dB, default 120 dB). Higher values mean greater suppression (&#039;&#039;&#039;quieter, cleaner background&#039;&#039;&#039;).&lt;br /&gt;
* &#039;&#039;&#039;Field 27 (&amp;lt;code&amp;gt;rf.oscillatorPhaseNoiseDb&amp;lt;/code&amp;gt;)&#039;&#039;&#039;: Close-in oscillator phase noise suppression at 10 kHz offset, expressed in &#039;&#039;&#039;dBc/Hz&#039;&#039;&#039; (positive values, typically 0–160 dB, default 120 dB). Higher values mean greater spectral purity (&#039;&#039;&#039;less skirt broadening&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Both fields follow the suppression convention across both audio and GNU Radio IQ transmitter sessions in protocol v25 (&amp;lt;code&amp;gt;TxImperfections.tx_noise_floor_db&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;oscillator_phase_noise_db&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
==== Precedence Order ====&lt;br /&gt;
&lt;br /&gt;
When resolving transmitter knobs:&lt;br /&gt;
# &#039;&#039;&#039;Explicit command-line positional floats&#039;&#039;&#039; have highest priority.&lt;br /&gt;
# &#039;&#039;&#039;Explicit keys in &amp;lt;code&amp;gt;--preset&amp;lt;/code&amp;gt; files&#039;&#039;&#039; (&amp;lt;code&amp;gt;rf.*&amp;lt;/code&amp;gt;) override template base defaults.&lt;br /&gt;
# &#039;&#039;&#039;Radio preset template defaults&#039;&#039;&#039; (e.g. &amp;lt;code&amp;gt;CLEAN_LAB&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ICOM_IC_7300&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;GENERIC_HF&amp;lt;/code&amp;gt;) provide base defaults for any unspecified knobs.&lt;/div&gt;</summary>
		<author><name>Sophie-developer</name></author>
	</entry>
	<entry>
		<id>https://wiki.simtx.net/index.php?title=Main_Page&amp;diff=2530</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.simtx.net/index.php?title=Main_Page&amp;diff=2530"/>
		<updated>2026-10-25T21:33:31Z</updated>

		<summary type="html">&lt;p&gt;Sophie-developer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px solid #a2a9b1; border-top:4px solid #36c; padding:1em 1.4em; margin-bottom:1.2em;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size:180%;&amp;quot;&amp;gt;SimTX Wiki&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SimTX is a shared radio simulation.&#039;&#039;&#039; You set up virtual stations, transmit audio and listen with an SDR program. Distance, antennas and radio conditions change what listeners hear.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
&#039;&#039;&#039;[[Getting Started]]&#039;&#039;&#039;: install the app, sign in, create a station, transmit and listen.&lt;br /&gt;
&lt;br /&gt;
== User guides ==&lt;br /&gt;
* &#039;&#039;&#039;[[SimTX Guide/Transmitting|Transmitting]]&#039;&#039;&#039; and &#039;&#039;&#039;[[SimTX Guide/Receiving|Receiving]]&#039;&#039;&#039;: the Transmit and Receive tabs.&lt;br /&gt;
* &#039;&#039;&#039;[[SimTX Guide/Stations|Stations]]&#039;&#039;&#039;: your stations, antennas and radios.&lt;br /&gt;
* &#039;&#039;&#039;[[SimTX Guide/Satellites|Satellites]]&#039;&#039;&#039;: launch a satellite, follow its passes and deorbit it.&lt;br /&gt;
* &#039;&#039;&#039;[[SimTX Guide/Rotators and tracking|Rotators and tracking]]&#039;&#039;&#039;: turn an antenna or follow a satellite.&lt;br /&gt;
* &#039;&#039;&#039;[[SimTX Guide/Map and coverage|Map and coverage]]&#039;&#039;&#039;: the globe, station lists and coverage maps.&lt;br /&gt;
* &#039;&#039;&#039;[[SimTX Guide/Catalog and add-ons|Catalog and add-ons]]&#039;&#039;&#039;, &#039;&#039;&#039;[[SimTX Guide/Health|Health]]&#039;&#039;&#039;, &#039;&#039;&#039;[[SimTX Guide/Settings and shortcuts|Settings and shortcuts]]&#039;&#039;&#039; and &#039;&#039;&#039;[[SimTX Guide/Troubleshooting|Troubleshooting]]&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;[[CLI]]&#039;&#039;&#039;: CLI documentation, for integrations.&lt;br /&gt;
&lt;br /&gt;
All guides are listed on [[SimTX Guide]].&lt;br /&gt;
&lt;br /&gt;
== For developers ==&lt;br /&gt;
The [[SimTX API]] reference documents the account service and the game protocol, message by message. Start with the [[SimTX API/Quick start|quick start]].&lt;br /&gt;
&lt;br /&gt;
== Learn in order ==&lt;br /&gt;
# &#039;&#039;&#039;[[SimTX Guide/Transmitting|Find your way around]]&#039;&#039;&#039;: the Transmit tab&#039;s controls and meters. The Java transmitter&#039;s window is described on [[Transmitter Interface]].&lt;br /&gt;
# &#039;&#039;&#039;[[Transmission Sources|Choose what to send]]&#039;&#039;&#039;: play a file, use a microphone, or send a stream.&lt;br /&gt;
# &#039;&#039;&#039;[[Antenna System|Change frequency and coverage]]&#039;&#039;&#039;: choose and adjust an antenna, then learn [[Propagation Basics|why reception changes]].&lt;br /&gt;
# &#039;&#039;&#039;[[Lua extensions|Add features]]&#039;&#039;&#039;: install modes, audio processors, tools, and themes without writing code.&lt;br /&gt;
# &#039;&#039;&#039;[[How to receive|Receive]]&#039;&#039;&#039;: listen with any [[wikipedia:Software-defined_radio|SDR]] program.&lt;br /&gt;
&lt;br /&gt;
[[File:SimTX Transmitter desktop app.png|thumb|center|850px|alt=SimTX desktop app window on the Stations tab: a globe of Europe and Africa with Demo hilltop, an orange TX beam at 300°, a blue RX beam at 180°, dashed lines to satellites, orbit rings, and the station&#039;s details in the sidebar.|The SimTX desktop app on the Stations tab, with a station on air, its beam headings and the satellites in view.]]&lt;br /&gt;
&lt;br /&gt;
== Find a specific answer ==&lt;br /&gt;
* &#039;&#039;&#039;Nothing happens or no sound?&#039;&#039;&#039; See [[SimTX Guide/Troubleshooting|Troubleshooting]], or [[Troubleshooting]] for the Java transmitter.&lt;br /&gt;
* &#039;&#039;&#039;Which radio mode should I choose?&#039;&#039;&#039; See [[Modulation Modes]].&lt;br /&gt;
* &#039;&#039;&#039;How do I save or share my station setup?&#039;&#039;&#039; See [[SimTX Guide/Stations|Stations]] and [[Extension catalog]]. For the Java transmitter, see [[Station Configuration]].&lt;br /&gt;
* &#039;&#039;&#039;What do SWR, bandwidth, and IQ mean?&#039;&#039;&#039; See [[Radio terms]].&lt;br /&gt;
* &#039;&#039;&#039;Looking for formulas or the Lua API?&#039;&#039;&#039; See the [[Documentation|documentation index]].&lt;br /&gt;
&lt;br /&gt;
== Community and other ways to use SimTX ==&lt;br /&gt;
* [[:Category:Radio Stations|Community radio stations]]: stations described by their operators.&lt;br /&gt;
* [[Guide to setting up sdr console with simtx|SDR Console]], [[DATV RX Tutorial|digital television reception]], [[DATV TX Tutorial|digital television transmission]], [[How to receive]] and [[DRM TX tutorial|DRM transmission]]: additional community guides.&lt;br /&gt;
* [[Getting Started#1. Install the app|Download the desktop app]]&lt;br /&gt;
* [https://simtx.net/downloads Download the Java transmitter]&lt;br /&gt;
* [https://simtx.net SimTX website]&lt;br /&gt;
* [https://discord.gg/BxtpFJAs6c SimTX Discord]&lt;/div&gt;</summary>
		<author><name>Sophie-developer</name></author>
	</entry>
	<entry>
		<id>https://wiki.simtx.net/index.php?title=CLI&amp;diff=2529</id>
		<title>CLI</title>
		<link rel="alternate" type="text/html" href="https://wiki.simtx.net/index.php?title=CLI&amp;diff=2529"/>
		<updated>2026-10-25T20:25:12Z</updated>

		<summary type="html">&lt;p&gt;Sophie-developer: Create the CLI page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= CLI =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;simtx-cli&amp;lt;/code&amp;gt; is the headless companion to SimTX Transmitter. It can transmit&lt;br /&gt;
audio files, generated white noise, or GNU Radio IQ from one of your persistent&lt;br /&gt;
stations, serve the simulated world over rtl-tcp, manage your stations and&lt;br /&gt;
satellites, predict satellite passes, sign in to a SimTX account, query a&lt;br /&gt;
server, and check for updates. It speaks SimTX client protocol v25.&lt;br /&gt;
&lt;br /&gt;
This document covers every command, option, environment variable, preset key,&lt;br /&gt;
output format, and exit condition.&lt;br /&gt;
&lt;br /&gt;
== Contents ==&lt;br /&gt;
&lt;br /&gt;
* [[#quick start|Quick start]]&lt;br /&gt;
* [[#command summary|Command summary]]&lt;br /&gt;
* [[#output conventions|Output conventions]]&lt;br /&gt;
* [[#global options|Global options]]&lt;br /&gt;
* [[#environment variables|Environment variables]]&lt;br /&gt;
* [[#transmitter commands|Transmitter commands]]&lt;br /&gt;
* [[#receiver command rx|Receiver command: &amp;lt;code&amp;gt;rx&amp;lt;/code&amp;gt;]]&lt;br /&gt;
* [[#station commands stations passes|Station commands: &amp;lt;code&amp;gt;stations&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;passes&amp;lt;/code&amp;gt;]]&lt;br /&gt;
* [[#account command login|Account command: &amp;lt;code&amp;gt;login&amp;lt;/code&amp;gt;]]&lt;br /&gt;
* [[#query commands|Query commands]]&lt;br /&gt;
* [[#version and update commands|Version and update commands]]&lt;br /&gt;
* [[#multiplexed serve mode serve|Multiplexed Serve Mode: &amp;lt;code&amp;gt;serve&amp;lt;/code&amp;gt;]]&lt;br /&gt;
* [[#presets|Presets]]&lt;br /&gt;
* [[#exit status and signals|Exit status and signals]]&lt;br /&gt;
* [[#troubleshooting|Troubleshooting]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Quick start ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Sign in once (stores credentials in the OS keyring by default)&lt;br /&gt;
simtx-cli login&lt;br /&gt;
&lt;br /&gt;
# Create a ground station (or use the app&#039;s station editor)&lt;br /&gt;
simtx-cli --name Home --callsign N0CALL --lat 52.37 --lon 4.90 \&lt;br /&gt;
  --antenna-type efhw stations create&lt;br /&gt;
&lt;br /&gt;
# List your stations (ids, antennas, rigs)&lt;br /&gt;
simtx-cli stations&lt;br /&gt;
&lt;br /&gt;
# Transmit a WAV file on 40 m USB from your station &amp;quot;Home&amp;quot;&lt;br /&gt;
simtx-cli --server-id myserver --station Home audio argon.simtx.net 5556 \&lt;br /&gt;
  7100000 message.wav USB&lt;br /&gt;
&lt;br /&gt;
# Transmit generated white noise on 80 m AM&lt;br /&gt;
simtx-cli --server-id myserver --station Home white argon.simtx.net 5556 3700000 AM_DSB_FC&lt;br /&gt;
&lt;br /&gt;
# Feed IQ from GNU Radio into SimTX on a local loopback port&lt;br /&gt;
simtx-cli --server-id myserver --station Home iq argon.simtx.net 5556 7100000 4567&lt;br /&gt;
&lt;br /&gt;
# Serve the simulated world to SDR++ over rtl-tcp (ad-hoc receiver)&lt;br /&gt;
simtx-cli --server-id myserver rx argon.simtx.net 5556 1234 N0CALL 7100000 1024000&lt;br /&gt;
&lt;br /&gt;
# ... or receive at a persistent station (yours or a PUBLIC one)&lt;br /&gt;
simtx-cli --server-id myserver --station Home rx argon.simtx.net 5556 1234&lt;br /&gt;
&lt;br /&gt;
# Launch a satellite and predict its passes over your station&lt;br /&gt;
simtx-cli --name Cube --callsign CUBE1 --altitude-km 550 --inclination 97.6 stations launch&lt;br /&gt;
simtx-cli --sat Cube --station Home passes&lt;br /&gt;
&lt;br /&gt;
# One-shot queries&lt;br /&gt;
simtx-cli stations argon.simtx.net 5556&lt;br /&gt;
simtx-cli health argon.simtx.net 5556&lt;br /&gt;
simtx-cli catalog argon.simtx.net 5556&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Command summary ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Command&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;&lt;br /&gt;
| Print the local build version. No network access.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt;&lt;br /&gt;
| Print update metadata and whether an update is available.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;login&amp;lt;/code&amp;gt;&lt;br /&gt;
| Sign in with the device authorization flow and store credentials.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;audio&amp;lt;/code&amp;gt;&lt;br /&gt;
| Stream a local audio file from one of your stations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;white&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whitenoise&amp;lt;/code&amp;gt;&lt;br /&gt;
| Transmit a generated white-noise signal from one of your stations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;iq&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;gnuradio&amp;lt;/code&amp;gt;&lt;br /&gt;
| Stream IQ from a local GNU Radio TCP sink via one of your stations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rx&amp;lt;/code&amp;gt;&lt;br /&gt;
| Serve the simulated world over rtl-tcp (ad-hoc or station-bound).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;stations&amp;lt;/code&amp;gt;&lt;br /&gt;
| List/create/launch/delete/deorbit your stations, or (with &amp;lt;code&amp;gt;&amp;lt;host&amp;gt; &amp;lt;port&amp;gt;&amp;lt;/code&amp;gt;) fetch a server&#039;s live station list.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;passes&amp;lt;/code&amp;gt;&lt;br /&gt;
| Predict passes of a satellite over a ground station.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;health&amp;lt;/code&amp;gt;&lt;br /&gt;
| Fetch a server health report as JSON.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;catalog&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;catalogue&amp;lt;/code&amp;gt;&lt;br /&gt;
| Fetch the catalog listing as JSON.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;serve&amp;lt;/code&amp;gt;&lt;br /&gt;
| Run a multiplexed NDJSON session engine for game integration.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
All commands except &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; require an exact version match with&lt;br /&gt;
the update service. If the CLI is outdated or the update service is&lt;br /&gt;
unreachable, the command refuses to run. Upgrade the CLI, then retry.&lt;br /&gt;
&lt;br /&gt;
Unknown commands fail before any network access.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Output conventions ==&lt;br /&gt;
&lt;br /&gt;
* Human-readable logs and progress messages always go to &#039;&#039;&#039;stderr&#039;&#039;&#039;.&lt;br /&gt;
* Machine-readable results go to &#039;&#039;&#039;stdout&#039;&#039;&#039;.&lt;br /&gt;
* Query results and update metadata are printed as one compact line beginning&lt;br /&gt;
with &amp;lt;code&amp;gt;J:&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
  simtx-cli stations argon.simtx.net 5556 | grep &#039;^J:&#039; | cut -c3- | jq .&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; prints plain text, not JSON.&lt;br /&gt;
* &amp;lt;code&amp;gt;login&amp;lt;/code&amp;gt; prints the verification URL and code as plain text.&lt;br /&gt;
* Transmitter commands (&amp;lt;code&amp;gt;audio&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;white&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;iq&amp;lt;/code&amp;gt;) print nothing to stdout unless&lt;br /&gt;
&amp;lt;code&amp;gt;--telemetry-json&amp;lt;/code&amp;gt; is enabled.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Global options ==&lt;br /&gt;
&lt;br /&gt;
These options work before or after the subcommand. Explicit flags win over&lt;br /&gt;
environment variables, which win over preset values, which win over built-in&lt;br /&gt;
defaults.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Option&lt;br /&gt;
! Default&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--lat DEG&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;52.3676&amp;lt;/code&amp;gt;&lt;br /&gt;
| Station latitude, &amp;lt;code&amp;gt;-90..90&amp;lt;/code&amp;gt;. Receiver default is &amp;lt;code&amp;gt;47.50&amp;lt;/code&amp;gt;; see &amp;lt;code&amp;gt;rx&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--lon DEG&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;4.9041&amp;lt;/code&amp;gt;&lt;br /&gt;
| Station longitude, &amp;lt;code&amp;gt;-180..180&amp;lt;/code&amp;gt;. Receiver default is &amp;lt;code&amp;gt;19.04&amp;lt;/code&amp;gt;; see &amp;lt;code&amp;gt;rx&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--power W&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt;&lt;br /&gt;
| Transmit power in watts.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--sample-rate HZ&amp;lt;/code&amp;gt;&lt;br /&gt;
| auto (&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;)&lt;br /&gt;
| Transmission sample rate (&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; = automatic wire rate based on mode/bandwidth).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--rate HZ&amp;lt;/code&amp;gt;&lt;br /&gt;
| unset&lt;br /&gt;
| Alias for &amp;lt;code&amp;gt;--sample-rate&amp;lt;/code&amp;gt; when greater than zero.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--gain GAIN&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0.9&amp;lt;/code&amp;gt;&lt;br /&gt;
| Transmission audio/carrier gain (or from preset &amp;lt;code&amp;gt;source.gain&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--duty-cycle DC&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0.5&amp;lt;/code&amp;gt;&lt;br /&gt;
| PA duty cycle &amp;lt;code&amp;gt;0.0..1.0&amp;lt;/code&amp;gt; (or from preset &amp;lt;code&amp;gt;source.dutyCycle&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--radio-preset P&amp;lt;/code&amp;gt;&lt;br /&gt;
| empty&lt;br /&gt;
| Radio model preset override (&amp;lt;code&amp;gt;GENERIC_HF&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CLEAN_LAB&amp;lt;/code&amp;gt;, etc.).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--debug&amp;lt;/code&amp;gt;&lt;br /&gt;
| off&lt;br /&gt;
| Verbose logging. Also logs every telemetry frame instead of only the first.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--telemetry-json&amp;lt;/code&amp;gt;&lt;br /&gt;
| off&lt;br /&gt;
| Stream every transmitter telemetry frame to stdout as JSON.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--plain-tcp&amp;lt;/code&amp;gt;&lt;br /&gt;
| off&lt;br /&gt;
| Connect using unencrypted TCP instead of TLS on custom server ports.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--account-url URL&amp;lt;/code&amp;gt;&lt;br /&gt;
| official service&lt;br /&gt;
| Account service to use for login and tickets.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--server-id ID&amp;lt;/code&amp;gt;&lt;br /&gt;
| empty&lt;br /&gt;
| Game server ID used to mint an authenticated ticket. Requires &amp;lt;code&amp;gt;login&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--ticket T&amp;lt;/code&amp;gt;&lt;br /&gt;
| empty&lt;br /&gt;
| Use a literal game ticket instead of account authentication.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--auth-file PATH&amp;lt;/code&amp;gt;&lt;br /&gt;
| empty&lt;br /&gt;
| Store credentials in a plaintext JSON file instead of the OS keyring.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--preset FILE&amp;lt;/code&amp;gt;&lt;br /&gt;
| empty&lt;br /&gt;
| Load defaults from a preset file.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--save-preset OUT&amp;lt;/code&amp;gt;&lt;br /&gt;
| empty&lt;br /&gt;
| Write the effective settings to a preset file and continue.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Station options ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Option&lt;br /&gt;
! Default&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--station REF&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;SIMTX_STATION&amp;lt;/code&amp;gt;&lt;br /&gt;
| Persistent station id or name (or callsign). Required for TX; makes &amp;lt;code&amp;gt;rx&amp;lt;/code&amp;gt; station-bound.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--antenna REF&amp;lt;/code&amp;gt;&lt;br /&gt;
| first antenna&lt;br /&gt;
| Station antenna id or name.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--rig REF&amp;lt;/code&amp;gt;&lt;br /&gt;
| none&lt;br /&gt;
| Station rig id or name. Without a rig the generic HF defaults and the account PA limit apply.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--track ID&amp;lt;/code&amp;gt;&lt;br /&gt;
| none&lt;br /&gt;
| Point the antenna at and Doppler-correct toward this station id (usually a satellite).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--name N&amp;lt;/code&amp;gt;&lt;br /&gt;
| —&lt;br /&gt;
| &amp;lt;code&amp;gt;stations create&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;stations launch&amp;lt;/code&amp;gt;: station name.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--callsign C&amp;lt;/code&amp;gt;&lt;br /&gt;
| —&lt;br /&gt;
| &amp;lt;code&amp;gt;stations create&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;stations launch&amp;lt;/code&amp;gt;: station callsign.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--visibility V&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;PUBLIC&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;stations create&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;stations launch&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;PUBLIC&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;UNLISTED&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--altitude-km KM&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;550&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;stations launch&amp;lt;/code&amp;gt;: circular orbit altitude above the 6371 km sphere.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--inclination DEG&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;97.6&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;stations launch&amp;lt;/code&amp;gt;: orbit inclination.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--raan DEG&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;stations launch&amp;lt;/code&amp;gt;: right ascension of the ascending node.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--sat REF&amp;lt;/code&amp;gt;&lt;br /&gt;
| —&lt;br /&gt;
| &amp;lt;code&amp;gt;passes&amp;lt;/code&amp;gt;: satellite id or name (yours or the public catalog).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--hours H&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;24&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;passes&amp;lt;/code&amp;gt;: prediction window (max 168).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--min-el DEG&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;passes&amp;lt;/code&amp;gt;: minimum elevation.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--yes&amp;lt;/code&amp;gt;&lt;br /&gt;
| off&lt;br /&gt;
| &amp;lt;code&amp;gt;stations deorbit&amp;lt;/code&amp;gt;: fire the burn without the confirmation question.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Boolean options accept &amp;lt;code&amp;gt;--flag&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;--flag=true&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;--flag=false&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Flags can appear before or after the subcommand. Use &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt; to stop flag parsing&lt;br /&gt;
before positional values that begin with &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Antenna options ===&lt;br /&gt;
&lt;br /&gt;
Antenna options describe the inline antenna of &#039;&#039;&#039;ad-hoc receivers&#039;&#039;&#039; (&amp;lt;code&amp;gt;rx&amp;lt;/code&amp;gt;&lt;br /&gt;
without &amp;lt;code&amp;gt;--station&amp;lt;/code&amp;gt;) and the first antenna of &amp;lt;code&amp;gt;stations create&amp;lt;/code&amp;gt;. Transmissions&lt;br /&gt;
always use the antenna stored on the station, so these options do not apply to&lt;br /&gt;
&amp;lt;code&amp;gt;audio&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;white&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;iq&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Option&lt;br /&gt;
! Default&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--antenna-type TYPE&amp;lt;/code&amp;gt;&lt;br /&gt;
| default EFHW&lt;br /&gt;
| Antenna template. See the list below.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--antenna-height M&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt;&lt;br /&gt;
| Antenna height in metres.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--wire-length M&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Wire or element length in metres. &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; selects a resonant length.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--azimuth DEG&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Azimuth in degrees clockwise from north.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--feedline-loss DB&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Feedline loss in dB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--nec-deck PATH&amp;lt;/code&amp;gt;&lt;br /&gt;
| empty&lt;br /&gt;
| Path to a custom NEC-2 deck file (.nec). Alias: &amp;lt;code&amp;gt;--nec&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Antenna types (case-insensitive, &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; are interchangeable):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dipole&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;inverted-v&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vertical&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;yagi-3el&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;yagi-5el&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;loop&amp;lt;/code&amp;gt;,&lt;br /&gt;
&amp;lt;code&amp;gt;beverage&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;longwire&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;efhw&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Leaving &amp;lt;code&amp;gt;--antenna-type&amp;lt;/code&amp;gt; empty uses the default shortwave EFHW antenna.&lt;br /&gt;
&lt;br /&gt;
Built-in antenna templates automatically synthesize a resonant NEC-2 deck at the&lt;br /&gt;
transmission frequency so servers requiring NEC models radiate properly without&lt;br /&gt;
manual deck configuration. Supplying &amp;lt;code&amp;gt;--nec-deck&amp;lt;/code&amp;gt; (or &amp;lt;code&amp;gt;--nec&amp;lt;/code&amp;gt;) overrides the&lt;br /&gt;
built-in template with a custom NEC-2 deck.&lt;br /&gt;
&lt;br /&gt;
=== Identity and authentication ===&lt;br /&gt;
&lt;br /&gt;
* With no &amp;lt;code&amp;gt;--server-id&amp;lt;/code&amp;gt; and no &amp;lt;code&amp;gt;--ticket&amp;lt;/code&amp;gt;, sessions are anonymous. Anonymous&lt;br /&gt;
sessions are intended for local or test servers and may be rejected by&lt;br /&gt;
official servers. Anonymous sessions are receive-only: transmitting needs a&lt;br /&gt;
station-bound ticket.&lt;br /&gt;
* Transmitter tickets are minted bound to &amp;lt;code&amp;gt;--station&amp;lt;/code&amp;gt; (and the resolved&lt;br /&gt;
antenna and rig); every reconnect mints a fresh bound ticket. A literal&lt;br /&gt;
&amp;lt;code&amp;gt;--ticket&amp;lt;/code&amp;gt; must already be bound to the same station, and then &amp;lt;code&amp;gt;--station&amp;lt;/code&amp;gt;,&lt;br /&gt;
&amp;lt;code&amp;gt;--antenna&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;--rig&amp;lt;/code&amp;gt; must be ids.&lt;br /&gt;
* Station management (&amp;lt;code&amp;gt;stations create/launch/delete/deorbit&amp;lt;/code&amp;gt;) needs the&lt;br /&gt;
&amp;lt;code&amp;gt;station.manage&amp;lt;/code&amp;gt; scope. Sessions signed in before stations existed lack it;&lt;br /&gt;
run &amp;lt;code&amp;gt;simtx-cli login&amp;lt;/code&amp;gt; again (after &amp;lt;code&amp;gt;simtx-cli&amp;lt;/code&amp;gt; has been updated) when the&lt;br /&gt;
account service answers &amp;lt;code&amp;gt;scope_required&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;--server-id&amp;lt;/code&amp;gt; mints a fresh game ticket through the signed-in account. Run&lt;br /&gt;
&amp;lt;code&amp;gt;simtx-cli login&amp;lt;/code&amp;gt; first.&lt;br /&gt;
* &amp;lt;code&amp;gt;--ticket&amp;lt;/code&amp;gt; passes a literal ticket. For long-lived sessions such as &amp;lt;code&amp;gt;rx&amp;lt;/code&amp;gt;,&lt;br /&gt;
a reused single-use ticket may stop working after the first reconnect.&lt;br /&gt;
* &amp;lt;code&amp;gt;--auth-file PATH&amp;lt;/code&amp;gt; (or &amp;lt;code&amp;gt;SIMTX_AUTH_FILE&amp;lt;/code&amp;gt;) stores the account session in a&lt;br /&gt;
plaintext JSON file with owner-only permissions. This is intended for&lt;br /&gt;
headless servers without an OS keyring. Anyone who can read that file can&lt;br /&gt;
act as the signed-in device.&lt;br /&gt;
&lt;br /&gt;
=== Preset precedence and positional filling ===&lt;br /&gt;
&lt;br /&gt;
Precedence is:&lt;br /&gt;
&lt;br /&gt;
# Explicit command-line flags and positional arguments.&lt;br /&gt;
# &amp;lt;code&amp;gt;SIMTX_*&amp;lt;/code&amp;gt; environment variables.&lt;br /&gt;
# Values loaded with &amp;lt;code&amp;gt;--preset&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Built-in defaults.&lt;br /&gt;
&lt;br /&gt;
Missing trailing positional arguments are filled left-to-right from preset&lt;br /&gt;
keys. Leading positionals cannot be skipped. For example, if a preset provides&lt;br /&gt;
&amp;lt;code&amp;gt;cli.audioFile&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;rf.modulation&amp;lt;/code&amp;gt;, you can supply only the connection and&lt;br /&gt;
station positionals:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
simtx-cli --preset station.stxpreset audio argon.simtx.net 5556 7100000&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The audio file, modulation, bandwidth, and low cut then come from the preset.&lt;br /&gt;
A preset containing every required positional also allows a bare command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
simtx-cli --preset station.stxpreset audio&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Environment variables ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Variable&lt;br /&gt;
! Equivalent option&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SIMTX_TX_LAT&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--lat&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SIMTX_TX_LON&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--lon&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SIMTX_TX_POWER&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--power&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SIMTX_SAMPLE_RATE&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--sample-rate&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SIMTX_PLAIN_TCP&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--plain-tcp&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SIMTX_FORCE_PLAIN_TCP&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--plain-tcp&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SIMTX_ACCOUNT_URL&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--account-url&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SIMTX_AUTH_FILE&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--auth-file&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SIMTX_SERVICE_CREDENTIAL&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--service-credential&amp;lt;/code&amp;gt; (receiver only)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SIMTX_STATION&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--station&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Environment variables apply to every command. The receiver location&lt;br /&gt;
(&amp;lt;code&amp;gt;47.50&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;19.04&amp;lt;/code&amp;gt;) only applies when none of &amp;lt;code&amp;gt;--lat&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--lon&amp;lt;/code&amp;gt;,&lt;br /&gt;
&amp;lt;code&amp;gt;SIMTX_TX_LAT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SIMTX_TX_LON&amp;lt;/code&amp;gt;, or the preset latitude/longitude keys are set.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Transmitter commands ==&lt;br /&gt;
&lt;br /&gt;
All transmitter commands run on one of your persistent stations:&lt;br /&gt;
&amp;lt;code&amp;gt;--station&amp;lt;/code&amp;gt; is required (else the command fails with &amp;quot;transmitting needs&lt;br /&gt;
--station&amp;quot;), together with &amp;lt;code&amp;gt;--server-id&amp;lt;/code&amp;gt; (or a station-bound &amp;lt;code&amp;gt;--ticket&amp;lt;/code&amp;gt;). The&lt;br /&gt;
station dictates callsign, location, antenna and pointing, the PA cap and the&lt;br /&gt;
rig&#039;s realism; the session chooses modulation, frequency, power (up to the&lt;br /&gt;
cap), source, sample rate, gain, bandwidth, low cut, tone and duty. Only the PA&lt;br /&gt;
knobs you give (a radio preset, positional overrides or &amp;lt;code&amp;gt;rf.*&amp;lt;/code&amp;gt; preset keys)&lt;br /&gt;
are sent; with a rig the server takes final drive, audio compression,&lt;br /&gt;
frequency offset and AM index from them and everything else from the rig.&lt;br /&gt;
Ad-hoc transmission (inline callsign/location/antenna) no longer exists.&lt;br /&gt;
&lt;br /&gt;
Transmitter commands use the global power and sample-rate options and run&lt;br /&gt;
until interrupted with Ctrl-C (SIGINT) or SIGTERM or until the session ends.&lt;br /&gt;
The server confirms the station with a &amp;lt;code&amp;gt;session status&amp;lt;/code&amp;gt; log line (&amp;lt;code&amp;gt;BOUND&amp;lt;/code&amp;gt;,&lt;br /&gt;
station name, callsign, PA cap); rejections carry the server&#039;s reason and code&lt;br /&gt;
(for example &amp;lt;code&amp;gt;FORBIDDEN&amp;lt;/code&amp;gt; for a station that is not yours or a ticket bound to&lt;br /&gt;
another station).&lt;br /&gt;
&lt;br /&gt;
Ports must be in &amp;lt;code&amp;gt;1..65535&amp;lt;/code&amp;gt;. Frequency must be positive and power must be&lt;br /&gt;
non-negative. Sample rates at or below zero fall back to &amp;lt;code&amp;gt;48000&amp;lt;/code&amp;gt;. Bandwidth values below the modulation minimum&lt;br /&gt;
are raised to the minimum; values above 10,000,000 Hz are capped.&lt;br /&gt;
&lt;br /&gt;
A session can be queued. The CLI logs queue position, acceptance, live update&lt;br /&gt;
acknowledgements, kicks, and telemetry.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;audio&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
simtx-cli [global flags] --station S audio &amp;lt;host&amp;gt; &amp;lt;port&amp;gt; &amp;lt;freqHz&amp;gt; &amp;lt;file&amp;gt; \&lt;br /&gt;
  [MOD] [BW] [LOWCUT] [PRESET|DRIVE ...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Streams a local audio file.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;host&amp;gt; &amp;lt;port&amp;gt;&amp;lt;/code&amp;gt; — SimTX server address.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;freqHz&amp;gt;&amp;lt;/code&amp;gt; — transmit frequency in Hz; must be positive.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;file&amp;gt;&amp;lt;/code&amp;gt; — local WAV, AIFF, or MP3 file.&lt;br /&gt;
* &amp;lt;code&amp;gt;[MOD]&amp;lt;/code&amp;gt; — modulation; defaults to &amp;lt;code&amp;gt;AM_DSB_FC&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;[BW]&amp;lt;/code&amp;gt; — occupied bandwidth in Hz; defaults to the modulation&#039;s typical&lt;br /&gt;
bandwidth.&lt;br /&gt;
* &amp;lt;code&amp;gt;[LOWCUT]&amp;lt;/code&amp;gt; — audio low cut in Hz; defaults to the modulation&#039;s typical&lt;br /&gt;
low cut.&lt;br /&gt;
* &amp;lt;code&amp;gt;[PRESET|DRIVE ...]&amp;lt;/code&amp;gt; — optional radio preset and PA knobs; see&lt;br /&gt;
[[#radio presets and pa knobs|Radio presets and PA knobs]].&lt;br /&gt;
&lt;br /&gt;
The file is streamed once. The session ends when the file ends, when the&lt;br /&gt;
server disconnects, or when you interrupt the command. For WFM, only the first&lt;br /&gt;
channel is used.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
simtx-cli --server-id myserver --station Home audio argon.simtx.net 5556 7100000 \&lt;br /&gt;
  message.wav USB&lt;br /&gt;
&lt;br /&gt;
simtx-cli --server-id myserver --station Home --antenna Yagi --rig IC-7300 \&lt;br /&gt;
  audio argon.simtx.net 5556 145500000 fm.wav NFM 12500 200&lt;br /&gt;
&lt;br /&gt;
simtx-cli --server-id myserver --station Home audio argon.simtx.net 5556 7100000 \&lt;br /&gt;
  message.wav LSB 2700 350 ICOM_IC_7300&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;white&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;whitenoise&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
simtx-cli [global flags] --station S white &amp;lt;host&amp;gt; &amp;lt;port&amp;gt; &amp;lt;freqHz&amp;gt; \&lt;br /&gt;
  [MOD] [BW] [LOWCUT] [PRESET|DRIVE ...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Transmits a generated white-noise signal. No audio samples are sent by the&lt;br /&gt;
client; the signal is generated for the session. Positional arguments are the&lt;br /&gt;
same as &amp;lt;code&amp;gt;audio&amp;lt;/code&amp;gt; without the file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
simtx-cli --server-id myserver --station Home white argon.simtx.net 5556 3700000 AM_DSB_FC 10000 80&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;iq&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;gnuradio&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
simtx-cli [global flags] --station S iq &amp;lt;host&amp;gt; &amp;lt;port&amp;gt; &amp;lt;freqHz&amp;gt; &amp;lt;localIqPort&amp;gt; \&lt;br /&gt;
  [sampleRate] [BW] [PRESET|DRIVE ...]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Streams IQ from a local GNU Radio TCP sink into a transmitter session.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;localIqPort&amp;gt;&amp;lt;/code&amp;gt; — TCP port on &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; where GNU Radio connects.&lt;br /&gt;
* &amp;lt;code&amp;gt;[sampleRate]&amp;lt;/code&amp;gt; — IQ sample rate. Overrides the global sample rate.&lt;br /&gt;
* &amp;lt;code&amp;gt;[BW]&amp;lt;/code&amp;gt; — transmit bandwidth in Hz; defaults to the sample rate.&lt;br /&gt;
* &amp;lt;code&amp;gt;[PRESET|DRIVE ...]&amp;lt;/code&amp;gt; — optional radio preset and PA knobs.&lt;br /&gt;
&lt;br /&gt;
The input stream must be interleaved little-endian 32-bit float I/Q pairs&lt;br /&gt;
(&amp;lt;code&amp;gt;gr_complex&amp;lt;/code&amp;gt;). The CLI listens only on loopback. One producer can stream at a&lt;br /&gt;
time; a restarted flowgraph can reconnect and take over.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
simtx-cli --server-id myserver --station Home iq argon.simtx.net 5556 7100000 4567&lt;br /&gt;
&lt;br /&gt;
simtx-cli --server-id myserver --station Home iq argon.simtx.net 5556 7100000 4567 \&lt;br /&gt;
  96000 96000 GENERIC_HF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In GNU Radio, use a TCP sink pointed at &amp;lt;code&amp;gt;127.0.0.1:4567&amp;lt;/code&amp;gt; with the matching&lt;br /&gt;
sample rate and complex float output.&lt;br /&gt;
&lt;br /&gt;
=== Modulations ===&lt;br /&gt;
&lt;br /&gt;
Modulation names are case-insensitive. The default is &amp;lt;code&amp;gt;AM_DSB_FC&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Common name&lt;br /&gt;
! Typical bandwidth&lt;br /&gt;
! Typical low cut&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AM_DSB_FC&amp;lt;/code&amp;gt;&lt;br /&gt;
| AM double sideband, full carrier&lt;br /&gt;
| 10000 Hz&lt;br /&gt;
| 80 Hz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AM_DSB_SC&amp;lt;/code&amp;gt;&lt;br /&gt;
| AM double sideband, suppressed carrier&lt;br /&gt;
| 6000 Hz&lt;br /&gt;
| 100 Hz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;USB&amp;lt;/code&amp;gt;&lt;br /&gt;
| Upper sideband&lt;br /&gt;
| 2700 Hz&lt;br /&gt;
| 350 Hz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;LSB&amp;lt;/code&amp;gt;&lt;br /&gt;
| Lower sideband&lt;br /&gt;
| 2700 Hz&lt;br /&gt;
| 350 Hz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CW&amp;lt;/code&amp;gt;&lt;br /&gt;
| Continuous wave&lt;br /&gt;
| 150 Hz&lt;br /&gt;
| 300 Hz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;NFM&amp;lt;/code&amp;gt;&lt;br /&gt;
| Narrow FM&lt;br /&gt;
| 12500 Hz&lt;br /&gt;
| 200 Hz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;WFM&amp;lt;/code&amp;gt;&lt;br /&gt;
| Wide FM&lt;br /&gt;
| 180000 Hz&lt;br /&gt;
| 30 Hz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;IQ&amp;lt;/code&amp;gt;&lt;br /&gt;
| External complex IQ&lt;br /&gt;
| 48000 Hz&lt;br /&gt;
| 0 Hz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;WSPR&amp;lt;/code&amp;gt;&lt;br /&gt;
| Weak Signal Propagation Reporter&lt;br /&gt;
| 6 Hz&lt;br /&gt;
| 0.5 Hz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;FT8&amp;lt;/code&amp;gt;&lt;br /&gt;
| Franke-Taylor FT8&lt;br /&gt;
| 50 Hz&lt;br /&gt;
| 20 Hz&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Radio presets and PA knobs ===&lt;br /&gt;
&lt;br /&gt;
The optional trailing arguments start with a radio preset name, followed by&lt;br /&gt;
up to 15 numeric overrides in the order shown below. The preset name is&lt;br /&gt;
case-insensitive and &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; are interchangeable. Missing or unparseable&lt;br /&gt;
values use the preset&#039;s defaults.&lt;br /&gt;
&lt;br /&gt;
Which knobs are sent: naming a radio preset (positionally, with&lt;br /&gt;
&amp;lt;code&amp;gt;--radio-preset&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;rf.radioPreset&amp;lt;/code&amp;gt;) sends all 15; otherwise only the&lt;br /&gt;
positional values and &amp;lt;code&amp;gt;rf.*&amp;lt;/code&amp;gt; preset keys you give are sent and the rest come&lt;br /&gt;
from the station&#039;s rig (or the generic HF preset when the session has no rig).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Preset&lt;br /&gt;
! Character&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GENERIC_HF&amp;lt;/code&amp;gt;&lt;br /&gt;
| Generic HF transceiver&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CLEAN_LAB&amp;lt;/code&amp;gt;&lt;br /&gt;
| Clean lab exciter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ICOM_IC_7300&amp;lt;/code&amp;gt;&lt;br /&gt;
| Icom IC-7300 class HF rig&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ICOM_IC_705&amp;lt;/code&amp;gt;&lt;br /&gt;
| Icom IC-705 class QRP SDR&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ICOM_IC_7610&amp;lt;/code&amp;gt;&lt;br /&gt;
| Icom IC-7610 class base SDR&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;YAESU_FTDX10&amp;lt;/code&amp;gt;&lt;br /&gt;
| Yaesu FTDX10 class HF SDR&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ELECRAFT_KX3&amp;lt;/code&amp;gt;&lt;br /&gt;
| Elecraft KX2/KX3 class QRP&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;YAESU_FT_817&amp;lt;/code&amp;gt;&lt;br /&gt;
| Yaesu FT-817/818 class QRP&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;KENWOOD_TS_590&amp;lt;/code&amp;gt;&lt;br /&gt;
| Kenwood TS-590 class HF rig&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;XIEGU_G90&amp;lt;/code&amp;gt;&lt;br /&gt;
| Xiegu G90 class portable HF&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;USDX_QRP&amp;lt;/code&amp;gt;&lt;br /&gt;
| (tr)uSDX / uSDX QRP Class-E&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MIL_MANPACK&amp;lt;/code&amp;gt;&lt;br /&gt;
| Rugged HF manpack&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;VINTAGE_TUBE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Vintage tube SSB&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;COLLINS_KWM2&amp;lt;/code&amp;gt;&lt;br /&gt;
| Collins KWM-2 class tube SSB&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;BOAT_ANCHOR_AM&amp;lt;/code&amp;gt;&lt;br /&gt;
| Vintage AM boatanchor&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CB_EXPORT_AM&amp;lt;/code&amp;gt;&lt;br /&gt;
| Overdriven export AM/SSB&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;VHF_HANDHELD_FM&amp;lt;/code&amp;gt;&lt;br /&gt;
| Budget VHF/UHF handheld FM&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;HOME_BREW_CLASS_E_AM&amp;lt;/code&amp;gt;&lt;br /&gt;
| Homebrew Class-E AM&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DIRTY_DRIVER&amp;lt;/code&amp;gt;&lt;br /&gt;
| Overdriven driver / poor ALC&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Numeric override order:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! #&lt;br /&gt;
! Knob&lt;br /&gt;
! Unit&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Final drive&lt;br /&gt;
| dB&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| PA headroom&lt;br /&gt;
| dB&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Audio compression&lt;br /&gt;
| dB&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| PA softness&lt;br /&gt;
| —&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| PA AM/PM&lt;br /&gt;
| degrees&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Carrier leak&lt;br /&gt;
| dB&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| Opposite-sideband suppression&lt;br /&gt;
| dB&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| Frequency offset&lt;br /&gt;
| Hz&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| Mains hum level&lt;br /&gt;
| dB&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| Mains hum frequency&lt;br /&gt;
| Hz&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| AM modulation index&lt;br /&gt;
| —&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| PA supply sag&lt;br /&gt;
| dB&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| TX noise floor&lt;br /&gt;
| dB&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| Oscillator phase noise&lt;br /&gt;
| dB&lt;br /&gt;
|-&lt;br /&gt;
| 15&lt;br /&gt;
| CW key rise time&lt;br /&gt;
| ms&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example: &amp;lt;code&amp;gt;... USB 2700 350 ICOM_IC_7300 1.5 9&amp;lt;/code&amp;gt; selects the IC-7300 preset&lt;br /&gt;
and overrides final drive to 1.5 dB and PA headroom to 9 dB.&lt;br /&gt;
&lt;br /&gt;
=== Telemetry ===&lt;br /&gt;
&lt;br /&gt;
Transmitter sessions receive server-reported telemetry. By default the first&lt;br /&gt;
frame is logged at info level and later frames at debug level. Use &amp;lt;code&amp;gt;--debug&amp;lt;/code&amp;gt; to&lt;br /&gt;
log every frame.&lt;br /&gt;
&lt;br /&gt;
With &amp;lt;code&amp;gt;--telemetry-json&amp;lt;/code&amp;gt;, every frame is also written to stdout as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
J:{&amp;quot;type&amp;quot;:&amp;quot;telemetry&amp;quot;,&amp;quot;telemetry&amp;quot;:{...}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The full telemetry object:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! JSON field&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sequence&amp;lt;/code&amp;gt;&lt;br /&gt;
| Frame sequence number.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ServerTimeMillis&amp;lt;/code&amp;gt;&lt;br /&gt;
| Server timestamp in milliseconds.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ActualFrequencyHz&amp;lt;/code&amp;gt;&lt;br /&gt;
| Actual transmit frequency.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RequestedPowerWatts&amp;lt;/code&amp;gt;&lt;br /&gt;
| Requested power.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ForwardPowerWatts&amp;lt;/code&amp;gt;&lt;br /&gt;
| Forward power at the finals.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DeliveredPowerWatts&amp;lt;/code&amp;gt;&lt;br /&gt;
| Delivered power.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ReflectedPowerWatts&amp;lt;/code&amp;gt;&lt;br /&gt;
| Reflected power.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;VSWR&amp;lt;/code&amp;gt;&lt;br /&gt;
| Standing-wave ratio.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MismatchLossDb&amp;lt;/code&amp;gt;&lt;br /&gt;
| Mismatch loss in dB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TransformerLossDb&amp;lt;/code&amp;gt;&lt;br /&gt;
| Transformer loss in dB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;FoldbackLossDb&amp;lt;/code&amp;gt;&lt;br /&gt;
| Foldback loss in dB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AlcDb&amp;lt;/code&amp;gt;&lt;br /&gt;
| Automatic level control, in dB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;BufferSeconds&amp;lt;/code&amp;gt;&lt;br /&gt;
| Server-side buffer depth in seconds.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;FinalsTemperatureC&amp;lt;/code&amp;gt;&lt;br /&gt;
| Finals temperature in °C.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ThermalFoldbackDb&amp;lt;/code&amp;gt;&lt;br /&gt;
| Thermal foldback in dB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;PaCompressionDb&amp;lt;/code&amp;gt;&lt;br /&gt;
| PA compression in dB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;PaHeatWatts&amp;lt;/code&amp;gt;&lt;br /&gt;
| PA heat dissipation in watts.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;PaEfficiencyPercent&amp;lt;/code&amp;gt;&lt;br /&gt;
| PA efficiency in percent.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;PaThermalFaultActive&amp;lt;/code&amp;gt;&lt;br /&gt;
| True when the PA thermal fault is active.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Human-readable log lines use these short field names: &amp;lt;code&amp;gt;seq&amp;lt;/code&amp;gt;,&lt;br /&gt;
&amp;lt;code&amp;gt;serverTimeMillis&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;freqHz&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;requestedW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;forwardW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;deliveredW&amp;lt;/code&amp;gt;,&lt;br /&gt;
&amp;lt;code&amp;gt;reflectedW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vswr&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mismatchLossDb&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;transformerLossDb&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;foldbackLossDb&amp;lt;/code&amp;gt;,&lt;br /&gt;
&amp;lt;code&amp;gt;alcDb&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bufferS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tempC&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;thermalFoldbackDb&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;paCompressionDb&amp;lt;/code&amp;gt;,&lt;br /&gt;
&amp;lt;code&amp;gt;paHeatW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;paEfficiencyPct&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;paThermalFault&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
simtx-cli --telemetry-json --server-id myserver --station Home audio argon.simtx.net 5556 \&lt;br /&gt;
  7100000 message.wav USB \&lt;br /&gt;
  | grep &#039;^J:&#039; | cut -c3- | jq &#039;.telemetry.FinalsTemperatureC&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Receiver command: &amp;lt;code&amp;gt;rx&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
simtx-cli [global flags] rx &amp;lt;simtxHost&amp;gt; &amp;lt;simtxPort&amp;gt; [rtlTcpPort] [callsign] \&lt;br /&gt;
  [centerHz] [bandwidthHz]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Serves the simulated world over rtl-tcp so an SDR application such as SDR++&lt;br /&gt;
can tune around the requested center frequency and bandwidth. Point the SDR&lt;br /&gt;
client at the local rtl-tcp endpoint.&lt;br /&gt;
&lt;br /&gt;
Defaults:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Positional&lt;br /&gt;
! Default&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rtlTcpPort&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;1234&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;callsign&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;RTLTCP&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;centerHz&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;7100000&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;bandwidthHz&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;1024000&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| location&lt;br /&gt;
| Budapest (&amp;lt;code&amp;gt;47.50&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;19.04&amp;lt;/code&amp;gt;)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Without &amp;lt;code&amp;gt;--station&amp;lt;/code&amp;gt; the receiver is ad-hoc: it uses the antenna options, the&lt;br /&gt;
callsign positional and &amp;lt;code&amp;gt;--lat&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--lon&amp;lt;/code&amp;gt;, and works anonymously. With&lt;br /&gt;
&amp;lt;code&amp;gt;--station&amp;lt;/code&amp;gt; (your own station by id or name, or someone else&#039;s PUBLIC station&lt;br /&gt;
by id) every upstream session mints a fresh receiver ticket bound to that&lt;br /&gt;
station (needs &amp;lt;code&amp;gt;--server-id&amp;lt;/code&amp;gt;, or a station-bound &amp;lt;code&amp;gt;--ticket&amp;lt;/code&amp;gt;): the station&#039;s&lt;br /&gt;
location, antenna and rig apply and the callsign positional and antenna&lt;br /&gt;
options are ignored. &amp;lt;code&amp;gt;--antenna&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--rig&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;--track&amp;lt;/code&amp;gt; work as for TX.&lt;br /&gt;
&amp;lt;code&amp;gt;--timestamped&amp;lt;/code&amp;gt; sets the v25 &amp;lt;code&amp;gt;timestamped&amp;lt;/code&amp;gt; flag of the receiver session (there&lt;br /&gt;
is no separate timestamped role any more). The upstream&lt;br /&gt;
connection is to the SimTX server given by &amp;lt;code&amp;gt;&amp;lt;simtxHost&amp;gt; &amp;lt;simtxPort&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
The callsign follows the same rules as transmitter sessions. The center&lt;br /&gt;
frequency must be zero or greater, the bandwidth must be positive, and both&lt;br /&gt;
ports must be in &amp;lt;code&amp;gt;1..65535&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
simtx-cli --server-id myserver rx argon.simtx.net 5556 1234 N0CALL 7100000 1024000&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then connect SDR++ to &amp;lt;code&amp;gt;127.0.0.1:1234&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Receiver options ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Option&lt;br /&gt;
! Default&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--hardware-profile PATH&amp;lt;/code&amp;gt;&lt;br /&gt;
| generic R820T&lt;br /&gt;
| RTL tuner/oscillator profile file.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--service-credential VALUE&amp;lt;/code&amp;gt;&lt;br /&gt;
| empty&lt;br /&gt;
| Service credential for authenticated receiver access. Requires &amp;lt;code&amp;gt;--server-id&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--service-credential-file PATH&amp;lt;/code&amp;gt;&lt;br /&gt;
| empty&lt;br /&gt;
| Read the service credential from an owner-only (&amp;lt;code&amp;gt;0600&amp;lt;/code&amp;gt;) file.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--timestamped&amp;lt;/code&amp;gt;&lt;br /&gt;
| off&lt;br /&gt;
| Use the timestamped receiver mode.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--rx-read-timeout-ms N&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;5000&amp;lt;/code&amp;gt;&lt;br /&gt;
| Upstream read timeout, &amp;lt;code&amp;gt;1..60000&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; uses the default.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--rx-max-retries N&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;&lt;br /&gt;
| Upstream attempts before failing. &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; retries forever. &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; uses the default.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--rx-retry-base-ms N&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;250&amp;lt;/code&amp;gt;&lt;br /&gt;
| Base retry delay, &amp;lt;code&amp;gt;1..5000&amp;lt;/code&amp;gt;. Retries back off with jitter. &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; uses the default.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--rx-jitter-ms N&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;300&amp;lt;/code&amp;gt;&lt;br /&gt;
| Jitter buffer, &amp;lt;code&amp;gt;1..2000&amp;lt;/code&amp;gt;. Negative disables prefetch. &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; uses the default.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--rx-auto-stepdown&amp;lt;/code&amp;gt;&lt;br /&gt;
| off&lt;br /&gt;
| Narrow the upstream request after repeated stalls.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--rx-no-lossy-link&amp;lt;/code&amp;gt;&lt;br /&gt;
| off&lt;br /&gt;
| Disable all lossy-link tuning at once: synchronous reads, fixed backoff, and resets on reconnect.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--rx-listen-host IP&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;&lt;br /&gt;
| rtl-tcp bind address. Must be an IP literal.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
WARNING: &amp;lt;code&amp;gt;--rx-listen-host 0.0.0.0&amp;lt;/code&amp;gt; exposes the bridge to the LAN. The&lt;br /&gt;
rtl-tcp bridge is unauthenticated, so anyone who can reach the port can&lt;br /&gt;
retune it.&lt;br /&gt;
&lt;br /&gt;
Service credential notes:&lt;br /&gt;
&lt;br /&gt;
* A service credential requires &amp;lt;code&amp;gt;--server-id&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;--service-credential&amp;lt;/code&amp;gt; can also come from &amp;lt;code&amp;gt;SIMTX_SERVICE_CREDENTIAL&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;--service-credential-file&amp;lt;/code&amp;gt; must be readable only by its owner (&amp;lt;code&amp;gt;chmod 600&amp;lt;/code&amp;gt;)&lt;br /&gt;
on Unix-like systems.&lt;br /&gt;
* Service credentials are never written to preset files.&lt;br /&gt;
* With a credential or account identity, the receiver asks for a fresh ticket&lt;br /&gt;
on each upstream reconnect.&lt;br /&gt;
&lt;br /&gt;
Press Ctrl-C to stop the bridge.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Station commands: &amp;lt;code&amp;gt;stations&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;passes&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
simtx-cli [global flags] stations [list]&lt;br /&gt;
simtx-cli [global flags] stations show &amp;lt;id|name&amp;gt;&lt;br /&gt;
simtx-cli [global flags] --name N --callsign C --lat L --lon L [antenna options] \&lt;br /&gt;
  [--visibility PUBLIC|UNLISTED] stations create&lt;br /&gt;
simtx-cli [global flags] --name N --callsign C [--altitude-km KM] [--inclination DEG] \&lt;br /&gt;
  [--raan DEG] [--visibility PUBLIC|UNLISTED] stations launch&lt;br /&gt;
simtx-cli [global flags] stations delete &amp;lt;id|name&amp;gt;&lt;br /&gt;
simtx-cli [global flags] [--yes] stations deorbit &amp;lt;id|name&amp;gt;&lt;br /&gt;
simtx-cli [global flags] --sat &amp;lt;id|name&amp;gt; --station &amp;lt;id|name&amp;gt; [--hours H] [--min-el DEG] passes&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These commands talk to the account service through your signed-in session&lt;br /&gt;
(run &amp;lt;code&amp;gt;login&amp;lt;/code&amp;gt; first) and print one &amp;lt;code&amp;gt;J:&amp;lt;/code&amp;gt; line:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Command&lt;br /&gt;
! &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;&lt;br /&gt;
! Payload&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;stations&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;list&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;my-stations&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;stations: [StationView]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;show&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;station&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;station: StationView&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;create&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;station.created&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;station: StationView&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;launch&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;station.launched&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;station: StationView&amp;lt;/code&amp;gt; (orbit epoch = launch)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;station.deleted&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;stationId&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;deorbit&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;station.deorbiting&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;station: StationView&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;state: DEORBITING&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;deorbit&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;passes&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;passes&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;satellite&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;station&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;from&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;to&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;reentryAt&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;passes&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;StationView&amp;lt;/code&amp;gt; is the account service&#039;s JSON (camelCase): &amp;lt;code&amp;gt;stationId&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;kind&amp;lt;/code&amp;gt;&lt;br /&gt;
(&amp;lt;code&amp;gt;GROUND&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;SATELLITE&amp;lt;/code&amp;gt;), &amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;callsign&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;visibility&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;revision&amp;lt;/code&amp;gt;,&lt;br /&gt;
&amp;lt;code&amp;gt;limits&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;location&amp;lt;/code&amp;gt; (ground) or &amp;lt;code&amp;gt;orbit&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;attitude&amp;lt;/code&amp;gt; (satellite), &amp;lt;code&amp;gt;antennas&amp;lt;/code&amp;gt;&lt;br /&gt;
(&amp;lt;code&amp;gt;antennaId&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ordinal&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;heightMeters&amp;lt;/code&amp;gt;, … &amp;lt;code&amp;gt;mount&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pointing&amp;lt;/code&amp;gt;)&lt;br /&gt;
and &amp;lt;code&amp;gt;rigs&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;rigId&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;paMaxWatts&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;noiseFigureDb&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tx&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;create&amp;lt;/code&amp;gt; makes a ground station with one antenna built from the antenna&lt;br /&gt;
options (default EFHW) at &amp;lt;code&amp;gt;--lat&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;--lon&amp;lt;/code&amp;gt;. Add more antennas and rigs, or&lt;br /&gt;
edit them, in the app&#039;s station editor.&lt;br /&gt;
* &amp;lt;code&amp;gt;launch&amp;lt;/code&amp;gt; puts a satellite on a circular &amp;lt;code&amp;gt;simtx-j2-v1&amp;lt;/code&amp;gt; orbit (&amp;lt;code&amp;gt;--altitude-km&amp;lt;/code&amp;gt;&lt;br /&gt;
above the 6371 km sphere, &amp;lt;code&amp;gt;--inclination&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--raan&amp;lt;/code&amp;gt;; the mean anomaly is 0&lt;br /&gt;
at the launch instant), nadir-pointing with one turnstile antenna. The&lt;br /&gt;
perigee must be at least 200 km and the apogee at most 40,000 km.&lt;br /&gt;
&#039;&#039;&#039;Satellites are sealed at launch&#039;&#039;&#039;: only name, callsign, visibility and&lt;br /&gt;
limits can change afterwards; deorbit and relaunch to change anything else.&lt;br /&gt;
Use the app&#039;s mission designer for custom orbits, attitudes and antennas.&lt;br /&gt;
* &amp;lt;code&amp;gt;deorbit&amp;lt;/code&amp;gt; fires a real retrograde burn. It first fetches a preview and&lt;br /&gt;
prints the burn (delta-v) and when and where the satellite will reenter,&lt;br /&gt;
then asks &amp;lt;code&amp;gt;Fire the deorbit burn? This cannot be undone. [y/N]&amp;lt;/code&amp;gt; on stderr;&lt;br /&gt;
only &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt; fires it. &amp;lt;code&amp;gt;--yes&amp;lt;/code&amp;gt; skips the question (needed when stdin is&lt;br /&gt;
not a terminal). The satellite becomes &amp;lt;code&amp;gt;DEORBITING&amp;lt;/code&amp;gt; on its falling orbit,&lt;br /&gt;
stays fully usable (tickets, sessions, passes) and burns up at&lt;br /&gt;
&amp;lt;code&amp;gt;deorbit.reentryAt&amp;lt;/code&amp;gt; (80 km), after which it is &amp;lt;code&amp;gt;DEORBITED&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;StationView&amp;lt;/code&amp;gt;&lt;br /&gt;
carries `deorbit: {burnAt, reentryAt, reentryLocation: {latitudeDeg,&lt;br /&gt;
longitudeDeg}, deltaVMps}&amp;lt;code&amp;gt;. A second burn fails with &amp;lt;/code&amp;gt;already_deorbiting`.&lt;br /&gt;
* &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; removes ground stations (satellites must be deorbited and reenter&lt;br /&gt;
first).&lt;br /&gt;
* &amp;lt;code&amp;gt;passes&amp;lt;/code&amp;gt; predicts locally with the Go port of &amp;lt;code&amp;gt;simtx-j2-v1&amp;lt;/code&amp;gt; (the server is&lt;br /&gt;
authoritative). Each pass has &amp;lt;code&amp;gt;aos&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tca&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;los&amp;lt;/code&amp;gt; (RFC 3339 UTC),&lt;br /&gt;
&amp;lt;code&amp;gt;maxElevationDeg&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;aosAzimuthDeg&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;losAzimuthDeg&amp;lt;/code&amp;gt; and&lt;br /&gt;
&amp;lt;code&amp;gt;maxDopplerHzPerMHz&amp;lt;/code&amp;gt; (multiply by the carrier in MHz). For a deorbiting&lt;br /&gt;
satellite the window ends at &amp;lt;code&amp;gt;reentryAt&amp;lt;/code&amp;gt; (also printed), a pass in progress&lt;br /&gt;
at reentry ends there, and after reentry the list is empty.&lt;br /&gt;
&lt;br /&gt;
Without arguments &amp;lt;code&amp;gt;stations&amp;lt;/code&amp;gt; lists &#039;&#039;&#039;your&#039;&#039;&#039; stations; &amp;lt;code&amp;gt;stations &amp;lt;host&amp;gt; &amp;lt;port&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
is the live server query described under [[#query commands|Query commands]].&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Account command: &amp;lt;code&amp;gt;login&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
simtx-cli [--account-url URL] [--auth-file PATH] login&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Starts a device authorization flow:&lt;br /&gt;
&lt;br /&gt;
# The CLI prints a verification URL and a short code.&lt;br /&gt;
# Open the URL and approve the code in a browser.&lt;br /&gt;
# The CLI stores the account session and exits.&lt;br /&gt;
&lt;br /&gt;
If a usable session is already stored, &amp;lt;code&amp;gt;login&amp;lt;/code&amp;gt; reports that you are signed in&lt;br /&gt;
and exits successfully.&lt;br /&gt;
&lt;br /&gt;
By default the session is stored in the OS keyring. With &amp;lt;code&amp;gt;--auth-file PATH&amp;lt;/code&amp;gt;,&lt;br /&gt;
it is stored in a plaintext JSON file with owner-only permissions. The CLI&lt;br /&gt;
logs a warning when the plaintext store is used.&lt;br /&gt;
&lt;br /&gt;
If the code expires, run &amp;lt;code&amp;gt;login&amp;lt;/code&amp;gt; again.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Query commands ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
simtx-cli [global flags] stations &amp;lt;host&amp;gt; &amp;lt;port&amp;gt;&lt;br /&gt;
simtx-cli [global flags] health &amp;lt;host&amp;gt; &amp;lt;port&amp;gt;&lt;br /&gt;
simtx-cli [global flags] catalog &amp;lt;host&amp;gt; &amp;lt;port&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Queries are one-shot. Each opens a session to the server, requests the data,&lt;br /&gt;
prints a single &amp;lt;code&amp;gt;J:&amp;lt;/code&amp;gt; line, and exits. The request waits up to 10 seconds for a&lt;br /&gt;
response.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;catalogue&amp;lt;/code&amp;gt; is an alias for &amp;lt;code&amp;gt;catalog&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Queries accept the identity options: anonymous by default, &amp;lt;code&amp;gt;--ticket&amp;lt;/code&amp;gt; for a&lt;br /&gt;
literal ticket, or &amp;lt;code&amp;gt;--server-id&amp;lt;/code&amp;gt; to mint a ticket through the signed-in&lt;br /&gt;
account. If the server bans the session, the command fails with the server&#039;s&lt;br /&gt;
message.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;stations&amp;lt;/code&amp;gt; output ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;stations &amp;lt;host&amp;gt; &amp;lt;port&amp;gt;&amp;lt;/code&amp;gt; lists what the server sees: persistent stations with&lt;br /&gt;
their live sessions, every active PUBLIC satellite (even with nobody attached;&lt;br /&gt;
&amp;lt;code&amp;gt;latDeg&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;lonDeg&amp;lt;/code&amp;gt; is the sub-satellite point), and ad-hoc sessions (&amp;lt;code&amp;gt;kind&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ADHOC&amp;lt;/code&amp;gt;, no &amp;lt;code&amp;gt;stationId&amp;lt;/code&amp;gt;, one session). UNLISTED stations appear as ad-hoc&lt;br /&gt;
sessions with the callsign only.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;stations&amp;quot;,&lt;br /&gt;
  &amp;quot;host&amp;quot;: &amp;quot;argon.simtx.net&amp;quot;,&lt;br /&gt;
  &amp;quot;port&amp;quot;: 5556,&lt;br /&gt;
  &amp;quot;capturedAtMs&amp;quot;: 1792843466892,&lt;br /&gt;
  &amp;quot;count&amp;quot;: 1,&lt;br /&gt;
  &amp;quot;stations&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;stationId&amp;quot;: &amp;quot;…&amp;quot;,&lt;br /&gt;
      &amp;quot;kind&amp;quot;: &amp;quot;GROUND&amp;quot;,&lt;br /&gt;
      &amp;quot;callsign&amp;quot;: &amp;quot;N0CALL&amp;quot;,&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;Home&amp;quot;,&lt;br /&gt;
      &amp;quot;ownerHandle&amp;quot;: &amp;quot;n0call&amp;quot;,&lt;br /&gt;
      &amp;quot;visibility&amp;quot;: &amp;quot;PUBLIC&amp;quot;,&lt;br /&gt;
      &amp;quot;latDeg&amp;quot;: 52.37,&lt;br /&gt;
      &amp;quot;lonDeg&amp;quot;: 4.9,&lt;br /&gt;
      &amp;quot;altitudeMeters&amp;quot;: 0,&lt;br /&gt;
      &amp;quot;revision&amp;quot;: 3,&lt;br /&gt;
      &amp;quot;sessions&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;sessionId&amp;quot;: &amp;quot;…&amp;quot;,&lt;br /&gt;
          &amp;quot;role&amp;quot;: &amp;quot;TX&amp;quot;,&lt;br /&gt;
          &amp;quot;antennaId&amp;quot;: &amp;quot;…&amp;quot;,&lt;br /&gt;
          &amp;quot;callsign&amp;quot;: &amp;quot;N0CALL&amp;quot;,&lt;br /&gt;
          &amp;quot;frequencyHz&amp;quot;: 7100000,&lt;br /&gt;
          &amp;quot;modulation&amp;quot;: &amp;quot;LSB&amp;quot;,&lt;br /&gt;
          &amp;quot;powerWatts&amp;quot;: 100,&lt;br /&gt;
          &amp;quot;bandwidthHz&amp;quot;: 2700,&lt;br /&gt;
          &amp;quot;latDeg&amp;quot;: 52.37,&lt;br /&gt;
          &amp;quot;lonDeg&amp;quot;: 4.9&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt; appears on sessions only for moderation sessions.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;health&amp;lt;/code&amp;gt; output ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;health&amp;quot;,&lt;br /&gt;
  &amp;quot;host&amp;quot;: &amp;quot;argon.simtx.net&amp;quot;,&lt;br /&gt;
  &amp;quot;port&amp;quot;: 5556,&lt;br /&gt;
  &amp;quot;health&amp;quot;: {&lt;br /&gt;
    &amp;quot;capturedAtEpochMillis&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;status&amp;quot;: &amp;quot;OK&amp;quot;,&lt;br /&gt;
    &amp;quot;uptimeMillis&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;connectedClients&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;connectedStations&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;activeTransmitters&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;receiverGroups&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;acceptorAlive&amp;quot;: true,&lt;br /&gt;
    &amp;quot;worldTick&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;processCpuLoad&amp;quot;: 0.0,&lt;br /&gt;
    &amp;quot;systemCpuLoad&amp;quot;: 0.0,&lt;br /&gt;
    &amp;quot;heapUsedBytes&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;heapMaxBytes&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;transmitters&amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;stationUuid&amp;quot;: &amp;quot;…&amp;quot;,&lt;br /&gt;
        &amp;quot;callsign&amp;quot;: &amp;quot;N0CALL&amp;quot;,&lt;br /&gt;
        &amp;quot;address&amp;quot;: &amp;quot;…&amp;quot;,&lt;br /&gt;
        &amp;quot;sourceType&amp;quot;: &amp;quot;AUDIO_STREAM&amp;quot;,&lt;br /&gt;
        &amp;quot;frequencyHz&amp;quot;: 7100000,&lt;br /&gt;
        &amp;quot;modulation&amp;quot;: &amp;quot;LSB&amp;quot;,&lt;br /&gt;
        &amp;quot;sampleRate&amp;quot;: 48000&lt;br /&gt;
      }&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;receivers&amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;stationUuid&amp;quot;: &amp;quot;…&amp;quot;,&lt;br /&gt;
        &amp;quot;callsign&amp;quot;: &amp;quot;RTLTCP&amp;quot;,&lt;br /&gt;
        &amp;quot;address&amp;quot;: &amp;quot;…&amp;quot;,&lt;br /&gt;
        &amp;quot;centerFrequencyHz&amp;quot;: 7100000,&lt;br /&gt;
        &amp;quot;sampleRate&amp;quot;: 1024000,&lt;br /&gt;
        &amp;quot;wideband&amp;quot;: false,&lt;br /&gt;
        &amp;quot;framesWritten&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;framesDropped&amp;quot;: 0&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;catalog&amp;lt;/code&amp;gt; output ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;catalog&amp;quot;,&lt;br /&gt;
  &amp;quot;host&amp;quot;: &amp;quot;argon.simtx.net&amp;quot;,&lt;br /&gt;
  &amp;quot;port&amp;quot;: 5556,&lt;br /&gt;
  &amp;quot;count&amp;quot;: 1,&lt;br /&gt;
  &amp;quot;entries&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;id&amp;quot;: 1,&lt;br /&gt;
      &amp;quot;kind&amp;quot;: &amp;quot;…&amp;quot;,&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;…&amp;quot;,&lt;br /&gt;
      &amp;quot;description&amp;quot;: &amp;quot;…&amp;quot;,&lt;br /&gt;
      &amp;quot;author&amp;quot;: &amp;quot;…&amp;quot;,&lt;br /&gt;
      &amp;quot;sizeBytes&amp;quot;: 0,&lt;br /&gt;
      &amp;quot;fileCount&amp;quot;: 0,&lt;br /&gt;
      &amp;quot;types&amp;quot;: [],&lt;br /&gt;
      &amp;quot;categories&amp;quot;: [],&lt;br /&gt;
      &amp;quot;packageId&amp;quot;: &amp;quot;…&amp;quot;,&lt;br /&gt;
      &amp;quot;packageVersion&amp;quot;: &amp;quot;…&amp;quot;,&lt;br /&gt;
      &amp;quot;dependencies&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;id&amp;quot;: &amp;quot;…&amp;quot;,&lt;br /&gt;
          &amp;quot;versionRange&amp;quot;: &amp;quot;…&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ],&lt;br /&gt;
      &amp;quot;revision&amp;quot;: 0,&lt;br /&gt;
      &amp;quot;uploadedAtEpochMillis&amp;quot;: 0&lt;br /&gt;
    }&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Empty station, transmitter, receiver, catalog, type, category, and dependency&lt;br /&gt;
lists are always encoded as &amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;, never &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Version and update commands ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
simtx-cli version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prints &amp;lt;code&amp;gt;simtx-cli &amp;lt;version&amp;gt;&amp;lt;/code&amp;gt; using the local build version, including build&lt;br /&gt;
metadata. No network access and no version gate.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
simtx-cli update&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prints one &amp;lt;code&amp;gt;J:&amp;lt;/code&amp;gt; line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;current&amp;quot;: &amp;quot;…&amp;quot;,&lt;br /&gt;
  &amp;quot;latest&amp;quot;: &amp;quot;…&amp;quot;,&lt;br /&gt;
  &amp;quot;updateAvailable&amp;quot;: true,&lt;br /&gt;
  &amp;quot;appimageUrl&amp;quot;: &amp;quot;…&amp;quot;,&lt;br /&gt;
  &amp;quot;zsyncUrl&amp;quot;: &amp;quot;…&amp;quot;,&lt;br /&gt;
  &amp;quot;sha256&amp;quot;: &amp;quot;…&amp;quot;,&lt;br /&gt;
  &amp;quot;builtAt&amp;quot;: &amp;quot;…&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Behaviour:&lt;br /&gt;
&lt;br /&gt;
* Exits successfully and logs that the build is up to date when no update is&lt;br /&gt;
available.&lt;br /&gt;
* Exits with a non-zero status when an update is available.&lt;br /&gt;
* Exits with a non-zero status when update metadata cannot be fetched.&lt;br /&gt;
* Bypasses the strict version gate.&lt;br /&gt;
* The CLI never modifies its own installation. AppImage users can use the&lt;br /&gt;
printed URLs or a standard AppImage delta update tool.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Presets ==&lt;br /&gt;
&lt;br /&gt;
Preset files are plain-text Java-properties-style files. The recommended&lt;br /&gt;
extensions are &amp;lt;code&amp;gt;.stxpreset&amp;lt;/code&amp;gt; for transmit sessions and &amp;lt;code&amp;gt;.srxpreset&amp;lt;/code&amp;gt; for&lt;br /&gt;
receiver sessions.&lt;br /&gt;
&lt;br /&gt;
Format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
# Comments start with # or !&lt;br /&gt;
station.id=Home&lt;br /&gt;
rf.frequencyHz=7100000&lt;br /&gt;
rf.modulation=LSB&lt;br /&gt;
rf.bandwidthHz=2700&lt;br /&gt;
rf.lowCutHz=350&lt;br /&gt;
rf.powerWatts=100&lt;br /&gt;
rf.radioPreset=ICOM_IC_7300&lt;br /&gt;
cli.host=argon.simtx.net&lt;br /&gt;
cli.port=5556&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Rules:&lt;br /&gt;
&lt;br /&gt;
* Lines are &amp;lt;code&amp;gt;key=value&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;key:value&amp;lt;/code&amp;gt; is also accepted.&lt;br /&gt;
* Lines beginning with &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt; are comments.&lt;br /&gt;
* Blank lines are ignored.&lt;br /&gt;
* &amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;\r&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;\t&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;\\&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;\uXXXX&amp;lt;/code&amp;gt; escapes are supported.&lt;br /&gt;
* Unknown keys are ignored.&lt;br /&gt;
* Preset values are overridden by environment variables and explicit flags.&lt;br /&gt;
&lt;br /&gt;
Load and save:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
simtx-cli --preset station.stxpreset audio argon.simtx.net 5556 \&lt;br /&gt;
  7100000 message.wav USB&lt;br /&gt;
simtx-cli --station Home --save-preset station.stxpreset audio argon.simtx.net 5556 \&lt;br /&gt;
  7100000 message.wav USB&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--save-preset&amp;lt;/code&amp;gt; writes the effective settings and continues running the&lt;br /&gt;
command. Files are written with owner-only permissions and sorted by key.&lt;br /&gt;
The literal &amp;lt;code&amp;gt;--ticket&amp;lt;/code&amp;gt; value and service credentials are never written to a&lt;br /&gt;
preset; the CLI warns when a ticket was supplied but not saved.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;rx&amp;lt;/code&amp;gt; can write an &amp;lt;code&amp;gt;.srxpreset&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
simtx-cli --save-preset receiver.srxpreset rx argon.simtx.net 5556 1234&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Transmit preset keys ===&lt;br /&gt;
&lt;br /&gt;
Common keys:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Key&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;station.id&amp;lt;/code&amp;gt;&lt;br /&gt;
| Persistent station id or name (&amp;lt;code&amp;gt;--station&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;station.callsign&amp;lt;/code&amp;gt;&lt;br /&gt;
| Receiver callsign (ad-hoc &amp;lt;code&amp;gt;rx&amp;lt;/code&amp;gt;); ignored for TX.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;station.lat&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;station.latitude&amp;lt;/code&amp;gt;&lt;br /&gt;
| Latitude (ad-hoc &amp;lt;code&amp;gt;rx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;stations create&amp;lt;/code&amp;gt;); ignored for TX.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;station.lon&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;station.longitude&amp;lt;/code&amp;gt;&lt;br /&gt;
| Longitude (ad-hoc &amp;lt;code&amp;gt;rx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;stations create&amp;lt;/code&amp;gt;); ignored for TX.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.frequencyHz&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rf.frequency&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rf.freq&amp;lt;/code&amp;gt;&lt;br /&gt;
| Frequency in Hz.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.modulation&amp;lt;/code&amp;gt;&lt;br /&gt;
| Modulation name.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.bandwidthHz&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rf.bandwidth&amp;lt;/code&amp;gt;&lt;br /&gt;
| Bandwidth in Hz.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.lowCutHz&amp;lt;/code&amp;gt;&lt;br /&gt;
| Audio low cut in Hz.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.powerWatts&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rf.power&amp;lt;/code&amp;gt;&lt;br /&gt;
| Power in watts.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.radioPreset&amp;lt;/code&amp;gt;&lt;br /&gt;
| Radio preset name.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;antenna.type&amp;lt;/code&amp;gt;&lt;br /&gt;
| Antenna type.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;antenna.height&amp;lt;/code&amp;gt;&lt;br /&gt;
| Antenna height in metres.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;antenna.length&amp;lt;/code&amp;gt;&lt;br /&gt;
| Wire or element length in metres.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;antenna.azimuth&amp;lt;/code&amp;gt;&lt;br /&gt;
| Azimuth in degrees clockwise from north.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;antenna.feedlineLossDb&amp;lt;/code&amp;gt;&lt;br /&gt;
| Feedline loss in dB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;antenna.necDeck&amp;lt;/code&amp;gt;&lt;br /&gt;
| Custom NEC-2 antenna deck text.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;antenna.necFile&amp;lt;/code&amp;gt;&lt;br /&gt;
| Path to custom NEC-2 antenna deck file (.nec).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;source.tone&amp;lt;/code&amp;gt;&lt;br /&gt;
| Reserved for tone-controlled sources; accepted but currently unused by the built-in commands.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cli.host&amp;lt;/code&amp;gt;&lt;br /&gt;
| Server host.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cli.port&amp;lt;/code&amp;gt;&lt;br /&gt;
| Server port.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cli.accountUrl&amp;lt;/code&amp;gt;&lt;br /&gt;
| Account service URL.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cli.serverId&amp;lt;/code&amp;gt;&lt;br /&gt;
| Game server ID.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cli.ticket&amp;lt;/code&amp;gt;&lt;br /&gt;
| Literal ticket. Loaded, but never saved.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cli.authFile&amp;lt;/code&amp;gt;&lt;br /&gt;
| Plaintext credential file path.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cli.audioFile&amp;lt;/code&amp;gt;&lt;br /&gt;
| Audio file path.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cli.iqLocalPort&amp;lt;/code&amp;gt;&lt;br /&gt;
| Local IQ loopback port.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cli.iqSampleRate&amp;lt;/code&amp;gt;&lt;br /&gt;
| IQ sample rate.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cli.sampleRate&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;source.sampleRate&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rf.sampleRate&amp;lt;/code&amp;gt;&lt;br /&gt;
| General sample rate.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cli.debug&amp;lt;/code&amp;gt;&lt;br /&gt;
| Enable verbose logging.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cli.telemetryJson&amp;lt;/code&amp;gt;&lt;br /&gt;
| Enable telemetry JSON output.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
PA knob keys, in the same order as the positional overrides:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Key&lt;br /&gt;
! Knob&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.finalDriveDb&amp;lt;/code&amp;gt;&lt;br /&gt;
| Final drive, dB&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.paHeadroomDb&amp;lt;/code&amp;gt;&lt;br /&gt;
| PA headroom, dB&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.audioCompressionDb&amp;lt;/code&amp;gt;&lt;br /&gt;
| Audio compression, dB&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.paSoftness&amp;lt;/code&amp;gt;&lt;br /&gt;
| PA softness&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.paAmPmDeg&amp;lt;/code&amp;gt;&lt;br /&gt;
| PA AM/PM, degrees&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.carrierLeakDb&amp;lt;/code&amp;gt;&lt;br /&gt;
| Carrier leak, dB&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.sidebandSuppressionDb&amp;lt;/code&amp;gt;&lt;br /&gt;
| Opposite-sideband suppression, dB&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.frequencyOffsetHz&amp;lt;/code&amp;gt;&lt;br /&gt;
| Frequency offset, Hz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.mainsHumDb&amp;lt;/code&amp;gt;&lt;br /&gt;
| Mains hum level, dB&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.mainsHumHz&amp;lt;/code&amp;gt;&lt;br /&gt;
| Mains hum frequency, Hz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.amModulationIndex&amp;lt;/code&amp;gt;&lt;br /&gt;
| AM modulation index&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.paSupplySagDb&amp;lt;/code&amp;gt;&lt;br /&gt;
| PA supply sag, dB&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.txNoiseFloorDb&amp;lt;/code&amp;gt;&lt;br /&gt;
| TX noise floor suppression below peak carrier, dBc (0–160, higher = cleaner)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.oscillatorPhaseNoiseDb&amp;lt;/code&amp;gt;&lt;br /&gt;
| Oscillator phase noise suppression at 10 kHz offset, dBc/Hz (0–160, higher = cleaner)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rf.cwKeyRiseMs&amp;lt;/code&amp;gt;&lt;br /&gt;
| CW key rise time, ms&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Receiver preset keys ===&lt;br /&gt;
&lt;br /&gt;
Receiver presets accept the shared &amp;lt;code&amp;gt;station.*&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rf.frequencyHz&amp;lt;/code&amp;gt;,&lt;br /&gt;
&amp;lt;code&amp;gt;rf.bandwidthHz&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;antenna.&#039;&#039;&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;cli.&#039;&#039;&amp;lt;/code&amp;gt; keys, plus:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Key&lt;br /&gt;
! Equivalent option&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rx.rtlPort&amp;lt;/code&amp;gt;&lt;br /&gt;
| Local rtl-tcp port.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rx.hardwareProfile&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--hardware-profile&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rx.serviceCredential&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--service-credential&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rx.serviceCredentialFile&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--service-credential-file&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rx.timestamped&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--timestamped&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rx.readTimeoutMs&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--rx-read-timeout-ms&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rx.maxRetries&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--rx-max-retries&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rx.retryBaseMs&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--rx-retry-base-ms&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rx.jitterMs&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--rx-jitter-ms&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rx.autoStepdown&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--rx-auto-stepdown&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rx.noLossyLink&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--rx-no-lossy-link&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rx.listenHost&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--rx-listen-host&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Receiver location defaults to Budapest (&amp;lt;code&amp;gt;47.50&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;19.04&amp;lt;/code&amp;gt;) unless overridden.&lt;br /&gt;
Service credentials are never saved to receiver presets.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Exit status and signals ==&lt;br /&gt;
&lt;br /&gt;
* Successful commands exit with status &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Invalid arguments, network failures, authentication failures, server kicks,&lt;br /&gt;
disconnects, query timeouts, and update availability exit with status &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; never contacts the network and always exits successfully.&lt;br /&gt;
* Ctrl-C (SIGINT) and SIGTERM stop transmitter and receiver sessions cleanly.&lt;br /&gt;
The CLI exits successfully (status &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;) after an interrupt.&lt;br /&gt;
* When a transmitter audio file stream finishes playing to completion (EOF), the CLI&lt;br /&gt;
exits cleanly with status &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
* An abnormal session termination (such as an upstream server kick or network drop)&lt;br /&gt;
exits with status &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Query commands print their JSON result before exiting.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Symptom&lt;br /&gt;
! Likely cause&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;update required&amp;lt;/code&amp;gt;&lt;br /&gt;
| CLI version does not exactly match the update service. Upgrade, then retry.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;update check failed&amp;lt;/code&amp;gt;&lt;br /&gt;
| Update service unreachable. Check network access.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;run &#039;simtx-cli login&#039; first&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--server-id&amp;lt;/code&amp;gt; was used without a signed-in account.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;transmitting needs --station&amp;lt;/code&amp;gt;&lt;br /&gt;
| TX always runs on a persistent station; pass &amp;lt;code&amp;gt;--station&amp;lt;/code&amp;gt; (see &amp;lt;code&amp;gt;stations&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--server-id is required to mint a station-bound ticket&amp;lt;/code&amp;gt;&lt;br /&gt;
| Station-bound sessions need an account ticket.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;scope_required&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;sign in again&amp;lt;/code&amp;gt;&lt;br /&gt;
| The stored session predates station management; run &amp;lt;code&amp;gt;login&amp;lt;/code&amp;gt; again.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;The account service does not support station-bound sessions yet&amp;lt;/code&amp;gt;&lt;br /&gt;
| The account service predates v25 stations.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rejected: … (FORBIDDEN)&amp;lt;/code&amp;gt;&lt;br /&gt;
| Not your station (TX), an UNLISTED station of someone else (RX), or a mismatched ticket.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;server did not answer with a protocol v25 hello&amp;lt;/code&amp;gt;&lt;br /&gt;
| The server runs an older protocol; it needs the v25 update.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--server-id is required with a service credential&amp;lt;/code&amp;gt;&lt;br /&gt;
| Receiver credential supplied without a game server ID.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;service credential file must be owner-only&amp;lt;/code&amp;gt;&lt;br /&gt;
| Run &amp;lt;code&amp;gt;chmod 600&amp;lt;/code&amp;gt; on the credential file.&lt;br /&gt;
|-&lt;br /&gt;
| Connection refused on rtl-tcp&lt;br /&gt;
| The SDR client is pointed at the wrong host/port, or &amp;lt;code&amp;gt;rx&amp;lt;/code&amp;gt; is not running.&lt;br /&gt;
|-&lt;br /&gt;
| IQ connection refused&lt;br /&gt;
| GNU Radio is not connected to &amp;lt;code&amp;gt;127.0.0.1:&amp;lt;localIqPort&amp;gt;&amp;lt;/code&amp;gt;, or the sample rate does not match.&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Multiplexed Serve Mode (&amp;lt;code&amp;gt;serve&amp;lt;/code&amp;gt;) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;simtx-cli serve&amp;lt;/code&amp;gt; runs a single long-lived multiplexing process designed for game engines and integration layers (such as C#/.NET on Windows and Linux). Rather than spawning a separate process per radio or session, &amp;lt;code&amp;gt;serve&amp;lt;/code&amp;gt; manages multiple concurrent receivers, scope panadapters, and persistent control channels over standard input/output using newline-delimited JSON (NDJSON), accompanied by local loopback binary TCP streaming sockets for high-rate float32 IQ data.&lt;br /&gt;
&lt;br /&gt;
=== Standard I/O Protocol (NDJSON) ===&lt;br /&gt;
&lt;br /&gt;
Communication occurs over two streams:&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;stdin&amp;lt;/code&amp;gt;&#039;&#039;&#039;: Receives single-line JSON commands from the controlling game or application.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;stdout&amp;lt;/code&amp;gt;&#039;&#039;&#039;: Emits single-line JSON responses, events, and push notifications. Lines are newline-terminated and thread-safe.&lt;br /&gt;
&lt;br /&gt;
==== Command Format (Application -&amp;gt; CLI) ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;id&amp;quot;: &amp;quot;req-101&amp;quot;,&lt;br /&gt;
  &amp;quot;cmd&amp;quot;: &amp;quot;rx.open&amp;quot;,&lt;br /&gt;
  &amp;quot;session&amp;quot;: &amp;quot;radio-1&amp;quot;,&lt;br /&gt;
  &amp;quot;params&amp;quot;: { ... }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;&lt;br /&gt;
| string (optional)&lt;br /&gt;
| Correlates responses to requests. Echoed back in the corresponding event.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
| string (required)&lt;br /&gt;
| Command identifier (e.g. &amp;lt;code&amp;gt;rx.open&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;control.subscribe_health&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;serve.ping&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt;&lt;br /&gt;
| string (optional)&lt;br /&gt;
| Session identifier chosen by the application (e.g. &amp;lt;code&amp;gt;radio-1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;panadapter&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ctl-main&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;params&amp;lt;/code&amp;gt;&lt;br /&gt;
| object (optional)&lt;br /&gt;
| Command-specific arguments.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Event &amp;amp; Response Format (CLI -&amp;gt; Application) ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;event&amp;quot;: &amp;quot;rx.opened&amp;quot;,&lt;br /&gt;
  &amp;quot;session&amp;quot;: &amp;quot;radio-1&amp;quot;,&lt;br /&gt;
  &amp;quot;id&amp;quot;: &amp;quot;req-101&amp;quot;,&lt;br /&gt;
  &amp;quot;data&amp;quot;: { ... }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;event&amp;lt;/code&amp;gt;&lt;br /&gt;
| string (required)&lt;br /&gt;
| Event type (e.g. &amp;lt;code&amp;gt;serve.ready&amp;lt;/code&amp;gt; (its &amp;lt;code&amp;gt;data.version&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;&amp;quot;v25&amp;quot;&amp;lt;/code&amp;gt;), &amp;lt;code&amp;gt;rx.opened&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;control.health&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt;&lt;br /&gt;
| string (optional)&lt;br /&gt;
| Associated session identifier.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;&lt;br /&gt;
| string (optional)&lt;br /&gt;
| Corresponds to the request &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; for direct command replies. Omitted for asynchronous pushes.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
| object (optional)&lt;br /&gt;
| Event payload data.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt;&lt;br /&gt;
| string (optional)&lt;br /&gt;
| Error description when &amp;lt;code&amp;gt;event&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;&amp;quot;error&amp;quot;&amp;lt;/code&amp;gt; or a command fails.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Command Reference ===&lt;br /&gt;
&lt;br /&gt;
==== 1. System Lifecycle ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;serve.ready&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
Emitted immediately upon startup to advertise protocol and engine capabilities:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;event&amp;quot;: &amp;quot;serve.ready&amp;quot;,&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
      &amp;quot;serve_version&amp;quot;: 2,&lt;br /&gt;
      &amp;quot;protocol_version&amp;quot;: 24,&lt;br /&gt;
      &amp;quot;app_version&amp;quot;: &amp;quot;0.1.0-alpha-14&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;serve.ping&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
Checks serve process responsiveness and fetches system clock times.&lt;br /&gt;
** Request: &amp;lt;code&amp;gt;{&amp;quot;id&amp;quot;: &amp;quot;p1&amp;quot;, &amp;quot;cmd&amp;quot;: &amp;quot;serve.ping&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
** Response:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;event&amp;quot;: &amp;quot;serve.pong&amp;quot;,&lt;br /&gt;
      &amp;quot;id&amp;quot;: &amp;quot;p1&amp;quot;,&lt;br /&gt;
      &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;time_unix_nanos&amp;quot;: 1792686378727327947,&lt;br /&gt;
        &amp;quot;time_utc&amp;quot;: &amp;quot;2026-10-22T16:26:18.727342195Z&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;serve.stop&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;exit&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;quit&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
Closes all active receiver, transmitter, and control sessions, frees resources, and terminates the serve process with exit code &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
** Request: &amp;lt;code&amp;gt;{&amp;quot;id&amp;quot;: &amp;quot;p2&amp;quot;, &amp;quot;cmd&amp;quot;: &amp;quot;serve.stop&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
** Response: &amp;lt;code&amp;gt;{&amp;quot;event&amp;quot;: &amp;quot;serve.stopped&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;p2&amp;quot;, &amp;quot;data&amp;quot;: {&amp;quot;ok&amp;quot;: true}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2. Receiver Sessions (&amp;lt;code&amp;gt;rx.*&amp;lt;/code&amp;gt;) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;rx.open&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
Opens an upstream receiver session (v25 &amp;lt;code&amp;gt;ReceiverStart&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;timestamped&amp;lt;/code&amp;gt; flag set by default) to the SimTX server and starts a local loopback TCP listener on &amp;lt;code&amp;gt;127.0.0.1:&amp;lt;port&amp;gt;&amp;lt;/code&amp;gt; for zero-copy binary IQ streaming. The receiver is ad-hoc unless &amp;lt;code&amp;gt;station_id&amp;lt;/code&amp;gt; is given.&lt;br /&gt;
** Parameters:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Parameter&lt;br /&gt;
! Type&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;argon.simtx.net&amp;lt;/code&amp;gt;&lt;br /&gt;
| SimTX upstream server host.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;port&amp;lt;/code&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| &amp;lt;code&amp;gt;5556&amp;lt;/code&amp;gt;&lt;br /&gt;
| SimTX upstream server port.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ticket&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Single-use session ticket (anonymous if blank).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;callsign&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;HAMSIMTEST&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Receiver station callsign.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;lat&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lon&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Receiver geographic latitude and longitude.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;altitude&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Receiver antenna altitude in meters.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;noise_figure_db&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Front-end noise figure in dB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;frequency_hz&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;7093000&amp;lt;/code&amp;gt;&lt;br /&gt;
| Center tuned frequency in Hz.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sample_rate&amp;lt;/code&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| &amp;lt;code&amp;gt;24000&amp;lt;/code&amp;gt;&lt;br /&gt;
| IQ sample rate in Hz (e.g. 24000 for voice radio, 64000 for panadapter, 2400000 for SDR view).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;bandwidth_hz&amp;lt;/code&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Receiver filter bandwidth in Hz (&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; defaults to &amp;lt;code&amp;gt;sample_rate&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;chunk_samples&amp;lt;/code&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Samples per chunk (&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; defaults to 512).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;plain_tcp&amp;lt;/code&amp;gt;&lt;br /&gt;
| bool&lt;br /&gt;
| &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;&lt;br /&gt;
| Force plain TCP connection instead of TLS.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;hardware_profile&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Optional hardware calibration profile path.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;timestamped&amp;lt;/code&amp;gt;&lt;br /&gt;
| bool&lt;br /&gt;
| &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;&lt;br /&gt;
| Enables nanosecond server timestamping on IQ blocks.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;antenna_type&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;DIPOLE&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Template type (&amp;lt;code&amp;gt;DIPOLE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;INVERTED_V&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;VERTICAL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;YAGI_3EL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;YAGI_5EL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LOOP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;BEVERAGE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LONGWIRE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EFHW_32M_49_1&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;antenna_height&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;10.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Height above ground in meters.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;antenna_length&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Wire length in meters (0 = resonant).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;azimuth&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Antenna azimuth heading in degrees.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;feedline_loss_db&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Feedline transmission loss in dB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ground&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;AVERAGE&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Ground model (&amp;lt;code&amp;gt;AVERAGE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FREESPACE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PERFECT&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;nec_deck&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Raw NEC-2 deck card text (GW/GE/EX cards). Overrides template parameters.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;nec_file&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Path to a local &amp;lt;code&amp;gt;.nec&amp;lt;/code&amp;gt; antenna file.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;station_id&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Bind the receiver to this persistent station (UUID). &amp;lt;code&amp;gt;ticket&amp;lt;/code&amp;gt; must then be a receiver ticket minted for the same station (and antenna/rig); callsign, location and antenna parameters are ignored.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;antenna_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rig_id&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Station antenna (default: first) and rig (default: none) for &amp;lt;code&amp;gt;station_id&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
** Response:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;event&amp;quot;: &amp;quot;rx.opened&amp;quot;,&lt;br /&gt;
      &amp;quot;session&amp;quot;: &amp;quot;radio-1&amp;quot;,&lt;br /&gt;
      &amp;quot;id&amp;quot;: &amp;quot;req-101&amp;quot;,&lt;br /&gt;
      &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;stream_addr&amp;quot;: &amp;quot;127.0.0.1:41235&amp;quot;,&lt;br /&gt;
        &amp;quot;sample_rate&amp;quot;: 24000,&lt;br /&gt;
        &amp;quot;chunk_samples&amp;quot;: 512,&lt;br /&gt;
        &amp;quot;antenna_accepted&amp;quot;: {&lt;br /&gt;
          &amp;quot;source&amp;quot;: &amp;quot;synthesized&amp;quot;,&lt;br /&gt;
          &amp;quot;type&amp;quot;: &amp;quot;DIPOLE&amp;quot;,&lt;br /&gt;
          &amp;quot;wire_count&amp;quot;: 1,&lt;br /&gt;
          &amp;quot;segment_count&amp;quot;: 21,&lt;br /&gt;
          &amp;quot;deck_bytes&amp;quot;: 191&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
** Rejection / Error:&lt;br /&gt;
If the server limits or refuses the receiver connection, &amp;lt;code&amp;gt;rx.rejected&amp;lt;/code&amp;gt; is emitted with the upstream reason:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;event&amp;quot;: &amp;quot;rx.rejected&amp;quot;,&lt;br /&gt;
      &amp;quot;session&amp;quot;: &amp;quot;radio-1&amp;quot;,&lt;br /&gt;
      &amp;quot;id&amp;quot;: &amp;quot;req-101&amp;quot;,&lt;br /&gt;
      &amp;quot;error&amp;quot;: &amp;quot;upstream receiver session refused: limit exceeded&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;rx.retune&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
Retunes an active receiver to a new frequency without reconnecting or tearing down the loopback streaming socket.&lt;br /&gt;
** Request: &amp;lt;code&amp;gt;{&amp;quot;id&amp;quot;: &amp;quot;r2&amp;quot;, &amp;quot;cmd&amp;quot;: &amp;quot;rx.retune&amp;quot;, &amp;quot;session&amp;quot;: &amp;quot;radio-1&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;frequency_hz&amp;quot;: 7095000}}&amp;lt;/code&amp;gt;&lt;br /&gt;
** Response: &amp;lt;code&amp;gt;{&amp;quot;event&amp;quot;: &amp;quot;rx.retuned&amp;quot;, &amp;quot;session&amp;quot;: &amp;quot;radio-1&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;r2&amp;quot;, &amp;quot;data&amp;quot;: {&amp;quot;frequency_hz&amp;quot;: 7095000}}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;rx.close&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
Closes the local loopback TCP listener and disconnects the upstream receiver session.&lt;br /&gt;
** Request: &amp;lt;code&amp;gt;{&amp;quot;id&amp;quot;: &amp;quot;r3&amp;quot;, &amp;quot;cmd&amp;quot;: &amp;quot;rx.close&amp;quot;, &amp;quot;session&amp;quot;: &amp;quot;radio-1&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
** Response: &amp;lt;code&amp;gt;{&amp;quot;event&amp;quot;: &amp;quot;rx.closed&amp;quot;, &amp;quot;session&amp;quot;: &amp;quot;radio-1&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;r3&amp;quot;, &amp;quot;data&amp;quot;: {&amp;quot;ok&amp;quot;: true}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3. Control Sessions &amp;amp; Subscriptions (&amp;lt;code&amp;gt;control.*&amp;lt;/code&amp;gt;) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;control.open&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
Establishes a persistent control connection (role &amp;lt;code&amp;gt;CONTROL&amp;lt;/code&amp;gt;) to the server. The CLI pings the server every 15 s to keep the link alive.&lt;br /&gt;
** Parameters: &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;port&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ticket&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;plain_tcp&amp;lt;/code&amp;gt;.&lt;br /&gt;
** Response: &amp;lt;code&amp;gt;{&amp;quot;event&amp;quot;: &amp;quot;control.opened&amp;quot;, &amp;quot;session&amp;quot;: &amp;quot;ctl-1&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;c1&amp;quot;, &amp;quot;data&amp;quot;: {&amp;quot;host&amp;quot;: &amp;quot;argon.simtx.net&amp;quot;, &amp;quot;port&amp;quot;: 5556}}&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;control.subscribe_stations&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
Starts periodic polling of the server station list (v25: persistent stations with live sessions, public satellites, ad-hoc sessions).&lt;br /&gt;
** Parameters: &amp;lt;code&amp;gt;interval_sec&amp;lt;/code&amp;gt; (default &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;), &amp;lt;code&amp;gt;on_change_only&amp;lt;/code&amp;gt; (bool, default &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;).&lt;br /&gt;
** Response: &amp;lt;code&amp;gt;{&amp;quot;event&amp;quot;: &amp;quot;control.subscribed_stations&amp;quot;, &amp;quot;session&amp;quot;: &amp;quot;ctl-1&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;c2&amp;quot;, &amp;quot;data&amp;quot;: {&amp;quot;interval_sec&amp;quot;: 5}}&amp;lt;/code&amp;gt;&lt;br /&gt;
** Push Event (&amp;lt;code&amp;gt;control.stations&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;event&amp;quot;: &amp;quot;control.stations&amp;quot;,&lt;br /&gt;
      &amp;quot;session&amp;quot;: &amp;quot;ctl-1&amp;quot;,&lt;br /&gt;
      &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;count&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;stations&amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;kind&amp;quot;: &amp;quot;ADHOC&amp;quot;,&lt;br /&gt;
            &amp;quot;callsign&amp;quot;: &amp;quot;HAMSIMTEST&amp;quot;,&lt;br /&gt;
            &amp;quot;visibility&amp;quot;: &amp;quot;UNLISTED&amp;quot;,&lt;br /&gt;
            &amp;quot;latDeg&amp;quot;: 39.53,&lt;br /&gt;
            &amp;quot;lonDeg&amp;quot;: -119.81,&lt;br /&gt;
            &amp;quot;altitudeMeters&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;sessions&amp;quot;: [&lt;br /&gt;
              {&lt;br /&gt;
                &amp;quot;sessionId&amp;quot;: &amp;quot;a4b1...&amp;quot;,&lt;br /&gt;
                &amp;quot;role&amp;quot;: &amp;quot;TX&amp;quot;,&lt;br /&gt;
                &amp;quot;callsign&amp;quot;: &amp;quot;HAMSIMTEST&amp;quot;,&lt;br /&gt;
                &amp;quot;frequencyHz&amp;quot;: 7093000,&lt;br /&gt;
                &amp;quot;modulation&amp;quot;: &amp;quot;USB&amp;quot;,&lt;br /&gt;
                &amp;quot;powerWatts&amp;quot;: 100.0,&lt;br /&gt;
                &amp;quot;bandwidthHz&amp;quot;: 2700,&lt;br /&gt;
                &amp;quot;latDeg&amp;quot;: 39.53,&lt;br /&gt;
                &amp;quot;lonDeg&amp;quot;: -119.81&lt;br /&gt;
              }&lt;br /&gt;
            ]&lt;br /&gt;
          }&lt;br /&gt;
        ]&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;control.subscribe_health&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
Starts periodic polling of server health, computing the real-time simulation clock offset $\Delta_{\text{sim}} = T_{\text{sim}} - T_{\text{local}}$.&lt;br /&gt;
** Parameters: &amp;lt;code&amp;gt;interval_sec&amp;lt;/code&amp;gt; (default &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt;).&lt;br /&gt;
** Push Event (&amp;lt;code&amp;gt;control.health&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;event&amp;quot;: &amp;quot;control.health&amp;quot;,&lt;br /&gt;
      &amp;quot;session&amp;quot;: &amp;quot;ctl-1&amp;quot;,&lt;br /&gt;
      &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;health&amp;quot;: {&lt;br /&gt;
          &amp;quot;SimulationTimeEpochMillis&amp;quot;: 1729600000123,&lt;br /&gt;
          &amp;quot;CapturedAtEpochMillis&amp;quot;: 1729600000120,&lt;br /&gt;
          &amp;quot;WorldTicks&amp;quot;: 45129,&lt;br /&gt;
          &amp;quot;ActiveTransmitters&amp;quot;: 1,&lt;br /&gt;
          &amp;quot;ActiveReceivers&amp;quot;: 3&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;time_sync&amp;quot;: {&lt;br /&gt;
          &amp;quot;simulation_time_millis&amp;quot;: 1729600000123,&lt;br /&gt;
          &amp;quot;server_captured_millis&amp;quot;: 1729600000120,&lt;br /&gt;
          &amp;quot;local_time_millis&amp;quot;: 1729600000000,&lt;br /&gt;
          &amp;quot;offset_millis&amp;quot;: 123&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;control.weather&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
Requests a regional weather map raster from the server.&lt;br /&gt;
** Parameters:&lt;br /&gt;
*** &amp;lt;code&amp;gt;center_lat&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;center_lon&amp;lt;/code&amp;gt;: Center geographic coordinates.&lt;br /&gt;
*** &amp;lt;code&amp;gt;lat_span&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lon_span&amp;lt;/code&amp;gt;: Extent in degrees (default &amp;lt;code&amp;gt;5.0&amp;lt;/code&amp;gt;).&lt;br /&gt;
*** &amp;lt;code&amp;gt;width&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;height&amp;lt;/code&amp;gt;: Grid dimensions (e.g. &amp;lt;code&amp;gt;64&amp;lt;/code&amp;gt; $\times$ &amp;lt;code&amp;gt;32&amp;lt;/code&amp;gt;).&lt;br /&gt;
*** &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;: Raster layer type: &amp;lt;code&amp;gt;&amp;quot;RAIN_RATE&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;DUCT_STRENGTH&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;CLOUD_WATER&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;SURFACE_TEMPERATURE&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;LIGHTNING_RATE&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
** Push Event (&amp;lt;code&amp;gt;control.weather&amp;lt;/code&amp;gt;):&lt;br /&gt;
Carries grid bounds (&amp;lt;code&amp;gt;SouthLatDeg&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NorthLatDeg&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WestLonDeg&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EastLonDeg&amp;lt;/code&amp;gt;), surface parameters, and raw raster values array (&amp;lt;code&amp;gt;Values&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;control.catalog&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;control.catalog_fetch&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
Browses community presets and downloads specific items by &amp;lt;code&amp;gt;entry_id&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;control.close&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
Closes the control connection and cancels all subscription polling.&lt;br /&gt;
&lt;br /&gt;
==== 4. Transmitter Sessions (&amp;lt;code&amp;gt;tx.*&amp;lt;/code&amp;gt;) ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;tx.open&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
Opens an upstream transmitter session (&amp;lt;code&amp;gt;RoleTransmitter&amp;lt;/code&amp;gt;) using protocol v24 and starts a local loopback TCP listener on &amp;lt;code&amp;gt;127.0.0.1:&amp;lt;port&amp;gt;&amp;lt;/code&amp;gt; for zero-copy streaming of live microphone audio or complex IQ baseband.&lt;br /&gt;
** Parameters:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Parameter&lt;br /&gt;
! Type&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;argon.simtx.net&amp;lt;/code&amp;gt;&lt;br /&gt;
| Upstream server hostname.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;port&amp;lt;/code&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| &amp;lt;code&amp;gt;5556&amp;lt;/code&amp;gt;&lt;br /&gt;
| Upstream server port.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;plain_tcp&amp;lt;/code&amp;gt;&lt;br /&gt;
| bool&lt;br /&gt;
| &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;&lt;br /&gt;
| Force plain TCP connection instead of TLS.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ticket&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Single-use session ticket (anonymous if blank).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;callsign&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;HAMSIMTEST&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Transmitter station callsign.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;lat&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lon&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Geographic coordinates.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;altitude&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Antenna altitude in meters.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;frequency_hz&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;7093000&amp;lt;/code&amp;gt;&lt;br /&gt;
| Center transmission carrier frequency in Hz.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;power_watts&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;100.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Transmit power in watts.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sample_rate&amp;lt;/code&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| &amp;lt;code&amp;gt;48000&amp;lt;/code&amp;gt;&lt;br /&gt;
| Declared input sample rate (e.g. 22050 for voice or up to 10000000 for IQ).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;bandwidth_hz&amp;lt;/code&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| &amp;lt;code&amp;gt;2700&amp;lt;/code&amp;gt;&lt;br /&gt;
| Occupied RF bandwidth in Hz.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;low_cut_hz&amp;lt;/code&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| &amp;lt;code&amp;gt;350&amp;lt;/code&amp;gt;&lt;br /&gt;
| Audio low-frequency cutoff in Hz.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;modulation&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;USB&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Modulation (&amp;lt;code&amp;gt;USB&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LSB&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AM_DSB_FC&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NFM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WFM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IQ&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;audio_gain&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Input audio gain factor.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tone_hz&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Test tone frequency in Hz (0 to disable).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;duty_cycle&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| PA duty cycle factor (0.0 to 1.0).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;clean_lab&amp;lt;/code&amp;gt;&lt;br /&gt;
| bool&lt;br /&gt;
| &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;&lt;br /&gt;
| Enable clean lab mode (disables driver distortion).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;antenna_type&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;DIPOLE&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Template type (&amp;lt;code&amp;gt;DIPOLE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;INVERTED_V&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;VERTICAL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;YAGI_3EL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;YAGI_5EL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LOOP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;BEVERAGE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LONGWIRE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;EFHW_32M_49_1&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;antenna_height&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;10.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Height in meters.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;antenna_length&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Wire length in meters (0 = resonant).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;azimuth&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Azimuth heading in degrees.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;feedline_loss_db&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Feedline loss in dB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ground&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;AVERAGE&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Ground model (&amp;lt;code&amp;gt;AVERAGE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FREESPACE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PERFECT&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;nec_deck&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Raw NEC-2 deck card text (GW/GE/EX cards). Overrides template parameters.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;nec_file&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Path to a local &amp;lt;code&amp;gt;.nec&amp;lt;/code&amp;gt; antenna file.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mode_name&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Custom mode info identifier.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mode_description&amp;lt;/code&amp;gt;&lt;br /&gt;
| string&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Custom mode info human-readable description.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mode_bandwidth_hz&amp;lt;/code&amp;gt;&lt;br /&gt;
| int&lt;br /&gt;
| &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Custom mode bandwidth limit.&lt;br /&gt;
|-&lt;br /&gt;
| Impairment fields:&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;final_drive_db&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Final driver stage level in dB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;pa_headroom_db&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;6.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| PA headroom in dB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;audio_compression_db&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Mic audio speech compressor level in dB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;pa_softness&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| PA saturation softness curve factor.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;pa_am_pm_deg&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| PA AM-to-PM phase conversion in degrees.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;carrier_leak_db&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;-50.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Residual carrier leak level in dB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;opposite_sideband_suppression_db&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;50.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Opposite sideband suppression in dB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;freq_offset_hz&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Local oscillator frequency offset in Hz.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mains_hum_level_db&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;-60.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Power supply mains hum level in dB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mains_hum_freq_hz&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;50.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Mains hum base frequency in Hz (e.g. 50 or 60).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;am_modulation_index&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;0.85&amp;lt;/code&amp;gt;&lt;br /&gt;
| AM modulation index.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;pa_supply_sag_db&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| PA power supply voltage sag in dB.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tx_noise_floor_db&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;120.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Broadband noise floor suppression in dBc.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;oscillator_phase_noise_db&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;120.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Oscillator phase noise suppression at 10 kHz in dBc/Hz.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cw_key_rise_ms&amp;lt;/code&amp;gt;&lt;br /&gt;
| float&lt;br /&gt;
| &amp;lt;code&amp;gt;5.0&amp;lt;/code&amp;gt;&lt;br /&gt;
| CW keying rise/fall time envelope in ms.&lt;br /&gt;
|}&lt;br /&gt;
** Responses / Events:&lt;br /&gt;
*** &#039;&#039;&#039;&amp;lt;code&amp;gt;tx.opened&amp;lt;/code&amp;gt;&#039;&#039;&#039;: Session accepted and on-air or ready.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;event&amp;quot;: &amp;quot;tx.opened&amp;quot;,&lt;br /&gt;
        &amp;quot;session&amp;quot;: &amp;quot;tx-1&amp;quot;,&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;t1&amp;quot;,&lt;br /&gt;
        &amp;quot;data&amp;quot;: {&lt;br /&gt;
          &amp;quot;stream_addr&amp;quot;: &amp;quot;127.0.0.1:43521&amp;quot;,&lt;br /&gt;
          &amp;quot;sample_rate&amp;quot;: 22050,&lt;br /&gt;
          &amp;quot;wire_rate&amp;quot;: 48000,&lt;br /&gt;
          &amp;quot;audio_in&amp;quot;: true,&lt;br /&gt;
          &amp;quot;iq_in&amp;quot;: false,&lt;br /&gt;
          &amp;quot;antenna_accepted&amp;quot;: { ... }&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*** &#039;&#039;&#039;&amp;lt;code&amp;gt;tx.queued&amp;lt;/code&amp;gt;&#039;&#039;&#039;: Session queued by server if channel or server capacity is full.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
      {&amp;quot;event&amp;quot;: &amp;quot;tx.queued&amp;quot;, &amp;quot;session&amp;quot;: &amp;quot;tx-1&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;t1&amp;quot;, &amp;quot;data&amp;quot;: {&amp;quot;queue_position&amp;quot;: 2}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*** &#039;&#039;&#039;&amp;lt;code&amp;gt;tx.rejected&amp;lt;/code&amp;gt;&#039;&#039;&#039;: Connection refused by server.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
      {&amp;quot;event&amp;quot;: &amp;quot;tx.rejected&amp;quot;, &amp;quot;session&amp;quot;: &amp;quot;tx-1&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;t1&amp;quot;, &amp;quot;error&amp;quot;: &amp;quot;callsign already in use&amp;quot;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*** &#039;&#039;&#039;&amp;lt;code&amp;gt;tx.kicked&amp;lt;/code&amp;gt;&#039;&#039;&#039;: Disconnected during session.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
      {&amp;quot;event&amp;quot;: &amp;quot;tx.kicked&amp;quot;, &amp;quot;session&amp;quot;: &amp;quot;tx-1&amp;quot;, &amp;quot;data&amp;quot;: {&amp;quot;reason&amp;quot;: &amp;quot;time limit expired&amp;quot;}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;tx.key&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
Keys the transmitter (&amp;lt;code&amp;gt;keyed: true&amp;lt;/code&amp;gt;). Incoming audio or IQ on the loopback socket is actively processed, modulated, and pushed to the upstream server.&lt;br /&gt;
** Request: &amp;lt;code&amp;gt;{&amp;quot;id&amp;quot;: &amp;quot;t2&amp;quot;, &amp;quot;cmd&amp;quot;: &amp;quot;tx.key&amp;quot;, &amp;quot;session&amp;quot;: &amp;quot;tx-1&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
** Response: &amp;lt;code&amp;gt;{&amp;quot;event&amp;quot;: &amp;quot;tx.keyed&amp;quot;, &amp;quot;session&amp;quot;: &amp;quot;tx-1&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;t2&amp;quot;, &amp;quot;data&amp;quot;: {&amp;quot;keyed&amp;quot;: true}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;tx.unkey&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
Unkeys the transmitter (&amp;lt;code&amp;gt;keyed: false&amp;lt;/code&amp;gt;). The session remains warm and active:&lt;br /&gt;
** Loopback audio/IQ ingestion is muted, and the CLI automatically pumps warm silence heartbeats (20ms frames) to keep server lease renewed.&lt;br /&gt;
** Server buffer behavior: Any already-buffered audio or IQ in the server finishes draining through playout without being cut off mid-packet or triggering timeouts.&lt;br /&gt;
** Request: &amp;lt;code&amp;gt;{&amp;quot;id&amp;quot;: &amp;quot;t3&amp;quot;, &amp;quot;cmd&amp;quot;: &amp;quot;tx.unkey&amp;quot;, &amp;quot;session&amp;quot;: &amp;quot;tx-1&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
** Response: &amp;lt;code&amp;gt;{&amp;quot;event&amp;quot;: &amp;quot;tx.unkeyed&amp;quot;, &amp;quot;session&amp;quot;: &amp;quot;tx-1&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;t3&amp;quot;, &amp;quot;data&amp;quot;: {&amp;quot;keyed&amp;quot;: false}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;tx.set&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
Applies live mid-session parameter modifications without interrupting the connection or closing sockets.&lt;br /&gt;
** Parameters: &amp;lt;code&amp;gt;frequency_hz&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;power_watts&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bandwidth_hz&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;low_cut_hz&amp;lt;/code&amp;gt;, and any of the 15 impairment fields.&lt;br /&gt;
** Request:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;id&amp;quot;: &amp;quot;t4&amp;quot;,&lt;br /&gt;
      &amp;quot;cmd&amp;quot;: &amp;quot;tx.set&amp;quot;,&lt;br /&gt;
      &amp;quot;session&amp;quot;: &amp;quot;tx-1&amp;quot;,&lt;br /&gt;
      &amp;quot;params&amp;quot;: {&lt;br /&gt;
        &amp;quot;frequency_hz&amp;quot;: 7094000,&lt;br /&gt;
        &amp;quot;power_watts&amp;quot;: 80.0,&lt;br /&gt;
        &amp;quot;bandwidth_hz&amp;quot;: 2400&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
** Response: &amp;lt;code&amp;gt;{&amp;quot;event&amp;quot;: &amp;quot;tx.set_applied&amp;quot;, &amp;quot;session&amp;quot;: &amp;quot;tx-1&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;t4&amp;quot;, &amp;quot;data&amp;quot;: {&amp;quot;ok&amp;quot;: true}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;tx.close&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
Stops loopback streaming and closes the upstream transmitter session.&lt;br /&gt;
** Request: &amp;lt;code&amp;gt;{&amp;quot;id&amp;quot;: &amp;quot;t5&amp;quot;, &amp;quot;cmd&amp;quot;: &amp;quot;tx.close&amp;quot;, &amp;quot;session&amp;quot;: &amp;quot;tx-1&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
** Response: &amp;lt;code&amp;gt;{&amp;quot;event&amp;quot;: &amp;quot;tx.closed&amp;quot;, &amp;quot;session&amp;quot;: &amp;quot;tx-1&amp;quot;, &amp;quot;id&amp;quot;: &amp;quot;t5&amp;quot;, &amp;quot;data&amp;quot;: {&amp;quot;ok&amp;quot;: true}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;tx.telemetry&amp;lt;/code&amp;gt;&#039;&#039;&#039;:&lt;br /&gt;
Asynchronous push event carrying full RF and PA telemetry from the server on every frame:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;event&amp;quot;: &amp;quot;tx.telemetry&amp;quot;,&lt;br /&gt;
    &amp;quot;session&amp;quot;: &amp;quot;tx-1&amp;quot;,&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
      &amp;quot;sequence&amp;quot;: 104,&lt;br /&gt;
      &amp;quot;server_time_millis&amp;quot;: 1792686379220,&lt;br /&gt;
      &amp;quot;actual_frequency_hz&amp;quot;: 7093000,&lt;br /&gt;
      &amp;quot;requested_power_watts&amp;quot;: 100.0,&lt;br /&gt;
      &amp;quot;forward_power_watts&amp;quot;: 78.4,&lt;br /&gt;
      &amp;quot;delivered_power_watts&amp;quot;: 76.1,&lt;br /&gt;
      &amp;quot;reflected_power_watts&amp;quot;: 2.3,&lt;br /&gt;
      &amp;quot;vswr&amp;quot;: 1.25,&lt;br /&gt;
      &amp;quot;mismatch_loss_db&amp;quot;: 0.12,&lt;br /&gt;
      &amp;quot;transformer_loss_db&amp;quot;: 0.08,&lt;br /&gt;
      &amp;quot;foldback_loss_db&amp;quot;: 0.0,&lt;br /&gt;
      &amp;quot;alc_db&amp;quot;: -0.5,&lt;br /&gt;
      &amp;quot;buffer_seconds&amp;quot;: 0.42,&lt;br /&gt;
      &amp;quot;finals_temperature_c&amp;quot;: 46.5,&lt;br /&gt;
      &amp;quot;thermal_foldback_db&amp;quot;: 0.0,&lt;br /&gt;
      &amp;quot;pa_compression_db&amp;quot;: 0.4,&lt;br /&gt;
      &amp;quot;pa_heat_watts&amp;quot;: 21.6,&lt;br /&gt;
      &amp;quot;pa_efficiency_percent&amp;quot;: 78.0,&lt;br /&gt;
      &amp;quot;pa_thermal_fault_active&amp;quot;: false&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Loopback Streaming Protocols ===&lt;br /&gt;
&lt;br /&gt;
==== Receiver Output Protocol (CLI -&amp;gt; Application) ====&lt;br /&gt;
&lt;br /&gt;
For receiver sessions, high-bandwidth complex samples are transmitted over a dedicated loopback TCP socket (&amp;lt;code&amp;gt;stream_addr&amp;lt;/code&amp;gt;) rather than base64-encoded on standard I/O. This avoids JSON parser CPU overhead, memory allocations, and garbage collection stalls when streaming at high sample rates (e.g. 2.4 Msps $\approx$ 153 Mbit/s).&lt;br /&gt;
&lt;br /&gt;
===== Packet Header &amp;amp; Payload Layout =====&lt;br /&gt;
&lt;br /&gt;
Each chunk sent across the local TCP socket consists of a 12-byte header followed by raw interleaved 32-bit floating-point samples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
+-------------------------------------------------------------+&lt;br /&gt;
| Field                         | Size    | Byte Order        |&lt;br /&gt;
+-------------------------------------------------------------+&lt;br /&gt;
| ServerTimestampUnixNanos      | 8 bytes | Big-Endian (BE)   |&lt;br /&gt;
| FloatCount (samples * 2)      | 4 bytes | Big-Endian (BE)   |&lt;br /&gt;
| Interleaved float32[] I/Q     | N bytes | Little-Endian(LE) |&lt;br /&gt;
+-------------------------------------------------------------+&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;&amp;lt;code&amp;gt;ServerTimestampUnixNanos&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;int64&amp;lt;/code&amp;gt;, 8 bytes, Big-Endian)&#039;&#039;&#039;:&lt;br /&gt;
The authoritative simulation clock timestamp of the first sample in the block. Used for FT8/FT4 synchronization and synchronized voice audio playout.&lt;br /&gt;
# &#039;&#039;&#039;&amp;lt;code&amp;gt;FloatCount&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;uint32&amp;lt;/code&amp;gt;, 4 bytes, Big-Endian)&#039;&#039;&#039;:&lt;br /&gt;
The number of &amp;lt;code&amp;gt;float32&amp;lt;/code&amp;gt; values in the payload ($= \text{ChunkSamples} \times 2$).&lt;br /&gt;
# **&amp;lt;code&amp;gt;I/Q Samples&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;float32[]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FloatCount * 4&amp;lt;/code&amp;gt; bytes, Little-Endian)**:&lt;br /&gt;
Alternating real and imaginary components: $[I_0, Q_0, I_1, Q_1, I_2, Q_2, \dots]$.&lt;br /&gt;
&lt;br /&gt;
==== Transmitter Ingest Protocol (Application -&amp;gt; CLI) ====&lt;br /&gt;
&lt;br /&gt;
For transmitter sessions (&amp;lt;code&amp;gt;tx.open&amp;lt;/code&amp;gt;), the application connects to the local TCP listener (&amp;lt;code&amp;gt;stream_addr&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Audio Streams (Microphone / Voice Modes)&#039;&#039;&#039;:&lt;br /&gt;
** When opened with voice/analog modulations (&amp;lt;code&amp;gt;USB&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LSB&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AM_DSB_FC&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NFM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WFM&amp;lt;/code&amp;gt;), the socket accepts continuous 32-bit Little-Endian IEEE-754 float mono PCM audio at the declared &amp;lt;code&amp;gt;sample_rate&amp;lt;/code&amp;gt; (e.g. 22,050 Hz or 48,000 Hz).&lt;br /&gt;
** Audio is resampled internally in real time to the RF pipeline wire rate via &amp;lt;code&amp;gt;RatePump&amp;lt;/code&amp;gt;, where microphone compression, frequency response, and exciter impairments are applied before modulation.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;IQ Streams (GNU Radio / Digital Modes)&#039;&#039;&#039;:&lt;br /&gt;
** When opened with &amp;lt;code&amp;gt;modulation: &amp;quot;IQ&amp;quot;&amp;lt;/code&amp;gt;, the socket accepts complex baseband samples (interleaved float32 real and imaginary pairs).&lt;br /&gt;
** Ingest supports two modes:&lt;br /&gt;
*** &#039;&#039;&#039;Framed packets with 12-byte header&#039;&#039;&#039;: Same format as receiver packets (&amp;lt;code&amp;gt;[ServerTimestampUnixNanos (int64 BE)][FloatCount (uint32 BE)][samples float32 LE]&amp;lt;/code&amp;gt;). This allows precise scheduling of FT8/JS8 blocks at specific server time slots ($T_{\text{server}}$). Block sizes up to 65,536 values are supported.&lt;br /&gt;
*** &#039;&#039;&#039;Raw stream&#039;&#039;&#039;: Continuous stream of interleaved float32 pairs sent directly into the RF chain.&lt;br /&gt;
&lt;br /&gt;
==== Server Buffer Drain at Unkey ====&lt;br /&gt;
&lt;br /&gt;
When a transmitter is unkeyed via &amp;lt;code&amp;gt;tx.unkey&amp;lt;/code&amp;gt;:&lt;br /&gt;
* The client CLI stops reading audio/IQ from the loopback socket and immediately switches to emitting 20 ms frames of silence (&amp;lt;code&amp;gt;holdSilence&amp;lt;/code&amp;gt;) upstream.&lt;br /&gt;
* This serves two functions:&lt;br /&gt;
## It acts as an active keep-alive heartbeat, preventing session timeouts and lease expiration between overs.&lt;br /&gt;
## The server&#039;s internal audio buffer drains gracefully to the simulated air. The trailing 0.5–1.0 s of voice audio is never truncated or abruptly silenced mid-sentence.&lt;br /&gt;
* When &amp;lt;code&amp;gt;tx.key&amp;lt;/code&amp;gt; is reissued, normal audio/IQ ingest resumes instantly with no need to renegotiate tickets or reconnect.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Serve Protocol Changelog ===&lt;br /&gt;
&lt;br /&gt;
==== Version 2 (CLI alpha-14 / Protocol v24) ====&lt;br /&gt;
* Added full transmitter session control: &amp;lt;code&amp;gt;tx.open&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tx.key&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tx.unkey&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tx.set&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tx.close&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Added real-time audio loopback streaming with automatic resampling from game rates (e.g. 22,050 Hz) to internal wire rates.&lt;br /&gt;
* Added IQ loopback streaming supporting sample rates up to 10 MS/s and server timestamped scheduling blocks.&lt;br /&gt;
* Added live mid-session knob adjustment via &amp;lt;code&amp;gt;tx.set&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Added complete 18-parameter telemetry event emissions (&amp;lt;code&amp;gt;tx.telemetry&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Added &amp;lt;code&amp;gt;serve.ready&amp;lt;/code&amp;gt; banner containing &amp;lt;code&amp;gt;serve_version: 2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;protocol_version: 24&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;app_version&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Added receiver options to &amp;lt;code&amp;gt;rx.open&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;altitude&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;noise_figure_db&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bandwidth_hz&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;chunk_samples&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;plain_tcp&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Added &amp;lt;code&amp;gt;rx.rejected&amp;lt;/code&amp;gt; event when upstream receiver sessions are refused by server quotas or limits.&lt;br /&gt;
* Added &amp;lt;code&amp;gt;--plain-tcp&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;SIMTX_PLAIN_TCP&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;SIMTX_FORCE_PLAIN_TCP&amp;lt;/code&amp;gt; for environments operating over unencrypted TCP.&lt;br /&gt;
* Fixed informational server health banners (&amp;lt;code&amp;gt;BannerInfo&amp;lt;/code&amp;gt;) causing query commands to fail.&lt;br /&gt;
&lt;br /&gt;
==== C# (.NET) Zero-Copy Read Example ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
using System;&lt;br /&gt;
using System.Buffers.Binary;&lt;br /&gt;
using System.Net.Sockets;&lt;br /&gt;
using System.Runtime.InteropServices;&lt;br /&gt;
&lt;br /&gt;
public async Task ReadIqStreamAsync(string host, int port, CancellationToken ct)&lt;br /&gt;
{&lt;br /&gt;
    using var client = new TcpClient();&lt;br /&gt;
    await client.ConnectAsync(host, port, ct);&lt;br /&gt;
    using var stream = client.GetStream();&lt;br /&gt;
&lt;br /&gt;
    byte[] header = new byte[12];&lt;br /&gt;
    byte[] payload = new byte[65536];&lt;br /&gt;
&lt;br /&gt;
    while (!ct.IsCancellationRequested)&lt;br /&gt;
    {&lt;br /&gt;
        // 1. Read 12-byte header&lt;br /&gt;
        await stream.ReadExactlyAsync(header, 0, 12, ct);&lt;br /&gt;
        long timestampNanos = BinaryPrimitives.ReadInt64BigEndian(header.AsSpan(0, 8));&lt;br /&gt;
        uint floatCount = BinaryPrimitives.ReadUInt32BigEndian(header.AsSpan(8, 4));&lt;br /&gt;
&lt;br /&gt;
        int byteCount = (int)floatCount * 4;&lt;br /&gt;
        if (payload.Length &amp;lt; byteCount)&lt;br /&gt;
            Array.Resize(ref payload, byteCount);&lt;br /&gt;
&lt;br /&gt;
        // 2. Read float32 payload&lt;br /&gt;
        await stream.ReadExactlyAsync(payload, 0, byteCount, ct);&lt;br /&gt;
&lt;br /&gt;
        // 3. Zero-copy cast into float span (x86_64 and arm64 are Little-Endian)&lt;br /&gt;
        ReadOnlySpan&amp;lt;float&amp;gt; iqSpan = MemoryMarshal.Cast&amp;lt;byte, float&amp;gt;(payload.AsSpan(0, byteCount));&lt;br /&gt;
&lt;br /&gt;
        // iqSpan[0] = I0, iqSpan[1] = Q0, iqSpan[2] = I1, iqSpan[3] = Q1...&lt;br /&gt;
        ProcessIqBlock(timestampNanos, iqSpan);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== RF Impairment Knob Conventions ===&lt;br /&gt;
&lt;br /&gt;
Fields 14 through 28 define the transmitter simulation impairments. In particular:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Field 26 (&amp;lt;code&amp;gt;rf.txNoiseFloorDb&amp;lt;/code&amp;gt;)&#039;&#039;&#039;: Broadband exciter noise floor suppression below peak carrier power, expressed in &#039;&#039;&#039;dBc&#039;&#039;&#039; (positive values, typically 0–160 dB, default 120 dB). Higher values mean greater suppression (&#039;&#039;&#039;quieter, cleaner background&#039;&#039;&#039;).&lt;br /&gt;
* &#039;&#039;&#039;Field 27 (&amp;lt;code&amp;gt;rf.oscillatorPhaseNoiseDb&amp;lt;/code&amp;gt;)&#039;&#039;&#039;: Close-in oscillator phase noise suppression at 10 kHz offset, expressed in &#039;&#039;&#039;dBc/Hz&#039;&#039;&#039; (positive values, typically 0–160 dB, default 120 dB). Higher values mean greater spectral purity (&#039;&#039;&#039;less skirt broadening&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Both fields follow the suppression convention across both audio and GNU Radio IQ transmitter sessions in protocol v25 (&amp;lt;code&amp;gt;TxImperfections.tx_noise_floor_db&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;oscillator_phase_noise_db&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
==== Precedence Order ====&lt;br /&gt;
&lt;br /&gt;
When resolving transmitter knobs:&lt;br /&gt;
# &#039;&#039;&#039;Explicit command-line positional floats&#039;&#039;&#039; have highest priority.&lt;br /&gt;
# &#039;&#039;&#039;Explicit keys in &amp;lt;code&amp;gt;--preset&amp;lt;/code&amp;gt; files&#039;&#039;&#039; (&amp;lt;code&amp;gt;rf.*&amp;lt;/code&amp;gt;) override template base defaults.&lt;br /&gt;
# &#039;&#039;&#039;Radio preset template defaults&#039;&#039;&#039; (e.g. &amp;lt;code&amp;gt;CLEAN_LAB&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ICOM_IC_7300&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;GENERIC_HF&amp;lt;/code&amp;gt;) provide base defaults for any unspecified knobs.&lt;/div&gt;</summary>
		<author><name>Sophie-developer</name></author>
	</entry>
	<entry>
		<id>https://wiki.simtx.net/index.php?title=Main_Page&amp;diff=1984</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.simtx.net/index.php?title=Main_Page&amp;diff=1984"/>
		<updated>2026-10-22T16:27:49Z</updated>

		<summary type="html">&lt;p&gt;Sophie-developer: Protected &amp;quot;Main Page&amp;quot;: High traffic page ([Edit=Allow only autoconfirmed users] (indefinite) [Move=Allow only autoconfirmed users] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px solid #a2a9b1; border-top:4px solid #36c; padding:1em 1.4em; margin-bottom:1.2em;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size:180%;&amp;quot;&amp;gt;SimTX Wiki&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SimTX is a shared radio simulation.&#039;&#039;&#039; Set up a virtual transmitter, send audio, and listen with a receiver. No physical radio or antenna is needed. Distance, antennas, and radio conditions affect what listeners hear.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size:125%;&amp;quot;&amp;gt;&#039;&#039;&#039;[[Getting Started|Download SimTX and make your first transmission]]&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The illustrated guide covers installation, account sign-in, server selection, a working example, listening, and saving your settings.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Learn in order ==&lt;br /&gt;
# &#039;&#039;&#039;[[Getting Started|Download and transmit]]&#039;&#039;&#039;: follow one complete example from an empty desktop to your first TX session.&lt;br /&gt;
# &#039;&#039;&#039;[[Transmitter Interface|Find your way around]]&#039;&#039;&#039;: identify the controls and understand the meters.&lt;br /&gt;
# &#039;&#039;&#039;[[Transmission Sources|Choose what to send]]&#039;&#039;&#039;: play a file, use a microphone, or send a stream.&lt;br /&gt;
# &#039;&#039;&#039;[[Antenna System|Change frequency and coverage]]&#039;&#039;&#039;: choose and adjust an antenna, then learn [[Propagation Basics|why reception changes]].&lt;br /&gt;
# &#039;&#039;&#039;[[Lua extensions|Add features]]&#039;&#039;&#039;: install modes, audio processors, tools, and themes without writing code.&lt;br /&gt;
# [[How to receive|&#039;&#039;&#039;Start to receiving&#039;&#039;&#039;]]: receiving signals and stations using any [[wikipedia:Software-defined_radio|SDR]] app.&lt;br /&gt;
&lt;br /&gt;
[[File:SimTX-0.3.6-first-transmission-guide-clean.png|thumb|center|850px|alt=Annotated SimTX Transmitter window showing station settings, radio settings, audio source, antenna, Start TX, and session controls.|The transmitter window. The guide explains each marked area.]]&lt;br /&gt;
&lt;br /&gt;
== Find a specific answer ==&lt;br /&gt;
* &#039;&#039;&#039;Nothing happens or no sound?&#039;&#039;&#039; Use [[Troubleshooting]].&lt;br /&gt;
* &#039;&#039;&#039;Which radio mode should I choose?&#039;&#039;&#039; See [[Modulation Modes]].&lt;br /&gt;
* &#039;&#039;&#039;How do I save or share my station setup?&#039;&#039;&#039; See [[Station Configuration]] and [[Extension catalog]].&lt;br /&gt;
* &#039;&#039;&#039;What do SWR, bandwidth, and IQ mean?&#039;&#039;&#039; See [[Radio terms]].&lt;br /&gt;
* &#039;&#039;&#039;Looking for formulas or an API?&#039;&#039;&#039; Open the [[Documentation|complete documentation index]], including antenna calculations and every Lua API reference.&lt;br /&gt;
&lt;br /&gt;
== Community and other ways to use SimTX ==&lt;br /&gt;
* [[:Category:Radio Stations|Community radio stations]]: stations described by their operators.&lt;br /&gt;
* [[Guide to setting up sdr console with simtx|SDR Console]], [[DATV RX Tutorial|digital television reception]], [[DATV TX Tutorial|digital television transmission]], [[How to receive]] and [[DRM TX tutorial|DRM transmission]]: additional community guides.&lt;br /&gt;
* [https://simtx.net/downloads Download the transmitter] · [https://simtx.net SimTX website] · [https://discord.gg/BxtpFJAs6c SimTX Discord]&lt;/div&gt;</summary>
		<author><name>Sophie-developer</name></author>
	</entry>
	<entry>
		<id>https://wiki.simtx.net/index.php?title=User:Sophie-developer&amp;diff=1980</id>
		<title>User:Sophie-developer</title>
		<link rel="alternate" type="text/html" href="https://wiki.simtx.net/index.php?title=User:Sophie-developer&amp;diff=1980"/>
		<updated>2026-10-22T07:50:29Z</updated>

		<summary type="html">&lt;p&gt;Sophie-developer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| style=&amp;quot;float:right; clear:right; margin:0 0 1em 1em; border-spacing:4px; width:250px;&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Userboxes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| {{userbox|border-c=#000000|border-s=2|info-c=#f4903c|info=This user loves their [[Tabby_cat#Orange_tabby|&amp;lt;span style=&amp;quot;color:black;&amp;quot;&amp;gt;orange cat&amp;lt;/span&amp;gt;]]|info-a=center|info-s=10|info-fc=#000000|id=[[File:ADOPTED! Gooch (306793864).jpg|50px]]|id-c=#000000}}&lt;br /&gt;
|-&lt;br /&gt;
| {{userbox|border-c=#000000|border-s=2|info-c=#3178c6|info=This user writes [[TypeScript]].|info-a=center|info-s=10|info-fc=#ffffff|id=TS|id-c=#235a97|id-fc=#ffffff}}&lt;br /&gt;
|-&lt;br /&gt;
| {{userbox|border-c=#000000|border-s=2|info-c=#dedede|info=This user hosts their own services on a [[Homelab|home lab]] and a VPS.|info-a=center|info-s=10|info-fc=#000000|id=☁|id-c=#aaaaaa}}&lt;br /&gt;
|-&lt;br /&gt;
| {{userbox|border-c=#000000|border-s=2|info-c=#c8e6c9|info=This user runs [[Linux]].|info-a=center|info-s=10|info-fc=#000000|id=🐧|id-c=#81c784}}&lt;br /&gt;
|-&lt;br /&gt;
| {{userbox|border-c=#000000|border-s=2|info-c=#ffe0b2|info=This user tinkers with [[Embedded system|embedded hardware]].|info-a=center|info-s=10|info-fc=#000000|id=⚙|id-c=#ffb74d}}&lt;br /&gt;
|-&lt;br /&gt;
| {{userbox|border-c=#000000|border-s=2|info-c=#e1bee7|info=This user plays around with [[Software-defined radio|SDR]].|info-a=center|info-s=10|info-fc=#000000|id=📻|id-c=#ba68c8}}&lt;br /&gt;
|-&lt;br /&gt;
| {{userbox|border-c=#000000|border-s=2|info-c=#bbdefb|info=This user plays [[Minecraft]] and modifies it.|info-a=center|info-s=10|info-fc=#000000|id=⛏|id-c=#64b5f6}}&lt;br /&gt;
|-&lt;br /&gt;
| {{userbox|border-c=#000000|border-s=2|info-c=#f8bbd0|info=This user contributes to Wikipedia in their spare time.|info-a=center|info-s=10|info-fc=#000000|id=✎|id-c=#f06292}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== About me ==&lt;br /&gt;
Hi, I&#039;m &#039;&#039;&#039;Sophie&#039;&#039;&#039;. I&#039;m based in Latvia and I like building things at every layer, from firmware on microcontrollers up to web apps, and I run my own infrastructure under the &amp;lt;code&amp;gt;sad.ovh&amp;lt;/code&amp;gt; domain.&lt;br /&gt;
&lt;br /&gt;
; Interests&lt;br /&gt;
: Self-hosting (Proxmox, k3s, Docker, LXC), embedded systems (ESP32, STM32, Raspberry Pi), full-stack web (TypeScript, Bun, Deno, React, SvelteKit), game and platform dev, SDR/radio, 3D printing and PCB design.&lt;br /&gt;
&lt;br /&gt;
== Projects ==&lt;br /&gt;
* &#039;&#039;&#039;Anti-bot proxy&#039;&#039;&#039;: an Anubis-style multi-site reverse proxy that uses Cap captchas for authentication and is configured through &amp;lt;code&amp;gt;proxy.toml&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;[https://kojas.beer kojas.beer]&#039;&#039;&#039;: a Latvian school timetable viewer built with SvelteKit and Deno.&lt;br /&gt;
* &#039;&#039;&#039;bleh&#039;&#039;&#039;: a last.fm client, currently being migrated to TSX.&lt;br /&gt;
* &#039;&#039;&#039;ClassiCube server&#039;&#039;&#039;: a Go game server with a Lua plugin API and CPE extensions.&lt;br /&gt;
* &#039;&#039;&#039;KCP Velocity&#039;&#039;&#039;: a low-latency Minecraft networking plugin over KCP/UDP, with a companion Fabric client mod.&lt;br /&gt;
* &#039;&#039;&#039;ComputerCraft autocrafting&#039;&#039;&#039;: a binary recipe format plus a storage-aware craft planner in Lua.&lt;br /&gt;
* &#039;&#039;&#039;illumos desktop OS&#039;&#039;&#039;: my attempt at a general-purpose desktop OS based on illumos, with a custom Go package manager.&lt;br /&gt;
* &#039;&#039;&#039;FM/RDS transmitter&#039;&#039;&#039;: a GNU Radio flowgraph with RDS encoding, plus experiments in lossless audio over radio.&lt;br /&gt;
* &#039;&#039;&#039;Raspberry Pi 5 robotics&#039;&#039;&#039;: servo control, computer vision, and custom PCB and bootloader work.&lt;br /&gt;
* &#039;&#039;&#039;MPP ecosystem&#039;&#039;&#039;: bots, voice chat, and frontend work for [[Multiplayer Piano]].&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [https://git.sad.ovh git.sad.ovh]: my Git hosting&lt;br /&gt;
* [https://sad.ovh sad.ovh]: main site&lt;/div&gt;</summary>
		<author><name>Sophie-developer</name></author>
	</entry>
	<entry>
		<id>https://wiki.simtx.net/index.php?title=Getting_Started&amp;diff=1979</id>
		<title>Getting Started</title>
		<link rel="alternate" type="text/html" href="https://wiki.simtx.net/index.php?title=Getting_Started&amp;diff=1979"/>
		<updated>2026-10-22T07:22:21Z</updated>

		<summary type="html">&lt;p&gt;Sophie-developer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Documentation navigation}}&lt;br /&gt;
&lt;br /&gt;
This guide takes a new user from downloading SimTX to sending an audio file. &#039;&#039;&#039;TX means transmit.&#039;&#039;&#039; All signals in this guide are simulated; a physical transmitter, antenna, or microphone is not required.&lt;br /&gt;
&lt;br /&gt;
== 1. Download and open the transmitter ==&lt;br /&gt;
# Open the [https://simtx.net/downloads official downloads page] and download the latest &#039;&#039;&#039;SimTX transmitter&#039;&#039;&#039; JAR file.&lt;br /&gt;
# Install &#039;&#039;&#039;Java 21 or newer&#039;&#039;&#039; for your operating system if it is not already installed. [https://adoptium.net/temurin/releases/?version=21 Eclipse Temurin] provides Java downloads: choose version 21 or newer and the installer for your system. A Java installation with desktop support is required.&lt;br /&gt;
# Keep the JAR in a folder where you can save files.&lt;br /&gt;
# Open the JAR. If double-clicking opens an archive program or does nothing, open a terminal in the folder containing the download and run the command below, using the actual downloaded filename.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
java -jar simtx-transmitter-0.3.6.jar&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The filename above is an example for version 0.3.6. Use the filename on the downloads page for a newer version. &amp;lt;code&amp;gt;java -version&amp;lt;/code&amp;gt; shows which Java version the terminal is using. See [[Troubleshooting#The application will not open|startup troubleshooting]] if Java is missing or too old.&lt;br /&gt;
&lt;br /&gt;
The steps and screenshots here describe the 0.3.6 interface.&lt;br /&gt;
&lt;br /&gt;
You also have the option to use the new-client, which is available for download https://manifest.simtx.net for Windows, and instructions for 5+ linux distros can be found here: https://manifest.simtx.net/install .&lt;br /&gt;
&lt;br /&gt;
== 2. Sign in and choose a server ==&lt;br /&gt;
# In &#039;&#039;&#039;Connect your SimTX account&#039;&#039;&#039;, use &#039;&#039;&#039;Open browser&#039;&#039;&#039; and complete SimTX sign-in. If the browser asks for a code, enter the code shown by the app. &#039;&#039;&#039;Copy link&#039;&#039;&#039; lets you open the same sign-in page manually.&lt;br /&gt;
# Approve the app in the browser, then return to the transmitter. The app continues when approval is received.&lt;br /&gt;
# In &#039;&#039;&#039;Select SimTX Server&#039;&#039;&#039;, select a server and press &#039;&#039;&#039;Connect&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Your SimTX account is separate from a wiki editing account. If the app restores an existing sign-in, it can go directly to server selection.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Checkpoint:&#039;&#039;&#039; the main window is open and the Station section identifies the selected server. Use &#039;&#039;&#039;Disconnect&#039;&#039;&#039; to return to server selection. An unavailable server or failed sign-in is covered in [[Troubleshooting]].&lt;br /&gt;
&lt;br /&gt;
== 3. Enter a simple station setup ==&lt;br /&gt;
The left-hand side contains the setup. Scroll down inside it if the Antenna section or Start TX is below the window edge.&lt;br /&gt;
&lt;br /&gt;
[[File:SimTX-0.3.6-first-transmission-guide-clean.png|thumb|center|900px|alt=Annotated transmitter window with pointers to the station, RF Signal, Transmission Source, Antenna, Start TX, and monitoring controls.|The main controls for your first transmission.]]&lt;br /&gt;
&lt;br /&gt;
# Under &#039;&#039;&#039;Station&#039;&#039;&#039;, replace the example callsign with a name for your station. Click the map to choose the simulated station location, or enter latitude and longitude.&lt;br /&gt;
# Under &#039;&#039;&#039;RF Signal&#039;&#039;&#039;, choose &#039;&#039;&#039;Generic HF transceiver&#039;&#039;&#039; and set &#039;&#039;&#039;Power (W)&#039;&#039;&#039; to &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Set &#039;&#039;&#039;Frequency (Hz)&#039;&#039;&#039; to &amp;lt;code&amp;gt;4625000&amp;lt;/code&amp;gt;. This is 4625 kHz, or 4.625 MHz. Enter the value in hertz, not &amp;lt;code&amp;gt;4625&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Choose &#039;&#039;&#039;AM Double Sideband Full Carrier&#039;&#039;&#039; and tick &#039;&#039;&#039;Auto&#039;&#039;&#039; beside Bandwidth. This selects a 10000 Hz bandwidth for ordinary AM audio. Leave the advanced transmitter settings closed.&lt;br /&gt;
# Under &#039;&#039;&#039;Antenna&#039;&#039;&#039;, choose &#039;&#039;&#039;Dipole&#039;&#039;&#039;, set &#039;&#039;&#039;Wire Length (m)&#039;&#039;&#039; to &amp;lt;code&amp;gt;31&amp;lt;/code&amp;gt;, &#039;&#039;&#039;Height (m)&#039;&#039;&#039; to &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt;, &#039;&#039;&#039;Azimuth&#039;&#039;&#039; to &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;, and &#039;&#039;&#039;Feedline Loss (dB)&#039;&#039;&#039; to &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
This antenna setup is for the frequency above. See [[Antenna System]] when changing frequency.&lt;br /&gt;
&lt;br /&gt;
== 4. Choose an audio file ==&lt;br /&gt;
# Under &#039;&#039;&#039;Transmission Source&#039;&#039;&#039;, select &#039;&#039;&#039;Audio File&#039;&#039;&#039;.&lt;br /&gt;
# Press &#039;&#039;&#039;Choose...&#039;&#039;&#039; and select a short audio file. WAV, MP3, AIFF, AIF, and AU are supported. A supported file can also be dragged onto the window.&lt;br /&gt;
# Leave &#039;&#039;&#039;Audio Gain&#039;&#039;&#039; at &amp;lt;code&amp;gt;0.9&amp;lt;/code&amp;gt;. Leave &#039;&#039;&#039;Repeat&#039;&#039;&#039; off for the first test so the session ends when the file ends.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Checkpoint:&#039;&#039;&#039; the Audio File row shows the selected filename. See [[Transmission Sources]] for microphones and streams.&lt;br /&gt;
&lt;br /&gt;
== 5. Start and check the transmission ==&lt;br /&gt;
# Press &#039;&#039;&#039;Start TX&#039;&#039;&#039; once.&lt;br /&gt;
# Find the new row under &#039;&#039;&#039;Active Sessions&#039;&#039;&#039;. &#039;&#039;&#039;Running&#039;&#039;&#039; means it has started. &#039;&#039;&#039;Queued&#039;&#039;&#039; means it is waiting for capacity and will start automatically; do not keep pressing Start TX.&lt;br /&gt;
# Select the running session. Check the Radio Deck meters. &#039;&#039;&#039;FWD&#039;&#039;&#039; is outgoing power, &#039;&#039;&#039;SWR&#039;&#039;&#039; indicates antenna matching, and &#039;&#039;&#039;TEMP&#039;&#039;&#039; is the simulated amplifier temperature.&lt;br /&gt;
# Press &#039;&#039;&#039;Listen to Own TX&#039;&#039;&#039; to check the selected signal before propagation. This tests the transmitted audio, not whether a distant listener can receive it.&lt;br /&gt;
&lt;br /&gt;
To check reception elsewhere, use a receiver connected to the &#039;&#039;&#039;same server&#039;&#039;&#039;, tune to &#039;&#039;&#039;4625 kHz&#039;&#039;&#039;, and select &#039;&#039;&#039;AM&#039;&#039;&#039; with a suitable bandwidth. [[Propagation Basics]] explains why a distant receiver may hear a weak signal even when the local monitor sounds clear.&lt;br /&gt;
&lt;br /&gt;
If the session fails, read its error before changing settings. See [[Troubleshooting]] for silence, queueing, high SWR, and heat warnings. The default frequency is an example, not a reserved empty channel; choose another frequency and retune the antenna if needed for normal operation.&lt;br /&gt;
&lt;br /&gt;
== 6. Stop and save ==&lt;br /&gt;
# Select the session and press &#039;&#039;&#039;Stop Selected&#039;&#039;&#039;, or use &#039;&#039;&#039;Stop All&#039;&#039;&#039; to end all your sessions. A non-repeating file also finishes by itself.&lt;br /&gt;
# Use &#039;&#039;&#039;Clear Finished&#039;&#039;&#039; to remove completed rows from the list.&lt;br /&gt;
# Open &#039;&#039;&#039;Presets&#039;&#039;&#039; and choose &#039;&#039;&#039;Save Current Settings...&#039;&#039;&#039;. Save the &amp;lt;code&amp;gt;.stxpreset&amp;lt;/code&amp;gt; file with a descriptive name.&lt;br /&gt;
&lt;br /&gt;
Restore it later with &#039;&#039;&#039;Presets&#039;&#039;&#039; &amp;gt; &#039;&#039;&#039;Load Preset File...&#039;&#039;&#039;. Keep any referenced audio files available at their saved paths. This station preset saves the complete setup; &#039;&#039;&#039;Radio Preset&#039;&#039;&#039; only sets the simulated radio&#039;s power and character.&lt;br /&gt;
&lt;br /&gt;
== Continue from here ==&lt;br /&gt;
* [[Transmission Sources|Transmit a microphone or audio stream]]&lt;br /&gt;
* [[Station Configuration|Save, load, and share station settings]]&lt;br /&gt;
* [[Modulation Modes|Choose AM, SSB, FM, or a data mode]]&lt;br /&gt;
* [[Antenna System|Change frequency and choose an antenna]]&lt;br /&gt;
* [[Lua extensions|Install an extension or theme]]&lt;br /&gt;
* [[Transmitter Interface|Look up any control]] · [[Documentation|Browse every guide]]&lt;br /&gt;
&lt;br /&gt;
[[Category:SimTX]]&lt;/div&gt;</summary>
		<author><name>Sophie-developer</name></author>
	</entry>
	<entry>
		<id>https://wiki.simtx.net/index.php?title=User:Sophie-developer&amp;diff=1978</id>
		<title>User:Sophie-developer</title>
		<link rel="alternate" type="text/html" href="https://wiki.simtx.net/index.php?title=User:Sophie-developer&amp;diff=1978"/>
		<updated>2026-10-22T07:19:37Z</updated>

		<summary type="html">&lt;p&gt;Sophie-developer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About me ==&lt;br /&gt;
Hi, I&#039;m &#039;&#039;&#039;Sophie&#039;&#039;&#039;. I&#039;m based in Latvia and I like building things at every layer, from firmware on microcontrollers up to web apps, and I run my own infrastructure under the &amp;lt;code&amp;gt;sad.ovh&amp;lt;/code&amp;gt; domain.&lt;br /&gt;
&lt;br /&gt;
; Interests&lt;br /&gt;
: Self-hosting (Proxmox, k3s, Docker, LXC), embedded systems (ESP32, STM32, Raspberry Pi), full-stack web (TypeScript, Bun, Deno, React, SvelteKit), game and platform dev, SDR/radio, 3D printing and PCB design.&lt;br /&gt;
&lt;br /&gt;
== Userboxes ==&lt;br /&gt;
{| style=&amp;quot;border-spacing:4px; margin:0 auto;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| {{userbox|border-c=#000000|border-s=2|info-c=#f4903c|info=This user loves their [[Tabby_cat#Orange_tabby|&amp;lt;span style=&amp;quot;color:black;&amp;quot;&amp;gt;orange cat&amp;lt;/span&amp;gt;]]|info-a=center|info-s=10|info-fc=#000000|id=[[File:ADOPTED! Gooch (306793864).jpg|50px]]|id-c=#000000}}&lt;br /&gt;
| {{userbox|border-c=#000000|border-s=2|info-c=#3178c6|info=This user writes [[TypeScript]].|info-a=center|info-s=10|info-fc=#ffffff|id=TS|id-c=#235a97|id-fc=#ffffff}}&lt;br /&gt;
|-&lt;br /&gt;
| {{userbox|border-c=#000000|border-s=2|info-c=#dedede|info=This user hosts their own services on a [[Homelab|home lab]] and a VPS.|info-a=center|info-s=10|info-fc=#000000|id=☁|id-c=#aaaaaa}}&lt;br /&gt;
| {{userbox|border-c=#000000|border-s=2|info-c=#c8e6c9|info=This user runs [[Linux]].|info-a=center|info-s=10|info-fc=#000000|id=🐧|id-c=#81c784}}&lt;br /&gt;
|-&lt;br /&gt;
| {{userbox|border-c=#000000|border-s=2|info-c=#ffe0b2|info=This user tinkers with [[Embedded system|embedded hardware]].|info-a=center|info-s=10|info-fc=#000000|id=⚙|id-c=#ffb74d}}&lt;br /&gt;
| {{userbox|border-c=#000000|border-s=2|info-c=#e1bee7|info=This user plays around with [[Software-defined radio|SDR]].|info-a=center|info-s=10|info-fc=#000000|id=📻|id-c=#ba68c8}}&lt;br /&gt;
|-&lt;br /&gt;
| {{userbox|border-c=#000000|border-s=2|info-c=#bbdefb|info=This user plays [[Minecraft]] and modifies it.|info-a=center|info-s=10|info-fc=#000000|id=⛏|id-c=#64b5f6}}&lt;br /&gt;
| {{userbox|border-c=#000000|border-s=2|info-c=#f8bbd0|info=This user contributes to Wikipedia in their spare time.|info-a=center|info-s=10|info-fc=#000000|id=✎|id-c=#f06292}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Projects ==&lt;br /&gt;
* &#039;&#039;&#039;ant&#039;&#039;&#039;: a custom JavaScript runtime written in C, with its own &amp;quot;silver&amp;quot; compiler/engine and an ESM/CommonJS interop layer.&lt;br /&gt;
* &#039;&#039;&#039;Anti-bot proxy&#039;&#039;&#039;: an Anubis-style multi-site reverse proxy that uses Cap captchas for authentication and is configured through &amp;lt;code&amp;gt;proxy.toml&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;[https://kojas.beer kojas.beer]&#039;&#039;&#039;: a Latvian school timetable viewer built with SvelteKit and Deno.&lt;br /&gt;
* &#039;&#039;&#039;bleh&#039;&#039;&#039;: a last.fm client, currently being migrated to TSX.&lt;br /&gt;
* &#039;&#039;&#039;CONQUEST&#039;&#039;&#039;: a pixel-based real-time MMO 4X game with shared nation control, developed with NekoWARE.&lt;br /&gt;
* &#039;&#039;&#039;ClassiCube server&#039;&#039;&#039;: a Go game server with a Lua plugin API and CPE extensions.&lt;br /&gt;
* &#039;&#039;&#039;KCP Velocity&#039;&#039;&#039;: a low-latency Minecraft networking plugin over KCP/UDP, with a companion Fabric client mod.&lt;br /&gt;
* &#039;&#039;&#039;ComputerCraft autocrafting&#039;&#039;&#039;: a binary recipe format plus a storage-aware craft planner in Lua.&lt;br /&gt;
* &#039;&#039;&#039;illumos desktop OS&#039;&#039;&#039;: my attempt at a general-purpose desktop OS based on illumos, with a custom Go package manager.&lt;br /&gt;
* &#039;&#039;&#039;FM/RDS transmitter&#039;&#039;&#039;: a GNU Radio flowgraph with RDS encoding, plus experiments in lossless audio over radio.&lt;br /&gt;
* &#039;&#039;&#039;Raspberry Pi 5 robotics&#039;&#039;&#039;: servo control, computer vision, and custom PCB and bootloader work.&lt;br /&gt;
* &#039;&#039;&#039;MPP ecosystem&#039;&#039;&#039;: bots, voice chat, and frontend work for [[Multiplayer Piano]].&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [https://git.sad.ovh git.sad.ovh]: my Git hosting&lt;br /&gt;
* [https://sad.ovh sad.ovh]: main site&lt;/div&gt;</summary>
		<author><name>Sophie-developer</name></author>
	</entry>
	<entry>
		<id>https://wiki.simtx.net/index.php?title=File:ADOPTED!_Gooch_(306793864).jpg&amp;diff=1977</id>
		<title>File:ADOPTED! Gooch (306793864).jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.simtx.net/index.php?title=File:ADOPTED!_Gooch_(306793864).jpg&amp;diff=1977"/>
		<updated>2026-10-22T07:12:25Z</updated>

		<summary type="html">&lt;p&gt;Sophie-developer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sophie-developer</name></author>
	</entry>
	<entry>
		<id>https://wiki.simtx.net/index.php?title=User:Sophie-developer&amp;diff=1976</id>
		<title>User:Sophie-developer</title>
		<link rel="alternate" type="text/html" href="https://wiki.simtx.net/index.php?title=User:Sophie-developer&amp;diff=1976"/>
		<updated>2026-10-22T07:10:41Z</updated>

		<summary type="html">&lt;p&gt;Sophie-developer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{userbox|border-c=#000000|border-s=2|info-c=#f4903c|info=This user loves {{{1|his/her/their}}} [[Tabby_cat#Orange_tabby|&amp;lt;span style=&amp;quot;color:black;&amp;quot;&amp;gt;orange cat&amp;lt;/span&amp;gt;]]|info-a=center|info-s=10|info-fc=#000000|id=[[File:ADOPTED! Gooch (306793864).jpg|50px]]|id-c=#000000}}&lt;/div&gt;</summary>
		<author><name>Sophie-developer</name></author>
	</entry>
	<entry>
		<id>https://wiki.simtx.net/index.php?title=Template:Userbox&amp;diff=1975</id>
		<title>Template:Userbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.simtx.net/index.php?title=Template:Userbox&amp;diff=1975"/>
		<updated>2026-10-22T07:10:05Z</updated>

		<summary type="html">&lt;p&gt;Sophie-developer: Created page with &amp;quot;{| cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;width:238px; background:{{{info-background|{{{2|{{{info-c|#EEE}}}}}}}}}; float:{{{float|none}}}; border:{{{border-width|{{{border-s|1}}}}}}px solid {{{border-color|{{{1|{{{border-c|{{{id-c|#999}}}}}}}}}}}}; margin:1px;&amp;quot; class=&amp;quot;wikipediauserbox {{{bodyclass|}}}&amp;quot; {{#if:{{{logo|{{{3|{{{id|id}}}}}}}}}| ! style=&amp;quot;width:{{{logo-width|{{{id-w|45}}}}}}px; height:{{{logo-height|{{{id-h|45}}}}}}px; background:{{{logo-background|{{{1|{{{id-c|#DDD}}}}}}}}};...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;width:238px; background:{{{info-background|{{{2|{{{info-c|#EEE}}}}}}}}}; float:{{{float|none}}}; border:{{{border-width|{{{border-s|1}}}}}}px solid {{{border-color|{{{1|{{{border-c|{{{id-c|#999}}}}}}}}}}}}; margin:1px;&amp;quot; class=&amp;quot;wikipediauserbox {{{bodyclass|}}}&amp;quot;&lt;br /&gt;
{{#if:{{{logo|{{{3|{{{id|id}}}}}}}}}|&lt;br /&gt;
! style=&amp;quot;width:{{{logo-width|{{{id-w|45}}}}}}px; height:{{{logo-height|{{{id-h|45}}}}}}px; background:{{{logo-background|{{{1|{{{id-c|#DDD}}}}}}}}}; text-align:{{{id-a|center}}}; font-size:{{{logo-size|{{{5|{{{id-s|14}}}}}}}}}pt; color:{{{logo-color|{{{id-fc|black}}}}}}; padding:{{{logo-padding|{{{id-p|1px}}}}}}; line-height:{{{logo-line-height|{{{id-lh|1.25em}}}}}}; vertical-align: middle; {{{logo-other-param|{{{id-op|}}}}}}&amp;quot; {{!}} {{{logo|{{{3|{{{id|id}}}}}}}}}&lt;br /&gt;
}}&lt;br /&gt;
| style=&amp;quot;text-align:{{{info-a|left}}}; font-size:{{{info-size|{{{info-s|8}}}}}}pt; padding:{{{info-padding|{{{info-p|4px}}}}}}; height:{{{logo-height|{{{id-h|45}}}}}}px; line-height:{{{info-line-height|{{{info-lh|1.25em}}}}}}; color:{{{info-color|{{{info-fc|black}}}}}}; vertical-align: middle; {{{info-other-param|{{{info-op|}}}}}}&amp;quot; | {{{info|{{{4|{{{info|&#039;&#039;info&#039;&#039;}}}}}}}}}&lt;br /&gt;
|}{{#if:{{{nocat|}}}||{{#if:{{{usercategory|}}}|{{#switch:{{NAMESPACE}}&lt;br /&gt;
 |User = [[Category:{{{usercategory}}}]]&lt;br /&gt;
 |Template = [[Category:Userboxes{{#translation:}}| ]]&lt;br /&gt;
}}}}}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sophie-developer</name></author>
	</entry>
	<entry>
		<id>https://wiki.simtx.net/index.php?title=User:Sophie-developer&amp;diff=1974</id>
		<title>User:Sophie-developer</title>
		<link rel="alternate" type="text/html" href="https://wiki.simtx.net/index.php?title=User:Sophie-developer&amp;diff=1974"/>
		<updated>2026-10-22T07:09:55Z</updated>

		<summary type="html">&lt;p&gt;Sophie-developer: Created page with &amp;quot;{{userbox|border-c=#000000|border-s=2|info-c=#f4903c|info=This user loves {{{1|his/her/their}}} &amp;lt;span style=&amp;quot;color:black;&amp;quot;&amp;gt;orange cat&amp;lt;/span&amp;gt;|info-a=center|info-s=10|info-fc=#000000|id=50px|id-c=#000000}} {| class=&amp;quot;wikitable&amp;quot; |67x67px |This user loves his/her/their orange cat |}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{userbox|border-c=#000000|border-s=2|info-c=#f4903c|info=This user loves {{{1|his/her/their}}} [[Tabby_cat#Orange_tabby|&amp;lt;span style=&amp;quot;color:black;&amp;quot;&amp;gt;orange cat&amp;lt;/span&amp;gt;]]|info-a=center|info-s=10|info-fc=#000000|id=[[File:ADOPTED! Gooch (306793864).jpg|50px]]|id-c=#000000}}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|[[File:ADOPTED!_Gooch_(306793864).jpg|link=https://en.wikipedia.org/wiki/File:ADOPTED!_Gooch_(306793864).jpg|67x67px]]&lt;br /&gt;
|This user loves his/her/their orange cat&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Sophie-developer</name></author>
	</entry>
	<entry>
		<id>https://wiki.simtx.net/index.php?title=Main_Page&amp;diff=1973</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.simtx.net/index.php?title=Main_Page&amp;diff=1973"/>
		<updated>2026-10-22T07:03:23Z</updated>

		<summary type="html">&lt;p&gt;Sophie-developer: bold + SDR ref&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px solid #a2a9b1; border-top:4px solid #36c; padding:1em 1.4em; margin-bottom:1.2em;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size:180%;&amp;quot;&amp;gt;SimTX Wiki&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SimTX is a shared radio simulation.&#039;&#039;&#039; Set up a virtual transmitter, send audio, and listen with a receiver. No physical radio or antenna is needed. Distance, antennas, and radio conditions affect what listeners hear.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size:125%;&amp;quot;&amp;gt;&#039;&#039;&#039;[[Getting Started|Download SimTX and make your first transmission]]&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The illustrated guide covers installation, account sign-in, server selection, a working example, listening, and saving your settings.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Learn in order ==&lt;br /&gt;
# &#039;&#039;&#039;[[Getting Started|Download and transmit]]&#039;&#039;&#039;: follow one complete example from an empty desktop to your first TX session.&lt;br /&gt;
# &#039;&#039;&#039;[[Transmitter Interface|Find your way around]]&#039;&#039;&#039;: identify the controls and understand the meters.&lt;br /&gt;
# &#039;&#039;&#039;[[Transmission Sources|Choose what to send]]&#039;&#039;&#039;: play a file, use a microphone, or send a stream.&lt;br /&gt;
# &#039;&#039;&#039;[[Antenna System|Change frequency and coverage]]&#039;&#039;&#039;: choose and adjust an antenna, then learn [[Propagation Basics|why reception changes]].&lt;br /&gt;
# &#039;&#039;&#039;[[Lua extensions|Add features]]&#039;&#039;&#039;: install modes, audio processors, tools, and themes without writing code.&lt;br /&gt;
# [[How to receive|&#039;&#039;&#039;Start to receiving&#039;&#039;&#039;]]: receiving signals and stations using any [[wikipedia:Software-defined_radio|SDR]] app.&lt;br /&gt;
&lt;br /&gt;
[[File:SimTX-0.3.6-first-transmission-guide-clean.png|thumb|center|850px|alt=Annotated SimTX Transmitter window showing station settings, radio settings, audio source, antenna, Start TX, and session controls.|The transmitter window. The guide explains each marked area.]]&lt;br /&gt;
&lt;br /&gt;
== Find a specific answer ==&lt;br /&gt;
* &#039;&#039;&#039;Nothing happens or no sound?&#039;&#039;&#039; Use [[Troubleshooting]].&lt;br /&gt;
* &#039;&#039;&#039;Which radio mode should I choose?&#039;&#039;&#039; See [[Modulation Modes]].&lt;br /&gt;
* &#039;&#039;&#039;How do I save or share my station setup?&#039;&#039;&#039; See [[Station Configuration]] and [[Extension catalog]].&lt;br /&gt;
* &#039;&#039;&#039;What do SWR, bandwidth, and IQ mean?&#039;&#039;&#039; See [[Radio terms]].&lt;br /&gt;
* &#039;&#039;&#039;Looking for formulas or an API?&#039;&#039;&#039; Open the [[Documentation|complete documentation index]], including antenna calculations and every Lua API reference.&lt;br /&gt;
&lt;br /&gt;
== Community and other ways to use SimTX ==&lt;br /&gt;
* [[:Category:Radio Stations|Community radio stations]]: stations described by their operators.&lt;br /&gt;
* [[Guide to setting up sdr console with simtx|SDR Console]], [[DATV RX Tutorial|digital television reception]], [[DATV TX Tutorial|digital television transmission]], [[How to receive]] and [[DRM TX tutorial|DRM transmission]]: additional community guides.&lt;br /&gt;
* [https://simtx.net/downloads Download the transmitter] · [https://simtx.net SimTX website] · [https://discord.gg/BxtpFJAs6c SimTX Discord]&lt;/div&gt;</summary>
		<author><name>Sophie-developer</name></author>
	</entry>
	<entry>
		<id>https://wiki.simtx.net/index.php?title=UVB-76&amp;diff=1751</id>
		<title>UVB-76</title>
		<link rel="alternate" type="text/html" href="https://wiki.simtx.net/index.php?title=UVB-76&amp;diff=1751"/>
		<updated>2026-09-25T11:00:04Z</updated>

		<summary type="html">&lt;p&gt;Sophie-developer: formatting / spelling&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox radio station&lt;br /&gt;
| name             = UVB-76&lt;br /&gt;
| image            = Spectrogram of UVB-76.png&lt;br /&gt;
| caption          = A spectrogram of UVB-76, showing the suppressed lower sideband&lt;br /&gt;
| country          = [[Soviet Union]] (1982–1991)&amp;lt;br&amp;gt;[[Russia]] (1991–present)&lt;br /&gt;
| frequency        = 4625 kHz [[shortwave]]&lt;br /&gt;
| language         = [[Russian]]&lt;br /&gt;
| format           = Repeated buzzing sound&lt;br /&gt;
| owner            = [[Russian Armed Forces]]&lt;br /&gt;
| simtx_operators  = 1326976601673568380&amp;lt;br&amp;gt;&amp;lt;small&amp;gt;(Current nickname: Ignorance)&amp;lt;/small&amp;gt;&lt;br /&gt;
| sister_stations  = [[The Pip]], [[The Squeaky Wheel]]&lt;br /&gt;
| former_callsigns = УЗБ-76 (commonly mistaken to be УВБ-76), МДЖБ, ЖУОЗ, АНВФ&lt;br /&gt;
| former_frequencies = 4625.5 kHz&lt;br /&gt;
}}&lt;br /&gt;
UVB-76 (aka. The Buzzer) is a shortwave radio station that broadcasts on the frequency of &#039;&#039;&#039;4625 kHz&#039;&#039;&#039;. It is famous for transmitting a monotonous buzzing sound 24 hours a day, repeating approximately 25 times per minute and largly recognised radio station inside the radio community, largely due to its extreme secrecy, decade-long endurance, and the eerie nature of its broadcasts. Unlike normal stations, it has no commercial purpose and continues to buzz through major global geopolitical shifts without explanation, capturing the imagination of conspiracy theorists, cryptologists, and shortwave hobbyists worldwide. Over the years, several major theories have emerged regarding its true function:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;The &amp;quot;Dead Hand&amp;quot; Trigger:&#039;&#039;&#039; One of the most famous, albeit highly debated, theories suggests the station is tied to Russia’s &#039;&#039;Perimetr&#039;&#039; system—a nuclear retaliatory setup. Proponents believe that if the buzzing completely stops for a prolonged period, it could trigger an automated nuclear counterstrike response.&lt;br /&gt;
* &#039;&#039;&#039;Military Command Hub:&#039;&#039;&#039; The most widely accepted and practical theory among defense experts is that UVB-76 serves as a strategic communications link for the Western Military District. The continuous buzzing acts as a channel marker to keep the frequency occupied and alert, ready to broadcast high-priority, encoded &amp;quot;Monolith&amp;quot; commands to military bases and spies in the field during a crisis.&lt;br /&gt;
* &#039;&#039;&#039;Ionospheric Research:&#039;&#039;&#039; Another scientific theory suggests the constant signal is used to measure changes in the Earth’s ionosphere. By continuously broadcasting a stable frequency, researchers or military operators could theoretically monitor radio wave propagation and atmospheric disturbances.&lt;br /&gt;
&lt;br /&gt;
=== Voice Transmissions and Coded Messages ===&lt;br /&gt;
Despite the nearly continuous buzzing, the drone is occasionally interrupted by live voice broadcasts. These rare events follow a strict, unchanging format: the buzzer stops, a male or female voice speaks in Russian, reads out a specific phonetic callsign, and delivers a string of numbers and code words. For instance, messages like &#039;&#039;&amp;quot;MDZhB 76 497 TERRAKOTA 25 12 16 92&amp;quot;&#039;&#039; are transmitted into the ether. These numbers are believed to be &amp;quot;Monolith&amp;quot; messages—highly encrypted tactical instructions meant for specific military units, which remain completely uncrackable by the public.&lt;br /&gt;
&lt;br /&gt;
=== Evolving Callsigns ===&lt;br /&gt;
Throughout its decades of operation, listeners have identified the station by the unique voice callsigns it uses during these broadcasts. As the station&#039;s administrative structure or military codes change, so does its name. The most notable callsigns include:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;UZB-76 (УЗБ-76):&#039;&#039;&#039; The historical identifier used for over a decade until 2010.&lt;br /&gt;
* &#039;&#039;&#039;MDZhB (МДЖБ):&#039;&#039;&#039; Adopted in late 2010, which became the most famous callsign among internet hobbyists.&lt;br /&gt;
* &#039;&#039;&#039;ZhUOZ (ЖУОЗ) &amp;amp; ANVF (АНВФ):&#039;&#039;&#039; Temporary callsigns utilized during structural updates in the late 2010s.&lt;br /&gt;
* &#039;&#039;&#039;NZhTI (НЖТИ):&#039;&#039;&#039; The primary modern callsign broadcasted in ongoing military transmissions.&lt;br /&gt;
&lt;br /&gt;
=== Shifting Locations ===&lt;br /&gt;
The geographic origin of &amp;quot;The Buzzer&amp;quot; has also shifted over time, adding to its mystique. From the late Cold War era until 2010, triangulation and radio direction-finding placed the transmitter at a highly secured military telecommunications compound near &#039;&#039;&#039;Povarovo, Moscow Oblast&#039;&#039;&#039;. However, in September 2010, the Povarovo site was suddenly abandoned, leaving behind empty buildings and rusted antennas.&lt;br /&gt;
&lt;br /&gt;
Today, the station uses a decentralized network to prevent the signal from being easily knocked out. The primary broadcast sites are now tracked to the 60th Communication Hub near &#039;&#039;&#039;Kerro, Leningrad Oblast&#039;&#039;&#039;, with powerful backup transmitters operating out of military communication nodes near &#039;&#039;&#039;Pskov&#039;&#039;&#039; and &#039;&#039;&#039;Voronezh&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Station Operators ===&lt;br /&gt;
The identity of the live operators broadcasting over UVB-76 remains highly classified, but their habits tell a distinct story. Listeners frequently hear background noises during voice messages, such as rustling papers, distant military chatter, and internal telephone rings, confirming that live human personnel manually staff the transmitters. During prominent frequency hijacks by internet trolls, operators have been observed frantically adjusting frequencies and deploying specialized digital countermeasures to wrestle back control of the signal.&lt;br /&gt;
&lt;br /&gt;
* (SimTX operator discord id: 1326976601673568380).&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Category:Radio Stations]]&lt;br /&gt;
[[Category:CIS-12]]&lt;/div&gt;</summary>
		<author><name>Sophie-developer</name></author>
	</entry>
	<entry>
		<id>https://wiki.simtx.net/index.php?title=Category:SWIFT-3k&amp;diff=1750</id>
		<title>Category:SWIFT-3k</title>
		<link rel="alternate" type="text/html" href="https://wiki.simtx.net/index.php?title=Category:SWIFT-3k&amp;diff=1750"/>
		<updated>2026-09-25T10:59:18Z</updated>

		<summary type="html">&lt;p&gt;Sophie-developer: formatting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Obraz.png|300px|thumb|right|Leader tone -&amp;gt; Traffic burst]]&lt;br /&gt;
[[File:Obraz_(1).png|300px|thumb|right|Deeper look into the burst]]&lt;br /&gt;
&#039;&#039;&#039;SWIFT-3k&#039;&#039;&#039; (Also known as OFDM) is a 49-tone OFDM PSK Russian military multi-channel modem. It features scrambled voice/ data-communication at a maximum data rate of 7333 bps. Each subcarrier can transmit up to 44.1 Bd. &lt;br /&gt;
&lt;br /&gt;
This waveform is transmitted by the SWIFT-3k, SWIFT-3k-2, SWIFT-3k-3 and the newer SWIFT-3k-4 modem versions in use by the multiple operators but Guest Radio operator mostly. These modems were designed to have many different devices plugged into them to form the modem’s input – most often teleprinters unique to the different military services and civilian agencies that use them, and also, vocoders and speech encipherment systems, but all are transmitted in the same fashion.&lt;br /&gt;
&lt;br /&gt;
A characteristic trait of this signal is the unmodulated leader tone at 1500 Hz (But some people use different ones).&lt;br /&gt;
&lt;br /&gt;
== Air interface ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Parameter&lt;br /&gt;
!Value&lt;br /&gt;
!Why&lt;br /&gt;
|-&lt;br /&gt;
|Sample rate&lt;br /&gt;
|48 000 Hz&lt;br /&gt;
|Native rate of nearly every sound device.&lt;br /&gt;
|-&lt;br /&gt;
|FFT size / spacing&lt;br /&gt;
|1024 → 46.875 Hz&lt;br /&gt;
|Symbol long enough for HF Doppler, short enough to track drift.&lt;br /&gt;
|-&lt;br /&gt;
|Guard interval&lt;br /&gt;
|64 / 128 / 256 samples&lt;br /&gt;
|Fast / Standard / Robust — trades throughput for tolerance of path delay spread and timing error.&lt;br /&gt;
|-&lt;br /&gt;
|Symbol rate&lt;br /&gt;
|44.1 / 41.7 / 37.5 baud&lt;br /&gt;
|Not signalled — the receiver identifies it from the reference symbol&#039;s own guard interval before reading anything else.&lt;br /&gt;
|-&lt;br /&gt;
|Carriers&lt;br /&gt;
|49 (375–2625 Hz)&lt;br /&gt;
|Fits a 300–2700 Hz SSB filter with room at both edges.&lt;br /&gt;
|-&lt;br /&gt;
|Pilots&lt;br /&gt;
|5 at −24, −12, 0, +12, +24&lt;br /&gt;
|Carry a known zero phase step; drive the phase loop.&lt;br /&gt;
|-&lt;br /&gt;
|Data carriers&lt;br /&gt;
|44&lt;br /&gt;
|Everything else.&lt;br /&gt;
|-&lt;br /&gt;
|Modulation&lt;br /&gt;
|DBPSK / DQPSK / D8PSK / D16PSK&lt;br /&gt;
|Differential in time, so no channel equaliser is needed.&lt;br /&gt;
|-&lt;br /&gt;
|FEC&lt;br /&gt;
|K=7 (171/133), rate ½ / ⅔ / ¾&lt;br /&gt;
|Soft-decision Viterbi; ⅔ and ¾ puncture the same mother code, not separate encoders.&lt;br /&gt;
|-&lt;br /&gt;
|Interleaver&lt;br /&gt;
|Coprime stride, per block&lt;br /&gt;
|Spreads a 2 kB block over up to 9 s of air time.&lt;br /&gt;
|-&lt;br /&gt;
|Occupied bandwidth&lt;br /&gt;
|≈ 2.3 kHz&lt;br /&gt;
|−26 dB points at roughly 350 and 2650 Hz.&lt;br /&gt;
|-&lt;br /&gt;
|Creator&lt;br /&gt;
|guest10074&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Throughput ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Mode&lt;br /&gt;
!Gross&lt;br /&gt;
!Net payload&lt;br /&gt;
!Reliable from&lt;br /&gt;
|-&lt;br /&gt;
|DBPSK + FEC 1/2&lt;br /&gt;
|1 833 bit/s&lt;br /&gt;
|890 bit/s&lt;br /&gt;
| +4 dB&lt;br /&gt;
|-&lt;br /&gt;
|DBPSK + FEC 2/3&lt;br /&gt;
|1 833 bit/s&lt;br /&gt;
|1 176 bit/s&lt;br /&gt;
| +4 dB&lt;br /&gt;
|-&lt;br /&gt;
|DBPSK + FEC 3/4&lt;br /&gt;
|1 833 bit/s&lt;br /&gt;
|1 317 bit/s&lt;br /&gt;
| +7 dB&lt;br /&gt;
|-&lt;br /&gt;
|DQPSK + FEC 1/2&lt;br /&gt;
|3 667 bit/s&lt;br /&gt;
|1 733 bit/s&lt;br /&gt;
| +4 dB&lt;br /&gt;
|-&lt;br /&gt;
|DQPSK + FEC 2/3&lt;br /&gt;
|3 667 bit/s&lt;br /&gt;
|2 270 bit/s&lt;br /&gt;
| +7 dB&lt;br /&gt;
|-&lt;br /&gt;
|DQPSK + FEC 3/4&lt;br /&gt;
|3 667 bit/s&lt;br /&gt;
|2 534 bit/s&lt;br /&gt;
| +7 dB&lt;br /&gt;
|-&lt;br /&gt;
|D8PSK + FEC 1/2&lt;br /&gt;
|5 500 bit/s&lt;br /&gt;
|2 534 bit/s&lt;br /&gt;
| +9 dB&lt;br /&gt;
|-&lt;br /&gt;
|D8PSK + FEC 2/3&lt;br /&gt;
|5 500 bit/s&lt;br /&gt;
|3 290 bit/s&lt;br /&gt;
| +10 dB&lt;br /&gt;
|-&lt;br /&gt;
|D8PSK + FEC 3/4&lt;br /&gt;
|5 500 bit/s&lt;br /&gt;
|3 660 bit/s&lt;br /&gt;
| +10 dB&lt;br /&gt;
|-&lt;br /&gt;
|D16PSK + FEC 1/2&lt;br /&gt;
|7 333 bit/s&lt;br /&gt;
|3 290 bit/s&lt;br /&gt;
| +17 dB&lt;br /&gt;
|-&lt;br /&gt;
|D16PSK + FEC 3/4&lt;br /&gt;
|7 333 bit/s&lt;br /&gt;
|4 707 bit/s&lt;br /&gt;
| +17 dB&lt;br /&gt;
|-&lt;br /&gt;
|DQPSK raw&lt;br /&gt;
|3 667 bit/s&lt;br /&gt;
|3 290 bit/s&lt;br /&gt;
| +14 dB&lt;br /&gt;
|-&lt;br /&gt;
|D8PSK raw&lt;br /&gt;
|5 500 bit/s&lt;br /&gt;
|4 707 bit/s&lt;br /&gt;
| +26 dB&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Burst structure ==&lt;br /&gt;
 ┌──────────────┬──┬────────┬─┬─────┬──────────┬──────────────┐&lt;br /&gt;
 │ leader tone  │  │ chirp  │ │ ref │  header  │   payload    │&lt;br /&gt;
 │ 1500 Hz, .6s │30│ 300→   │1│  1  │ 8 sym    │   N symbols  │&lt;br /&gt;
 │              │ms│ 2700Hz │0│ sym │ DBPSK ×5 │   data mode  │&lt;br /&gt;
 │              │  │ 100 ms │ms│    │          │              │ &amp;lt;br /&amp;gt;└──────────────┴──┴────────┴─┴─────┴──────────┴──────────────┘&lt;br /&gt;
&lt;br /&gt;
Logs:&lt;br /&gt;
none yet&lt;br /&gt;
&lt;br /&gt;
== How to download and use ==&lt;br /&gt;
Ask guest10074 (@guest10074.lua) on Discord. The modem is fully built in HTML so it can be used as a standalone file.&lt;br /&gt;
----&lt;br /&gt;
[[Category:Modems]]&lt;/div&gt;</summary>
		<author><name>Sophie-developer</name></author>
	</entry>
	<entry>
		<id>https://wiki.simtx.net/index.php?title=BleeFM&amp;diff=1747</id>
		<title>BleeFM</title>
		<link rel="alternate" type="text/html" href="https://wiki.simtx.net/index.php?title=BleeFM&amp;diff=1747"/>
		<updated>2026-09-25T10:53:07Z</updated>

		<summary type="html">&lt;p&gt;Sophie-developer: spelling&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Information ==&lt;br /&gt;
[[File:BleeFM in the middle of transmission.png|thumb|RX (from SDR++) view of 200KHz, the frequency bleeFM is on.]]&lt;br /&gt;
&lt;br /&gt;
====== Frequency + other info ======&lt;br /&gt;
This station COULD be mistaken to be a FM station! This station has moved from 103.7 MHz to 200 KHz just because they felt like being closer to the receiver and having a lower frequency. The transmitter for this station is subsided in Lat. 47.5300 Lon 19.0374, using a 50m vertical antenna on 1000W of power. One note is that this station isn&#039;t 24/7, so it could be taken over at any moment.&lt;br /&gt;
&lt;br /&gt;
====== Why, and when? ======&lt;br /&gt;
This station was created on September 22, 2026 (at somewhere around 18:30-19:00 CEST), as a attempt to have a good AM station.&lt;br /&gt;
&lt;br /&gt;
[[Category:Radio Stations]]&lt;br /&gt;
[[Category:LW Stations]]&lt;/div&gt;</summary>
		<author><name>Sophie-developer</name></author>
	</entry>
</feed>