QRV · Bengaluru

VU2CPL
Manoj Ramawarrier

MK83TE · Bengaluru, Karnataka · Licenced 1993

FLEX-6600 · RGO One · IC-705 9 BDXCC DXpeditioner Remote Ops
1.5 KFA
SPE Expert Amp
9 BDXCC
Awards
VU7T · AT5P
DXpeditions

01 · About

The Operator

VU2CPL QSL card — Taj Mahal, India

Located in the garden city of India, Bangalore. Licensed since 1993, I started operations in Thrissur, Kerala with a simple homebrew QRP rig following VU2VWN OM Vasanth (SK)'s circuit — the most popular design of those days.

Later graduated to SSB with the help of an old exciter originally made by VU2UCY Om Bhasi (SK). Went through different iterations of 807 tube QRO and some military surplus gear (Redifone GR 345) during the 1990s. Shifted to Bangalore in early 2003.

I travel extensively for work and mostly operate remote during free time. The shack runs a fully automated setup including remote antenna switching and lightning protection.

DXpeditions
VU7T / VU7MSKavaratti Is, LakshadweepOct 2017
AT5PRameshwaram Is, IOTA AS-173May 2015
AT3N · ARSI HilltopNelliyampathy, Kerala — 4,417 QSOs, 261 DXCCJan 2024
ARSI Hilltop 2025Vayalada Hills, Kozhikode MK71WMJan 2025
ARSI Hilltop 2023Kulamavu, Idukki MJ89KT — HF/VHF/UHFFeb 2023
CallsignVU2CPL
GridMK83TE
LocationBengaluru, KA 562157
Licenced1993
ModesSSB · FT8 · CW
Bands160m – 6m incl. 60m
QSLLOTW · Clublog OQRS
Awards
5BDXCC160m DXCC30m DXCC17m DXCC12m DXCC
Photos by Girish, VU2KGB · hamphotos.com

02 · Station

Equipment

Radios
FlexRadio FLEX-6600 (SDR)
RGO One
Icom IC-705
Amplifier
SPE Expert 1.5 KFA
RX Antennas (Low Band)
350 ft 2-wire reversible Beverage (N/S) — winters only
N6RK Loop
K9AY Loop
Antennas
Hex beam — 20m to 6m
Vertical — 30m
Inverted Vee — 80m & 40m
Inverted L — 160m (hairpin matched, 2 elevated radials)
4 ele LFA Yagi — 6m
Band Allocation Notes
80m: 3500–3700 kHz
160m: 1800–1825 kHz
60m: QRV from Dec 2018
FT8: split needed within VU allocation

03 · Logbook

Operating Dashboard

DX Dashboard · Clublog Live
QSL Policy: Preferred route is LOTW or direct via Clublog OQRS. No bureau (stopped March 2019). For VU7MS and VU7T QSLs, use Clublog OQRS only. No IRC accepted.
Full log search →

04 · Projects

Shack Automation & Utilities

