summaryrefslogtreecommitdiff
path: root/share
diff options
context:
space:
mode:
authorinfo@mode42.com <info@mode42.com>2026-08-07 18:23:28 +0000
committerinfo@mode42.com <info@mode42.com>2026-08-07 18:23:28 +0000
commitfa05a5f8238e9e1417235711656e5062ccc843a7 (patch)
tree46fbbd18de54492b59307c16efcc7f3152723238 /share
Initial push
Diffstat (limited to 'share')
-rw-r--r--share/clients/README.md79
-rw-r--r--share/clients/baycom-kiss.yaml46
-rw-r--r--share/clients/index.yaml39
-rw-r--r--share/clients/kiss-serial-rs232.yaml55
-rw-r--r--share/clients/kiss-serial-usb.yaml57
-rw-r--r--share/clients/pktnc2.yaml54
-rw-r--r--share/clients/soft-crdop.yaml66
-rw-r--r--share/clients/tmodem.yaml42
-rw-r--r--share/clients/tnc2c.yaml53
-rw-r--r--share/hybbx/README.md7
-rw-r--r--share/hybbx/baycom-kiss-host.ini.example38
-rw-r--r--share/hybbx/crdop-host.ini.example17
-rw-r--r--share/hybbx/pktnc2-host.ini.example28
-rw-r--r--share/hybbx/service-dual.ini.example37
-rw-r--r--share/hybbx/tnc2c-host.ini.example38
-rw-r--r--share/max25-bcpr/max25-bcpr.freebsd.ini.example34
-rw-r--r--share/max25-bcpr/max25-bcpr.ini.example44
-rw-r--r--share/max25/max25d.ini.example46
-rw-r--r--share/max25/max25d.lite.bcpr.ini.example42
-rw-r--r--share/max25/max25d.lite.crdop.ini.example40
-rw-r--r--share/max25/max25d.lite.ini.example44
-rw-r--r--share/max25/max25d.service.example13
-rw-r--r--share/max25/serial/README.md22
-rw-r--r--share/max25/serial/pccom-kiss-serial.env.example9
-rw-r--r--share/max25/serial/pktnc2-serial.env.example5
-rw-r--r--share/max25/serial/tnc2c-serial.env.example8
-rw-r--r--share/systemd/README.md9
-rw-r--r--share/systemd/max25d.service32
28 files changed, 1004 insertions, 0 deletions
diff --git a/share/clients/README.md b/share/clients/README.md
new file mode 100644
index 0000000..0a2bfc7
--- /dev/null
+++ b/share/clients/README.md
@@ -0,0 +1,79 @@
+# Terminal client profiles (YAML)
+
+Per-modem **max25-terminal** profiles for devices that need settings beyond a BayCom/based **bcpr** or TNC env catalog.
+
+| Who reads this | Purpose |
+|----------------|---------|
+| **max25-terminal** | Connection target, default `SET DEVICE`, session IDs, UI pacing |
+| **Operator** | `max25-terminal -U /run/max25/modem.sock` — device from max25d `[devices] default`, or `-d <id>` / F10→7 / `SET DEVICE` (id from YAML `device.id`) |
+| **max25d** | **Not** loaded from here — use `max25d.ini`, `bcpr.ini`, or env files |
+
+## BayCom/based (bcpr) — client YAML as operator reference
+
+SER12 PC-COM class hardware runs via **bcpr** (`stacks/max25-bcpr/`), not a kernel driver. Configure `bcpr.ini` / max25d `[features] max25_bcpr=yes` and device **`max25e0`** (`max25e0 = max25-bcpr:bc0`). No separate client YAML is required — use max25d default or `SET DEVICE max25e0`.
+
+Terminal clients attach to **max25d** after `max25-bcprd` / max25d bring-up. See [../../stacks/max25-bcpr/README.md](../../stacks/max25-bcpr/README.md).
+
+Registry of all catalog IDs (with and without client YAML): [`index.yaml`](index.yaml).
+
+## Schema (`schema_version: 1`)
+
+```yaml
+schema_version: 1
+id: tnc2c # max25d device id or catalog id
+label: Human name
+type: client-profile # client-profile | catalog-only
+
+connection: # terminal → max25d (never raw serial)
+ host: 127.0.0.1
+ port: 7325
+ unix_socket: /run/max25/modem.sock
+
+device: # M25/1 SET DEVICE on connect
+ id: tnc2c
+ hardware: tncs
+
+session: # optional defaults (SET CALLERID / CALLID / AX25_UI)
+ callerid: CB-0
+ callid: QST
+ ax25_ui: true
+
+terminal: # HyBBX-aligned UI
+ pacing_baud: 2400
+ line_width: 80
+ payload_max: 256
+
+max25d: # pointers for daemon/site config (informational)
+ ini_example: share/max25/max25d.ini.example
+ device_section: serial.tnc2c
+ env_file: stacks/tncs/tnc2c-serial.env
+ boot_wait: stacks/tncs/tnc2c-boot-wait.sh
+
+serial: # max25d-owned serial (client does not open)
+ default_device: /dev/ttyS4
+ baud: 19200
+ line: 8n1
+ dtr_rts: true
+ kiss_entry: kiss_on
+```
+
+KISS-async and CRDOP profiles use `serial:` or `crdop:` instead of BayCom catalog fields.
+
+## Files
+
+| File | Modem / device |
+|------|----------------|
+| [`tnc2c.yaml`](tnc2c.yaml) | Landolt TNC2C |
+| (none — use `max25e0`) | BayCom/based SER12 via max25-bcpr (PC-COM) |
+| [`pktnc2.yaml`](pktnc2.yaml) | PK-TNC2 / TNC-2 (TheFirmware)
+| [`kiss-serial-usb.yaml`](kiss-serial-usb.yaml) | KISS on USB (`modems.ini` catalog) |
+| [`kiss-serial-rs232.yaml`](kiss-serial-rs232.yaml) | KISS on RS-232 |
+| [`baycom-kiss.yaml`](baycom-kiss.yaml) | MAX25 device plugin (USB KISS) |
+| [`soft-crdop.yaml`](soft-crdop.yaml) | CRDOP sound-card modem |
+| [`index.yaml`](index.yaml) | Full modem database map |
+
+## See also
+
+- [../../include/max25/protocol.md](../../include/max25/protocol.md) — M25/1 protocol
+- [../../stacks/terminal/README.md](../../stacks/terminal/README.md) — operator UI
+- [stacks/max25-bcpr/share/max25-bcpr.ini.example](../../stacks/max25-bcpr/share/max25-bcpr.ini.example) — bcpr INI example
diff --git a/share/clients/baycom-kiss.yaml b/share/clients/baycom-kiss.yaml
new file mode 100644
index 0000000..b849c2a
--- /dev/null
+++ b/share/clients/baycom-kiss.yaml
@@ -0,0 +1,46 @@
+schema_version: 1
+id: baycom-kiss
+label: BayCom KISS Serial (MAX25 device)
+type: client-profile
+status: scaffold
+
+connection:
+ host: 127.0.0.1
+ port: 7325
+ unix_socket: /run/max25/modem.sock
+ tcp_only: false
+
+device:
+ id: baycom-kiss
+ hardware: modems
+
+session:
+ callerid: CB-0
+ callid: QST
+ ax25_ui: true
+
+terminal:
+ pacing_baud: 2400
+ line_width: 80
+ payload_max: 256
+
+max25d:
+ ini_example: share/max25/max25d.ini.example
+ devices_key: baycom-kiss
+ backend: kiss-raw-serial
+
+serial:
+ default_device: /dev/ttyUSB0
+ baud: 9600
+ line: 8n1
+ dtr_rts: false
+
+catalog_profiles:
+ - share/clients/kiss-serial-usb.yaml
+ - share/clients/kiss-serial-rs232.yaml
+
+docs:
+ - plugins/devices/baycom-kiss/plugin.yaml
+ - stacks/baycom-pr/docs/GETTING-STARTED.md
+
+notes: Device plugin wrapper — pick USB or RS-232 catalog profile above.
diff --git a/share/clients/index.yaml b/share/clients/index.yaml
new file mode 100644
index 0000000..099269f
--- /dev/null
+++ b/share/clients/index.yaml
@@ -0,0 +1,39 @@
+# MAX25 client profile registry
+# Maps MAX25 device plugins to terminal client configs.
+# Kernel baycom-pr / modems.ini catalog removed 2026-07-18 — SER12 product path is bcpr.
+
+schema_version: 1
+plugin_registry: plugins/manifest.yaml
+
+devices:
+ - id: tnc2c
+ label: Landolt TNC2C
+ hardware: tncs
+ client_config: share/clients/tnc2c.yaml
+ status: active
+
+ - id: pktnc2
+ label: PK-TNC2 / TNC-2 (TheFirmware)
+ hardware: tncs
+ client_config: share/clients/pktnc2.yaml
+ status: planned
+
+ - id: baycom-kiss
+ label: BayCom KISS serial (USB/async)
+ hardware: modems
+ client_config: share/clients/baycom-kiss.yaml
+ status: active
+
+ - id: tmodem
+ label: T-Modem-c1224 USB KISS half-TNC
+ hardware: tncs
+ client_config: share/clients/tmodem.yaml
+ status: prototype
+
+ - id: soft-crdop
+ label: CRDOP sound-card modem
+ hardware: soft-modems
+ client_config: share/clients/soft-crdop.yaml
+ status: active
+
+# BayCom/based SER12: configure max25d max25e0 / max25e0:bc1 — no separate client YAML required.
diff --git a/share/clients/kiss-serial-rs232.yaml b/share/clients/kiss-serial-rs232.yaml
new file mode 100644
index 0000000..6a22148
--- /dev/null
+++ b/share/clients/kiss-serial-rs232.yaml
@@ -0,0 +1,55 @@
+schema_version: 1
+id: kiss-serial-rs232
+label: KISS modem on RS-232 serial
+type: client-profile
+catalog: kiss-serial-rs232
+status: active
+
+connection:
+ host: 127.0.0.1
+ port: 7325
+ unix_socket: /run/max25/modem.sock
+ tcp_only: false
+
+device:
+ id: baycom-kiss
+ hardware: modems
+
+session:
+ callerid: CB-0
+ callid: QST
+ ax25_ui: true
+
+terminal:
+ pacing_baud: 2400
+ line_width: 80
+ payload_max: 256
+
+max25d:
+ ini_example: share/max25/max25d.ini.example
+ device_section: serial.baycom-kiss
+ backend: kiss-raw-serial
+ baycom_pr:
+ catalog: kiss-serial-rs232
+ kiss_link: /var/run/baycom-pr/kiss
+
+serial:
+ default_device: /dev/ttyS1
+ baud: 9600
+ line: 8n1
+ dtr_rts: false
+ kiss_entry: none
+
+rf:
+ radio_baud: 1200
+
+hybbx:
+ plugin: baycom
+ backend: kiss
+
+docs:
+ - stacks/baycom-pr/config/modems.ini
+
+notes: |
+ TNC2, OpenTracker, KISS firmware on RS-232 or USB-serial adapter.
+ Self-powered TNC preferred; port-powered units need adequate TXD/DTR current.
diff --git a/share/clients/kiss-serial-usb.yaml b/share/clients/kiss-serial-usb.yaml
new file mode 100644
index 0000000..120bb36
--- /dev/null
+++ b/share/clients/kiss-serial-usb.yaml
@@ -0,0 +1,57 @@
+schema_version: 1
+id: kiss-serial-usb
+label: KISS modem on USB (ttyUSB / ttyACM)
+type: client-profile
+catalog: kiss-serial-usb
+status: active
+
+connection:
+ host: 127.0.0.1
+ port: 7325
+ unix_socket: /run/max25/modem.sock
+ tcp_only: false
+
+device:
+ id: baycom-kiss
+ hardware: modems
+
+session:
+ callerid: CB-0
+ callid: QST
+ ax25_ui: true
+
+terminal:
+ pacing_baud: 2400
+ line_width: 80
+ payload_max: 256
+
+max25d:
+ ini_example: share/max25/max25d.ini.example
+ device_section: serial.baycom-kiss
+ backend: kiss-raw-serial
+ baycom_pr:
+ catalog: kiss-serial-usb
+ kiss_link: /var/run/baycom-pr/kiss
+
+serial:
+ default_device: /dev/ttyUSB0
+ baud: 9600
+ line: 8n1
+ dtr_rts: false
+ kiss_entry: none
+
+rf:
+ radio_baud: 1200
+
+hybbx:
+ plugin: baycom
+ backend: kiss
+
+docs:
+ - stacks/baycom-pr/config/modems.ini
+ - stacks/baycom-pr/docs/GETTING-STARTED.md
+
+notes: |
+ No kernel baycom_ser_fdx — async USB serial KISS.
+ max25d or baycom-pr kiss bridge owns the USB device; terminal uses M25/1 only.
+ Adapter must supply stable USB power (see stacks/baycom-pr/docs/archive/HARDWARE.md).
diff --git a/share/clients/pktnc2.yaml b/share/clients/pktnc2.yaml
new file mode 100644
index 0000000..bf97834
--- /dev/null
+++ b/share/clients/pktnc2.yaml
@@ -0,0 +1,54 @@
+schema_version: 1
+id: pktnc2
+label: PK-TNC2 / TNC-2 (TheFirmware)
+type: client-profile
+status: planned
+
+connection:
+ host: 127.0.0.1
+ port: 7325
+ unix_socket: /run/max25/modem.sock
+ tcp_only: false
+
+device:
+ id: pktnc2
+ hardware: tncs
+
+session:
+ callerid: CB-0
+ callid: QST
+ ax25_ui: true
+
+terminal:
+ pacing_baud: 2400
+ line_width: 80
+ payload_max: 256
+
+max25d:
+ ini_example: share/max25/max25d.ini.example
+ device_section: serial.pktnc2
+ env_file: stacks/tncs/pktnc2-serial.env
+ boot_wait: stacks/tncs/pktnc2-boot-wait.sh
+
+serial:
+ default_device: /dev/ttyS5
+ baud: 9600
+ line: 8n1
+ dtr_rts: false
+ kiss_entry: auto
+
+rf:
+ radio_baud: 1200
+ band: cb
+
+hybbx:
+ ini_example: share/hybbx/pktnc2-host.ini.example
+ plugin: packet_radio
+ profile: tnc2
+ aliases: [pktnc2, pk-tnc2, tapr, thefirmware]
+
+docs:
+ - stacks/tncs/docs/TNC2C-REFERENCE.md
+ - plugins/devices/pktnc2/plugin.yaml
+
+notes: Probe serial port after hardware inventory — adjust default_device in local env.
diff --git a/share/clients/soft-crdop.yaml b/share/clients/soft-crdop.yaml
new file mode 100644
index 0000000..81ae5a2
--- /dev/null
+++ b/share/clients/soft-crdop.yaml
@@ -0,0 +1,66 @@
+schema_version: 1
+id: soft-crdop
+label: MAX25-SoftModem (CRDOP)
+type: client-profile
+status: active
+
+connection:
+ host: 127.0.0.1
+ port: 7325
+ unix_socket: /run/max25/modem.sock
+ tcp_only: false
+
+device:
+ id: soft-crdop
+ hardware: soft-modems
+
+session:
+ callerid: CB-0
+ callid: QST
+ ax25_ui: true
+
+terminal:
+ pacing_baud: 1200
+ line_width: 80
+ payload_max: 256
+
+max25d:
+ ini_example: share/max25/max25d.ini.example
+ device_section: device.soft-crdop
+ ctl_start: stacks/crdop/scripts/crdopc
+ default_ini: stacks/crdop/share/crdop.ini.example
+
+softmodem:
+ product: MAX25-SoftModem
+ phase: development_and_testing
+ protocol: max25-softmodem
+ baud_primary: 1200
+ baud_max: 19200
+ duplex: [half, full]
+ ax25_packet_radio: acoustically_compatible
+ use_like_hardware_modem: true
+ audio_required: true
+ coupling: [line_level, acoustic]
+ host: 127.0.0.1
+ control_port: 8515
+ data_port: 8516
+ listen: true
+
+hybbx:
+ ini_example: share/hybbx/crdop-host.ini.example
+ plugin: crdop
+
+docs:
+ - stacks/crdop/docs/INDEX.md
+ - stacks/crdop/README.md
+ - stacks/crdop/docs/SOFTMODEM.md
+ - stacks/crdop/ROADMAP.md
+ - plugins/devices/soft-crdop/plugin.yaml
+
+notes: |
+ MAX25-SoftModem (CRDOP) — MAX25-Stack STANDARD (built unless MAX25_BUILD_CRDOP=OFF).
+ Development and test phase. 1200 baud+, half/full duplex.
+ Acoustically AX.25/Packet-Radio compatible with TNCs and BayCom modems.
+ Sound card IN/OUT + radio — use like a hardware modem in max25d.
+ Good sound card REQUIRED (accurate tones; stricter at higher baud).
+ Open docs for DIY hardware interfaces.
diff --git a/share/clients/tmodem.yaml b/share/clients/tmodem.yaml
new file mode 100644
index 0000000..162b5b8
--- /dev/null
+++ b/share/clients/tmodem.yaml
@@ -0,0 +1,42 @@
+schema_version: 1
+id: tmodem
+label: T-Modem-c1224 USB KISS half-TNC
+type: client-profile
+status: prototype
+
+connection:
+ host: 127.0.0.1
+ port: 7325
+ unix_socket: /run/max25/modem.sock
+ tcp_only: false
+
+device:
+ id: tmodem
+ hardware: tncs
+
+session:
+ callerid: CB-0
+ callid: QST
+ ax25_ui: true
+
+terminal:
+ pacing_baud: 1200
+ line_width: 80
+ payload_max: 256
+
+max25d:
+ ini_example: share/max25/max25d.tmodem.ini.example
+ devices_key: tmodem
+ backend: kiss-raw-serial
+
+serial:
+ default_device: /dev/ttyACM0
+ baud: 115200
+ line: 8n1
+ dtr_rts: false
+
+docs:
+ - plugins/devices/tmodem/plugin.yaml
+ - docs/DEV/TMODEM-C1224.md
+
+notes: Not BayCom/based. Feature [features] tmodem=yes required.
diff --git a/share/clients/tnc2c.yaml b/share/clients/tnc2c.yaml
new file mode 100644
index 0000000..90c6e9c
--- /dev/null
+++ b/share/clients/tnc2c.yaml
@@ -0,0 +1,53 @@
+schema_version: 1
+id: tnc2c
+label: Landolt TNC2C
+type: client-profile
+status: active
+
+connection:
+ host: 127.0.0.1
+ port: 7325
+ unix_socket: /run/max25/modem.sock
+ tcp_only: false
+
+device:
+ id: tnc2c
+ hardware: tncs
+
+session:
+ callerid: CB-0
+ callid: QST
+ ax25_ui: true
+
+terminal:
+ pacing_baud: 2400
+ line_width: 80
+ payload_max: 256
+
+max25d:
+ ini_example: share/max25/max25d.ini.example
+ device_section: serial.tnc2c
+ env_file: stacks/tncs/tnc2c-serial.env
+ boot_wait: stacks/tncs/tnc2c-boot-wait.sh
+ health: stacks/tncs/tnc2c-health.sh
+
+serial:
+ default_device: /dev/ttyS4
+ baud: 19200
+ line: 8n1
+ dtr_rts: true
+ kiss_entry: kiss_on
+
+rf:
+ modem: tcm3105
+ radio_baud: 2400
+ band: cb
+
+hybbx:
+ ini_example: share/hybbx/tnc2c-host.ini.example
+ plugin: packet_radio
+ profile: tnc2c
+
+docs:
+ - stacks/tncs/docs/TNC2C-OPERATIONS.md
+ - plugins/devices/tnc2c/plugin.yaml
diff --git a/share/hybbx/README.md b/share/hybbx/README.md
new file mode 100644
index 0000000..6694bb5
--- /dev/null
+++ b/share/hybbx/README.md
@@ -0,0 +1,7 @@
+# share/hybbx/ — not a Lite operator path
+
+These INI examples describe **HyBBX co-host** and **TNC2C/pktnc2 hardware** attach, which are full **MAX25-Stack** features. Both are **out of scope** for MAX25-Stack-Lite (localhost `max25d` + `max25-terminal`/`max25-client`, CRDOP, BayCom/based).
+
+Kept only so the fork stays in sync with upstream `share/`; not built, not referenced by Lite's own scripts (`max25-lite-setup.sh`, `run-max25d.sh`, `run-max25-terminal.sh`), and not part of the Lite install tree.
+
+For Lite configuration, use `share/max25/max25d.lite*.ini.example` and `share/max25-bcpr/*.ini.example` instead.
diff --git a/share/hybbx/baycom-kiss-host.ini.example b/share/hybbx/baycom-kiss-host.ini.example
new file mode 100644
index 0000000..9fbefb9
--- /dev/null
+++ b/share/hybbx/baycom-kiss-host.ini.example
@@ -0,0 +1,38 @@
+; HyBBX INI — co-host / secondary RF (BayCom/based via MAX25 KISS prep)
+; max25d: mode=hybbx-main | hybbx-cohost | hybbx-host
+; [features] baycom=yes max25_bcpr=yes
+; max25e0 = max25-bcpr:bc0 → kiss_link /tmp/max25-bcpr/kiss-bc0
+; HyBBX opens KISS after max25d prep — max25d does not hold the fd.
+; Copy to hybbx.ini on RF host; circuit_host points at Main hub when split.
+
+[instance]
+standalone = yes
+
+[networks]
+baycom = yes
+ax25 = no
+
+[max25]
+check = yes
+host = 127.0.0.1
+port = 7325
+
+[circuit]
+enabled = yes
+; circuit_host on transport rows when linking to remote Main
+
+[transport.baycom1]
+backend = kiss
+device = /tmp/max25-bcpr/kiss-bc0
+serial_baud = 1200
+radio_baud = 1200
+txdelay = 35
+slot = 10
+persist = 128
+txtail = 2
+circuit_host = main.example.com
+circuit_port = 7323
+link_id = max25-pccom-kiss
+link_password = changeme
+link_role = link
+frequency_mhz = 27.205
diff --git a/share/hybbx/crdop-host.ini.example b/share/hybbx/crdop-host.ini.example
new file mode 100644
index 0000000..f3d50c7
--- /dev/null
+++ b/share/hybbx/crdop-host.ini.example
@@ -0,0 +1,17 @@
+; MainAX25-Stack (MAX25-Stack) — HyBBX Secondary host (CRDOP / soft-crdop)
+; Merge into HyBBX hybbx.ini on Secondary node.
+; Prerequisite: crdopc running (max25-ctl start --hardware soft-modems --device soft-crdop)
+
+[networks]
+crdop = yes
+
+[transport.crdop1]
+enabled = yes
+modem_host = 127.0.0.1
+modem_port = 8515
+mycall = CB-0
+listen = yes
+circuit_host = main.example.com
+circuit_port = 7323
+link_id = max25-crdop
+link_password = changeme
diff --git a/share/hybbx/pktnc2-host.ini.example b/share/hybbx/pktnc2-host.ini.example
new file mode 100644
index 0000000..3675a87
--- /dev/null
+++ b/share/hybbx/pktnc2-host.ini.example
@@ -0,0 +1,28 @@
+; MainAX25-Stack (MAX25-Stack) — HyBBX Secondary host (PK-TNC2 / TNC-2)
+; Prerequisite: max25d auto_start or ./scripts/max25-ctl start --hardware tncs --device pktnc2
+; Standalone HyBBX (no max25d): set kiss_entry = auto instead of none
+
+[networks]
+ax25 = yes
+
+[transport.packet_radio1]
+enabled = yes
+tnc = tnc2
+protocol = kiss
+device_type = serial
+device = /dev/ttyUSB0
+baud = 9600
+serial_line = 8n1
+rts_dtr = no
+kiss_entry = none
+radio_baud = 1200
+radio_band = cb
+radio_duplex = half
+persist = 255
+circuit_host = main.example.com
+circuit_port = 7323
+link_id = max25-pktnc2
+link_password = changeme
+
+[max25]
+check = yes
diff --git a/share/hybbx/service-dual.ini.example b/share/hybbx/service-dual.ini.example
new file mode 100644
index 0000000..febf3c2
--- /dev/null
+++ b/share/hybbx/service-dual.ini.example
@@ -0,0 +1,37 @@
+; MainAX25-Stack (MAX25-Stack) — service mode dual BayCom (HyBBX)
+; Prerequisite: bcpr dual max25e0:bc0/bc1 running (see docs/BAYCOM.md · stacks/max25-bcpr/)
+; Merge into Secondary hybbx.ini — unique link_id per transport on Main.
+
+[networks]
+ax25 = no
+baycom = yes
+
+; BayCom radio A — modem.a / bcsf0 / kiss-a
+[transport.baycom1]
+backend = kernel
+mode = ser12*
+interface = bcsf0
+iobase = 0x3f8
+irq = 4
+radio_baud = 1200
+txdelay = 35
+circuit_host = main.example.com
+circuit_port = 7323
+link_id = max25-baycom-a
+link_password = changeme
+frequency_mhz = 27.205
+
+; BayCom radio B — modem.b / bcsf1 / kiss-b
+[transport.baycom2]
+backend = kernel
+mode = ser12*
+interface = bcsf1
+iobase = 0xe080
+irq = 30
+radio_baud = 1200
+txdelay = 35
+circuit_host = main.example.com
+circuit_port = 7323
+link_id = max25-baycom-b
+link_password = changeme
+frequency_mhz = 27.205
diff --git a/share/hybbx/tnc2c-host.ini.example b/share/hybbx/tnc2c-host.ini.example
new file mode 100644
index 0000000..84986e3
--- /dev/null
+++ b/share/hybbx/tnc2c-host.ini.example
@@ -0,0 +1,38 @@
+; MainAX25-Stack — HyBBX Secondary host (TNC2C)
+; Merge into HyBBX hybbx.ini on Secondary node.
+; Prerequisite: max25d auto_start or ./scripts/max25-ctl start --hardware tncs --device tnc2c
+; Stack template (onboard ttyS4): stacks/tncs/hybbx-tnc2c.ini
+;
+; MAX25 owns serial recovery + KISS entry — HyBBX attach-only (kiss_entry = none).
+
+[networks]
+ax25 = yes
+
+[transport.packet_radio1]
+enabled = yes
+tnc = tnc2c
+protocol = kiss
+device_type = serial
+; Onboard UART: /dev/ttyS4 · USB host: /dev/ttyUSB0 or /dev/serial/by-id/...
+device = /dev/ttyS4
+baud = 19200
+serial_line = 8n1
+rts_dtr = yes
+kiss_entry = none
+modem = tcm3105
+radio_baud = 2400
+clock_mhz = 4.9
+radio_band = cb
+radio_duplex = half
+frequency_mhz = 27.235
+txdelay = 50
+persist = 255
+slot = 10
+circuit_host = main.example.com
+circuit_port = 7323
+link_id = max25-tnc2c
+link_password = changeme
+mycall = CB-0
+
+[max25]
+check = yes
diff --git a/share/max25-bcpr/max25-bcpr.freebsd.ini.example b/share/max25-bcpr/max25-bcpr.freebsd.ini.example
new file mode 100644
index 0000000..c16bf3a
--- /dev/null
+++ b/share/max25-bcpr/max25-bcpr.freebsd.ini.example
@@ -0,0 +1,34 @@
+; max25-bcpr — FreeBSD AM1 / ExSys OXuPCI952 (cuau2 @ 0xd090)
+; Copy: cp share/max25-bcpr/max25-bcpr.ini.example /usr/local/etc/max25/max25-bcpr.ini
+; Live: dry_run=no · max25-bcpr-ctl start --ini /usr/local/etc/max25/max25-bcpr.ini
+
+[max25-bcpr]
+dry_run = yes
+state_dir = /tmp/max25-bcpr
+; user = akb
+; group = dialer
+; ptt_wd = yes
+; ptt_wd_key_ms = 14500
+; ptt_wd_pause_ms = 500
+; txd_bias = pulse
+
+[bc0]
+enabled = yes
+serial = /dev/cuau2
+iobase = 0xd090
+irq = 36
+mode = ser12*
+kiss_link = /tmp/max25-bcpr/kiss-bc0
+baud = 1200
+tx_delay = 35
+tx_tail = 2
+slottime = 10
+ppersist = 40
+fulldup = no
+
+; [bc1]
+; enabled = no
+; serial = /dev/cuau3
+; iobase = 0xd080
+; irq = 36
+; kiss_link = /tmp/max25-bcpr/kiss-bc1
diff --git a/share/max25-bcpr/max25-bcpr.ini.example b/share/max25-bcpr/max25-bcpr.ini.example
new file mode 100644
index 0000000..b75a91a
--- /dev/null
+++ b/share/max25-bcpr/max25-bcpr.ini.example
@@ -0,0 +1,44 @@
+; max25-bcpr — BayCom/based PC-COM SER12 (userspace, MAX25)
+; Public mark: BayCom/based. Never Konverter/converter.
+; Product: BayCom/based PC-COM SER12 (userspace, MAX25). Built by default (MAX25_BUILD_MAX25_BCPR=ON).
+; Hardware: TCM3105-class AFSK modem chip (bits↔tones + PTT). Not a TNC/digi/BBX.
+; Host (max25-bcprd / max25d) owns HDLC, KISS, bit clock → device max25e0 (:bcN forks).
+; Internal C API may still use bcpr_* symbols — product face is max25-bcpr only.
+;
+; Quick start (offline, after -DMAX25_BUILD_MAX25_BCPR=ON):
+; max25-bcprd -c stacks/max25-bcpr/share/max25-bcpr.ini.example --dry-run --once
+; Live: copy to /etc/max25/max25-bcpr.ini or ./local/max25-bcpr.ini; set dry_run=no.
+
+[max25-bcpr]
+dry_run = yes
+state_dir = /tmp/max25-bcpr
+; FlexNet SER12 PTT watchdog (cal / long key): unkey ~500 ms every ~14.5 s
+; ptt_wd = yes
+; ptt_wd_key_ms = 14500
+; ptt_wd_pause_ms = 500
+; TXD pump: pulse = Sailer THR 0x00 (default); steady = UART break (TFPCX-class)
+; txd_bias = pulse
+; Software TOT (max25d [tot] syncs these on stack start; override per site if needed)
+; tot = yes
+; tot_max_key_sec = 25
+; tot_min_gap_ms = 1500
+; tot_max_consecutive = 3
+; tot_max_bursts = 8
+
+[bc0]
+enabled = yes
+serial = /dev/ttyS0
+; iobase / irq — set to real values for live use
+mode = ser12*
+kiss_link = /tmp/max25-bcpr/kiss-bc0
+baud = 1200
+tx_delay = 35
+tx_tail = 2
+slottime = 10
+ppersist = 40
+fulldup = no
+
+; [bc1]
+; enabled = no
+; serial = /dev/ttyS1
+; kiss_link = /tmp/max25-bcpr/kiss-bc1
diff --git a/share/max25/max25d.ini.example b/share/max25/max25d.ini.example
new file mode 100644
index 0000000..1cffbbc
--- /dev/null
+++ b/share/max25/max25d.ini.example
@@ -0,0 +1,46 @@
+; MAX25-Stack-Lite — one radio, one terminal (example)
+; Localhost only: max25d + max25-terminal on the SAME PC. No LAN / no remote terminal.
+; Copy: sudo cp share/max25/max25d.lite.ini.example /etc/max25/max25d.ini
+; Edit only the device path for your modem.
+
+[daemon]
+mode = standalone
+hardware = tncs
+device = tnc2c
+
+[network]
+tcp_host = 127.0.0.1
+tcp_port = 7325
+unix_socket = /run/max25/modem.sock
+; Empty = no AUTH on loopback smoke tests; set before LAN exposure
+tcp_password =
+
+[modem]
+callerid = CB-0
+callid = QST
+ax25_ui = yes
+
+[reporting]
+error_transmissions = yes
+voice_transmissions = yes
+data_passes = 3
+data_quality_min = 50
+data_pass_seconds = 20
+
+[stack]
+auto_start = yes
+serial_watch = yes
+serial_watch_interval = 60
+stack_recover_only = yes
+serial_bootwait_escalate = yes
+serial_bootwait_escalate_after = 3
+
+[devices]
+default = tnc2c
+tnc2c = /dev/ttyUSB0
+
+[serial.tnc2c]
+baud = 19200
+line = 8n1
+dtr_rts = yes
+kiss_entry = kiss_on
diff --git a/share/max25/max25d.lite.bcpr.ini.example b/share/max25/max25d.lite.bcpr.ini.example
new file mode 100644
index 0000000..792e602
--- /dev/null
+++ b/share/max25/max25d.lite.bcpr.ini.example
@@ -0,0 +1,42 @@
+; MAX25-Stack-Lite — BayCom/based PC-COM (max25-bcpr / max25e0)
+; Localhost only: max25d + max25-terminal on the SAME PC.
+; Copy: sudo cp share/max25/max25d.lite.bcpr.ini.example /etc/max25/max25d.ini
+; sudo cp stacks/max25-bcpr/share/max25-bcpr.ini.example /etc/max25/max25-bcpr.ini
+; Start bcpr first: sudo max25-bcpr-ctl start --ini /etc/max25/max25-bcpr.ini
+
+[features]
+max25_bcpr = yes
+
+[daemon]
+mode = standalone
+hardware = tncs
+device = max25e0
+
+[network]
+tcp_host = 127.0.0.1
+tcp_port = 7325
+unix_socket = /run/max25/modem.sock
+tcp_password =
+
+[modem]
+callerid = CB-0
+callid = QST
+ax25_ui = yes
+
+[reporting]
+error_transmissions = yes
+voice_transmissions = yes
+data_passes = 3
+data_quality_min = 50
+data_pass_seconds = 20
+
+[stack]
+auto_start = yes
+
+[devices]
+default = max25e0
+max25e0 = max25-bcpr:bc0
+
+[device.max25e0]
+kiss_link = /tmp/max25-bcpr/kiss-bc0
+max25_bcpr_ini = /etc/max25/max25-bcpr.ini
diff --git a/share/max25/max25d.lite.crdop.ini.example b/share/max25/max25d.lite.crdop.ini.example
new file mode 100644
index 0000000..f47cf6a
--- /dev/null
+++ b/share/max25/max25d.lite.crdop.ini.example
@@ -0,0 +1,40 @@
+; MAX25-Stack-Lite — CRDOP sound-card modem (example)
+; Localhost only: max25d, crdop, and terminal on the SAME PC.
+; Copy: sudo cp share/max25/max25d.lite.crdop.ini.example /etc/max25/max25d.ini
+; Also: cp stacks/crdop/share/crdop.ini.example ~/.config/crdop/crdop.ini
+; Wizard: ./scripts/max25-lite-setup.sh
+
+[daemon]
+mode = standalone
+hardware = soft-modems
+device = soft-crdop
+
+[network]
+tcp_host = 127.0.0.1
+tcp_port = 7325
+unix_socket = /run/max25/modem.sock
+tcp_password =
+
+[modem]
+callerid = CB-0
+callid = QST
+ax25_ui = yes
+
+[reporting]
+error_transmissions = yes
+voice_transmissions = yes
+data_passes = 3
+data_quality_min = 50
+data_pass_seconds = 20
+
+[stack]
+auto_start = yes
+
+[devices]
+default = soft-crdop
+soft-crdop = crdop:default
+
+[device.soft-crdop]
+host = 127.0.0.1
+port = 8515
+listen = yes
diff --git a/share/max25/max25d.lite.ini.example b/share/max25/max25d.lite.ini.example
new file mode 100644
index 0000000..c7c17b9
--- /dev/null
+++ b/share/max25/max25d.lite.ini.example
@@ -0,0 +1,44 @@
+; MAX25-Stack-Lite — one radio, one terminal (example)
+; Localhost only: max25d + max25-terminal on the SAME PC. No LAN / no remote terminal.
+; Copy: sudo cp share/max25/max25d.lite.ini.example /etc/max25/max25d.ini
+
+[daemon]
+mode = standalone
+hardware = tncs
+device = tnc2c
+
+[network]
+tcp_host = 127.0.0.1
+tcp_port = 7325
+unix_socket = /run/max25/modem.sock
+tcp_password =
+
+[modem]
+callerid = CB-0
+callid = QST
+ax25_ui = yes
+
+[reporting]
+error_transmissions = yes
+voice_transmissions = yes
+data_passes = 3
+data_quality_min = 50
+data_pass_seconds = 20
+
+[stack]
+auto_start = yes
+serial_watch = yes
+serial_watch_interval = 60
+stack_recover_only = yes
+serial_bootwait_escalate = yes
+serial_bootwait_escalate_after = 3
+
+[devices]
+default = tnc2c
+tnc2c = /dev/ttyUSB0
+
+[serial.tnc2c]
+baud = 19200
+line = 8n1
+dtr_rts = yes
+kiss_entry = kiss_on
diff --git a/share/max25/max25d.service.example b/share/max25/max25d.service.example
new file mode 100644
index 0000000..e3281fb
--- /dev/null
+++ b/share/max25/max25d.service.example
@@ -0,0 +1,13 @@
+[Unit]
+Description=MAX25 daemon (MainAX25-Stack)
+After=network.target
+
+[Service]
+Type=simple
+ExecStart=/usr/local/bin/max25d -c /etc/max25/max25d.ini
+Restart=on-failure
+RuntimeDirectory=max25
+# Unix socket: /run/max25/modem.sock (writable when RuntimeDirectory=max25)
+
+[Install]
+WantedBy=multi-user.target
diff --git a/share/max25/serial/README.md b/share/max25/serial/README.md
new file mode 100644
index 0000000..04c5310
--- /dev/null
+++ b/share/max25/serial/README.md
@@ -0,0 +1,22 @@
+# Per-device serial env (max25d / boot-wait)
+
+Install copies for site-specific paths:
+
+```bash
+sudo mkdir -p /etc/max25
+sudo cp share/max25/serial/tnc2c-serial.env.example /etc/max25/tnc2c-serial.env
+# edit device path and baud
+```
+
+Search order (`paths.py`): `/etc/max25/` → `local/` → `share/max25/serial/` → `stacks/tncs/`.
+
+**Other device families** use different site config (same `[devices]` pattern in `max25d.ini`):
+
+| Hardware | Site config (not serial env) |
+|----------|------------------------------|
+| BayCom/based (`max25e0` / bcpr) | `share/max25-bcpr/max25-bcpr.ini.example` → `/etc/max25/max25-bcpr.ini` |
+| CRDOP (`soft-crdop`) | `stacks/crdop/share/crdop.ini.example` |
+
+Device model overview: [../../README.md](../../README.md) (scope) · [../../stacks/max25-bcpr/README.md](../../stacks/max25-bcpr/README.md) (BayCom/based).
+
+Terminal client profiles (connection only): [`../clients/`](../clients/README.md).
diff --git a/share/max25/serial/pccom-kiss-serial.env.example b/share/max25/serial/pccom-kiss-serial.env.example
new file mode 100644
index 0000000..6fbbe00
--- /dev/null
+++ b/share/max25/serial/pccom-kiss-serial.env.example
@@ -0,0 +1,9 @@
+# PC-COM / USB KISS serial — copy to /etc/max25/pccom-kiss-serial.env
+# Used by max25d devices pccom-kiss and baycom-kiss (kiss-raw-serial backend).
+# Stable path preferred: /dev/serial/by-id/usb-...
+PCCOM_KISS_DEV=/dev/ttyUSB0
+PCCOM_KISS_BAUD=9600
+PCCOM_KISS_LINE=8n1
+PCCOM_KISS_DTR_RTS=no
+PCCOM_KISS_RADIO_BAUD=1200
+HYBBX_SERIAL_LINE=8n1
diff --git a/share/max25/serial/pktnc2-serial.env.example b/share/max25/serial/pktnc2-serial.env.example
new file mode 100644
index 0000000..ba25cc7
--- /dev/null
+++ b/share/max25/serial/pktnc2-serial.env.example
@@ -0,0 +1,5 @@
+# PK-TNC2 serial — copy to /etc/max25/pktnc2-serial.env
+# Example: onboard UART /dev/ttyS5
+PKTNC2_DEV=/dev/ttyS5
+PKTNC2_BAUD=9600
+PKTNC2_LINE=8n1
diff --git a/share/max25/serial/tnc2c-serial.env.example b/share/max25/serial/tnc2c-serial.env.example
new file mode 100644
index 0000000..10b2576
--- /dev/null
+++ b/share/max25/serial/tnc2c-serial.env.example
@@ -0,0 +1,8 @@
+# TNC2C serial — copy to /etc/max25/tnc2c-serial.env
+# Example: onboard UART /dev/ttyS4
+TNC2C_DEV=/dev/ttyS4
+TNC2C_BAUD=19200
+TNC2C_LINE=8n1
+TNC2C_RADIO_BAUD=2400
+TNC2C_MODEM=tcm3105
+HYBBX_SERIAL_LINE=8n1
diff --git a/share/systemd/README.md b/share/systemd/README.md
new file mode 100644
index 0000000..db812b8
--- /dev/null
+++ b/share/systemd/README.md
@@ -0,0 +1,9 @@
+# systemd units (product)
+
+| Unit | Role |
+|------|------|
+| `max25d.service` | Product max25d (optional example) |
+
+Experimental orch units are **not** shipped in this freigegeben tree.
+
+Install example: copy to `/etc/systemd/system/`, adjust `WorkingDirectory` / `ExecStart` / `Environment` to the site PREFIX and `./local/` INI (never commit secrets).
diff --git a/share/systemd/max25d.service b/share/systemd/max25d.service
new file mode 100644
index 0000000..b2118a0
--- /dev/null
+++ b/share/systemd/max25d.service
@@ -0,0 +1,32 @@
+# max25d — example systemd unit (adjust paths to site install)
+# Install: sudo cp share/systemd/max25d.service /etc/systemd/system/
+# sudo systemctl daemon-reload && sudo systemctl enable --now max25d.service
+#
+# Site INI — operator overrides via drop-in or EnvironmentFile under ./local/
+# (never commit secrets).
+
+[Unit]
+Description=MAX25-Stack max25d control plane
+Documentation=https://github.com/ngteq/MAX25-Stack
+After=network-online.target multi-user.target
+Wants=network-online.target
+ConditionPathExists=/usr/local/bin/run-max25d
+
+[Service]
+Type=simple
+User=root
+Group=root
+WorkingDirectory=/usr/local
+Environment=MAX25_INI=/etc/max25/max25d.ini
+EnvironmentFile=-/etc/max25/max25d.env
+ExecStart=/usr/local/bin/run-max25d -c ${MAX25_INI}
+Restart=on-failure
+RestartSec=5
+TimeoutStartSec=120
+KillMode=control-group
+StandardOutput=journal
+StandardError=journal
+SyslogIdentifier=max25d
+
+[Install]
+WantedBy=multi-user.target
git clone -b <branch> https://cgit.mode42.com/<repo>.git
git clone -b <branch> git://cgit.mode42.com/<repo>.git

info@mode42.com