<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Ecostack</title>
    <link>https://ecostack.dev/</link>
    <description>Recent content on Ecostack</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <copyright>© 2026 Sebastian Scheibe</copyright>
    <lastBuildDate>Sun, 27 Sep 2026 11:00:00 +0800</lastBuildDate><atom:link href="https://ecostack.dev/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>How ClickHouse Diagnostic Logs Filled My Uptrace Server</title>
      <link>https://ecostack.dev/posts/uptrace-clickhouse-diagnostic-logs-disk-usage/</link>
      <pubDate>Sun, 27 Sep 2026 11:00:00 +0800</pubDate>
      
      <guid>https://ecostack.dev/posts/uptrace-clickhouse-diagnostic-logs-disk-usage/</guid>
      <description>My self-hosted Uptrace server had used 96 GiB of a 154 GiB root filesystem. Uptrace was configured to retain project data for 28 days, so I expected old telemetry to disappear. Instead, ClickHouse&amp;rsquo;s own diagnostic tables had grown to 79.1 GiB. The Uptrace application tables occupied just 1.19 GiB.
After removing fully expired diagnostic partitions and limiting new diagnostic data, the filesystem used 23 GiB (15%). Uptrace&amp;rsquo;s 28-day project retention did not change.</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ecostack.dev/posts/uptrace-clickhouse-diagnostic-logs-disk-usage/featured.webp" />
    </item>
    
    <item>
      <title>Reverse-engineering The Witcher 3 saves between Nintendo Switch and PC</title>
      <link>https://ecostack.dev/posts/witcher-3-switch-pc-save-converter/</link>
      <pubDate>Sun, 30 Aug 2026 18:00:00 +0800</pubDate>
      
      <guid>https://ecostack.dev/posts/witcher-3-switch-pc-save-converter/</guid>
      <description>Moving a The Witcher 3: Wild Hunt save between Nintendo Switch and PC sounds as though it should be a simple file-copying exercise. Both versions describe the same game state, and CD PROJEKT RED even provides an official cross-progression system.
But a raw manual save exported from a Switch does not have the same outer format - or even the same filename - as its PC counterpart.
I compared genuine saves, tested existing converters, and built a bidirectional converter in Go to find out exactly what changes between the two platforms.</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ecostack.dev/posts/witcher-3-switch-pc-save-converter/featured.webp" />
    </item>
    
    <item>
      <title>PostgreSQL: Preventing Idle Connections From Accumulating After Deployments</title>
      <link>https://ecostack.dev/posts/postgres-idle-connections-after-deployments/</link>
      <pubDate>Mon, 17 Aug 2026 00:00:00 +0800</pubDate>
      
      <guid>https://ecostack.dev/posts/postgres-idle-connections-after-deployments/</guid>
      <description>The problem #   Last week, our PostgreSQL database started running out of connections. The connection limit was 100, but after a day or so the application could no longer open a new connection. When PostgreSQL returned a too many connections error, both production and the worker stopped working.
The confusing part was that the application pool was configured with a much smaller number of connections. Looking at pg_stat_activity, however, showed connections in both idle and idle in transaction states.</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ecostack.dev/posts/postgres-idle-connections-after-deployments/featured.webp" />
    </item>
    
    <item>
      <title>Firebase Auth Custom Domain</title>
      <link>https://ecostack.dev/posts/firebase-auth-custom-domain/</link>
      <pubDate>Sun, 08 Jun 2025 13:05:29 +0800</pubDate>
      
      <guid>https://ecostack.dev/posts/firebase-auth-custom-domain/</guid>
      <description>Use a domain such as auth.example.com for Firebase Authentication instead of showing a Firebase-assigned hostname to your users. This guide covers Google sign-in and the action links in authentication emails.
Before starting, you need a Firebase project, access to its Hosting and Authentication settings, and permission to edit the domain&amp;rsquo;s DNS records. The examples assume your application already uses Firebase Authentication.
For a Chrome extension, also check the Firebase authentication and Blue Argon guide .</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ecostack.dev/posts/firebase-auth-custom-domain/featured.webp" />
    </item>
    
    <item>
      <title>Fixed Window Rate Limit with Golang &amp; Redis</title>
      <link>https://ecostack.dev/posts/fixed-window-rate-limit-golang-redis/</link>
      <pubDate>Fri, 02 May 2025 16:05:19 +0800</pubDate>
      
      <guid>https://ecostack.dev/posts/fixed-window-rate-limit-golang-redis/</guid>
      <description>Introduction #   Imagine you have a resource that can only handle a limited number of requests per second.
