The next-generation BBS software

  • Old and new a 1980s computer can join
  • Real hardware a chip on your shelf
  • Free software GPL v3 or later
  • No internet needed a local network is enough
  • You write the rules and you are the appeal
  • No ads no one sells your time
  • No platforms nobody in the middle
  • No hosting fees it runs at your place
  • No outside costs your power, your Wi-Fi
  • No cloud nobody else's server

Adding an SD card

The Waveshare S3 needs none of this. Its card slot is on the board: the S3. So is every other ESP32-S3 board's and camera board's.

Optional, and for the ESP32 dev board. A board with no card is a complete board: chat, mail, accounts, screens, the caller log, a directory listing, the serial bridge. The card is what you add when you want file areas, forums and screens of your own.

The card can also keep the board's backups: switch on nightly backups and the board backs itself up to the card at 03:00 every night, keeping the last seven.

A module that costs about two dollars, and four signal wires plus power.

What you need

Cards larger than 32 GB ship formatted as exFAT, which this does not read. Reformat as FAT32 or use a smaller card. Windows will not offer FAT32 above 32 GB in the right-click Format dialog, and diskpart refuses it as well. Windows 11 with the April 2026 update or later can do it from a terminal, with format X: /FS:FAT32 where X is the card's drive letter; otherwise a smaller card or a third-party formatter.

The wiring

ESP32cardGNDGNDGND3V33V3VCCD19GPIO19MISOD23GPIO23MOSID18GPIO18SCKD5GPIO5CSESP32 dev boardSD card modulePower: start on 3V3. Some modules want 5 V: see below.Pin order differs between boards: go by the names.The pins can be changed on CONFIG sd.
Module pinESP32 pinNotes
3V3 or VCC3V3Start on 3V3. Some modules want 5 V: see below.
GNDGND
CS or SSD5 / GPIO5Change it in the config if you need to
MOSI or DID23 / GPIO23
SCK or CLKD18 / GPIO18
MISO or DOD19 / GPIO19

Use the 3V3 pin to start with. It is the choice that cannot damage anything: a module with no regulator on it needs 3.3 V, and 5 V on one of those goes straight to the card and can reach the ESP32's pins, which are not built for it. The common blue module with a small three-legged regulator on it, often marked AMS1117, is the exception: it is designed for 5 V on VCC. That regulator needs about a volt more going in than it gives out, so from 3V3 its card gets well under the 2.7 V a card is made to run from, and may fail to mount. If that is your module and it will not mount on 3V3, move VCC to the 5 V pin, which is VIN on most dev boards. Its regulator and level shifter keep the card and the signals at 3.3 V. Only do that if you can see the regulator on the module.

GPIO5 is one of the ESP32's strapping pins, but Espressif's datasheet gives it one job at power-on, with GPIO15: the timing of an SDIO interface this board does not use. So a card module on it does not stop the board booting, and the shipped cs = 5 is right. If you would rather CS were on a pin with no strapping role at all, move it to D4 and set cs = 4 in the config. Nothing else needs to change.

Telling the board about it

Nothing, if you used the pins above. Wire it up, power cycle, and it mounts at boot.

To check, log in as sysop and type SD:

SD card
  SDHC/SDXC at /sd, 20 MHz
  29123 MB free of 30436 MB
  screens: /sd/screens

If you moved a pin, CONFIG has an sd page with all four, or edit the section directly:

[plugin:sd]
cs = 4
mosi = 23
clk = 18
miso = 19
screens = yes

When it does not work

SD says which problem it is, in the board's own words.

What it saysWhat it usually means
no card foundThe card is not seated, or CS is on the wrong pin, or MISO/MOSI are swapped
card found but no FAT filesystemIt is exFAT or NTFS. Reformat as FAT32
card answered then failedThe card started to talk and then stopped. Check the power line and the ground, and see the note above about modules with a regulator. CONFIG sd can also lower the bus speed
SPI bus would not startA pin number in the config is one the board cannot use

SD MOUNT tries again without rebooting. It pauses the whole board for a moment while it negotiates with the card, which is why it is a command you type rather than something that retries by itself.

SD UNMOUNT flushes and releases the card so you can pull it safely.

What goes on the card, and what does not

