Open implementation · transpacific route

Chicago to Shanghai before the cable.

Goblin Cannon is Adam DePrince’s open implementation of a market-data path for the transpacific route. Its great circle peaks near 71°N—above the Arctic Circle and through the auroral oval. The quiet-host software tests meet the 2.1 ms processing budget. Current BPSK, QPSK and 8-PSK traces measure useful delivery through quiet, moderate and disturbed fading. Everything reported here uses a simulated channel. Putting the link on air still needs a partner, two sites, an RF chain, path-engineered antennas, and spectrum authorization.

Built by Adam DePrince Open implementation No over-air transmission yet

≈ cRadio propagation through the atmosphere is close to light speed in vacuum.
≈ ⅔ cLight propagates materially slower through the glass in an undersea cable.
~13.5 MHzThe intended HF target for an ionospheric path beyond the horizon.
Open sourceThe baseband, market-data path, controls, accounting, and tests are inspectable.

A longer-looking route can arrive first.

Undersea fiber pays twice: the signal travels slower inside glass, and the route follows cable landings and terrestrial networks rather than a straight market-to-market line.

HF skywave pays a different cost—the climb to the ionosphere, one or more skips, and a narrow, variable channel. But the wave travels through the atmosphere near c, and the geographic route can be far more direct. Goblin Cannon exists to turn that physical opening into a usable market-data feed.

The software keeps updates compact, sends continuously, and refuses to let an old queue consume a latency advantage. A newer value replaces an unsent older value for the same key. Across keys, the highest bid per on-air byte goes next; age does not increase priority.

The goal is the first useful price at the distant receiver—not bulk throughput, not a laboratory bitrate, and not a theoretical propagation number.

I built the stack. I can't fund the radio link.

Trading firms have run HF market-data links across the Atlantic for years under experimental authorizations. The FCC experimental filings are public. IEEE Spectrum and Radio World have covered the work. Their stacks are closed. I respect what they proved.

This is the open implementation. New York to London is the calibration against the known case. Commercial U.S.–Asia HF links exist. I found no prior published implementation and no prior published analysis of the Chicago-to-Shanghai route.

The full software path exists: modem, market-data path, auction, control plane, accounting, loopback, and tests. I have not transmitted one symbol over the air.

I am one guy in Vermont. Financially, I am a bug on the windshield of the firms already in this band.

Putting it on the air requires two sites, an RF chain, antennas engineered for the path, and spectrum authorization.

Budget and equipment: not published here. The site costs—two locations, transmitters, path-engineered antennas, receive chains, and the licensing work—depend on the partner's existing footprint, and a number without that context would mislead in one direction or the other.

For U.S. testing, this needs a Part 5 experimental authorization; for commercial operation, the pending path is the coalition's petition for regular Part 90 operations, RM-11953, whose ECFS proceeding record was open on September 14, 2026 and recorded neither an NPRM date nor a Commission-decision date.

I can't fund it; you can.

A partner brings the funding, two operating sites, the RF chain, path-engineered antennas, and the spectrum-authorization work. I bring the open software stack, integration, test harness, and measurement. Start with the Goblin Reactor intake →

Geometry creates an opening. The channel decides.

The great-circle model explains the transpacific objective. It estimates propagation only. The measured processing budget and the polar channel results below are separate evidence; neither establishes end-to-end route performance.

Spherical Earth300 km virtual reflection heightEqual-length skipsIdealized fiber at c / 1.468

Transpacific path · 71.534° N vertex · four modeled skips

Chicago → Shanghai

Great-circle
11,357 km
Sky path
11,843 km
Propagation
39.503 ms
Idealized great-circle fiber floor55.610 ms

The northern vertex makes high-latitude fading the primary screening case. Current simulated channels report useful delivery, freshness and outage gaps; these finite traces do not establish route availability.

Atlantic comparison · two modeled skips

New York → London

Great-circle
5,570 km
Sky path
5,814 km
Propagation
19.392 ms
Idealized great-circle fiber floor27.276 ms

A geometric comparison only. These numbers exclude cable detours, terrestrial tails, radio hardware, serialization, modem residence, processing and acquisition.

Simulated channel · route geometry. The route unit tests check a Chicago–Shanghai estimate of 39.503 ms with four skips and a 300 km virtual layer. Great-circle geometry does not establish propagation availability. The 2.1 ms allowance covers added processing and buffering; transmission and modem delays are reported separately.

Simulated channel.
The 71°N problem.