How do you ensure it doesn’t get overwhelmed?
One solution is rate-limiting — controlling how many requests are allowed in a given time frame.
In this article, I’ll show how to implement a simple rate limiter using Redis and Golang.
Rate-Limiting Algorithms #   There are several types of rate-limiting algorithms — two common ones are fixed-window and token bucket.</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ecostack.dev/posts/fixed-window-rate-limit-golang-redis/featured.webp" />
    </item>
    
    <item>
      <title>Setting Up NGINX with Let&#39;s Encrypt for HTTPS in Docker Compose</title>
      <link>https://ecostack.dev/posts/nginx-lets-encrypt-certificate-https-docker-compose/</link>
      <pubDate>Sun, 30 Mar 2025 16:18:28 +0800</pubDate>
      
      <guid>https://ecostack.dev/posts/nginx-lets-encrypt-certificate-https-docker-compose/</guid>
      <description>Introduction #   In this guide, you’ll learn how to set up a secure HTTPS connection for your application using NGINX, Let&amp;rsquo;s Encrypt&amp;rsquo;s Certbot, and Docker Compose.
What is a secure connection (HTTPS)? #   HTTPS (HyperText Transfer Protocol Secure) is an extension of HTTP that uses encryption (SSL/TLS) to secure data exchanged between a web server and browser, ensuring privacy and data integrity.
What is Let&amp;rsquo;s Encrypt? #   Let&amp;rsquo;s Encrypt is a free and automated Certificate Authority that runs to serve the public&amp;rsquo;s benefit.</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ecostack.dev/posts/nginx-lets-encrypt-certificate-https-docker-compose/featured.webp" />
    </item>
    
    <item>
      <title>Find Which Process Is Using a Port on macOS</title>
      <link>https://ecostack.dev/posts/checking-open-ports/</link>
      <pubDate>Tue, 11 Feb 2025 11:41:42 +0800</pubDate>
      
      <guid>https://ecostack.dev/posts/checking-open-ports/</guid>
      <description>Checking Open Ports on Your System #   Need to check which applications are listening on a port? Here’s how you can do it on macOS.
Using lsof #   The lsof command lists process IDs, ports, and network addresses:
lsof -a -PiTCP -sTCP:LISTEN Example output:
lsof -a -PiTCP -sTCP:LISTEN COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rapportd 1063 user 9u IPv4 ... 0t0 TCP *:59797 (LISTEN) ControlCe 1105 user 8u IPv4 .</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ecostack.dev/posts/checking-open-ports/featured.webp" />
    </item>
    
    <item>
      <title>How to Set Up a Process Daemon on Ubuntu Linux with systemd</title>
      <link>https://ecostack.dev/posts/ubuntu-systemd-service-guide/</link>
      <pubDate>Sat, 08 Feb 2025 18:29:41 +0800</pubDate>
      
      <guid>https://ecostack.dev/posts/ubuntu-systemd-service-guide/</guid>
      <description>If you need to run a process as a daemon in Ubuntu, this guide will walk you through the steps to set it up properly using systemd.
Setting Up the Daemon #   Let&amp;rsquo;s assume your executable is named arduino-data-points, and you want to configure it as a daemon under the same name.
I assume the executable is stored here:
/root/arduino-data/arduino-data-points 1. Define the Service #   First, create a service file for systemd.</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ecostack.dev/posts/ubuntu-systemd-service-guide/featured.webp" />
    </item>
    
    <item>
      <title>How to Fix Mac and iPhone Handoff Issues</title>
      <link>https://ecostack.dev/posts/mac-iphone-handoff-not-working/</link>
      <pubDate>Fri, 24 Jan 2025 16:54:37 +0800</pubDate>
      
      <guid>https://ecostack.dev/posts/mac-iphone-handoff-not-working/</guid>
      <description>Handoff is a feature that allows seamless transitions between your Mac and iPhone. If it isn’t working, follow these steps to troubleshoot the issue.
Step 1: Check ClipboardSharingEnabled Configuration #   Check the current configuration for ClipboardSharingEnabled using the command below.
Check the return value of this in your terminal:
defaults read ~/Library/Preferences/com.apple.coreservices.useractivityd.plist ClipboardSharingEnabled If the value is 0, enable clipboard sharing with this command.
defaults write ~/Library/Preferences/com.apple.coreservices.useractivityd.plist ClipboardSharingEnabled 1 Step 2: Restart the UserActivity Daemon #   To apply the changes, restart the useractivityd process using this command:</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ecostack.dev/posts/mac-iphone-handoff-not-working/featured.webp" />
    </item>
    
    <item>
      <title>Deterministic RSA Key Generation with Rust and WebAssembly</title>
      <link>https://ecostack.dev/posts/wasm-rust-zero-knowledge-auth/</link>
      <pubDate>Wed, 01 Jan 2025 11:11:10 +0800</pubDate>
      
      <guid>https://ecostack.dev/posts/wasm-rust-zero-knowledge-auth/</guid>
      <description>While exploring a browser authentication project, I needed to generate the same RSA key pair from the same seed. Web Crypto provides key generation, but it does not accept a caller-supplied seed. Rust compiled to WebAssembly makes it possible to experiment with that missing capability.
