Skip to content

Personal Bulletin Board System

The pax25 PBBS is a simple bulletin board system for use with the pax25 library. It is included as an example of how to use the pax25 library, as well as a simple bulletin board system for use with packet radio. It is intended to emulate the functionality of existing PBBS systems, but with a few modern touches. These differences are described in the 'Differences from existing PBBSes' section below.

Usage

Setting up a demo PBBS can be set up with a small snippet, like so:

from pax25.station import Station
from pax25.contrib.bulletin_board import BulletinBoard
import asyncio

station = Station(
    config={
        # Change this to your callsign
        "name": "MYBOX",
        "interfaces": {
            "file": {
                "type": "file",
                "settings": {
                    "input": "/dev/stdin",
                    "output": "/dev/stdout",
                },
            }
        },
    }
)
station.connection.add_app(BulletinBoard, interfaces=["file"], settings={})

asyncio.run(station.start())

The settings dictionary can be customized with several entries:

Key Description Default
"slots" The maximum number of messages that can be stored on the board. Set to None to make this infinite. 100
"welcome_message" The message that is displayed when a user first connects to the board. ""
"max_message_length" The maximum length of each message body. Set to None to make this infinite. Note that subject lines can be an additional 150 characters in length. 5000
"debug" If True, saves the database with pretty formatting for examination. False
"save_file_path" The path to save the database to. "./board.json"

Commands

The PBBS supports several commands. The commands are listed in the table below. Commands are case-insensitive, and can be abbreviated to the part of the command not in parentheses. For example, B and b are equivalent to BYE and bye, and L is equivalent to LIST. When a command requires an argument, the argument is surrounded by square brackets. For example, S [callsign] means that the S must be used with a callsign as an argument. If a pipe (|) is used, then the options on either side of the pipe are valid. For example, L [<|>] [callsign] means that L can be used with a < or > as an argument, followed by a callsign.

Command Description
B(ye) PBBS will disconnect
L(ist) List messages you can read
L [<\|>] [callsign] List messages to or from callsign
LM(ine) List unread messages addressed to you
K(ill) n Delete message number n
KM(ine) Delete all read messages addressed to you
R(ead) n Display message ID n
RM(ine) Read all unread messages addressed to you
S(end) [callsign] Send message to callsign
I(nfo) Learn about his PBBS software

Composing a message

To compose a message, you can type S [callsign] where [callsign] is the callsign of the person you want to send a message to. You will then be prompted to enter the message. When you are done, you can send the message by typing /EX on its own line. If you want to cancel the message, disconnect without sending /EX on its own line.

Differences between existing Packet Radio PBBSes

The Pax25 PBBS leverages the fact that it is running on a more modern system to simplify memory management. As memory is less likely to be a concern, the board does not tightly manage a total number of bytes between all messages, but rather can optionally specify a total number of slots and the maximum character length of each message. Messages are stored in UTF-8.

The board also does not have a distinction between types of messages like 'Bulletins' and 'Personal Messages'. Instead, all messages are stored in a single list, and can be filtered by the user. This is intended to simplify the user experience, as well as the codebase.

However, private messages are supported. Though, we will note that in packet radio, whether a message is 'private' is more a matter of who happens to be monitoring when a message is ephemerally transmitted.