Files
OpsLog/internal/sat/birds.json
T
rouggyandClaude Opus 5 86fd03fd6b feat(sat): generate the frequency plan, and join on the catalog number
25 satellites, typed by hand and never revisited. Eight of them were the
first-generation Tevel constellation, which re-entered in 2024; four more had
come down too; and the nine Tevel-2 satellites that replaced them, the Chinese
space station, AO-27, AO-123 and twenty others were simply absent. So: 44
satellites now, and a generator instead of a memory.

cmd/satgen joins three public sources on the NORAD catalog number — Celestrak's
amateur group and PE0SAT's mirror for which birds OpsLog can actually get
elements for, and SatNOGS DB for the transmitters. It is a one-shot tool, run by
hand, the same arrangement as cmd/cntygen, and it is deliberately conservative:

  - It never destroys a curated entry. The hand-written plans hold things
    SatNOGS does not reliably carry — a CTCSS tone, the QO-100 passband as
    operators describe it — so an existing bird keeps its data and only gains
    its catalog number.
  - It prunes on the re-entry date, which is a fact SatNOGS publishes rather
    than a judgement about which of the missing satellites are missing for good.
  - It refuses a digital uplink that does not say what it is. A GMSK uplink is a
    command channel far more often than a digipeater, and shipping the wrong one
    invites somebody to transmit on a control frequency. An analog uplink with
    both ends is a contact by construction, which is what catches the repeaters
    that describe themselves only as "Mode V/U FM".
  - Its output is deterministic. One satellite can hold two catalog entries —
    GreenCube is 53106 in one feed and 53109 in the other — and iterating a map
    picked a different one each run.

A bird now carries its NORAD number, and that is how its elements are found.
Names were the only join before, and they are written differently by every party
involved: "TIANYAN 01" and "TO-108" are one satellite that had never once met,
so TO-108 tracked nothing at all.

And the plan now reaches a station that has already run OpsLog. The editable
copy was written on the first launch and was the operator's list for ever after,
so a release adding nine satellites reached nobody who had opened the tab. It is
merged on each load instead: a satellite they already have is untouched, edits
and corrections included, and only the ones they have never seen are added.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
2026-09-09 11:20:22 +02:00

707 lines
13 KiB
JSON