Correction, September 2026: the earlier version used RSA-OAEP with signing operations and described the surrounding design as zero-knowledge authentication. The API combination was invalid, and deterministic key generation alone does not justify that security claim.</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ecostack.dev/posts/wasm-rust-zero-knowledge-auth/featured.webp" />
    </item>
    
    <item>
      <title>Firebase Authentication in Chrome Extensions: Solving the Blue Argon Error</title>
      <link>https://ecostack.dev/posts/firebase-auth-chrome-extension-blue-argon/</link>
      <pubDate>Sun, 22 Dec 2024 11:00:41 +0800</pubDate>
      
      <guid>https://ecostack.dev/posts/firebase-auth-chrome-extension-blue-argon/</guid>
      <description>Problem #   Hey there, have you seen the Blue Argon error while publishing a Chrome extension with the Firebase Auth SDK?
Let&amp;rsquo;s get into the details of what a Blue Argon error is.
Blue Argon #   Blue Argon is a rejection error enforced by the Chrome Web Store when a Chrome extension violates the security policies of Manifest V3.
Manifest V3 introduces stricter Content Security Policy (CSP) rules to enhance security, primarily targeting:</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ecostack.dev/posts/firebase-auth-chrome-extension-blue-argon/featured.webp" />
    </item>
    
    <item>
      <title>Becoming Your Best Self: Lessons from the Great Minds of History</title>
      <link>https://ecostack.dev/posts/becoming-your-best-self-lessons-from-history/</link>
      <pubDate>Sun, 13 Oct 2024 08:24:25 +0800</pubDate>
      
      <guid>https://ecostack.dev/posts/becoming-your-best-self-lessons-from-history/</guid>
      <description>Introduction #   I have been listening to the amazing podcast How to Take Over the World by Ben Wilson in the past weeks and I wanted to note down some things that all the great people have in common.
The following notes are all based on the podcast.
The Power of Writing #   Great minds like Julius Caesar, Benjamin Franklin, and Napoleon Bonaparte were known for their habit of reading and writing daily.</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ecostack.dev/posts/becoming-your-best-self-lessons-from-history/featured.webp" />
    </item>
    
    <item>
      <title>Handling Proxy Issues with Firebase in Node.js</title>
      <link>https://ecostack.dev/posts/nodejs-firebase-proxy-issues/</link>
      <pubDate>Thu, 10 Oct 2024 10:22:08 +0800</pubDate>
      
      <guid>https://ecostack.dev/posts/nodejs-firebase-proxy-issues/</guid>
      <description>Introduction #   Firebase is widely used for authentication, database management, and other server-side operations in Node.js applications. However, when operating behind a corporate proxy or firewall, you might encounter connection issues that hinder communication with Firebase services. In this article, we will explore how to configure Firebase behind a proxy using the proxy-agent package.
Proxy with Firebase #   Here’s an example of how your Firebase initialization code might look:</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ecostack.dev/posts/nodejs-firebase-proxy-issues/featured.webp" />
    </item>
    
    <item>
      <title>Load Balancing Docker Compose Replicas Using Nginx</title>
      <link>https://ecostack.dev/posts/load-balancing-docker-compose-replicas-using-nginx/</link>
      <pubDate>Wed, 02 Oct 2024 12:00:09 +0800</pubDate>
      
      <guid>https://ecostack.dev/posts/load-balancing-docker-compose-replicas-using-nginx/</guid>
      <description>Introduction #   This is the second article in a series on how to maximize CPU utilization for single-threaded languages like Node.js and Python. In the previous article, I explored using Docker Swarm, which provides built-in load balancing. You can find that article on Docker Swarm load balancing .
In this article, however, we’ll stick with Docker Compose and look at how to effectively handle load balancing without switching to Docker Swarm.</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ecostack.dev/posts/load-balancing-docker-compose-replicas-using-nginx/featured.webp" />
    </item>
    
    <item>
      <title>Load Balancing Docker Compose Replicas Using Docker Swarm</title>
      <link>https://ecostack.dev/posts/load-balancing-docker-compose-replicas-using-docker-swarm/</link>
      <pubDate>Mon, 23 Sep 2024 10:29:09 +0800</pubDate>
      
      <guid>https://ecostack.dev/posts/load-balancing-docker-compose-replicas-using-docker-swarm/</guid>
      <description>Introduction #   Imagine you are working with Docker Compose and you have deployed your Python or Node.js app with it. You might have noticed that these are usually single-threaded, and you need multiple instances of the same app to make use of the tons of CPU your server has.
When dealing with high traffic or CPU-intensive operations, running multiple replicas of your service is crucial to distribute the load and make full use of your server&amp;rsquo;s resources.</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ecostack.dev/posts/load-balancing-docker-compose-replicas-using-docker-swarm/featured.webp" />
    </item>
    
    <item>
      <title>Seamless Integration: Setting Up Lark Webhooks for Uptime Kuma Notifications</title>
      <link>https://ecostack.dev/posts/lark-webhook-uptime-kuma-setup-guide/</link>
      <pubDate>Fri, 13 Sep 2024 20:31:03 +0800</pubDate>
      
      <guid>https://ecostack.dev/posts/lark-webhook-uptime-kuma-setup-guide/</guid>
      <description>Introduction #   In this article, we will guide you through setting up a Lark webhook to receive notifications from Uptime Kuma, a popular self-hosted monitoring tool. Using Lark for notifications ensures that your team stays informed in real-time about the status of your monitored services, allowing you to respond quickly to any downtime or issues.