BPSK, QPSK and 8-PSK with convolutional or BCH coding, measured with faster recovery, equalizer uncertainty prediction and a compact authenticated header. Three seeds cover each bandwidth and high-latitude preset; quiet and moderate traces last 300 seconds, disturbed traces 100 seconds.

The transmit-power and noise reference are now calibrated. Carrier correction is off; RLS equalization and audio-clock recovery are on. The header is 13 bytes and retains the full 16-byte GCM tag. Parameters and nonce epochs travel over fiber. These finite simulated channels do not establish availability for the route that reaches 71.534°N.

Radio/software boundary for the recorded acceptance profile. The modem assumes the radio hands it audio with the carrier frequency offset already removed to within 10 Hz. It performs no Doppler-shift correction. Delay spread, Doppler spread, fading, phase rotation, multipath and noise are the modem's problem, and are what the recorded runs measure.

This boundary describes the recorded acceptance profile. The carrier-offset sweep uses 24 kHz QPSK+BCH, the combined recovery settings, the high-latitude quiet preset, 30 dB nominal SNR and three 300-second traces per offset. The tolerance applies to that measured configuration and the tested offset grid. Other modes and historical receiver versions have no tolerance established by this sweep. The library retains an optional carrier-correction loop, enabled by default; the recorded acceptance profile explicitly disables it. Equalizer phase tracking does not estimate a mean carrier frequency offset or perform AFC.

Doppler shift and Doppler spread

Doppler shift: a mean frequency offset of the received signal relative to the transmitted carrier; a translation of the whole spectrum. Hz. Caused by bulk ionospheric motion plus transmitter/receiver LO error. Removing it is a frequency-tracking (AFC) problem.

Doppler spread: the width of the Doppler power spectrum of a propagation path, i.e. the fading rate. Hz. In the Watterson / ITU-R F.1487 model it is the width of the Gaussian spectrum applied to each tap. It is not an offset and no AFC removes it; it appears as fast fading and phase rotation the equalizer must track. 30 Hz means a coherence time on the order of tens of milliseconds.

ITU-R F.1487 high-latitude channel presets
PresetDelay spread (ms)Doppler spread (Hz)Annex 3
Quiet10.5§4.1
Moderate310§4.2
Disturbed730§4.3

Gaussian spectrum per tap; Doppler spread is the 2-sigma width, not sigma. Thus 30 Hz means σ = 15 Hz. The taps fade independently. Mean per-path Doppler shift is a separate parameter; these presets use zero. F.1487 Annex 1 §2 and Annex 3 §§1, 4.1–4.3.

The original 908 recorded runs all disable carrier correction. All 722 Watterson runs use zero mean per-path Doppler shift and zero injected residual carrier frequency offset or drift. Across all 908 runs, 906 configure zero residual offset and drift; the two null-channel exceptions are a +5 Hz carrier frequency offset test and a +1 Hz/minute carrier-frequency drift test.

Measured carrier frequency offset tolerance: 10 Hz

Every seed and both offset signs stay within 0.1 percentage points of the paired 0 Hz delivery value, at every tested magnitude up to the reported bound. The largest passing tested magnitude before the first failure is 10 Hz. This is a sampled bound for the stated quiet-preset configuration. Both signs reach delivery collapse by 320 Hz. No carrier-offset correction was added.

Zero-offset delivery varies by 0.0334 percentage points across the three seeds. All zero-offset observations and metrics match the previously published quiet controls. Delivery is delivered / framed messages; fresh goodput uses the existing source-key freshness metric.