On the card (FAT32)On the board (LittleFS)
File areasAccounts and passwords
ForumsThe configuration
Your own screensThe caller log
A copy of the caller logThe stock screens

The split is deliberate. FAT32 is readable on any laptop, which is the whole point of using it: pull the card, plug it into a PC, and your board's files are ordinary files. The cost is that FAT is not safe against losing power mid-write, so nothing that has to survive lives there. Accounts stay on the board's own flash, which is.

Pulling the card does not break the board. It goes back to the stock screens, and the file areas and forums are not available until the card is back.

Screens of your own

Put a screen in /sd/screens with the same name as a stock one and yours is used instead. A name the card does not have falls back to the one that shipped, so you can replace a single screen without supplying all of them.

The file extensions are the same as on the board: .ans for ANSI, .asc for plain ASCII, .seq for PETSCII, and .p40 or .p80 for a PETSCII screen drawn for 40 or 80 columns.

Set screens = no in the config if you would rather the card were ignored for this.

Your screens are played straight from the card, and nothing copies them into the board, so without the card they are gone until it is back.

To keep them without the card, type SCREENS INSTALL as the sysop. It copies the card's screens into the board itself, after checking they fit in its 256 KB of screen space; if they do not, it refuses and copies nothing, rather than installing half of them. SCREENS INSTALL STOCK puts the stock set back, and so does the next firmware update.

Settings

Every plugin page starts with the same four fields, which the plugin pages explain.

files

File areas: folders on the SD card that callers can list, download from and upload to. It needs a card, and without one the page is there but the plugin does not start. Read, Write and Admin are all, staff and sysop as shipped.

FILES───────────────────────────────────────────────────────────────────────────────Plugin enabled yes Read level all.....................................................Write level staff...................................................Admin level sysop...................................................File area 1 [ C64 Downloads ]File area 2 [ Text Files ]File area 3 [ not set ]File area 4 [ not set ]File area 5 [ not set ]File area 6 [ not set ]File area 7 [ not set ]File area 8 [ not set ][ Save ] [ Cancel ]Tab or arrows move, Enter is next, Space steps a choice, F1 saves, ESC quits typed: CONFIG files, firmware 1.2.0-link.17

There are eight areas, and each one is a button: Enter opens it as a page of its own.

FILE AREA 1───────────────────────────────────────────────────────────────────────────────Folder on the card pub/c64 Area name C64 Downloads...........................................Read: see and list all.....................................................Upload files staff...................................................Download files all.....................................................Delete and approve sysop...................................................[ Save ] [ Cancel ]Tab or arrows move, Enter is next, Space steps a choice, F1 saves, ESC quits typed: CONFIG files, then Enter on Area 1, firmware 1.2.0-link.17
FieldWhat it does
PathThe folder on the card, up to 48 characters. It is never shown to callers, and the board creates it if it is not there.
NameWhat callers see, up to 24 characters.
ReadWho sees the area in the list. Unset, the plugin's Read.
UploadWho may put files in and describe them. Unset, the plugin's Write.
DownloadWho may take files out. Unset, this area's Read.
DeleteWho may remove files and approve or reject uploads. Unset, the plugin's Admin.

An upload is invisible to everybody but staff until somebody with Delete approves it. Saving an area writes all four levels down, so what you saw on the form is what the area runs under from then on.

sd

The SD card. On as shipped, and the sysop's alone. With no card it tries once at start and then costs nothing.

SD───────────────────────────────────────────────────────────────────────────────Plugin enabled yes Read level sysop...................................................Write level sysop...................................................Admin level sysop...................................................Chip select GPIO 5.......................................................MOSI GPIO 23......................................................Clock GPIO 18......................................................MISO GPIO 19......................................................SPI bus speed, kHz 20000...................................................Screens from card yes.....................................................Nightly backup no......................................................[ Save ] [ Cancel ]Tab or arrows move, Enter is next, Space steps a choice, F1 saves, ESC quits typed: CONFIG sd, firmware 1.2.0-link.17

The card holds file areas, the forums and your own screens. The accounts, the settings and the caller log stay on the board, so a card that fails loses none of them. On the ESP32 dev board the wiring is above; the other boards have a slot of their own. What happens to your own screens when the card is out is under screens of your own.

Back to Set up your BBS.