
@ubruhin
September 12, 2025
I’ve made a lot of progress with the completely new user interface for LibrePCB 2.0 and am very excited to share some insights how it will look, and how it makes LibrePCB better in many ways.
The Original Problem
First, let’s quickly look back how everything began. Since the early days of LibrePCB around 2013, we are using Qt as the UI toolkit and the concept was to implement every editor as a separate window (schematic editor, board editor, library editor etc.):
But with more features added over time, the UI got more and more cluttered. Also the paradigm of separate windows is often cumbersome to work with — e.g. having just one library and one project opened required to constantly switch between four(!) windows. Even a dual-monitor setup was not enough to work efficiently with LibrePCB. So it was clear we need a completely new organization of windows and editors. Generally we could have done that with Qt, but its traditional approach makes is really hard to pursue more modern UI paradigms, not to mention the effort and the error-proneness it involves. In the past I have struggled many times with Qt to create nice UI elements, thus I didn’t feel confident to build up a completely new UI with Qt again.
Slint: A Declarative UI Language
In the blog post NGI0 Grant for LibrePCB 2.0 I listed a few possible solutions how to build a more modern user interface. The most promising option was Slint, a relatively new UI toolkit (open-source & written in Rust) which uses a custom, declarative language to describe the UI. With the declarative approach, relations and behavior can be easily specified right in the UI description:
Window {
Button {
x: parent.width - self.width - 5px; // place 5px from the right border
y: 5px; // place 5px from the top border
text: @tr("Open Project");
}
}
It may sound trivial to place a button at the top right corner of its parent, but with the procedural approach of Qt this is often not trivially doable. In many cases, it requires to implement event handlers in C++ which update the widgets position whenever the parent object’s size or the widgets’s own size has changed. Writing such code is time-consuming and error-prone, while the declarative approach of Slint is quick, easy and safe — not just for this trivial example, but also in more complex cases. For a large project like LibrePCB, which consists of hundrets of UI elements, the declarative approach is really a game-changer for us developers! (Side note: As of today, LibrePCB contains 23.746 lines of Slint code!)
An Incremental Migration
Unfortunately, even with several months of full-time work, LibrePCB is too large to be migrated to Slint by 100% at once — to avoid delaying the next release too much, we need to do the migration in steps. All the main windows & editors first, and the remaining dialogs and wizards in later releases. Also our whole business logic depends on Qt (it is much more than just a UI framework), thus our dependency on Qt will remain for a long time.
So the question is, can we mix Qt with Slint? In the end, LibrePCB only works if the main thread is running Qt’s event loop. But Slint only works when the main thread is running their event loop. So at first glance it seems we have a very bad conflict here :-/
In fact, Slint supports different backends for interaction with the underlying system, e.g. for input events handling and window drawing. These are (interestingly) Qt, winit and LinuxKMS. Winit comes with the ability of GPU-accelerated rendering, which would be interesting for performance reasons. But unfortunately right now we can’t use winit because of the event loop conflict.
Luckily Slint’s Qt backend avoids that problem since Slint will run Qt’s event loop for us. So the event loop will process the events for both, the Slint UI and the LibrePCB backend. This works because Slint and LibrePCB are compiled and linked against the same Qt library. It also allows us to mix the new Slint window with legacy Qt dialogs & wizards, so we can do a step-by-step migration.
One Window For Everything
Enough background information for now, let’s have a look at the new UI of LibrePCB 2.0. The most important thing is that all the individual windows mentioned above have been replaced by a single, multifunctional window. Within that window, any kind of "document" (e.g. a footprint, a schematic or a board) is opened as a tab. The toolbars of the new window now depend on which tab is currently active, because for example the footprint editor supports other features than the schematic editor. This is how the new window currently looks like:
By the way, in this new window you can even have multiple projects (and libraries) opened at the same time! All the opened projects and libraries are listed in the documents panel, and the contained entities can be opened as individual tabs.
Sidebar & Panel
A lot of functionality is accessible through the new sidebar. Depending on context, there are different kinds of panels available. For example if you’re working on a schematic, there is a panel which displays ERC messages. But if you’re working on a board, that panel will display DRC messages.
The sidebar also shows you status information about various parts of the application. For example you see if there are ERC warnings or outdated workspace libraries without even opening the corresponding panel:
Working Area
The most important part of our UI is of course the working area where you draw schematics or layout traces etc. This area has been improved in many ways. Not only that everything is now a tab (remember that schematics were not tabs in the old UI), you can now even split the window into multiple sections and open tabs side-by-side. For example if you’re working on a single-monitor setup, it is now easy to work on the board while still having the schematics in sight:
Tabs and sections can be easily arranged by drag&drop — see it in action in this video.
In addition, the working area has been maximized and decluttered to have as much of the screen size available for the graphics view as possible. For example, tool buttons are now overlays inside the editors rather than traditional toolbars spanning the whole window height or width even if only a third of them is filled with buttons. There is no such wasted space anymore in the new UI.
Statusbar & Notifications
We already had a status bar in the old UI, but it was purely visual and not interactive. Instead of just displaying the grid interval, the new UI allows you to modify the grid interval and the grid style right in the status bar — no dedicated dialog window is required anymore. Also the state of placement locks is displayed and can be toggled right in the status bar. Last but not least, there is a completely new notification system which displays messages and ongoing operations in an expandable/collapsible popup in the bottom right corner:
Multi-Monitor Ready
If you are working on a multi-monitor setup and now worry that a single window is worse than the multiple windows we had before — of course this use-case is covered as well. Although the new window replaces all the old windows, I have implemented the ability to open multiple instances of that window at the same time. So you decide whether to display schematic and board side-by-side by splitting a single window, or by opening schematic and board in entirely separate windows — everything is possible with the new concept!
Simplified Library Management
The old library manager was not that bad, but it was more complicated than necessary due to its "operation-based" workflow of manually triggering the installation or uninstallation of libraries, with those operations even spread across multiple list views and pages.
The new library manager is much simpler (but as functional as before) by following a "state-based" paradigm now. Instead of triggering the installation or uninstallation of individual libraries, you now just check the libraries you like to use (or uncheck those you don’t want anymore) and a single apply operation performs all the necessary installations or removals at once. Beside the improved user experience, this also fixes some issues of the old concept (e.g. limitations of the automatic dependency management).
Built-In Hints, Tips & Guides
In my vision, an EDA tool should support engineers/makers as well as possible (in a non-disruptive way) to help them creating PCB designs without errors as quick as possible. The new UI has therefore various new tips & hints implemented which show up in certain situations. Many of them are especially useful for LibrePCB beginners to ensure a smooth first-use experience, but some are useful for everyone to minimize errors or wasted time.
As an example, the built-in PCB ordering feature now displays the state of the electrical- & design-rule checks as a friendly reminder to review & fix any issues before ordering a (possibly faulty) PCB. The order panel contains direct hyperlinks to the ERC & DRC panels, and even allows to run the DRC right from the order panel. And as an additional psychological effect, the order button is only highlighted if there are no issues, though it is always clickable. 🤓
What’s Next?
Even though the new UI is the biggest change in the history of LibrePCB, this is just the beginning of a new user experience. There is still a lot of room for improvements which we will take care of after the LibrePCB 2.0 release. Just a few examples:
-
Object property editors (incl. multi-object editing) in side panel to get rid of modal dialogs
-
Replace remaining modal dialogs & wizards by integrating them as tabs or lightweight popups
-
Reflect typical workflows by the UI, for higher productivity and intuitivity
-
Productivity improvements, e.g. drag&drop, more keyboard shortcuts, hints, links to docs, …
-
Theme improvements / cleanup / polishing, maybe some day support customizable themes
All the completed tasks and the planned tasks, together with more details and previews of the new UI, are summarized in this issue. Of course there are also a lot of new non-UI features beeing developed for LibrePCB 2.0 and beyond, those are tracked in separate issues. This blog post just focused on the UI things due to its huge relevance in this moment.
Give it a Try!
If you like to try out the new UI already, we have nightly builds available
here.
In contrast to the current master
branch, these builds still use the stable
file format 1.0 so no changes will be made to your library- and project files.
But of course there might still be some bugs — if you experience any issues
or annoyances, or have any other feedback, please
let us know!
Btw, if you are curious about the timeline of the LibrePCB 2.0 release: There are still some new features to be implemented (mostly non-UI things now) and it is hard to say when they are finished. But roughly I’d estimate it should be ready in around 2-3 months. If you like to support my work on the LibrePCB project, any donations are highly appreciated and help me to keep the development ongoing.
Credits
A majority of these updates were part of the NGI0 Commons grant we receive from NLnet, thanks a lot for their support! Also a special thanks to the Slint developers who helped me with support, feature development and bugfixes during this migration.