Quiet high-latitude preset · 24 kHz QPSK+BCH · 30 dB nominal SNR · 300 seconds per seed · mean and seed range
Carrier frequency offset (Hz)Delivery (%)Fresh goodput (bit/s)Largest paired change (percentage points)Seed records
-3200.0000
0.0000–0.0000
0.00
0.00–0.00
99.95327446529 · 7446530 · 7446531
-16026.6631
24.1050–29.3882
425.33
384.67–469.23
75.81497446529 · 7446530 · 7446531
-8089.9969
89.4536–90.6692
1435.68
1427.09–1446.32
10.46627446529 · 7446530 · 7446531
-4099.3989
99.2720–99.5057
1585.74
1583.81–1587.44
0.64797446529 · 7446530 · 7446531
-2099.9622
99.9532–99.9666
1594.65
1594.51–1594.72
0.03347446529 · 7446530 · 7446531
-1099.9488
99.9332–99.9666
1594.47
1594.29–1594.72
0.04687446529 · 7446530 · 7446531
-599.9354
99.8798–99.9666
1594.22
1593.33–1594.72
0.05347446529 · 7446530 · 7446531
-299.9310
99.8998–99.9532
1594.15
1593.65–1594.51
0.02007446529 · 7446530 · 7446531
-199.8931
99.8731–99.9265
1593.55
1593.23–1594.08
0.08017446529 · 7446530 · 7446531
-0.599.9443
99.9265–99.9733
1594.36
1594.08–1594.83
0.02007446529 · 7446530 · 7446531
+099.9354
99.9199–99.9532
1594.22
1593.97–1594.51
0.00007446529 · 7446530 · 7446531
+0.599.9488
99.9332–99.9599
1594.44
1594.19–1594.61
0.04017446529 · 7446530 · 7446531
+199.9421
99.9265–99.9666
1594.33
1594.08–1594.72
0.01347446529 · 7446530 · 7446531
+299.9132
99.8798–99.9466
1593.87
1593.33–1594.40
0.07357446529 · 7446530 · 7446531
+599.9488
99.9332–99.9733
1594.44
1594.19–1594.83
0.02007446529 · 7446530 · 7446531
+1099.9399
99.9265–99.9532
1594.29
1594.08–1594.51
0.02007446529 · 7446530 · 7446531
+2099.8887
99.8330–99.9466
1593.49
1592.64–1594.40
0.12027446529 · 7446530 · 7446531
+4099.1384
99.0182–99.2119
1581.53
1579.68–1582.67
0.91507446529 · 7446530 · 7446531
+8087.0291
85.8002–87.7839
1388.40
1368.91–1400.29
14.11977446529 · 7446530 · 7446531
+16031.6903
29.3548–34.3842
505.60
468.53–549.12
70.56517446529 · 7446530 · 7446531
+3200.0000
0.0000–0.0000
0.00
0.00–0.00
99.95327446529 · 7446530 · 7446531

Sweep method, records and source snapshot.

Useful messages delivered after FEC.

24 kHz · QPSK · BCH · high-latitude disturbed. Only complete, authenticated records reach the message sink.

Delivered / framed messages4.09–5.02%Range across three seeds
Useful goodput38.00–46.48Useful bits per second
Delivered freshness p99.997.00–98.00Milliseconds from source creation
Longest delivery silence4.483–7.062Seconds, including terminal silence

Configured SNR 30 dB; equal-gain two-path Watterson channel; delay spread 7 ms; Doppler spread 30 Hz (2σ); per-path Doppler shift 0 Hz; residual carrier frequency offset 0 Hz. Ranges are seed ranges, not confidence intervals.

The RF view reports measured sample power; the power audit checks the corrected noise reference and matched diversity controls using the existing 2% finite-waveform tolerance. The 24 kHz model extends beyond the Recommendation’s validated bandwidth scope. No live recordings or soak results are available.

Simulated channel · 24 kHz disturbed · current useful delivery
ConfigurationUseful bit/sFresh bit/sDelivered / framed %Freshness p99.9 msLongest silence sSeed records
BPSK · convolutional8.56–15.927.92–15.602.56–4.74171.00–173.008.742–15.6317446529 · 7446530 · 7446531
BPSK · BCH20.64–25.2020.64–25.204.47–5.43110.00–111.009.123–11.5007446529 · 7446530 · 7446531
QPSK · convolutional28.64–31.6828.64–31.684.27–4.69102.00–103.004.841–6.7847446529 · 7446530 · 7446531
QPSK · BCH38.00–46.4838.00–46.484.09–5.0297.00–98.004.483–7.0627446529 · 7446530 · 7446531
8-PSK · convolutional14.56–16.6414.56–16.641.45–1.6836.00–89.007.770–18.8457446529 · 7446530 · 7446531
8-PSK · BCH17.92–24.7217.92–24.721.39–1.9081.00–88.008.819–12.1277446529 · 7446530 · 7446531

Fresh goodput counts messages still current at their source key when delivered. Missing decisions do not count as zero BER. The RF view uses separate ten-second screens and reports the observed-bit fraction. The paired experiment report isolates recovery, uncertainty prediction and header size against a freshly calibrated baseline.

