<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://controllerbuddy.org/feed.xml" rel="self" type="application/atom+xml" /><link href="https://controllerbuddy.org/" rel="alternate" type="text/html" /><updated>2026-11-14T13:11:43+00:00</updated><id>https://controllerbuddy.org/feed.xml</id><title type="html">ControllerBuddy</title><subtitle>Highly advanced game controller mapping</subtitle><author><name>Matteo Hausner</name></author><entry><title type="html">October 2026 Status Update</title><link href="https://controllerbuddy.org/blog/status-update-october-2026" rel="alternate" type="text/html" title="October 2026 Status Update" /><published>2026-10-07T00:00:00+00:00</published><updated>2026-10-07T00:00:00+00:00</updated><id>https://controllerbuddy.org/blog/status-update-october-2026</id><content type="html" xml:base="https://controllerbuddy.org/blog/status-update-october-2026"><![CDATA[<!-- markdownlint-disable-file line-length -->

<h3 id="falling-leaves-and-fresh-features-">Falling Leaves and Fresh Features <!-- markdownlint-disable-line heading-increment --></h3>

<p>How time flies, we are already well into autumn, and it has been almost two months since my last post.
A whole stack of new developments has accumulated that I really should say a few words about here.</p>

<p>Apart from the usual housekeeping tasks around ControllerBuddy - which I do not cover in these posts - a number of features and improvements to the main application itself have been implemented for version 1.10.
Considerable effort has also gone into streamlining the usage of ControllerBuddy on Linux, making it easier than ever before - more on this below.</p>

<p>So let’s dive right in…</p>

<h3 id="selective-circle-to-square-mapping">Selective Circle to Square Mapping</h3>

<p>With the release of ControllerBuddy version 1.10, a new profile feature for axis actions has been introduced.
It comes in the form of a checkbox labeled <em>Use Raw Value</em>.
When this option is enabled, ControllerBuddy bypasses the so-called <em>Circle to Square Mapping</em> of the corresponding axis for that specific action.</p>

<p><img src="/assets/images/2026-10-07-status-update-october-2026/use-raw-value.png" alt="Use Raw Value" /></p>

<p>If this doesn’t make sense yet, let me try to explain:</p>

<p>First of all, let us clarify what <em>Circle to Square Mapping</em> means in the context of ControllerBuddy.
In short, it is a setting located under the <em>Global Settings</em> tab, and has been part of the application for a long time.
When this option is enabled (the default setting), ControllerBuddy maps physical axis values from a circle to a square.
This is useful for most game controllers, which feature circular analog sticks - essentially almost every controller on the market.
Why is this necessary?
Because with a circular stick, it would otherwise be impossible to reach full deflection along both the X and Y axes simultaneously.
For example, if this option is disabled on a controller with circular sticks, you cannot apply full elevator and full aileron at the same time.</p>

<p>While the <em>Circle to Square Mapping</em> feature solves this problem, it comes with a drawback: the stick becomes significantly more sensitive near the corners.
This is especially problematic for the left stick, which in official profiles is mapped to the yaw and throttle axes.
Imagine you have applied full left rudder, then even a slight, unintentional movement along the Y axis will cause a disproportionately strong deflection on the virtual throttle axis.</p>

<p>Traditionally, the official profiles relied on relatively large dead zones on both axes to prevent unintentional inputs.
While this helped to a degree, it was far from perfect.
In this particular scenario, it is much better to disable <em>Circle to Square Mapping</em> altogether.
And that is precisely what the new <em>Use Raw Value</em> option is designed for.
Official profiles now have this option enabled by default for throttle, prop-pitch, and mixture axis bindings.
If <em>Circle to Square Mapping</em> is disabled globally, this option has no effect.</p>

<h3 id="ui-improvements-and-jdk-27">UI Improvements and JDK 27</h3>

<p>The most visible change for users is likely the new lock screen overlay.
It features a stylish blur effect rendered over the UI controls whenever ControllerBuddy is actively running.
Previously, the UI elements used for editing profiles and global settings were simply disabled, which was often confusing for new users.
The lockable tab panels now display a prominent button labeled <em>Stop execution to unlock</em>, making it instantly clear why the UI is locked.
Clicking this button directly stops execution without requiring navigation through the main menu, allowing quick access to the controls below.</p>

<p><img src="/assets/images/2026-10-07-status-update-october-2026/lockable-settings-panel.png" alt="Lockable Settings Panel" /></p>

<p>Another small improvement affects the keystroke editor, which now automatically scrolls to ensure the first matching key is visible as soon as you type into the filter box.</p>

<p>Additionally, two minor edge cases involving the overlay have been resolved:</p>

<ol>
  <li>Fixed an issue with the On-Screen Keyboard where switching between light and dark themes left the keyboard styled in the colors of the previous theme.</li>
  <li>Added small vertical spacing in the overlay between the mode label and horizontal indicators when no vertical indicators are configured, making the overlay look less cluttered.</li>
</ol>

<p>Finally, <a href="https://openjdk.org/projects/jdk/27/" target="_blank">Java 27</a> was released on September 15th.
As usual, ControllerBuddy was immediately updated to this new JDK release to take advantage of its latest performance improvements and enhancements.</p>

<h3 id="controllerbuddy-wrapper-scripts-for-linux">ControllerBuddy Wrapper Scripts for Linux</h3>

<p>I have recently invested a lot of effort into making ControllerBuddy on Linux easier to use and better integrated.
On Windows, the installation script handles installing and updating the application, and also invoking the profile configuration scripts that automatically set up supported sims.</p>

<p>While the same installation script runs on Linux, it cannot trigger the configuration scripts the same way it does on Windows.
It is strictly meant for installing and updating ControllerBuddy and its profiles because, unlike Windows, on Linux each game usually runs inside its own isolated <a href="https://www.winehq.org/" target="_blank">Wine</a> or <a href="https://github.com/ValveSoftware/Proton" target="_blank">Proton</a> prefix.</p>

<p>Furthermore, I now consider the <a href="https://github.com/bwRavencl/ControllerBuddy-Flatpak" target="_blank">ControllerBuddy Flatpak</a> to be the primary distribution channel for ControllerBuddy on Linux.
<a href="https://flatpak.org/" target="_blank">Flatpak</a> provides a distribution-agnostic way to package, deploy, and run desktop applications safely.</p>

<p>Instead of configuring all games from a single global setup script like on Windows, it is much more effective on Linux to execute configuration scripts dynamically just before launching a game.
This approach offers an added benefit: any profile or configuration updates released with ControllerBuddy are automatically applied at game launch.
To achieve this, I created two wrapper scripts - one for Proton and one for <a href="https://www.dosbox-staging.org/" target="_blank">DOSBox Staging</a> - which are bundled directly into the Flatpak package.</p>

<p>The <code class="language-plaintext highlighter-rouge">proton-wrapper.sh</code> script automates the following steps:</p>

<ul>
  <li>Ensures the Protontricks Flatpak is installed</li>
  <li>Disables native joysticks in the game’s Proton prefix</li>
  <li>Updates the ControllerBuddy Flatpak</li>
  <li>Launches ControllerBuddy with the specified profile</li>
  <li>Ensures PowerShell is installed in the game’s Proton prefix</li>
  <li>Runs the profile’s configuration script inside the game’s Proton prefix</li>
  <li>Launches the game</li>
  <li>Shuts down ControllerBuddy when the game exits</li>
</ul>

<p>The <code class="language-plaintext highlighter-rouge">dosbox-wrapper.sh</code> script automates the following steps:</p>

<ul>
  <li>Updates the ControllerBuddy Flatpak</li>
  <li>Launches ControllerBuddy with the specified profile</li>
  <li>Forces DOSBox to use ControllerBuddy’s virtual joystick</li>
  <li>Overrides mouse sensitivity in DOSBox if <code class="language-plaintext highlighter-rouge">mouse_sensitivity</code> is provided</li>
  <li>Launches DOSBox</li>
  <li>Shuts down ControllerBuddy when DOSBox exits</li>
</ul>

<p>For <a href="https://store.steampowered.com/" target="_blank">Steam</a>/Proton games, all the user needs to do is adjust the Steam <em>Launch Options</em> for a title as outlined in the <a href="https://github.com/bwRavencl/ControllerBuddy-Flatpak" target="_blank">ControllerBuddy-Flatpak</a> repository.
This instructs Steam to run the wrapper script instead of executing the game directly.
From there, the script works its magic.
By inspecting its execution environment, the script determines which Wine prefix to configure, which configuration script to execute based on the specified profile name, and which <a href="https://github.com/matoking/protontricks" target="_blank">Protontricks</a> verbs are needed.
The wrapper updates the Flatpak, launches ControllerBuddy with the correct profile, configures the prefix, runs the configuration script, and finally starts the game.
Once you exit the game, ControllerBuddy closes automatically.
This workflow works seamlessly for both native Steam and non-Steam games and integrates nicely with the <a href="https://store.steampowered.com/steamos" target="_blank">SteamOS</a> interface on devices such as the <a href="https://www.steamdeck.com" target="_blank">Steam Deck</a>.</p>