@ubruhin
August 5, 2025
The past 3 years were very exciting for me and the LibrePCB project, completely different to the previous 10 years of the project’s existence. With this blog post I’d like to give you some insights about my "new" everyday life.
Usually I don’t like to expose my life in the internet — maybe you aleady
noticed this, if you ever tried to find me on social media platforms. Though
there’s nothing to hide, I just don’t feel comfortable to share my life with
the public (and with all the profit-oriented companies grabbing that data).
But since it’s also related to LibrePCB — which I obviously do want to
share with the public — let’s make an exception for this blog post (well,
I still couldn’t resist to add this post to the disallow list of robots.txt
).
Until mid 2022, my life was kind of "normal". Full-time employed as an electrical engineer, I was going to work 5 days (42 hours) per week, and worked on LibrePCB in my free time evenings, on weekends and during holidays (I don’t know what else holidays are intended for…). But after doing this routine for many years, some things have changed over time, and I realized today’s industry is only interested in profit rather than developing useful and reliable products in a meaningful way. I felt like this is not the way I want to spend the rest of my life, so I quit my safe job with no idea how I will generate the income needed to pay the rent, food, insurances etc. The only thing I knew, was that I wanted to work harder on LibrePCB, as I was (and still am) convinced the world needs a proper open-source EDA tool. This was the moment my life got interesting…
At the time, it was a tough decision and I hoped I wouldn’t regret it. But first of all, I enjoyed the new flexibility to travel a bit — something I never did on my own in my life before. Well, "travel" means I took the laptop and went to destinations where the weather was better than at my home in Switzerland and where I could continue working on LibrePCB. 🤓 To get the work done, I tried coworking spaces for the first time and discovered their focused "work atmosphere" and absence of distractions allow me to work very efficiently. Now, I occasionally even work from a coworking space near my home.
While I was not yet thinking about my future income, a friend & contributor of LibrePCB (@rnestler) asked if I ever considered to apply for a grant, e.g. from NLnet. I’ve never heard of NLnet, and was not very optimistic that "next generation internet" is interested in supporting a hardware-related project from a non-EU country, but nevertheless I submitted LibrePCB as there was nothing to lose. Their evaluation took quite long, and during that time I just used the savings from my previous job to continue working full-time on LibrePCB. This felt quite good, and even better when from time to time an email from NLnet mentioned that LibrePCB made it into the next evaluation round. Yay!
While there was no decision about the grant yet, I had the opportunity to generate some side-income by planning and building a 19 kWp solar plant. A bit later another 17 kWp plant followed. These were interesting projects where I could learn a lot (electrical installations are actually not my usual business), but I am mainly mentioning it because it is part of the income diagram at the bottom of this blog post ;-)
In the end, the NLnet evaluation took more than 4 months and it was April 2023 — already more than 6 months without being employed — when the final decision was made that LibrePCB will be supported. It was a huge surprise and a game-changer for me, since it finally gave me the confidence that I can work a full year on LibrePCB without worrying about income — no need to look for another job, just focus on the development of LibrePCB all day (and night)!
During this time, I was able to finish LibrePCB 1.0 and LibrePCB 1.1 with tons of new features and improvements. It was a great time since I was flexible in the way how I get the work done (e.g. it didn’t matter if I worked from 8AM to 5PM or from 11AM to midnight, or if I worked from cold home or from a better climate zone). But time flew by, and in April 2024 the grant ended with the release of LibrePCB 1.1 — and with that also the income suddenly stopped (except the donations and sponsorings).
Then, luckily a friend asked me if I could do some freelance hardware & firmware development for their company. Although I love to work on LibrePCB, it was a no-brainer to accept this offer since it is a great way to stay flexible — with freelance projects, it is much easier to keep enough free time for LibrePCB compared to having a full-time job.
Unfortunately for legal reasons it was necessary to create a legal entity (GmbH / LLC) to do the freelance work. I was not very happy about it, but figured it could actually be a chance to build up a long-term side-income (if more freelance projects follow) so I can continue working on LibrePCB with a high flexibility. Long story short, I am now also a company owner (with myself as its only employee) and need to do accounting, tax declaration and things like that 😭 Not what I like to do (don’t tell the Swiss authorities I have no idea about it!) but luckily with only a little freelance activity it’s not that much paperwork…
As of today, I’ve already finished three freelance projects and a fourth is in progress. In two of them I even designed PCBs with LibrePCB, how cool is that! 😃 Anyway, thanks to the second NLnet grant which started in October 2024, I could focus back on LibrePCB, meaning >90% working on LibrePCB and <10% on the freelance project. Though interestingly the freelance work generates a substantial percentage of the income ;-)
To summarize my life since I quit the job: Way less income & more work, but also more flexibility and more happiness. This working mode will stay until roughly October 2025, when the second NLnet grant is running out and LibrePCB 2.0 should be finished (possibly with some delay). Afterwards it will get interesting again how things continue, since the financial support from NLnet is currently my main income. Generally I’m striving for a funding model that doesn’t rely on further grants from NLnet since many other open-source projects out there also deserve a fair chance to get such grants. I plan to publish a separate blog post soon about the detailed finances of the LibrePCB project and about future plans.
In any case, just to make it clear, I commit to push the LibrePCB project forward into a sustainable future — the freelance work should just help to pay the bills until the LibrePCB project is financially stable. And of course, any donations really help me to spend my time on LibrePCB rather than on freelance projects!
By the way, a lot of exciting work is currently ongoing for LibrePCB 2.0, I’ll post a status update soon!

