feat(art): replace all 72 posts' artwork with the v2 pipeline
Deploy / build (push) Successful in 17s
Deploy / build (push) Successful in 17s
Every post now carries one unique local-ComfyUI/Ideogram 4 base frame, composited into EN + ZH share cards, a banner and list thumbs. - the shipped prompts_catalog held only 21 distinct metaphors for 72 posts (16 shared one visual), so all 72 were rewritten as unique object+state metaphors and 10 frames re-rolled after OCR found pseudo-text rendered at legible size - render_from_art.mjs emits JPEG by default (558 KB PNG -> 84 KB mozjpeg q85); the ZH 1200x630 card did not exist before this batch - 288 frontmatter fields migrated; the 144 v1 PNGs are gone - PostList's thumb helper keys off the base slug (a ZH card is zh-<slug>.jpg while the thumb is <slug>-800.webp, which 404'd the whole ZH listing) - [...slug].astro's <picture> regex accepts .jpg - the repo now carries the art inputs (metaphors.json, captions/<slug>.json, refreshed prompts_catalog.json) so a frame is reproducible from git alone
This commit is contained in:
1 parent
72a9a2af6f
commit
327d516ed9
802 files changed
+1289
-519
No files matched your search
@@ -38,8 +38,12 @@ const hasThumb = (post: CollectionEntry<'posts'>) => {
|
||||
const p = og(post);
|
||||
return p.startsWith('/og/') && p !== '/og-default.png' && p !== '/og-default.jpg';
|
||||
};
|
||||
const thumb = (post: CollectionEntry<'posts'>, w: 400 | 800) =>
|
||||
og(post).replace('/og/', '/og/thumb/').replace(/\.png$/, `-${w}.webp`);
|
||||
const thumb = (post: CollectionEntry<'posts'>, w: 400 | 800) => {
|
||||
// Thumbs are keyed by the base slug, not by the og file: a ZH post's ogImage is
|
||||
// /og/zh-<slug>.jpg while the renderer only emits /og/thumb/<slug>-<w>.webp.
|
||||
const base = post.slug.replace(/^zh\//, '');
|
||||
return `/og/thumb/${base}-${w}.webp`;
|
||||
};
|
||||
---
|
||||
|
||||
<ul class="post-list">
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2025-05-06
|
||||
updatedDate: 2026-10-16
|
||||
category: notes
|
||||
tags: ["email", "dns", "mailcow", "smtp", "deliverability"]
|
||||
ogImage: /og/adding-a-domain-to-someone-elses-mail-server.png
|
||||
banner: /banners/adding-a-domain-to-someone-elses-mail-server.png
|
||||
ogImage: /og/adding-a-domain-to-someone-elses-mail-server.jpg
|
||||
banner: /banners/adding-a-domain-to-someone-elses-mail-server.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2025-06-11
|
||||
updatedDate: 2026-09-29
|
||||
category: engineering
|
||||
tags: ["i18n", "nginx", "vue", "javascript", "self-hosting"]
|
||||
ogImage: "/og/adding-english-mode-to-a-chinese-only-web-app.png"
|
||||
banner: "/banners/adding-english-mode-to-a-chinese-only-web-app.png"
|
||||
ogImage: "/og/adding-english-mode-to-a-chinese-only-web-app.jpg"
|
||||
banner: "/banners/adding-english-mode-to-a-chinese-only-web-app.jpg"
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "Compositing furniture photos into styled room scenes with fal.ai F
|
||||
pubDate: 2026-09-11
|
||||
category: case-studies
|
||||
tags: [fal-ai, flux, ai-image, javascript, canvas, ecommerce]
|
||||
ogImage: /og/ai-furniture-compositing-with-flux-kontext.png
|
||||
banner: /banners/ai-furniture-compositing-with-flux-kontext.png
|
||||
ogImage: /og/ai-furniture-compositing-with-flux-kontext.jpg
|
||||
banner: /banners/ai-furniture-compositing-with-flux-kontext.jpg
|
||||
---
|
||||
|
||||
A furniture client came to me with a problem that every small e-commerce seller
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2026-09-20
|
||||
updatedDate: 2026-10-16
|
||||
category: devops
|
||||
tags: ["authentik", "css", "self-hosting", "debugging", "browser"]
|
||||
ogImage: /og/authentik-css-greater-than-bug.png
|
||||
banner: /banners/authentik-css-greater-than-bug.png
|
||||
ogImage: /og/authentik-css-greater-than-bug.jpg
|
||||
banner: /banners/authentik-css-greater-than-bug.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2026-08-12
|
||||
updatedDate: 2026-09-29
|
||||
category: devops
|
||||
tags: ["authentik", "forward-auth", "cloudflare", "nginx", "docker", "self-hosting"]
|
||||
ogImage: /og/authentik-forward-auth-gate-wasnt-live.png
|
||||
banner: /banners/authentik-forward-auth-gate-wasnt-live.png
|
||||
ogImage: /og/authentik-forward-auth-gate-wasnt-live.jpg
|
||||
banner: /banners/authentik-forward-auth-gate-wasnt-live.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "A year's worth of authentik major-version upgrade pain: storage mo
|
||||
pubDate: 2026-09-09
|
||||
category: devops
|
||||
tags: [authentik, sso, docker, portainer, self-hosting, oidc, upgrade]
|
||||
ogImage: /og/authentik-major-upgrade-gotchas.png
|
||||
banner: /banners/authentik-major-upgrade-gotchas.png
|
||||
ogImage: /og/authentik-major-upgrade-gotchas.jpg
|
||||
banner: /banners/authentik-major-upgrade-gotchas.jpg
|
||||
---
|
||||
|
||||
I run authentik as the single sign-on gate in front of my self-hosted stack —
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "CyberPanel v2 killed the documented JSON API and left only the Ang
|
||||
pubDate: 2026-09-09
|
||||
category: devops
|
||||
tags: [cyberpanel, api, reverse-engineering, automation, django, self-hosting, curl]
|
||||
ogImage: /og/automating-cyberpanel-without-the-ui.png
|
||||
banner: /banners/automating-cyberpanel-without-the-ui.png
|
||||
ogImage: /og/automating-cyberpanel-without-the-ui.jpg
|
||||
banner: /banners/automating-cyberpanel-without-the-ui.jpg
|
||||
---
|
||||
|
||||
I run CyberPanel 2.4.4.1 inside an Ubuntu VM on my home lab to host a handful
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "Compare the best AI video generators in 2026 — free vs paid plan
|
||||
pubDate: 2026-09-11
|
||||
category: ai
|
||||
tags: [ai-video, video-generation, ltx, open-weights, pricing, veo]
|
||||
ogImage: /og/best-ai-video-generators-2026.png
|
||||
banner: /banners/best-ai-video-generators-2026.png
|
||||
ogImage: /og/best-ai-video-generators-2026.jpg
|
||||
banner: /banners/best-ai-video-generators-2026.jpg
|
||||
---
|
||||
|
||||
Which AI video generator should you actually use in 2026 — and how much of it can you really get for free?
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2026-10-14
|
||||
updatedDate: 2026-10-16
|
||||
category: tutorials
|
||||
tags: ["ffmpeg", "hevc", "qsv", "transcoding", "video"]
|
||||
ogImage: /og/calibrating-intel-quick-sync-hevc-quality.png
|
||||
banner: /banners/calibrating-intel-quick-sync-hevc-quality.png
|
||||
ogImage: /og/calibrating-intel-quick-sync-hevc-quality.jpg
|
||||
banner: /banners/calibrating-intel-quick-sync-hevc-quality.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2024-12-10
|
||||
updatedDate: 2026-09-29
|
||||
category: web3
|
||||
tags: [solidity, chainlink, vrf, foundry, hardhat, blockchain]
|
||||
ogImage: /og/chainlink-vrf-v2-lottery-contract.png
|
||||
banner: /banners/chainlink-vrf-v2-lottery-contract.png
|
||||
ogImage: /og/chainlink-vrf-v2-lottery-contract.jpg
|
||||
banner: /banners/chainlink-vrf-v2-lottery-contract.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "A container on my NAS kept stopping unexpectedly while Docker repo
|
||||
pubDate: 2026-10-16
|
||||
category: devops
|
||||
tags: ["docker", "oom", "traefik", "synology", "crawlers"]
|
||||
ogImage: /og/docker-reported-exit-0-the-oom-killer-disagreed.png
|
||||
banner: /banners/docker-reported-exit-0-the-oom-killer-disagreed.png
|
||||
ogImage: /og/docker-reported-exit-0-the-oom-killer-disagreed.jpg
|
||||
banner: /banners/docker-reported-exit-0-the-oom-killer-disagreed.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "A measured comparison of HEVC encoders on real files: NVENC at cq2
|
||||
pubDate: 2026-10-08
|
||||
category: tutorials
|
||||
tags: [ffmpeg, hevc, x265, nvenc, video]
|
||||
ogImage: /og/does-hevc-actually-shrink-your-files.png
|
||||
banner: /banners/does-hevc-actually-shrink-your-files.png
|
||||
ogImage: /og/does-hevc-actually-shrink-your-files.jpg
|
||||
banner: /banners/does-hevc-actually-shrink-your-files.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2025-01-22
|
||||
updatedDate: 2026-10-16
|
||||
category: engineering
|
||||
tags: ["pdf", "fonts", "mpdf", "typography", "php"]
|
||||
ogImage: /og/embedding-fonts-so-a-pdf-looks-the-same-everywhere.png
|
||||
banner: /banners/embedding-fonts-so-a-pdf-looks-the-same-everywhere.png
|
||||
ogImage: /og/embedding-fonts-so-a-pdf-looks-the-same-everywhere.jpg
|
||||
banner: /banners/embedding-fonts-so-a-pdf-looks-the-same-everywhere.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "Same HEVC file, same stutter in VLC, Chrome and an iPad — offlin
|
||||
pubDate: 2026-10-08
|
||||
category: devops
|
||||
tags: [ffmpeg, nvdec, hevc, transcoding, video]
|
||||
ogImage: /og/every-player-stuttered-the-file-was-fine.png
|
||||
banner: /banners/every-player-stuttered-the-file-was-fine.png
|
||||
ogImage: /og/every-player-stuttered-the-file-was-fine.jpg
|
||||
banner: /banners/every-player-stuttered-the-file-was-fine.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "The five-step AI roadmap circulates on every feed. Here is the hon
|
||||
pubDate: 2026-10-13
|
||||
category: ai
|
||||
tags: ["llm", "rag", "agents", "self-hosting", "whisper", "mem0"]
|
||||
ogImage: /og/five-step-ai-roadmap-what-i-actually-run.png
|
||||
banner: /banners/five-step-ai-roadmap-what-i-actually-run.png
|
||||
ogImage: /og/five-step-ai-roadmap-what-i-actually-run.jpg
|
||||
banner: /banners/five-step-ai-roadmap-what-i-actually-run.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2024-10-08
|
||||
updatedDate: 2026-09-29
|
||||
category: web3
|
||||
tags: [solidity, foundry, erc721, nft, svg, base64, onchain]
|
||||
ogImage: /og/fully-on-chain-svg-nfts.png
|
||||
banner: /banners/fully-on-chain-svg-nfts.png
|
||||
ogImage: /og/fully-on-chain-svg-nfts.jpg
|
||||
banner: /banners/fully-on-chain-svg-nfts.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2025-12-10
|
||||
updatedDate: 2026-09-09
|
||||
category: devops
|
||||
tags: [tor, docker, security, self-hosting, networking]
|
||||
ogImage: /og/hardening-a-tor-onion-service.png
|
||||
banner: /banners/hardening-a-tor-onion-service.png
|
||||
ogImage: /og/hardening-a-tor-onion-service.jpg
|
||||
banner: /banners/hardening-a-tor-onion-service.jpg
|
||||
---
|
||||
|
||||
I got curious about the darknet. Not the marketplaces, the boring half of it: people self-hosting things the way the internet worked before registrars and cloud dashboards, running software they control at an address they own.
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2024-09-24
|
||||
updatedDate: 2026-09-05
|
||||
category: notes
|
||||
tags: [intro]
|
||||
ogImage: /og/hello-world.png
|
||||
banner: /banners/hello-world.png
|
||||
ogImage: /og/hello-world.jpg
|
||||
banner: /banners/hello-world.jpg
|
||||
---
|
||||
|
||||
Welcome. This is where I write about what I build and learn — mostly
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "A customer-support AI bot that answers questions and provisions fr
|
||||
pubDate: 2026-09-06
|
||||
category: case-studies
|
||||
tags: [telegram, docker, cloudflare, litellm, typescript, ai]
|
||||
ogImage: /og/how-i-built-the-digikedai-telegram-bot.png
|
||||
banner: /banners/how-i-built-the-digikedai-telegram-bot.png
|
||||
ogImage: /og/how-i-built-the-digikedai-telegram-bot.jpg
|
||||
banner: /banners/how-i-built-the-digikedai-telegram-bot.jpg
|
||||
---
|
||||
|
||||
Digi Kedai sells digital products — online courses, ebooks, and templates — and
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "A walkthrough of the end-to-end pipeline that builds and serves th
|
||||
pubDate: 2026-09-04
|
||||
category: case-studies
|
||||
tags: [astro, gitea, ci-cd, self-hosting, docker, cloudflare]
|
||||
ogImage: /og/how-i-host-this-blog.png
|
||||
banner: /banners/how-i-host-this-blog.png
|
||||
ogImage: /og/how-i-host-this-blog.jpg
|
||||
banner: /banners/how-i-host-this-blog.jpg
|
||||
---
|
||||
|
||||
This blog is itself a project I built to demonstrate the kind of work I do.
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "I wrote the lyrics, tuned the prompts, and shipped seven songs wit
|
||||
pubDate: 2026-09-11
|
||||
category: case-studies
|
||||
tags: [suno, ai-music, music, lyrics, prompting, ai]
|
||||
ogImage: /og/how-i-made-my-own-songs-with-suno-ai.png
|
||||
banner: /banners/how-i-made-my-own-songs-with-suno-ai.png
|
||||
ogImage: /og/how-i-made-my-own-songs-with-suno-ai.jpg
|
||||
banner: /banners/how-i-made-my-own-songs-with-suno-ai.jpg
|
||||
---
|
||||
|
||||
I make my own songs. Not by playing an instrument — by writing lyrics,
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2025-11-12
|
||||
updatedDate: 2026-09-09
|
||||
category: case-studies
|
||||
tags: [ai-orchestration, subagents, due-diligence, hosting, devops]
|
||||
ogImage: /og/how-i-vetted-20-vps-providers-with-parallel-subagents.png
|
||||
banner: /banners/how-i-vetted-20-vps-providers-with-parallel-subagents.png
|
||||
ogImage: /og/how-i-vetted-20-vps-providers-with-parallel-subagents.jpg
|
||||
banner: /banners/how-i-vetted-20-vps-providers-with-parallel-subagents.jpg
|
||||
---
|
||||
|
||||
## Why it matters
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2025-11-26
|
||||
updatedDate: 2026-09-09
|
||||
category: tutorials
|
||||
tags: [hosting, vps, due-diligence, whois, devops]
|
||||
ogImage: /og/how-to-verify-a-hosting-provider-before-you-buy.png
|
||||
banner: /banners/how-to-verify-a-hosting-provider-before-you-buy.png
|
||||
ogImage: /og/how-to-verify-a-hosting-provider-before-you-buy.jpg
|
||||
banner: /banners/how-to-verify-a-hosting-provider-before-you-buy.jpg
|
||||
---
|
||||
|
||||
Every hosting provider's homepage is a list of promises: *"in business since 2005"*,
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2025-07-08
|
||||
updatedDate: 2026-09-29
|
||||
category: ai
|
||||
tags: [ai-agent, shopee, automation, human-in-the-loop, ecommerce, cron]
|
||||
ogImage: /og/i-let-an-agent-manage-my-shopee-vouchers.png
|
||||
banner: /banners/i-let-an-agent-manage-my-shopee-vouchers.png
|
||||
ogImage: /og/i-let-an-agent-manage-my-shopee-vouchers.jpg
|
||||
banner: /banners/i-let-an-agent-manage-my-shopee-vouchers.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "Three ways a network-mounted drive lied to my conversion pipeline:
|
||||
pubDate: 2026-10-08
|
||||
category: devops
|
||||
tags: [storage, smb, verification, ffmpeg, python]
|
||||
ogImage: /og/it-reported-success-nothing-had-changed.png
|
||||
banner: /banners/it-reported-success-nothing-had-changed.png
|
||||
ogImage: /og/it-reported-success-nothing-had-changed.jpg
|
||||
banner: /banners/it-reported-success-nothing-had-changed.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "How a JPA @Version field turns a silent lost update into a 409 con
|
||||
pubDate: 2026-08-19
|
||||
category: engineering
|
||||
tags: [java, spring, jpa, hibernate, rest, testing]
|
||||
ogImage: /og/jpa-version-field-lost-update.png
|
||||
banner: /banners/jpa-version-field-lost-update.png
|
||||
ogImage: /og/jpa-version-field-lost-update.jpg
|
||||
banner: /banners/jpa-version-field-lost-update.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "Loop engineering is 2026's term for designing the system that prom
|
||||
pubDate: 2026-10-01
|
||||
category: case-studies
|
||||
tags: ["loop-engineering", "ai-agents", "cron", "self-hosting", "automation", "monitoring"]
|
||||
ogImage: "/og/loop-engineering-without-a-coding-agent.png"
|
||||
banner: "/banners/loop-engineering-without-a-coding-agent.png"
|
||||
ogImage: "/og/loop-engineering-without-a-coding-agent.jpg"
|
||||
banner: "/banners/loop-engineering-without-a-coding-agent.jpg"
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "I moved a 17,000-line CodeIgniter 4 app from Windows IIS to OpenLi
|
||||
pubDate: 2026-09-27
|
||||
category: engineering
|
||||
tags: [codeigniter, php, openspeedway, cyberpanel, iis, migration, litespeed, linux]
|
||||
ogImage: /og/migrating-codeigniter-iis-to-openlitespeed.png
|
||||
banner: /banners/migrating-codeigniter-iis-to-openlitespeed.png
|
||||
ogImage: /og/migrating-codeigniter-iis-to-openlitespeed.jpg
|
||||
banner: /banners/migrating-codeigniter-iis-to-openlitespeed.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2026-10-15
|
||||
updatedDate: 2026-10-16
|
||||
category: notes
|
||||
tags: ["rclone", "backup", "google-drive", "oauth", "restic"]
|
||||
ogImage: /og/my-backup-was-using-someone-elses-api-quota.png
|
||||
banner: /banners/my-backup-was-using-someone-elses-api-quota.png
|
||||
ogImage: /og/my-backup-was-using-someone-elses-api-quota.jpg
|
||||
banner: /banners/my-backup-was-using-someone-elses-api-quota.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "My self-hosted n8n 1.x to 2.40.1 upgrade surfaced seven silent bre
|
||||
pubDate: 2026-09-18
|
||||
category: devops
|
||||
tags: [n8n, docker, upgrade, self-hosting, debugging, automation]
|
||||
ogImage: /og/n8n-v1-to-v2-upgrade-gotchas.png
|
||||
banner: /banners/n8n-v1-to-v2-upgrade-gotchas.png
|
||||
ogImage: /og/n8n-v1-to-v2-upgrade-gotchas.jpg
|
||||
banner: /banners/n8n-v1-to-v2-upgrade-gotchas.jpg
|
||||
---
|
||||
|
||||
I run n8n as the automation backbone for my self-hosted stack — it handles
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "NocoDB's OIDC environment variables are real and validated at star
|
||||
pubDate: 2026-09-29
|
||||
category: notes
|
||||
tags: ["nocodb", "sso", "oidc", "self-hosting", "licensing", "docker"]
|
||||
ogImage: /og/nocodb-sso-is-a-licensed-feature.png
|
||||
banner: /banners/nocodb-sso-is-a-licensed-feature.png
|
||||
ogImage: /og/nocodb-sso-is-a-licensed-feature.jpg
|
||||
banner: /banners/nocodb-sso-is-a-licensed-feature.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "A web-analytics tracker has to be public and its dashboard must no
|
||||
pubDate: 2026-09-30
|
||||
category: devops
|
||||
tags: ["umami", "authentik", "sso", "nginx", "docker", "privacy"]
|
||||
ogImage: "/og/one-hostname-public-tracker-sso-dashboard.png"
|
||||
banner: "/banners/one-hostname-public-tracker-sso-dashboard.png"
|
||||
ogImage: "/og/one-hostname-public-tracker-sso-dashboard.jpg"
|
||||
banner: "/banners/one-hostname-public-tracker-sso-dashboard.jpg"
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2026-07-29
|
||||
updatedDate: 2026-09-29
|
||||
category: case-studies
|
||||
tags: [prometheus, grafana, unraid, synology, dsm, cadvisor, monitoring, homelab]
|
||||
ogImage: /og/one-prometheus-for-unraid-synology-and-a-vps.png
|
||||
banner: /banners/one-prometheus-for-unraid-synology-and-a-vps.png
|
||||
ogImage: /og/one-prometheus-for-unraid-synology-and-a-vps.jpg
|
||||
banner: /banners/one-prometheus-for-unraid-synology-and-a-vps.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2026-01-07
|
||||
updatedDate: 2026-09-13
|
||||
category: devops
|
||||
tags: [passbolt, docker, gpg, smtp, reverse-proxy, portainer]
|
||||
ogImage: /og/passbolt-hang-three-failure-modes.png
|
||||
banner: /banners/passbolt-hang-three-failure-modes.png
|
||||
ogImage: /og/passbolt-hang-three-failure-modes.jpg
|
||||
banner: /banners/passbolt-hang-three-failure-modes.jpg
|
||||
---
|
||||
|
||||
I run Passbolt — an open-source password manager for teams — on a Synology
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "MySQL Workbench 26.7.0 connects to MySQL 8.4 but fails on MariaDB
|
||||
pubDate: 2026-09-19
|
||||
category: devops
|
||||
tags: [mysql, mariadb, workbench, debugging, electron, mysql-sh, cyberpanel, self-hosting]
|
||||
ogImage: /og/patching-workbench-26-for-mariadb.png
|
||||
banner: /banners/patching-workbench-26-for-mariadb.png
|
||||
ogImage: /og/patching-workbench-26-for-mariadb.jpg
|
||||
banner: /banners/patching-workbench-26-for-mariadb.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2025-06-24
|
||||
updatedDate: 2026-10-06
|
||||
category: devops
|
||||
tags: ["nginx", "docker", "self-hosting", "seo", "branding"]
|
||||
ogImage: "/og/putting-a-front-door-on-an-app-you-cant-modify.png"
|
||||
banner: "/banners/putting-a-front-door-on-an-app-you-cant-modify.png"
|
||||
ogImage: "/og/putting-a-front-door-on-an-app-you-cant-modify.jpg"
|
||||
banner: "/banners/putting-a-front-door-on-an-app-you-cant-modify.jpg"
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "Point NocoDB at a MySQL/MariaDB database on another machine withou
|
||||
pubDate: 2026-09-29
|
||||
category: devops
|
||||
tags: ["nocodb", "mysql", "mariadb", "docker", "networking", "dashboard"]
|
||||
ogImage: /og/read-only-nocodb-dashboard-for-a-remote-database.png
|
||||
banner: /banners/read-only-nocodb-dashboard-for-a-remote-database.png
|
||||
ogImage: /og/read-only-nocodb-dashboard-for-a-remote-database.jpg
|
||||
banner: /banners/read-only-nocodb-dashboard-for-a-remote-database.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2025-10-01
|
||||
updatedDate: 2026-09-26
|
||||
category: notes
|
||||
tags: [docker, openapi, api, documentation, debugging, reverse-engineering]
|
||||
ogImage: /og/reading-a-containers-own-api-docs.png
|
||||
banner: /banners/reading-a-containers-own-api-docs.png
|
||||
ogImage: /og/reading-a-containers-own-api-docs.jpg
|
||||
banner: /banners/reading-a-containers-own-api-docs.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "I migrated from paid RDPGuard 7.8.7 to open-source IPBan 4.1.0 —
|
||||
pubDate: 2026-09-19
|
||||
category: devops
|
||||
tags: [windows, security, rdp, ipban, rdpguard, brute-force, firewall, self-hosting]
|
||||
ogImage: /og/replacing-rdpguard-with-ipban.png
|
||||
banner: /banners/replacing-rdpguard-with-ipban.png
|
||||
ogImage: /og/replacing-rdpguard-with-ipban.jpg
|
||||
banner: /banners/replacing-rdpguard-with-ipban.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "One operator, three hosts, 162 containers in 78 compose stacks —
|
||||
pubDate: 2026-10-06
|
||||
category: case-studies
|
||||
tags: [docker, traefik, monitoring, infrastructure, devops]
|
||||
ogImage: /og/running-production-infrastructure-solo.png
|
||||
banner: /banners/running-production-infrastructure-solo.png
|
||||
ogImage: /og/running-production-infrastructure-solo.jpg
|
||||
banner: /banners/running-production-infrastructure-solo.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "A reading app needed TTS. Cloud free tiers expire tokens in 10 min
|
||||
pubDate: 2026-09-18
|
||||
category: ai
|
||||
tags: [n8n, tts, azure, google-cloud, docker, automation, sidecar]
|
||||
ogImage: /og/running-tts-as-a-service-with-token-sidecars.png
|
||||
banner: /banners/running-tts-as-a-service-with-token-sidecars.png
|
||||
ogImage: /og/running-tts-as-a-service-with-token-sidecars.jpg
|
||||
banner: /banners/running-tts-as-a-service-with-token-sidecars.jpg
|
||||
---
|
||||
|
||||
I run a self-hosted reading server for ebooks. It has a "read aloud" feature,
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "Scraping bot-walled marketplace listings for a client's used-elect
|
||||
pubDate: 2026-09-13
|
||||
category: engineering
|
||||
tags: ["scraping", "cdp", "headless-chrome", "anti-bot", "shopee", "python"]
|
||||
ogImage: "/og/scraping-bot-walled-marketplace-warm-browser-session.png"
|
||||
banner: "/banners/scraping-bot-walled-marketplace-warm-browser-session.png"
|
||||
ogImage: "/og/scraping-bot-walled-marketplace-warm-browser-session.jpg"
|
||||
banner: "/banners/scraping-bot-walled-marketplace-warm-browser-session.jpg"
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "How I built a five-workflow entitlement system that grants, expire
|
||||
pubDate: 2026-09-18
|
||||
category: case-studies
|
||||
tags: [n8n, nocodb, alist, access-control, docker, automation, digital-goods]
|
||||
ogImage: /og/self-healing-digital-goods-entitlements.png
|
||||
banner: /banners/self-healing-digital-goods-entitlements.png
|
||||
ogImage: /og/self-healing-digital-goods-entitlements.jpg
|
||||
banner: /banners/self-healing-digital-goods-entitlements.jpg
|
||||
---
|
||||
|
||||
I sell digital products — files, artwork, licensed assets — and deliver them
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "I run a self-hosted speech-to-text API on a single GPU PC. Dictati
|
||||
pubDate: 2026-09-19
|
||||
category: case-studies
|
||||
tags: [whisper, cuda, stt, n8n, nginx, self-hosting, ai]
|
||||
ogImage: /og/self-hosted-speech-to-text-api.png
|
||||
banner: /banners/self-hosted-speech-to-text-api.png
|
||||
ogImage: /og/self-hosted-speech-to-text-api.jpg
|
||||
banner: /banners/self-hosted-speech-to-text-api.jpg
|
||||
---
|
||||
|
||||
Typing is the slowest thing most offices do all day. An average person types
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "A private, self-hosted memory layer for AI agents — mem0 API + L
|
||||
pubDate: 2026-09-16
|
||||
category: case-studies
|
||||
tags: [mem0, docker, postgres, pgvector, litellm, ai, sharing]
|
||||
ogImage: /og/self-hosting-mem0-memory-stack.png
|
||||
banner: /banners/self-hosting-mem0-memory-stack.png
|
||||
ogImage: /og/self-hosting-mem0-memory-stack.jpg
|
||||
banner: /banners/self-hosting-mem0-memory-stack.jpg
|
||||
---
|
||||
|
||||
An AI agent that forgets everything between conversations is a tool you have
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "From a single HTML file to a shipped WordPress plugin: the fal.ai
|
||||
pubDate: 2026-09-18
|
||||
category: case-studies
|
||||
tags: [wordpress, php, fal-ai, docker, ai-image, javascript]
|
||||
ogImage: /og/shipping-an-ai-photo-editor-as-a-wordpress-plugin.png
|
||||
banner: /banners/shipping-an-ai-photo-editor-as-a-wordpress-plugin.png
|
||||
ogImage: /og/shipping-an-ai-photo-editor-as-a-wordpress-plugin.jpg
|
||||
banner: /banners/shipping-an-ai-photo-editor-as-a-wordpress-plugin.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2026-04-14
|
||||
updatedDate: 2026-09-29
|
||||
category: notes
|
||||
tags: [smart, smartctl, unraid, monitoring, bash, disks, homelab]
|
||||
ogImage: /og/smartctl-exit-code-32-skips-the-disks-that-matter.png
|
||||
banner: /banners/smartctl-exit-code-32-skips-the-disks-that-matter.png
|
||||
ogImage: /og/smartctl-exit-code-32-skips-the-disks-that-matter.jpg
|
||||
banner: /banners/smartctl-exit-code-32-skips-the-disks-that-matter.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2026-10-14
|
||||
updatedDate: 2026-10-16
|
||||
category: devops
|
||||
tags: ["synology", "btrfs", "snapshots", "storage", "nas"]
|
||||
ogImage: /og/space-reclamation-wasnt-stuck-it-was-waiting.png
|
||||
banner: /banners/space-reclamation-wasnt-stuck-it-was-waiting.png
|
||||
ogImage: /og/space-reclamation-wasnt-stuck-it-was-waiting.jpg
|
||||
banner: /banners/space-reclamation-wasnt-stuck-it-was-waiting.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "One of my scheduled jobs failed 29 times in a row because I put a
|
||||
pubDate: 2026-10-01
|
||||
category: notes
|
||||
tags: ["loop-engineering", "cron", "ai-agents", "automation"]
|
||||
ogImage: "/og/stop-writing-agent-prompts-for-deterministic-work.png"
|
||||
banner: "/banners/stop-writing-agent-prompts-for-deterministic-work.png"
|
||||
ogImage: "/og/stop-writing-agent-prompts-for-deterministic-work.jpg"
|
||||
banner: "/banners/stop-writing-agent-prompts-for-deterministic-work.jpg"
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2026-02-18
|
||||
updatedDate: 2026-09-11
|
||||
category: case-studies
|
||||
tags: [hermes, git, gitea, ai-agents, devops, sync]
|
||||
ogImage: /og/syncing-a-self-improving-ai-agent-across-machines.png
|
||||
banner: /banners/syncing-a-self-improving-ai-agent-across-machines.png
|
||||
ogImage: /og/syncing-a-self-improving-ai-agent-across-machines.jpg
|
||||
banner: /banners/syncing-a-self-improving-ai-agent-across-machines.jpg
|
||||
---
|
||||
|
||||
My agent learns. Every time I walk it through a non-trivial workflow — how to
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2025-09-10
|
||||
updatedDate: 2026-09-26
|
||||
category: notes
|
||||
tags: [synology, dsm, rest-api, tls, 2fa, debugging, authentication]
|
||||
ogImage: /og/synology-api-401-with-the-correct-password.png
|
||||
banner: /banners/synology-api-401-with-the-correct-password.png
|
||||
ogImage: /og/synology-api-401-with-the-correct-password.jpg
|
||||
banner: /banners/synology-api-401-with-the-correct-password.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2025-08-20
|
||||
updatedDate: 2026-09-26
|
||||
category: devops
|
||||
tags: [synology, dsm, docker, portainer, rest-api, spreadsheet, debugging, self-hosting]
|
||||
ogImage: /og/synology-spreadsheet-api-is-a-container.png
|
||||
banner: /banners/synology-spreadsheet-api-is-a-container.png
|
||||
ogImage: /og/synology-spreadsheet-api-is-a-container.jpg
|
||||
banner: /banners/synology-spreadsheet-api-is-a-container.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2026-09-16
|
||||
category: devops
|
||||
tags: [unraid, sata, ssd, storage, troubleshooting, smart, fio, cable]
|
||||
draft: false
|
||||
ogImage: /og/that-dying-ssd-was-just-a-bad-sata-cable.png
|
||||
banner: /banners/that-dying-ssd-was-just-a-bad-sata-cable.png
|
||||
ogImage: /og/that-dying-ssd-was-just-a-bad-sata-cable.jpg
|
||||
banner: /banners/that-dying-ssd-was-just-a-bad-sata-cable.jpg
|
||||
---
|
||||
|
||||
Every storage guide tells you to start with SMART and trust the event log. I did. Both pointed at one verdict: this SSD is dying. I was one config change away from RMA-ing a healthy drive.
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "Two weeks after a btrfs RAID1 pool corrupted on healthy-looking NV
|
||||
pubDate: 2026-09-18
|
||||
category: devops
|
||||
tags: [unraid, btrfs, trim, ssd, raid, data-loss, smart, troubleshooting, seagate]
|
||||
ogImage: /og/the-cause-was-trim-not-the-ssds.png
|
||||
banner: /banners/the-cause-was-trim-not-the-ssds.png
|
||||
ogImage: /og/the-cause-was-trim-not-the-ssds.jpg
|
||||
banner: /banners/the-cause-was-trim-not-the-ssds.jpg
|
||||
---
|
||||
|
||||
Two weeks ago I published how a btrfs RAID1 pool on two healthy-looking Samsung
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2026-02-04
|
||||
updatedDate: 2026-09-10
|
||||
category: notes
|
||||
tags: [nocodb, backfill, python, regex, data-pipeline]
|
||||
ogImage: /og/the-nocodb-attachment-that-wouldnt-update.png
|
||||
banner: /banners/the-nocodb-attachment-that-wouldnt-update.png
|
||||
ogImage: /og/the-nocodb-attachment-that-wouldnt-update.jpg
|
||||
banner: /banners/the-nocodb-attachment-that-wouldnt-update.jpg
|
||||
---
|
||||
|
||||
Backfilling 300 rows in NocoDB surfaced two small gotchas that each ate a chunk of
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "My production reading service runs a build whose official Docker H
|
||||
pubDate: 2026-10-06
|
||||
category: devops
|
||||
tags: ["docker", "self-hosting", "upstream", "maintenance", "registry"]
|
||||
ogImage: "/og/the-upstream-was-deleted-then-came-back-rewritten.png"
|
||||
banner: "/banners/the-upstream-was-deleted-then-came-back-rewritten.png"
|
||||
ogImage: "/og/the-upstream-was-deleted-then-came-back-rewritten.jpg"
|
||||
banner: "/banners/the-upstream-was-deleted-then-came-back-rewritten.jpg"
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2025-02-20
|
||||
updatedDate: 2026-10-16
|
||||
category: engineering
|
||||
tags: ["javascript", "i18n", "debugging", "frontend"]
|
||||
ogImage: /og/two-ways-a-javascript-file-stops-working-and-looks-fine.png
|
||||
banner: /banners/two-ways-a-javascript-file-stops-working-and-looks-fine.png
|
||||
ogImage: /og/two-ways-a-javascript-file-stops-working-and-looks-fine.jpg
|
||||
banner: /banners/two-ways-a-javascript-file-stops-working-and-looks-fine.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "My Unraid array stop hung forever at unmounting disks because an 8
|
||||
pubDate: 2026-09-15
|
||||
category: devops
|
||||
tags: [unraid, swap, btrfs, zram, docker, user-scripts]
|
||||
ogImage: /og/unraid-stop-array-hangs-on-swapfile.png
|
||||
banner: /banners/unraid-stop-array-hangs-on-swapfile.png
|
||||
ogImage: /og/unraid-stop-array-hangs-on-swapfile.jpg
|
||||
banner: /banners/unraid-stop-array-hangs-on-swapfile.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "The official CodeIgniter 4.7 upgrade guide lists eight breaking ch
|
||||
pubDate: 2026-09-27
|
||||
category: notes
|
||||
tags: [codeigniter, php, upgrade, composer, breaking-changes, config, framework]
|
||||
ogImage: /og/upgrading-codeigniter-46-to-47.png
|
||||
banner: /banners/upgrading-codeigniter-46-to-47.png
|
||||
ogImage: /og/upgrading-codeigniter-46-to-47.jpg
|
||||
banner: /banners/upgrading-codeigniter-46-to-47.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "Using Chinese LLM APIs (GLM-5.3, DeepSeek V4) from Malaysia: how I
|
||||
pubDate: 2026-09-11
|
||||
category: ai
|
||||
tags: [llm, api, deepseek, glm, alipay, malaysia]
|
||||
ogImage: /og/using-chinese-llm-apis-from-malaysia.png
|
||||
banner: /banners/using-chinese-llm-apis-from-malaysia.png
|
||||
ogImage: /og/using-chinese-llm-apis-from-malaysia.jpg
|
||||
banner: /banners/using-chinese-llm-apis-from-malaysia.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2026-09-28
|
||||
updatedDate: 2026-09-29
|
||||
category: engineering
|
||||
tags: [php, codeigniter, pdf, css, print, testing]
|
||||
ogImage: /og/verifying-a-pdf-report-page-by-page.png
|
||||
banner: /banners/verifying-a-pdf-report-page-by-page.png
|
||||
ogImage: /og/verifying-a-pdf-report-page-by-page.jpg
|
||||
banner: /banners/verifying-a-pdf-report-page-by-page.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "Six checks that catch a repo which doesn't do what its docs claim
|
||||
pubDate: 2026-09-29
|
||||
category: devops
|
||||
tags: ["open-source", "due-diligence", "oidc", "self-hosting", "docker"]
|
||||
ogImage: "/og/vetting-an-open-source-dependency-before-you-bet-on-it.png"
|
||||
banner: "/banners/vetting-an-open-source-dependency-before-you-bet-on-it.png"
|
||||
ogImage: "/og/vetting-an-open-source-dependency-before-you-bet-on-it.jpg"
|
||||
banner: "/banners/vetting-an-open-source-dependency-before-you-bet-on-it.jpg"
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "A btrfs RAID1 pool on two healthy-looking NVMe drives quietly corr
|
||||
pubDate: 2026-09-16
|
||||
category: devops
|
||||
tags: [unraid, btrfs, nvme, raid, storage, data-loss, troubleshooting]
|
||||
ogImage: /og/when-smart-says-healthy-but-your-raid-is-corrupting-data.png
|
||||
banner: /banners/when-smart-says-healthy-but-your-raid-is-corrupting-data.png
|
||||
ogImage: /og/when-smart-says-healthy-but-your-raid-is-corrupting-data.jpg
|
||||
banner: /banners/when-smart-says-healthy-but-your-raid-is-corrupting-data.jpg
|
||||
---
|
||||
|
||||
Every storage guide tells you the same thing: trust SMART, check the event
|
||||
|
||||
+2
-2
@@ -4,8 +4,8 @@ description: "Over 30 days, autonomous coding agents added 518,000 lines across
|
||||
pubDate: "2026-10-18"
|
||||
category: "engineering"
|
||||
tags: ["ai", "git", "devops", "testing", "refactoring"]
|
||||
ogImage: "/og/why-500000-lines-of-commit-churn-only-left-230000-in-production.png"
|
||||
banner: "/banners/why-500000-lines-of-commit-churn-only-left-230000-in-production.png"
|
||||
ogImage: "/og/why-500000-lines-of-commit-churn-only-left-230000-in-production.jpg"
|
||||
banner: "/banners/why-500000-lines-of-commit-churn-only-left-230000-in-production.jpg"
|
||||
---
|
||||
|
||||
Last week I did something I almost never bother to do: I counted my own
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "Chrome's \"continue where you left off\" never fires inside a Dock
|
||||
pubDate: 2026-09-29
|
||||
category: devops
|
||||
tags: [docker, chrome, cdp, persistence, synology, self-hosting]
|
||||
ogImage: /og/why-chrome-forgets-its-tabs-in-a-container.png
|
||||
banner: /banners/why-chrome-forgets-its-tabs-in-a-container.png
|
||||
ogImage: /og/why-chrome-forgets-its-tabs-in-a-container.jpg
|
||||
banner: /banners/why-chrome-forgets-its-tabs-in-a-container.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "Claude Opus and GPT are stronger than anything I can run locally.
|
||||
pubDate: 2026-09-21
|
||||
category: ai
|
||||
tags: [local-llm, gpu, llama-cpp, lm-studio, agents, self-hosting, cost]
|
||||
ogImage: /og/why-i-still-bought-a-local-gpu.png
|
||||
banner: /banners/why-i-still-bought-a-local-gpu.png
|
||||
ogImage: /og/why-i-still-bought-a-local-gpu.jpg
|
||||
banner: /banners/why-i-still-bought-a-local-gpu.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "Why my on-chain NFT art changed on Windows: core.autocrlf injects
|
||||
pubDate: 2026-08-19
|
||||
category: web3
|
||||
tags: [foundry, solidity, svg, base64, git, windows, crlf]
|
||||
ogImage: /og/why-my-on-chain-nft-art-changed-on-windows.png
|
||||
banner: /banners/why-my-on-chain-nft-art-changed-on-windows.png
|
||||
ogImage: /og/why-my-on-chain-nft-art-changed-on-windows.jpg
|
||||
banner: /banners/why-my-on-chain-nft-art-changed-on-windows.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2026-03-25
|
||||
updatedDate: 2026-09-09
|
||||
category: devops
|
||||
tags: [docker, telegram, python, dns, ipv6, debugging, portainer]
|
||||
ogImage: /og/why-telegram-bot-notifications-die.png
|
||||
banner: /banners/why-telegram-bot-notifications-die.png
|
||||
ogImage: /og/why-telegram-bot-notifications-die.jpg
|
||||
banner: /banners/why-telegram-bot-notifications-die.jpg
|
||||
---
|
||||
|
||||
I run a small monitoring bot that watches Carousell for newly-listed
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2025-03-19
|
||||
updatedDate: 2026-09-29
|
||||
category: devops
|
||||
tags: [cdp, chrome, react, browser-automation, debugging, python]
|
||||
ogImage: /og/why-your-cdp-clicks-silently-fail.png
|
||||
banner: /banners/why-your-cdp-clicks-silently-fail.png
|
||||
ogImage: /og/why-your-cdp-clicks-silently-fail.jpg
|
||||
banner: /banners/why-your-cdp-clicks-silently-fail.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2026-05-17
|
||||
updatedDate: 2026-09-29
|
||||
category: devops
|
||||
tags: [grafana, prometheus, dashboards, monitoring, promql, observability]
|
||||
ogImage: /og/why-your-grafana-dashboard-shows-no-data.png
|
||||
banner: /banners/why-your-grafana-dashboard-shows-no-data.png
|
||||
ogImage: /og/why-your-grafana-dashboard-shows-no-data.jpg
|
||||
banner: /banners/why-your-grafana-dashboard-shows-no-data.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2026-01-21
|
||||
updatedDate: 2026-09-10
|
||||
category: case-studies
|
||||
tags: [scraping, playwright, browserless, docker, goofish, carousell, anti-bot]
|
||||
ogImage: /og/why-your-headless-browser-cant-scrape-everything.png
|
||||
banner: /banners/why-your-headless-browser-cant-scrape-everything.png
|
||||
ogImage: /og/why-your-headless-browser-cant-scrape-everything.jpg
|
||||
banner: /banners/why-your-headless-browser-cant-scrape-everything.jpg
|
||||
---
|
||||
|
||||
I hit the same wall a few weeks apart, on two different second-hand marketplaces,
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2026-06-24
|
||||
updatedDate: 2026-09-29
|
||||
category: devops
|
||||
tags: [monitoring, alerting, prometheus, grafana, storage, capacity, observability]
|
||||
ogImage: /og/your-disk-full-alert-is-lying.png
|
||||
banner: /banners/your-disk-full-alert-is-lying.png
|
||||
ogImage: /og/your-disk-full-alert-is-lying.jpg
|
||||
banner: /banners/your-disk-full-alert-is-lying.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2025-05-06
|
||||
updatedDate: 2026-10-16
|
||||
category: notes
|
||||
tags: ["email", "dns", "mailcow", "smtp", "deliverability"]
|
||||
ogImage: /og/adding-a-domain-to-someone-elses-mail-server.png
|
||||
banner: /banners/adding-a-domain-to-someone-elses-mail-server.png
|
||||
ogImage: /og/zh-adding-a-domain-to-someone-elses-mail-server.jpg
|
||||
banner: /banners/adding-a-domain-to-someone-elses-mail-server.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2025-06-11
|
||||
updatedDate: 2026-09-29
|
||||
category: engineering
|
||||
tags: ["i18n", "nginx", "vue", "javascript", "self-hosting"]
|
||||
ogImage: "/og/adding-english-mode-to-a-chinese-only-web-app.png"
|
||||
banner: "/banners/adding-english-mode-to-a-chinese-only-web-app.png"
|
||||
ogImage: "/og/zh-adding-english-mode-to-a-chinese-only-web-app.jpg"
|
||||
banner: "/banners/adding-english-mode-to-a-chinese-only-web-app.jpg"
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "用 fal.ai FLUX.1 Kontext 把家具产品照合成到风格化房
|
||||
pubDate: 2026-09-11
|
||||
category: case-studies
|
||||
tags: [fal-ai, flux, ai-image, javascript, canvas, ecommerce]
|
||||
ogImage: /og/ai-furniture-compositing-with-flux-kontext.png
|
||||
banner: /banners/ai-furniture-compositing-with-flux-kontext.png
|
||||
ogImage: /og/zh-ai-furniture-compositing-with-flux-kontext.jpg
|
||||
banner: /banners/ai-furniture-compositing-with-flux-kontext.jpg
|
||||
---
|
||||
|
||||
一位家具客户带着一个每个小电商卖家最终都会撞上的问题来找我:他们的产品图都是**孤立的产品照**——一张白底桌子、一张白底椅子——但顾客不会从一片白茫茫的虚无里买家具,他们买的是*房间*。给每个产品、每种室内风格都拍一次实体棚拍,对一个人的生意来说根本不可能。
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2026-09-20
|
||||
updatedDate: 2026-10-16
|
||||
category: devops
|
||||
tags: ["authentik", "css", "self-hosting", "debugging", "browser"]
|
||||
ogImage: /og/authentik-css-greater-than-bug.png
|
||||
banner: /banners/authentik-css-greater-than-bug.png
|
||||
ogImage: /og/zh-authentik-css-greater-than-bug.jpg
|
||||
banner: /banners/authentik-css-greater-than-bug.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2026-08-12
|
||||
updatedDate: 2026-09-29
|
||||
category: devops
|
||||
tags: ["authentik", "forward-auth", "cloudflare", "nginx", "docker", "self-hosting"]
|
||||
ogImage: /og/authentik-forward-auth-gate-wasnt-live.png
|
||||
banner: /banners/authentik-forward-auth-gate-wasnt-live.png
|
||||
ogImage: /og/zh-authentik-forward-auth-gate-wasnt-live.jpg
|
||||
banner: /banners/authentik-forward-auth-gate-wasnt-live.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "一年份的 authentik 大版本升级踩坑记录:存储挂载
|
||||
pubDate: 2026-09-09
|
||||
category: devops
|
||||
tags: [authentik, sso, docker, portainer, self-hosting, oidc, upgrade]
|
||||
ogImage: /og/authentik-major-upgrade-gotchas.png
|
||||
banner: /banners/authentik-major-upgrade-gotchas.png
|
||||
ogImage: /og/zh-authentik-major-upgrade-gotchas.jpg
|
||||
banner: /banners/authentik-major-upgrade-gotchas.jpg
|
||||
---
|
||||
|
||||
我把 authentik 当作自托管体系前面的单点登录闸门——邮箱、仪表盘、Synology
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "CyberPanel v2 砍掉了有文档的 JSON API,只留下 Angular
|
||||
pubDate: 2026-09-09
|
||||
category: devops
|
||||
tags: [cyberpanel, api, reverse-engineering, automation, django, self-hosting, curl]
|
||||
ogImage: /og/automating-cyberpanel-without-the-ui.png
|
||||
banner: /banners/automating-cyberpanel-without-the-ui.png
|
||||
ogImage: /og/zh-automating-cyberpanel-without-the-ui.jpg
|
||||
banner: /banners/automating-cyberpanel-without-the-ui.jpg
|
||||
---
|
||||
|
||||
我在家庭实验里的一台 Ubuntu 虚拟机里跑着 CyberPanel 2.4.4.1,用来托管几个小站,
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "对比 2026 年最好的 AI 视频生成器——免费与付费
|
||||
pubDate: 2026-09-11
|
||||
category: ai
|
||||
tags: [ai-video, video-generation, ltx, open-weights, pricing, veo]
|
||||
ogImage: /og/best-ai-video-generators-2026.png
|
||||
banner: /banners/best-ai-video-generators-2026.png
|
||||
ogImage: /og/zh-best-ai-video-generators-2026.jpg
|
||||
banner: /banners/best-ai-video-generators-2026.jpg
|
||||
---
|
||||
|
||||
2026 年,你究竟该用哪个 AI 视频生成器?其中又有多少是真免费的?
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2026-10-14
|
||||
updatedDate: 2026-10-16
|
||||
category: tutorials
|
||||
tags: ["ffmpeg", "hevc", "qsv", "transcoding", "video"]
|
||||
ogImage: /og/calibrating-intel-quick-sync-hevc-quality.png
|
||||
banner: /banners/calibrating-intel-quick-sync-hevc-quality.png
|
||||
ogImage: /og/zh-calibrating-intel-quick-sync-hevc-quality.jpg
|
||||
banner: /banners/calibrating-intel-quick-sync-hevc-quality.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2024-12-10
|
||||
updatedDate: 2026-09-29
|
||||
category: web3
|
||||
tags: [solidity, chainlink, vrf, foundry, hardhat, blockchain]
|
||||
ogImage: /og/chainlink-vrf-v2-lottery-contract.png
|
||||
banner: /banners/chainlink-vrf-v2-lottery-contract.png
|
||||
ogImage: /og/zh-chainlink-vrf-v2-lottery-contract.jpg
|
||||
banner: /banners/chainlink-vrf-v2-lottery-contract.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "NAS 上的容器不停「意外停止」,而 Docker 报的是 ex
|
||||
pubDate: 2026-10-16
|
||||
category: devops
|
||||
tags: ["docker", "oom", "traefik", "synology", "crawlers"]
|
||||
ogImage: /og/docker-reported-exit-0-the-oom-killer-disagreed.png
|
||||
banner: /banners/docker-reported-exit-0-the-oom-killer-disagreed.png
|
||||
ogImage: /og/zh-docker-reported-exit-0-the-oom-killer-disagreed.jpg
|
||||
banner: /banners/docker-reported-exit-0-the-oom-killer-disagreed.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "在真实文件上对 HEVC 编码器做的实测对比:NVENC cq2
|
||||
pubDate: 2026-10-08
|
||||
category: tutorials
|
||||
tags: [ffmpeg, hevc, x265, nvenc, video]
|
||||
ogImage: /og/does-hevc-actually-shrink-your-files.png
|
||||
banner: /banners/does-hevc-actually-shrink-your-files.png
|
||||
ogImage: /og/zh-does-hevc-actually-shrink-your-files.jpg
|
||||
banner: /banners/does-hevc-actually-shrink-your-files.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2025-01-22
|
||||
updatedDate: 2026-10-16
|
||||
category: engineering
|
||||
tags: ["pdf", "fonts", "mpdf", "typography", "php"]
|
||||
ogImage: /og/embedding-fonts-so-a-pdf-looks-the-same-everywhere.png
|
||||
banner: /banners/embedding-fonts-so-a-pdf-looks-the-same-everywhere.png
|
||||
ogImage: /og/zh-embedding-fonts-so-a-pdf-looks-the-same-everywhere.jpg
|
||||
banner: /banners/embedding-fonts-so-a-pdf-looks-the-same-everywhere.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "同一个 HEVC 文件,在 VLC、Chrome 和 iPad 上(离线)
|
||||
pubDate: 2026-10-08
|
||||
category: devops
|
||||
tags: [ffmpeg, nvdec, hevc, transcoding, video]
|
||||
ogImage: /og/every-player-stuttered-the-file-was-fine.png
|
||||
banner: /banners/every-player-stuttered-the-file-was-fine.png
|
||||
ogImage: /og/zh-every-player-stuttered-the-file-was-fine.jpg
|
||||
banner: /banners/every-player-stuttered-the-file-was-fine.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "AI 五步学习路线(基础、提示词、RAG、Agent、微调
|
||||
pubDate: 2026-10-13
|
||||
category: ai
|
||||
tags: ["llm", "rag", "agents", "self-hosting", "whisper", "mem0"]
|
||||
ogImage: /og/five-step-ai-roadmap-what-i-actually-run.png
|
||||
banner: /banners/five-step-ai-roadmap-what-i-actually-run.png
|
||||
ogImage: /og/zh-five-step-ai-roadmap-what-i-actually-run.jpg
|
||||
banner: /banners/five-step-ai-roadmap-what-i-actually-run.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2024-10-08
|
||||
updatedDate: 2026-09-29
|
||||
category: web3
|
||||
tags: [solidity, foundry, erc721, nft, svg, base64, onchain]
|
||||
ogImage: /og/fully-on-chain-svg-nfts.png
|
||||
banner: /banners/fully-on-chain-svg-nfts.png
|
||||
ogImage: /og/zh-fully-on-chain-svg-nfts.jpg
|
||||
banner: /banners/fully-on-chain-svg-nfts.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2025-12-10
|
||||
updatedDate: 2026-09-09
|
||||
category: devops
|
||||
tags: [tor, docker, security, self-hosting, networking]
|
||||
ogImage: /og/hardening-a-tor-onion-service.png
|
||||
banner: /banners/hardening-a-tor-onion-service.png
|
||||
ogImage: /og/zh-hardening-a-tor-onion-service.jpg
|
||||
banner: /banners/hardening-a-tor-onion-service.jpg
|
||||
---
|
||||
|
||||
我对暗网产生了好奇。不是集市那一面,而是无聊的那一半:人们像注册商和云控制台出现之前那样自托管——跑自己维护的软件,用一个自己掌控的地址就能访问。
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2024-09-24
|
||||
updatedDate: 2026-09-05
|
||||
category: notes
|
||||
tags: [intro]
|
||||
ogImage: /og/hello-world.png
|
||||
banner: /banners/hello-world.png
|
||||
ogImage: /og/zh-hello-world.jpg
|
||||
banner: /banners/hello-world.jpg
|
||||
---
|
||||
|
||||
欢迎。这里写下我构建与学习的东西——主要是工程、DevOps 和自托管,中间也会
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "一个全天候解答顾客问题、并在 Telegram 和 WhatsApp
|
||||
pubDate: 2026-09-06
|
||||
category: case-studies
|
||||
tags: [telegram, docker, cloudflare, litellm, typescript, ai]
|
||||
ogImage: /og/how-i-built-the-digikedai-telegram-bot.png
|
||||
banner: /banners/how-i-built-the-digikedai-telegram-bot.png
|
||||
ogImage: /og/zh-how-i-built-the-digikedai-telegram-bot.jpg
|
||||
banner: /banners/how-i-built-the-digikedai-telegram-bot.jpg
|
||||
---
|
||||
|
||||
Digi Kedai 销售数字产品——在线课程、电子书、模板——每一单都会带来一连串同样的顾客问题:*「这门课有免费试看吗?」「我怎么拿到账号?」「我该买哪个套餐?」*。对一个人的生意来说,人工回复根本忙不过来。于是我打造了一个 AI 客服机器人,全天候解答这些问题,甚至能在无人介入的情况下自动发放免费试用账号。
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "这篇文章完整拆解了这个网站背后的构建与部署管
|
||||
pubDate: 2026-09-04
|
||||
category: case-studies
|
||||
tags: [astro, gitea, ci-cd, self-hosting, docker, cloudflare]
|
||||
ogImage: /og/how-i-host-this-blog.png
|
||||
banner: /banners/how-i-host-this-blog.png
|
||||
ogImage: /og/zh-how-i-host-this-blog.jpg
|
||||
banner: /banners/how-i-host-this-blog.jpg
|
||||
---
|
||||
|
||||
这个博客本身,就是我用来说明「我到底会做什么」的一个项目。下面是完整的
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "自己写词、调风格提示词,用 Suno AI 做出七首原创
|
||||
pubDate: 2026-09-11
|
||||
category: case-studies
|
||||
tags: [suno, ai-music, music, lyrics, prompting, ai]
|
||||
ogImage: /og/how-i-made-my-own-songs-with-suno-ai.png
|
||||
banner: /banners/how-i-made-my-own-songs-with-suno-ai.png
|
||||
ogImage: /og/zh-how-i-made-my-own-songs-with-suno-ai.jpg
|
||||
banner: /banners/how-i-made-my-own-songs-with-suno-ai.jpg
|
||||
---
|
||||
|
||||
我做自己的歌。不是靠弹奏乐器——而是写歌词、打磨风格提示词,让 Suno AI
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2025-11-12
|
||||
updatedDate: 2026-09-09
|
||||
category: case-studies
|
||||
tags: [ai-orchestration, subagents, due-diligence, hosting, devops]
|
||||
ogImage: /og/how-i-vetted-20-vps-providers-with-parallel-subagents.png
|
||||
banner: /banners/how-i-vetted-20-vps-providers-with-parallel-subagents.png
|
||||
ogImage: /og/zh-how-i-vetted-20-vps-providers-with-parallel-subagents.jpg
|
||||
banner: /banners/how-i-vetted-20-vps-providers-with-parallel-subagents.jpg
|
||||
---
|
||||
|
||||
## 为什么这很重要
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2025-11-26
|
||||
updatedDate: 2026-09-09
|
||||
category: tutorials
|
||||
tags: [hosting, vps, due-diligence, whois, devops]
|
||||
ogImage: /og/how-to-verify-a-hosting-provider-before-you-buy.png
|
||||
banner: /banners/how-to-verify-a-hosting-provider-before-you-buy.png
|
||||
ogImage: /og/zh-how-to-verify-a-hosting-provider-before-you-buy.jpg
|
||||
banner: /banners/how-to-verify-a-hosting-provider-before-you-buy.jpg
|
||||
---
|
||||
|
||||
每家主机服务商的首页都是一串承诺:_「自 2005 年起运营」_、_「保证在线率」_、
|
||||
|
||||
@@ -5,8 +5,8 @@ pubDate: 2025-07-08
|
||||
updatedDate: 2026-09-29
|
||||
category: ai
|
||||
tags: [ai-agent, shopee, automation, human-in-the-loop, ecommerce, cron]
|
||||
ogImage: /og/i-let-an-agent-manage-my-shopee-vouchers.png
|
||||
banner: /banners/i-let-an-agent-manage-my-shopee-vouchers.png
|
||||
ogImage: /og/zh-i-let-an-agent-manage-my-shopee-vouchers.jpg
|
||||
banner: /banners/i-let-an-agent-manage-my-shopee-vouchers.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "网络挂载盘对我的转换流水线撒的三种谎:一次 40
|
||||
pubDate: 2026-10-08
|
||||
category: devops
|
||||
tags: [storage, smb, verification, ffmpeg, python]
|
||||
ogImage: /og/it-reported-success-nothing-had-changed.png
|
||||
banner: /banners/it-reported-success-nothing-had-changed.png
|
||||
ogImage: /og/zh-it-reported-success-nothing-had-changed.jpg
|
||||
banner: /banners/it-reported-success-nothing-had-changed.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "在 REST + JPA 的读-改-写流程里,两个编辑同时保存
|
||||
pubDate: 2026-08-19
|
||||
category: engineering
|
||||
tags: [java, spring, jpa, hibernate, rest, testing]
|
||||
ogImage: /og/jpa-version-field-lost-update.png
|
||||
banner: /banners/jpa-version-field-lost-update.png
|
||||
ogImage: /og/zh-jpa-version-field-lost-update.jpg
|
||||
banner: /banners/jpa-version-field-lost-update.jpg
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@ description: "Loop engineering 是 2026 年对「设计让 agent 自己反复跑
|
||||
pubDate: 2026-10-01
|
||||
category: case-studies
|
||||
tags: ["loop-engineering", "ai-agents", "cron", "self-hosting", "automation", "monitoring"]
|
||||
ogImage: "/og/loop-engineering-without-a-coding-agent.png"
|
||||
banner: "/banners/loop-engineering-without-a-coding-agent.png"
|
||||
ogImage: "/og/zh-loop-engineering-without-a-coding-agent.jpg"
|
||||
banner: "/banners/loop-engineering-without-a-coding-agent.jpg"
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
Loaded 100 of 802 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user