ABBS Last Callers is a small, read-only ARexx Last Callers door for ABBS / ABBS for All on classic AmigaOS. It displays the newest ten ABBS callers across all node logs on an 80-column BBS terminal. It has no third-party runtime dependency and requires no temporary files. This project is independently developed and is not an official ABBS component.
Install jlha-utils and lhasa on a Debian or Ubuntu build host, then run:
make aminet-check
This produces dist/ABBSLastCallers.lha, the classic Amiga distribution,
alongside dist/ABBSLastCallers.readme, its external Aminet submission
metadata, and dist/SHA256SUMS. Generated artifacts are not committed. See
docs/AMINET-PACKAGING.md for verified conventions,
the exact layout, reproducibility details, and manual submission requirements.
- ABBS / ABBS for All
- Classic AmigaOS 3.1 or later
- ARexx
- A configured ABBS node
| Environment / path | Status |
|---|---|
| Host-side CI (format and invariant checks only) | AVAILABLE |
| AmigaOS 3.1 Shell | VALIDATED |
| ABBS II local A-type ARexx door | VALIDATED |
| ABBS II remote Telnet caller | VALIDATED |
Host-side CI does not execute AmigaOS, ARexx, or ABBS and is not runtime validation. The project uses four validation layers:
- Host-side regression tests protect logfile-format assumptions, aggregation, presentation width, and production-source safety invariants.
- An AmigaOS 3.1 Shell smoke test validates ARexx execution and real log parsing outside an ABBS node.
- An ABBS local-node test validates the native A-type door path and return to ABBS.
- An external ABBS remote/Telnet caller test validates remote delivery and connection behavior; this layer is validated.
The v1.0.0 release includes full runtime validation across all four layers.
The Shell path was validated on AmigaOS 3.1 under FS-UAE. The canonical installed invocation is:
rx ABBS:Doors/LastCallers.abbs
echo $RC
Observed output included:
Per Ousdal node 1 09/08-26 23:41
That validates Shell ARexx execution, real logfile reading and parsing, 80-column output, and clean Shell return.
Historical note: development builds before M2 used
ABBS:Sys/LastCallers.abbs for Shell testing. That obsolete development-stage
copy is no longer required once the canonical ABBS:Doors/LastCallers.abbs
copy is installed.
M2 was runtime-validated as an A-type ARexx door on 10 August 2026. From an
active local ABBS node, OPEN displayed the registered Days and Last Callers
entries. Selecting Last Callers ran the script in the caller/node window and
displayed these real Login: records in chronological order:
Per Ousdal 1 09/08-26 23:41
Per Ousdal 1 10/08-26 03:13
The door then returned cleanly to (NEWS) Main Command (? for menu):.
This validates A-type registration and invocation, the inherited per-node
ARexx host, door-mode detection, WRITETEXT/OUTIMAGE output, real node-log
parsing, multi-record display, and normal EXIT back to ABBS. It does not
validate a remote Telnet caller.
- ABBS II, active local node
- AmigaOS 3.1
- FS-UAE, A1200 / 68020 configuration
- Real ABBS node logfile data
The source material was found locally in the FS-UAE ABBS-Dev hard drive.
The ABBS and pristine Install/ABBS copies of both manuals are byte-for-byte
identical.
ABBS:Docs/Doors.doc(DoorsDoc, 1 February 1994) documentsABBS:Doors/NodeXMenuandABBS:Doors/NodeXConfig. Each valid config line is numbered in order. TypeAis an ARexx door, followed by a filename containing no spaces. The user entersOPEN, seesNodeXMenu, and selects the corresponding numbered entry.PandSare Paragon and Shell doors; M2 uses neither.ABBS:Docs/abbsrexx.docdocuments the per-node port name asABBS node #x port.WRITETEXTappends text to ABBS's node write buffer;OUTIMAGEemits that buffer with a newline;BREAKOUTIMAGEemits it without one.GETLINEandREADCHARare the documented input calls. Any host command may return RC 20 for carrier loss and a script must then exit immediately.- The installed historical
ABBS:Doors/DAYS/DAYS.ABBSis registered as anAdoor and callsWRITETEXT,OUTIMAGE,GETLINE, andREADCHARdirectly, without anADDRESSstatement. This observes that ABBS starts an A-type script with the current node port as its ARexx command host. NormalEXITreturns to ABBS; there is no separate return command. - Stock
LoginScript.abbs,LogoutScript.abbs,Newuser.abbs,Questionnaire.ABBS,Download.abbs,Upload.script,Clock.abbs, andClock1.abbswere also inspected. They reinforce the buffered output and immediate-error-exit pattern.Upload.scriptis an AmigaDOS hook, not an ARexx door. No inspected script usesrexxplslib.library. - The requested
MHL-Todayscallers.abbs,Status.abbs, andUser.abbswere not present locally. No mechanism was inferred from them.
Therefore rexxplslib.library is not necessary. The smallest documented M2
path is a direct A-type ARexx door, not a Shell launcher or wrapper.
caller enters OPEN
|
v
ABBS:Doors/NodeXMenu / NodeXConfig
| A ABBS:Doors/LastCallers.abbs
v
ABBS launches ARexx with current node port as command host
|
v
read-only scan of ABBS:node1logfile ... node32logfile
|
v
WRITETEXT + OUTIMAGE to caller, then EXIT to ABBS
The script identifies door mode from the standard ARexx ADDRESS() value.
It only checks that the inherited host begins ABBS node #; it neither assumes
node 1 nor requests caller/session state. The caller's node number is not
needed to scan the logs. Under Shell rx, the host is not an ABBS node port,
so the same output continues to use SAY.
The parser remains unchanged: only strict Login: records are accepted,
usernames may contain spaces, all 32 possible logfile names are considered
despite gaps, malformed records are rejected, and only the newest requested
events are retained. Files are opened only with mode R.
The documented conventional location for an ARexx door is ABBS:Doors.
LastCallers has one canonical installed copy: ABBS:Doors/LastCallers.abbs.
ABBS:Doors/
LastCallers.abbs
NodeXConfig
NodeXMenu
-
Copy the script:
copy LastCallers.abbs ABBS:Doors/LastCallers.abbs -
For every node that should offer the door, append this exact valid entry to that node's existing
ABBS:Doors/NodeXConfig(replaceXwith the node number; do not replace the file):A ABBS:Doors/LastCallers.abbs ; Last Callers -
Count valid
A,P, andSlines from the top of that config. The new line's ordinal is the door selection number. Add the same number to the corresponding existingABBS:Doors/NodeXMenu. For example, if it is the second valid config line, add:2... Last CallersThis number cannot safely be hard-coded for all installations because
Doors.docdefines it by the existing per-node line order. On the inspected validated node,Node0Confighad DAYS first, so Last Callers was entry2.
Repeat steps 2–3 for every node where the door should be available.
NodeXConfig and NodeXMenu are per-node; the door file itself is shared and
contains no node-specific configuration. Do not assume the ordinal is 2 on
another node or installation.
Do not register it as an S Shell door. Shell doors have a different and
security-sensitive launcher contract documented in Doors.doc.
The already validated diagnostic invocation remains available:
rx ABBS:Doors/LastCallers.abbs
echo $RC
Fixture mode from a repository checkout is unchanged and does not require a second installed copy:
makedir RAM:lc
copy fixtures/node#?logfile RAM:lc/
rx LastCallers.abbs "RAM:lc/node" 10
echo $RC
Door mode sends every plain-ASCII line through documented WRITETEXT and
OUTIMAGE. Output is at most 57 printable columns and needs no ANSI or
terminal-control support. ABBS's normal paging remains in control.
No colour was added. The locally recorded historical review establishes
WRITETEXT and OUTIMAGE as the normal buffered output API, but neither the
reviewed ABBS manuals nor the inspected stock ARexx doors establish a safe,
documented colour/control convention. Emitting guessed escape sequences would
add a terminal assumption. Optional title/header colour remains a possible
future enhancement if a documented and historically demonstrated ABBS
mechanism is found; plain ASCII will remain the baseline.
There is deliberately no input pause: historical A-type doors return through
normal ARexx EXIT, and neither manual requires a pause. Avoiding GETLINE or
READCHAR also avoids an indefinite wait. If either output call returns any
nonzero RC—including carrier loss—the script exits immediately without making
another ABBS host call.
The door performs no writes, deletes, renames, temporary-file work, user or
message operations, conference changes, file-database operations, networking,
or configuration changes. Installation requires only copying the script and
manually adding the explicit menu/config entries above. Runtime logfile access
uses OPEN(..., 'R') only.
Shell smoke test:
rx ABBS:Doors/LastCallers.abbs
echo $RC
Expected: the table is displayed using SAY, followed by RC 0.
ABBS test:
OPEN
<select Last Callers at its configured ordinal>
Expected: the table appears in the active ABBS node, real Login: records
appear, and control returns to the ABBS command prompt. No Shell window is
required and ABBS remains running.
This test requires a configured public ABBS node and a real external caller.
Before connecting, ensure that Last Callers is registered in that node's
ABBS:Doors/NodeXConfig, for example:
A ABBS:Doors/LastCallers.abbs ; Last Callers
Ensure the matching entry also exists in that node's NodeXMenu.
NodeXConfig and NodeXMenu are per-node, and the menu number is the config
entry's ordinal in that node; do not hard-code a menu number.
- Connect from an external BBS or Telnet client and log in normally.
- Enter
OPENand select Last Callers at its configured ordinal. - Verify the Last Callers output reaches the remote terminal.
- Verify caller rows are readable and aligned.
- Verify the connection remains alive throughout output.
- Verify control returns to the ABBS command prompt.
- Verify ABBS remains stable and no local-only assumptions are visible.
This validation was completed successfully on real ABBS II. A remote Telnet
caller connected, invoked Last Callers via OPEN 2, received the complete
display with all ten caller rows rendered correctly (User, Node, Date, Time),
the footer reported 10 callers shown, and control returned cleanly to the
ABBS command prompt. No ARexx errors or session disruption were observed.
The complete validation procedure is in
docs/RELEASE-CHECKLIST.md.
- Two-digit years sort as observed (
YY/MM/DD HH:MM); century rollover is undefined. - Date fields receive range checks, not full calendar validation.
- Same-minute events use node number and read order as deterministic tie-breakers.
- Log rotation or concurrent append behavior needs target observation.
- Remote Telnet caller display validated; forced disconnect/carrier-loss during active output remains untested.
This project is available under the MIT License.