@ubruhin
May 20, 2025
In the past few months our libraries got some nice contributions and also I created more than 70 important library elements and 285 3D models by myself to provide you more ready-to-use components and devices: screw terminals, push buttons, mounting holes and more!
Changes
The rather incomplete libraries are a major criticism of LibrePCB, which also shows our user feedback survey where this is at rank one of things to be improved (but we would also assume it without the survey). In the past few months I have worked a lot on creating more of the important library elements to improve that situation. Also we got some contributions from the community which are now part of our official libraries.
Here’s an overview of the library elements which were added between November 2024 and April 2025:
- LibrePCB Base
- CK
- GCT
- Lolin
- Phoenix
- Sensirion
- Texas Instruments
- Tubes
-
-
K155ID1 / К155ИД1 BCD-to-decimal decoder (thanks to @dbrgn!)
-
IN-12B nixie tubes (thanks to @dbrgn!)
-
Behind the Scenes
Many of the new library elements were somehow repetitive (screw terminals, capacitors, mounting holes etc.), therefore I extended librepcb-parts-generator with new scripts to generate a large percentage of them.
These scripts also use CadQuery to generate STEP models, thus almost all of the new packages come with 3D models out of the box! In addition, all new devices come with MPNs so you will get an accurate BOM for your project without entering MPNs manually.
What’s Next?
After these library additions, I’m now priorizing the development of LibrePCB 2.0 where I’m making pretty good progress. But I have already planned to make more library contributions later with a focus on modules & devkits (like Arduino, ESP32 etc.) since those things are used in many projects nowadays.
I’m open to receive suggestions about which modules to be added, please tell us in our discussion forum or in our chat!
And don’t forget to update your workspace libraries to get all the new library improvements! Some of the libraries are even entirely new so you might want to install them too.
Credits
Most of these updates were part of the NGI0 Commons grant we receive from NLnet, thanks a lot for their support!

@ubruhin
March 24, 2025

@ubruhin
December 1, 2024

@ubruhin
October 17, 2024

@ubruhin
August 23, 2024

@ubruhin
August 8, 2024
April 3, 2024
December 30, 2023
September 24, 2023
August 21, 2023
May 15, 2023
April 13, 2023
October 3, 2022
September 8, 2022
January 28, 2022
November 2, 2021
October 4, 2020
May 3, 2020
January 3, 2020
November 30, 2019
July 14, 2019
April 21, 2019
March 20, 2019
December 3, 2018
November 25, 2018
November 4, 2018
October 21, 2018
September 15, 2018
April 21, 2018
January 2, 2018
October 30, 2017
September 13, 2017