Setup Lark Notification Webhook for Group #   Create Group #   Let&amp;rsquo;s create a group in which the notifications will be added.</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ecostack.dev/posts/lark-webhook-uptime-kuma-setup-guide/featured.webp" />
    </item>
    
    <item>
      <title>Free Up Disk Space on Linux: Find Big Files Fast</title>
      <link>https://ecostack.dev/posts/free-up-linux-disk-space/</link>
      <pubDate>Wed, 04 Sep 2024 22:04:57 +0800</pubDate>
      
      <guid>https://ecostack.dev/posts/free-up-linux-disk-space/</guid>
      <description>If your Linux machine&amp;rsquo;s disk is full, you might be wondering which files or directories are consuming the most space. Here is a guide that will help you, in case you have some space left you can use ncdu or otherwise just use find.
NCDU #   If there is some space left on your Linux, I highly recommend using ncdu, here is what the man page has to say:</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ecostack.dev/posts/free-up-linux-disk-space/featured.jpg" />
    </item>
    
    <item>
      <title>Plug In and Power Up: Your Guide to Charging EVs in China</title>
      <link>https://ecostack.dev/posts/plug-in-power-up-ev-charging-china/</link>
      <pubDate>Sun, 01 Sep 2024 11:00:59 +0800</pubDate>
      
      <guid>https://ecostack.dev/posts/plug-in-power-up-ev-charging-china/</guid>
      <description>Introduction #   Charging an electric vehicle (EV) in China can be quite different from other countries, especially if you’re new to the EV ecosystem or are traveling from abroad. With one of the world’s largest and fastest-growing EV markets, China offers a wide range of charging options, from public fast chargers to home charging solutions. Understanding the local charging infrastructure, types of connectors, and how to efficiently find and use charging stations is key to a smooth driving experience.</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ecostack.dev/posts/plug-in-power-up-ev-charging-china/featured.webp" />
    </item>
    
    <item>
      <title>Testing Matters: The Node.js Buffer Write Bug in Version 22.7.0</title>
      <link>https://ecostack.dev/posts/nodejs-buffer-bug/</link>
      <pubDate>Sat, 24 Aug 2024 22:23:39 +0800</pubDate>
      
      <guid>https://ecostack.dev/posts/nodejs-buffer-bug/</guid>
      <description>Introduction #   Imagine this: A critical piece of your infrastructure—software used by millions—suddenly fails, not because of a massive overhaul or a complicated feature, but due to a seemingly minor update. No one notices the flaw until it’s too late, and the damage ripples through countless applications. This isn’t a hypothetical scenario; it’s a reality that recently unfolded in the world of Node.js.
With the release of Node.js 22.</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ecostack.dev/posts/nodejs-buffer-bug/featured.webp" />
    </item>
    
    <item>
      <title>Automated Docker Compose Deployment with GitHub Actions</title>
      <link>https://ecostack.dev/posts/automated-docker-compose-deployment-github-actions/</link>
      <pubDate>Tue, 23 Jul 2024 08:57:48 +0800</pubDate>
      
      <guid>https://ecostack.dev/posts/automated-docker-compose-deployment-github-actions/</guid>
      <description>Overview #   This guide will show you how to set up an automatic deployment pipeline using GitHub Actions. This pipeline will connect to a target server via SSH, update the Docker image, and restart the Docker containers. Automatic deployment ensures that your applications are always running the latest code with minimal manual intervention.
Prerequisites #   Before you begin, ensure you have the following:
 Docker installed on the target server.</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ecostack.dev/posts/automated-docker-compose-deployment-github-actions/featured.webp" />
    </item>
    
    <item>
      <title>Limit Docker Log Size to Prevent Disk Exhaustion</title>
      <link>https://ecostack.dev/posts/docker-logging-limitation/</link>
      <pubDate>Tue, 02 Jul 2024 11:00:41 +0800</pubDate>
      
      <guid>https://ecostack.dev/posts/docker-logging-limitation/</guid>
      <description>Introduction #   Ever had the error No space left on device or Cannot create directory? It might be due to logs from your Docker daemon. Here is how you can limit the logs from Docker containers.