On the disturbed 24 kHz trace, QPSK+BCH improves from 2.24–7.36 to 38.00–46.48 fresh bit/s. These settings remain selectable: quiet 24 kHz 8-PSK+BCH falls from 2071.89–2080.96 to 1944.91–1950.45 fresh bit/s, and disturbed 10 kHz delivery remains essentially absent.

Simulated channel · frequency diversity at matched transmit power

BPSK+BCH, compact authenticated records. Lower and upper controls each use full power; both copies share that same total power. Three spacings and off-preset delays test sensitivity to the exact echo. Values are fresh useful bit/s across three seeds.

Simulated channel · one shared two-path realization
Band · spacing · traceLowerUpperBoth
10 kHz · commensurate · moderate0.00–0.110.000.00–0.11
10 kHz · commensurate · disturbed0.000.000.00
10 kHz · commensurate · 6.75ms0.000.000.00
10 kHz · commensurate · 7.25ms0.000.000.00
10 kHz · offset137 · moderate0.000.00–0.110.00–0.19
10 kHz · offset137 · disturbed0.000.000.00
10 kHz · offset137 · 6.75ms0.000.000.00
10 kHz · offset137 · 7.25ms0.000.000.00
10 kHz · wide137 · moderate0.00–0.110.000.00–0.11
10 kHz · wide137 · disturbed0.000.000.00
10 kHz · wide137 · 6.75ms0.000.000.00
10 kHz · wide137 · 7.25ms0.000.000.00
24 kHz · commensurate · moderate22.80–27.0123.39–24.1935.20–37.31
24 kHz · commensurate · disturbed0.000.00–0.320.00–0.32
24 kHz · commensurate · 6.75ms0.000.000.00–0.32
24 kHz · commensurate · 7.25ms0.000.000.00
24 kHz · offset137 · moderate20.80–24.4022.61–24.5134.99–39.68
24 kHz · offset137 · disturbed0.000.000.00–0.32
24 kHz · offset137 · 6.75ms0.00–0.320.000.00
24 kHz · offset137 · 7.25ms0.000.000.00
24 kHz · wide137 · moderate20.64–22.2921.01–23.1733.47–36.72
24 kHz · wide137 · disturbed0.000.00–0.320.00–0.32
24 kHz · wide137 · 6.75ms0.00–0.320.00–0.320.00
24 kHz · wide137 · 7.25ms0.000.000.00

Simulated channel.
Software latency.

24 of 24 configurations pass the 2.1 ms added-processing and buffering allowance, including twelve with the long disturbed-channel equalizer. Transmission time, modem/FEC residence and acquisition remain separately visible.

1.196 msWorst added p99.9
24/24Current configurations pass
2.1 msUnchanged processing and buffering limit
Simulated channel · current host measurements in milliseconds
Configuration / equalizer spanAdded p99.9Total p99.9Intrinsic p50 / p99.9Result
10000 16qam null1.00179.01428.604 / 78.792pass
10000 16qam polar span null1.00284.05729.938 / 83.687pass
10000 64qam null1.00672.04521.187 / 71.917pass
10000 64qam polar span null1.04677.03622.104 / 76.562pass
10000 qpsk null0.970116.00391.354 / 115.354pass
10000 qpsk polar span null0.990127.00396.042 / 126.604pass
24000 16qam null1.18634.00816.292 / 33.083pass
24000 16qam polar span null1.14335.08611.417 / 34.042pass
24000 64qam null1.12626.8867.479 / 26.000pass
24000 64qam polar span null1.19632.2029.896 / 31.167pass
24000 qpsk null1.04048.00738.729 / 47.250pass
24000 qpsk polar span null1.08453.07043.813 / 52.521pass
disturbed 10000 8psk bch latency0.998117.99135.042 / 117.188pass
disturbed 10000 8psk soft latency1.036125.03044.187 / 124.917pass
disturbed 10000 bpsk bch latency0.964192.003151.417 / 191.625pass
disturbed 10000 bpsk soft latency0.988260.006176.563 / 259.437pass
disturbed 10000 qpsk bch latency0.979128.00547.792 / 127.479pass
disturbed 10000 qpsk soft latency0.978139.010130.438 / 138.687pass
disturbed 24000 8psk bch latency1.15382.07722.479 / 81.354pass
disturbed 24000 8psk soft latency1.17590.10527.167 / 89.896pass
disturbed 24000 bpsk bch latency1.114142.11497.583 / 141.875pass
disturbed 24000 bpsk soft latency1.173174.037109.375 / 173.958pass
disturbed 24000 qpsk bch latency1.14892.00128.479 / 91.146pass
disturbed 24000 qpsk soft latency1.160141.12287.646 / 140.979pass

