Inspiration: Our integrations at FabLab Brno

Hi, we’d like to share our 8 useful integrations we made in FabLab Brno.
Maybe it will inspire others to make their space even more fabulous. :wink:

Disclaimer: Since most of these are just bunch of spaghetti-PHP, we do not plan releasing them as open-source. At least not in current state. But it’s not rocket science – we just call API and/or listen for incoming webhooks.

“Now” page:

Light-weight (< 5 kB total), works on older phones, with slow connection, and without having to sign in. Members immediately see, which machines are in use (and for how long), which are booked and which are available.

Most useful is number of members on-site. It is just an estimate, but works surprisingly well. Also useful is listing of our staff on-site (Core team). Since we are open 24/7, members want to know whether someone is present and maybe can help them.

Custom Fabman for 3D printers:

You probably heard about this, @mzuzelka can give more details.

In short: We put our custom board inside Prusa controller. It serves as a Fabman, but also communicates with printer firmware. It saves printed filename and amount of used filament to each resource-log (via metadata). It is then read by our e-shop, so members can easily pay for used filaments.

Fablab TV:

Full-HD display with RPi which we hang on the wall. Is cycles through few screens – mainly “Upcoming events” (from Google Calendar ICAL) and “Booked machines” (from Fabman API resources and bookings).

03-tv-01 03-tv-02

Mattermost bot:

We use Mattermost (Slack alternative) for communication with our members. Our bot is simply triggered by webhook.

First of all, it notifies our members that some machine is out of order. And later when machine is repaired and turned back on.

04-bot-01 04-bot-02

Also it notifies us when laser filter is full. Members then work more carefully and someone from our staff fixes it ASAP. Sadly, it alerts us only when laser is turned off (we hope firmware update will fix this).


Finally, it sends private message to members when their 3D print is finished. It tells them how long it took, how much of filament was used and whether it was stopped automatically or via button. Members can then deduce, whether print was successful or failed.


Laser queue:

Laser-cutter is our most popular machine so there is always a queue. During open-hours there can be 10 people waiting in a line. Which gets chaotic quickly.

So we utilized one of our custom Fabman boards, put it in a box with RPi and a display and made simple webpage. User beeps his card on this box, in saves it into resource-log and puts him into queue. When he beeps on laser-cutter, it removes him from queue.

It’s a simple thing, but our members are now more relaxed and don’t have to argue with each other.

Laser cleaning:

We try to check/clean lens+filter every other day. But sometimes we forget. So we assigned one card as a “Cleaning card”. We have it stored in our cleaning kit. When our staff cleans the laser, they just beep with this card.

Simple webpage then checks resource-log, calculates for how long laser hasn’t been cleaned and for how long since cleaning it has been used (busy and idle). This information is then visible to our members. Now we don’t forget to clean the laser and members can be sure.

06-cleaning-01 06-cleaning-02

Members listing:

We needed to know how many of our members are active and how many have training for which machines. So we made a simple page, which just queries packages, courses and members. And it is really useful.

Also it helps us with managing safety training, which has to be renewed yearly (more here).

07-members-01 07-members-02

Machine availability:

We guarantee, that our machines are available 95% of the time. Also we have to report availability quarterly. For a long time we had to “guesstimate”…

Now we log machine status each midnight, and also when its state changes. Simple page then calculates availability for given timeframe.


We hope some of these might inspire others.
Feel free to share your own integrations or ideas. :+1:


Wow! :exploding_head:

I knew that you guys at FabLab Brno were using the API for a few things and worked on custom integrations, but your solutions blew me away! Hats off to you and the whole team – I’m thoroughly impressed. :star_struck:

I’m already thinking about how and when we could put some of these features directly into Fabman… :thinking:

1 Like

@jakub.stacho What additional info do you get from logging the status at midnight when you also log every state change?

@raphael Thanks! :blush: That’s what APIs are for, right? :wink:

Midnight logging is mainly for backup (if webhook was deactivated or my server was offline). But also simplifies calcuations (when status changed outside of given timeframe or machine didn’t even exist).

If you are interested in other ideas, we are working on this:

Training course assigning:

Each of our trainings is attended by 15-20 members. After training they have to sign paper form. Later we manually go through every row, look up each member in Fabman interface, and activate training course for them. Which is tedious, prone to errors and sometimes we forget to do it.

So we assigned one original Fabman as a “Training writer”. Members then sign the papers and immediately beep their card. In background it will call our script and assign corresponding training course (which we set up beforehand). At the same time we will double-check it on a simple page, which will list these users in real-time.

You might be happy to hear that webhook events don’t get lost in that case. They are queued and re-delivered as soon as the webhook becomes available again. See the webhook docs for details.

Yeah, I know that’s painful. We should really provide a better interface for adding a course to multiple people at once. :pensive:
Until then, there’s a workaround that makes it easier to find all members:

  1. Let everyone swipe their card over the machine they just got training for (you don’t need a separate bridge). They’ll be denied, but that also creates a log record.
  2. Go to the activity log, select that machine and enable “Show denied attempts”.
  3. Cmd/Ctrl-Click on every denied member to open a new tab for each one.
  4. Add the training for every opened member.

It’s still not great, but at least you don’t have to look up every member manually and you can’t forget to add someone.

Clever! Why didn’t we think of it? Thanks for saving our time.

1 Like

Until then, there’s a workaround that makes it easier to find all members:

I think this will take same amount of time as now, because we must have signature of the person who attended the training so then we have to find that person on a sheet and after that give that member access.

This would maybe solve some sort of compromise for us. As already @jakub.stacho suggested at our meeting, for this would be good some webpage, where we could filter members who swiped their card & do not have training for it. At the end of the line would be checkbox, which we could check and by hitting Save button, all checked members would have training. I hope I described our idea clearly. Please @jakub.stacho correct if I did not.