<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: El Dockerr</title>
    <description>The latest articles on DEV Community by El Dockerr (@el_dockerr).</description>
    <link>https://dev.to/el_dockerr</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3578284%2Ff72712a3-ab5a-41ac-90ac-5eb9388bb37d.jpg</url>
      <title>DEV Community: El Dockerr</title>
      <link>https://dev.to/el_dockerr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/el_dockerr"/>
    <language>en</language>
    <item>
      <title>I got tired of paying to emulate a 1970s terminal, so I built a native macOS client in C++ (DX3270)</title>
      <dc:creator>El Dockerr</dc:creator>
      <pubDate>Thu, 28 May 2026 13:39:17 +0000</pubDate>
      <link>https://dev.to/el_dockerr/i-got-tired-of-paying-to-emulate-a-1970s-terminal-so-i-built-a-native-macos-client-in-c-dx3270-38kg</link>
      <guid>https://dev.to/el_dockerr/i-got-tired-of-paying-to-emulate-a-1970s-terminal-so-i-built-a-native-macos-client-in-c-dx3270-38kg</guid>
      <description>&lt;p&gt;If you work with IBM Mainframes (z/OS, z/VM) on a Mac, you’ve probably noticed a glaring issue: every halfway-decent TN3270 terminal client costs money. Sometimes a lot of money.&lt;/p&gt;

&lt;p&gt;We’re talking $50–$100+ for software that essentially emulates a 1970s text terminal. One popular commercial option even charges a recurring subscription just to let you type on a green screen. That felt absurd to me.&lt;/p&gt;

&lt;p&gt;The free alternatives out there usually fall into three categories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;They require Java (slow, resource-heavy, and clunky on macOS).&lt;/li&gt;
&lt;li&gt;They run inside X11 (no thanks).&lt;/li&gt;
&lt;li&gt;They are abandonware that breaks on every macOS release.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, I decided to build my own from scratch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing DX3270
&lt;/h2&gt;

&lt;p&gt;After a weekend of intense frustration and diving deep into ancient IBM GA23-0059 architecture manuals, I released DX3270 (hosted under the X3270 repo).&lt;/p&gt;

&lt;p&gt;It is a completely free, MIT-licensed, native macOS TN3270/TN3270E terminal emulator.&lt;/p&gt;

&lt;p&gt;Check out the repository here: &lt;a href="https://github.com/el-dockerr/X3270" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvqco0y8qixwuh0gode34.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvqco0y8qixwuh0gode34.png" alt=" " width="800" height="565"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I wanted something that actually feels like it belongs on a Mac. No Java, no X11, just native performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;I wrote DX3270 entirely in C++ and Objective-C++. By building it on top of native macOS frameworks, it achieves a completely different level of performance and system integration compared to cross-platform electron/Java wrappers.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rendering: I used Apple's CoreText for calculating glyph metrics to ensure a pixel-perfect character grid.&lt;/li&gt;
&lt;li&gt;Security: Native OpenSSL integration for implicit TLS (TLS 1.2+) on any port.&lt;/li&gt;
&lt;li&gt;Protocol: Full TN3270E (RFC 2355) negotiation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One of the hardest (and most interesting) parts was implementing the IBM Structured Field Read Partition Query. Without this Query Reply, mainframe menus like ISPF simply won't render correctly. Getting the exact hex codes right (like fixing the PF10-12 AID codes based on strict IBM standards) was a huge learning curve.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;p&gt;I recently updated the app to support dynamic screen buffers and multiple models. Here is a quick breakdown of what DX3270 can do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Model Support&lt;/strong&gt; Model 2 (24×80), Model 3, 4, 5, and a custom Large model (62×160) using 14-bit buffer addressing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentic Font&lt;/strong&gt; Bundled with the incredible open-source IBM 3270 font by Ricardo Bánffy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Native UI&lt;/strong&gt; Green-on-black phosphor, authentic 600 ms cursor blink, and a block cursor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Traffic Monitor&lt;/strong&gt; Built-in floating hex dump monitor (⌘⇧D) to debug raw Telnet/TN3270 bytes in real-time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Export Tools&lt;/strong&gt; Pixel-perfect PNG screenshots (⌘⇧P) and EBCDIC-to-UTF-8 formatted text exports (⌘⇧T).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9exwm4iqydw08dvyrtwh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9exwm4iqydw08dvyrtwh.png" alt=" " width="800" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it out!&lt;/strong&gt;&lt;br&gt;
If you work in Mainframe, use a Mac (Apple Silicon or Intel), and are tired of paying for the privilege of connecting to your own environments, DX3270 is for you.&lt;/p&gt;