Serial twelve-second paced loopbacks include source creation, the auction, framing, authentication, FEC, modem processing and 1 ms audio blocks. Added latency is each delivered message’s host time above its matched one-sample intrinsic reference. No physical audio device or network socket is measured. Host timings vary and are stored separately from deterministic simulated-time JSON.

Receiver training is bursty: the longest measured RX call is 14.010 ms. Passing delivered-message percentiles does not establish a 1 ms audio-callback deadline. This fixture creates source messages on its processing loop; delays before creation are outside that latency metric.

The report includes the twelve-case before/after table and stage breakdowns. OpenSSL contexts and keys are initialized outside the per-frame path.

Simulated channel.
Injection is rejected.

The −10 dB co-channel trace now records 373 authentication failures and zero foreign or corrupt sink deliveries. Authentication failures remain separate from RF lock loss.

Simulated channel · same-waveform interferer with an independent key
SIRUseful deliveriesAuthentication failuresFEC gapsForeign/corrupt deliveredResult
-10 dB1937300pass
+0 dB19010pass
+10 dB388080pass

A zero authentication count means no invalid complete record reached that check. D6 separately rejects 31 deliberately tampered records, 8 same-session replays and 8 old-epoch records. Two sender processes used 16 distinct epoch/sequence nonces under one key. The compact format keeps the durable epoch in authenticated context supplied over fiber; no wall-clock nonce is used.

5 failing assertions across 5 cases remain in the current selection. Coordinated key rotation remains open: key IDs are authenticated in both header formats, but overlapping keys and mid-stream old-key retirement are not implemented.

Simulated channel · remaining defects
CaseAssertionFinding
A4_10000_64qam_drift_10minsync_heldWith warm recovery and elapsed-time prediction, 10 kHz 64-QAM loses lock 1112 times in the ten-minute residual-drift trace; first loss is at 304 s. Carrier correction remains off.
B1_24000_64qam_-20dB_1_100sync_heldWith warm recovery and elapsed-time prediction, 24 kHz 64-QAM loses lock once in the -20 dB / 1 ms attack / 100 ms decay trace.
C2_24000_acquire_0dBacquiredAt the requested low SNR, the receiver detects the preamble but loses lock without validating a header.
D3_auction_floodno_starvationPolicy conflict: strict bid priority permits starvation during an endless higher-bid flood; Adam rejected increasing priority with age. No cross-key expiry/decay interval is approved.
D6_key_rotationrotation_supportedBoth 25-byte and fiber-selected 13-byte authenticated headers retain key IDs, full GCM tags and durable epochs; two-key overlap and coordinated mid-stream retirement remain unimplemented.
Simulated channel · validation coverage and source

908 recorded runs cover 905 unique case/seed combinations. Both hosts pass 21/21 CTest tests; 15 harness checks and 19 CLI/protobuf checks pass. 3 repeated authenticated-message runs have byte-identical canonical JSON. This is a selected campaign; no full-matrix or soak completion is claimed.

Simulated channel · current validation selection
GroupCurrent results
A2characterized: 360
A4THRESHOLD_TBD: 1, xfail: 1
A8pass: 3
B1pass: 4, xfail: 1
B4pass: 3
B5pass: 24
C2THRESHOLD_TBD: 9, pass: 1, xfail: 1
C4pass: 37
D3xfail: 1
D4pass: 97
D6pass: 1, xfail: 1
E1pass: 3
E2characterized: 360

All unapproved acceptance margins remain THRESHOLD_TBD. Finite simulated traces do not establish route availability. Runtime overruns and every remaining defect are retained in the report.

Tested source SHA-256 bc8baf1d34eb61216f9949c8b3a22e6e225b6c4d80a912df3a380a9b4125b6b1.

Current value crosses first.

The transmitter sends immediately when it can. Under backpressure, it holds one candidate for the next slot. A new candidate either replaces that winner or is rejected. Old quotes do not form a waiting line.

  1. 01

    Encode a bank-relative delta.

    The market bridge subtracts the synchronized bank price. It sends the bank identifier, radio symbol, and signed delta in base-254 form. The realtime framer encrypts the body with AES-256-GCM and authenticates the key identifier, epoch, sequences, bank and length.

  2. 02

    Price the on-air bytes.

    The market bridge derives its shadow bid from displacement since the last sent price, recent price velocity, instrument weight, and billable length. The transmitter compares bids against reserved wire length, including the authenticated header, tag and framing bound.

  3. 03

    Gate the next-slot bid.

    A client bid must fit its remaining budget. If the transmit queue is occupied, only one waiting winner remains. A newer same-key value replaces it even with a lower bid. Across keys, higher bid per wire byte wins, with newest winning ties. The winner is claimed and charged when serialization begins.

  4. 04

    Confirm delivery or refund.

    A matching receiver report closes the outstanding charge. A sent client bid with no match after the default one-second window is refunded by the accounting sweep.