Node-RED Flows
Shack Dashboard — Vue 3 SPA
Unified single-page dashboard for the whole shack, built in Vue 3 and served from Node-RED via uibuilder — replacing the legacy AngularJS /ui board. Thirteen collapsible cards (FlexRadio, LP-700, SPE amplifier, rotator, lightning protection, power control, solar conditions, DXCC tracker, RBN skimmer, Raspberry Pi fleet, internet health, GPS NTP, UberSDR receiver) lay out in a responsive masonry grid that adapts from phone to desktop with no build step. Each card polls flow context every 1–5 s, shows a colour-coded collapsed summary and expands for full telemetry. Top bar carries the callsign, a live/offline connectivity pill and four clocks (UTC / IST / sunrise / sunset). PWA-installable on iPad and iPhone via "Add to Home Screen".
Node-REDVue 3uibuilderPWAMQTTResponsive
View repo on GitHub
Active
FLEX-6600 State Monitor Dashboard
Real-time Node-RED flow tracking all four slice receivers via the FlexRadio TCP API, with dual SmartSDR client support (AetherSDR + iPad). Colour-coded active-slice indication — amber for RX, red for TX — now surfaced as the FlexRadio card in the Vue 3 shack dashboard above, and still on the legacy AngularJS /ui board.
Node-REDFlexRadio APISmartSDRMQTT
View repo on GitHub
Active
DXCC Tracker & DX Alert System
Subscribes to four DX cluster telnet sources (VU2CPL, VU2OY, VE7CC, N2WQ) and pulls worked/confirmed DXCC data from Club Log via a nightly API call. Each incoming spot is prefix-resolved against cty.xml and classified against the confirmed grid — new DXCC entity (red), new band (blue), new mode fill (amber). Alerts fan out to the shack dashboard panel, MQTT, the FlexRadio slice, and a Telegram bot, with per-band / per-mode filtering.
Node-REDClub Log APIDX ClusterTelnetcty.xmlMQTTTelegram
View repo on GitHub
Active
Lightning Antenna Protector
Automatically disconnects antenna and radio when lightning is detected within 25 km. Dual source: Open-Meteo CAPE + WMO weather-code polling (every 5 min — CAPE ≥ 800 J/kg or code ∈ {95,96,99} synthesises a strike distance) + AS3935 local sensor via MQTT. Distance-graded 3×3 disconnect matrix (AS3935 close/medium/far × Open-Meteo cold/lit/severe) so Open-Meteo only corroborates AS3935 hits in the medium and far zones; the <10 km close zone still single-hit-fires. Vertical BYPASS switch on the dashboard suspends auto-disconnect for 120 min for planned TX (force-reconnects on activation, never survives a Node-RED restart). Strike events and connect/disconnect transitions persist to nr_lightning_events.jsonl so history survives Node-RED restarts. 20-min auto-reconnect timer once the storm passes. On disconnect it also sends a transmit set inhibit=1 command to the FLEX-6600 over the SmartSDR API, so the rig can't key up into a disconnected antenna — SmartSDR shows a red TX-Inhibit indicator and a Telegram alert fires. The inhibit clears automatically on reconnect, manual override or bypass; the radio stays powered and RX-capable throughout.
Node-REDOpen-MeteoTasmotaAS3935SmartSDR APITX inhibitTelegram
View repo on GitHub ▶ YouTube demo
Active
Remote Shack Control
Full remote operation capability including antenna switching via Tasmota MQTT relays. Operates the FLEX-6600 via SmartSDR from anywhere. Integrated with the lightning protection system for safe unattended operation.
TasmotaMQTTSmartSDRNode-RED
View repo on GitHub
Active
Shack Firmware & Field Devices
Pi GPS NTP Server — shack stratum-1 timeserver
Stratum-1 GPS-disciplined NTP server on a Raspberry Pi 3B with a u-blox NEO-M8N. Kernel pps-gpio + chrony pulls PPS error down to ±171 ns — well below anything a userland NTP implementation can match. Publishes chrony status, satellite count and fix quality over MQTT to the shack dashboard, with an LWT offline marker. Production timeserver for the LAN.
Raspberry PiGPSNTPchronykernel PPSu-blox NEO-M8NMQTT
View repo on GitHub
Active
ESP8266 GPS-disciplined NTP server
PPS-disciplined NTP server on a NodeMCU ESP8266 with a Quectel L89 GPS. Captures the PPS edge on a GPIO interrupt for sub-microsecond second alignment, holds stratum 1 across short PPS dropouts via holdover logic, and once the PPS+RMC pair goes stale for more than 5 s advertises stratum 16 / refid INIT (RFC 5905 §3.5) so clients cleanly fall back to other NTP sources rather than trusting a drifting local clock. Publishes status over MQTT with the same schema as the Pi NTP server and an LWT offline marker. WiFiManager captive-portal config — no compile-time secrets.
ESP8266PlatformIOGPSNTPPPSQuectel L89MQTT
View repo on GitHub
Active
vu2cpl-as3935-bridge — outdoor lightning sensor
ESP32 firmware bridging an outdoor AS3935 lightning sensor to the shack MQTT broker. Moving the sensor outdoors — 18650 + TP4056 + solar, IP65 enclosure, shade-mounted — recovers the chip's rated ~40 km range that an indoor I²C bus eats. The full AS3935 register surface plus battery-voltage telemetry (vbat_mv on /hb + /status, on-demand query_vbat) is exposed over MQTT, so noise floor, watchdog threshold, TUN_CAP calibration and %SOC are all tunable live from the dashboard without opening the enclosure. WiFiManager captive portal carries WiFi and the shack broker's ACL-scoped iot MQTT credentials — no compiled-in secrets.
ESP32PlatformIOAS3935MQTTLightning18650 + solarVbat telemetryI²C
View repo on GitHub
Active
Utilities & Tools
spe-remote — SPE Expert remote control server
Modern Python 3 remote-control server for SPE Expert HF amplifiers (1.3K-FA / 1.5K-FA / 2K-FA). Runs on a Raspberry Pi over USB serial and serves both a built-in web dashboard and a WebSocket API. Implements the full SPE Application Programmer's Guide Rev 1.1 plus the undocumented RCU command set, so the amplifier's LCD can be mirrored frame-by-frame. Mixed-client broadcast — text JSON for browsers, binary RCU frames for the MacExpert companion app — over the same socket. Threaded reader + async writer survive the USB-serial poll glitches that crash naive serial_asyncio setups. Server-side ballistics: p_out_avg (EMA, ~1 s settle) and p_out_peak (peak-hold, 600 W/s decay) travel alongside raw p_out, so a RAW / AVG / PEAK pill toggle on the shack dashboards reads meaningful values at CW-swing speeds without every client rolling its own filter. Interactive ./configure.sh lists the Pi's /dev/serial/by-id/ aliases for menu pick, walks through the optional Flex block, and preserves saved settings across re-runs; sudo ./install-service.sh --update re-configures and restarts the live systemd unit with a diff preview. Optional flex: config opens a second connection to a FlexRadio 6000-series rig over the SmartSDR TCP API and orchestrates an SM5TOG-style ATU tune plus the full sub-band SWEEP; leave flex.host empty and the server auto-discovers the radio via SmartSDR's UDP broadcast on port 4992. All four UIs (MacExpert, the bundled dashboard, Node-RED /ui, Vue /shack) receive the same tune_event stream. Based on original work by OH2GEK, rewritten and extended.
Python 3WebSocketRaspberry PiUSB serialSPE ExpertRCU protocolSmartSDRTUNE sweep
View repo on GitHub
Active
MacExpert — native SPE Expert control app for macOS
Swift / SwiftUI macOS app that mirrors and controls SPE Expert HF amplifiers over either local USB serial or remote WebSocket (via spe-remote). Two-way live mirror of the amp's LCD using RCU 0x6A frames — every sub-menu (CAT, CONFIG, TEMP/FANS, RX ANT, TUN ANT → PORT, ALARMS LOG, MANUAL TUNE, ANTENNA matrix, YAESU / TEN-TEC pickers, STANDBY banner) tracked with cursor-accurate state. Auto-detects the model (1.3K / 1.5K / 2K) from the status frame, auto-scales the power display to the LOW/MID/HIGH level, and offers tap-to-cycle status chips for STATUS / BAND / ANT / IN / LEVEL / MODE / CAT. SWEEP panel drives spe-remote's tune_band orchestrator over WebSocket — band picker, progress bar, Stop — reading the shared tune_event phase stream. Amp-powered-off banner dims the panel and blanks status chips when the FTDI link stays up but the amp CPU is off. Auto-ranging QRP power meter (5 / 25 / 50 / 100 / 200 W) for STANDBY / TX-bypass drive readings. Universal binary (Apple Silicon + Intel), Developer-ID signed + Apple-notarised; the same release script also packages an ExtensionKit .radioplugin for Amateur Radio Suite. Named after and inspired by the original MacExpert by Georg Isenbürger DJ6GI/NZ1C; RCU protocol reverse-engineered from scratch by VU2CPL.
macOSSwiftSwiftUISPE ExpertRCUUSB serialWebSocketSWEEP panelApple-notarised
View repo on GitHub
Active
LP-700-Server — Telepost LP-700 WebSocket bridge
Go WebSocket bridge for the Telepost LP-500 / LP-700 USB-HID power and SWR meter. Owns the meter's HID handle and fans live telemetry out to many concurrent clients — browsers, phones, logging PCs — while routing control verbs back. Cross-compiles to Linux (amd64 / arm64 / armv7), macOS (Apple Silicon + Intel) and Windows (amd64) via a tag-driven GitHub Actions release workflow; ships a systemd unit and udev rules for headless Raspberry Pi deployment. LAN-only, zero auth. Forked from and tracking the original LP-700-Server by Vinod VU3ESV.
GoWebSocketUSB HIDRaspberry PiLP-700Telepostsystemd
View repo on GitHub
Active
LP-700-App — native macOS client for the LP-700
Native SwiftUI macOS client that talks to LP-700-Server over WebSocket. Live power / SWR / channel / alarm display, full control-verb support, settings persistence, a menu-bar glance-view, and macOS notifications for alarm states. Pairs with LP-700-Server so a single HID-attached meter drives operating positions, logging PCs and phones simultaneously. Forked from and tracking the original LP-700-App by Vinod VU3ESV.
macOSSwiftSwiftUIWebSocketLP-700Telepostmenu-bar
View repo on GitHub
Active
Amateur Radio Suite — macOS plugin host
Single macOS container app that hosts independent amateur-radio control apps as plugins in one window — switchable between a vertical sidebar and horizontal tabs. Each plugin stays in its own repo and ships as a standalone .app; the suite loads it through the RadioPluginKit contract — the host links only the contract, never compiles a plugin in. Plugins are discovered at runtime (browse a catalog or sideload a .radioplugin) and run out-of-process as sandboxed ExtensionKit extensions, so crash isolation is real and adding one never requires rebuilding the suite. Ships with an empty catalog: published plugins today are LP-700, LP-100A, Band Pass Filter and Antenna Switch; SPE amplifier (MacExpert) and SO2R Box are next. Notarized release pipeline, macOS 14+. Original concept and reference implementation by Vinod VU3ESV — upstream at VU3ESV/AmateurRadioSuite.
macOSSwiftSwiftUIExtensionKitPlugin hostRadioPluginKitNotarized
View repo on GitHub
Active
rotator-remote — Rotor-EZ WebSocket gateway
Python WebSocket gateway that owns the Idiom Press Rotor-EZ (Hy-Gain DCU-1 compatible) FTDI serial port on the shack Raspberry Pi and fans azimuth out to any number of clients — Node-RED, a built-in web UI, future Mac apps. The third shack USB device lifted into a gateway service alongside spe-remote and LP-700-Server: same threaded-reader + asyncio-writer pattern, so the serial port has a single owner and clients no longer have to restart Node-RED to free it. Self-contained web UI on port 8090 — large heading readout, click-to-slew compass dial, preset bearings (N/NE/E/SE/S/SW/W/NW), prominent STOP, and LP/+180° long-path. JSON state + heartbeat events over /ws, /healthz endpoint, all writes serialised through one lock so poll queries and client commands never interleave on the wire.
PythonTornadoWebSocketRaspberry PiUSB serialFTDIRotor-EZHy-Gain DCU-1
View repo on GitHub
Active
SO2R Box — macOS controller for the YCCC SO2R Box Plus
Native macOS controller for the YCCC SO2R Box Plus contesting switch. USB-HID to the box; live front-panel mirror in the SwiftUI UI (TX/RX, footswitch, speed pot) using the YCCC HID protocol. Hosts OTRSP and Winkeyer TCP servers, so N1MM+, Win-Test, WriteLog and TR4W see it as a standard SO2R interface. Supports the default 2-radio SO2R mode and the 4-radio SO2R+ mode. Co-developed with Vinod VU3ESV (LB9KJ); the YCCC HID protocol was reverse-engineered from YCCC's own SO2RBox.exe and cross-checked against N4AF's TR4W uYCCCSO2R.pas.
macOSSwiftUSB HIDOTRSPWinkeyerYCCCSO2RContesting
Active
DXCA — DX Cluster Aggregator 2.0
Ground-up Rust rewrite of the DX Cluster Aggregator that runs the whole aggregation stack headless on a Raspberry Pi (equally on macOS/Linux, and since v2.2.0 on Windows) behind a multi-user web GUI. Merges WSJT-X / JTDX / MSHV binary-UDP decoder sources and DX-cluster telnet nodes — honest three-state node status (proven-live vs connected-unproven), login/silence watchdog, reconnect backoff that only resets on proof — into one feed, re-served on a built-in telnet cluster server (port 7575), a UDP fan-out including a verbatim passthrough that keeps RUMlogNG's click-to-fill working, and MQTT publish (structured JSON plus the plain cluster line, on sibling topics) for panadapter overlays. Each account carries its own ClubLog matrix, so different operators see their own highlighting across seventeen alert levels — New DXCC / Band / Mode / Slot for never worked, the matching four for worked-but-unconfirmed, a New and a ? pair each for IOTA, WAS, VUCC and WAZ, and the DX Marathon — and get their own Telegram alerts, with a history of what was actually sent, over the same shared spot stream. A match can be marked on the radio as well as sent to a phone: FlexRadio panadapters over SmartSDR and ExpertSDR3 over TCI, several of each per account. DXCC Challenge points and band×mode slot totals per station, per-band and per-mode entity breakdowns, LoTW uploaders flagged from ARRL's list, and each account's ClubLog log plus the shared LoTW list re-downloaded on a schedule. Five awards beyond DXCC are opt-in per account and add nothing anywhere until ticked — IOTA from a spot's own comment, checked against the directory; WAS from the FCC licence database; VUCC grids on 50 MHz and up; WAZ's forty zones; and the DX Marathon's score for the current year — and which WAS or WAZ you are chasing (mixed, per band, or each mode) is itself a setting, because it changes what wakes you rather than only what is shown. Confirmations ride an optional LoTW QSL-report download, except zones, which score off the QSL flags ClubLog's export already carries. Where a cluster comment omits the mode, it is inferred from an IARU Region 3 band plan and marked as inferred rather than asserted — an unknown mode is never quietly filed as digital. Live WebSocket dashboard on a three-tab shell — Spots, Alerts, Stats — with everything you configure behind a gear: sources, nodes, destinations, MQTT, accounts and a server-wide call blacklist, all edited in the browser with hot-apply. Both spot tables share one fixed, measured column grid, so a column lands in the same place on every row while the stream runs, and each screen's narrowing sits in a collapsible rail that still reports how much it is holding back when folded. An optional band mask recedes bands the sun says are not workable from your Maidenhead square — dim or hide, around a tunable grey-line window, and New DXCC is never masked. Stats shows what the live feed is made of beside your own ClubLog totals, with Club Log's DX Dashboard embedded alongside them and an awards view — WAS endorsements per band and per mode with a Triple Play worklist, zones worked and confirmed, islands, grids and the Marathon year, each with a still needed list. Installs as a systemd service (Pi), a launchd agent (macOS) or — new in v2.2.0 — a boot-started scheduled task on Windows from a prebuilt .exe + installer shipped as a release asset, each through an installer that checks its own prerequisites and then verifies the result is genuinely serving; behavioural parity with the macOS app proven by golden tests against its own artifacts. Supersedes the macOS DX Cluster Aggregator (final release v1.8.4, retained as fallback). Original concept and reference implementation by Vinod VU3ESV; the DX-cluster telnet engine and the web GUI's design system are derived from the Meridian project (joint work with Basil Thomas W6BT and Ram VU3RDD).
RustSvelteRaspberry PiWindowsDX ClusterWSJT-X / JTDXClub LogMulti-userTelegramMQTT
View repo on GitHub
Active
MSHV-Mac — native macOS port of LZ2HV/MSHV
Native macOS port of LZ2HV's MSHV multi-mode weak-signal program (FT8 / FT4 / Q65 / MSK144 / JT9 / JT65 etc.). Apple Silicon and Intel; verified end-to-end against a FlexRadio 6000-series via AetherSDR's TCI bridge for both RX and TX, with WSJT-X-compatible UDP broadcast feeding RUMlogNG's DXSpots window. Self-contained .app bundle: PortAudio audio backend with Float32/Int24/Int16 fallbacks, FlexRadio CommonRadioAudio + DAX support, real host_processor_info CPU sensor, dark theme, app icon, font defaults. User state lives under ~/Library/Application Support/MSHV/ — replace the bundle and callsign, QSOs, logs and WAVs stay put. Developer-ID signed + Apple-notarised, so Gatekeeper passes without the right-click dance. Patches sit on a _MACOS_-conditional macos-port branch on top of upstream main, so Linux and Windows builds remain untouched and new LZ2HV releases merge cleanly.
macOSQt5PortAudioFT8 / FT4MSK144FlexRadioTCIWSJT-X UDP
View repo on GitHub
Active
Meridian — headless multi-platform SDR skimmer server
Headless SDR server in Rust with in-process digital-mode decoders in C (called via FFI) and Rust behind one registry — the successor to and ground-up rewrite of SkimServer Mac. Same station role, now on all four platforms (Linux x86-64, Linux ARM64 / Raspberry Pi, macOS, Windows), each built and tested locally via a fmt / clippy-deny-warnings / full-test / web-UI gate; no hosted CI. Ingests IQ directly from radios — HPSDR / Metis Protocol 1 (Red Pitaya multi-DDC, HermesLite), FlexRadio DAX, RX-888 direct USB — receive-only. Decoders: FT8, FT4, CW (multiple variants running in parallel per receiver — a faithful SkimSrv / kref STFT decoder and W6BT's NX1–NX14 bench decoders), RTTY, WSPR (via wsprd), and an NCDXF beacon watcher. Decoded spots flow through a per-mode refinery and a plugin-based gate to internal + external DX-cluster telnet feeds, PSKR + WSPRnet uploads, and a durable SQLite spot store; external-cluster spots relay back in through the same gate. Every configuration change is applied live across the system — no restarts. Three config layers: bootstrap TOML (bind addrs + which web UI to serve), a system-wide config.json (device / external-cluster / band-plan / calibration inventories), and switchable JSON profiles (operator identity, devices in use, decoders, gate policy, feeds). Ships with a Svelte 5 + TypeScript web UI on port 7374 (i18n en / de, light / dark). RBN upload is deliberately external — a separate rbclient app consumes the byte-stable Aggregator-dialect telnet feed. Deployed as the station daemon on a Raspberry Pi 5 driving the Red Pitaya as VU2CPL-9 (10 bands, 8 RX @ 192 kHz, greyline-masked), with idle release builds also running on Mac, Windows, and the UberSDR box. A joint project, built together with Basil Thomas W6BT (upstream repo owner), Vinod VU3ESV, and Ram VU3RDD.
RustC (FFI)Multi-platformLinuxRaspberry PimacOSWindowsHPSDRRed PitayaHermesLiteRX-888FlexRadio DAXCW skimmerFT8 / FT4WSPRNCDXF beaconPSKRWSPRnetSvelte 5
Active
TimeSync — clock-drift watcher for macOS
Menu-bar macOS app showing system-clock drift against NTP servers and an attached USB GPS, with a one-click "step the clock now" via chrony. Built for digital-mode operators where ~1 s alignment matters and the LAN may not always reach an upstream NTP source. An optional bundled gpsd + chrony stack turns the Mac itself into a stratum-2 NTP server for the rest of the shack; a small privileged helper daemon lets the app talk to chrony without sudo each time.
macOSSwiftSwiftUINTPGPSchronygpsdmenu-bar
View repo on GitHub
Active
KST2Mac — native ON4KST chat client for macOS
Native macOS client for the ON4KST chats — the DX-liaison chats VHF, UHF and microwave operators keep open beside the radio during a lift or a contest. Any number of rooms at once, each pane holding its own login, room picker, station list and message box, and each able to be torn out into its own window without dropping its connection. Station list carries name, locator, and QRB/QTF worked from your own square, with away stations marked. Message traffic is coloured by what it is: a stable per-callsign hue that reads the same in the log and the table, and KST2Me's own highlight conventions for /CQ, preamble and watched callsigns, so an operator who knows one client can read the other. Grid squares and frequencies are picked out inside message text. Alert sounds fire whether or not the app is in front — the case a notification banner cannot cover — and mentions raise a banner when it is not. A built-in DX-cluster node re-serves the chat's spots on a LAN port, so DXCA or any cluster client dials it as one more node and receives them verbatim, unparsed. The whole telnet protocol was reverse-engineered from packet captures of the live service rather than from documentation, which turned out to be wrong about the room list, the timestamp format, the command rate limit and more; docs/PROTOCOL.md in the repo records what is captured versus what is still inferred. Universal binary (Apple Silicon + Intel), Developer-ID signed and Apple-notarised. Named after and modelled on KST2Me by Bo OZ2M, the long-standing Windows client; the protocol work here is original, but the interaction design and the highlight conventions follow OZ2M's manual.
macOSSwiftSwiftUION4KSTVHF / UHFDX clustertelnetNotarised
Download v1.0.0 for macOS → View repo on GitHub
Active
NanoVNASaver — packaged macOS .app
Self-contained NanoVNASaver v0.7.3 .app bundle for Apple Silicon. Upstream NanoVNASaver only ships Windows and Raspberry Pi binaries, so this build wraps a Python 3.12 virtual-environment with PySide6 / Qt and the NanoVNASaver package, behind a small bash launcher in Contents/MacOS/. Slimmed from ~1.3 GB to 253 MB by stripping unused Qt frameworks, qml, translations, metatypes, and lipo-thinning every Mach-O binary to arm64. A macOS UI sizing patch relaxes upstream's hard-coded setFixedHeight/Width calls so Qt stops clipping label text on native macOS control chrome (50kHz50kH, SweepSweer, RescanRescar). Ships with a hand-drawn 1024 px macOS-style .icns (rounded square + Smith-chart logo) in place of the upstream 128 px fallback. Logs to ~/Library/Logs/NanoVNASaver/nanovnasaver.log for easy support.
macOS.app bundlePySide6 / QtApple SiliconNanoVNAVNA
View repo on GitHub
Active
WebSDR — live RX-888 receiver on an LZ1AQ active loop
Public web-based SDR receiver running on a self-hosted UberSDR instance — drag-tune the HF spectrum waterfall in the browser, switch between LSB / USB / CW / AM / FM / digital modes, adjust the filter, zoom the waterfall, and listen to the off-air audio with no install. The default deep-link below opens at 7.150 MHz LSB so you land mid-40m phone band ready to listen. Hardware is an RX-888 MkII front-end fed by an LZ1AQ wideband active loop (0–30 MHz HF coverage); reachable via UberSDR's zero-config tunnel at vu2cpl.tunnel.ubersdr.org. UberSDR by M9PSY (madpsy), built on Phil Karn KA9Q's ka9q-radio engine; the receive antenna is Chavdar Levkov LZ1AQ's active loop design.
WebSDRRX-888 MkIILZ1AQ active loopUberSDRka9q-radioHF 0–30 MHzLive receiverSelf-hosted
Open live WebSDR →
Active
VU DXCC Credits Tracker
Live, sortable tables of DXCC standings for every Indian (VU / AT / AU) callsign, from two data sources on one page. The LoTW tab parses all 17 ARRL DXCC Standings PDFs each month — Mixed / Phone / CW / Digital / Satellite / bands 160 m to 6 m / Challenge / Honor Roll. The Clublog tab scrapes the Asia Top-2000 Confirmed league every day and pulls out Indian prefixes. Both tabs share the same layout: green highlight for column leaders, red for changes since the last snapshot, click-through to QRZ.com on every callsign. Table layout adapted from the original VU DXCC list template by VU2DCC.
PythonpdfplumberreportlabGitHub ActionsARRL DXCCClublog
View live page →
Active

05 · Writings & Field Reports

Articles & Contest Reports

Top Band
0–100 on 160m
My journey exploring the Gentleman's band from scratch — inverted L antenna, hairpin matching, beverage antennas, and chasing 100 DXCC on 160m from Zone 22.
102 countries worked 29 CQ zones 1,622 QSOs
Jan 2019 ↓ PDF
DXpedition
VU7MS — Lakshadweep DXpedition
Writeup of the VU7MS DXpedition to Kavaratti Island, Lakshadweep. Operations on HF with cubical quad and wire antennas from one of India's rarest DXCC entities.
2016 ↓ PDF
DXpedition
VU7T — A Sequel to VU7MS
The follow-up DXpedition to Kavaratti Island, Lakshadweep in October 2017. Expanded operations including first steps towards 160m activation from this rare entity.
Oct 2017 ↓ PDF
Contest Report
AT3N — ARSI Hilltop Contest 2024
Field report from team AT3N operating from Nelliyampathy, Kerala at 1,380m ASL. Multi-band HF/VHF/UHF operation — 4,417 QSOs, 261 DXCC entities, Category C winners.
4,417 QSOs 261 DXCC
Jan 2024 ↓ PDF
Contest Report
ARSI Hilltop Contest 2025
Report from Vayalada Hills, Kozhikode (MK71WM). Smaller team, new location. 160m Inverted L and 90m reversible Beverage installed. Experimenting with 10m delta loop and CQ160 contest entries.
763 QSOs 148 DXCC
Jan 2025 ↓ PDF
Technical
Interfacing the PA2500 with Modern Radios
How to interface the Furuno PA2500 linear amplifier with modern transceivers — Arduino band decoder customisation, direct LPF switching, ALC polarity conversion using LT7660, and automated 4:1 antenna switching.
2015 ↓ PDF

06 · Contact

Get in Touch

Location
Tarabanahalli, Chikkajala PO
Bengaluru, KA 562157

For sked requests, email via QRZ or WhatsApp. For QSL, use LOTW or Clublog OQRS — no bureau. 73 de VU2CPL.

Message sent! I'll get back to you soon. 73