&lt;p&gt;I actually built this tool just for my own sanity, but after it got some unexpected traction on LinkedIn, I realized a lot of other developers share this exact pain point.&lt;/p&gt;

&lt;p&gt;I’ve set up GitHub Actions to automatically publish pre-built .dmg files for both Apple Silicon and Intel architectures on every release. You can download the latest version directly from the Releases page.&lt;/p&gt;

&lt;p&gt;I would absolutely love to hear your feedback, bug reports, or feature ideas. Feel free to open an issue or drop a comment below!&lt;/p&gt;

&lt;p&gt;Happy connecting!&lt;/p&gt;

</description>
      <category>cpp</category>
      <category>mac</category>
      <category>opensource</category>
      <category>mainframe</category>
    </item>
    <item>
      <title>I hacked a CMAKE replacement, and maybe it's for you</title>
      <dc:creator>El Dockerr</dc:creator>
      <pubDate>Wed, 22 Oct 2025 07:55:35 +0000</pubDate>
      <link>https://dev.to/el_dockerr/i-hacked-a-cmake-replacement-and-maybe-its-for-you-21l3</link>
      <guid>https://dev.to/el_dockerr/i-hacked-a-cmake-replacement-and-maybe-its-for-you-21l3</guid>
      <description>&lt;p&gt;Let’s be honest: CMake can feel like trying to read hieroglyphs while blindfolded.&lt;br&gt;
Half the time it’s fighting you, the other half it’s pretending to help. And I use Linux at home and Microsoft at work. Bringing this together as a C++ developer is very painful.&lt;/p&gt;

&lt;p&gt;So... I built something else.&lt;br&gt;
Meet Bodge — The Idiotic Build System.&lt;/p&gt;
&lt;h2&gt;
  
  
  🧠 What Is “Bodge”?
&lt;/h2&gt;

&lt;p&gt;bodge [/bɒdʒ/ verb] — make or repair (something) badly or clumsily.&lt;/p&gt;

&lt;p&gt;Yeah. The name is self-aware.&lt;/p&gt;