Freshness beats an old bid.

The same-key regression submits an older value with a 1,000-unit bid, then a newer value with a bid of one. Only the newer value reaches the framer. A falling price is still a newer price.

The accounting test follows the money.

A client starts with 1,000 cents. Sending a 300-cent bid reserves it and leaves 700 cents. A matching delivery report closes that charge. A later 300-cent bid leaves 400 cents; when it remains unconfirmed beyond one second, the refund returns the balance to 700 cents.

Receiver permissions, synchronized price banks, and health state travel through the control plane. The canonical terrestrial record reconciles what was sent with what the radio receiver reports. Decisions, deliveries, suspicions, and refunds are logged.

Physics creates the opening. Discipline keeps it.

Propagation speed is only the beginning. The rest of the system is built to avoid giving the advantage back through routing, batching, stale data, or unverifiable delivery.

The current polar campaign tests BPSK, QPSK and 8-PSK in both 10 kHz and 24 kHz profiles, with convolutional and BCH coding. The delivery explorer shows useful goodput, freshness and gaps across three seeds. Authentication overhead is included in those measurements.

Near-cAtmospheric propagation
DirectNo cable-landing route
CompactBank-relative price deltas
CurrentOne waiting winner
ContinuousNo block batching
TestedBPSK · QPSK · 8-PSK
VerifiedAES-256-GCM and replay rejection
MeasuredEnd-to-end event ledger

Variable sky. Explicit gaps.

01

Weak samples become erasures.

Confidence stays visible through demapping, so the decoder can treat ambiguity as missing information instead of inventing a price.

02

Fades do not leak partial messages.

Incomplete records and failed authentication are dropped. Plaintext reaches the message sink only after a complete record passes its authentication check.

03

Lost lock returns to search.

Recurring preambles allow reacquisition after fades. Replay protection survives RF resets; a process restart reserves a fresh durable transmitter epoch.

04

Stale control state closes the feed.

Missing heartbeats clear bank confidence; stale bases and disallowed symbols never become local quote packets.

05

Injection is rejected and counted.

AES-256-GCM rejects unauthenticated records before delivery. Authentication failures have their own control-plane counter and do not count as RF lock loss. Key IDs are authenticated; coordinated mid-stream key rotation and old-key retirement remain open.

Open software. Real sky.

Goblin Cannon opens the baseband modem, market-data path, prioritization, control plane, accounting, and measurement machinery. To race a cable, a deployment still needs two physical sites and an RF system engineered for the path.

The target near 13.5 MHz is a system-design objective, not blanket authorization to transmit. Frequency, power, bandwidth, emissions, and operating rights must match the license and jurisdiction at each site.

Build around the open core

  • RF hardware and site equipment, specified per path with the partner.
  • Path-specific propagation planning and channel characterization
  • Clocking and exchange-to-exchange latency measurement
  • Spectrum authorization and operational controls

Reproduce the path. Measure the race.

The repository contains the C++23 baseband library, sender and receiver, local loopback, control services, market-data adapters, accounting, and measurement tools. Prove the full software path locally, then connect the IQ stream to an RF chain built for the target route.

Goblin Cannon is a private, encrypted point-to-point link. It moves an operator's own feed between the operator's own sites; it is not a data-distribution service and does not redistribute anyone's data. The author tests against Massive.com data locally. Anyone using this software with market data is responsible for their own licensing with whatever vendor they use, including any redistribution agreements if their use goes beyond private encrypted transport. Not affiliated with or endorsed by Massive.com.

CMake 3.24+ C++23 x86_64 OpenSSL Protobuf gRPC RF hardware separate
~/goblin-cannon
$ git clone https://github.com/adamdeprince/goblin-cannon.git
$ cd goblin-cannon
$ cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
$ cmake --build build
$ ctest --test-dir build --output-on-failure

# Run the software loopback node
$ ./build/goblin_cannon_local_node