• v0.10.2 65be784064

    pipeline-bot released this 2026-07-08 14:40:03 +00:00 | 0 commits to main since this release

    Fixed

    • CLI: an unrecognized -/-- flag is now a loud non-zero error instead of being swallowed as the
      hostname (zelnet --bogus used to attempt a DNS lookup for --bogus). A release-pipeline
      functional gate exercises the shipped binary to prove it.
    • CLI: an invalid port now exits non-zero (zelnet <host> <badport> printed
      invalid port but returned success), matching the host-server verbs. A
      release-pipeline functional gate exercises the shipped binary to prove it.
    Downloads
  • v0.10.1 22668e0674

    gitea_admin released this 2026-07-03 17:34:34 +00:00 | 14 commits to main since this release

    Added

    • Multi-command zelnet cmd: zelnet cmd "CMD1" "CMD2" ... runs N CL commands
      sequentially in ONE remote-command job, so job state (CHGCURLIB, ADDLIBLE, OVRDBF)
      set by an earlier command holds for later ones — the foundation for compiling into a
      target library that the compile-time *LIBL must resolve. Fail-fast: the first CL
      escape stops the sequence and exits non-zero. Single-command output is byte-identical
      to before; multi-command runs print a zelnet: > CMD header per command. Positional-arg
      overflow is now a loud error instead of a silent drop.
    Downloads
  • v0.10.0 4662c10120

    gitea_admin released this 2026-07-02 16:32:10 +00:00 | 20 commits to main since this release

    Added

    • Plain-telnet (NVT) mode — zelnet's third protocol personality after TN5250/TN3270.
      --nvt <host> [port] is a byte-level pass-through like telnet(1): the enclosing
      terminal renders while zelnet answers negotiation (remote ECHO, SGA, the local TERM
      as TERMINAL-TYPE, NAWS window reports with resize updates); Ctrl-] disconnects.
      Works against Cisco gear, BBSes, Unix telnetd, and VTAM front doors in their ASCII phase.
    • Automatic NVT fallback: the default 5250 path degrades transparently into NVT
      pass-through when the host negotiates an option no block-mode host uses (WILL ECHO /
      DO NAWS), so zelnet some-switch 23 just works instead of hanging. Block mode is only
      entered when the server explicitly negotiates it — the detection cannot false-positive.
    • Scripted NVT gate: --nvt --play "expect <t>; send <t>; type <t>; enter; pause <ms>; dump" drives a plain-telnet host headless with ordered, consuming expect matching —
      a CI gate for NVT behavior (a missed expect exits non-zero). Pairs with --record.
    • --record now also works with --drive (TN3270): scripted mainframe sessions record
      their driven panels as asciicast reels, same as --play on 5250. NVT recordings are
      raw byte-stream events (UTF-8-sanitized) with synthetic pacing.
    Downloads
  • v0.9.6 08892a03ab

    zelnet v0.9.6 Stable

    gitea_admin released this 2026-07-01 16:23:30 +00:00 | 29 commits to main since this release

    Changed

    • Release cut through the hardened package signing path: the apt/dnf repos are GPG-signed
      and verified by signature alone — the promote step no longer executes the built package's
      maintainer scripts (dpkg postinst) next to the private signing key. No functional change
      to zelnet.
    Downloads
  • v0.9.5 2023f454e7

    zelnet v0.9.5 Stable

    gitea_admin released this 2026-07-01 13:54:19 +00:00 | 33 commits to main since this release

    Added

    • Unit test for host.zig's fmtEpoch — asserts a Unix epoch renders to the expected
      timestamp string, covering the leap-year and 1-based day-of-month accounting so the
      calendar math can't silently regress.
    Downloads
  • v0.9.4 91af5a6429

    zelnet v0.9.4 Stable

    gitea_admin released this 2026-07-01 08:37:19 +00:00 | 45 commits to main since this release

    Added

    • Free-roaming cursor: ↑↓←→ now move the on-screen cursor one cell (clamped) on a
      field-less display — grid games like Number Munchers — and new --play verbs
      up/down/left/right + csr <row> <col> drive it headless. The cursor position is
      already reported to the host on AID, so RPG RTNCSRLOC reads the landed cell. Form
      screens (nfields>0) keep Tab/field navigation.
    • Background colors via reverse-image: a DSPATR(RI) COLOR(x) field now renders as a
      FILLED colored cell (the color as an ANSI background + contrasting foreground), not just
      a foreground tint. Enables filled grid cells / highlighted tiles.
    Downloads
  • v0.9.3 514075a4e3

    zelnet v0.9.3 Stable

    gitea_admin released this 2026-06-30 15:51:32 +00:00 | 47 commits to main since this release

    Fixed

    • --record: the asciicast now positions each row with an absolute cursor move (ESC[r;1H) and
      disables autowrap, instead of emitting full-width rows followed by a newline. An 80-column row
      autowrapped in the player's terminal and the trailing newline then doubled every line, scrolling
      the screen so only the bottom ~12 rows survived. Frames now render the full 24×80 panel, matching
      the live GUI.
    Downloads
  • v0.9.2 1502c877a8

    zelnet v0.9.2 Stable

    gitea_admin released this 2026-06-30 14:22:42 +00:00 | 49 commits to main since this release

    Added

    • --record <file> (with --play): write an asciicast v2 recording of the driven 5250 panels —
      the source for the release pipeline's greenscreen video. Each driven screen is one frame with
      synthetic ~1.5 s timing so playback is watchable even though the drive runs in milliseconds; the ANSI
      render is captured verbatim (colour preserved, ESC hand-escaped). Validated on the full PARTMNT drive
      (18 frames). Covered by a writeJsonEscaped unit test.
    Downloads
  • v0.9.1 b63280febc

    zelnet v0.9.1 Stable

    gitea_admin released this 2026-06-30 13:22:06 +00:00 | 51 commits to main since this release

    Added

    • refute <text>: the negative twin of expect in the --play (5250) / --drive (3270)
      golden-screen harness — fail if the (undesirable) text is on screen. Closes the other half of
      behavior testing: assert the bad thing didn't happen (no stale row after a delete, no silent
      overwrite/create, an error actually shown) — not just that the good thing did. Same self-verifying
      non-zero exit, in both drive5250 and drive3270; covered by a screenContains unit test.

    Removed

    • The legacy iz name is gone. iz was folded into zelnet in 0.9.0; this drops the remaining
      IZ_* environment aliases — use the ZELNET_* equivalents (ZELNET_USER, ZELNET_PW,
      ZELNET_HOST, ZELNET_ALLOW_PLAINTEXT). The password-level floor IZ_MIN_PWLVL is renamed to
      ZELNET_MIN_PWLVL, and the make iz-* helper targets are renamed to make host-*.
    Downloads
  • v0.9.0 a5c2297d15

    zelnet v0.9.0 Stable

    gitea_admin released this 2026-06-30 08:53:07 +00:00 | 58 commits to main since this release

    Added

    • --play <script>: a scripted, headless TN5250 driver — the golden-screen TEST HARNESS for
      greenscreen apps. Signs on (env ZELNET_USER/ZELNET_PW), advances past any break-message screen
      to the main menu, then runs a semicolon-separated script against the live panels: type into a
      field, send an AID (enter / pf <n>), and expect <text> / dump. Every expect is a
      self-verifying gate, so a script exits non-zero on the first mismatch — greenscreen behavior is
      now a CI gate (CALL a program, drive its EXFMT panels, assert the rendered data), not just
      compile-success. The TN5250 twin of --drive (3270), built on the already-headless Session that
      login proves out — no TTY. Verbs: dump | expect | type | typepw | tab | backtab | home | field <n> | enter | pf <n>. Proven end-to-end driving the rpg-inventory PARTMNT maintenance
      panel on pub400 (CHAIN found + miss).
    • src export <lib>: a first-class source extractor (the "reverse deploy") — pull a library's
      source members off the box into a local Git layout (<out>/<srcfile>/<member>.<type>). For each
      source file it lists the members (file server), CPYTOSTMFs each to an IFS temp (EBCDIC → CCSID
      1208 UTF-8, LF) via the command server, fetches it, sniffs the source type (PFILE(→lf,
      DSPSIZ→dspf, else pf; QRPGLESRC→rpgle), and writes it — reusing one file + one command
      connection for the whole sweep (no fork-per-member). Folds the proven extract.sh into the
      binary; the import primitive of IBMI-IMPORT.md. Flags: --out <dir>, --srcfiles A,B,
      --filter PART*. Proven by round-trip on rpg-inventory (box → Git, 5/5 byte-identical).
    Downloads