<p>To display progress indicators or potential error messages during startup, the scripts use <a href="https://gitlab.gnome.org/GNOME/zenity" target="_blank">zenity</a>, which is included in the Flatpak package.</p>

<p><img src="/assets/images/2026-10-07-status-update-october-2026/wrapper-script.gif" alt="Proton Wrapper Script" /></p>

<p>I have updated the <a href="https://github.com/bwRavencl/ControllerBuddy-Linux-Guides" target="_blank">ControllerBuddy-Linux-Guides</a> to reflect these changes.
Overall, I am proud to say this implementation makes ControllerBuddy even easier to use and more tightly integrated on Linux than on Windows.
While getting everything working required extensive testing - especially around the quirks of the <a href="https://github.com/ValveSoftware/gamescope" target="_blank">gamescope</a> compositor - the effort has definitely paid off.</p>

<h3 id="a-new-profile-for-dis-hind">A New Profile for DI’s Hind</h3>

<p>Since my last post in August, I added a new official profile for the classic 1996 DOS simulator <a href="https://www.mobygames.com/game/620/hind/" target="_blank">Hind</a> by <a href="https://www.mobygames.com/company/751/digital-integration-ltd/" target="_blank">Digital Integration</a>.
I played around with this sim back in the late ’90s when I got it as part of <a href="https://www.mobygames.com/game/13186/aber-hallo/" target="_blank">a game collection</a>, but I never got deep into it at the time.</p>

<p>After setting it up in DOSBox and designing a custom ControllerBuddy profile, I played through a few training missions and jumped into the campaigns.
While its flight model and avionics cannot compare to modern implementations like the <a href="https://www.digitalcombatsimulator.com/en/shop/modules/hind/" target="_blank">Mi-24 in DCS</a>, this ’90s classic still offers some very enjoyable gameplay even today.
Unfortunately, even early campaign missions feature overwhelming ground and air threats, making survival quite a challenge, which is why I haven’t made it very far into the campaign yet.</p>

<h3 id="github-workflow-improvements">GitHub Workflow Improvements</h3>

<p>All repositories across the ControllerBuddy project (main application, profiles, install script, Flatpak, website, etc.) rely heavily on <a href="https://docs.github.com/en/actions" target="_blank">GitHub Actions</a> workflows for building, testing, and static analysis.
Automated workflows make it easy to trigger tasks automatically, such as updating the website’s <em>Profiles</em> section whenever changes are pushed to the profile repository.</p>

<p>Over the past few weeks, I implemented several minor updates and refactorings across these workflows.
Two new automations for the ControllerBuddy Flatpak are particularly noteworthy.
To explain, I need to go back a bit first.</p>

<p>Flatpaks are built using manifest files; the manifest for ControllerBuddy is maintained in a dedicated repository called ControllerBuddy-Flatpak.
Many Flatpak applications are hosted centrally on <a href="https://flathub.org" target="_blank">Flathub</a>, the largest repository in the world of Flatpak.
However, due to Flathub’s strict rules regarding release cycles and ControllerBuddy’s rolling-release model, I was unable to include it in the official Flathub repository.
Instead, ControllerBuddy can be obtained from its own Flatpak repository.
While this requires users to manually add said repository to their system, it gives the project complete independence.
The custom Flatpak repository is hosted via <a href="https://docs.github.com/en/pages" target="_blank">GitHub Pages</a>.
Whenever the manifest file in the Git repository is updated, a GitHub Actions workflow builds Flatpak packages for both x86-64 and aarch64 architectures and deploys them to GitHub Pages.</p>

<p>To ensure the manifest stays updated whenever a new version of ControllerBuddy is released, I integrated a workflow based on the <a href="https://github.com/flathub-infra/flatpak-external-data-checker" target="_blank">Flatpak External Data Checker</a> tool, which is maintained by the Flathub community.
This tool relies on <a href="https://release-monitoring.org/" target="_blank">release-monitoring.org</a>, a project run by the <a href="https://fedoraproject.org/" target="_blank">Fedora Project</a> to track upstream software releases.
The service regularly polls registered projects to check for new versions and exposes that data through a public API.
By authenticating with an API key, we can also trigger on-demand checks for specific projects using API calls.
That is exactly what the release workflow for the primary ControllerBuddy application now does.
Immediately after a new binary release is published, release-monitoring.org is instructed to run a check and detect the new version.</p>

<p>Next, the release workflow triggers an update workflow in the ControllerBuddy-Flatpak repository, which automatically opens a pull request updating the Flatpak manifest.
Once that pull request is approved by me, a build and deployment workflow compiles the Flatpak and publishes the build.
The next time users check for updates on their system, they instantly receive the latest release.</p>

<p>You might wonder why we take this route through release-monitoring.org instead of updating the manifest directly or storing it inside the main repository.
The simple reason is that I prefer to follow Flathub’s design patterns and adhere to their standards as closely as possible.</p>

<h3 id="summing-up">Summing Up</h3>

<p>If you made it all the way to the end, congratulations!
I hope you found these updates interesting and picked up a few helpful takeaways.<br />
At this point, I often share a roadmap or preview of upcoming plans, but right now, there are no immediate features planned.<br />
Thank you for your interest, have a great day, and see you around!</p>]]></content><author><name>Matteo Hausner</name></author><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">August 2026 Status Update</title><link href="https://controllerbuddy.org/blog/status-update-august-2026" rel="alternate" type="text/html" title="August 2026 Status Update" /><published>2026-08-12T11:00:00+00:00</published><updated>2026-08-12T11:00:00+00:00</updated><id>https://controllerbuddy.org/blog/status-update-august-2026</id><content type="html" xml:base="https://controllerbuddy.org/blog/status-update-august-2026"><![CDATA[<!-- markdownlint-disable-file line-length -->

<h3 id="whats-new-in-controllerbuddy-">What’s New in ControllerBuddy <!-- markdownlint-disable-line heading-increment --></h3>

<p>As the first half of August already comes to a close, it is time for another status update on the development of ControllerBuddy.
Since the last regular update at the end of June, quite a few developments have piled up.
As always, I will focus on the major changes and skip the routine housekeeping.</p>

<h3 id="release-of-dcs-f-14-bu-and-il-2-korea">Release of DCS F-14 B(U) and IL-2 Korea</h3>

<p>Let us start with two new releases in the flight simulation community.</p>

<p>At the end of July, <a href="https://store.heatblur.com/" target="_blank">Heatblur</a> released their updated version of the F-14 Tomcat, the <a href="https://www.digitalcombatsimulator.com/en/products/planes/f-14bu/" target="_blank">F-14 B(U)</a>, for DCS.
I quickly overhauled the existing DCS F-14 profiles and added a dedicated profile for the B(U) variant.</p>

<p>Then, on August 4th, <a href="https://1cgs.net/en" target="_blank">1C Game Studios</a> released the long-awaited <a href="https://il2-series.com/en/store/korea/new/" target="_blank">IL-2 Korea</a> out of early access.
Over the following weekend, I began building the corresponding ControllerBuddy profile.
Fortunately, the existing configuration script for <a href="https://il2sturmovik.com/" target="_blank">IL-2 Great Battles</a> was easily adaptable to IL-2 Korea.<br />
Thanks to a fellow <a href="https://github.com/silv3rshi3ld" target="_blank">Linux user</a> who devised a <a href="https://github.com/HansKristian-Work/vkd3d-proton/pull/3202" target="_blank">patch</a> for <a href="https://github.com/HansKristian-Work/vkd3d-proton" target="_blank">vkd3d-proton</a> to fix initial terrain rendering issues, IL-2 Korea now runs flawlessly on my Linux setup, and I have been thoroughly enjoying it.<br />
For the Linux users among you, I already published <a href="https://github.com/bwRavencl/ControllerBuddy-Linux-Guides/blob/master/IL-2_Korea.md" target="_blank">a guide</a> for setting up the Steam version of IL-2 Korea on Linux for usage with ControllerBuddy as part of my <a href="https://github.com/bwRavencl/ControllerBuddy-Linux-Guides" target="_blank">ControllerBuddy-Linux-Guides</a> collection.</p>

<p>I particularly appreciate what 1C did with the new <em>Multimenu</em> - it greatly improves controller usability in general and integrates seamlessly with ControllerBuddy.
The menu is ideal for secondary commands that are rarely used during flight, eliminating the need for dedicated ControllerBuddy bindings.
For a sim without clickable cockpit controls, this is a very welcome feature.</p>

<h3 id="refactoring-intervals-into-rates">Refactoring Intervals Into Rates</h3>

<p>While a run mode is active, ControllerBuddy continuously polls controller hardware for state changes across axes and buttons.
Up until version 1.9, polling relied on fixed sleep intervals.
Advanced users might be familiar with the <em>Poll Interval</em> setting in the <em>Global Settings</em> tab, which directly controlled the sleep duration between polling iterations.</p>

