| Recommend this page to a friend! |
| Packages of Matthew Asham | Binkterm PHP | docs/PacketBBS.md | Download |
|
|||||||||||||||||||||
PacketBBS GatewayTable of Contents
PacketBBS is BinktermPHP's compact text gateway for PacketBBS, MeshCore, and similar packet radio or mesh text bridges. It exposes BBS mail functions through short command/response messages instead of a full-screen terminal UI. The gateway is designed for low-bandwidth radio links:
PacketBBS is not a web frontend and is not an ANSI terminal shell. A separate radio bridge sends HTTP requests to BinktermPHP and relays the plain-text response back to the radio network. That makes PacketBBS an access method, not a separate mini-BBS. It reaches into the same platform data as the browser UI and terminal services, but does so through terse command/response exchanges that fit radio and mesh conditions. ArchitectureThe bridge talks to BinktermPHP through:
Every bridge request must include:
The API key belongs to a registered PacketBBS node in the admin UI. The key is stored server-side as a SHA-256 hash and is only shown once when generated. Bridge AdaptersPacketBBS requires a bridge adapter to connect a radio network to the BinktermPHP HTTP API. | Adapter | Radio network | Repository | Status | |---|---|---|---| | MeshCore Bridge | MeshCore | awehttam/binktermphp-meshcorebridge | Available | | Meshtastic Bridge | Meshtastic (via TCP or USB serial) | awehttam/binktermphp-meshtasticbridge | Experimental | | AX.25 KISS Bridge | AX.25 packet radio (hardware or software TNC) | awehttam/binktermphp-ax25kiss | Experimental | Bridge Node vs Sender NodePacketBBS supports a bridge device serving more than one radio sender.
If Sessions are keyed by Workflow: how PacketBBS fits into low-bandwidth access
Sysop Setup1. Configure PacketBBS DefaultsPacketBBS defaults live under
Options: | Option | Default | Meaning |
|---|---:|---|
| Login failures are rate-limited per sender node: 5 failed attempts in 10 minutes blocks further attempts briefly. Successful login clears prior failures. 2. Register a Bridge NodeGo to:
Add a node: | Field | Purpose |
|---|---|
| Node ID | The bridge device ID. For MeshCore this is the bridge node hash/ID. For AX.25 KISS use the bridge callsign (e.g. After creating the node, click the key button and generate an API key. Copy it immediately; it will not be shown again. 3. Configure the Bridge> Bridge developers: this section is aimed at you. Sysops only need to supply the BBS URL and the API key generated in step 2. Start with the bridge's configuration file. At minimum it needs the BBS URL and the API key for the registered node:
The bridge uses these to authenticate its requests to BinktermPHP. Refer to the bridge's own documentation for the full list of configuration options. User EnrollmentUsers must enable the PacketBBS authenticator before they can log in by radio. Steps for the user:
The authenticator issuer is:
Radio login uses TOTP codes, not the web password. Over-the-Air Authentication Security> Warning: PacketBBS over radio should not be treated as a hardened secure channel. The login step uses TOTP, but the security of the session after login depends on the underlying transport and bridge behavior. PacketBBS authenticates the user at login time with a TOTP code, then keeps a session associated with the sender Sender spoofing after loginOn transports such as AX.25/KISS, the sender identity is typically just the source callsign or node identifier carried in the frame. AX.25 does not provide cryptographic proof that the sender identity matches the station that actually transmitted it. Any operator with suitable radio hardware and software can transmit frames using another station's callsign. This creates a session-hijacking exposure:
The TOTP code itself expires after 30 seconds, so replaying the login is only a narrow-window risk. However, commands sent after login do not require a fresh code. If the transport allows sender-ID spoofing, an attacker may be able to use the session for as long as it remains active. Practical implications by transport| Transport | Sender identity assurance | Traffic confidentiality | Status in BinktermPHP | Risk | |---|---|---|---|---| | AX.25 / KISS (hardware or Direwolf) | None | None | Experimental | High: sender spoofing is practical, so active sessions can be hijacked | | AX.25 / KISS over RF via igate | None | None | Experimental | High | | Meshtastic | Better than AX.25 for mesh membership control, but not validated here as a secure PacketBBS transport | Shared-channel encryption; not documented here as per-recipient PacketBBS protection | Experimental and currently untested | Unknown to moderate: do not assume PacketBBS session privacy or anti-spoofing properties have been verified | | MeshCore | Cryptographic node identity at the radio layer | Per-packet cryptographic protection at the radio layer | Available | Lower for on-air sender spoofing; still depends on trusted bridge and endpoints | Meshtastic noteMeshtastic is not documented here as a fully secure PacketBBS transport, and BinktermPHP's Meshtastic bridge support is currently experimental and untested. Meshtastic's own documentation describes channels as groups that share a channel name and encryption key, and states that packet payloads are encrypted using the channel's shared key. It also documents that nodes can send messages directly to a specific radio. Taken together, that means direct-addressed Meshtastic messages should not be assumed to be private in the same sense as end-to-end per-recipient encryption: any node that has the same channel key may be able to decrypt the payload. In other words, Meshtastic may provide meaningful protection against casual over-the-air observation by stations that are not on the channel, but it should not currently be documented as providing strong private user-to-user confidentiality for PacketBBS sessions. Until this bridge path has been tested and reviewed, sysops should treat Meshtastic PacketBBS use as experimental, untested, and not suitable for sensitive actions. MeshCore noteMeshCore provides stronger identity guarantees on the radio link than AX.25-style transports, so it materially reduces the specific risk of over-the-air sender spoofing. That said, this does not make the overall PacketBBS path universally secure. A compromised bridge, stolen device, or compromised endpoint can still defeat those protections. MeshCore should be described as reducing spoofing risk, not eliminating all security risk. Mitigations and recommendations
These risks are driven mostly by the underlying transport and bridge trust model, not by TOTP itself. Sysops should assess both who can inject traffic and who can decrypt traffic on their chosen radio network before enabling authenticated PacketBBS use on the air. The practical attack surface is often smaller than an Internet-facing service because an attacker usually needs to know the radio settings, use compatible equipment, and be within RF or mesh reach. This reduces casual exposure, but it should not be treated as a substitute for cryptographic identity or confidentiality. End-User Command GuidePacketBBS is intentionally terse. Send
Typical response:
Session ContextPacketBBS keeps lightweight session context per sender node. That means:
Example:
Command TablesGlobal Context| Full command | Short code | Description |
|---|---|---|
| Area Navigation Context| Full command | Short code | Description |
|---|---|---|
| Netmail Context| Full command | Short code | Description |
|---|---|---|
| Echomail / Current Area Context| Full command | Short code | Description |
|---|---|---|
| Guided Flow Context| Full command | Short code | Description |
|---|---|---|
| Login
Short form:
Example:
Success:
If the session is idle too long, log in again. Online Users
Short form:
Lists users currently online. Depending on sysop configuration, this may be available before login. Status
Shows the current working context. Example responses:
or:
NetmailList netmail:
Aliases:
Example response:
Read a message:
If a current message is already open, you can also send:
to reopen that message from the top. The same replay behavior applies to Compatibility aliases:
Reply:
Compatibility aliases:
If a message is already open, Start new netmail:
Compatibility aliases:
For a direct FTN destination, use the address in the first slot:
EchomailList subscribed areas:
Aliases:
Example response:
The header shows the current page and total pages. If there are more pages, the footer shows Networked areas appear as Area SearchTo search for areas matching a keyword across name, description, and domain:
Example response:
The search term is preserved across List messages in an area:
Aliases:
If the tag is unique for the user, the domain may be omitted:
Read an echomail message:
Reply:
Post a new echomail message with an explicit area:
Compatibility alias:
If you already opened an area, PacketBBS remembers it. These are valid too:
or guided:
Compose ModeReplying, sending netmail, and posting echomail enter compose mode. Example:
Guided
Then send one body line per radio message:
PacketBBS responds:
Guided post flows reply with a shorter acknowledgement while the body is in progress:
Finish:
Short form:
Old-style
Cancel:
Short form:
Old-style BulletinsWhen you log in, any unread bulletins are listed automatically:
List all active bulletins at any time:
Alias:
Example response:
Read a specific bulletin:
Example response:
Reading a bulletin marks it as read for your account. The ChatPacketBBS supports real-time chat rooms and direct messages (DMs). Chat uses the same rooms as the web and terminal interfaces. Enter the default room:
Short form:
Enter a named room:
Open a DM with another user (by username):
List available rooms:
Alias:
Example room list response:
Once inside a room or DM, any text that is not a recognised command is posted as a message. Incoming messages from other users are delivered to your node via the outbound queue and arrive as separate pushes from the bridge. In-Chat Commands| Command | Short code | Description |
|---|---|---|
| Any other text is posted as a chat message. Switching ContextsFrom inside any chat context you can jump directly to another room or open a DM without going back to the main context first:
WeatherShow current weather for the bridge node's configured location:
Look up any city by name:
Example response:
Weather uses the OpenWeatherMap API key configured under Admin ? Weather Report. If no key is configured, SearchSearch EchomailSearch across all subscribed areas, or within a specific area:
If a current area is active (set with Example:
Response:
With a current area active:
Response:
Results from multiple areas show the area tag on each row. Use Search NetmailSearch your own netmail:
Example:
Response:
PagingPaging applies to three things: the area list, message lists, and long message bodies. ListsIf a list has more pages, the footer shows:
Long messagesIf a message body wraps beyond the current interface profile's per-page limit, it is split into pages. The first page shows a progress footer:
Subsequent pages show the same until the last page, which shows the normal reply prompt. NavigationMove forward one page:
Alias:
Move back one page:
Compatibility aliases:
Quit
To end the session unconditionally from anywhere, regardless of what area you are in, use the full word:
Output ProfilesThe | Interface | List page size | Msg page size | Width | Intended use |
|---|---:|---:|---:|---|
| Unknown interface values fall back to the MeshCore profile. Admin OperationsThe admin Packet BBS page shows:
Common operations:
Regenerating a node API key invalidates the old bridge key immediately. The node edit modal uses a two-column layout. Left column: identity and location fields. Right column: Auto-Add Contact Policy (MeshCore nodes only). The auto-add policy is pushed to the device only when the bitmask changes ? saving other fields without touching the policy does not queue a device command. Public Node DirectoryRegistered PacketBBS nodes are publicly listed at The page shows:
Linking to a specific node info modal uses the URL hash
The dashboard includes a PacketBBS Nodes card in the sidebar. It lists registered nodes with their handle and location description. Clicking a node name follows the Adding Location DataTo make nodes useful in the public directory, fill in the Location Description and optionally the Coordinates fields when registering or editing a node in Admin ? Packet BBS Nodes:
MeshCore Companion ContactsMeshCore radio devices maintain a local contact list (the "companion" list) of nodes they have heard or been manually told about. BinktermPHP mirrors this list into the How Contact Sync WorksAt startup, the bridge sends
During normal operation, the bridge also reports contacts pushed by the radio in real time (for example, when a new node is heard and automatically added to the companion list). The BBS upserts on the contact's full 64-character public key. If a user has already pre-registered a contact by its 12-character prefix (see User Radio Registration below), the incoming full-key report claims that row and fills in the complete key. Contact IdentifiersEach MeshCore contact has two key identifiers: | Field | Length | Description | |---|---|---| | Node ID prefix | 12 hex chars | The first 6 bytes of the public key, shown in the MeshCore app | | Full public key | 64 hex chars | The complete 32-byte public key; globally unique | Two contacts can share the same 12-character prefix (the prefix space is 2^48, collisions are possible). Uniqueness is enforced only on the full key. The prefix is used for display and initial lookup; the full key is used for identity and for sending remove commands to the device. Admin Contact ManagerOn the Admin ? Packet BBS Nodes page, each MeshCore node row has a contacts button (address book icon). Clicking it opens the Contact Manager for that node. The Contact Manager shows all contacts synced from that bridge node: | Column | Description | |---|---| | Node ID (prefix) | 12-char hex prefix; hover for full key tooltip when known | | Name | Display name, either from the radio or set by the sysop | | Type | Advertisement type reported by the radio (chat, repeater, etc.) | | Owner | BBS user account linked to this radio contact | | Location | GPS coordinates, if broadcast by the contact | | Last Seen | Timestamp of the most recent bridge sync | Editing a ContactClick the edit button on any row to open the edit modal. Fields:
Deleting ContactsSingle delete: click the trash icon on any row and confirm. Bulk delete: check one or more rows (or use the Select All checkbox in the header), then click Delete Selected in the modal footer. A single request deletes all selected contacts at once. When a contact has both a known bridge node and a full public key, deletion queues a Contacts that only have a 12-character prefix (no full key) are deleted from the BBS database only ? the device cannot be told to remove them because the full key needed to address the command is not known. User Radio RegistrationUsers can register their own MeshCore radio node under Settings ? MeshCore Radio. This creates a pre-registration row in Registration accepts either:
Once the bridge reports a contact whose prefix matches a user's pre-registered row (and the full key is not yet known), the row is claimed and updated. The user's BBS account becomes the owner of that radio contact. Users can rename or delete their registered radios from the same settings tab. Deleting a user-registered contact follows the same device command queue logic as admin deletion. Companion Radio AssociationWhen a user registers a radio contact under Settings ? MeshCore Radio, the registration form includes a Companion Radio selector. The user picks which bridge device should relay messages between the BBS and that contact. Selecting a companion radio does two things:
If a companion radio is later changed through the edit form, a fresh Users who have no full public key yet (registered by 12-character prefix only) must wait for the bridge to report the full key before the device push can happen. Device Auto-Add PolicyMeshCore devices can be configured to automatically add nodes they hear over the air to their local contact list. By default this is often enabled for all node types, which can fill the contact list with repeaters and sensors the operator does not care about. The Admin ? Packet BBS Nodes node edit modal includes an Auto-Add Contact Policy section for MeshCore nodes. Individual checkboxes control each auto-add type: | Checkbox | Bit | Notes |
|---|---|---|
| Auto-add companions (chat) | Saving the node queues a Read from Device: clicking this button queues a The Device Command QueueBinktermPHP records commands for the radio device in
After executing each command the bridge acknowledges it:
If the bridge is offline when a command is queued, it stays pending until the bridge reconnects and polls again. Supported command types: | Command type | Triggered by | Radio frame sent |
|---|---|---|
| When the radio responds to
The BBS stores the value in TroubleshootingUnknown Bridge NodeRadio response:
Fix:
Unauthorized HTTP ResponseAn HTTP Fix:
User Cannot Log InPossible causes:
PacketBBS deliberately keeps login errors short and does not reveal which users have an authenticator enrolled. Echomail Post Goes to the Wrong Area or FailsUse the exact area identifier shown by
If the area has no route or uplink, PacketBBS returns:
Check the echoarea domain, subscription, and uplink configuration. LogsPacketBBS writes operational logs to:
This log includes command routing and high-level errors. TOTP codes are never logged. Related Systems
|