Skip to content

Releases: awehttam/binkterm-php

1.9.9

Choose a tag to compare

@awehttam awehttam released this 27 Jun 16:37
66be1de

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.php directly 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=DOMAIN now preserve the selected area correctly instead of internally resolving to AREA@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.com and instagram.com links, 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

Choose a tag to compare

@awehttam awehttam released this 20 Jun 15:14
979912b

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 CHRS kludge. 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 rebuild message_text from raw_message_bytes when 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 like AT&T_CHAT no 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] TITLEOFPOST before the FTN 72-character subject limit is applied.
  • MeshCore repeater adverts are now stored in a dedicated meshcore_node_adverts table 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 into cwn_networks.

User Experience and Reader UI

  • The user-facing echoarea subscription manager at /subscriptions now 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 /subscriptions now 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 @local suffix in the web reader and compose UI, so area tags appear as CHAT@local instead of looking like a domain-qualified remote echo.

Operations, Imports, and Localization

  • The manual nodelist import page no longer relies on a browser accept filter that attempted to match Zxx archives with .z*. Valid weekly nodelist bundles such as LOVLYNET.Z25 now 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.md now includes cache-control rules for /sw.js, .css, and .js so updated frontend assets are revalidated more reliably. The nginx example remains untested and unsupported.
  • A new Russian interface translation is now bundled under the ru locale, 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 direct pg_* calls are now concentrated in dedicated realtime classes instead of being spread across BinkStream, 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.
  • .env may now include DB_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.
  • .env may now include PIPE_CODE_PARSER_MODE to 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 active rows 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.theme column 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

Choose a tag to compare

@awehttam awehttam released this 22 May 16:28
1748cc1

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

Choose a tag to compare

@awehttam awehttam released this 16 May 14:38
7d1959b

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_BASE in .env to enable the provider. No other change is required for a self-hosted install. Cloud installs also set OLLAMA_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_USD and OLLAMA_GPU_POWER_WATTS to 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=true only with a model that supports function calling, such as llama3.1, llama3.2, or qwen2.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:description meta 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:description tags. 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:description value.
  • 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:image and twitter:image meta 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 as telnet/screens/login1.ans, telnet/screens/login2.ans, telnet/screens/mainmenu1.sixel, and telnet/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.md into a dedicated docs/INSTALL.md and overhauled it: restructured around a clear two-user model (admin account vs. dedicated binktermphp system account), added a BBS user creation section, moved PostgreSQL setup into its own section, added SITE_URL configuration 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.md with 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.md architecture 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...
Read more

1.9.5

Choose a tag to compare

@awehttam awehttam released this 09 May 16:26
8d49855

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, and posting_name_policy values into network rows and removes those migrated keys from config/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_count after 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 running php scripts/check_message_counts.php --fix.
  • Added a --fix flag to scripts/check_message_counts.php. With --fix, the script recalculates and corrects any drifted message_count values 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) from https://www.telnetbbsguide.com/bbslist/ and runs scripts/import_bbslist.php against 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 Feed for 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.php

The 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 base postgres_schema.sql and were never recorded individually in database_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 f key 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.TEST instead 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

Choose a tag to compare

@awehttam awehttam released this 02 May 15:02
f3bdff3

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 echomail table per request to compute total message counts and last-post metadata. The query now reads cached values from new columns on the echoareas table, 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 .env variables (TELNET_RATE_LIMIT_MAX, TELNET_RATE_LIMIT_WINDOW) and is enabled by default. Set TELNET_RATE_LIMIT_MAX=0 to 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.php script: A new developer utility detects translation keys in non-English catalogs that are absent from the English baseline, complementing the existing check_i18n_missing_keys.php script.
  • New check_i18n_syntax.php script: A new developer utility runs php -l on 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 showError and showSuccess alerts 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 /SEND and /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-meshcorebridge must update that separate bridge repository so it forwards new_advert packets and startup contact-list records to the new BBS endpoint.

1.9.3

Choose a tag to compare

@awehttam awehttam released this 26 Apr 18:38
f78f94b

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 via reply_to_id. The script now NULLs those references before deleting the parent messages.

1.9.2

Choose a tag to compare

@awehttam awehttam released this 19 Apr 19:05
7df062a

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.enabled in 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_adjustment transactions, 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 /games listing alongside DOS Doors, Native Doors, WebDoors, and C64 Doors with their own [JSDOS] badge.
  • Games are defined by jsdosdoor.json manifests under public_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 a jsdosdoor.json for any DOS game. It scans the assets/ 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 placeholder icon.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_SECRET now defaults to Chang3Me, 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 I keybinding and direct number shortcuts so users can open embedded images from the terminal reader.
  • Systems without img2sixel or 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 false by 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

Choose a tag to compare

@awehttam awehttam released this 11 Apr 04:08
1963cfc

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 new McpServer instance 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 .env setting, USERNAMES_ALLOW_SPACES, controls whether usernames may contain single internal spaces (e.g. Phantom of Doom). The setting defaults to false; 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 finger and msg commands now handle multi-word usernames correctly. The msg command 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:image meta 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

Choose a tag to compare

@awehttam awehttam released this 04 Apr 16:38
23c8062

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 sets default_charset to UTF-8 on 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-regexp dependency from 8.3.0 to 8.4.0.
  • This release addresses CVE-2026-4926 (GHSA-j3q9-mxjg-w52f) and CVE-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 to data/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}.png instead 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_SIZE in .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 .torrent files. 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 .torrent file 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 a meta JSONB column to the drafts table 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 CollectionPage JSON-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_messages join, so is_saved was 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 /files index.
  • 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.php is now documented in docs/CLI.md, including how imports merge with locally-edited BBS Directory entries.
  • A FAQ entry has been added clarifying that the "automated AI echo...
Read more