<p>However, this approach did not account for the execution time ControllerBuddy itself spent processing input.
As a result, the effective polling behavior varied depending on profile complexity and system performance.
While the practical impact was minimal, this dependency was undesirable from an engineering perspective.</p>

<p>In version 1.9, the fixed sleep interval has been replaced with dynamic calculations based on the actual time elapsed since the previous poll.
At the same time, I converted the <em>Poll Interval</em> option into a <em>Polling Rate</em> setting.
Instead of specifying milliseconds (e.g., 1 ms), users now configure frequency in Hertz (e.g., 1000 Hz), which is far more intuitive for input devices.
For consistency, the <em>Key Repeat Interval</em> in the <em>Profile Settings</em> tab was also refactored to <em>Key Repeat Rate</em>.</p>

<h3 id="support-for-dynamic-polling-rates">Support for Dynamic Polling Rates</h3>

<p>Previously, the default poll interval was set to 1 ms - the lowest possible value - resulting in a polling rate of roughly 1000 Hz.
Apart from a few high-end custom devices, standard gamepads (such as an Xbox controller) operate at a hardware polling rate of only 125 Hz.
Polling at 1000 Hz meant most polls detected no new inputs, unnecessarily wasting CPU cycles.</p>

<p>The main reason the interval was originally kept so low involves output smoothness.
Actions that drive relative mouse movements or camera controls depend directly on the dispatch rate to remain smooth, because reading input and making operating system API calls both occur on the main processing thread.
While a bump from 125 Hz to 1000 Hz is barely noticeable on a desktop cursor, it makes a substantial difference when panning camera controls in a flight simulator.</p>

<p>To solve this trade-off, I introduced dynamic polling rates.
ControllerBuddy can now run at a much lower frequency when high output precision is unnecessary, saving CPU cycles and battery life on handhelds like the Steam Deck or laptops.
The moment an action sensitive to output frequency becomes active, ControllerBuddy automatically switches from the minimum rate to the maximum rate.
Users can customize these two states via <em>Min. Polling Rate</em> (default: 125 Hz) and <em>Max. Polling Rate</em> (default: 1000 Hz).</p>

<p>While testing at 1000 Hz, I noticed that garbage collection cycles under <a href="https://perfmatrix.com/serial-garbage-collector-gc/" target="_blank">SerialGC</a> could occasionally cause micro-stalls in the input thread.
To eliminate this, I switched back to the default <a href="https://en.wikipedia.org/wiki/Garbage-first_collector" target="_blank">Garbage-First (G1)</a> collector.
SerialGC was originally chosen to minimize the memory footprint on small heaps, but modern G1 delivers better pause times with negligible overhead.</p>

<p>Additionally, I further tuned the JVM memory configuration.
ControllerBuddy now operates with an initial heap size of 24 MB and a maximum of 48 MB, reducing the overall memory footprint more than ever before.</p>

<h3 id="client-server-optimizations">Client-Server Optimizations</h3>

<p>Another simple yet effective improvement targets ControllerBuddy’s networking code.<br />
As mentioned in my <a href="/#blog/origins-of-controllerbuddy" target="_blank">previous post</a>, ControllerBuddy was originally designed to operate across a network in client-server mode.
Although relatively few users rely on this setup, I continue to maintain it because it fits naturally into the overall architecture.</p>

<p>While refining the polling loop, I realized there was an easy way to drastically reduce network traffic between the server and the client.
Previously, the server transmitted state updates on every single poll, even when no inputs had changed - which is especially problematic at fast polling rates.
Now, state updates are sent only when an actual change in controller state occurs.<br />
Best of all, this change was entirely server-side and required no modifications to the network protocol or the client.</p>

<h3 id="preventing-null-pointer-exceptions">Preventing Null Pointer Exceptions</h3>

<p>To continuously improve code quality and safety, I integrated <a href="https://jspecify.dev/" target="_blank">JSpecify</a> annotations throughout the entire codebase.
This was a sizeable effort, but well worth it: in combination with static analysis tools like <a href="https://github.com/uber/NullAway" target="_blank">NullAway</a>, this makes the code more robust and maintainable while helping eliminate a number of redundant null checks that had accumulated over the years.</p>

<h3 id="mode-switching-improvements">Mode Switching Improvements</h3>

<p>Last but not least, I also refined how ControllerBuddy handles mode switches to eliminate unexpected control delays.</p>

<p>When a button is held down to switch modes - such as using the left stick to look around the cockpit instead of controlling the rudder and throttle axes - ControllerBuddy disables the stick for a moment upon releasing that button.
This safety pause gives the analog stick time to snap back to center, preventing an aircraft from violently jerking when primary flight controls are re-engaged.</p>

<p>Previously, this safety pause always enforced a strict one-second timer.
If a button was quickly pressed again to jump back into that mode, the stick remained unresponsive until that full second ran out.
ControllerBuddy now detects when a mode is re-entered and cancels the safety timer immediately.
This maintains protection against accidental inputs when leaving a mode, while ensuring rapid control toggles feel completely seamless.</p>]]></content><author><name>Matteo Hausner</name></author><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">The Origins of ControllerBuddy</title><link href="https://controllerbuddy.org/blog/origins-of-controllerbuddy" rel="alternate" type="text/html" title="The Origins of ControllerBuddy" /><published>2026-07-17T18:00:00+00:00</published><updated>2026-07-17T18:00:00+00:00</updated><id>https://controllerbuddy.org/blog/origins-of-controllerbuddy</id><content type="html" xml:base="https://controllerbuddy.org/blog/origins-of-controllerbuddy"><![CDATA[<!-- markdownlint-disable-file line-length -->

<h3 id="looking-back-">Looking Back <!-- markdownlint-disable-line heading-increment --></h3>

<p>While so far I have mainly posted development updates, today I felt like doing a different kind of post.</p>

<p>In about two months, ControllerBuddy will celebrate the 12th anniversary of its first line of code being written.
When looking at the <a href="https://github.com/bwRavencl/ControllerBuddy/commits/master/" target="_blank">Git commit history</a> of the ControllerBuddy project, one can see that my <a href="https://github.com/bwRavencl/ControllerBuddy/commit/9faa5d861c059c22ab56615e23f616fc4385b9c5" target="_blank">first commit</a> in the project was created on Saturday, September 27, 2014, shortly after 2:00 AM.
At that point in time, the project was still called <em>RemoteStick</em> - but more on that later…</p>

<p>So get ready and fasten your seatbelts, because in this post I would like to take you on a wild ride back to the origins of ControllerBuddy to explain what influenced its design and how it all started.</p>

<h3 id="an-early-interest-in-aviation">An Early Interest in Aviation</h3>

<p>From a young age, I have been fascinated by all things aviation-related.
My grandfather, who enjoyed building and flying RC model airplanes, was a big influence on me.
Even before I reached kindergarten age, I would spend hours in his workshop watching him build and repair his models.
Often, I would accompany him to the flying field and watch him fly them.</p>

<h3 id="first-steps-in-computing">First Steps in Computing</h3>

<p>Shortly before turning seven, I got my <a href="http://kath-rottal.homeunix.org/computermuseum/Computer/Nixdorf/Nixdorf%208810%20M45/slides/Nixdorf%208810%20M45%20(1).html" target="_blank">first PC</a>, with an <a href="https://en.wikipedia.org/wiki/I486" target="_blank">Intel 486 DX2-66</a> running <a href="https://en.wikipedia.org/wiki/MS-DOS" target="_blank">MS-DOS</a> 6.22.<br />
Given my interest in aviation, I quickly got into flight simulators, starting with classic titles such as:</p>

<!-- markdownlint-disable no-inline-html -->
<ul style="display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 30ch), 1fr)); gap: 0.5rem 2.5rem; margin: 1rem 0; padding-left: 1.2rem">
  <li><a href="https://www.mobygames.com/game/228/secret-weapons-of-the-luftwaffe/" target="_blank">Secret Weapons of the Luftwaffe</a></li>
  <li><a href="https://www.mobygames.com/game/4226/air-duel-80-years-of-dogfighting/" target="_blank">Dogfight: 80 Years of Aerial Warfare</a></li>
  <li><a href="https://www.mobygames.com/game/773/tfx/" target="_blank">TFX</a></li>
  <li><a href="https://www.mobygames.com/game/1674/microsoft-flight-simulator-v50/" target="_blank">Microsoft Flight Simulator 5.0</a></li>
  <li><a href="https://www.mobygames.com/game/9967/shuttle-the-space-flight-simulator/" target="_blank">Shuttle: The Space Flight Simulator</a></li>
  <li><a href="https://www.mobygames.com/game/23350/mig-29-fulcrum/" target="_blank">MiG-29 Fulcrum</a></li>
  <li><a href="https://www.mobygames.com/game/1766/red-baron/" target="_blank">Red Baron</a></li>
  <li><a href="https://www.mobygames.com/game/1739/apache/" target="_blank">Apache</a></li>
  <li><a href="https://www.mobygames.com/game/2904/su-27-flanker/" target="_blank">Su-27 Flanker</a></li>
  <li><a href="https://www.mobygames.com/game/4540/fleet-defender/" target="_blank">Fleet Defender</a></li>