[
{
"name": "AO-123",
"norad": 61781,
"aliases": [
"ASRTU-1 (AO-123)"
],
"transponders": [
{
"label": "Mode V/U - FM Transceiver",
"mode": "FM",
"down_lo": 435400000,
"up_lo": 145850000
}
]
},
{
"name": "AO-27",
"norad": 22825,
"aliases": [
"EYESAT A (AO-27)"
],
"transponders": [
{
"label": "Mode V/U FM",
"mode": "FM",
"down_lo": 436795000,
"up_lo": 145850000
}
]
},
{
"name": "AO-7",
"norad": 7530,
"aliases": [
"AMSAT-OSCAR 7",
"OSCAR 7"
],
"transponders": [
{
"label": "Mode B linear (inverting)",
"mode": "SSB",
"down_lo": 145925000,
"down_hi": 145975000,
"up_lo": 432125000,
"up_hi": 432175000,
"inverting": true
},
{
"label": "Mode A linear",
"mode": "SSB",
"down_lo": 29400000,
"down_hi": 29500000,
"up_lo": 145850000,
"up_hi": 145950000
}
]
},
{
"name": "AO-73",
"norad": 39444,
"aliases": [
"FUNCUBE-1",
"FUNCUBE 1"
],
"transponders": [
{
"label": "Linear (inverting)",
"mode": "SSB",
"down_lo": 145950000,
"down_hi": 145970000,
"up_lo": 435130000,
"up_hi": 435150000,
"inverting": true
}
]
},
{
"name": "AO-91",
"norad": 43017,
"aliases": [
"RADFXSAT",
"FOX-1B",
"RADFXSAT (FOX-1B)"
],
"transponders": [
{
"label": "FM voice repeater",
"mode": "FM",
"down_lo": 145960000,
"up_lo": 435250000,
"ctcss": 67
}
]
},
{
"name": "BEESAT-1",
"norad": 35933,
"transponders": [
{
"label": "Digipeater (Mobitex, idle mode: 10 sec interval)",
"mode": "DATA",
"down_lo": 435950000,
"up_lo": 435950000
}
]
},
{
"name": "CO-65",
"norad": 32785,
"aliases": [
"CUTE-1.7+APD II (CO-65)"
],
"transponders": [
{
"label": "Mode L/U Digipeater",
"mode": "DATA",
"down_lo": 437475000,
"up_lo": 1267600000
}
]
},
{
"name": "CROCUBE",
"norad": 62394,
"transponders": [
{
"label": "Mode U/U - GFSK9k6 - Digipeater - AX.25",
"mode": "DATA",
"down_lo": 436775000,
"up_lo": 436775000
}
]
},
{
"name": "CSS",
"norad": 48274,
"transponders": [
{
"label": "3A V/V digipeater AFSK-FM 1200",
"mode": "DATA",
"down_lo": 145825000,
"up_lo": 145825000
},
{
"label": "1A V/V crew voice NFM",
"mode": "FM",
"down_lo": 145985000,
"up_lo": 145850000
},
{
"label": "2B U/V FM repeater NFM",
"mode": "FM",
"down_lo": 145985000,
"up_lo": 435075000
},
{
"label": "4A V/V imaging SSTV-FM",
"mode": "FM",
"down_lo": 145985000,
"up_lo": 145850000
},
{
"label": "1B U/U crew voice NFM",
"mode": "FM",
"down_lo": 436510000,
"up_lo": 435050000
},
{
"label": "2A V/U FM repeater NFM",
"mode": "FM",
"down_lo": 436510000,
"up_lo": 145875000
},
{
"label": "4B U/U imaging SSTV-FM",
"mode": "FM",
"down_lo": 436510000,
"up_lo": 435050000
},
{
"label": "3B U/U digipeater AFSK-FM 1200",
"mode": "DATA",
"down_lo": 437550000,
"up_lo": 437550000
}
]
},
{
"name": "ESEO",
"norad": 43792,
"transponders": [
{
"label": "FM",
"mode": "FM",
"down_lo": 145895000,
"up_lo": 1263500000
}
]
},
{
"name": "FLORIPASAT-1",
"norad": 44885,
"transponders": [
{
"label": "Mode U/U GFSK2k4 Repeater",
"mode": "DATA",
"down_lo": 436100000,
"up_lo": 436100000
}
]
},
{
"name": "FO-29",
"norad": 24278,
"aliases": [
"JAS-2",
"FUJI-OSCAR 29"
],
"transponders": [
{
"label": "Linear (inverting)",
"mode": "SSB",
"down_lo": 435800000,
"down_hi": 435900000,
"up_lo": 145900000,
"up_hi": 146000000,
"inverting": true
}
]
},
{
"name": "FORESAIL-1P",
"norad": 66778,
"transponders": [
{
"label": "Mode U/U - GMSK9k6 - Digipeater - Skylink",
"mode": "DATA",
"down_lo": 437125000,
"up_lo": 437125000
}
]
},
{
"name": "GRBBETA",
"norad": 60237,
"transponders": [
{
"label": "Mode V/V - GFSK9k6 - Digipeater - AX.25",
"mode": "DATA",
"down_lo": 145935000,
"up_lo": 145935000
},
{
"label": "Mode U/U - GFSK9k6 - Digipeater - AX.25",
"mode": "DATA",
"down_lo": 436785000,
"up_lo": 436785000
}
]
},
{
"name": "IO-117",
"norad": 53109,
"aliases": [
"GREENCUBE",
"MEZTLI"
],
"transponders": [
{
"label": "Digipeater (1200 bd GMSK)",
"mode": "DATA",
"down_lo": 435310000,
"up_lo": 435310000
}
]
},
{
"name": "IO-86",
"norad": 40931,
"aliases": [
"LAPAN-A2",
"LAPAN-ORARI"
],
"transponders": [
{
"label": "FM voice repeater",
"mode": "FM",
"down_lo": 435880000,
"up_lo": 145880000,
"ctcss": 88.5
}
]
},
{
"name": "ISAT",
"norad": 43879,
"transponders": [
{
"label": "MODE U/U DSTAR VOICE",
"mode": "FM",
"down_lo": 435525000,
"up_lo": 437325000
}
]
},
{
"name": "ISS (ZARYA)",
"norad": 25544,
"aliases": [
"ISS",
"ZARYA",
"ARISS"
],
"transponders": [
{
"label": "FM voice repeater",
"mode": "FM",
"down_lo": 437800000,
"up_lo": 145990000,
"ctcss": 67
},
{
"label": "APRS digipeater",
"mode": "DATA",
"down_lo": 145825000,
"up_lo": 145825000
},
{
"label": "SSTV",
"mode": "FM",
"down_lo": 145800000
}
]
},
{
"name": "JO-97",
"norad": 43803,
"aliases": [
"JY1SAT",
"JY1-SAT"
],
"transponders": [
{
"label": "Linear (inverting)",
"mode": "SSB",
"down_lo": 145855000,
"down_hi": 145875000,
"up_lo": 435100000,
"up_hi": 435120000,
"inverting": true
}
]
},
{
"name": "KNACKSAT-2",
"norad": 67683,
"transponders": [
{
"label": "Mode V/V - FSK9k6 - Digipeater - AX.25 G3RUH",
"mode": "DATA",
"down_lo": 145825000,
"up_lo": 145825000
}
]
},
{
"name": "KOSEN-1",
"norad": 49402,
"transponders": [
{
"label": "Mode HF/U - Onboard SDR",
"mode": "DATA",
"down_lo": 435525000,
"up_lo": 21125000,
"up_hi": 21150000
}
]
},
{
"name": "LASARSAT",
"norad": 62391,
"transponders": [
{
"label": "Mode U/U - GFSK9k6 - Digipeater - AX.25",
"mode": "DATA",
"down_lo": 436925000,
"up_lo": 436925000
}
]
},
{
"name": "LILACSAT-2",
"norad": 40908,
"transponders": [
{
"label": "APRS Digipeater",
"mode": "DATA",
"down_lo": 144390000,
"up_lo": 144390000
}
]
},
{
"name": "NO-44",
"norad": 26931,
"aliases": [
"PCSAT (NO-44)"
],
"transponders": [
{
"label": "Mode V/V APRS AFSK",
"mode": "DATA",
"down_lo": 145825000,
"up_lo": 145825000
}
]
},
{
"name": "PO-101",
"norad": 43678,
"aliases": [
"DIWATA-2",
"DIWATA-2B"
],
"transponders": [
{
"label": "FM voice repeater (scheduled)",
"mode": "FM",
"down_lo": 145900000,
"up_lo": 437500000,
"ctcss": 141.3
}
]
},
{
"name": "QB50P1",
"norad": 40025,
"transponders": [
{
"label": "Linear Transponder",
"mode": "SSB",
"down_lo": 145935000,
"down_hi": 145965000,
"up_lo": 435047000,
"up_hi": 435077000,
"inverting": true
}
]
},
{
"name": "QMR-KWT-2",
"norad": 67291,
"transponders": [
{
"label": "V/U FM Transponder CTCSS 67.0 Hz",
"mode": "FM",
"down_lo": 436950000,
"up_lo": 145920000,
"ctcss": 67
}
]
},
{
"name": "QO-100",
"norad": 43700,
"aliases": [
"ES'HAIL 2",
"ESHAIL 2",
"ES'HAIL-2"
],
"geostationary": true,
"transponders": [
{
"label": "Narrowband linear",
"mode": "SSB",
"down_lo": 10489550000,
"down_hi": 10489800000,
"up_lo": 2400050000,
"up_hi": 2400300000
},
{
"label": "Wideband (DATV)",
"mode": "DATA",
"down_lo": 10491000000,
"down_hi": 10499000000,
"up_lo": 2401500000,
"up_hi": 2409500000
}
]
},
{
"name": "RS-44",
"norad": 44909,
"aliases": [
"DOSAAF-85"
],
"transponders": [
{
"label": "Linear (inverting)",
"mode": "SSB",
"down_lo": 435640000,
"down_hi": 435680000,
"up_lo": 145965000,
"up_hi": 146005000,
"inverting": true
}
]
},
{
"name": "SO-50",
"norad": 27607,
"aliases": [
"SAUDISAT 1C",
"SAUDISAT 1C (SO-50)"
],
"transponders": [
{
"label": "FM voice repeater",
"mode": "FM",
"down_lo": 436795000,
"up_lo": 145850000,
"ctcss": 67
}
]
},
{
"name": "SONATE-2",
"norad": 59112,
"transponders": [
{
"label": "Mode V/V - APRS digipeater",
"mode": "DATA",
"down_lo": 145825000,
"up_lo": 145825000
}
]
},
{
"name": "TAURUS-1",
"norad": 44530,
"transponders": [
{
"label": "Mode V/U FM 67.0 PL",
"mode": "FM",
"down_lo": 436760000,
"up_lo": 145820000,
"ctcss": 67
}
]
},
{
"name": "TEVEL2-1",
"norad": 63217,
"transponders": [
{
"label": "Mode V/U - FM Transponder",
"mode": "FM",
"down_lo": 436400000,
"up_lo": 145970000
}
]
},
{
"name": "TEVEL2-2",
"norad": 63219,
"transponders": [
{
"label": "Mode V/U - FM Transponder - Beacon",
"mode": "FM",
"down_lo": 436400000,
"up_lo": 145970000
}
]
},
{
"name": "TEVEL2-3",
"norad": 63218,
"transponders": [
{
"label": "Mode V/U - FM Transponder",
"mode": "FM",
"down_lo": 436400000,
"up_lo": 145970000
}
]
},
{
"name": "TEVEL2-4",
"norad": 63213,
"transponders": [
{
"label": "Mode V/U - FM Transponder",
"mode": "FM",
"down_lo": 436400000,
"up_lo": 145970000
}
]
},
{
"name": "TEVEL2-5",
"norad": 63214,
"transponders": [
{
"label": "Mode V/U - FM Transponder",
"mode": "FM",
"down_lo": 436400000,
"up_lo": 145970000
}
]
},
{
"name": "TEVEL2-6",
"norad": 63215,
"transponders": [
{
"label": "Mode V/U - FM Transponder",
"mode": "FM",
"down_lo": 436400000,
"up_lo": 145970000
}
]
},
{
"name": "TEVEL2-7",
"norad": 63238,
"transponders": [
{
"label": "Mode V/U - FM Transponder",
"mode": "FM",
"down_lo": 436400000,
"up_lo": 145970000
}
]
},
{
"name": "TEVEL2-8",
"norad": 63239,
"transponders": [
{
"label": "Mode V/U - FM Transponder - Beacon",
"mode": "FM",
"down_lo": 436400000,
"up_lo": 145970000
}
]
},
{
"name": "TEVEL2-9",
"norad": 63237,
"transponders": [
{
"label": "Mode V/U - FM Transponder",
"mode": "FM",
"down_lo": 436400000,
"up_lo": 145970000
}
]
},
{
"name": "TO-108",
"norad": 44881,
"aliases": [
"CAS-6",
"TIANQIN-1"
],
"transponders": [
{
"label": "Linear (inverting)",
"mode": "SSB",
"down_lo": 145915000,
"down_hi": 145935000,
"up_lo": 435270000,
"up_hi": 435290000,
"inverting": true
}
]
},
{
"name": "UKUBE-1",
"norad": 40074,
"transponders": [
{
"label": "Inverting linear transponder",
"mode": "SSB",
"down_lo": 145930000,
"down_hi": 145950000,
"up_lo": 435074300,
"up_hi": 435094300,
"inverting": true
}
]
},
{
"name": "XIWANG-1 (HOPE-1)",
"norad": 36122,
"transponders": [
{
"label": "Mode V/U FM",
"mode": "FM",
"down_lo": 435675000,
"up_lo": 145825000
}
]
}
]