Hey! I'm Alex – a Manual QA Engineer with over 6 years of experience in software testing – and more.

This blog is a mix of hands-on advice, reviews, and experiments – all built on real testing experience. Whether you're already in QA or just starting your journey, you'll find something useful here.

I believe that knowledge grows when shared. Let's explore, break, test – and improve – together.

HTTP Status Codes: When Server Responses Look Correct but Behave Wrong


HTTP status codes are one of the core communication mechanisms of the web, yet in practice they are often treated as secondary details. Many applications rely on response bodies to signal errors or success, while status codes are used inconsistently or even contradict the actual result of request processing.

In this article, I take a closer look at HTTP status codes as protocol-level signals and explain why their semantic correctness matters for web and API testing. The discussion covers the main status code classes, common inconsistencies between status codes and response bodies, and how these issues affect client behavior.

The article also includes a real-world case study discovered during server analysis, where a redirect response appeared safe in the browser but still exposed private data to non-browser clients. This example highlights why browser behavior cannot be trusted as the only validation method and why protocol-level inspection is essential when testing web systems and APIs.

Raspberry Pi as a Hardware VPN Gateway with a Tailscale Exit Node


Some devices need to access the internet from another country but cannot run a VPN client or control routing. In such cases, software solutions are not enough. A hardware gateway becomes the only reliable way to enforce traffic routing without modifying the client itself.

In this article, I show how to turn a Raspberry Pi into a fully autonomous VPN gateway using Tailscale Exit Nodes. The setup integrates into an existing Tailscale infrastructure, prevents DNS leaks, blocks VPN bypass, and works even behind CGNAT. The client device remains completely unaware of the VPN, while all its traffic exits through the required country.

crt.sh: How to Discover SSL/TLS Certificates and Subdomains Using Certificate Transparency


crt.sh is a widely used tool in security research and OSINT that provides visibility into SSL/TLS certificates published through Certificate Transparency logs. By working with publicly issued certificates, it helps uncover subdomains, map hidden infrastructure, and monitor certificate activity across domains.

Its simple interface hides a powerful data source that can reveal forgotten services, internal environments, and unexpected relationships between domains.

Extremly small tool for UDP redirect


Sometimes you just need a simple tool that works. udp_redirect is a tiny utility for redirecting UDP packets to another destination and sending responses back to the original sender. No iptables, no FIFO files, no pipes, no additional dependencies – just a single C file and a working binary.

I used it to redirect OpenVPN UDP traffic in order to hide the real IP address, and it turned out to be one of the simplest and most reliable solutions for quick UDP forwarding.

The tool listens on a given IP and port, forwards incoming packets to a specified destination, and remembers the sender's address. When a response comes back, it is sent to the original sender. This behavior is very similar to how symmetric NAT works.

There is also an echo mode, where all received packets are sent back to the sender, which is useful for testing and debugging.

The utility was originally used to test VoIP tools by looping RTP ports, but it can be handy in many networking and testing scenarios.

Non-routable Internet addresses


Non-routable IPv4 addresses appear everywhere: in private networks, VPNs, NAT setups, ISP infrastructure, and test environments – yet their purpose is often misunderstood.

This article provides a clear, RFC-based overview of non-routable IPv4 ranges, including private address space (RFC1918), CGNAT, loopback, link-local addressing, multicast, documentation networks, and reserved blocks. Real-world scenarios such as NAT and VPN usage are covered without unnecessary theory.

How to Simulate Real-World Network Failures in Windows with Clumsy


Modern distributed systems rarely operate in perfect network environments. Unstable Wi-Fi, overloaded routers, mobile links, and long WAN routes can easily break even well-designed applications. To understand how a service behaves under such conditions, QA teams must simulate real-world network degradation during testing.

Clumsy is a Windows-based tool that intercepts and manipulates network packets on the fly, allowing testers to reproduce latency, packet loss, duplication, reordering, corruption, and bandwidth limits without modifying application code. Built on top of the WinDivert driver, it affects traffic system-wide and makes it possible to validate client-server behavior in scenarios that are difficult to reproduce naturally.

Valgrind for Testers


Memory leaks in C and C++ applications often remain invisible until the system starts slowing down, consuming excessive RAM, or crashing under load. Standard monitoring and logs rarely reveal hidden issues such as silent leaks, misuse of dynamic memory, or undefined behavior inside large server components.

Valgrind is one of the most effective tools for dynamic memory analysis. It runs your application inside a virtual CPU, tracks every allocation, and exposes problems that are almost impossible to detect with regular tests. Memcheck helps identify leaks and invalid memory access, while Massif shows how memory usage grows over time – essential for understanding performance degradation.

If you work with C/C++ software or long-running services, this article will help you detect memory issues before they impact production.

Enabling SSH TOTP (2FA) on Ubuntu and Debian-Based Systems


Static SSH credentials-passwords or even keys-are increasingly risky. One leaked key or weak passphrase can mean full server compromise.

The solution? Add TOTP-based two-factor authentication. It's lightweight, standards-based, and works with any authenticator app (Google Authenticator, Authy, Raivo, etc.). No external services, no complex tooling.

I walk through enabling TOTP for SSH on modern Ubuntu and Debian systems using the google-authenticator PAM module-covering setup, safe testing lockout. All in five minutes.

Send a Telegram Message with a Single Request


Most CI/CD and backend systems come with built-in notifications – but what about standalone scripts, cron jobs, or custom services that still need reliable alerts? Telegram Bot API offers a simple, fast, cross-platform solution that requires no SDKs and takes only minutes to set up.

With just a bot token and a chat ID, engineers can send messages directly to Telegram through a single HTTP request.

Creating a bot via @BotFather, retrieving your chat ID, and sending a message through GET or POST makes Telegram an accessible, lightweight alerting channel for virtually any environment.

In an increasingly complex tooling landscape, Telegram's straightforward API proves that effective engineering doesn't need to be over-engineered. Sometimes the best solution is the one that just works – instantly.

Authentication vs. Authorization


Authentication and authorization are two core security processes that work together to protect systems and data. Authentication focuses on verifying a user's identity, while authorization defines what resources and actions that user is allowed to access. Understanding this distinction is crucial for building strong security.

A useful analogy is an airport: first, a passenger's identity is confirmed, and only then are their privileges determined – such as boarding class or lounge access. In digital systems the logic is the same. Authentication ensures users are genuine, and authorization grants specific permissions based on roles and policies. Proper configuration of both mechanisms is essential for any secure environment.