</ul>
<!-- markdownlint-enable no-inline-html -->

<p>At first, I was using a simple, two-axis, two-button joystick called the <a href="https://web.archive.org/web/20260716125243/https://i.ebayimg.com/images/g/FDIAAOSwwxFl0fcC/s-l1600.jpg" target="_blank">InterAct PC Mission</a>, which I got for my birthday.<br />
After it broke, I was upgraded to an original <a href="https://www.dosdays.co.uk/media/logitech/wingman_2.png" target="_blank">Logitech WingMan</a>, which even featured a small thumbwheel for throttle control!</p>

<p>From back then until today, flight simulation has always been an important part of my life.
I have spent time with almost every simulator I could get my hands on.</p>

<h3 id="first-steps-with-rc-aircraft">First Steps With RC Aircraft</h3>

<p>At around nine years old, I got my first RC model airplane, a <a href="https://wiki.rc-network.de/wiki/Panda_von_Multiplex" target="_blank">Multiplex Panda</a> - a wonderful, beginner-friendly model.
Along with it, I also got my first RC transmitter, the <a href="https://wiki.rc-network.de/wiki/Multiplex_Fernsteuersender_%C3%9Cbersicht#europa_sprint" target="_blank">Multiplex Europa Sprint</a>.</p>

<p>The reason I am mentioning all this is that the basic layout of RC transmitters, particularly the so-called <a href="https://web.archive.org/web/20230506210607/http://www.rcgroups.com/forums/showatt.php?attachmentid=714749" target="_blank"><em>Mode 2</em></a> layout, forms the basis of all my profiles for ControllerBuddy.
Mode 2 means that the left stick controls the throttle and rudder, while the right stick controls the ailerons and elevator. It’s worth noting that the left stick’s Y-axis is not spring-loaded, unlike a standard game controller you may be familiar with.</p>

<h3 id="springs-and-broken-hardware">Springs and Broken Hardware</h3>

<p>Skipping ahead a few years, during the early 2000s, I started using an original <a href="https://en.wikipedia.org/wiki/DualShock#DualShock" target="_blank">Sony DualShock</a> controller together with a special <a href="https://web.archive.org/web/20260716131123/https://m.media-amazon.com/images/I/517PedsgsgL.jpg" target="_blank">USB converter</a>.
I mainly used the DualShock for RC simulators, such as <a href="https://web.archive.org/web/20040611111328/http://www.aerofly.de/index.html" target="_blank">Aerofly Professional</a> and <a href="https://web.archive.org/web/20070216094229/http://www.aerofly.de/www/gallery.html" target="_blank">Aerofly Professional Deluxe</a>.
While this felt like a good solution, at least for RC simulators, it had a big drawback: like all game controllers, the DualShock’s sticks had a spring-loaded center position, which made it impossible to hold the throttle at a specific position without constantly applying pressure on the stick.</p>

<p>At the same time, for traditional flight simulators, I was using the legendary <a href="https://en.wikipedia.org/wiki/Microsoft_SideWinder_Force_Feedback_2" target="_blank">Microsoft SideWinder Force Feedback 2</a> joystick.
It was a great device for its time, but it had a very limited number of buttons and switches.<br />
Some of the sims I was flying around that time were:</p>

<!-- markdownlint-disable no-inline-html -->
<ul style="display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 30ch), 1fr)); gap: 0.5rem 2.5rem; margin: 1rem 0; padding-left: 1.2rem">
  <li><a href="https://www.mobygames.com/game-group/microsoft-flight-simulator-series" target="_blank">Microsoft Flight Simulator series</a></li>
  <li><a href="https://www.mobygames.com/game/1675/microsoft-combat-flight-simulator-wwii-europe-series/" target="_blank">Microsoft Combat Flight Simulator</a></li>
  <li><a href="https://www.mobygames.com/game/14558/il-2-sturmovik-forgotten-battles/" target="_blank">IL-2 Sturmovik: Forgotten Battles</a></li>
  <li><a href="https://www.mobygames.com/game/11732/lock-on-modern-air-combat/" target="_blank">Lock On: Modern Air Combat</a></li>
  <li><a href="https://www.mobygames.com/game/20430/falcon-40-allied-force/" target="_blank">Falcon 4.0: Allied Force</a></li>
  <li><a href="https://www.mobygames.com/group/8345/wings-over-series/" target="_blank">Wings over Vietnam / Europe</a></li>
  <li><a href="https://www.mobygames.com/group/6348/x-plane-series/" target="_blank">X-Plane 8 / 9</a></li>
</ul>
<!-- markdownlint-enable no-inline-html -->

<p>During the late 2000s, I got my first <a href="https://en.wikipedia.org/wiki/HOTAS" target="_blank">HOTAS</a> setups: first a second-hand <a href="https://www.combatsim.com/htm/nov99/x36-usb.htm" target="_blank">Saitek X36</a> from eBay, and then a <a href="https://en.wikipedia.org/wiki/Saitek_X52" target="_blank">Saitek X52</a>.
Being second-hand, the X36 was already a bit worn out and broke down after a few months of use.
The throttle of the X52 also broke down after less than a year of use and was replaced by Saitek.
But even then, the X52 system had a weird issue where if it was used in conjunction with the Saitek mapping software, rapid, repeated button presses would trigger a hardware bug that caused the device to reset itself.
When I got the X52, the market for HOTAS setups was quite small compared to today, and the only other main option was the <a href="https://www.kultboy.com/joystick/224/" target="_blank">Thrustmaster HOTAS Cougar</a>.</p>

<p>After my rather negative experiences with the Saitek devices, I was not willing to spend any more money on a new HOTAS setup.
I bought an original <a href="https://en.wikipedia.org/wiki/Xbox_360_controller#Xbox_360_controller" target="_blank">Xbox 360 controller</a> with which I experimented a bit in conjunction with <a href="https://www.mobygames.com/game/microsoft-flight-simulator-2004-a-century-of-flight" target="_blank">Flight Simulator 2004</a>, but with the mapping options available at the time, it was not really possible to get a good experience with a game controller.<br />
Before moving to a new apartment in 2013, I also had to downsize my setup, and thus used a very cheap and weird-looking <a href="https://web.archive.org/web/20260716140410/https://c1.neweggimages.com/productimage/nb1280/26-618-025-08.jpg" target="_blank">Mad Catz Cyborg V.1</a> joystick for a while.
Since I was not flying so much at that time anyway, I did not mind the limitations of the device too much.</p>

<h3 id="war-thunder-and-x-plane-lead-the-way">War Thunder and X-Plane Lead the Way</h3>

<p>In May of 2014, I got interested in <a href="https://www.mobygames.com/game/73606/war-thunder/" target="_blank">War Thunder</a>, which had a very flexible controller mapping system that offered <a href="https://youtu.be/akzzSO4chZo" target="_blank">relative axes</a>.
A few months earlier, I had also acquired a <a href="https://en.wikipedia.org/wiki/DualShock#DualShock_3" target="_blank">DualShock 3</a> controller.
Together with War Thunder’s mapping capabilities, it allowed me to get an excellent flying experience after some experimentation.<br />
Basically, I was able to recreate the Mode 2 layout I was familiar with from flying RC planes and expand on it.
Using the left stick’s Y-axis for throttle control was no longer a problem in War Thunder because I could map it as a relative axis to overcome the spring loading.
Crucially, it was also possible to use modifiers to bind the look axes onto the same stick.
While you cannot compare War Thunder with a more sophisticated simulator like DCS, the basic layout behind all ControllerBuddy profiles today was established right then.</p>

<p>After spending a few months with War Thunder, I wanted to get back into traditional flight simulators - especially <a href="https://www.mobygames.com/game/60600/x-plane-10-global-edition/" target="_blank">X-Plane 10</a>, which I had used for years.
That’s when I wrote a small X-Plane plugin in <a href="https://en.wikipedia.org/wiki/C_(programming_language)" target="_blank">C</a> called <a href="https://github.com/bwRavencl/X-Gamepad" target="_blank">X-Gamepad</a>.
This plugin allowed me to use a game controller with X-Plane 10 in a very similar way to War Thunder, but with a few improvements.</p>

<p>I was so happy with the result that I never wanted to go back to using a HOTAS or joystick again, and I started to think about how I could use a game controller with other flight simulators as well.<br />
At that time, I was using a <a href="https://en.wikipedia.org/wiki/MacBook_Pro#Retina_(2012%E2%80%932016)" target="_blank">2012 MacBook Pro</a> running <a href="https://en.wikipedia.org/wiki/MacOS" target="_blank">OS X</a>.
While War Thunder and X-Plane 10 ran natively on OS X, I dearly missed a modern combat flight simulator like Lock On, which I had played during the mid-2000s on Windows.
Lock On was already more than 10 years old at that time and ran reasonably well within a Windows virtual machine.
This meant I could run it on my MacBook, but I couldn’t control it the way I wanted…</p>

