fixed site

This commit is contained in:
2026-03-29 17:20:43 +02:00
parent c9e3d971c4
commit d433869348
153 changed files with 6766 additions and 1653 deletions
+371 -188
View File
@@ -1,202 +1,385 @@
<!DOCTYPE html>
<html lang="en" dir="auto">
<head><meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="robots" content="index, follow">
<title>404 Page not found | PyteDev Blog</title>
<meta name="keywords" content="">
<meta name="description" content="">
<meta name="author" content="">
<link rel="canonical" href="https://pyte.dev/404.html">
<link crossorigin="anonymous" href="/assets/css/stylesheet.f49d66caae9ea0fd43f21f29e71a8d3e284517ed770f2aa86fa012953ad3c9ef.css" integrity="sha256-9J1myq6eoP1D8h8p5xqNPihFF&#43;13Dyqob6ASlTrTye8=" rel="preload stylesheet" as="style">
<link rel="icon" href="https://pyte.dev/favicon.ico">
<link rel="icon" type="image/png" sizes="16x16" href="https://pyte.dev/favicon-16x16.png">
<link rel="icon" type="image/png" sizes="32x32" href="https://pyte.dev/favicon-32x32.png">
<link rel="apple-touch-icon" href="https://pyte.dev/apple-touch-icon.png">
<link rel="mask-icon" href="https://pyte.dev/safari-pinned-tab.svg">
<meta name="theme-color" content="#2e2e33">
<meta name="msapplication-TileColor" content="#2e2e33">
<link rel="alternate" hreflang="en" href="https://pyte.dev/404.html">
<noscript>
<style>
#theme-toggle,
.top-link {
display: none;
}
</style>
<style>
@media (prefers-color-scheme: dark) {
:root {
--theme: rgb(29, 30, 32);
--entry: rgb(46, 46, 51);
--primary: rgb(218, 218, 219);
--secondary: rgb(155, 156, 157);
--tertiary: rgb(65, 66, 68);
--content: rgb(196, 196, 197);
--code-block-bg: rgb(46, 46, 51);
--code-bg: rgb(55, 56, 62);
--border: rgb(51, 51, 51);
}
.list {
background: var(--theme);
}
.list:not(.dark)::-webkit-scrollbar-track {
background: 0 0;
}
.list:not(.dark)::-webkit-scrollbar-thumb {
border-color: var(--theme);
}
}
</style>
</noscript><meta property="og:url" content="https://pyte.dev/404.html">
<meta property="og:site_name" content="PyteDev Blog">
<meta property="og:title" content="404 Page not found">
<meta property="og:locale" content="en-us">
<meta property="og:type" content="website">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="404 Page not found">
<meta name="twitter:description" content="">
</head>
<body class="list" id="top">
<!doctype html>
<html
lang="de-DE"
dir="ltr"
class="h-full">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="language" content="de-DE">
<script>
if (localStorage.getItem("pref-theme") === "dark") {
document.body.classList.add('dark');
} else if (localStorage.getItem("pref-theme") === "light") {
document.body.classList.remove('dark')
} else if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
document.body.classList.add('dark');
}
(function () {
const storedTheme = localStorage.getItem("theme");
const systemPrefersLight = window.matchMedia("(prefers-color-scheme: light)").matches;
const theme = storedTheme || (systemPrefersLight ? "light" : "dark");
document.documentElement.setAttribute("data-theme", theme);
})();
</script>
<header class="header">
<nav class="nav">
<div class="logo">
<a href="https://pyte.dev/" accesskey="h" title="PyteDev Blog (Alt + H)">PyteDev Blog</a>
<div class="logo-switches">
<button id="theme-toggle" accesskey="t" title="(Alt + T)" aria-label="Toggle theme">
<svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
stroke-linejoin="round">
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
</svg>
<svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
stroke-linejoin="round">
<circle cx="12" cy="12" r="5"></circle>
<line x1="12" y1="1" x2="12" y2="3"></line>
<line x1="12" y1="21" x2="12" y2="23"></line>
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
<line x1="1" y1="12" x2="3" y2="12"></line>
<line x1="21" y1="12" x2="23" y2="12"></line>
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
</svg>
</button>
</div>
</div>
<ul id="menu">
<li>
<a href="https://pyte.dev/" title="Home">
<span>Home</span>
</a>
</li>
<li>
<a href="https://pyte.dev/posts/" title="Blog">
<span>Blog</span>
</a>
</li>
<li>
<a href="https://pyte.dev/search/" title="Search">
<span>Search</span>
</a>
</li>
</ul>
</nav>
</header>
<main class="main">
<div class="not-found">404</div>
</main>
<title>404 Page not found | Demians Blog</title>
<meta
name="description"
content="
<footer class="footer">
<span>&copy; 2025 <a href="https://pyte.dev/">PyteDev Blog</a></span> ·
">
<span>
Powered by
<a href="https://gohugo.io/" rel="noopener noreferrer" target="_blank">Hugo</a> &
<a href="https://github.com/adityatelange/hugo-PaperMod/" rel="noopener" target="_blank">PaperMod</a>
</span>
</footer>
<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
<path d="M12 6H0l6-6z" />
</svg>
</a>
<script>
let menu = document.getElementById('menu')
if (menu) {
menu.scrollLeft = localStorage.getItem("menu-scroll-position");
menu.onscroll = function () {
localStorage.setItem("menu-scroll-position", menu.scrollLeft);
}
<link rel="canonical" href="https://pyte.dev/404.html">
<meta name="robots" content="index, follow">
<meta property="og:type" content="website">
<meta property="og:title" content="404 Page not found | Demians Blog">
<meta property="og:description" content="">
<meta property="og:url" content="https://pyte.dev/404.html">
<meta property="og:site_name" content="Demians Blog"><meta property="og:image" content="https://pyte.dev/assets/patrick.png">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="404 Page not found | Demians Blog">
<meta name="twitter:description" content=""><meta name="twitter:image" content="https://pyte.dev/assets/patrick.png">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;600;700&family=Outfit:wght@400;500;600;700;800;900&family=Space+Grotesk:wght@400;500;600;700&display=swap"
rel="stylesheet">
<link
rel="stylesheet"
href="/css/theme.min.86a32b729f656fc6c119ed69193950db815a3ad9fdc967b32c76d602f11449a4.css"
integrity="sha256-hqMrcp9lb8bBGe1pGTlQ24FaOtn9yWezLHbWAvEUSaQ=">
<link
rel="stylesheet"
href="/css/syntax-dark.min.3e403a03e3af837b3829e9b6f01fc7792bda7cb7f5056f5e9786109545c6b2e1.css"
integrity="sha256-PkA6A&#43;Ovg3s4Kem28B/HeSvafLf1BW9el4YQlUXGsuE="
id="syntax-dark-theme"
class="syntax-theme"><link
rel="stylesheet"
href="/css/syntax-light.min.d0d33b879698595e6b2c0f75f0cea95a8517fb0150570cd0ee4dc42e25c8d147.css"
integrity="sha256-0NM7h5aYWV5rLA918M6pWoUX&#43;wFQVwzQ7k3ELiXI0Uc="
id="syntax-light-theme"
class="syntax-theme"
disabled><script>
(function () {
const storedTheme = localStorage.getItem("theme");
const systemPrefersLight = window.matchMedia("(prefers-color-scheme: light)").matches;
const theme = storedTheme || (systemPrefersLight ? "light" : "dark");
const syntaxDark = document.getElementById("syntax-dark-theme");
const syntaxLight = document.getElementById("syntax-light-theme");
if (theme === "light") {
if (syntaxDark) syntaxDark.disabled = true;
if (syntaxLight) syntaxLight.disabled = false;
} else {
if (syntaxDark) syntaxDark.disabled = false;
if (syntaxLight) syntaxLight.disabled = true;
}
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener("click", function (e) {
e.preventDefault();
var id = this.getAttribute("href").substr(1);
if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
behavior: "smooth"
});
} else {
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
}
if (id === "top") {
history.replaceState(null, null, " ");
} else {
history.pushState(null, null, `#${id}`);
}
});
const observer = new MutationObserver(() => {
const currentTheme = document.documentElement.getAttribute("data-theme");
if (currentTheme === "light") {
if (syntaxDark) syntaxDark.disabled = true;
if (syntaxLight) syntaxLight.disabled = false;
} else {
if (syntaxDark) syntaxDark.disabled = false;
if (syntaxLight) syntaxLight.disabled = true;
}
});
observer.observe(document.documentElement, {
attributes: true,
attributeFilter: ["data-theme"],
});
})();
</script>
<script>
var mybutton = document.getElementById("top-link");
window.onscroll = function () {
if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
mybutton.style.visibility = "visible";
mybutton.style.opacity = "1";
} else {
mybutton.style.visibility = "hidden";
mybutton.style.opacity = "0";
}
};
</script>
<script>
document.getElementById("theme-toggle").addEventListener("click", () => {
if (document.body.className.includes("dark")) {
document.body.classList.remove('dark');
localStorage.setItem("pref-theme", 'light');
} else {
document.body.classList.add('dark');
localStorage.setItem("pref-theme", 'dark');
}
})
</script>
</body>
<link
rel="stylesheet"
href="/css/bundle.min.783a79746a859af9be598cbc33fba2a1087434b23768524277b07ef28336f113.css"
integrity="sha256-eDp5dGqFmvm&#43;WYy8M/uioQh0NLI3aFJCd7B&#43;8oM28RM=">
<link rel="icon" type="image/x-icon" href="/favicon.ico">
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">
<link rel="icon" type="image/png" href="/favicon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon/logo-transparent/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon/logo-transparent/favicon-16x16.png">
<link rel="apple-touch-icon" sizes="180x180" href="/favicon/logo-transparent/apple-touch-icon.png">
<link
rel="icon"
type="image/png"
sizes="192x192"
href="/favicon/logo-transparent/android-chrome-192x192.png">
<link
rel="icon"
type="image/png"
sizes="512x512"
href="/favicon/logo-transparent/android-chrome-512x512.png">
<link rel="manifest" href="/favicon/logo-transparent/site.webmanifest">
</head>
<body class="flex flex-col min-h-screen">
<a href="#main-content" class="skip-to-main" aria-label="Skip to main content"
>Skip to main content</a
>
<header class="sticky-header">
<div class="header-container">
<nav class="header-nav" role="navigation" aria-label="Main navigation">
<div class="header-content">
<div class="header-logo">
<a href="/" class="logo-link" aria-label="Home - Demians Blog">
Demians Blog
</a>
</div>
<div class="header-menu">
<ul class="menu-list">
<li class="menu-item">
<a
href="/"
class="menu-link ">
Home
</a>
</li>
<li class="menu-item">
<a
href="/posts/"
class="menu-link ">
Blog
</a>
</li>
</ul>
<button id="search-toggle" class="search-toggle" aria-label="Search" type="button">
<svg class="search-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"></path>
</svg>
</button>
<button id="theme-toggle" class="theme-toggle" aria-label="Toggle theme" type="button">
<svg class="icon-sun" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true">
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z"></path>
</svg>
<svg class="icon-moon" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true">
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z"></path>
</svg>
</button>
</div>
</div>
</nav>
</div>
</header>
<main id="main-content" class="flex-1" role="main">
<section class="hero-section">
<div class="hero-container">
<div class="hero-content">
<div class="hero-text">
<h1 class="hero-title">
<span class="hero-title-line2">404</span>
<span class="hero-title-line1">This Page Does Not Exist</span>
</h1>
<p class="hero-subtitle">
&gt;
Sorry, the page you are looking for could not be found.
</p>
<div class="hero-social" style="margin-top: var(--spacing-lg);">
<a href="/" class="post-tag"> Return to the home page </a>
</div>
</div>
<div class="hero-image">
<img
src="/favicon/logo-transparent/android-chrome-512x512.png"
alt="Demians Blog"
class="hero-logo">
</div>
</div>
</div>
</section>
</main>
<footer>
<footer class="site-footer">
<div class="footer-content">
<p class="footer-text">
&copy;
2026
Demians Blog.
Built with Hugo and Mana ❤️
</p>
<div class="footer-social">
<div class="social-links">
<a
href="https://github.com/pyte1"
target="_blank"
rel="noopener noreferrer"
class="social-link"
aria-label="GitHub">
<svg fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
<path
fill-rule="evenodd"
d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z"
clip-rule="evenodd"></path>
</svg>
</a>
<a href="mailto:demian%20%28at%29%20pyte%20%28dot%29%20dev" class="social-link" aria-label="Email">
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true">
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"></path>
</svg>
</a>
</div>
</div>
</div>
</footer>
</footer>
<div id="search-modal" class="search-modal" aria-hidden="true" role="dialog" aria-label="Search">
<div class="search-modal-backdrop" id="search-modal-backdrop"></div>
<div class="search-modal-container">
<div class="search-input-wrapper">
<svg class="search-input-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"></path>
</svg>
<input
type="search"
id="search-input"
class="search-input"
placeholder="Search..."
autocomplete="off"
aria-label="Search input">
<button class="search-input-clear" id="search-input-clear" aria-label="Clear search">
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"></path>
</svg>
</button>
<button class="search-modal-close" id="search-modal-close" aria-label="Close search">
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M6 18L18 6M6 6l12 12"></path>
</svg>
</button>
</div>
<div id="search-results" class="search-results"></div>
</div>
</div>
<button id="scroll-to-top" class="scroll-to-top" aria-label="Scroll to top" type="button">
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true">
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M5 10l7-7m0 0l7 7m-7-7v18"></path>
</svg>
</button>
<script src="/js/main.min.e60ab79dca7b920b4dc5cf3163ad5ce8794839b60f27778db65782f087be3e27.js" defer></script>
</body>
</html>
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

