Since not that much happened in July and I was busy at the end of that month, the July and August progress reports got merged into one.

Length tuning window enhancements

Based on suggestions from robin and anuejn, the nets in the length tuning window can be sorted by length and the length tuning tool takes its reference from the one set in the length tuning window.

Configurable key bindings in tools

By far the biggest change in the last two months was the introduction of configurable key bindings in tools. Ever since the beginning, tools directly received keys being pressed. This meant that the key bindings used in tools were set in stone with no way to change them other than recompiling the application. This is a bit unfortunate, as some key bindings such as slash for changing track posture are easy to reach on US keyboard layouts but are difficult to press one-handed on german layouts. So I decided it was about time to fix this.

This was accomplished by the introduction of in-tool actions: Rather than directly sending the keys pressed to the tool, the key presses will get resolved to in-tool actions by the interactive manipulator, so the tools only need to know about the in-tool actions. To make things simpler to implement, mouse clicks also get translated to in-tool actions.

The in-tool key sequences are configurable in the preferences, similar to the regular key sequences:

in-tool keys

Since the tool bar that show the key bindings available in the tool required modification anyhow, it also got a visual upgrade that makes the key bindings more easier to see:

new tool bar

The biggest effort in this change was porting all ( >80 ) tools over to the in-tool actions without introducing any bugs. In that process, superseded tools such as the non-KiCad router got removed.

Drag to bend net lines

It’s good practice to keep all net lines on schematics either horizontal or vertical. For straightening non-axis-aligned net lines, there’s always been the bend net line tool. Inspired by LTSpice’s schematic editor, this tools now gets activated automatically when dragging such a net line.

Improved pool item delete dialog

Deleting items from the pool can cause other items that depend on the deleted item to break. To make this more clear to the user, the deletion dialog in the pool manager now lists all items that depend on the to-be-deleted item:


Parts window

Faced with assembling a new revision of the Hubble main board for reflow soldering, I needed something similar to the Interactive HTML BOM for efficiently placing components. As people have been sending me links to this very project and asking for something similar to be added to Horizon EDA, I took the opportunity to implement it. Less than 250 lines of code later, this is what we’ve got:

parts window

Selecting a part in the list will highlight it in the editor as well as in the 3D preview. The tickbox in the parts list doesn’t do anything other than being there to make it easier to remember having placed a particular part.

Version 1.2

As per the release schedule, version 1.2.0 got released on 2020-07-29. See the changelog or the prior progress reports for features that made it into the release.

Unfortunately, Issue #453 turned out to be more than a glitch caused by cosmic rays. As I wasn’t able to reproduce this issue and couldn’t come up with a reasonable explanation for the behaviour observed by the reporter, that issue didn’t make any progress towards a fix for a few weeks. Only after more people reporting the same bug and finding out that the flatpak package for version 1.2 was affected as well, things started to look more and more as if the bug depends on compiler versions.

As it turned out, the code that hashes UUIDs for use in std::unordered_map triggered undefined behaviour due to shifting an int (32 bit) by more than its width. That undefined behaviour went unnoticed on more recent versions of GCC.

Release 1.2.1 addresses this bug by casting the value to a type of sufficient width before doing the bitshift.

Debian packages

Even though Debian-based distributions such as Ubuntu are quite popular, there hasn’t been an easy way of installing the latest released version of Horizon EDA on that family of distributions.

To improve on this, we now have the horizon-deb repository that contains the debian/ directory and a GitHub Actions workflow to automatically build Debian packages for Debian Buster and Ubuntu 18.04 and 20.04.

The built packages are published on bintray as a Debian repository for convenient installation and upgrading.


People have been asking off-and-on how to put logos and such on their boards with Horizon EDA. Other PCB layout tools use packages/footprints for this, but that has a couple of drawbacks:

  • In Horizon EDA, a package on the board requires a component in the netlist and thus also a symbol in the schematic
  • Packages aren’t scalable, so there will have to be multiple copies of the same thing at multiple sizes

To address this request once and for all, I decided to introduce a new object type, called Decals. Decals are stored in the pool similar to packages for convenient management. Opposed to packages, decals don’t contain pads and are limited to copper, soldermask, silkscreen and assembly layers. Once placed on a board, decals can be scaled to fit the board’s space requirements:


KiCad router integration enhancements

Even though the KiCad Push&Shove router has been part of Horizon EDA for over two years, there are still some features that are missing the required glue code to make them work. Among them were the “highlight collisions” and “free angle” mode as well as allowing for DRC violations.

Triggered by a post on the EEVBlog Forum I went ahead and added support for these modes to the routing tool, so its settings window now looks like this:

router settings

Discourse Forum

An Email conversation with Alex Forencich and users using GitHub issues for non-issues made it evident, that there’s the need for a proper discussion platform since IRC isn’t really searchable long-term and the threads on the and EEVBlog forums aren’t suited for in-depth discussions.

Since other open-source projects such as GNOME adopted Discourse as a forum platform, I figured it can’t be that bad and applied for their free hosting for OSS projects and got approved promptly. Thanks to them, we now have a Discourse Forum at