<h3 id="the-remotestick-prototype">The RemoteStick Prototype</h3>

<p>So, I came up with a plan to take what I had built specifically for X-Plane, split it up into generic building blocks, and make it universally usable with every simulator.</p>

<p>The central goals for my new project were:</p>

<ol>
  <li>Support any flight simulator running on Windows.</li>
  <li>Support any game controller on any host operating system (in my case, OS X).</li>
  <li>Provide a graphical user interface to build and edit profiles.</li>
</ol>

<p>Part of the solution to the first problem came in the form of <a href="https://sourceforge.net/projects/vjoystick/" target="_blank">vJoy</a>, which was developed by Shaul Eizikovich as open-source software.
It is a virtual joystick driver for Windows that allows you to create virtual joysticks and feed them input from any source.
Instead of targeting a specific game, my new approach would emulate joystick, keyboard, and mouse inputs.
This would make it usable with every simulator out there.</p>

<p>Since I was using the DualShock 3 controller connected via Bluetooth to my MacBook Pro, I needed a way to get the input from the controller into Windows.
Looping the Bluetooth connection through the virtual machine was not possible at that time, so I needed a way to send the inputs over the network.
I decided on a two-part solution consisting of a server application running on the host operating system, which would read the input from the controller, apply the necessary mappings, and send the resulting data to a client application running on Windows.
The client would then feed that input into vJoy and the Windows API to simulate input events.</p>

<p>I chose to write the server application in <a href="https://en.wikipedia.org/wiki/Java_(programming_language)" target="_blank">Java</a> since it was fast, a good fit for cross-platform support, and the language I had the most experience with.
For the smaller client, I went with <a href="https://en.wikipedia.org/wiki/C_Sharp_(programming_language)" target="_blank">C#</a> because vJoy came with examples for it and it felt the most natural for accessing Windows APIs.</p>

<p>Within a few weeks, I had cobbled together a rough prototype of both applications, which I named <em>RemoteStick Server</em> and <a href="https://github.com/bwRavencl/RemoteStickClient" target="_blank"><em>RemoteStick Client</em></a> - that was in the autumn of 2014.
Then after the new semester at university started, work on RemoteStick stalled.</p>

<h3 id="the-impetus">The Impetus</h3>

<p>A short time later, I became quite annoyed with the declining quality of OS X, as well as the sub-par performance I was experiencing with X-Plane and other games on my MacBook, so I decided it was time to switch systems again.
I settled on a ZOTAC mini-PC, the <a href="https://www.zotac.com/de/product/mini_pcs/en760" target="_blank">ZBOX EN760</a>, running Linux and was quite happy for a while.
For the better part of a year, I mainly ran X-Plane and War Thunder on my new Linux PC, gradually improving X-Gamepad and expanding upon it (for example, by adding support for helicopters and add-on aircraft that required specific commands).</p>

<p>Then, after visiting the <a href="https://youtu.be/2LNY_hlcnmg" target="_blank">Jet World Masters 2015</a> in Leutkirch, the itch to fly some modern military jets got me again.
I decided to give <a href="https://www.digitalcombatsimulator.com/" target="_blank">DCS World</a> a try on my new system.
Since this was by no means a powerful gaming PC, it barely ran DCS.
Luckily, only a short time later, version 1.5 of DCS was released, which greatly improved performance with the introduction of Direct3D 11.
Also, because this was well before the recent rise of Linux as a gaming platform, I grudgingly had to switch over to Windows to enjoy DCS.<br />
But merely switching to Windows was not enough, I also needed a way to fly in DCS with my preferred control scheme.</p>

<h3 id="two-intense-weeks">Two Intense Weeks</h3>

<p>So, I dug out the RemoteStick prototype I had written almost a year earlier and began to extend it.
Basically, I wanted to get rid of the C# client and have it all in a single application that could run as a single instance feeding directly to vJoy when operating locally.
Nevertheless, I decided to keep the client-server mode alive as an option.
Now, however, the client and server would be the exact same Java application running in different modes.</p>

<p>While much of the foundation was already there, I worked incredibly hard on it for about two weeks, and what came out in the end was the first version of ControllerBuddy.
Since the main focus of the application was no longer remote control, I changed the name from RemoteStick to ControllerBuddy.
All of this happened between the end of August and the beginning of September 2015.</p>

<p>This initial version of ControllerBuddy worked great for me.
I used it extensively with DCS at first, and then began diving back into other simulators such as <a href="https://www.mobygames.com/game/51970/il-2-sturmovik-cliffs-of-dover/" target="_blank">IL-2 Sturmovik: Cliffs of Dover</a> and <a href="https://www.mobygames.com/game/88507/il-2-sturmovik-battle-of-stalingrad/" target="_blank">IL-2 Sturmovik: Battle of Stalingrad</a>.</p>

<h3 id="building-an-ecosystem">Building an Ecosystem</h3>

<p>Compared to the software today, the 2015 version of ControllerBuddy still had many rough edges.
It was designed purely for my personal use and lacked not only many features it has today - like the Overlay or Profile Visualizations - but it also did not come with any documentation.</p>

<p>While browsing flightsim subreddits, I occasionally encountered people looking for advice on how to use a game controller for flying.
I knew I had the exact tool they needed, but setting it up, configuring the simulators for it, and explaining the concepts behind ControllerBuddy would have been incredibly time-consuming.<br />
So, over the following years, I refined not only the application itself but also the whole ecosystem around it to make it accessible to everyone.<br />
Essential components like the <a href="https://controllerbuddy.org" target="_blank">website</a> you are on now, the <a href="https://github.com/bwRavencl/ControllerBuddy-Install-Script" target="_blank">Install-Script</a>, and the <a href="https://youtube.com/playlist?list=PLCrcgiMjHO83vtSqCKeNuXt_ZotBfFQ81&amp;si=eQH4lJqFRTy7DXJH" target="_blank">videos</a> came into being.<br />
On the profile side, while I started out with a handful of profiles for DCS modules, I gradually expanded the official <a href="https://github.com/bwRavencl/ControllerBuddy-Profiles" target="_blank">profile repository</a> to support more and more simulators, both new and old.
Today, the repository counts a total of 94 profiles!</p>

<p>While I still see myself as the primary user of ControllerBuddy, quite a few features and enhancements over the years were directly based on feedback from a slowly growing user base.
I cannot tell exactly how many people use ControllerBuddy, but based on release download statistics, I estimate there are probably at least a few hundred long-term users.<br />
This might be a good point to say: if you are a user and enjoy ControllerBuddy, let me know!
Drop a line on <a href="https://discord.gg/2Sg9ggZrAp" target="_blank">Discord</a>.
While most people join the Discord to get technical help - which was the main intention behind it - it is always wonderful to hear from people who are simply enjoying what I built.</p>

<h3 id="ten-years-and-33000-lines-later">Ten Years and 33,000 Lines Later</h3>

<p>When I wrote the first line of code for this hobby project back in 2014, I would never have guessed that I would still be working on it more than a decade later, nor would I have believed that I would put more than 10,000 hours into this side project, which now spans more than 33,000 lines of code.</p>

<p>All in all, I am still very happy with the technical foundation I chose back then.
Java has proven to be a solid choice for this project.<br />
While Java may seem like an unusual choice for a gaming tool, I couldn’t be happier with the decision.
In fact, over the last ten years, there have been countless improvements to the platform that make it better suited than ever for developing desktop applications and small utilities.<br />
For a long time now, ControllerBuddy has been shipped as a <a href="https://docs.oracle.com/en/java/javase/26/docs/specs/man/jpackage.html" target="_blank">self-contained application</a> with a download size of about 30 MB.
In an era where shipping desktop apps at sizes of hundreds of megabytes is the norm, that’s a number I can live with.<br />
The same goes for memory consumption: after a few recent optimizations, ControllerBuddy uses about 100 to 150 MB of RAM - an amount that is completely negligible, even on low-end systems.</p>

<p>Many of the architectural choices, like the client-server architecture, have also proven to be highly powerful and extensible over the years.
While I have refactored many essential parts and switched out underlying libraries more than once, the basic architecture remains the same as it was in 2014 because it simply works.</p>

<p>I still work on ControllerBuddy almost every day in one way or another.
While there are periods with relatively little change, during which only dependencies get updated, there are also times when I have grander ideas.
These include user interface overhauls or even monumental tasks like switching out the underlying input system from <a href="https://www.glfw.org/" target="_blank">GLFW</a> to <a href="https://www.libsdl.org/" target="_blank">SDL3</a>, which I undertook in early 2025.
Most of the time, such ideas just come to me on a whim when I learn something new or get excited to try out a promising technology.<br />
Next to working on the core application, there are always things to improve or expand upon on the website or the Install-Script, or a new simulator module gets released and a profile has to be created for it.
All I’m saying is that it never gets boring…</p>

<h3 id="finishing-line">Finishing Line</h3>

<p>Congratulations on making it this far, and thank you very much for your interest!</p>

