<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Kliku Kliku</title><link>https://klikukliku.dev/</link><description>Recent content on Kliku Kliku</description><generator>Hugo</generator><language>en</language><lastBuildDate>Tue, 24 Mar 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://klikukliku.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>A focus framework: The Pomodoro technique</title><link>https://klikukliku.dev/posts/pomodoro-technique/</link><pubDate>Tue, 24 Mar 2026 00:00:00 +0000</pubDate><guid>https://klikukliku.dev/posts/pomodoro-technique/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Have you ever wondered why your productivity drops so much after just a few hours of coding? I noticed something in my own workflow: the biggest enemy of focus isn&amp;rsquo;t a lack of knowledge. It is constant context switching.&lt;/p&gt;
&lt;p&gt;Chat messages, emails, and &amp;ldquo;quick questions&amp;rdquo; from teammates constantly break our rhythm. I decided to look for a solution, and for the past few weeks, I have been testing the Pomodoro technique. Today, I want to share my findings with you.&lt;/p&gt;</description></item><item><title>OpenCode inside Docker: How to safely run AI in your local terminal?</title><link>https://klikukliku.dev/posts/opencode-in-docer-container/</link><pubDate>Tue, 17 Mar 2026 00:00:00 +0000</pubDate><guid>https://klikukliku.dev/posts/opencode-in-docer-container/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;I’ve recently been looking into how to run AI tools safely within our local environments. Tools like OpenCode are great, but they give algorithms a lot of freedom to interact with our files. I usually follow the principle of limited trust, which led me to try running OpenCode inside a container. This way, it only has access to the specific files and directories it actually needs.&lt;/p&gt;
&lt;h2 id="why-isolation-matters"&gt;Why isolation matters&lt;/h2&gt;
&lt;p&gt;When we allow AI models to generate and run code, we are essentially giving them partial control over our terminal. Even if we trust the provider, a simple bug in a generated script could cause a mess in our file system. The solution? &lt;strong&gt;Containerization&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Cusdis Comments in Hugo: A Lightweight Solution Without Tracking</title><link>https://klikukliku.dev/posts/hugo-comments-cusdis/</link><pubDate>Tue, 10 Mar 2026 00:00:00 +0000</pubDate><guid>https://klikukliku.dev/posts/hugo-comments-cusdis/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;While looking through comment systems for static blogs, I decided to check out Cusdis. It promises a &amp;ldquo;low-friction&amp;rdquo; approach: a simple widget, no ads, and no heavy tracking in the background. Cusdis positions itself as a lightweight, privacy-friendly alternative to Disqus. It is an open-source project with a self-hosting option and a managed version at cusdis.com. You can find a detailed guide on how to self-host Cusdis in a separate post: &lt;a href="https://klikukliku.dev/en/posts/cusdis-self-hosted-vps"&gt;Self-Hosting Cusdis on a VPS&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Styling Cusdis: Taking Control of the Iframe Without Touching the Source</title><link>https://klikukliku.dev/posts/cusdis-custom-styles/</link><pubDate>Tue, 03 Mar 2026 00:00:00 +0000</pubDate><guid>https://klikukliku.dev/posts/cusdis-custom-styles/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;I recently looked into implementing a comment system based on Cusdis. It&amp;rsquo;s a lightweight and privacy-friendly solution, but it comes with a UI challenge: the widget renders inside an &lt;code&gt;iframe&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;What does this mean for us? An iframe creates an isolated environment. The CSS styles we have in our project don&amp;rsquo;t leak inside. As a result, if our layout has specific branding, the default, minimalist Cusdis design looks like a part of something else.&lt;/p&gt;</description></item><item><title>Self-hosting Cusdis Comments with Caddy on a VPS</title><link>https://klikukliku.dev/posts/cusdis-self-hosted-vps/</link><pubDate>Tue, 24 Feb 2026 00:00:00 +0000</pubDate><guid>https://klikukliku.dev/posts/cusdis-self-hosted-vps/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;When I was looking for a comment system, I quickly realized that most available
solutions either track users, require heavy JavaScript, or simply cost money.
Cusdis stands out from the crowd. It is lightweight, open-source, and built
from the ground up with self-hosting in mind.&lt;/p&gt;
&lt;p&gt;In this post, I show how to deploy Cusdis on any VPS using Docker and Caddy
as a reverse proxy, with correctly configured CORS headers.&lt;/p&gt;</description></item><item><title>Giscus Comments in Hugo: Lightweight GitHub Discussions Integration</title><link>https://klikukliku.dev/posts/hugo-comments-giscus/</link><pubDate>Tue, 17 Feb 2026 00:00:00 +0000</pubDate><guid>https://klikukliku.dev/posts/hugo-comments-giscus/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;As part of my review of comment solutions for static blogs, I decided to test &lt;strong&gt;Giscus&lt;/strong&gt;. It is an open-source tool that uses GitHub Discussions as its backend.&lt;/p&gt;
&lt;p&gt;I was intrigued mainly by the promise of high performance and privacy. Below, I present an analysis of this solution, an implementation guide for Hugo, and the conclusions from my performance tests.&lt;/p&gt;
&lt;h2 id="what-exactly-is-giscus"&gt;What exactly is Giscus?&lt;/h2&gt;
&lt;p&gt;Giscus is a widget that connects your website directly to the GitHub API. When a reader leaves a comment under a post, the system automatically creates a new discussion (or adds a reply) in the connected GitHub repository.&lt;/p&gt;</description></item><item><title>Disqus Comments in Hugo: Setup Guide and Performance Analysis</title><link>https://klikukliku.dev/posts/hugo-comments-disqus/</link><pubDate>Tue, 10 Feb 2026 00:00:00 +0000</pubDate><guid>https://klikukliku.dev/posts/hugo-comments-disqus/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Disqus is probably the first solution that comes to mind when we think about comments on static sites. It has been with us since 2007, supports millions of websites, and takes the burden of building a backend off our shoulders.&lt;/p&gt;
&lt;p&gt;I decided to check what its integration with Hugo looks like in 2026, but mostly, what the real cost of this convenience is. I ran performance tests on this blog, and the results might surprise you.&lt;/p&gt;</description></item><item><title>Hugo Optimization: Complete Guide</title><link>https://klikukliku.dev/posts/hugo-performance-summary/</link><pubDate>Tue, 03 Feb 2026 00:00:00 +0000</pubDate><guid>https://klikukliku.dev/posts/hugo-performance-summary/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Over the past few weeks, I conducted a comprehensive optimization of my Hugo-based website. What started as curiosity about whether I could squeeze more performance out of a static site generator turned into a series of experiments with concrete, measurable results.&lt;/p&gt;
&lt;p&gt;The starting point was good. Hugo naturally generates fast pages. My Lighthouse score hovered around 92-94 points. However, analysis in Chrome DevTools revealed problems invisible to the naked eye. Nearly fifteen megabytes of transfer on the homepage. Fifteen separate CSS files generating one and a half seconds of delay. No caching strategy for returning visitors.&lt;/p&gt;</description></item><item><title>Hugo JS Optimization: Bundling, Fingerprinting, and Caching in 15 Minutes</title><link>https://klikukliku.dev/posts/hugo-js-optimization/</link><pubDate>Tue, 27 Jan 2026 00:00:00 +0000</pubDate><guid>https://klikukliku.dev/posts/hugo-js-optimization/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;After &lt;strong&gt;&lt;a href="https://klikukliku.dev/posts/hugo-css-optimization"&gt;cleaning up CSS styles&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href="https://klikukliku.dev/posts/hugo-image-optimization"&gt;optimizing images&lt;/a&gt;&lt;/strong&gt;, I focused on the JavaScript layer. At first glance, the situation looked innocent. The site was loading two files: a script from the theme and my own code for handling the color theme toggle. Together, they weighed less than three kilobytes. With such a small size, optimizing here might seem like overkill.&lt;/p&gt;
&lt;p&gt;However, the real challenge was hidden in the HTTP headers. I noticed that both files had a one-year cache lifetime. Unfortunately, their names lacked a unique identifier, or a &amp;ldquo;fingerprint.&amp;rdquo; This created a serious risk. It meant that after deploying any fixes, users would still use the old version of the code saved in their browsers.&lt;/p&gt;</description></item><item><title>HTTP Server Optimization for Hugo: GZIP, Cache Headers, and Fingerprinting</title><link>https://klikukliku.dev/posts/hugo-server-optimization/</link><pubDate>Tue, 20 Jan 2026 00:00:00 +0000</pubDate><guid>https://klikukliku.dev/posts/hugo-server-optimization/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;We often focus on HTML minification or CSS bundling, treating it as the end of optimization. However, I&amp;rsquo;ve noticed that even the best-prepared files can load slowly if we forget about the HTTP server layer. That&amp;rsquo;s where untapped potential lies, worth exploring.&lt;/p&gt;
&lt;p&gt;In my practice, two configuration elements prove crucial. First, GZIP compression. From my experience, it can reduce text file sizes by sixty to seventy percent. Second, proper Cache headers. They eliminate unnecessary requests on subsequent user visits. Today I&amp;rsquo;ll show you how to configure a server for a Hugo-based site to squeeze maximum performance from static files.&lt;/p&gt;</description></item><item><title>CSS Optimization in Hugo: Minification and Bundling for Maximum Performance</title><link>https://klikukliku.dev/posts/hugo-css-optimization/</link><pubDate>Tue, 13 Jan 2026 00:00:00 +0000</pubDate><guid>https://klikukliku.dev/posts/hugo-css-optimization/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;We often focus on optimizing JavaScript or images, while treating CSS styles as somewhat secondary. We assume that since individual files weigh just a few kilobytes, they&amp;rsquo;re not a problem. But that&amp;rsquo;s a false assumption. The way we deliver these files to the browser can have a crucial impact on how quickly users see the finished page.&lt;/p&gt;
&lt;p&gt;When I looked into Chrome&amp;rsquo;s developer tools, I noticed a specific problem on my site. My page was loading fifteen separate CSS files. Combined, this generated a delay of around one point six seconds. Interestingly, the data size wasn&amp;rsquo;t the issue at all. GZIP compression was working correctly and reducing file weight by over sixty percent. The real bottleneck turned out to be the sheer number of HTTP requests. The browser was wasting time establishing connections instead of downloading content.&lt;/p&gt;</description></item><item><title>Hugo Image Processing: How I Reduced Page Size by 98%</title><link>https://klikukliku.dev/posts/hugo-image-optimization/</link><pubDate>Tue, 06 Jan 2026 00:00:00 +0000</pubDate><guid>https://klikukliku.dev/posts/hugo-image-optimization/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Images are usually the biggest obstacle to website performance. Although Hugo generates fast static sites by nature, unoptimized images can completely cancel out this advantage. I decided to investigate this using my own website as a case study.&lt;/p&gt;
&lt;p&gt;Analysis in Chrome DevTools clearly showed the source of the problem. Images made up 96% of the total transfer, adding up to nearly 15 MB. I identified three large PNG files that caused most of this traffic and increased the load time to over 4 seconds. For mobile users, this meant a long wait and wasted data.&lt;/p&gt;</description></item><item><title>Symfony Quick Start: Docker &amp; Makefile</title><link>https://klikukliku.dev/posts/dockerfile-and-makefile-for-symfony/</link><pubDate>Tue, 30 Dec 2025 00:00:00 +0000</pubDate><guid>https://klikukliku.dev/posts/dockerfile-and-makefile-for-symfony/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;I recently spent a lot of time optimizing my local environment. I realized that I had fallen into the trap of overcomplicating things. I was building huge docker-compose files and hiding logic inside scripts. Because of this, I lost sight of what really matters.&lt;/p&gt;
&lt;p&gt;I decided to go back to basics and focus on simplicity. My current setup for Symfony relies on two things: pure Docker and a Makefile. For the development image, I chose the latest PHP version and SQLite support. This allows me to start coding instantly. I do not have to waste time configuring heavy database containers.&lt;/p&gt;</description></item><item><title>Comment Systems Performance Test</title><link>https://klikukliku.dev/posts/comment-systems-performance-test/</link><pubDate>Mon, 29 Dec 2025 12:09:04 +0100</pubDate><guid>https://klikukliku.dev/posts/comment-systems-performance-test/</guid><description>&lt;p&gt;This is a dedicated test post for measuring the performance impact of different comment systems on our Hugo site.&lt;/p&gt;
&lt;h2 id="testing-methodology"&gt;Testing Methodology&lt;/h2&gt;
&lt;p&gt;We&amp;rsquo;re comparing four popular comment systems:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Disqus&lt;/strong&gt; - Popular third-party solution with cloud hosting&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Giscus&lt;/strong&gt; - GitHub Discussions-based, open source&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cusdis&lt;/strong&gt; - Lightweight, privacy-focused solution&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remark42&lt;/strong&gt; - Self-hosted, privacy-focused with rich features&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="performance-metrics"&gt;Performance Metrics&lt;/h2&gt;
&lt;p&gt;For each system, we measure:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Page Load Time&lt;/strong&gt; - Total time to fully load the page&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JavaScript Size&lt;/strong&gt; - Amount of JS downloaded for comments&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP Requests&lt;/strong&gt; - Number of network requests made&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PageSpeed Score&lt;/strong&gt; - Desktop and Mobile performance scores&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Core Web Vitals&lt;/strong&gt; - FCP (First Contentful Paint) and LCP (Largest Contentful Paint)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="test-environment"&gt;Test Environment&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hugo Version&lt;/strong&gt;: v0.152.2 extended&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Theme&lt;/strong&gt;: Terminal v4.2.3&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Browser&lt;/strong&gt;: Chrome/Brave (latest)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Network&lt;/strong&gt;: Real-world conditions via PageSpeed Insights&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cache&lt;/strong&gt;: Hard reload (Ctrl+Shift+R) for accurate measurements&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="baseline-measurement"&gt;Baseline Measurement&lt;/h2&gt;
&lt;p&gt;Before testing any comment system, we capture a baseline measurement of the page &lt;strong&gt;without comments&lt;/strong&gt; to understand the base performance.&lt;/p&gt;</description></item><item><title>Google Tag Manager in the Hugo Ecosystem</title><link>https://klikukliku.dev/posts/google-tag-manager-in-hugo/</link><pubDate>Tue, 23 Dec 2025 00:00:00 +0000</pubDate><guid>https://klikukliku.dev/posts/google-tag-manager-in-hugo/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;I recently worked on adding analytics to a Hugo project. Usually, adding a tracking script takes just five minutes. But doing it the right way is a different story. If we want it to be fast and respect user privacy, it becomes a more interesting challenge.&lt;/p&gt;
&lt;p&gt;Below, I have shared my notes and a step-by-step guide for Google Tag Manager and Google Analytics 4. I focused on keeping the code clean. I also made sure the Cookie Consent really works, rather than just looking like it does.&lt;/p&gt;</description></item><item><title>Hugo + GitHub Actions: a simple deployment pipeline</title><link>https://klikukliku.dev/posts/deploy-hugo-by-github-actions/</link><pubDate>Tue, 16 Dec 2025 00:00:00 +0000</pubDate><guid>https://klikukliku.dev/posts/deploy-hugo-by-github-actions/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;The simplest way to automatically deploy a Hugo site is this: keep the whole project in a GitHub repository, and let GitHub Actions build the site on every push and upload the generated public/ directory to your server over SSH using rsync.​&lt;/p&gt;
&lt;h2 id="assumptions"&gt;Assumptions&lt;/h2&gt;
&lt;p&gt;Here I assume two things.&lt;/p&gt;
&lt;p&gt;First, you already have a working Hugo project locally. For example, you created it with &lt;code&gt;hugo new site your_site&lt;/code&gt; and you checked that running the &lt;code&gt;hugo&lt;/code&gt; command locally correctly generates the public/ directory.​&lt;/p&gt;</description></item><item><title>Hugo vs Sulu</title><link>https://klikukliku.dev/posts/hugo-vs-sulu/</link><pubDate>Tue, 09 Dec 2025 00:00:00 +0000</pubDate><guid>https://klikukliku.dev/posts/hugo-vs-sulu/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;In this article, we will look at two tools that follow completely different philosophies: Hugo and Sulu. Both are open‑source solutions for building websites, but they solve problems in very different ways.&lt;/p&gt;
&lt;p&gt;Let’s start with Hugo. It is a static site generator written in Go. Its main job is to transform source files into ready‑to‑serve HTML, CSS and JavaScript, which we can then host on any server. What really sets Hugo apart is its speed – site builds are extremely fast. The community around the project has been growing dynamically and has already gathered over eighty‑five thousand stars on GitHub. It is, however, a very developer‑centric tool. Content is edited mainly in Markdown files stored in a Git repository, and the publishing workflow is tightly coupled with version control.&lt;/p&gt;</description></item><item><title>Pomodoro Timer</title><link>https://klikukliku.dev/pomodoro/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://klikukliku.dev/pomodoro/</guid><description/></item><item><title>What's going on</title><link>https://klikukliku.dev/readme/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://klikukliku.dev/readme/</guid><description>&lt;h2 id="hi-there"&gt;Hi there&lt;/h2&gt;
&lt;p&gt;They say you need a strategy to start a project. Right now, I only have motivation and a keyboard.&lt;/p&gt;
&lt;p&gt;I am not sure yet if this will be a technical guide or a developer diary. For now, I treat this place as my “external memory.” I collect solutions and ideas here that I want to save for the future, so I don’t have to search for them twice.&lt;/p&gt;</description></item></channel></rss>