/blog · technical notes

Technical notes on software, systems, tools and anything else I find useful.

I write about C++, Linux, Android, open-source tools, software development, embedded problems and more. Notes live in .org or .md and are transformed into static HTML during the build.

29/29 ENTRIES · 2026-2026 Subscribe via RSS · /feed.xml ↗
2026-07-27
USB host or charger? VBUS, enumeration, and routing in embedded devices

How to distinguish a USB host from a charger using VBUS, enumeration, TinyUSB, and a probe-then-commit policy.

40 min
2026-07-14
What Is OpenGL, Really?

A clarification of OpenGL as an API and specification, not a graphics engine or GPU, covering context, state, drivers, GLSL, buffers, VAOs, and draw calls.

29 min
2026-07-07
Points, Lines, Triangles, and Meshes

An introduction to points, lines, triangles, vertices, indices, meshes, winding order, and OpenGL primitives in rasterized graphics.

30 min
2026-06-30
Pixels, Colors, and Digital Images

An introduction to pixels, resolution, RGB channels, alpha, bit depth, textures, and framebuffers in OpenGL.

25 min
2026-06-23
What Is Computer Graphics?

An introduction to computer graphics: how data, rendering, the pipeline, CPU, GPU, and OpenGL become digital images.

20 min
2026-06-16
CRC: How It Works, Where It Is Used, and Its Limitations

A practical guide to CRC: what it is, how it works, why it detects accidental errors, where it is used, and what to consider when designing a protocol.

20 min
2026-06-09
How RPC Calls Work: From Distributed Software to PC-MCU Communication

A practical guide to RPC calls between PCs and microcontrollers: contracts, serialization, framing, CRC, USB, UART, timeouts, versioning, and debugging.

30 min
2026-06-02
MAX77972: charger, fuel gauge, and field debugging

A practical MAX77972 guide: buck charger, ModelGauge m5, USB-C, AICL, THM, initialization, wrong SOC, debugging, and firmware workarounds.

30 min
2026-05-26
CAN Protocol: How a CAN Network Really Works, from Physical Signals to Diagnostics

A practical guide to CAN networks: physical signals, arbitration, frames, timing, DBC decoding, diagnostics, CAN FD, CAN XL, and security.

38 min
2026-05-19
Bluetooth Low Energy on ESP32: GATT, security, privacy, and design parameters

A practical guide to BLE on ESP32: roles, advertising, GATT, MTU, throughput, security, privacy, and real-world configuration parameters.

40 min
2026-05-12
Scope Guard in C++

Using RAII to keep rollback close to the state it protects.

5 min
2026-05-05
non_null in C++

How to distinguish a mandatory pointer from an optional value directly in a function signature.

4 min
2026-04-28
overloaded in C++

Use several lambdas as one visitor to make std::visit easier to read.

4 min
2026-04-21
unique_resource in C++: RAII for Handles and Non-Pointer Resources

Applying RAII to file descriptors, sockets, and handles with exclusive ownership.

6 min
2026-04-14
Strong Types in C++23: Making Domain Meaning Explicit

Using distinct types to turn domain mistakes into compile-time errors.

5 min
2026-04-07
C++20 Ranges and Views

An example of how C++20 ranges and views make collection algorithms easier to read.

4 min
2026-03-31
C++20 Concepts

An introduction to C++20 concepts: what they are, when they help and how to use them without making the code heavier.

4 min
2026-03-24
openSUSE Tumbleweed review

My experience with openSUSE Tumbleweed: rolling releases, KDE, stability and a few everyday trade-offs.

6 min
2026-03-17
Auto-updates straight from the source

How I use Obtainium to update open-source Android apps directly from their official sources.

5 min
2026-03-10
Migrating to open-source apps on your phone

After moving to GrapheneOS, I started replacing my main apps with more privacy-respecting alternatives.

5 min
2026-03-03
GrapheneOS: my favorite smartphone operating system

After months of daily use, GrapheneOS became my favorite smartphone operating system.

6 min
2026-02-24
Kill switch for wg-quick and nftables

How I moved kill-switch rules from iptables to nftables inside a wg-quick configuration.

1 min
2026-02-17
iptables vs nftables

Why nftables makes firewall rules easier to organize than separate iptables and ip6tables configurations.

2 min
2026-02-10
Header guards vs pragma once

A comparison between header guards and pragma once, with benefits and limits of both options.

4 min
2026-02-03
Undoing the last Git commit

The difference between git revert and git reset when you need to undo the last commit.

1 min
2026-01-27
How to check a package version on GNU/Linux

A quick way to check an installed package version without running the binary directly.

1 min
2026-01-20
Signals and Slots

Starting from Qt's signal/slot model, I build a small modern C++ implementation.

4 min
2026-01-13
How to structure a C++ project

A tidy C++ project structure with separate libraries and applications, and a build that is easier to follow.

6 min
2026-01-06
Prelude

The first note on the site: why I decided to start writing publicly.

1 min