<p>I have no idea how many people actually read these posts.
If I had to guess, I’d say the number is probably very small.<br />
That’s why I’d love to hear from you!
I want to know what kind of posts you find interesting and learn a bit more about my audience.
Your feedback helps me decide how many technical details to include and whether it’s worth my time to continue writing posts like this one.
The best way to reach me is via <a href="https://discord.gg/2Sg9ggZrAp" target="_blank">Discord</a>.</p>]]></content><author><name>Matteo Hausner</name></author><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">June 2026 Status Update</title><link href="https://controllerbuddy.org/blog/status-update-june-2026" rel="alternate" type="text/html" title="June 2026 Status Update" /><published>2026-06-25T21:00:00+00:00</published><updated>2026-06-25T21:00:00+00:00</updated><id>https://controllerbuddy.org/blog/status-update-june-2026</id><content type="html" xml:base="https://controllerbuddy.org/blog/status-update-june-2026"><![CDATA[<!-- markdownlint-disable-file line-length -->

<h3 id="sun-sweat-and-status-reports-">Sun, Sweat, and Status Reports <!-- markdownlint-disable-line heading-increment --></h3>

<p>With a major heatwave currently sweeping across Central Europe, summer is well and truly here. But despite the sweltering temperatures, I am keeping up with my resolution to post regular updates on the development of ControllerBuddy. Here is a look at the most important news and changes from June and the better part of May 2026.</p>

<h3 id="assignments-tab-overhaul">Assignments Tab Overhaul</h3>

<p>In the <a href="/#blog/status-update-may-2026" target="_blank">May 2026 Status Update</a>, I reported on the refinements I worked on for the <em>Component Editor</em>. During the last few weeks, I took it upon myself to overhaul the <em>Assignments</em> tab.</p>

<p>While the overall layout and functionality did not change, the aesthetics changed quite a bit. Although the old look was very functional, it clearly lacked the outline of a controller.<br />
The previous iteration of this central part of the user interface was introduced in 2018. At that time, ControllerBuddy did not yet have a userbase to speak of. Consequently, looks were really not that important back then. In fact, at that point in time, ControllerBuddy did not even use the <a href="https://www.formdev.com/flatlaf/" target="_blank">FlatLaf</a> Look And Feel, which was introduced during 2019.</p>

<p>All in all, I hope the new look catches on with people. As always, when reworking older sections, small bugs and inconsistencies get fixed, and as a result, the overall quality of the codebase improves - it was no different in this case.</p>

<h3 id="reducing-memory-footprint">Reducing Memory Footprint</h3>

<p>Motivated by the seemingly never-ending surge in computer hardware costs, I took some time to reduce the memory footprint of ControllerBuddy. While ControllerBuddy was never a resource hog to begin with - before my efforts, it typically consumed between 200 and 300 MB of RAM - it now sits at about 180 to 200 MB.</p>

<p>The reduction in RAM usage comes primarily from the fact that I disabled the <a href="https://en.wikipedia.org/wiki/HotSpot" target="_blank">C2 compiler</a> of the JVM. While in theory this reduces the optimization level that long-running code in the JVM can reach and thus theoretically increases the CPU footprint, ControllerBuddy is in no way CPU-bound and typically uses less than 1% of CPU anyway. Therefore, there is no measurable drawback to giving up a tiny bit of runtime optimization in exchange for reducing the memory footprint by nearly one-third.</p>

<h3 id="issues-with-controller-detection">Issues with Controller Detection</h3>

<p>One of the most regular issues encountered by people using ControllerBuddy involves controller detection problems. Very often, these issues concern third-party Xbox controllers. This sometimes results in lengthy troubleshooting sessions with users I am trying to help. Recently, I had another one of these sessions with a new user who had trouble getting their PDP Afterglow controller to work.</p>

<p>Under the hood, ControllerBuddy relies on <a href="https://libsdl.org/" target="_blank">SDL3</a> for controller abstraction. Depending on the operating system and the particular controller model, SDL uses different APIs to communicate with the controller hardware. On Windows, for Xbox-compatible controllers, this is usually <a href="https://en.wikipedia.org/wiki/DirectInput#XInput" target="_blank">XInput</a>.</p>

<p>In this particular case, the solution to the problem was to force SDL to fall back to other APIs by disabling XInput via a <a href="https://wiki.libsdl.org/SDL3/SDL_HINT_XINPUT_ENABLED" target="_blank">special environment variable</a>. While this fixed the problem for this user, explaining to non-computer-savvy users how to create an environment variable - which may or may not solve the issue for them - can be a pretty lengthy process.<br />
Thus, in order to simplify things, I added a new setting to ControllerBuddy that allows disabling XInput specifically for the application via a checkbox in the <em>Global Settings</em> tab. I hope that this new option will help people self-troubleshoot similar issues in the future.</p>

<h3 id="dcs-f-100d-legacy-sims-and-il-2-korea">DCS F-100D, Legacy Sims, and IL-2 Korea</h3>

<p>June 2026 also saw the release of the <a href="https://grinnellidesigns.com/" target="_blank">Grinnelli Designs</a> <a href="https://grinnellidesigns.com/f-100d/" target="_blank">F-100D Super Sabre</a> for DCS. I was really looking forward to this new module, and I have to say I have not been disappointed at all. Flying the F-100D has been great fun so far, and waiting for it was well worth the time. For a first commercial release, the Grinnelli folks really did an awesome job!<br />
After the module was released on June 12th, I quickly got to work and was able to provide an official ControllerBuddy profile for it merely a few hours later.</p>

<p>Before jumping into the F-100D, I spent some of my time diving back into old sims from the 90s on my <a href="https://store.steampowered.com/steamdeck" target="_blank">Steam Deck</a>. I particularly enjoyed my time with the recent Steam re-release of <a href="https://store.steampowered.com/app/3146140/F22_Air_Dominance_Fighter" target="_blank">F-22: Air Dominance Fighter</a> and with the classic <a href="https://en.wikipedia.org/wiki/F-15_Strike_Eagle_III" target="_blank">F-15 Strike Eagle III</a>, <a href="https://en.wikipedia.org/wiki/Falcon_3.0" target="_blank">Falcon 3.0</a>, and my childhood favorite <a href="https://en.wikipedia.org/wiki/Jetfighter_III" target="_blank">Jetfighter III</a>.<br />
As a result, the profiles for these games have received some tweaks and improvements.</p>

<p>Finally, I am looking forward to the upcoming release of <a href="https://il2-korea.com/" target="_blank">IL-2 Korea</a> in August. While this new entry to the IL-2 series is already available in early access, I decided to wait for its release on Steam. After getting hold of it, I plan to quickly come up with a profile and configuration script for it, assuming the current <a href="https://github.com/valvesoftware/proton/issues/9906" target="_blank">issues</a> it has when running on Linux with <a href="https://github.com/ValveSoftware/Proton" target="_blank">Proton</a> are solved by then.</p>]]></content><author><name>Matteo Hausner</name></author><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">May 2026 Status Update</title><link href="https://controllerbuddy.org/blog/status-update-may-2026" rel="alternate" type="text/html" title="May 2026 Status Update" /><published>2026-05-04T17:10:00+00:00</published><updated>2026-05-04T17:10:00+00:00</updated><id>https://controllerbuddy.org/blog/status-update-may-2026</id><content type="html" xml:base="https://controllerbuddy.org/blog/status-update-may-2026"><![CDATA[<!-- markdownlint-disable-file line-length -->

<h3 id="aloha-">Aloha! <!-- markdownlint-disable-line heading-increment --></h3>

<p>It has been a few months since the February update, and while the weather is warming up, the development pace for ControllerBuddy hasn’t cooled down.</p>

<p>The slight delay in getting this post out was for a very special reason: my recent trip to Hawaii, where my wife and I officially tied the knot! We had a truly wonderful time celebrating our marriage and enjoyed the break immensely after a busy start to the new year.</p>

<p>As always, work on ControllerBuddy has continued with a variety of updates and enhancements. Here are the details on what has changed since my last news post.</p>

<h3 id="refining-the-component-editor">Refining the Component Editor</h3>

<p>A major focus since the last news post was a significant overhaul of the <em>Component Editor</em> dialog to make profile creation more intuitive. The goal was to add documentation for the different types of Actions and integrate it directly into the interface. To achieve this, a contextual help system for Actions and their properties was added, providing immediate guidance where it’s needed most.</p>

<p>Furthermore, UTF-8 symbols for each Action type and property were added to make them more recognizable at a glance and to make the dialog less monotonous. Moreover, the layout of the entire dialog was improved for better flow and clarity. Finally, the descriptions of the assigned Actions are now displayed directly within the <em>Assigned Actions</em> list, which is especially helpful when multiple Actions of the same type are assigned simultaneously.</p>

<h3 id="flexible-action-delays">Flexible Action Delays</h3>