Overview of Docker Logging #   Docker logs are essential for debugging and monitoring container applications. However, unmanaged logs can quickly consume disk space, leading to system errors and degraded performance.</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ecostack.dev/posts/docker-logging-limitation/featured.webp" />
    </item>
    
    <item>
      <title>Nginx: Rewrite Path without normalizing URI in proxy_pass</title>
      <link>https://ecostack.dev/posts/nginx-rewrite-path-without-normalizing-uri-using-proxy-pass/</link>
      <pubDate>Mon, 15 Apr 2024 22:57:47 +0800</pubDate>
      
      <guid>https://ecostack.dev/posts/nginx-rewrite-path-without-normalizing-uri-using-proxy-pass/</guid>
      <description>Introduction #   Understanding Nginx&amp;rsquo;s URL rewriting capabilities can significantly enhance your web infrastructure&amp;rsquo;s flexibility and efficiency. This guide will delve into complex rewriting techniques that prevent unwanted URL normalization, which can be crucial for API gateways handling diverse service endpoints.
Original Configuration #   The initial Nginx configuration is set up to handle requests to both the root URL and the /api endpoint differently. Here&amp;rsquo;s how it looks:</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ecostack.dev/posts/nginx-rewrite-path-without-normalizing-uri-using-proxy-pass/featured.webp" />
    </item>
    
    <item>
      <title>Optimizing Nginx Startup: How to Delay DNS Lookup in proxy_pass</title>
      <link>https://ecostack.dev/posts/optimizing-nginx-startup-delay-dns-lookup/</link>
      <pubDate>Mon, 15 Apr 2024 21:11:23 +0800</pubDate>
      
      <guid>https://ecostack.dev/posts/optimizing-nginx-startup-delay-dns-lookup/</guid>
      <description>In Nginx configurations where proxy_pass directives include domain names, startup delays or failures can occur if those domains are unreachable.
You might have seen an error like this:
host not found in upstream &amp;#34;this-domain-does-not.exist&amp;#34; in /etc/nginx/sites-enabled/test.com:18 This issue can significantly slow down the server&amp;rsquo;s response time or prevent Nginx from booting entirely. Fortunately, there&amp;rsquo;s a straightforward workaround to prevent Nginx from performing DNS lookups at startup, thereby improving its initialization speed.</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ecostack.dev/posts/optimizing-nginx-startup-delay-dns-lookup/featured.webp" />
    </item>
    
    <item>
      <title>Golang Error: missing Location in call to Time.In</title>
      <link>https://ecostack.dev/posts/golang-error-missing-location-in-call-to-time-in/</link>
      <pubDate>Mon, 04 Mar 2024 08:24:25 +0800</pubDate>
      
      <guid>https://ecostack.dev/posts/golang-error-missing-location-in-call-to-time-in/</guid>
      <description>The Problem #   Did you ever have any of these errors?
 missing Location in call to Time.In missing Location in call to Date  panic: time: missing Location in call to Time.In goroutine 1 [running]: time.Time.In(...) /usr/local/go/src/time/time.go:1146 main.main() /app/main.go:16 +0x1c5 Does your code look somewhat like this?
