a3270
An x3270-aligned IBM 3270 mainframe terminal emulator for Android, written in Kotlin using Jetpack Compose and powered by the lib3270j protocol engine from j3270. Designed for mobile access to IBM z/OS, z/VM, CMS, and TSO systems over TN3270 and TN3270E.
🔗 Repositories
- a3270 (Android App): https://git.hugfreevikings.wtf/rudi/a3270
- j3270 (Desktop App &
lib3270jCore Library): https://git.hugfreevikings.wtf/rudi/j3270
a3270 relies on the shared 3270 protocol library (lib3270j) provided by the j3270 repository.
🚀 Quick Download & Install
Latest Standalone APK
You can download ready-to-install Android APKs directly from releases or CI builds:
- Download Latest Tagged Release (
a3270.apk) - Latest Nightly CI Artifacts (Download under the latest successful workflow run)
Installing a3270
To install the APK on a connected Android device or emulator via adb:
adb install -r a3270.apk
✨ Features
- Modern Jetpack Compose UI: Responsive, touch-optimized 3270 terminal screen rendering.
- TN3270 & TN3270E Protocol Support: RFC 2355 compliant state machine, negotiation, Device-Type query, and SSL/TLS encryption via
lib3270j. - On-Screen Function Key Bar: Quick-access touch bar for PF1–PF24, PA1–PA3, Enter, Clear, Reset, and Attn keys.
- IND$FILE File Transfer: Full mobile UI for CUT and DFT (DDM) high-speed structured field file transfers with ASCII/binary translation, CRLF handling, and recfm/lrecl formatting for TSO, VM/CMS, and CICS.
- OIA Status Line: Real-time Operator Information Area displaying connection state, keyboard lock, insert mode, cursor row/col, and LU name.
- Host Profile Storage: Save and manage multiple mainframe connection profiles with custom ports, models, and SSL/TLS options.
- Background Session Persistence: Android foreground service keeps your terminal session alive when multitasking.
- Terminal Models:
- Model 2 (24x80)
- Model 3 (32x80)
- Model 4 (43x80)
- Model 5 (27x132)
🛠️ Building from Source
Prerequisites
- Java Development Kit (JDK): JDK 17 or JDK 21
- Android SDK: API 34 platforms and build-tools (
ANDROID_HOMEorANDROID_SDK_ROOTset)
1. Clone Repositories Side-by-Side
For the easiest setup, clone both j3270 and a3270 into the same parent folder:
git clone https://git.hugfreevikings.wtf/rudi/j3270.git
git clone https://git.hugfreevikings.wtf/rudi/a3270.git
cd a3270
Note: If
j3270is located in another directory, specify its location via theJ3270_DIRenvironment variable:export J3270_DIR=/path/to/j3270or via Gradle property:
./gradlew assembleDebug -Pj3270Dir=/path/to/j3270
2. Build the Debug APK
Using the helper script:
./build.sh
Or using Gradle Wrapper directly:
./gradlew assembleDebug
The compiled APK will be generated at:
build/outputs/apk/debug/a3270-debug.apk
🏷️ How to Tag & Publish (Beta) Releases
Releases can be published automatically to Gitea via Git tags:
# 1. Create a version tag (stable or beta)
git tag -a v0.1.0-beta.1 -m "Release v0.1.0-beta.1"
# Or a stable release:
git tag -a v0.1.0 -m "Release v0.1.0"
# 2. Push the tag to Gitea
git push origin v0.1.0-beta.1
Pushing any v* tag triggers the automated release workflow (.gitea/workflows/release.yaml), which:
- Automatically detects pre-releases (tags containing
beta,alpha,rc,pre,preview, ordev) and marks them as Pre-release on Gitea. - Builds the APK and packages it.
- Publishes a new Gitea Release with
a3270.apkattached automatically.
🔍 Topics & Discoverability
Suggested keywords/topics for repository indexing:
tn3270 · tn3270e · ibm-3270 · mainframe · terminal-emulator · android · android-app · jetpack-compose · kotlin · x3270 · j3270 · ind-file · file-transfer · ebcdic · z-vm · z-os · cms · tso · cics
🤝 Contributing
Contributions are welcome! Please feel free to open a bug report or feature request via the Gitea issue tracker.
I have contributed no code to this project, it was entirely written by LLMs with my guidance only.
📜 Acknowledgements
- j3270 — Desktop emulator and
lib3270jprotocol engine - x3270 — Reference C implementation and protocol specifications
- Antigravity
- Claude Opus 4.6
- Gemini 3.1 Pro
- Gemini 3.7 Flash