Releases: awehttam/binkterm-php
Release list
1.9.9
Summary of Changes
Core Platform
- Admin -> Users now includes an Approved Registration History lookup inside the registrations panel. Pending registrations and retained approved-registration history now share one tabbed panel, making it easier to review current signup requests and look up previously approved accounts without taking extra vertical space on the page.
- When Require approval for new users is disabled, successful self-registrations now create an authenticated session immediately. Web users are signed in right away, and Telnet/SSH users continue directly into the terminal session without reconnecting.
- Admin -> Auto Feed now supports arbitrary poster names instead of linked posting accounts, and each feed can target multiple echo areas. Existing feeds are migrated automatically from their old linked-user and single-area settings.
- Admin -> Auto Feed -> Check now now runs through the admin daemon instead of spawning
rss_poster.phpdirectly from the web request. The manual check result is shown in the UI, and a Windows-specific daemon re-entry hang during feed posting has been fixed. - All four door admin pages (DOS Doors, Native Doors, JS-DOS Doors, WebDoors) now include a Door Manifest Editor — a form-based UI for creating and editing door manifests without touching JSON files directly. An Add New Door panel lists door directories that do not yet have a manifest so new games can be set up from the admin interface. An Auto fill with AI button reads the door's README and NFO files and populates game metadata automatically when an AI provider is configured. Existing manifests that were not created through the editor are displayed read-only; add
"managed": "web"to the manifest before the editor will allow changes to it. The door manifest editor is experimental — please report any issues on GitHub or the support BBS. - The DOS door bridge now holds a session open for a short reconnect window (default 30 seconds, configurable via
DOSDOOR_RECONNECT_TIMEOUT) after a WebSocket disconnect before terminating DOSBox. This allows the browser to reconnect after a page refresh or tab switch without losing the running game. - Echomail area links that use
?echoarea=AREA&domain=DOMAINnow preserve the selected area correctly instead of internally resolving toAREA@DOMAIN@DOMAIN. - The archive entry preview endpoint now rejects absolute paths in addition to
..traversal sequences, closing a gap where a specially crafted archive with absolute-path entries could cause the extraction tool to write outside the designated temp directory.
Messaging Menu Unread Counts
- The Messaging nav menu now shows unread message counts next to each item. The parent entry shows the combined total; Netmail shows the number of unread messages in your inbox; Echomail shows new messages using the same badge mode configured on your dashboard (new since last visit, or true unread). Counts clear automatically when you navigate to the relevant section.
Re-post Attribution Header
- When reposting a message, the compose editor now opens with a standardised attribution block prepended to the body, identifying the original area, sender, subject, and date. See the full section below for the header format.
Auto Feed Full Article Content
- The Auto Feed RSS poster now reads the full article body from feeds that provide it. For RSS 2.0 and RSS 1.0 feeds,
<content:encoded>(the Content Module field used by WordPress, Ghost, Substack, and most modern CMS platforms) is preferred over<description>, which typically contains only an excerpt. For Atom feeds,<content>is now correctly preferred over<summary>(these were previously swapped). Bodies longer than 16 000 characters are truncated to fit within practical FTN message size limits.
PGP Keyserver Address Book Import
- The PGP keyserver search page now includes an Add to address book button next to every key result, including results returned from remote BBS keyservers. Clicking the button either links the PGP key to an existing address book entry that matches the key owner's username (when that entry has no PGP key set), or opens a short form to create a new address book entry with the key pre-attached. When the search was qualified with an FTN node address (e.g.
user@1:234/567), the node address field is pre-filled automatically.
Facebook and Instagram Link Previews
- URL preview cards pasted into the composer now use the Facebook and Instagram oEmbed APIs for
facebook.comandinstagram.comlinks, which previously returned no data because those platforms block HTML scraping. Previews show the post title, author name, and thumbnail. A Meta Developer App access token must be configured in Admin → Appearance → Message Reader → Social Media API Keys to enable this feature.
Security
- PacketBBS bridge session binding: Each radio-node PacketBBS session is now bound to the bridge that created it. A registered bridge can no longer submit commands or poll pending messages on behalf of a session established through a different bridge. A database migration adds the binding column to
packet_bbs_sessions.
1.9.8
Web Interface
Admin Controls and Moderation
- Admin -> Users -> Edit User now includes two separate per-user netecho moderation controls. Allow unmoderated netecho posting is the normal bypass for the global new-user moderation threshold, while Force echomail moderation is an emergency override that pushes all networked echomail posts from a specific user back into the moderation queue.
- New-user registration approval is now controlled by a dedicated BBS setting. Self-registrations still require manual approval by default, but sysops can now disable that requirement and have new accounts activated immediately. Approved registrations are also retained as history records instead of being deleted from
pending_users.
Messaging and FTN Behavior
- Network and echoarea settings now include a Missing CHRS fallback charset used only when inbound FTN messages arrive without a
CHRSkludge. Inbound decode order now prefers the per-area override, then the network fallback, then the legacy guess order. Message charset edits for netmail and echomail now rebuildmessage_textfromraw_message_byteswhen raw bytes are available, and a new CLI tool can bulk rebuild stored echomail text for a selected area or domain. - Echomail tag validation is now less strict across the web UI, admin echoarea editor, importer, and route matching. Common FTN tag punctuation such as
&,!, and%is now accepted in area tags, so names likeAT&T_CHATno longer fail validation. - User settings now include a PGP tab where users can upload multiple public keys, choose a preferred key, browse the public keyserver, and use that public-key directory from the netmail compose flow when encrypting outbound mail.
- BBS-managed private key hosting is available behind a separate sysop toggle and is off by default.
- Auto Feed sources now have an option to prefix posted echomail subjects with the configured feed name, producing subjects like
[2600.network] TITLEOFPOSTbefore the FTN 72-character subject limit is applied. - MeshCore repeater adverts are now stored in a dedicated
meshcore_node_advertstable keyed by full public key. The CWN map/list and the public PacketBBS node directory still show MeshCore nodes after upgrade, but live advert writes no longer go intocwn_networks.
User Experience and Reader UI
- The user-facing echoarea subscription manager at
/subscriptionsnow uses a more compact filter layout modeled after/echolist, with network filtering and an option to show only interest groups that currently have message traffic. - Subscribing or unsubscribing from an echoarea in
/subscriptionsnow updates in place instead of reloading the page, preserving the current scroll position and active search/filter state. - The subscribed echomail message list now avoids duplicate unread-count work, skips unnecessary joins in its pagination count query, and deduplicates overlapping client-side refreshes, which reduces page-load time on systems with large echomail message bases.
- The browser notification-sound unlock path now respects each user's saved sound settings and no longer primes disabled sounds on first click. This avoids false notification sounds on Safari and Firefox when notification sounds are turned off.
- Local-only echomail areas now display with an explicit
@localsuffix in the web reader and compose UI, so area tags appear asCHAT@localinstead of looking like a domain-qualified remote echo.
Operations, Imports, and Localization
- The manual nodelist import page no longer relies on a browser
acceptfilter that attempted to matchZxxarchives with.z*. Valid weekly nodelist bundles such asLOVLYNET.Z25now show up normally in the file chooser instead of requiring users to disable the picker filter by hand. - The example nginx config in
docs/INSTALL.mdnow includes cache-control rules for/sw.js,.css, and.jsso updated frontend assets are revalidated more reliably. The nginx example remains untested and unsupported. - A new Russian interface translation is now bundled under the
rulocale, extending BinktermPHP's built-in language coverage for the web UI, API error text, and terminal strings.
Developer / Infrastructure
- Realtime wake-up signaling now has a small transport abstraction around PostgreSQL
LISTEN/NOTIFY. The current implementation is still PostgreSQL-only, but the directpg_*calls are now concentrated in dedicated realtime classes instead of being spread acrossBinkStream, the AI bot daemon, and the admin daemon. - Database bootstrap now has a minimal platform abstraction for DSN construction, session initialization, and base schema selection. PostgreSQL remains the only supported backend, but connection and setup behavior is no longer hardcoded in one place.
.envmay now includeDB_DRIVER=pgsql. PostgreSQL is still the only supported value today. This setting exists to make future backend setup work easier to isolate if it is ever pursued..envmay now includePIPE_CODE_PARSER_MODEto control how BBS pipe color codes are recognized by the web renderer and terminal bulletin renderer.- A new developer reference document,
docs/PostgreSQLDependencies.md, tracks intentional PostgreSQL-specific dependencies and where they currently live. - BinkP session logging now closes failed session rows more aggressively and retires orphaned
activerows whose handler process has already exited, so the admin BinkP session view no longer treats dead pre-handshake sessions as long-running live connections. - The
user_settings.themecolumn now allows up to 300 characters instead of 20 so custom theme stylesheet paths and longer theme identifiers can be stored without truncation.
1.9.7
1.9.7 requires PHP 8.2 or newer. If your server is still on PHP 8.1 or earlier, upgrade PHP first and verify the runtime before replacing application files or running php scripts/setup.php. The application will not run correctly on older versions.
The terminal server gains over two dozen new capabilities: bookmarks, full-text search, and sort options for both netmail and echomail; address book and FTN nodelist lookup in netmail compose; message delete, plain-text download, and forward-to-email from the reader; multi-area cross-posting; message drafts with in-editor save; an ignore-rule manager accessible without leaving the session; a selectable Who's Online popup with a public profile viewer; and a redesigned file browser with a modal detail view.
These sit alongside system-wide improvements including resize-aware repaints across all overlays, a configurable border style, a configurable main menu key map, configurable idle timeouts, and a Ctrl-K reference overlay that documents every key binding without cluttering the status bar.
On the PacketBBS side, radio operators can join local BBS chat rooms; a new PacketBBS Nodes map and directory has been added to the BBS Lists menu; two new interface types — Meshtastic and AX.25 TNC (KISS) — are available alongside MeshCore in the node registration modal; and bridge nodes gain optional location and description fields.
In the web interface, chat rooms now render inline media automatically, inline code is rendered correctly on dark themes, and the bulletin viewer has been updated to display text with the same preformatted style and modern system font as the message reader.
1.9.6
Chat Room Bridging (Matterbridge)
- Local BinktermPHP chat rooms can now relay messages to and from external platforms (Discord, Slack, IRC, and others) via the third-party Matterbridge gateway.
- A new Matterbridge Bridge Settings panel on Admin → Chat Rooms lets the sysop configure the global API connection (URL, token, bridge user, and default username suffix).
- Each chat room has new per-room bridge fields: enable/disable bridging and a Matterbridge gateway name that maps the room to a configured gateway in
matterbridge.toml. - Outbound bridging is handled in-process by
ChatMessageService. Inbound messages are injected by a new background daemon,scripts/matterbridge_daemon.php, which polls the Matterbridge API and inserts messages into local chat under a dedicated bridge user account.
AI Settings
- A dedicated AI Settings admin page is now available at Admin → AI Settings. It consolidates all AI-related configuration in one place.
- The Enable AI Assistant toggle, previously located on the BBS Settings page, has moved to the AI Settings page.
- A new Enable AI summaries for shared message links toggle controls whether the AI share summarizer feature is available to users.
- The system prompt used when generating share summaries is configurable directly on the AI Settings page. Leave it blank to use the built-in default.
Ollama AI Provider
- Ollama is now supported as a third AI provider alongside OpenAI and Anthropic. It can be used self-hosted (local inference, no API key, no per-token billing) or via the Ollama cloud service.
- Set
OLLAMA_API_BASEin.envto enable the provider. No other change is required for a self-hosted install. Cloud installs also setOLLAMA_API_KEY. - Token pricing follows the same
AI_PRICE_OLLAMA_*env var pattern used by other providers and defaults to zero, reflecting that local inference has no per-token cost. - Optional power cost tracking: set
OLLAMA_POWER_COST_PER_KWH_USDandOLLAMA_GPU_POWER_WATTSto have the system estimate electricity cost per request and record it in the AI usage ledger alongside token accounting. - Tool calling (required by the message reader AI assistant) is off by default. Set
OLLAMA_SUPPORTS_TOOLS=trueonly with a model that supports function calling, such asllama3.1,llama3.2, orqwen2.5.
AI Share Summarizer
- Users can now generate a one-sentence AI-written link preview description when sharing an echomail message. An AI button appears in the share dialog when this feature is enabled and an AI provider is configured.
- The generated description is stored with the shared message and used as the
og:descriptionmeta tag on the shared page, so link previews on social platforms and messaging apps show a meaningful summary of the post rather than generic site text. - The system prompt the AI receives can be customized in Admin → AI Settings.
Messaging
- The unread netmail count shown on the dashboard, the netmail sidebar, and the unread filter list now reflects only messages addressed to the logged-in user. Previously the count included outbound messages composed by the user, causing the badge to show a higher number than the unread inbox actually contained. Soft-deleted messages are also excluded from the unread sync so the count and the visible list always agree.
- Added a new web-reader Re-Post action for echomail and netmail. Re-post opens the composer with the original message body, preserves the original message charset and markup format, prefixes the subject with
FWD:, and leaves the recipient or target area unset so the user must choose where to send it. - Added a new echomail reader action to Forward by Netmail. This opens the netmail composer using the selected echomail message as the source, keeps the original charset and markup mode, prefixes the subject with
FWD:, and leaves the netmail recipient unset so the user can choose where to forward it.
Echomail
- The dashboard now includes a New Echoareas summary section listing echoareas that are available to subscribe to but haven't been subscribed to yet. The section can be collapsed and its state is remembered between page loads.
- The subscriptions page now shows a New badge beside echoareas that were recently added to the system, making it easier to discover areas added since the last visit.
- The subscriptions list now supports sorting by name, unread count, last-activity date, or subscription date.
- The plaintext echomail composer now has an Insert Image toolbar button (above the text area, matching the position of the Markdown toolbar). Clicking it prompts for an image file upload; once uploaded, the image URL is inserted at the cursor position so the image appears inline in the message body.
Shared Pages
- Fixed shared message pages so they no longer emit two
og:descriptiontags. Social previews now use the shared message's AI-generated summary (if one has been created) or subject/body excerpt, instead of also including the site-wide description from the global appearance settings. - Applied the same metadata override pattern to shared file pages so file shares also emit a single page-specific
og:descriptionvalue. - The echomail share dialog now displays any existing share links for the same message, including links created by other users. Each link shows the sharer's username and a one-click copy button, so users can copy an existing link without creating a duplicate.
- The sharing icon in the echomail message list now appears whenever any user has an active share for a message, not just the currently logged-in user.
- Users can now upload a custom preview image when creating a shared echomail link. The image is stored in the sharer's private file area and served at a dedicated URL that includes the file extension, so social platforms and messaging apps that infer image format from the URL can display it correctly. The image appears as the
og:imageandtwitter:imagemeta tags on the shared page.
Sharing Analytics
- Shared message and shared file page visits now record external HTTP referrers, allowing the system to show which outside sites are sending traffic to shared links.
- Admin → Analytics → Sharing now includes a Top Referrers column for each active shared message and shared file, listing the most common external URLs that led visitors to that share.
- Shared message page loads no longer count twice when the browser fetches the page shell and then loads the message JSON. View totals for shared messages now reflect one counted access per page visit.
Markdown Editor
- Fixed the Markdown editor inserting unnecessary backslash escapes before underscores and hyphens when composing messages in WYSIWYG mode. Characters typed in plain text (for example underscores in usernames or filenames, and hyphen runs used as dividers) were being stored with backslash prefixes such as
\_or\-\-\-, which could appear as literal backslash sequences in some renderers.
Terminal Server
- Terminal login, main-menu, and goodbye art screens now support simple rotating file families. You can keep a single file such as
telnet/screens/login.ans, or add numbered variants such astelnet/screens/login1.ans,telnet/screens/login2.ans,telnet/screens/mainmenu1.sixel, andtelnet/screens/bye1.ans. - When multiple matching files exist for the same screen family and file type, the terminal server now uses a glob match and randomly selects one file each time that screen is shown.
Documentation
- Moved installation instructions from
README.mdinto a dedicateddocs/INSTALL.mdand overhauled it: restructured around a clear two-user model (admin account vs. dedicatedbinktermphpsystem account), added a BBS user creation section, moved PostgreSQL setup into its own section, addedSITE_URLconfiguration guidance with common scenario examples, added a firewall rules preface to the network ports section, grouped unsupported web servers under a single heading, added a PHP built-in server safety warning, and added a Next Steps section pointing to the getting-started guide. - Expanded the user guide with a dedicated message reader section that explains the web reader interface and lists the supported keyboard shortcuts for both echomail and netmail readers. The translated user guide variants were updated to include the same section.
- Added
docs/ARCHITECTURE.md— a new system architecture reference covering the full daemon map, component diagram, FTN packet lifecycle (inbound and outbound), daemon IPC model, door game subsystem, and AI pipeline. - Added
docs/DATA_MODEL.md— a conceptual overview of the key database tables and their relationships, written as a mental model for developers rather than a schema dump. - Added
docs/WebDoor-Tutorial.md— a step-by-step tutorial for building a WebDoor from scratch, covering the manifest, PHP entry point, SDK usage, credit integration, and enabling in admin. - Added an authentication quickstart to
docs/API.mdwith a complete login request/response example and a follow-up authenticated request, generated as part of the API doc build so it is preserved on regeneration. - Restructured
docs/index.md: AI & Integrations promoted above Doors & Games; Access Methods section now includes Gemini and PacketBBS; "Content & Display" renamed to "Content & Media"; new documents added throughout. - Expanded the
docs/DEVELOPER_GUIDE.mdarchitecture section with a full system diagram and a daemon reference table listing all processes, their purposes, and whether they are required or optional. - Added new reference pages to
docs/: Gateway Token Authentication, Markdown and StyleCodes, Nodelist, Performance Tuning, Shoutbox, Bulletins, Voting Booth, Dashboard, and Analyti...
1.9.5
Inline Media Player
- Added an inline media player to the web message reader. URLs in echomail and netmail message bodies that point to supported video platforms, oEmbed-compatible services, or raw media files can be automatically embedded as playable inline players. Supported platforms include YouTube, Odysee, Rumble, BitChute, Brighteon, PeerTube, Bastyon, Twitter/X, SoundCloud, TikTok, and ReverbNation. Direct links to video, audio, image, tracker module, SID, and MIDI files are also embedded inline.
- The user preference formerly called "Image load mode" has been renamed "Inline media rendering" and controls whether embeds load automatically or require a user click to expand. All existing accounts are migrated to click-to-expand on upgrade. The default for new accounts is also click-to-expand.
- Sysops can globally enable or disable the media player and toggle individual providers from Admin → Appearance → Message Reader. The media player is disabled by default on fresh installations.
- Added a Networks admin page that stores network-level message policy settings separately from BinkP uplink connection details. The upgrade migrates existing uplink-level
allow_markup,allow_media,default_charset, andposting_name_policyvalues into network rows and removes those migrated keys fromconfig/binkp.json. - Added per-network and per-area inline media controls. Sysops manage the network default in Admin → Networks. Each echo area in the echo area manager has an "Inline Media Rendering" setting that can be set to inherit from its network, or explicitly enabled or disabled.
- The user settings page now shows a notice when the sysop has disabled inline media globally, rather than presenting controls that have no effect.
Echoarea Message Count
- Fixed the admin echomail bulk-delete endpoint so it recalculates
echoareas.message_countafter removing messages. Previously, bulk-deleting messages left the cached counter inflated, causing the echoarea list to report more messages than actually exist. Installations where bulk deletions were performed before this upgrade can correct the drift by runningphp scripts/check_message_counts.php --fix. - Added a
--fixflag toscripts/check_message_counts.php. With--fix, the script recalculates and corrects any driftedmessage_countvalues in addition to reporting them.
BBS Directory CLI
- Added
scripts/dlimport_bbslist.php, a cron-friendly wrapper that downloads the current monthly Telnet BBS Guide archive (ibbsMMYY.zip) fromhttps://www.telnetbbsguide.com/bbslist/and runsscripts/import_bbslist.phpagainst the downloaded ZIP. - The script supports explicit month/year selection, explicit filenames, dry-run imports, and quiet mode for scheduled jobs.
Auto Feed
- Added a source type field to Auto Feed so the existing cron-driven poster can support additional source adapters beyond RSS/Atom. Existing feed rows are migrated to
rss. - Added a Bluesky source adapter. Public Bluesky profile URLs can be configured in Admin → Auto Feed and are polled by
scripts/rss_poster.php. Posts without media attachments are skipped; media URLs from Bluesky image embeds are included in the generated echomail body so the inline media renderer can process them. - The inline media renderer now recognizes Bluesky CDN image URLs, including CDN paths that do not end with a traditional image file extension.
- Auto Feed messages now use
BinktermPHP Auto Feedfor the generated tagline and tearline component instead of the older RSS-specific text.
Auto Feed
Auto Feed now stores a source_type for each configured source. The database migration adds this column with a default of rss, so existing RSS/Atom sources continue to run without manual changes.
To add a Bluesky source, open Admin → Auto Feed, create or edit a feed source, set Source Type to Bluesky, and use a public profile URL such as https://bsky.app/profile/example.bsky.social. The existing cron command remains the same:
php scripts/rss_poster.phpThe Bluesky adapter uses the public author feed endpoint, skips reposts and text-only posts, and posts only source items that expose image/media URLs.
Messages posted by Auto Feed now identify the poster component as BinktermPHP Auto Feed in generated message metadata, including the visible tearline at the bottom of the message body.
Database Migration Fix
- Fixed a regression from the set-based migration tracker change. Legacy semantic-version migrations (e.g.
v1.4.9) are included in the basepostgres_schema.sqland were never recorded individually indatabase_migrations, causing them to re-apply on upgrade. The tracker now skips any legacy migration at or below the highest already-recorded version, restoring the original behavior.
Message Search
- Fixed echomail and netmail search results being replaced by the full message list when the background auto-refresh fired (on new-message events from BinkStream or when the browser tab was restored after being hidden). Search results now stay on screen until explicitly cleared.
Message Reader
- Fixed the message reader modal so the
fkey shortcut for toggling full-screen no longer intercepts the browser's Ctrl+F (or Cmd+F on Mac) find shortcut. Ctrl+F and Cmd+F now open the browser's native find dialog as expected. Applies to both echomail and netmail message modals.
Content and Display
- Added a Discord invite link option to the Messaging menu. Sysops can paste a Discord server invite URL in Admin → Appearance → Message Reader. When set, a Discord entry appears in the Messaging navigation dropdown for all users.
- Added a Bulletin Manager for sysop-authored BBS bulletins. Bulletins can be managed from the admin web interface and displayed to users in the web, telnet, and SSH BBS flows.
- Added a BBS setting for bulletin display mode. Sysops can choose whether bulletins are shown once until read, or shown once at the start of each login session.
- Renamed the Community Wireless Node List WebDoor to Community Wireless Node Map.
- Fixed the Community Wireless Node Map network count so it reports the full active map total instead of stopping at the first 500 returned rows. The map now loads markers for the current viewport instead of loading every CWN row on page load.
- Fixed the terminal full-screen message editor so typed text is hard-wrapped to the detected terminal body width. Messages composed in telnet and SSH now display with the same line breaks when viewed in the terminal message reader.
- Fixed terminal message display so UTF-8 message text, subjects, sender names, and kludge/header lines are converted to the user's active terminal character set before being written to telnet or SSH sessions.
- Updated the terminal echomail empty-state text to tell users when they are not subscribed to any echo areas, instead of implying that no areas exist.
- Fixed terminal echomail area labels for local echo groups that have no domain. Telnet and SSH now show plain area names such as
LOCAL.TESTinstead of appending an empty@suffix. - Fixed the terminal language selector so it shows all installed languages rather than a fixed list of three.
- Added support for locale-specific documentation files. The user guide and admin help browser now serve translated Markdown files when available, falling back to the English source when no translation exists. Any locale directory added under
config/i18n/now appears automatically in the telnet and SSH settings language list. - Added translated user guides for French (
index.fr.md), Spanish (index.es.md), Italian (index.it.md), and German (index.de.md). These are served automatically when the user's active language matches the locale. - Renamed the dashboard's top mail summary card to "Mail & Areas" and added a NEW ECHOAREAS section that lists active echo areas created in the past 30 days. Non-admin users do not see sysop-only areas in this list. The section includes Manage Subscriptions and Manage Interests buttons for quick access to echo area subscription management.
- Fixed the web settings page so saving one changed preference no longer resubmits every setting from every tab. The page now shows a loading overlay until the user's saved settings are loaded, then saves only changed preferences so unrelated settings are not overwritten by stale or unloaded form values.
- Added sorting controls to the user's Manage Subscriptions page. Users can sort echo area subscriptions by name, date created, or number of messages, with ascending and descending order controls.
Terminal Registration
- The admin pending users list now shows whether each registration was submitted through the web, telnet, or SSH, using a color-coded badge.
- Email address and reason for joining are now required fields when registering via telnet or SSH. The registration flow re-prompts until both are provided.
File Areas
- Added a File Name field to the Add Link form. When adding an external URL link to a file area, users can now set a specific display name for the link. The field is pre-populated from the URL path when a URL is entered, and updated to the page title when Fetch Info is used — both values can be freely edited before submitting.
- Fixed URL metadata fetching for YouTube links. The Fetch Info button now uses the YouTube oEmbed API instead of scraping the page HTML, resolving an issue where production servers received generic placeholder metadata rather than the actual video title and thumbnail.
1.9.4
Echomail Performance Improvements
- Echolist page: Loading the echo area list on systems with large message bases (80K+ messages) previously required two full-table scans of the
echomailtable per request to compute total message counts and last-post metadata. The query now reads cached values from new columns on theechoareastable, eliminating those scans. Two database migrations apply the schema change and backfill the cache from existing data. - Dashboard unread badge: The dashboard unread echomail count previously scanned every echomail message and joined against every per-message read record to count unread items. On large installs this query took 2–6 seconds. The badge now counts messages using an indexed watermark, reducing the query to a fast range scan.
- Configurable echomail badge mode: The dashboard echomail badge behavior is now a user setting under Settings → Messaging. The default mode counts messages that arrived since your last visit to an echomail page; an alternative mode counts total messages above the per-area read watermark. The dashboard card label has been updated from "Unread Echomail" to "New Echomail." Per-message bold/unread state inside the message list is unchanged.
Shoutbox
- ANSI and URL rendering: Shoutbox messages now render ANSI color codes and clickable URLs using the same rendering pipeline as echomail messages. Previously, message text was displayed as plain escaped text.
Telnet Daemon
- Connection rate limiting: The telnet daemon now rejects repeated rapid connections from the same IP address before forking a new process for each one. The limit is configurable via two
.envvariables (TELNET_RATE_LIMIT_MAX,TELNET_RATE_LIMIT_WINDOW) and is enabled by default. SetTELNET_RATE_LIMIT_MAX=0to disable it.
Localization
- Spanish and French orphaned keys: Four translation keys that no longer exist in the English baseline were present in the Spanish (
es) and French (fr) catalogs. These orphaned entries have been removed from both catalogs. - New
check_i18n_extra_keys.phpscript: A new developer utility detects translation keys in non-English catalogs that are absent from the English baseline, complementing the existingcheck_i18n_missing_keys.phpscript. - New
check_i18n_syntax.phpscript: A new developer utility runsphp -lon every catalog file and reports parse errors before they can cause HTTP 500 errors in production.
Bug Fixes
- Echo area management: When deleting an echo area that still has messages, the API correctly rejected the request but the error message was never displayed to the user. The delete confirmation modal also stayed open after the failure. Both issues are now resolved — the modal closes and the error is shown.
- Error and success alert display: A long-standing bug caused all
showErrorandshowSuccessalerts throughout the application to be silently discarded rather than inserted into the page. Alerts now appear correctly at the top of the page content.
PacketBBS Gateway
- Mesh/radio text gateway: PacketBBS provides a compact text command interface for MeshCore-style radio bridges. The gateway supports login, online-user lookup, netmail reading/replying/sending, echomail area browsing, echomail reading/replying/posting, paging, and quitting.
- Compact radio UX: PacketBBS responses are optimized for short radio text exchanges rather than full-screen BBS terminal use. Help is brief by default, message lists are compact, message reads use short headers, and compose mode accepts
/SENDand/CANCEL. - Admin-managed nodes: Sysops can manage registered PacketBBS bridge nodes from the admin Packet BBS page, generate per-node API keys, view active sessions, and inspect the outbound queue.
- TOTP authentication: PacketBBS radio login uses a TOTP authenticator code rather than the user's web password. Users must enroll under Settings -> Account by scanning the PacketBBS QR code into an authenticator app.
CWN MeshCore Node Mapping
- Automatic repeater mapping: The Community Wireless Node List WebDoor can now receive MeshCore repeater advertisements from the binkterm-php MeshCore bridge and display them on the CWN map without manual user submission.
- 2-day rolling visibility: MeshCore-sourced CWN entries remain in the database but are hidden from map and search results when they have not been heard for more than 2 days.
- Bridge update required: Sites using
binktermphp-meshcorebridgemust update that separate bridge repository so it forwardsnew_advertpackets and startup contact-list records to the new BBS endpoint.
1.9.3
Interest Area Management
- The interest subscription widget now lets users manage individual echo areas within an interest via a new Manage Areas dialog, replacing the previous unsubscribe-only flow.
Localization
- Italian translation updated with new interest area management strings. Thanks to Freddy Krueger for providing the Italian translation.
Bug Fixes
scripts/echomail_maintenance.php: Fixed a PostgreSQL foreign key violation that caused the maintenance script to abort when deleting messages that other messages referenced viareply_to_id. The script now NULLs those references before deleting the parent messages.
1.9.2
AI Assistant
- BinktermPHP 1.9.2 introduces an optional AI Assistant for the web message readers.
- In echomail, users can open the assistant from the area toolbar or directly from the message reader modal, where the current message is pre-selected as context.
- The assistant can summarize a message, explain terminology, and summarize the surrounding thread by retrieving real message data through the built-in MCP server integration.
- MCP server logs now record which authenticated user invoked each MCP tool, along with the tool name and client IP, making AI-assisted message access easier to audit operationally.
- Enablement is controlled by
ai_assistant.enabledin BBS settings. - The current reader assistant implementation requires an Anthropic API key and a reachable MCP server URL.
- A new credits setting,
credits.ai_credits_per_milli_usd, lets sysops optionally charge BBS credits based on estimated AI request cost.
Admin Credit Grants
- Admins can now add credits directly to a user's account with an explicit note recorded in the ledger.
- Manual grants are stored as
admin_adjustmenttransactions, so they remain auditable alongside the normal credit history. - The Grant Credits section is available in the edit-user modal at Admin → Users.
JS-DOS Doors
- BinktermPHP now supports JS-DOS Doors, a new browser-side door type for classic DOS games such as Doom.
- Unlike traditional DOS doors, JS-DOS Doors run entirely in the user's browser using WebAssembly-powered DOS emulation. No per-session server-side DOSBox process is launched.
- JS-DOS games appear in the
/gameslisting alongside DOS Doors, Native Doors, WebDoors, and C64 Doors with their own[JSDOS]badge. - Games are defined by
jsdosdoor.jsonmanifests underpublic_html/jsdos-doors/{game-id}/. - Save files can be synchronized back to the server, allowing users to keep their game progress between sessions.
- JS-DOS Doors also support multiple modes, including an optional admin-only configuration mode for running setup tools and saving shared defaults for all players.
- A new interactive command-line wizard,
scripts/jsdosdoor_createmanifest.php, guides you through creating ajsdosdoor.jsonfor any DOS game. It scans theassets/directory, prompts for title and executable, suggests AI-generated author and description metadata, and produces a ready-to-use manifest including an admin setup mode and a placeholdericon.png.
Terminal Registration Handling
- Telnet and SSH registrations now preserve the applicant's real reason for joining instead of replacing it with a transport label.
- Browser-only anti-spam bypass for terminal-origin registrations now uses dedicated transport signaling rather than overloading the visible reason field.
TERMINAL_REGISTRATION_SECRETnow defaults toChang3Me, so fresh installs work without extra setup, but production systems should replace it with a site-specific value.
Image Rendering in Terminal Services
- Telnet and SSH message readers can now render inline Markdown images as Sixel graphics when both the server and client support it.
- Messages with images expose an
Ikeybinding and direct number shortcuts so users can open embedded images from the terminal reader. - Systems without
img2sixelor clients without Sixel support fall back gracefully to text placeholders.
Sixel Login and Menu Screens
- The terminal server now supports optional Sixel Welcome, Main Menu, and Goodbye screens in addition to the existing ANSI art workflow.
- Sixel files are managed from Admin → Appearance → Terminal Server → Sixel Graphics and are shown only to clients that advertise Sixel support.
- No database migration is required; systems without Sixel files continue using ANSI or the built-in text banner.
Door Session Expiry Enforcement
- Door session expiry is now enforced when checking capacity, allocating nodes, listing active sessions, and resuming existing sessions.
- Stale abandoned sessions are cleaned automatically when new door sessions start and during periodic web-request maintenance.
- No database migration is required, and existing stale sessions are cleaned up automatically after upgrade.
Insecure FREQ Support
- The binkp security option Insecure Receive Only previously blocked all outbound sending during unauthenticated sessions, including responses to file requests (FREQs).
- A new option,
insecure_allow_freq, lets sysops allow FREQ responses during insecure sessions while still preventing mail packets and hold files from being delivered to unauthenticated callers. - The option is
falseby default, preserving the existing behavior for installations that do not need anonymous FREQs. - The toggle is available in Admin → BinkP Config → Security.
Bug Fixes
- Select mode checkboxes disappear on background refresh — Entering bulk-select mode in the echomail or netmail message list and then waiting for a background refresh caused all checkboxes to vanish. Select mode state and previously checked rows are now restored after every background re-render.
- Phantom unread counts in echomail sidebar — Echo areas could show a non-zero unread badge while the message list showed nothing. The sidebar's unread count query was including future-dated messages that the list correctly hid. Both queries now apply the same future-date filter.
- "Go to next unread echo" showing only Close — The end-of-echo prompt sometimes showed only a Close button even when other echo areas had unread messages. The echo area list is now refreshed before the prompt appears, and the unread-echo search now wraps around the end of the list.
1.9.1
Markdown WYSIWYG Compose Editor
- When composing a Markdown message, the plain textarea is replaced by a rich editor with a formatting toolbar and side-by-side Edit/Preview tabs.
- Toolbar buttons cover bold, italic, H1–H3, inline code, code block, link, image, unordered and ordered lists, blockquote, and horizontal rule. Keyboard shortcuts Ctrl+B, Ctrl+I, and Ctrl+K are supported.
- Pasting a bare URL into the editor prompts the user to fetch an Open Graph preview and insert a formatted link card in place of the raw URL.
- The Preview tab renders a close approximation of how the message will appear to recipients.
Markdown Heading Rendering
- H1 headings in rendered Markdown messages now display with a double underline; H2 headings display with a single underline, matching the visual convention used by the compose editor's preview.
- Heading font sizes now scale proportionally with the user's configured message font size instead of being collapsed to the same size as body text.
Echomail Moderation
- New users' echomail posts can be held for admin review before being distributed to the network. This feature is disabled by default and must be enabled by the sysop.
- An admin-configurable approval threshold automatically promotes users to unmoderated posting once they have accumulated a sufficient number of approved posts.
- A moderation queue page is available at Admin → Area Management → Echomail Moderation where pending posts can be previewed and approved or rejected.
- The Admin menu and the Echomail Moderation item highlight in yellow when posts are waiting for review.
- Existing users who have previously logged in are grandfathered in and bypass moderation automatically.
- Admins always bypass moderation regardless of post count.
Polls
- The poll list now shows unvoted polls before polls the user has already voted on, so newly created polls always appear at the top.
- Within each group, polls are ordered newest first.
File Area URL Links
- File areas now support external URL links in addition to uploaded files.
- URL link entries display a link icon, show a dash for file size, and present a Visit button instead of a download button throughout all file listing views (area files, recent uploads, My Uploads, and file search results).
- The file information modal on the echomail page shows a Visit button for URL link entries.
MCP Server
- The MCP server (
mcp-server/server.js) had a memory leak where each request allocated a newMcpServerinstance that was never explicitly closed, causing memory to grow steadily over time. The server is now properly closed when the HTTP response ends.
Optional Spaces in Usernames
- A new
.envsetting,USERNAMES_ALLOW_SPACES, controls whether usernames may contain single internal spaces (e.g.Phantom of Doom). The setting defaults tofalse; existing behaviour is unchanged unless you opt in. - When enabled, the registration form accepts handles containing single spaces between word characters. Leading and trailing spaces are trimmed automatically, and consecutive spaces are collapsed to one before validation runs.
- The admin terminal
fingerandmsgcommands now handle multi-word usernames correctly. Themsgcommand accepts a quoted username syntax (msg "Dark Knight" hello) for names that contain spaces.
User Guide
- A built-in User Guide is now available at
/user-guide, covering the dashboard, echomail, netmail, doors, file areas, and exploring BBS networks. - The guide is linked from the user dropdown menu under User Guide, grouped with a divider above the Logout option.
- No configuration or database changes are required.
Dashboard Layout Customization
- Users can now reorder and rearrange dashboard cards to suit their preferences using a Customize Dashboard button at the top of the dashboard.
- Cards can be dragged between the main column and the sidebar, reordered within each column, and individually shown or hidden. The "Unread Mail" card is always visible and cannot be hidden.
- Layout preferences are saved per user and persist across sessions. A Reset to Default option restores the original layout.
Sysop Default Dashboard Layout
- Sysops can now configure the default card layout that users see before they have saved a custom layout of their own.
- The setting is in Admin → Appearance & Content on a new Dashboard tab, which appears first in the tab list.
- Cards are arranged by drag-and-drop into three columns: Main Column, Sidebar Column, and Hidden by Default.
- Cards labelled Admin Only or marked with a feature badge will still only appear for users with the appropriate access level, regardless of where the sysop places them.
AI Bots
- Sysops can create AI-powered bot personas that participate in local chat.
- Each bot has its own system user account, a configurable system prompt, a choice of AI provider and model, and a weekly API cost budget.
- Bots appear in the chat online users list with a robot icon and respond to direct messages and @mentions in rooms.
- Managed from Admin → Community → AI Bots.
- A new background daemon,
scripts/ai_bot_daemon.php, must be started and kept running for bots to respond.
Chat Markdown Rendering
- Chat messages are now rendered as Markdown, allowing bold, italic, inline code, code blocks, lists, and other formatting to display properly in the chat interface.
- Rendering is performed server-side using the existing Markdown renderer, so no client-side library is required.
BBS List and Nodelist Browser for Term Server
- The terminal server (Telnet/SSH) now includes a B) BBS Directory menu option that displays the site's BBS directory as a paginated, browsable list. Selecting an entry shows full details including sysop, location, OS, telnet address, website, and notes.
- A L) Node List menu option is also available when a nodelist has been imported. Users can search by system name, sysop name, location, or FTN address, and view full node details including flags.
- Both options appear automatically when their respective features are available (BBS directory feature flag enabled; nodelist table populated). No configuration changes are required.
File Areas Markdown Customization
- The sidebar info panel and footer fields in Admin → Appearance & Content → File Areas now accept Markdown.
- Both fields include a Preview button to render the Markdown before saving.
Redesigned Terminal Server Main Menu
- The terminal server (Telnet/SSH) main menu has been reorganised into a two-column sectioned layout with category headers: Messaging, Community, Explore, Files, and Settings.
- The menu box is wider to accommodate the two-column layout.
Blackjack WebDoor: Play Chips
- The Blackjack WebDoor no longer wagers real BBS credits. It now uses a session-based play chip count with no monetary value.
- Players start each session with 1,000 play chips (configurable by the sysop). Running out of chips automatically resets the count to the starting amount.
- The credits system is no longer required to play Blackjack. The game is available regardless of whether the BBS credits feature is enabled.
- The leaderboard score reflects chips won during the session rather than credits earned.
URL Link Open Graph Image Preview
- When a URL link's preview is opened, the system fetches the linked page's
og:imagemeta tag server-side and displays the image above the description. - The upload modal has a new Add Link tab where a URL can be submitted with a short and long description.
- A Fetch Info button retrieves the page title and description from the URL automatically to pre-fill the description fields.
- URL links appear in file listings alongside regular files, marked with a link icon. Clicking the filename opens a preview card showing the descriptions and a Visit button.
- URL links go through the same approval workflow and credit system as file uploads.
- Admins can edit the URL of a link record from the file edit dialog.
1.9.0
Outgoing Message Charset
- Outgoing FTN messages now default to CP437 (IBM PC / DOS) instead of UTF-8. This minimizes text display issues on legacy networks such as FidoNet where many nodes run software that does not support UTF-8 encoding. The default can be changed in Admin → BBS Settings, and individual uplinks can override it with their own charset setting. Local echo areas always use UTF-8 regardless of this setting. Replies still inherit the charset of the message being replied to when possible.
- The LovlyNet registration script (
scripts/lovlynet_setup.php) now setsdefault_charsettoUTF-8on the LovlyNet uplink automatically. Since LovlyNet is a modern UTF-8 network, this ensures messages are encoded correctly without requiring manual configuration after registration. - Netmail charset selection now correctly applies per-uplink charset overrides using the same routing logic used to pick the origin address. The compose form's charset selector is also updated dynamically when the destination address is entered, matching the behavior already present for echomail area selection.
Security Fixes
- The optional MCP server now updates its
path-to-regexpdependency from8.3.0to8.4.0. - This release addresses
CVE-2026-4926(GHSA-j3q9-mxjg-w52f) andCVE-2026-4923(GHSA-27v5-c462-wpq7) in the MCP server dependency tree.
Logging
- When a web-server PHP process cannot write directly to an application log file, it now sends the log entry to the admin daemon so the daemon can append it to the correct log file instead.
- Door session setup events (session start, node allocation, DOSBox launch) are now written to
data/logs/dosdoor.log. Activity during actual door execution continues to be logged by the multiplexing bridge server todata/logs/multiplexing-server.log.
BinkP
- Outbound routing now checks for an exact configured uplink address match before falling back to network-based uplink selection. This allows multiple uplinks on the same FTN network, so messages explicitly addressed to a specific uplink node can be routed through that uplink instead of being matched only by shared network patterns.
- Outbound FTN packet message bodies now use bare CR (
\r, 0x0D) as the line separator, as required by FTS-0001. Previously all line terminators were written as CRLF (\r\n), which caused interoperability problems with remote nodes that enforce strict FTS-0001 parsing — most visibly a spurious LF after the* Origin:line. - The inbound and outbound queue lists on the BinkP administration page now refresh automatically every 15 seconds. Files that are processed or transferred while the page is open are removed from the list without requiring a manual refresh.
Robots
- The echomail robot processor type previously displayed as "Auto-Reply" is now displayed as "TEST Area Auto Responder" to better describe its purpose. No configuration changes are required; the internal processor type identifier (
auto_reply) is unchanged.
Caddy Configuration
- The recommended Caddy configuration has been updated. If you use Caddy, a one-time manual edit to your Caddyfile is required to ensure static files and subdirectories with
index.html(such as WebDoors and the C64 emulator) are served correctly instead of being routed through PHP.
Markdown Images
- Images uploaded through the echomail message editor are now served at human-readable URLs in the form
/echomail-images/{username}/{name}-{hash}.pnginstead of a raw SHA-256 hash path. Existing embedded images continue to resolve through the old hash-based URL so no message editing is required. A one-time database migration backfills the new URL slug for existing uploaded images.
Terminal Server Settings
- The telnet/SSH terminal server now includes a dedicated settings screen so users can change their own preferences, profile details, and account password directly from the text interface. The terminal login screen also now includes a lost-password reset path that starts the same email reset flow as the web form, including support for username, real name, or email address lookup. The settings screen includes tabbed navigation, in-place save behavior, centered save/discard feedback, and a full-screen signature editor with signature-specific wording.
File Previewer
- The file area previewer now supports Commodore 64 SID music files (
.sid). Clicking a SID file opens an in-browser player powered by the bundled wothke/websid WebAssembly emulator. The player displays the embedded title, author, and release year from the SID header and supports multi-subtune files via a track selector. SID files inside ZIP archives are also playable from the archive browser. - The SID player now includes a real-time spectrum visualizer showing 48 frequency bars that decay smoothly when playback is paused or stopped. Playback is manual — the player loads ready to play and waits for the user to press Play.
- Non-ZIP archive listing (RAR, 7-Zip, TAR, LZH, etc.) now enforces a configurable maximum file size before invoking the 7z tool. Archives that exceed the limit display a message and a download link instead of timing out. The limit defaults to 20 MB and is controlled by
ARCHIVE_LIST_MAX_SIZEin.env. ZIP archives are not affected because their file listing reads only the central directory index and does not require 7z. - The file area previewer now supports
.torrentfiles. Clicking a torrent file displays a metadata card showing the torrent name, total size, comment, creation date, software that created it, piece size and count, tracker URLs, whether DHT/PEX is disabled, and a computed magnet link. Multi-file torrents also list every file contained in the torrent with individual sizes. A magnet icon button appears in the preview toolbar next to the download button and copies the magnet link to the clipboard when clicked.
File Upload
- When a
.torrentfile is selected in the upload dialog, the short description field is automatically pre-filled from the torrent's name (or comment, if the name is absent and the comment is not a URL). For multi-file torrents, the long description field is pre-filled with one file path per line. A torrent metadata preview card is also shown in the dialog so the contents can be verified before submitting.
Message Composer
- Saving an echomail or netmail draft now preserves the full compose state: message encoding (charset), markup format (plain, Markdown, Style Codes), hard-wrap setting, tagline selection, and cross-posted echo areas. When the draft is reopened, all of these fields are restored to the values that were in effect when the draft was saved. Previously, only the primary echo area, message text, subject, and recipient fields were saved; the encoding, markup type, wrap setting, tagline, and cross-post selections were silently discarded. A database migration (
v1.11.0.70) adds ametaJSONB column to thedraftstable to hold this additional state.
BBS Directory
- Each BBS listing now has its own dedicated information page at
/bbs-directory/{id}. The page displays the BBS name, sysop, location, telnet and SSH addresses, website, software, OS, notes, and last-seen date. A small map is shown when coordinates are available. BBS names in the main directory listing now link to their detail pages. - The BBS directory page now carries its own meta description, Open Graph tags, Twitter Card tag, and a
CollectionPageJSON-LD structured data block. The page title has been updated to include "Telnet Bulletin Board Systems" for better keyword coverage. - The Notes field label in the admin BBS directory edit form has been updated to "Notes about what this system offers (public)" to make clear that the field is user-facing.
Dashboard
- Usernames in the shoutbox are now clickable links that navigate to the user's profile page.
- The Today's Callers list (visible to admins) has been moved out of the System Information card into its own dedicated card. Usernames in the list are now clickable links to each user's profile page.
- Today's Callers now includes users who logged in today (sourced from the persistent login activity log, so they remain visible after logout) and users with an active session that has activity today (covers long-lived cookie accounts). The column previously labelled "Last seen" has been renamed to "Last Call".
Bug Fixes
- Switching to a different uplink in the AreaFix Manager now automatically reloads the message history for the active tab. Previously the history panel was cleared but not repopulated, leaving it blank until the Refresh button was clicked manually.
- Users can now log in using their real name as well as their username. Both fields are case-insensitive and unique, so there is no ambiguity.
- Opening a saved netmail message in the message modal and clicking the save button unsaved it correctly from the message list, but the same button inside the modal always showed "Save" instead of "Saved" and would re-save rather than unsave. The single-message API query for netmail was missing the
saved_messagesjoin, sois_savedwas never included in the response. The join has been added so the modal reflects the correct saved state on open. - Deleting a file from the web file browser now keeps the user in the same file area and subfolder after the page refreshes its sidebar state, instead of returning to the main
/filesindex. - Cross-posted echomail copies now preserve the same markup context as the primary post, so Markdown posts continue to carry their outbound markup kludge and formatting metadata on every selected destination instead of only the first area.
Documentation
scripts/import_bbslist.phpis now documented indocs/CLI.md, including how imports merge with locally-edited BBS Directory entries.- A FAQ entry has been added clarifying that the "automated AI echo...