<p>A seemingly small but powerful new feature is the introduction of customizable action delays. Previously, Actions that had the <em>Delayed Action</em> property enabled featured a fixed delay of 1 second, meaning a button had to be held down for at least that long before the Action triggered. A new property called <em>Delay</em> was added, which is a freely configurable time interval. This offers far more precision for specific controller or simulator needs, allowing for much more flexibility in how inputs are processed.</p>

<h3 id="leveraging-agents-for-documentation-and-tests">Leveraging Agents for Documentation and Tests</h3>

<p>Like most people in software, I’ve started using AI coding agents recently to handle the kind of tedious work that usually falls by the wayside. This has allowed me to tackle codebase improvements that would have simply taken too much time to do manually.</p>

<p>To start, an <a href="https://agents.md/" target="_blank"><code class="language-plaintext highlighter-rouge">AGENTS.md</code></a> file was added to the repository. This file is specifically designed to help coding agents navigate the project structure and understand the coding standards more effectively.</p>

<p>Until recently, the codebase of ControllerBuddy contained no documentation at all. With the help of AI, <a href="https://en.wikipedia.org/wiki/Javadoc" target="_blank">Javadoc</a> comments were added to the entire codebase. While these were mostly generated using the aforementioned agents, they provide essential context for every class and method, making the project easier to navigate and maintain in the future.</p>

<p>In the same vein, the codebase lacked any tests. Over a few days, leveraging AI, nearly 600 tests were created, including unit tests and tests of the complete input pipeline. These tests have already uncovered a few minor bugs that were promptly fixed, and they are primarily meant to prevent potential regressions in the future.</p>

<p>The above changes significantly improve the overall maturity of the codebase, and would never have been implemented if I had to write them all by hand due to the massive time investment required. While the usage of agents made these additions feasible in the first place, a significant amount of time still had to go into reviewing and tweaking the vast amount of code that was generated. At this point in time, the testing code alone comprises nearly 10,000 lines!</p>

<h3 id="java-profile-and-install-script-updates">Java, Profile, and Install Script Updates</h3>

<p>Continuing the tradition of staying up-to-date with the Java ecosystem, a switch from JDK 25 to the newly released <a href="https://openjdk.org/projects/jdk/26/" target="_blank">JDK 26</a> was made to utilize the latest performance improvements and JVM features.</p>

<p>A small update of the Install Script was necessary to support <a href="https://gitforwindows.org/" target="_blank">Git for Windows</a> version 2.54.0. If you’ve been having trouble with a fresh install, this update should clear things right up.</p>

<p>On the profile side, a new profile was added for the Steam re-release of the classic <a href="https://store.steampowered.com/app/3146140/F22_Air_Dominance_Fighter" target="_blank">F-22: Air Dominance Fighter</a>.<br />
To celebrate its release, I created <a href="https://www.youtube.com/watch?v=6AKwhZJNnHA" target="_blank">a quick video</a> to showcase how well the F-22 ADF works with ControllerBuddy on the Steam Deck.</p>

<p>As always, various small improvements to several existing profiles were also implemented.</p>]]></content><author><name>Matteo Hausner</name></author><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">February 2026 Status Update</title><link href="https://controllerbuddy.org/blog/status-update-february-2026" rel="alternate" type="text/html" title="February 2026 Status Update" /><published>2026-02-13T23:00:30+00:00</published><updated>2026-02-13T23:00:30+00:00</updated><id>https://controllerbuddy.org/blog/status-update-february-2026</id><content type="html" xml:base="https://controllerbuddy.org/blog/status-update-february-2026"><![CDATA[<!-- markdownlint-disable-file line-length -->

<h3 id="a-new-year-new-updates-">A New Year, New Updates <!-- markdownlint-disable-line heading-increment --></h3>

<p>How time flies… we are now well into February, and it has already been a busy start to the year. Since my last post in early December, I have been working on several updates and improvements to ControllerBuddy and its broader ecosystem, the details of which I would like to share here.</p>

<h3 id="linux-guides-published">Linux Guides Published</h3>

<p>As announced in my <a href="/#blog/looking-back-at-2025" target="_blank">previous post</a>, I have been writing detailed setup guides to assist users interested in running ControllerBuddy on Linux. These guides have now been published in the <a href="https://github.com/bwRavencl/ControllerBuddy-Linux-Guides" target="_blank">ControllerBuddy-Linux-Guides</a> repository on GitHub.</p>

<p>The repository currently includes guides for:</p>

<ul>
  <li>DCS World</li>
  <li>EF2000 V2.0</li>
  <li>Falcon 3.0</li>
  <li>Jane’s Fighters Anthology</li>
  <li>IL-2 Sturmovik: 1946</li>
  <li>IL-2 Sturmovik: Great Battles</li>
  <li>Strike Fighters</li>
</ul>

<p>A guide for Falcon BMS is currently in the works and will be added in the future.</p>

<h3 id="controllerbuddy-development-updates">ControllerBuddy Development Updates</h3>

<p>Next to the usual smaller bug fixes and optimizations, I have been working on a few larger features and improvements for ControllerBuddy itself, which I would like to highlight here:</p>

<h4 id="activation-intervals">Activation Intervals</h4>

<p>I have redefined the meaning of the activation interval for single-immediate and single-on-release actions. Previously, this interval was ill-defined for these action types and offered little practical utility. With this change, the activation interval now directly controls the precise duration a joystick button, key, or mouse button is held down in all cases, enabling outputs to be performed over a defined, prolonged time interval.</p>

<h4 id="visualization-tab">Visualization Tab</h4>

<p>Profile visualizations now feature a dedicated legend to clearly depict the meaning of the various symbols used in the depiction. Additionally, I have implemented panning support, allowing users to move the visualization when zoomed in. This should make it significantly easier to navigate and analyze complex profiles.</p>

<h4 id="packaging">Packaging</h4>

<p>I have implemented packaging optimizations that reduced the overall size of the <code class="language-plaintext highlighter-rouge">.zip</code> and <code class="language-plaintext highlighter-rouge">.tgz</code> archives by a few megabytes. Depending on the platform, this results in an archive size of approximately 30 to 34 MB, which is quite reasonable compared to some other modern applications.</p>

<h4 id="wayland-support">Wayland Support</h4>

<p>I have begun work on native <a href="https://wayland.freedesktop.org/" target="_blank">Wayland</a> support for Linux, leveraging the <a href="https://github.com/JetBrains/JetBrainsRuntime" target="_blank">JetBrains Runtime</a>. This is an ongoing effort, and you can track the current progress and technical milestones in a dedicated <a href="https://github.com/bwRavencl/ControllerBuddy/issues/485" target="_blank">GitHub issue</a>. While ControllerBuddy currently works well on Wayland via XWayland, native support remains a long-term goal that depends on developments within the Wayland, JetBrains Runtime, and <a href="https://openjdk.org/projects/wakefield" target="_blank">Wakefield</a> projects.</p>

<h3 id="new-profiles-and-install-script-improvements">New Profiles and Install Script Improvements</h3>

<p>Two new profiles have been added to the <a href="https://github.com/bwRavencl/ControllerBuddy-Profiles" target="_blank">ControllerBuddy-Profiles</a> repository:</p>

<ol>
  <li><a href="https://controllerbuddy.org/#profiles/Nuclear_Option.html" target="_blank">Nuclear Option</a></li>
  <li><a href="https://controllerbuddy.org/#profiles/Falcon_BMS_F-15.html" target="_blank">F-15 profile for Falcon BMS</a> (This was requested by multiple users, so I have finally taken the time to create it.)</li>
</ol>

<p>In addition, as always, I have been making minor adjustments and improvements to existing profiles and the configuration scripts to ensure they remain up-to-date and continue to provide the best possible experience for users.</p>

<p>Last but not least, I have made various smaller improvements to the install script, including better error handling.</p>]]></content><author><name>Matteo Hausner</name></author><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Looking Back at 2025 - Progress and Milestones</title><link href="https://controllerbuddy.org/blog/looking-back-at-2025" rel="alternate" type="text/html" title="Looking Back at 2025 - Progress and Milestones" /><published>2025-12-07T15:00:00+00:00</published><updated>2025-12-07T15:00:00+00:00</updated><id>https://controllerbuddy.org/blog/looking-back-at-2025</id><content type="html" xml:base="https://controllerbuddy.org/blog/looking-back-at-2025"><![CDATA[<!-- markdownlint-disable-file line-length -->

<h3 id="the-news-section-debuts-">The News Section Debuts! <!-- markdownlint-disable-line heading-increment --></h3>

<p>A long-term goal since ControllerBuddy’s inception 11 years ago has been to make it more accessible and better documented. While the software was always perfectly usable, the addition of the website, tutorial videos, and install script over the past years have steadily made it easier for a wider audience to set it up. As a direct result, the number of users from all over the world has steadily increased over the last few years.</p>

<p>In the same vein, in order to communicate new features and changes more effectively, I decided to introduce a dedicated news section on the website, which you are reading right now! If all goes well, I plan to post regular updates about new releases, features, and other relevant topics here in the future.</p>