+6
View File
@@ -0,0 +1,6 @@
--2026-01-13 18:39:18-- https://i.redd.it/characters-who-are-dumb-but-dont-have-a-heart-to-make-up-v0-46o9rs25apke1.png?width=864
Resolving i.redd.it (i.redd.it)... 146.75.121.140, 2a04:4e42:8e::396
Connecting to i.redd.it (i.redd.it)|146.75.121.140|:443... connected.
HTTP request sent, awaiting response... 403 Forbidden
2026-01-13 18:39:18 ERROR 403: Forbidden.
+487 -194
View File
@@ -1,208 +1,501 @@
<!DOCTYPE html>
<html lang="en" dir="auto">
<head><meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="robots" content="index, follow">
<title>Categories | PyteDev Blog</title>
<meta name="keywords" content="">
<meta name="description" content="">
<meta name="author" content="">
<link rel="canonical" href="https://pyte.dev/categories/">
<link crossorigin="anonymous" href="/assets/css/stylesheet.f49d66caae9ea0fd43f21f29e71a8d3e284517ed770f2aa86fa012953ad3c9ef.css" integrity="sha256-9J1myq6eoP1D8h8p5xqNPihFF&#43;13Dyqob6ASlTrTye8=" rel="preload stylesheet" as="style">
<link rel="icon" href="https://pyte.dev/favicon.ico">
<link rel="icon" type="image/png" sizes="16x16" href="https://pyte.dev/favicon-16x16.png">
<link rel="icon" type="image/png" sizes="32x32" href="https://pyte.dev/favicon-32x32.png">
<link rel="apple-touch-icon" href="https://pyte.dev/apple-touch-icon.png">
<link rel="mask-icon" href="https://pyte.dev/safari-pinned-tab.svg">
<meta name="theme-color" content="#2e2e33">
<meta name="msapplication-TileColor" content="#2e2e33">
<link rel="alternate" type="application/rss+xml" href="https://pyte.dev/categories/index.xml">
<link rel="alternate" hreflang="en" href="https://pyte.dev/categories/">
<noscript>
<style>
#theme-toggle,
.top-link {
display: none;
}
</style>
<style>
@media (prefers-color-scheme: dark) {
:root {
--theme: rgb(29, 30, 32);
--entry: rgb(46, 46, 51);
--primary: rgb(218, 218, 219);
--secondary: rgb(155, 156, 157);
--tertiary: rgb(65, 66, 68);
--content: rgb(196, 196, 197);
--code-block-bg: rgb(46, 46, 51);
--code-bg: rgb(55, 56, 62);
--border: rgb(51, 51, 51);
}
.list {
background: var(--theme);
}
.list:not(.dark)::-webkit-scrollbar-track {
background: 0 0;
}
.list:not(.dark)::-webkit-scrollbar-thumb {
border-color: var(--theme);
}
}
</style>
</noscript><meta property="og:url" content="https://pyte.dev/categories/">
<meta property="og:site_name" content="PyteDev Blog">
<meta property="og:title" content="Categories">
<meta property="og:locale" content="en-us">
<meta property="og:type" content="website">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Categories">
<meta name="twitter:description" content="">
</head>
<body class="list" id="top">
<!doctype html>
<html
lang="de-DE"
dir="ltr"
class="h-full">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="language" content="de-DE">
<script>
if (localStorage.getItem("pref-theme") === "dark") {
document.body.classList.add('dark');
} else if (localStorage.getItem("pref-theme") === "light") {
document.body.classList.remove('dark')
} else if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
document.body.classList.add('dark');
}
(function () {
const storedTheme = localStorage.getItem("theme");
const systemPrefersLight = window.matchMedia("(prefers-color-scheme: light)").matches;
const theme = storedTheme || (systemPrefersLight ? "light" : "dark");
document.documentElement.setAttribute("data-theme", theme);
})();
</script>
<header class="header">
<nav class="nav">
<div class="logo">
<a href="https://pyte.dev/" accesskey="h" title="PyteDev Blog (Alt + H)">PyteDev Blog</a>
<div class="logo-switches">
<button id="theme-toggle" accesskey="t" title="(Alt + T)" aria-label="Toggle theme">
<svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
stroke-linejoin="round">
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
</svg>
<svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
stroke-linejoin="round">
<circle cx="12" cy="12" r="5"></circle>
<line x1="12" y1="1" x2="12" y2="3"></line>
<line x1="12" y1="21" x2="12" y2="23"></line>
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
<line x1="1" y1="12" x2="3" y2="12"></line>
<line x1="21" y1="12" x2="23" y2="12"></line>
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
</svg>
</button>
</div>
</div>
<ul id="menu">
<li>
<a href="https://pyte.dev/" title="Home">
<span>Home</span>
</a>
</li>
<li>
<a href="https://pyte.dev/posts/" title="Blog">
<span>Blog</span>
</a>
</li>
<li>
<a href="https://pyte.dev/search/" title="Search">
<span>Search</span>
</a>
</li>
</ul>
</nav>
</header>
<main class="main">
<header class="page-header">
<h1>Categories</h1>
</header>
<ul class="terms-tags">
</ul>
</main>
<title>Categories | Demians Blog</title>
<meta
name="description"
content="
<footer class="footer">
<span>&copy; 2025 <a href="https://pyte.dev/">PyteDev Blog</a></span> ·
">
<span>
Powered by
<a href="https://gohugo.io/" rel="noopener noreferrer" target="_blank">Hugo</a> &
<a href="https://github.com/adityatelange/hugo-PaperMod/" rel="noopener" target="_blank">PaperMod</a>
</span>
</footer>
<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
<path d="M12 6H0l6-6z" />
</svg>
</a>
<script>
let menu = document.getElementById('menu')
if (menu) {
menu.scrollLeft = localStorage.getItem("menu-scroll-position");
menu.onscroll = function () {
localStorage.setItem("menu-scroll-position", menu.scrollLeft);
}
<link rel="canonical" href="https://pyte.dev/categories/">
<meta name="robots" content="index, follow">
<meta property="og:type" content="website">
<meta property="og:title" content="Categories | Demians Blog">
<meta property="og:description" content="">
<meta property="og:url" content="https://pyte.dev/categories/">
<meta property="og:site_name" content="Demians Blog"><meta property="og:image" content="https://pyte.dev/assets/patrick.png">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Categories | Demians Blog">
<meta name="twitter:description" content=""><meta name="twitter:image" content="https://pyte.dev/assets/patrick.png">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;600;700&family=Outfit:wght@400;500;600;700;800;900&family=Space+Grotesk:wght@400;500;600;700&display=swap"
rel="stylesheet">
<link
rel="stylesheet"
href="/css/theme.min.86a32b729f656fc6c119ed69193950db815a3ad9fdc967b32c76d602f11449a4.css"
integrity="sha256-hqMrcp9lb8bBGe1pGTlQ24FaOtn9yWezLHbWAvEUSaQ=">
<link
rel="stylesheet"
href="/css/syntax-dark.min.3e403a03e3af837b3829e9b6f01fc7792bda7cb7f5056f5e9786109545c6b2e1.css"
integrity="sha256-PkA6A&#43;Ovg3s4Kem28B/HeSvafLf1BW9el4YQlUXGsuE="
id="syntax-dark-theme"
class="syntax-theme"><link
rel="stylesheet"
href="/css/syntax-light.min.d0d33b879698595e6b2c0f75f0cea95a8517fb0150570cd0ee4dc42e25c8d147.css"
integrity="sha256-0NM7h5aYWV5rLA918M6pWoUX&#43;wFQVwzQ7k3ELiXI0Uc="
id="syntax-light-theme"
class="syntax-theme"
disabled><script>
(function () {
const storedTheme = localStorage.getItem("theme");
const systemPrefersLight = window.matchMedia("(prefers-color-scheme: light)").matches;
const theme = storedTheme || (systemPrefersLight ? "light" : "dark");
const syntaxDark = document.getElementById("syntax-dark-theme");
const syntaxLight = document.getElementById("syntax-light-theme");
if (theme === "light") {
if (syntaxDark) syntaxDark.disabled = true;
if (syntaxLight) syntaxLight.disabled = false;
} else {
if (syntaxDark) syntaxDark.disabled = false;
if (syntaxLight) syntaxLight.disabled = true;
}
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener("click", function (e) {
e.preventDefault();
var id = this.getAttribute("href").substr(1);
if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
behavior: "smooth"
});
} else {
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
}
if (id === "top") {
history.replaceState(null, null, " ");
} else {
history.pushState(null, null, `#${id}`);
}
});
const observer = new MutationObserver(() => {
const currentTheme = document.documentElement.getAttribute("data-theme");
if (currentTheme === "light") {
if (syntaxDark) syntaxDark.disabled = true;
if (syntaxLight) syntaxLight.disabled = false;
} else {
if (syntaxDark) syntaxDark.disabled = false;
if (syntaxLight) syntaxLight.disabled = true;
}
});
observer.observe(document.documentElement, {
attributes: true,
attributeFilter: ["data-theme"],
});
})();
</script>
<script>
var mybutton = document.getElementById("top-link");
window.onscroll = function () {
if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
mybutton.style.visibility = "visible";
mybutton.style.opacity = "1";
} else {
mybutton.style.visibility = "hidden";
mybutton.style.opacity = "0";
}
};
</script>
<script>
document.getElementById("theme-toggle").addEventListener("click", () => {
if (document.body.className.includes("dark")) {
document.body.classList.remove('dark');
localStorage.setItem("pref-theme", 'light');
} else {
document.body.classList.add('dark');
localStorage.setItem("pref-theme", 'dark');
}
})
</script>
</body>
<link
rel="stylesheet"
href="/css/bundle.min.783a79746a859af9be598cbc33fba2a1087434b23768524277b07ef28336f113.css"
integrity="sha256-eDp5dGqFmvm&#43;WYy8M/uioQh0NLI3aFJCd7B&#43;8oM28RM=">
<link rel="icon" type="image/x-icon" href="/favicon.ico">
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">
<link rel="icon" type="image/png" href="/favicon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon/logo-transparent/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon/logo-transparent/favicon-16x16.png">
<link rel="apple-touch-icon" sizes="180x180" href="/favicon/logo-transparent/apple-touch-icon.png">
<link
rel="icon"
type="image/png"
sizes="192x192"
href="/favicon/logo-transparent/android-chrome-192x192.png">
<link
rel="icon"
type="image/png"
sizes="512x512"
href="/favicon/logo-transparent/android-chrome-512x512.png">
<link rel="manifest" href="/favicon/logo-transparent/site.webmanifest">
<link rel="alternate" type="application/rss&#43;xml" href="https://pyte.dev/categories/index.xml">
</head>
<body class="flex flex-col min-h-screen">
<a href="#main-content" class="skip-to-main" aria-label="Skip to main content"
>Skip to main content</a
>
<header class="sticky-header">
<div class="header-container">
<nav class="header-nav" role="navigation" aria-label="Main navigation">
<div class="header-content">
<div class="header-logo">
<a href="/" class="logo-link" aria-label="Home - Demians Blog">
Demians Blog
</a>
</div>
<div class="header-menu">
<ul class="menu-list">
<li class="menu-item">
<a
href="/"
class="menu-link ">
Home
</a>
</li>
<li class="menu-item">
<a
href="/posts/"
class="menu-link ">
Blog
</a>
</li>
</ul>
<button id="search-toggle" class="search-toggle" aria-label="Search" type="button">
<svg class="search-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"></path>
</svg>
</button>
<button id="theme-toggle" class="theme-toggle" aria-label="Toggle theme" type="button">
<svg class="icon-sun" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true">
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z"></path>
</svg>
<svg class="icon-moon" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true">
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z"></path>
</svg>
</button>
</div>
</div>
</nav>
</div>
</header>
<main id="main-content" class="flex-1" role="main">
<div class="list-container">
<header class="list-header">
<h1 class="list-title">
<span class="list-title-line2">POSTS</span>
</h1>
<div class="list-count">
<span id="filtered-count">0</span>
posts
</div>
</header>
<div class="filter-accordion">
<button
class="filter-toggle-btn"
id="filter-toggle-btn"
aria-expanded="false"
aria-label="Toggle filters"
aria-controls="posts-filter-content">
<span class="filter-toggle-text">Filters</span>
<svg
class="filter-toggle-icon"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
aria-hidden="true">
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M19 9l-7 7-7-7"></path>
</svg>
</button>
<div class="posts-filter" id="posts-filter-content">
<div class="filter-group filter-group-tags">
<label class="filter-label" for="tag-search-input">Tags</label>
<div class="tag-search-container">
<input
type="text"
id="tag-search-input"
class="tag-search-input"
placeholder="Search for tags..."
aria-label="Search for tags">
<div
id="tag-search-results"
class="tag-search-results"
role="listbox"
aria-label="Tag search results"></div>
</div>
<div class="filter-tags" id="selected-tags-container">
</div>
<div id="all-tags-data" style="display: none;">
</div>
</div>
<div class="filter-group">
<label for="filter-year-month" class="filter-label">Year & Month</label>
<select
id="filter-year-month"
class="filter-select"
aria-label="Filter by year and month">
<option value="">All Dates</option>
<option value="2025 August">2025 August</option>
<option value="2025 May">2025 May</option>
<option value="2025 October">2025 October</option>
<option value="2026 January">2026 January</option>
</select>
</div>
<button id="clear-filters" class="filter-clear-btn" aria-label="Clear all filters">
Clear Filters
</button>
</div>
</div>
<div class="posts-list" id="posts-container">
</div>
</nav>
<div class="tag-nav-links">
<a href="/" class="tag-nav-link">Back to Home</a>
</div>
</div>
</main>
<footer>
<footer class="site-footer">
<div class="footer-content">
<p class="footer-text">
&copy;
2026
Demians Blog.
Built with Hugo and Mana ❤️
</p>
<div class="footer-social">
<div class="social-links">
<a
href="https://github.com/pyte1"
target="_blank"
rel="noopener noreferrer"
class="social-link"
aria-label="GitHub">
<svg fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
<path
fill-rule="evenodd"
d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z"
clip-rule="evenodd"></path>
</svg>
</a>
<a href="mailto:demian%20%28at%29%20pyte%20%28dot%29%20dev" class="social-link" aria-label="Email">
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true">
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"></path>
</svg>
</a>
</div>
</div>
</div>
</footer>
</footer>
<div id="search-modal" class="search-modal" aria-hidden="true" role="dialog" aria-label="Search">
<div class="search-modal-backdrop" id="search-modal-backdrop"></div>
<div class="search-modal-container">
<div class="search-input-wrapper">
<svg class="search-input-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"></path>
</svg>
<input
type="search"
id="search-input"
class="search-input"
placeholder="Search..."
autocomplete="off"
aria-label="Search input">
<button class="search-input-clear" id="search-input-clear" aria-label="Clear search">
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"></path>
</svg>
</button>
<button class="search-modal-close" id="search-modal-close" aria-label="Close search">
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M6 18L18 6M6 6l12 12"></path>
</svg>
</button>
</div>
<div id="search-results" class="search-results"></div>
</div>
</div>
<button id="scroll-to-top" class="scroll-to-top" aria-label="Scroll to top" type="button">
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true">
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M5 10l7-7m0 0l7 7m-7-7v18"></path>
</svg>
</button>
<script src="/js/main.min.e60ab79dca7b920b4dc5cf3163ad5ce8794839b60f27778db65782f087be3e27.js" defer></script>
</body>
</html>
+5 -5
View File
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Categories on PyteDev Blog</title>
<title>Categories on Demians Blog</title>
<link>https://pyte.dev/categories/</link>
<description>Recent content in Categories on PyteDev Blog</description>
<generator>Hugo -- 0.147.2</generator>
<language>en-us</language>
<description>Recent content in Categories on Demians Blog</description>
<generator>Hugo</generator>
<language>de-DE</language>
<atom:link href="https://pyte.dev/categories/index.xml" rel="self" type="application/rss+xml" />
</channel>
</rss>
+9
View File
@@ -0,0 +1,9 @@
<!DOCTYPE html>
<html lang="de-DE">
<head>
<title>https://pyte.dev/categories/</title>
<link rel="canonical" href="https://pyte.dev/categories/">
<meta charset="utf-8">
<meta http-equiv="refresh" content="0; url=https://pyte.dev/categories/">
</head>
</html>
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
.bg{color:#cad3f5;background-color:#24273a}.chroma{color:#cad3f5;background-color:#24273a}.chroma .err{color:#ed8796}.chroma .lnlinks{outline:none;text-decoration:none;color:inherit}.chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}.chroma .lntable{border-spacing:0;padding:0;margin:0;border:0}.chroma .hl{background-color:#494d64}.chroma .lnt{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#8087a2}.chroma .ln{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#8087a2}.chroma .line{display:flex}.chroma .k{color:#c6a0f6}.chroma .kc{color:#f5a97f}.chroma .kd{color:#ed8796}.chroma .kn{color:#8bd5ca}.chroma .kp{color:#c6a0f6}.chroma .kr{color:#c6a0f6}.chroma .kt{color:#ed8796}.chroma .na{color:#8aadf4}.chroma .nc{color:#eed49f}.chroma .no{color:#eed49f}.chroma .nd{color:#8aadf4;font-weight:700}.chroma .ni{color:#8bd5ca}.chroma .ne{color:#f5a97f}.chroma .nl{color:#91d7e3}.chroma .nn{color:#f5a97f}.chroma .py{color:#f5a97f}.chroma .nt{color:#c6a0f6}.chroma .nb{color:#91d7e3}.chroma .bp{color:#91d7e3}.chroma .nv{color:#f4dbd6}.chroma .vc{color:#f4dbd6}.chroma .vg{color:#f4dbd6}.chroma .vi{color:#f4dbd6}.chroma .vm{color:#f4dbd6}.chroma .nf{color:#8aadf4}.chroma .fm{color:#8aadf4}.chroma .s{color:#a6da95}.chroma .sa{color:#ed8796}.chroma .sb{color:#a6da95}.chroma .sc{color:#a6da95}.chroma .dl{color:#8aadf4}.chroma .sd{color:#6e738d}.chroma .s2{color:#a6da95}.chroma .se{color:#8aadf4}.chroma .sh{color:#6e738d}.chroma .si{color:#a6da95}.chroma .sx{color:#a6da95}.chroma .sr{color:#8bd5ca}.chroma .s1{color:#a6da95}.chroma .ss{color:#a6da95}.chroma .m{color:#f5a97f}.chroma .mb{color:#f5a97f}.chroma .mf{color:#f5a97f}.chroma .mh{color:#f5a97f}.chroma .mi{color:#f5a97f}.chroma .il{color:#f5a97f}.chroma .mo{color:#f5a97f}.chroma .o{color:#91d7e3;font-weight:700}.chroma .ow{color:#91d7e3;font-weight:700}.chroma .c{color:#6e738d;font-style:italic}.chroma .ch{color:#6e738d;font-style:italic}.chroma .cm{color:#6e738d;font-style:italic}.chroma .c1{color:#6e738d;font-style:italic}.chroma .cs{color:#6e738d;font-style:italic}.chroma .cp{color:#6e738d;font-style:italic}.chroma .cpf{color:#6e738d;font-weight:700;font-style:italic}.chroma .gd{color:#ed8796;background-color:#363a4f}.chroma .ge{font-style:italic}.chroma .gr{color:#ed8796}.chroma .gh{color:#f5a97f;font-weight:700}.chroma .gi{color:#a6da95;background-color:#363a4f}.chroma .gs{font-weight:700}.chroma .gu{color:#f5a97f;font-weight:700}.chroma .gt{color:#ed8796}.chroma .gl{text-decoration:underline}
@@ -0,0 +1 @@
.bg{color:#cad3f5;background-color:#24273a}.chroma{color:#cad3f5;background-color:#24273a}.chroma .x{}.chroma .err{color:#ed8796}.chroma .cl{}.chroma .lnlinks{outline:none;text-decoration:none;color:inherit}.chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}.chroma .lntable{border-spacing:0;padding:0;margin:0;border:0}.chroma .hl{background-color:#494d64}.chroma .lnt{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#8087a2}.chroma .ln{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#8087a2}.chroma .line{display:flex}.chroma .k{color:#c6a0f6}.chroma .kc{color:#f5a97f}.chroma .kd{color:#ed8796}.chroma .kn{color:#8bd5ca}.chroma .kp{color:#c6a0f6}.chroma .kr{color:#c6a0f6}.chroma .kt{color:#ed8796}.chroma .n{}.chroma .na{color:#8aadf4}.chroma .nc{color:#eed49f}.chroma .no{color:#eed49f}.chroma .nd{color:#8aadf4;font-weight:700}.chroma .ni{color:#8bd5ca}.chroma .ne{color:#f5a97f}.chroma .nl{color:#91d7e3}.chroma .nn{color:#f5a97f}.chroma .nx{}.chroma .py{color:#f5a97f}.chroma .nt{color:#c6a0f6}.chroma .nb{color:#91d7e3}.chroma .bp{color:#91d7e3}.chroma .nv{color:#f4dbd6}.chroma .vc{color:#f4dbd6}.chroma .vg{color:#f4dbd6}.chroma .vi{color:#f4dbd6}.chroma .vm{color:#f4dbd6}.chroma .nf{color:#8aadf4}.chroma .fm{color:#8aadf4}.chroma .l{}.chroma .ld{}.chroma .s{color:#a6da95}.chroma .sa{color:#ed8796}.chroma .sb{color:#a6da95}.chroma .sc{color:#a6da95}.chroma .dl{color:#8aadf4}.chroma .sd{color:#6e738d}.chroma .s2{color:#a6da95}.chroma .se{color:#8aadf4}.chroma .sh{color:#6e738d}.chroma .si{color:#a6da95}.chroma .sx{color:#a6da95}.chroma .sr{color:#8bd5ca}.chroma .s1{color:#a6da95}.chroma .ss{color:#a6da95}.chroma .m{color:#f5a97f}.chroma .mb{color:#f5a97f}.chroma .mf{color:#f5a97f}.chroma .mh{color:#f5a97f}.chroma .mi{color:#f5a97f}.chroma .il{color:#f5a97f}.chroma .mo{color:#f5a97f}.chroma .o{color:#91d7e3;font-weight:700}.chroma .ow{color:#91d7e3;font-weight:700}.chroma .p{}.chroma .c{color:#6e738d;font-style:italic}.chroma .ch{color:#6e738d;font-style:italic}.chroma .cm{color:#6e738d;font-style:italic}.chroma .c1{color:#6e738d;font-style:italic}.chroma .cs{color:#6e738d;font-style:italic}.chroma .cp{color:#6e738d;font-style:italic}.chroma .cpf{color:#6e738d;font-weight:700;font-style:italic}.chroma .g{}.chroma .gd{color:#ed8796;background-color:#363a4f}.chroma .ge{font-style:italic}.chroma .gr{color:#ed8796}.chroma .gh{color:#f5a97f;font-weight:700}.chroma .gi{color:#a6da95;background-color:#363a4f}.chroma .go{}.chroma .gp{}.chroma .gs{font-weight:700}.chroma .gu{color:#f5a97f;font-weight:700}.chroma .gt{color:#ed8796}.chroma .gl{text-decoration:underline}.chroma .w{}
@@ -0,0 +1 @@
.bg{color:#cad3f5;background-color:#24273a}.chroma{color:#cad3f5;background-color:#24273a}.chroma .err{color:#ed8796}.chroma .lnlinks{outline:none;text-decoration:none;color:inherit}.chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}.chroma .lntable{border-spacing:0;padding:0;margin:0;border:0}.chroma .hl{background-color:#494d64}.chroma .lnt{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#8087a2}.chroma .ln{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#8087a2}.chroma .line{display:flex}.chroma .k{color:#c6a0f6}.chroma .kc{color:#f5a97f}.chroma .kd{color:#ed8796}.chroma .kn{color:#8bd5ca}.chroma .kp{color:#c6a0f6}.chroma .kr{color:#c6a0f6}.chroma .kt{color:#ed8796}.chroma .na{color:#8aadf4}.chroma .nc{color:#eed49f}.chroma .no{color:#eed49f}.chroma .nd{color:#8aadf4;font-weight:700}.chroma .ni{color:#8bd5ca}.chroma .ne{color:#f5a97f}.chroma .nl{color:#91d7e3}.chroma .nn{color:#f5a97f}.chroma .py{color:#f5a97f}.chroma .nt{color:#c6a0f6}.chroma .nb{color:#91d7e3}.chroma .bp{color:#91d7e3}.chroma .nv{color:#f4dbd6}.chroma .vc{color:#f4dbd6}.chroma .vg{color:#f4dbd6}.chroma .vi{color:#f4dbd6}.chroma .vm{color:#f4dbd6}.chroma .nf{color:#8aadf4}.chroma .fm{color:#8aadf4}.chroma .s{color:#a6da95}.chroma .sa{color:#ed8796}.chroma .sb{color:#a6da95}.chroma .sc{color:#a6da95}.chroma .dl{color:#8aadf4}.chroma .sd{color:#6e738d}.chroma .s2{color:#a6da95}.chroma .se{color:#8aadf4}.chroma .sh{color:#6e738d}.chroma .si{color:#a6da95}.chroma .sx{color:#a6da95}.chroma .sr{color:#8bd5ca}.chroma .s1{color:#a6da95}.chroma .ss{color:#a6da95}.chroma .m{color:#f5a97f}.chroma .mb{color:#f5a97f}.chroma .mf{color:#f5a97f}.chroma .mh{color:#f5a97f}.chroma .mi{color:#f5a97f}.chroma .il{color:#f5a97f}.chroma .mo{color:#f5a97f}.chroma .o{color:#91d7e3;font-weight:700}.chroma .ow{color:#91d7e3;font-weight:700}.chroma .c{color:#6e738d;font-style:italic}.chroma .ch{color:#5b6078;font-style:italic}.chroma .cm{color:#6e738d;font-style:italic}.chroma .c1{color:#6e738d;font-style:italic}.chroma .cs{color:#6e738d;font-style:italic}.chroma .cp{color:#6e738d;font-style:italic}.chroma .cpf{color:#6e738d;font-weight:700;font-style:italic}.chroma .gd{color:#ed8796;background-color:#363a4f}.chroma .ge{font-style:italic}.chroma .gr{color:#ed8796}.chroma .gh{color:#f5a97f;font-weight:700}.chroma .gi{color:#a6da95;background-color:#363a4f}.chroma .gs{font-weight:700}.chroma .gu{color:#f5a97f;font-weight:700}.chroma .gt{color:#ed8796}.chroma .gl{text-decoration:underline}
@@ -0,0 +1 @@
.bg{color:#c6d0f5;background-color:#303446}.chroma{color:#c6d0f5;background-color:#303446}.chroma .x{}.chroma .err{color:#e78284}.chroma .cl{}.chroma .lnlinks{outline:none;text-decoration:none;color:inherit}.chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}.chroma .lntable{border-spacing:0;padding:0;margin:0;border:0}.chroma .hl{background-color:#51576d}.chroma .lnt{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#838ba7}.chroma .ln{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#838ba7}.chroma .line{display:flex}.chroma .k{color:#ca9ee6}.chroma .kc{color:#ef9f76}.chroma .kd{color:#e78284}.chroma .kn{color:#81c8be}.chroma .kp{color:#ca9ee6}.chroma .kr{color:#ca9ee6}.chroma .kt{color:#e78284}.chroma .n{}.chroma .na{color:#8caaee}.chroma .nc{color:#e5c890}.chroma .no{color:#e5c890}.chroma .nd{color:#8caaee;font-weight:700}.chroma .ni{color:#81c8be}.chroma .ne{color:#ef9f76}.chroma .nl{color:#99d1db}.chroma .nn{color:#ef9f76}.chroma .nx{}.chroma .py{color:#ef9f76}.chroma .nt{color:#ca9ee6}.chroma .nb{color:#99d1db}.chroma .bp{color:#99d1db}.chroma .nv{color:#f2d5cf}.chroma .vc{color:#f2d5cf}.chroma .vg{color:#f2d5cf}.chroma .vi{color:#f2d5cf}.chroma .vm{color:#f2d5cf}.chroma .nf{color:#8caaee}.chroma .fm{color:#8caaee}.chroma .l{}.chroma .ld{}.chroma .s{color:#a6d189}.chroma .sa{color:#e78284}.chroma .sb{color:#a6d189}.chroma .sc{color:#a6d189}.chroma .dl{color:#8caaee}.chroma .sd{color:#737994}.chroma .s2{color:#a6d189}.chroma .se{color:#8caaee}.chroma .sh{color:#737994}.chroma .si{color:#a6d189}.chroma .sx{color:#a6d189}.chroma .sr{color:#81c8be}.chroma .s1{color:#a6d189}.chroma .ss{color:#a6d189}.chroma .m{color:#ef9f76}.chroma .mb{color:#ef9f76}.chroma .mf{color:#ef9f76}.chroma .mh{color:#ef9f76}.chroma .mi{color:#ef9f76}.chroma .il{color:#ef9f76}.chroma .mo{color:#ef9f76}.chroma .o{color:#99d1db;font-weight:700}.chroma .ow{color:#99d1db;font-weight:700}.chroma .p{}.chroma .c{color:#737994;font-style:italic}.chroma .ch{color:#737994;font-style:italic}.chroma .cm{color:#737994;font-style:italic}.chroma .c1{color:#737994;font-style:italic}.chroma .cs{color:#737994;font-style:italic}.chroma .cp{color:#737994;font-style:italic}.chroma .cpf{color:#737994;font-weight:700;font-style:italic}.chroma .g{}.chroma .gd{color:#e78284;background-color:#414559}.chroma .ge{font-style:italic}.chroma .gr{color:#e78284}.chroma .gh{color:#ef9f76;font-weight:700}.chroma .gi{color:#a6d189;background-color:#414559}.chroma .go{}.chroma .gp{}.chroma .gs{font-weight:700}.chroma .gu{color:#ef9f76;font-weight:700}.chroma .gt{color:#e78284}.chroma .gl{text-decoration:underline}.chroma .w{}
@@ -0,0 +1 @@
.bg{color:#c6d0f5;background-color:#303446}.chroma{color:#c6d0f5;background-color:#303446}.chroma .err{color:#e78284}.chroma .lnlinks{outline:none;text-decoration:none;color:inherit}.chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}.chroma .lntable{border-spacing:0;padding:0;margin:0;border:0}.chroma .hl{background-color:#51576d}.chroma .lnt{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#838ba7}.chroma .ln{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#838ba7}.chroma .line{display:flex}.chroma .k{color:#ca9ee6}.chroma .kc{color:#ef9f76}.chroma .kd{color:#e78284}.chroma .kn{color:#81c8be}.chroma .kp{color:#ca9ee6}.chroma .kr{color:#ca9ee6}.chroma .kt{color:#e78284}.chroma .na{color:#8caaee}.chroma .nc{color:#e5c890}.chroma .no{color:#e5c890}.chroma .nd{color:#8caaee;font-weight:700}.chroma .ni{color:#81c8be}.chroma .ne{color:#ef9f76}.chroma .nl{color:#99d1db}.chroma .nn{color:#ef9f76}.chroma .py{color:#ef9f76}.chroma .nt{color:#ca9ee6}.chroma .nb{color:#99d1db}.chroma .bp{color:#99d1db}.chroma .nv{color:#f2d5cf}.chroma .vc{color:#f2d5cf}.chroma .vg{color:#f2d5cf}.chroma .vi{color:#f2d5cf}.chroma .vm{color:#f2d5cf}.chroma .nf{color:#8caaee}.chroma .fm{color:#8caaee}.chroma .s{color:#a6d189}.chroma .sa{color:#e78284}.chroma .sb{color:#a6d189}.chroma .sc{color:#a6d189}.chroma .dl{color:#8caaee}.chroma .sd{color:#737994}.chroma .s2{color:#a6d189}.chroma .se{color:#8caaee}.chroma .sh{color:#737994}.chroma .si{color:#a6d189}.chroma .sx{color:#a6d189}.chroma .sr{color:#81c8be}.chroma .s1{color:#a6d189}.chroma .ss{color:#a6d189}.chroma .m{color:#ef9f76}.chroma .mb{color:#ef9f76}.chroma .mf{color:#ef9f76}.chroma .mh{color:#ef9f76}.chroma .mi{color:#ef9f76}.chroma .il{color:#ef9f76}.chroma .mo{color:#ef9f76}.chroma .o{color:#99d1db;font-weight:700}.chroma .ow{color:#99d1db;font-weight:700}.chroma .c{color:#737994;font-style:italic}.chroma .ch{color:#626880;font-style:italic}.chroma .cm{color:#737994;font-style:italic}.chroma .c1{color:#737994;font-style:italic}.chroma .cs{color:#737994;font-style:italic}.chroma .cp{color:#737994;font-style:italic}.chroma .cpf{color:#737994;font-weight:700;font-style:italic}.chroma .gd{color:#e78284;background-color:#414559}.chroma .ge{font-style:italic}.chroma .gr{color:#e78284}.chroma .gh{color:#ef9f76;font-weight:700}.chroma .gi{color:#a6d189;background-color:#414559}.chroma .gs{font-weight:700}.chroma .gu{color:#ef9f76;font-weight:700}.chroma .gt{color:#e78284}.chroma .gl{text-decoration:underline}
@@ -0,0 +1 @@
.bg{color:#c6d0f5;background-color:#303446}.chroma{color:#c6d0f5;background-color:#303446}.chroma .err{color:#e78284}.chroma .lnlinks{outline:none;text-decoration:none;color:inherit}.chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}.chroma .lntable{border-spacing:0;padding:0;margin:0;border:0}.chroma .hl{background-color:#51576d}.chroma .lnt{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#838ba7}.chroma .ln{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#838ba7}.chroma .line{display:flex}.chroma .k{color:#ca9ee6}.chroma .kc{color:#ef9f76}.chroma .kd{color:#e78284}.chroma .kn{color:#81c8be}.chroma .kp{color:#ca9ee6}.chroma .kr{color:#ca9ee6}.chroma .kt{color:#e78284}.chroma .na{color:#8caaee}.chroma .nc{color:#e5c890}.chroma .no{color:#e5c890}.chroma .nd{color:#8caaee;font-weight:700}.chroma .ni{color:#81c8be}.chroma .ne{color:#ef9f76}.chroma .nl{color:#99d1db}.chroma .nn{color:#ef9f76}.chroma .py{color:#ef9f76}.chroma .nt{color:#ca9ee6}.chroma .nb{color:#99d1db}.chroma .bp{color:#99d1db}.chroma .nv{color:#f2d5cf}.chroma .vc{color:#f2d5cf}.chroma .vg{color:#f2d5cf}.chroma .vi{color:#f2d5cf}.chroma .vm{color:#f2d5cf}.chroma .nf{color:#8caaee}.chroma .fm{color:#8caaee}.chroma .s{color:#a6d189}.chroma .sa{color:#e78284}.chroma .sb{color:#a6d189}.chroma .sc{color:#a6d189}.chroma .dl{color:#8caaee}.chroma .sd{color:#737994}.chroma .s2{color:#a6d189}.chroma .se{color:#8caaee}.chroma .sh{color:#737994}.chroma .si{color:#a6d189}.chroma .sx{color:#a6d189}.chroma .sr{color:#81c8be}.chroma .s1{color:#a6d189}.chroma .ss{color:#a6d189}.chroma .m{color:#ef9f76}.chroma .mb{color:#ef9f76}.chroma .mf{color:#ef9f76}.chroma .mh{color:#ef9f76}.chroma .mi{color:#ef9f76}.chroma .il{color:#ef9f76}.chroma .mo{color:#ef9f76}.chroma .o{color:#99d1db;font-weight:700}.chroma .ow{color:#99d1db;font-weight:700}.chroma .c{color:#737994;font-style:italic}.chroma .ch{color:#737994;font-style:italic}.chroma .cm{color:#737994;font-style:italic}.chroma .c1{color:#737994;font-style:italic}.chroma .cs{color:#737994;font-style:italic}.chroma .cp{color:#737994;font-style:italic}.chroma .cpf{color:#737994;font-weight:700;font-style:italic}.chroma .gd{color:#e78284;background-color:#414559}.chroma .ge{font-style:italic}.chroma .gr{color:#e78284}.chroma .gh{color:#ef9f76;font-weight:700}.chroma .gi{color:#a6d189;background-color:#414559}.chroma .gs{font-weight:700}.chroma .gu{color:#ef9f76;font-weight:700}.chroma .gt{color:#e78284}.chroma .gl{text-decoration:underline}
@@ -0,0 +1,18 @@
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}html{scroll-behavior:smooth;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}:root{--bg-deep:#020617;--accent-primary:#b063e0;--accent-mid-purple:#c485f6;--accent-light-purple:#dbabff;--accent-secondary:#00ffff;--glass-surface:rgba(255, 255, 255, 0.05);--glass-border:rgba(255, 255, 255, 0.1);--glass-block:rgb(255, 255, 255);--bg-primary:var(--bg-deep);--bg-secondary:var(--glass-surface);--bg-tertiary:rgba(255, 255, 255, 0.08);--text-primary:#f1f5f9;--text-secondary:#cbd5e1;--text-muted:#94a3b8;--accent-hover:#c485f6;--border-color:var(--glass-border);--accent-primary-rgba-03:rgba(176, 99, 224, 0.3);--accent-primary-rgba-05:rgba(176, 99, 224, 0.5);--accent-light-purple-rgba-01:rgba(219, 171, 255, 0.1);--accent-light-purple-rgba-03:rgba(219, 171, 255, 0.3);--accent-mid-purple-rgba-05:rgba(196, 133, 246, 0.05);--accent-mid-purple-rgba-01:rgba(196, 133, 246, 0.1);--accent-mid-purple-rgba-02:rgba(196, 133, 246, 0.2);--tag-bg:rgba(0, 0, 0, 0.4);--tag-color:var(--accent-light-purple);--shadow-sm:0 1px 2px 0 rgba(0, 0, 0, 0.3);--shadow-md:0 4px 6px -1px rgba(0, 0, 0, 0.4);--shadow-lg:0 10px 15px -3px rgba(0, 0, 0, 0.5);--yellow-accent:#ffdd00;--yellow-hover:#ffc700;--spacing-xs:0.25rem;--spacing-sm:0.5rem;--spacing-md:1rem;--spacing-lg:1.5rem;--spacing-xl:2rem;--spacing-2xl:3rem;--font-heading:"Space Grotesk", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;--font-body:"Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
"Helvetica Neue", Arial, sans-serif;--font-logo:"Outfit", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;--font-sans:var(--font-body);--font-mono:"JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
"Liberation Mono", "Courier New", monospace;--transition-fast:150ms ease-in-out;--transition-base:300ms ease-in-out;--transition-slow:500ms ease-in-out;--icon-sm:1rem;--icon-md:1.25rem;--icon-lg:1.5rem}[data-theme=light]{--bg-primary:#ffffff;--glass-surface:rgba(
255,
255,
255,
0.2
);--glass-border:rgba(
196,
181,
253,
0.5
);--glass-block:rgba(255, 255, 255, 0.8);--bg-secondary:var(--glass-surface);--bg-tertiary:rgba(
255,
255,
255,
0.25
);--text-primary:#0f172a;--text-secondary:#475569;--text-muted:#64748b;--accent-primary:#6b21a8;--accent-mid-purple:#7c3aed;--accent-light-purple:#9333ea;--accent-secondary:#7e22ce;--accent-hover:#7c3aed;--border-color:var(--glass-border);--accent-primary-rgba-03:rgba(107, 33, 168, 0.3);--accent-primary-rgba-05:rgba(107, 33, 168, 0.5);--accent-light-purple-rgba-01:rgba(147, 51, 234, 0.1);--accent-light-purple-rgba-03:rgba(147, 51, 234, 0.3);--accent-mid-purple-rgba-05:rgba(124, 58, 237, 0.05);--accent-mid-purple-rgba-01:rgba(124, 58, 237, 0.1);--accent-mid-purple-rgba-02:rgba(124, 58, 237, 0.2);--tag-bg:rgba(124, 58, 237, 0.1);--tag-color:#6b21a8;--shadow-sm:0 1px 2px 0 rgba(0, 0, 0, 0.05);--shadow-md:0 4px 6px -1px rgba(0, 0, 0, 0.1);--shadow-lg:0 10px 15px -3px rgba(0, 0, 0, 0.1)}body{font-family:var(--font-body);background-color:var(--bg-deep);color:var(--text-primary);line-height:1.6;min-height:100vh;transition:background-color var(--transition-base),color var(--transition-base);background-image:radial-gradient( circle at center,rgba(30,58,138,.3) 0%,rgba(15,23,42,.5) 40%,var(--bg-deep) 100% );background-attachment:fixed;background-size:100% 100%;background-position:50%;position:relative}[data-theme=light]{--bg-deep:#ffffff}[data-theme=light] body{background-color:#fff;background-image:radial-gradient( circle at center,rgba(196,133,246,.2) 0%,rgba(243,232,255,.4) 40%,#ffffff 100% );background-attachment:fixed;background-size:100% 100%;background-position:50%}body::before{content:"";position:fixed;top:0;left:0;width:100%;height:100%;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 400 400' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)'/%3E%3C/svg%3E");background-size:400px 400px;background-repeat:repeat;opacity:.05;pointer-events:none;z-index:0}body>*{position:relative;z-index:1}
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 307 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

+826 -257
View File
File diff suppressed because it is too large Load Diff
+1
View File
@@ -0,0 +1 @@
[{"content":"How I Solved the Distrobox Confusion in My Terminal Recently, I found myself struggling with something that seemed like a simple problem: when I was working with multiple terminal windows, I could never remember which one was inside a Distrobox and which one was on my local system. If you\u0026amp;rsquo;ve ever juggled between different environments, you know exactly how annoying this can get.\nSo, I decided to create a quick plugin for my favorite terminal prompt, Spaceship, that would clearly indicate …","date":"2026-01-04","permalink":"/posts/spaceship-distrobox/","summary":"How I Solved the Distrobox Confusion in My Terminal Recently, I found myself struggling with something that seemed like a simple problem: when I was working with multiple terminal windows, I could …","tags":null,"title":"Spaceship Distrobox"},{"content":"Understanding the Google Groups Spam Problem Over the past year, I\u0026amp;rsquo;ve noticed a significant increase in spam messages originating from Google Groups. This issue stems from the way Google Groups is designed: It gives spammers an easy way to distribute large volumes of unwanted mail using legitimate Google mail servers, which makes filtering much harder.\nWhy it Happens There are a few fundamental problems with how Google Groups works that make it particularly attractive to spammers:\nNo …","date":"2025-10-10","permalink":"/posts/google-groups-spam/","summary":"Understanding the Google Groups Spam Problem Over the past year, I\u0026rsquo;ve noticed a significant increase in spam messages originating from Google Groups. This issue stems from the way Google Groups …","tags":null,"title":"Google Groups Spam"},{"content":"Recently, I had to deal with a serious problem: backscatter.\nOne of our mail gateways ended up listed on the backscatter.org blacklist for sending bounce messages to forged senders.\nAfter checking the logs, I quickly realized that our system wasn\u0026amp;rsquo;t actually protected against backscatter attacks, so I had to do something about it.\nWhat Even Is Backscatter? Backscatter is unwanted email that your mail server sends after receiving a message, usually in the form of a non-delivery report (NDR) …","date":"2025-08-01","permalink":"/posts/blocking-invalid-rcpt-postfix/","summary":"Recently, I had to deal with a serious problem: backscatter.\nOne of our mail gateways ended up listed on the backscatter.org blacklist for sending bounce messages to forged senders.\nAfter checking the …","tags":null,"title":"Blocking Invalid Recipients Before They Reach Your Exchange Server"},{"content":"Understanding dovecot.index.cache I recently migrated an old mail server system into its new home. After the migration, I checked the logs and noticed some warnings that looked like this:\nMay 17 11:23:13 server1 dovecot: dsync-local(user@domain.tld)\u0026amp;lt;cRjZCwGnKWiIvicA2dm5Tw\u0026amp;gt;: Error: Mailbox INBOX: mmap(size=511310568) failed with file /var/vmail/domain.tld/user/Maildir/dovecot.index.cache: Cannot allocate memory The error indicates that the dovecot.index.cache file is too big to process, and …","date":"2025-05-18","permalink":"/posts/dovecot-index-cache-issues/","summary":"Understanding dovecot.index.cache I recently migrated an old mail server system into its new home. After the migration, I checked the logs and noticed some warnings that looked like this:\nMay 17 …","tags":null,"title":"Dovecot Index Cache Issues"},{"content":"Welcome to My Blog! Im Demian, a Sysadmin, Email Infrastructure enthusiast, and a passionate Open Source contributor. This is where Ill be sharing what I know about system administration, managing email infrastructure, and contributing to open source projects.\nWhat to Expect On this blog, Ill be writing about:\nSysadmin tips and tools: Everything Ive learned managing servers, networks, and infrastructure. Email Infrastructure: Best practices for setting up, securing, and managing email …","date":"2025-05-11","permalink":"/posts/my-first-post/","summary":"Welcome to My Blog! Im Demian, a Sysadmin, Email Infrastructure enthusiast, and a passionate Open Source contributor. This is where Ill be sharing what I know about system administration, managing …","tags":null,"title":"Introduction"}]
+35 -16
View File
@@ -1,35 +1,54 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>PyteDev Blog</title>
<title>Demian&#39;s Blog</title>
<link>https://pyte.dev/</link>
<description>Recent content on PyteDev Blog</description>
<generator>Hugo -- 0.147.2</generator>
<description>Recent content on Demian&#39;s Blog</description>
<generator>Hugo</generator>
<language>en-us</language>
<lastBuildDate>Sun, 11 May 2025 20:13:49 +0200</lastBuildDate>
<lastBuildDate>Sun, 04 Jan 2026 20:33:45 +0100</lastBuildDate>
<atom:link href="https://pyte.dev/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Spaceship Distrobox</title>
<link>https://pyte.dev/posts/spaceship-distrobox/</link>
<pubDate>Sun, 04 Jan 2026 20:33:45 +0100</pubDate>
<guid>https://pyte.dev/posts/spaceship-distrobox/</guid>
<description>&lt;h1 id=&#34;how-i-solved-the-distrobox-confusion-in-my-terminal&#34;&gt;How I Solved the Distrobox Confusion in My Terminal&lt;/h1&gt;&#xA;&lt;p&gt;Recently, I found myself struggling with something that seemed like a simple problem: when I was working with multiple terminal windows, I could never remember which one was inside a Distrobox and which one was on my local system. If you&amp;rsquo;ve ever juggled between different environments, you know exactly how annoying this can get.&lt;/p&gt;&#xA;&lt;p&gt;So, I decided to create a quick plugin for my favorite terminal prompt, &lt;strong&gt;Spaceship&lt;/strong&gt;, that would clearly indicate when I&amp;rsquo;m inside a Distrobox container. The result is a simple, customizable section that appears right in your prompt, showing the name of the active container. This way, I never have to guess or dig deeper to figure out where I&amp;rsquo;m working.&lt;/p&gt;</description>
</item>
<item>
<title>Google Groups Spam</title>
<link>https://pyte.dev/posts/google-groups-spam/</link>
<pubDate>Fri, 10 Oct 2025 09:26:56 +0200</pubDate>
<guid>https://pyte.dev/posts/google-groups-spam/</guid>
<description>&lt;h1 id=&#34;understanding-the-google-groups-spam-problem&#34;&gt;Understanding the Google Groups Spam Problem&lt;/h1&gt;&#xA;&lt;p&gt;Over the past year, I&amp;rsquo;ve noticed a significant increase in spam messages originating from Google Groups. This issue stems from the way Google Groups is designed: It gives spammers an easy way to distribute large volumes of unwanted mail using legitimate Google mail servers, which makes filtering much harder.&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-it-happens&#34;&gt;Why it Happens&lt;/h2&gt;&#xA;&lt;p&gt;There are a few fundamental problems with how Google Groups works that make it particularly attractive to spammers:&lt;/p&gt;</description>
</item>
<item>
<title>Blocking Invalid Recipients Before They Reach Your Exchange Server</title>
<link>https://pyte.dev/posts/blocking-invalid-rcpt-postfix/</link>
<pubDate>Fri, 01 Aug 2025 10:03:15 +0200</pubDate>
<guid>https://pyte.dev/posts/blocking-invalid-rcpt-postfix/</guid>
<description>&lt;p&gt;Recently, I had to deal with a serious problem: &lt;strong&gt;backscatter&lt;/strong&gt;.&lt;br&gt;&#xA;One of our mail gateways ended up listed on the &lt;strong&gt;backscatter.org&lt;/strong&gt; blacklist for sending bounce messages to forged senders.&lt;/p&gt;&#xA;&lt;p&gt;After checking the logs, I quickly realized that our system wasn&amp;rsquo;t actually protected against backscatter attacks, so I had to do something about it.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-even-is-backscatter&#34;&gt;What Even Is Backscatter?&lt;/h2&gt;&#xA;&lt;p&gt;Backscatter is unwanted email that your mail server sends &lt;strong&gt;after&lt;/strong&gt; receiving a message, usually in the form of a &lt;strong&gt;non-delivery report (NDR)&lt;/strong&gt; or &lt;strong&gt;bounce&lt;/strong&gt; to a &lt;strong&gt;forged sender address&lt;/strong&gt;.&lt;/p&gt;</description>
</item>
<item>
<title>Dovecot Index Cache Issues</title>
<link>https://pyte.dev/posts/dovecot-index-cache-issues/</link>
<pubDate>Sun, 18 May 2025 11:34:09 +0200</pubDate>
<guid>https://pyte.dev/posts/dovecot-index-cache-issues/</guid>
<description>&lt;h1 id=&#34;understanding-dovecotindexcache&#34;&gt;Understanding &lt;code&gt;dovecot.index.cache&lt;/code&gt;&lt;/h1&gt;&#xA;&lt;p&gt;I recently migrated an old mail server system into its new home. After the migration, I checked the logs and noticed some warnings that looked like this:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;May 17 11:23:13 server1 dovecot: dsync-local(user@domain.tld)&amp;lt;cRjZCwGnKWiIvicA2dm5Tw&amp;gt;: Error: Mailbox INBOX: mmap(size=511310568) failed with file /var/vmail/domain.tld/user/Maildir/dovecot.index.cache: Cannot allocate memory&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The error indicates that the &lt;code&gt;dovecot.index.cache&lt;/code&gt; file is too big to process, and Dovecot cannot allocate enough memory to handle it.&lt;/p&gt;&#xA;&lt;h1 id=&#34;what-are-dovecotindexcache-files&#34;&gt;What Are &lt;code&gt;dovecot.index.cache&lt;/code&gt; Files?&lt;/h1&gt;&#xA;&lt;p&gt;Dovecot, the most popular IMAP server, uses a set of index files (&lt;code&gt;dovecot.index&lt;/code&gt;, &lt;code&gt;dovecot.index.cache&lt;/code&gt;, &lt;code&gt;dovecot.index.log&lt;/code&gt;, etc.) to speed up mailbox access. The file I had to deal with stores cached message metadata (headers, flags, and preview text) so Dovecot does not have to read each message file in the mailbox every time.&lt;/p&gt;</description>
</item>
<item>
<title>Introduction</title>
<link>https://pyte.dev/posts/my-first-post/</link>
<pubDate>Sun, 11 May 2025 20:13:49 +0200</pubDate>
<guid>https://pyte.dev/posts/my-first-post/</guid>
<description>&lt;h1 id=&#34;welcome-to-my-blog&#34;&gt;Welcome to My Blog!&lt;/h1&gt;
&lt;p&gt;Im &lt;strong&gt;Demian&lt;/strong&gt;, a &lt;strong&gt;Sysadmin&lt;/strong&gt;, &lt;strong&gt;Email Infrastructure enthusiast&lt;/strong&gt;, and a passionate &lt;strong&gt;Open Source contributor&lt;/strong&gt;. This is where Ill be sharing what I know about system administration, managing email infrastructure, and contributing to open source projects.&lt;/p&gt;
&lt;h2 id=&#34;what-to-expect&#34;&gt;What to Expect&lt;/h2&gt;
&lt;p&gt;On this blog, Ill be writing about:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sysadmin tips and tools&lt;/strong&gt;: Everything Ive learned managing servers, networks, and infrastructure.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Email Infrastructure&lt;/strong&gt;: Best practices for setting up, securing, and managing email systems.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Open Source&lt;/strong&gt;: How I contribute to open source projects, and tips for getting started if you want to do the same.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This blog is a space to share knowledge, troubleshoot common issues, and explore new tools and techniques. Whether youre just getting into system administration, looking for email setup guides, or interested in contributing to open source, youll find something useful here.&lt;/p&gt;</description>
<description>&lt;h1 id=&#34;welcome-to-my-blog&#34;&gt;Welcome to My Blog!&lt;/h1&gt;&#xA;&lt;p&gt;Im &lt;strong&gt;Demian&lt;/strong&gt;, a &lt;strong&gt;Sysadmin&lt;/strong&gt;, &lt;strong&gt;Email Infrastructure enthusiast&lt;/strong&gt;, and a passionate &lt;strong&gt;Open Source contributor&lt;/strong&gt;. This is where Ill be sharing what I know about system administration, managing email infrastructure, and contributing to open source projects.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-to-expect&#34;&gt;What to Expect&lt;/h2&gt;&#xA;&lt;p&gt;On this blog, Ill be writing about:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Sysadmin tips and tools&lt;/strong&gt;: Everything Ive learned managing servers, networks, and infrastructure.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Email Infrastructure&lt;/strong&gt;: Best practices for setting up, securing, and managing email systems.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Open Source&lt;/strong&gt;: How I contribute to open source projects, and tips for getting started if you want to do the same.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;This blog is a space to share knowledge, troubleshoot common issues, and explore new tools and techniques. Whether youre just getting into system administration, looking for email setup guides, or interested in contributing to open source, youll find something useful here.&lt;/p&gt;</description>
</item>
<item>
<title>Search</title>
<link>https://pyte.dev/search/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://pyte.dev/search/</guid>
<description>Search for a specific post or topic</description>
<description>&lt;link href=&#34;https://pyte.dev/pagefind/pagefind-ui.css&#34; rel=&#34;stylesheet&#34;&gt;&#xA;&lt;script src=&#34;https://pyte.dev/pagefind/pagefind-ui.js&#34;&gt;&lt;/script&gt;&#xA;&lt;div id=&#34;search&#34;&gt;&lt;/div&gt;&#xA;&lt;script&gt;&#xA;&#x9;window.addEventListener(&#39;DOMContentLoaded&#39;, (event) =&gt; {&#xA;&#x9; new PagefindUI({ element: &#34;#search&#34;, showSubResults: true });&#xA;&#x9;});&#xA;&lt;/script&gt;</description>
</item>
</channel>
</rss>
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More