&lt;p&gt;I was frustrated by fiddling around with CMAKE on windows, and Visual Studio is absolutely painful and I was wondering why nobody tackled this issue. &lt;br&gt;
So, as I learned in my puberty as a nerd, when nobody is willing to do, do it yourself, it started as a weekend experiment to see if I could make something that just builds C++ projects without ceremony — and before I knew it, I’d bodged together a fully functional cross-platform build system. Okay - to be honest I was wondering how easy it can be to have something in place that matches MAVEN or Cargo for C++. (See: &lt;a href="https://github.com/el-dockerr/bodge" rel="noopener noreferrer"&gt;https://github.com/el-dockerr/bodge&lt;/a&gt;)&lt;br&gt;
And it was perfect for my work as well, so I spread the work in my Company, and in no time we had something useful that shrink the toolchain and dependencies. Just a G++ compiler and Bodge in place.&lt;br&gt;
Without working around on CMAKE to get it run on Windows.&lt;br&gt;
Same on Linux - just G++ and Bodge with a nice sleek &lt;code&gt;.bodge&lt;/code&gt; file. No &lt;code&gt;make&lt;/code&gt; no &lt;code&gt;cmake&lt;/code&gt;, no wrong encoding, and no wrong formatting.&lt;/p&gt;

&lt;p&gt;It’s minimal.&lt;br&gt;
It’s hacky.&lt;br&gt;
It’s surprisingly powerful.&lt;br&gt;
And it might actually replace CMake one day (if I’m crazy enough to keep going).&lt;/p&gt;
&lt;h2&gt;
  
  
  🧩 Why Bodge Exists
&lt;/h2&gt;

&lt;p&gt;If you’ve ever wrestled with CMake or other meta-build tools, you know the pain:&lt;/p&gt;

&lt;p&gt;Layers of cryptic commands,&lt;/p&gt;

&lt;p&gt;endless dependency hell,&lt;/p&gt;

&lt;p&gt;and the creeping feeling that your build files are writing themselves.&lt;/p&gt;

&lt;p&gt;Bodge aims to fix that by being simple, declarative, and self-contained — like Cargo for Rust or Maven for Java, but for good old C++.&lt;/p&gt;

&lt;p&gt;All you do is define what you want to build, what compiler to use, and what libraries you depend on.&lt;br&gt;
That’s it.&lt;br&gt;
No ceremony. No black magic.&lt;/p&gt;

&lt;p&gt;Here’s the best part: Bodge can even fetch your dependencies directly from Git repos, build them, and chain everything together automatically.&lt;/p&gt;
&lt;h2&gt;
  
  
  ⚙️ The Philosophy
&lt;/h2&gt;

&lt;p&gt;I wanted to design a build system that:&lt;/p&gt;

&lt;p&gt;Uses a single human-readable config file (.bodge)&lt;/p&gt;

&lt;p&gt;Works identically on Windows, Linux, and macOS&lt;/p&gt;

&lt;p&gt;Lets you define dependencies, build sequences, and targets without tears&lt;/p&gt;

&lt;p&gt;Doesn’t require external generators or a PhD in scripting&lt;/p&gt;

&lt;p&gt;The dream?&lt;br&gt;
A single executable that builds your C++ project — clean, predictable, and portable.&lt;/p&gt;
&lt;h2&gt;
  
  
  🧱 A Minimal Example
&lt;/h2&gt;

&lt;p&gt;Here’s a dead simple .bodge file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: MyProject
compiler: g++
output_name: my_app
cxx_flags: -std=c++17, -Wall, -O2
sources: src/**
include_dirs: include
libraries: pthread, m
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s all it takes.&lt;br&gt;
Run &lt;code&gt;bodge&lt;/code&gt; and you’ve got your binary. 🎉&lt;/p&gt;

&lt;p&gt;Want to build for Windows or Linux specifically?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bodge --platform=windows_x64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or check what platforms are available:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bodge platform
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It’s that easy.&lt;/p&gt;

&lt;h2&gt;
  
  
  💡 Key Features
&lt;/h2&gt;

&lt;p&gt;Bodge already does a lot — and I keep adding new stuff as I go. Some highlights:&lt;/p&gt;

&lt;h3&gt;
  
  
  🧩 Multi-Target Support
&lt;/h3&gt;

&lt;p&gt;Build executables, shared libs, and static libs — all from one config.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚙️ Automatic Source Collection
&lt;/h3&gt;

&lt;p&gt;Just point to a folder (src/**), and Bodge gathers all .cpp files recursively.&lt;/p&gt;

&lt;h3&gt;
  
  
  🚀 Daemon Mode
&lt;/h3&gt;

&lt;p&gt;Yes, it can watch your source tree and rebuild automatically when you save.&lt;br&gt;
Perfect for active development and CI setups.&lt;/p&gt;
&lt;h3&gt;
  
  
  🪄 Build Sequences
&lt;/h3&gt;

&lt;p&gt;Create workflows like “build → package → deploy” directly in your .bodge file:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sequence.deploy: build:main mkdir:dist copy:my_app.exe-&amp;gt;dist/my_app.exe&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  🌍 Cross-Platform by Design
&lt;/h3&gt;

&lt;p&gt;Supports Windows, Linux, Unix, macOS, ARM, and x86/x64 — automatically detecting your system and applying platform-specific flags.&lt;/p&gt;
&lt;h3&gt;
  
  
  🔗 Git Dependency Fetching
&lt;/h3&gt;

&lt;p&gt;Need a 3rd-party library? Just list its repo in &lt;code&gt;.bodge&lt;/code&gt;, and it’ll pull and include it automatically.&lt;br&gt;
No more “clone this, copy that, run this script” nonsense.&lt;/p&gt;
&lt;h2&gt;
  
  
  🧰 Example: Multi-Target Project
&lt;/h2&gt;

&lt;p&gt;Here’s a more advanced setup to give you an idea of Bodge’s structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: MultiTarget
compiler: g++
global_cxx_flags: -std=c++17, -Wall, -static-libgcc, -static-libstdc++
global_include_dirs: include
# Shared library
libcore.type: shared
libcore.output_name: core
libcore.sources: src/lib/**
# Executable that depends on it
app.type: exe
app.output_name: my_app
app.sources: src/**
app.libraries: core
# Build all
sequence.build_all: build:libcore build:app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can build everything or just one target:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bodge build app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or run a whole workflow sequence:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bodge sequence build_all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔁 It Builds Itself
&lt;/h2&gt;

&lt;p&gt;Yep.&lt;br&gt;
You can build Bodge using Bodge.&lt;br&gt;
That was my personal “it’s alive!” moment.&lt;br&gt;
Just run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bodge --platform=windows_x86
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or, if you’re feeling nostalgic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;make all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  💾 Download
&lt;/h2&gt;

&lt;p&gt;You can grab precompiled binaries for Windows, Linux, and macOS from the GitHub Releases&lt;br&gt;
.&lt;br&gt;
Or clone the repo and build from source (it’s super straightforward).&lt;/p&gt;

&lt;h2&gt;
  
  
  ❤️ Why You Might Love It
&lt;/h2&gt;

&lt;p&gt;Bodge is not trying to be smarter than you — it’s trying to get out of your way.&lt;br&gt;
You tell it what you want, it builds it, and it doesn’t argue.&lt;/p&gt;

&lt;p&gt;If you’re tired of CMake boilerplate or opaque “meta scripts,” Bodge might just be the breath of fresh air you’ve been waiting for.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧑‍💻 Contribute or Follow Along
&lt;/h2&gt;

&lt;p&gt;This is still an early-stage project, but it’s already working nicely for small and medium C++ projects.&lt;br&gt;
If you’re curious, or if you’ve cursed at CMake recently (we all have), check it out: &lt;a href="https://github.com/el-dockerr/bodge" rel="noopener noreferrer"&gt;https://github.com/el-dockerr/bodge&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  👉 GitHub: Bodge – The Idiotic Build System
&lt;/h2&gt;

&lt;p&gt;Give it a ⭐ if you like where it’s going — it really helps me stay motivated to push the next features.&lt;/p&gt;

&lt;h2&gt;
  
  
  ☕️ Final Thoughts
&lt;/h2&gt;

&lt;p&gt;I didn’t set out to reinvent the wheel — I just wanted one that didn’t squeak.&lt;br&gt;
If you’ve ever thought “CMake is overkill for my project,” give Bodge a try.&lt;br&gt;
It’s small, self-contained, and fun to use — just the way C++ building should be.&lt;/p&gt;

&lt;p&gt;Let’s make C++ building less painful, one bodge at a time.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>cpp</category>
      <category>tooling</category>
      <category>c</category>
    </item>
  </channel>
</rss>