<p>With the year coming to an end, I naturally tend to reflect on the progress made over the past twelve months, making it the perfect theme for this very first news post.<br />
So, without further ado, let’s dive into what was achieved in the past months:</p>

<h3 id="the-year-of-the-linux-desktop">The Year of the Linux Desktop</h3>

<p>For me, 2025 was somewhat of a turning point with my switch to <a href="https://kernel.org/" target="_blank">Linux</a> (I use <a href="https://archlinux.org/" target="_blank">Arch</a>, by the way) as my daily driver.</p>

<p>Having used Linux for gaming and simming on and off during the mid-2000s, I’m by no means a novice to Linux as a desktop operating system. Over the past few years, mainly due to <a href="https://www.valvesoftware.com/" target="_blank">Valve Software</a>’s initiatives, gaming on Linux has become easier than ever. Compatibility and performance have improved by leaps and bounds, reaching the point where Linux is now a viable alternative to Windows, for most flight simulators.</p>

<p>Although Linux support is now more prominent, ControllerBuddy will of course continue to fully support Windows as well as a first-class citizen.</p>

<h3 id="january-enhancing-linux-support">January: Enhancing Linux Support</h3>

<p>ControllerBuddy has supported Linux for quite some time, but a major obstacle was the inability to run the configuration scripts within <a href="https://www.winehq.org/" target="_blank">Wine</a> / <a href="https://github.com/ValveSoftware/Proton" target="_blank">Proton</a>. This was because they required Windows PowerShell 5.1 to run, and while PowerShell 7+ works great with Wine, there is no feasible way to get older releases working.</p>

<p>Therefore, I decided to update all configuration scripts to support PowerShell 7+ while maintaining compatibility with PowerShell 5.1 for a seamless out-of-the-box experience on Windows.<br />
Additionally, a few minor changes were necessary to support the virtual joystick device on Linux.</p>

<p>While launching the scripts within a Wine prefix on Linux is a bit more involved than on Windows, the functionality offered is now exactly the same on both platforms.</p>

<h3 id="february-the-shift-to-sdl3">February: The Shift to SDL3</h3>

<p>A recurring theme throughout the year was my continuous effort to reduce ControllerBuddy’s direct dependencies, either by eliminating them or replacing them with more modern alternatives.</p>

<p>For handling input devices, ControllerBuddy had relied on <a href="https://www.glfw.org/" target="_blank">GLFW</a> for several years. This was coupled with a lot of custom code to support advanced features of Sony controllers via a proprietary HID driver. On Windows, <a href="https://github.com/StrikerX3/JXInput" target="_blank">jxinput</a> was used for native XInput controller support, and on Linux, more custom code was needed to implement what was frankly pretty poor rumble support.</p>

<p>With the release of <a href="https://www.libsdl.org/" target="_blank">SDL3</a> in January and its support arriving shortly thereafter in <a href="https://www.lwjgl.org/" target="_blank">LWJGL</a>, I saw an opportunity to switch ControllerBuddy to this brand-new backend. This move effectively reduced the amount of code required for handling all these different controller types to zero, while simultaneously improving compatibility.</p>

<p>The only negative consequence of the switch to SDL3 was that I had to strip support for <a href="https://github.com/ValveSoftware/openvr" target="_blank">OpenVR</a>-based overlays. While this is certainly a shame, I doubt it significantly affected many users. OpenVR has largely been replaced by <a href="https://www.khronos.org/openxr/" target="_blank">OpenXR</a>, and supporting the latter is a completely different challenge.</p>

<p>All in all, the switch to SDL3 was probably the biggest change to ControllerBuddy this year, and I couldn’t be happier with it. SDL is a joy to work with, and its APIs and documentation are simply superb!</p>

<h3 id="march-adopting-the-ffm-api">March: Adopting the FFM API</h3>

<p>Continuing my quest to reduce dependencies, the next goal was to eliminate the <a href="https://github.com/java-native-access/jna" target="_blank">JNA</a> library, which allows convenient access to native functions from within Java.</p>

<ul>
  <li>On Windows, JNA was used by ControllerBuddy primarily to communicate with the <a href="http://vjoystick.sourceforge.net/" target="_blank">vJoy</a> driver and the Windows API.</li>
  <li>On Linux, JNA was used as part of <a href="https://github.com/bithatch/linuxio4j" target="_blank">linuxio4j</a> to communicate with the UINPUT module.</li>
</ul>

<p>While JNA is easy to use, a modern alternative, the <a href="https://openjdk.org/jeps/442" target="_blank">Function and Memory (FFM) API</a>, was finalized with Java 22. It represents the future-proof and most efficient way to access native APIs from within the JVM.<br />
Since I constantly strive to keep ControllerBuddy up-to-date with current Java releases and utilize new language and JVM features as soon as possible, I completely replaced JNA with FFM and eliminated linuxio4j entirely by writing my own FFM-based UINPUT interface.<br />
While likely not noticeable to users, the switch to FFM made calling native code within ControllerBuddy measurably more efficient and state-of-the-art.</p>

<h3 id="july-modernizing-the-build-system">July: Modernizing the Build System</h3>

<p>My efforts to remove third-party dependencies also extended to the <a href="https://gradle.org/" target="_blank">Gradle</a> build script.</p>

<p>I relied on multiple plugins, which occasionally made it harder for me to update to the latest Gradle versions. With the imminent release of Gradle 9, I decided to remove all plugins that are no longer actively developed.</p>

<p>Additionally, I took this opportunity to port the entire build script from <a href="https://groovy-lang.org/" target="_blank">Groovy</a> to <a href="https://kotlinlang.org/" target="_blank">Kotlin</a>.</p>

<h3 id="august-new-tutorial-videos">August: New Tutorial Videos</h3>

<p>During August, I tackled a topic I had been avoiding for a long time: the creation of up-to-date video tutorials to guide new users through installing and using ControllerBuddy. I had put this task off for so long because I’m simply not very proficient in video production.</p>

<p>After getting to grips with <a href="https://kdenlive.org/" target="_blank">kdenlive</a>, I was able to produce new <a href="https://www.youtube.com/playlist?list=PLCrcgiMjHO83vtSqCKeNuXt_ZotBfFQ81" target="_blank">videos</a> that, while certainly not Oscar-worthy, should lower the barrier to entry for new users significantly.</p>

<h3 id="november-overlay-and-button-action-improvements">November: Overlay and Button Action Improvements</h3>

<p>November saw the introduction of horizontal overlay axis indicators.<br />
I was able to put this feature to good use immediately with the release of the <a href="https://www.digitalcombatsimulator.com/en/products/planes/c-130j/" target="_blank">C-130J module</a> for <a href="https://www.digitalcombatsimulator.com/" target="_blank">DCS</a>. The C-130J uses a horizontal relative axis for the nose wheel steering tiller, and a horizontal indicator made perfect sense for displaying its exact position in the overlay.</p>

<p>Also during November, with the 1.6 release of ControllerBuddy, button actions were enhanced to also support single immediate and on-release activations.</p>

<h3 id="december-svg-rendering-and-first-donation">December: SVG Rendering and First Donation</h3>

<p>At the beginning of this month, I replaced the previously used <a href="https://xmlgraphics.apache.org/batik/" target="_blank">Apache Batik</a> library with the more modern <a href="https://github.com/weisJ/jsvg" target="_blank">jsvg</a> alternative.<br />
jsvg is used to render the <a href="https://en.wikipedia.org/wiki/SVG" target="_blank">SVG</a> visualizations of profiles.<br />
While I had to introduce more custom code to handle the correct sizing of the <a href="https://developer.mozilla.org/en-US/docs/Web/SVG/Reference/Attribute/viewBox" target="_blank">viewBox</a> (i.e., the viewport of an SVG), the switch had the benefit of reducing the overall size of the entire ControllerBuddy folder by about 3 to 4 MB, depending on the platform.</p>

<p>Also, in fact just yesterday, I was very happily surprised with the first donation I received from a ControllerBuddy user, who pressed the donation button that I first introduced a few months ago.<br />
I am so grateful for this wonderful gesture, as it perfectly validates the appreciation for the long hours I have poured into this project over the last decade. Thank you!</p>

<h3 id="future-plans">Future Plans</h3>

<p>With my switch to Linux, I also started documenting how I personally set up my flight simulators on Linux with Proton in conjunction with ControllerBuddy.<br />
At first, I only created rough notes intended to allow me to easily reproduce my results in the future. Recently, I decided to start turning these notes into fine, detailed guides that, in the future, other people will be able to follow to start simming on Linux <em>the ControllerBuddy way</em>.</p>

<h3 id="thank-you-and-happy-holidays">Thank You and Happy Holidays</h3>

<p>Thank you for using ControllerBuddy, for following its journey, and for reading this annual review.<br />
I look forward to sharing more updates with you in the new year.<br />
Until then, happy holidays and all the best for 2026! 🎁🎄🎆</p>]]></content><author><name>Matteo Hausner</name></author><summary type="html"><![CDATA[]]></summary></entry></feed>