location, _ := time.LoadLocation(&amp;#34;Europe/Amsterdam&amp;#34;) name, offset := time.Now().In(location).Zone() log.Println(&amp;#34;name: &amp;#34;+name, &amp;#34;offset: &amp;#34;+strconv.Itoa(offset)) Are you using Alpine or a similar distribution in your Docker container?</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ecostack.dev/posts/golang-error-missing-location-in-call-to-time-in/featured.webp" />
    </item>
    
    <item>
      <title>Mastering OpenTelemetry with Uptrace: A Developer&#39;s Guide</title>
      <link>https://ecostack.dev/posts/mastering-opentelemetry-uptrace-developer-guide/</link>
      <pubDate>Fri, 01 Mar 2024 23:35:48 +0800</pubDate>
      
      <guid>https://ecostack.dev/posts/mastering-opentelemetry-uptrace-developer-guide/</guid>
      <description>Introduction #   Did you ever ask yourself one of these questions?
 What tool can I use for unified log management across my entire application stack? How do I track the performance of individual functions in a microservices architecture? What&amp;rsquo;s the best way to collect metrics from different parts of a distributed system? Is there a standard solution for observing system behavior in cloud-native environments? Which open-source framework can help me in correlating logs, metrics, and traces from various sources?</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ecostack.dev/posts/mastering-opentelemetry-uptrace-developer-guide/featured.webp" />
    </item>
    
    <item>
      <title>Setting Up Nginx with Self-Signed HTTPS in Docker Compose</title>
      <link>https://ecostack.dev/posts/nginx-self-signed-https-docker-compose/</link>
      <pubDate>Mon, 04 Dec 2023 16:48:16 +0800</pubDate>
      
      <guid>https://ecostack.dev/posts/nginx-self-signed-https-docker-compose/</guid>
      <description>Introduction #   In today’s digital age, securing web traffic with HTTPS is crucial for protecting data integrity and privacy. This guide demonstrates how to leverage Nginx, a powerful web server, within Docker Compose to create a secure and scalable environment.
Note: This guide will make use of self-signed certificates. While they provide a layer of security, they are not trusted by default by web browsers and users. For production environments, it&amp;rsquo;s recommended to use certificates issued by a trusted Certificate Authority such as https://letsencrypt.</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ecostack.dev/posts/nginx-self-signed-https-docker-compose/featured.webp" />
    </item>
    
    <item>
      <title>gRPC vs RabbitMQ RPC: How Do They Compare for Microservices?</title>
      <link>https://ecostack.dev/posts/grpc-vs-rabbitmq-rpc-how-do-they-compare-for-microservices/</link>
      <pubDate>Sun, 19 Nov 2023 10:00:00 +0800</pubDate>
      
      <guid>https://ecostack.dev/posts/grpc-vs-rabbitmq-rpc-how-do-they-compare-for-microservices/</guid>
      <description>This article explores the differences between gRPC and RabbitMQ RPC, two leading frameworks in remote procedure calls (RPC) for microservices architecture.
Comparison overview #      Feature gRPC RabbitMQ RPC     Service Definition Yes (.proto file) No   Error Handling Predefined errors list Requires custom implementation   Security TLS, Token TLS, Username/Password   Orchestration Required Not necessary   Performance Fast Slower   Requires direct connection between server and client Yes No    What is RPC?</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ecostack.dev/posts/grpc-vs-rabbitmq-rpc-how-do-they-compare-for-microservices/featured.webp" />
    </item>
    
    <item>
      <title>RabbitMQ Auto Reconnect Node.js</title>
      <link>https://ecostack.dev/posts/rabbitmq-auto-reconnect-nodejs/</link>
      <pubDate>Wed, 23 Aug 2023 22:50:10 +0800</pubDate>
      
      <guid>https://ecostack.dev/posts/rabbitmq-auto-reconnect-nodejs/</guid>
      <description>Problem #   You might have been in that situation, you just implemented a RabbitMQ consumer in Node.js and it works fine. Next thing you know, you are on-call and are woken up in the middle of the night because the queue is full and it is not being consumed.
On a closer look, you see the logs of the consumer and it says IllegalOperationError: Channel closed.
IllegalOperationError: Channel closed at ConfirmChannel.</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ecostack.dev/posts/rabbitmq-auto-reconnect-nodejs/featured.webp" />
    </item>
    
    <item>
      <title>Golang Integer to String</title>
      <link>https://ecostack.dev/posts/golang-int-to-string/</link>
      <pubDate>Tue, 08 Aug 2023 23:11:10 +0800</pubDate>
      
      <guid>https://ecostack.dev/posts/golang-int-to-string/</guid>
      <description>The Go standard library offers the strconv package which has two functions to convert an integer to a string. In the following, let&amp;rsquo;s go into detail on how and where to use which one.
 strconv.Itoa(i int) string  strconv.FormatInt(i int64, base int) string   For converting an integer to a string, the strconv.Atoi(s string) is the best method.
 strconv.Atoi(s string) string   Integer to String #   strconv.</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ecostack.dev/posts/golang-int-to-string/featured.webp" />
    </item>
    
    <item>
      <title>Git Pre-commit Hooks with Husky 9, ESLint, and lint-staged</title>
      <link>https://ecostack.dev/posts/git-pre-commit-hooks-husky/</link>
      <pubDate>Sun, 02 Jul 2023 10:58:47 +0800</pubDate>
      
      <guid>https://ecostack.dev/posts/git-pre-commit-hooks-husky/</guid>
      <description>Use Husky to run a Git hook, lint-staged to select the files being committed, and ESLint to check those files. A failing lint command stops the commit so you can fix the issue first.
This example uses Husky 9.1.7, ESLint 10.9.1, and lint-staged 17.4.1. These are explicit example versions, not a claim about the latest releases. Use Node.js 24 or newer and an npm-based Git repository.
Install the tools #   In an existing project, run:</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ecostack.dev/posts/git-pre-commit-hooks-husky/featured.webp" />
    </item>
    
    <item>
      <title>Connect to Bluetooth Low Energy devices using Golang</title>
      <link>https://ecostack.dev/posts/go-bluetooth-low-energy/</link>
      <pubDate>Sat, 10 Dec 2022 11:05:22 +0800</pubDate>
      
      <guid>https://ecostack.dev/posts/go-bluetooth-low-energy/</guid>
      <description>Let&amp;rsquo;s get right into the weeds on how to use Go to connect to Bluetooth Low Energy (BLE) devices.
If you are unclear of how BLE works, please read this here first: https://learn.adafruit.com/introduction-to-bluetooth-low-energy . We will be using BLE terminology which is required to progress.
In the following, we will use the TinyGo Bluetooth Low Energy library to connect to a thermometer. The thermometer will be the peripheral and our computer the central.</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ecostack.dev/posts/go-bluetooth-low-energy/featured.webp" />
    </item>
    
    <item>
      <title>WebAssembly: Go vs Rust vs AssemblyScript</title>
      <link>https://ecostack.dev/posts/wasm-tinygo-vs-rust-vs-assemblyscript/</link>
      <pubDate>Sun, 27 Nov 2022 01:23:47 +0800</pubDate>
      
      <guid>https://ecostack.dev/posts/wasm-tinygo-vs-rust-vs-assemblyscript/</guid>
      <description>Imagine you are working on the next big thing that runs in the browser, and it requires some heavy-duty code, which need to run fast and efficient. You remember that your friend Jack told you about WebAssembly (Wasm), which supposedly runs faster than JavaScript (JS), so you decide to check it out.
The thing you are working on involves sorting large amounts of data, so you test a pure JS implementation first.</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ecostack.dev/posts/wasm-tinygo-vs-rust-vs-assemblyscript/featured.webp" />
    </item>
    
    <item>
      <title>Go: Cross-Compilation Including Cgo</title>
      <link>https://ecostack.dev/posts/go-and-cgo-cross-compilation/</link>
      <pubDate>Wed, 16 Nov 2022 23:51:02 +0800</pubDate>
      
      <guid>https://ecostack.dev/posts/go-and-cgo-cross-compilation/</guid>
      <description>Updated on 2023-05-24: Added information on cross-compiling using the MUSL and GNU toolchain on macOS for static linking.
Updated on 2025-01-08: Updating the parameters for static linking.
Introduction #   With the release of Go v1.5, it became possible to cross-compile applications for various targets such as Windows, macOS, Linux, Solaris, and Android. Cross-compilation allows you to build binaries for different operating systems from a single development machine. This article explains how to cross-compile Go applications, including those that use Cgo for C dependencies.</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ecostack.dev/posts/go-and-cgo-cross-compilation/featured.webp" />
    </item>
    
    <item>
      <title>Things to Follow</title>
      <link>https://ecostack.dev/posts/things-to-follow/</link>
      <pubDate>Wed, 16 Nov 2022 23:43:33 +0800</pubDate>
      
      <guid>https://ecostack.dev/posts/things-to-follow/</guid>
      <description>General #   https://www.0atman.com/ Finance #   https://bam.kalzumeus.com Business #   https://training.kalzumeus.com/newsletters/archive/consulting_1 https://www.kalzumeus.com/2011/10/28/dont-call-yourself-a-programmer/ https://www.kalzumeus.com/archive/ AI #   https://course.fast.ai/ </description>
      
    </item>
    
    <item>
      <title>Golang Errors With Stacktrace</title>
      <link>https://ecostack.dev/posts/go-errors-with-stacktrace/</link>
      <pubDate>Sat, 04 Jun 2022 00:09:16 +0800</pubDate>
      
      <guid>https://ecostack.dev/posts/go-errors-with-stacktrace/</guid>
      <description>Problem #   The error handling of Go is not up to snuff compared to other languages like Java for example. Errors are treated equally to other values, meaning, they have no special type. This means, they do not carry information of origin in them. Which makes tracking down the error origin more difficult.
Let me show that to you.
package main import ( &amp;#34;errors&amp;#34; &amp;#34;fmt&amp;#34; ) func main() { err := NewErrorWithStackTrace() if err !</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ecostack.dev/posts/go-errors-with-stacktrace/featured.webp" />
    </item>
    
    <item>
      <title>Golang Generic Option Type</title>
      <link>https://ecostack.dev/posts/go-generic-option-type/</link>
      <pubDate>Fri, 03 Jun 2022 22:53:54 +0800</pubDate>
      
      <guid>https://ecostack.dev/posts/go-generic-option-type/</guid>
      <description>Introduction #   You might have heard of the Option type, if not, let me introduce that concept shortly.
An Option type is data structure which either has a value or no value contained in itself, it kind of acts as a box (Schrödinger&amp;rsquo;s cat 😉). Usually, the Option type is created with a constructor such as Some(value) or None(). From there, the type usually offers methods which can act in case a value exists.</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ecostack.dev/posts/go-generic-option-type/featured.webp" />
    </item>
    
    <item>
      <title>React Performance Profiling</title>
      <link>https://ecostack.dev/posts/react-performance-profiling/</link>
      <pubDate>Wed, 01 Jun 2022 23:13:40 +0800</pubDate>
      
      <guid>https://ecostack.dev/posts/react-performance-profiling/</guid>
      <description>You have built this amazing React application with lots of components and everything works smooth but somehow, it feels slugish at certain places. You got that nice lazy loading that the stakeholder wanted but it slows everything down over time.
Now, how would you go ahead and improve this? Let&amp;rsquo;s have a look at profiling a React application!
Your customer has been bothering you for weeks about his project TortoiseBook, and it is nearly finished, but, the most recent complaint was about performance issues!</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ecostack.dev/posts/react-performance-profiling/featured.webp" />
    </item>
    
    <item>
      <title>Go Goroutine Loop Variables: Before and After Go 1.22</title>
      <link>https://ecostack.dev/posts/goroutine-variable-scope/</link>
      <pubDate>Sun, 29 May 2022 00:01:06 +0000</pubDate>
      
      <guid>https://ecostack.dev/posts/goroutine-variable-scope/</guid>
      <description>A goroutine can capture a variable from the surrounding function. Whether a loop gives each goroutine a separate variable depends on how that variable is declared and which Go language version the package uses.
For modules declaring go 1.22 or later, variables declared by a loop have a new instance on each iteration. The common loop-capture bug shown in older Go tutorials therefore no longer applies to those declarations. Variables declared outside the loop can still be shared.</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ecostack.dev/posts/goroutine-variable-scope/featured.webp" />
    </item>
    
    <item>
      <title>Website Scraping - Part 2 - Parsing HTML with NodeJS and cheerio</title>
      <link>https://ecostack.dev/posts/website-scraping-part2/</link>
      <pubDate>Mon, 04 May 2020 15:37:12 +0000</pubDate>
      
      <guid>https://ecostack.dev/posts/website-scraping-part2/</guid>
      <description>Hello back again! If you missed out on how to create the selector for HTML data, please check out part one of the series! Otherwise, let us proceed with the automatic parsing of the data!
We begin with creating a new project. Open up your terminal and enter the following to create a NodeJS project.
mkdir web-data-retrieve &amp;amp;&amp;amp; cd web-data-retrieve &amp;amp;&amp;amp; npm init After that, let us add got (HTTP request client) and cheerio (jQuery equivalent for NodeJS).</description>
      
    </item>
    
    <item>
      <title>Website Scraping - Part 1 - Fetching a website with NodeJS</title>
      <link>https://ecostack.dev/posts/website-scraping-part1/</link>
      <pubDate>Mon, 04 May 2020 15:37:05 +0000</pubDate>
      
      <guid>https://ecostack.dev/posts/website-scraping-part1/</guid>
      <description>You maybe might be in the same position, you want to gather some data of different objects (like financial data from different entities) from a website, and you copy/paste thousands times from website to your local worksheet. The work of collection makes you exhausting. Believe me, I have been there as you did.
To collect and format data more efficiently and nicely, we will create a little program to solve the problem for us.</description>
      
    </item>
    
    <item>
      <title>Functional development concepts</title>
      <link>https://ecostack.dev/posts/functional-development-concepts-logbook/</link>
      <pubDate>Sun, 16 Jun 2019 18:55:26 +0000</pubDate>
      
      <guid>https://ecostack.dev/posts/functional-development-concepts-logbook/</guid>
      <description>In the past time I got at multiple occasions into contact with functional development, be it at work, articles, meetups and so forth. But I never really took my time to fully understand the various concepts that are being used.
Now I had some time in my vacation and did a deep dive into the topic and tried to get my head around some concepts with the help of the book Learn You a Haskell for Great Good.</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ecostack.dev/posts/functional-development-concepts-logbook/featured.webp" />
    </item>
    
    <item>
      <title>How to migrate from Sails.js to Express.js (or how to finally reach land)</title>
      <link>https://ecostack.dev/posts/how-to-migrate-from-sails-js-to-express-js-or-how-to-finally-reach-land/</link>
      <pubDate>Thu, 10 May 2018 10:23:34 +0000</pubDate>
      
      <guid>https://ecostack.dev/posts/how-to-migrate-from-sails-js-to-express-js-or-how-to-finally-reach-land/</guid>
      <description>One of the projects I used to worked on, was a large one written in Sails.js. Now, after such a long time of development the project grew and grew and there was a need now for structural changes. Also it just became necessary to use a compiler for syntax checking.
So, we introduced TypeScript. This step was easy and could be quickly achieved with just a new Grunt task and some modifications at the folder structure.</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://ecostack.dev/posts/how-to-migrate-from-sails-js-to-express-js-or-how-to-finally-reach-land/featured.webp" />
    </item>
    
    <item>
      <title>About</title>
      <link>https://ecostack.dev/about/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://ecostack.dev/about/</guid>
      <description>I&amp;rsquo;m a full-stack engineer with 15+ years of experience in web, mobile, and IoT development. I currently lead software development at a startup focused on digital content organization via a Chrome extension and website.
Previously, at Midjourney, I helped expand the platform to China, utilizing WeChat Pay and QQ, and built an image scraper handling 1 billion images. At ByteDance/TikTok, I worked on trust and safety systems. My past roles at Philips, Plek, and JapieCars spanned scalable systems, AI, and performance optimization.</description>
      
    </item>
    
    <item>
      <title>Office Hours</title>
      <link>https://ecostack.dev/office-hours/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://ecostack.dev/office-hours/</guid>
      <description>During my younger years, I would have liked to contact someone more experienced but shied away from doing so.
If you are interested in talking about software, whether it is an idea or a technical issue, email me at sebastian@ecostack.dev . Include a little context about what you are working on and what you would like to discuss.</description>
      
    </item>
    
  </channel>
</rss>
