RSSAmplifier

Blog

Jonathas Ribeiro

jonathas.comRSS feed ↗20 posts

Latest posts

How I replaced Dropbox Camera Uploads with an automated photo sync pipeline

I run a weekly photo cleanup routine because I want two things at the same time: Only curated photos in iCloud Real files on disk for archive and backup I like having my photos as normal files. I can inspect them, back them up to external drives, and know exactly where they live instead of relying entirely on a cloud service. For years, Dropbox Camera Uploads handled an important part of this…

Running two Zigbee networks side by side in Home Assistant

For a long time, my Zigbee setup in Home Assistant was fully based on ZHA running on Home Assistant Yellow. It was stable, reliable, and already managing more than 40 devices. So when I needed better support for a few specific devices (especially a Tuya button), I did not want to migrate everything and risk breaking a working network. Instead, I built a hybrid architecture: Keep ZHA exactly as it…

Automating winter humidity control with Home Assistant and dehumidifiers

Every winter, the same problem returned in my flat: Wet windows in the morning Condensation around glass doors Bedrooms sitting at 60-70% relative humidity overnight One morning I noticed water pooling on the floor near the glass door. That was the moment I stopped treating this as a minor annoyance. Outside humidity here during winter is often 70–90%, while temperatures frequently sit around 0 °C…

How I made my physical mailbox send me real-time push notifications

I live in Prague, and like many apartment buildings here, the mailboxes are grouped in the building entrance instead of inside the flat. Letters arrive through a slot and fall directly inside the box. There is something deeply satisfying about turning physical events into software events. Not just monitoring systems, not dashboards, not metrics. Real-world events, like receiving a letter. This…

Optimizing File Upload Architecture with AWS S3 Presigned POST

In many systems, file uploads follow a familiar pattern: A client sends the file to your application server. The backend processes it (e.g., for validation or virus scanning). Then it forwards the file to a cloud storage service like Amazon S3. While this works, it’s highly inefficient. Your app becomes a middleman consuming bandwidth, CPU, and memory, just to pass files along. Why This Is a…

Creating a CV in LaTeX: Clean, Structured, and Versioned

For years, I maintained my CV using various online builders. They got the job done, but there was always a subscription fee. This last time I tried to update my CV through one of them, their payment process got stuck. They withdrew the subscription fee from my card but didn’t enable any premium features. That was the last nail in the coffin for me. This year, I decided to rebuild my CV from…

How I Transformed My Flat into a Smart Home with Home Assistant

When I first ventured into home automation, like many, I started with Alexa. Voice commands and plug-and-play devices felt futuristic—until I began hitting limitations. Many devices required separate hubs, cloud access, or their own apps just to function. Even something as simple as turning on a socket often involved sending a request to a remote server before the action happened locally. The…

How I Replaced My Frameo Digital Frame with an Android Tablet

Having a digital photo frame at home has always been a nice way to keep our memories alive. Over the years, I’ve collected thousands of photos from family trips, special events, and everyday moments. This turned our digital frame into a slideshow of our best experiences. However, recently, I had issues with my Frameo-powered digital frame, leading me to look for a better solution. Here’s how I…

Composition versus Inheritance in Software Engineering

Programming paradigms such as functional programming (FP) and object-oriented programming (OOP) are used in conjunction with some important principles and concepts in order to create modular and maintainable code. Today we’ll take a look at the concepts of composition and inheritance, demonstrating their use with some examples. In this article What is Composition? Pros of using Composition Cons of…

Optimizing Data Access: A Deep Dive into Database Indexes

When considering database optimization, the efficiency of retrieving information is crucial. One key player in this quest for efficiency is the database index. Let’s dive into the world of database indexes and uncover what happens under the hood. In this article What are Database Indexes? Types of Indexes Trade-offs and Considerations Practical examples Inserting some data Examples of index usage…

Bringing Back the Flags! Keyboard Layout Indicator as Country Flags on Gnome

Gnome is a free and open-source desktop environment for Linux and Unix-like operating systems. It is one of the most popular desktop environments for Linux, and is the default desktop environment for many Linux distributions. Gnome is known for its simplicity, ease of use and a user-friendly interface. It is designed to be easy to use for people of all ages and skill levels and it’s also fully…

Efficient Software Release Management with Automated Changelog Generation

The software release process is a critical aspect of any software development project. A manual software release process can be time-consuming, error-prone, and often leaves room for human error. This is where an automated release process comes in. The tools mentioned in this article (used in TypeScript/Javascript projects) can help streamline and optimize the software release process, making it…

REST API Best Practices

I’ve been working a lot with APIs during the last few years, either developing them or integrating with third party APIs. So I’ve decided to gather some of the knowledge I gained along the way and write about it here. Many of the APIs I’ve integrated with didn’t follow any kind of pattern, so their documentation had to be consulted more often than if they were following some of the points below.…

Caching API responses with Redis for faster endpoints

Have you ever implemented an API endpoint that takes a while to respond? Maybe some seconds? Imagine when you have thousands of clients accessing your API at the same time and this response time increases because of that. An I/O call such as reading content from a file or a very complicated query in the database may take a while to complete. If this content doesn’t change at all, it’s much better…

Token based authentication in Node.js with Passport, JWT and bcrypt

When you develop an API, most of the times you’ll need part or all of its endpoints to require authentication. How to do that using Node.js? A combination of passport.js with JWT and bcrypt is one of the best ways to implement it. Time to go stateless ! This post is based on the authentication implemented in the TODO List API project that you can find here . In this post, all the code is in…

Documenting your Node.js API with apiDoc

When you are developing an API and one or more developers (frontend, desktop, mobile, etc) will have to integrate their code with it, it’s very important to have it well documented so they know what and how they can use. For that, in Node.js projects I’ve been using apiDoc , as it is able to generate documentation in HTML from annotations in the source code. For this post, I’ll use the TODO List…

Backup your MongoDB databases to Amazon S3

I’ve developed a backup script for MongoDB using TypeScript. It’s available as GPL3 here . If you download or clone the repository, you can choose to run it with Docker (so cron is already configured) or run it without Docker (If you want to configure cron on your host OS by yourself ). The cron example there is the same I wrote about on my previous post about cron with Docker . In any case,…

Scheduling tasks with cron on Docker

When you need to setup a cron job, you can do it using Docker. The best way to do it with Docker is using an Alpine Linux image, as it has only 5MB initial size. Don’t know what is Docker? Check more about it here . In this post I expect you to already have Docker and docker-compose installed on your OS. Creating the image In the case below I needed an Alpine Linux container with Node.js inside,…

My favorite fitness apps for Android

Some apps are very useful when you decide to keep track of your fitness activities and habits. Here I list some apps I have used and others I still use and recommend. Runkeeper This is one of the most well known apps out there. If you like taking long walks, running or biking, it’s perfect for that. It tracks your speed, pace and distance (using your phone’s GPS). In the end of your activity it…

One year working with Node.js after PHP and .NET - Challenges, comparisons and improvements

In my software development career I’ve worked so far with both frontend and backend development, also with Desktop apps development (.NET) and Hybrid mobile development (Ionic Framework), but always enjoyed and focused more on the backend. I started my career in 2008 with PHP, so around this time JavaScript was mostly for creating alert messages, form validation and a bit of user interaction. Who…