Upgrading to 1.8.5
March 4, 2026 · View on GitHub
Make sure you've made a backup of your database and files before upgrading.
Summary of Changes
New Features
- Economy viewer: admins now have a dedicated Admin -> Economy Viewer page that summarizes the credits economy with circulation totals, period transaction flow, transaction-type breakdowns, top earners/spenders, richest accounts, and recent ledger activity
- Native Doors: run Linux programs natively as BBS doors with no emulator required; manage via Admin → Native Doors (see below)
- Door
launch_command: all door types (DOS and native) now support a{user_number}placeholder that is substituted with the BBS user's numeric ID at launch time; native doors also receive it as theDOOR_USER_NUMBERenvironment variable - Telnet gateway: native doors now appear alongside DOS doors in the telnet door menu
- Polls and shoutbox: both features now have dedicated user pages (
/pollsand/shoutbox) and telnet equivalents; the telnet interface now supports reading and voting in polls plus viewing and posting shoutbox messages - Echo area importer: Echo Areas Management now includes an Import page for CSV uploads in
ECHOTAG,DESCRIPTION,DOMAINformat; blankDOMAINvalues import the area as local-only, and the importer validates the full file before applying changes atomically - Markup kludge: outbound messages now use
^AMARKUP: Markdown 1.0per LSC-001 Draft 2; the legacy^AMARKDOWN:kludge continues to be recognised in received messages for backwards compatibility - StyleCodes rendering: messages with
^AMARKUP: StyleCodes 1.0(Synchronet Message Markup) are now rendered in the message reader; supported codes:*bold*,/italics/,_underlined_,#inverse# - Compose screen: the "Send as Markdown" checkbox is replaced with a Markup Format selector that lets you choose Plain text, Markdown, or StyleCodes when composing messages
Improvements
- Outbound dispatch: newly spooled netmail and echomail now trigger an immediate poll of the specific routed uplink instead of waiting for the scheduler's next loop
- Outbound dispatch: web message sends no longer block waiting for the outbound poll to complete before returning success to the browser
- Scheduler config reload:
binkp_scheduler.phpnow reloadsconfig/binkp.jsonduring its daemon loop so schedule and uplink changes are picked up without restarting the scheduler - Admin daemon: now forks a child process per connection so long-running commands such as manual polls no longer block other admin requests
- MRC daemon: logging now goes to
data/logs/mrc_daemon.loginstead of the PHP error log; log level is controllable via--log-level - BBS menu shell: when polls or shoutbox are enabled, the main menu now exposes links to their dedicated pages without changing the standard web shell dashboard layout, which continues to show those features inline
- Games page leaderboard: Top Scores (All Games) now includes month navigation arrows so users can browse previous months; the table reflects the selected month and shows an empty-state row when no scores exist
- Echomail and netmail posting identity: outbound posting now supports per-uplink
posting_name_policy(real_nameorusername/alias); echomail additionally supports per-echoarea override; default behavior remains posting with real name - Compose guidelines: composition now shows whether the selected echomail area or netmail destination will post using Real Name or Username/Alias based on the effective posting-name policy
- Outgoing MSGID: newly generated outbound netmail and echomail
MSGIDkludges now append@domainwhen the network domain is known, and inbound parsing accepts the suffixed format - Message reader: ANSI art in message bodies no longer displays inside a black box with a scrollbar; styling is now consistent with standalone ANSI art displays
- BinkP session:
binkp_pollnow completes promptly after sending mail to non-conformant remotes (those that sendM_EOBwithoutM_GOT); sessions terminate after 30 seconds of inactivity rather than the full session timeout, while preserving a window for areafix and similar systems to process an inbound packet and return a response in the same session; sent packets are cleaned up correctly regardless of whether the remote sendsM_GOTbefore or afterM_EOB - TIC processor:
FILE_ID.DIZinside ZIP archives is now read (case-insensitively) to populate file descriptions when the TIC file provides none
Removed
- BBSLink WebDoor (
public_html/webdoors/bbslink/) has been removed. It is replaced by the BBSLink native door (bbslinknative), which runs natively. If you had BBSLink configured as a WebDoor, disable it in Admin → WebDoors before upgrading, then set up the native door version as described in the Native Door Support section below.
Configuration Changes
binkp.json: the uplink keyallow_markdownhas been renamed toallow_markupto reflect that the setting controls all markup formats, not just Markdown. The upgrade migration (v1.10.17) renames the key automatically indata/binkp.json. If you manage your config manually, update anyallow_markdownkeys toallow_markup.
Security Fixes
- DOS door bridge:
dropfile_pathvalues indosdoor.jsnmanifests are now validated to prevent directory traversal; paths containing..segments or absolute paths are rejected and fall back to the default per-node drop directory - Admin daemon:
save_native_doors_configandsave_dosdoors_confignow reject non-object JSON payloads (e.g. scalars such astrueor1) that would previously cause a fatal error when passed to the config writer - Admin daemon: config write helpers now throw on
mkdirorfile_put_contentsfailure instead of silently returning success to the caller - BBSLink native door:
bbslink.shnow validates that both required arguments (door code and user number) are provided before proceeding, and checks fortelnetat startup alongside the existingcurlcheck;vars.shis now resolved relative to the script's own directory rather than the working directory
Documentation
docs/FileAreas.md: updated with file system permissions and group ownership requirements for shared web server and BinkP daemon access to file areas; clarifiedTAG@DOMAINkey usage for file area rules
Bug Fixes
- Markdown renderer: fixed inline code parsing so identifiers with underscores such as
send_domain_in_addrandM_ADRrender correctly in upgrade notes and other locally rendered Markdown documents - Markdown renderer: fixed wrapped unordered-list items so Upgrade Notes render correctly in the admin viewer instead of splitting a single bullet into separate paragraphs
- BinkP scheduler: fixed outbound-triggered polling so the scheduler no longer polls every enabled uplink once per minute whenever any outbound packet exists; outbound polls now only target uplinks that actually have queued outbound traffic for them
- Scheduler logging: corrected outbound polling log messages so "triggering poll" is only logged when an uplink will actually be polled
- Scheduler shutdown: fixed
Ctrl-C/SIGINThandling sobinkp_scheduler.phpexits immediately instead of continuing into the next polling loop - Admin daemon client: fixed stale reused connections that could produce intermittent "Admin daemon closed connection" errors after the daemon timed out an idle socket
- Bundle processing: fixed inbound ArcMail day-bundle detection so files such as
.suaare recognized and extracted instead of being rejected as an unknown bundle format - Cron schedule clarification:
* */1 * * *means every minute of every hour, not hourly; use0 * * * *or0 */1 * * *for hourly polling - Packet processor: fixed echomail misclassified as netmail when the incoming packet is missing its
AREA:line; the secondary scan loop had a logic error causing it to exit after one iteration, andSEEN-BY/PATHdetection now scans the full message instead of only the first ten lines - Packet processor: fixed broadcast echomail (addressed
To: Allwith no Private attribute) from newsletter-style gateways being stored as netmail when the message lacksAREA:/SEEN-BY:/PATH:headers; such messages are now correctly identified as echomail and dropped with a log entry rather than polluting the netmail inbox - TIC processor: fixed TIC files from DOS-era FTN software being rejected with "Missing required TIC field: Area" when field names are uppercase (e.g.
AREAinstead ofArea); field names are now matched case-insensitively; also fixed TIC files with bare\rline endings failing to parse - Mobile message reader: fixed swipe-to-navigate triggering while scrolling wide ANSI art horizontally; the boundary check now uses the scroll position captured at touch start rather than the position after native scrolling has already occurred
- BinkP server: fixed inbound sessions not including the network domain in the
M_ADRaddress; thesend_domain_in_addrflag was only applied to outbound calls — inbound connections now respect it too - Echomail compose: fixed posting to local echo areas with no domain association from the compose screen; local areas no longer submit as
@null, and server-side parsing now treats blank or missing domains correctly - Echomail area navigation: fixed local echo area links in
/echomailappending a trailing@(%40) when the area has no domain; local areas now navigate using tag-only identifiers
Native Door Support
BinktermPHP now supports native doors — Linux binaries and shell scripts that run directly as BBS doors with no emulator required. User data is passed via DOOR.SYS drop file and environment variables.
Install doors by dropping a subdirectory with a nativedoor.json manifest into native-doors/doors/, then enable them via Admin → Native Doors. Two test doors (linuxdoortest, windoortest) are included and disabled by default.
BBSLink is included as a native door (bbslinknative). Copy native-doors/doors/bbslinknative/vars.sh.example to vars.sh and fill in your BBSLink credentials before enabling it.
See docs/NativeDoors.md for the full manifest format reference, environment variable list, and setup instructions.
Security note: Native doors run as the same OS user as the BinktermPHP bridge. Only install doors from trusted sources, and never install a door that can drop to a shell. See the Security Warning section in NativeDoors.md for details.
Upgrade Instructions
From Git
git pull
php scripts/setup.php
scripts/restart_daemons.sh
Using the Installer
wget https://raw.githubusercontent.com/awehttam/binkterm-php-installer/main/binkterm-installer.phar
php binkterm-installer.phar
scripts/restart_daemons.sh