diff --git a/public/banners/five-automated-quality-gates-for-video-transcoding.jpg b/public/banners/five-automated-quality-gates-for-video-transcoding.jpg new file mode 100644 index 0000000..fd75e07 Binary files /dev/null and b/public/banners/five-automated-quality-gates-for-video-transcoding.jpg differ diff --git a/public/banners/five-automated-quality-gates-for-video-transcoding.webp b/public/banners/five-automated-quality-gates-for-video-transcoding.webp new file mode 100644 index 0000000..4300418 Binary files /dev/null and b/public/banners/five-automated-quality-gates-for-video-transcoding.webp differ diff --git a/public/banners/tracking-down-ghost-uploads-across-nas-25gbe-interconnect.jpg b/public/banners/tracking-down-ghost-uploads-across-nas-25gbe-interconnect.jpg new file mode 100644 index 0000000..0683c02 Binary files /dev/null and b/public/banners/tracking-down-ghost-uploads-across-nas-25gbe-interconnect.jpg differ diff --git a/public/banners/tracking-down-ghost-uploads-across-nas-25gbe-interconnect.webp b/public/banners/tracking-down-ghost-uploads-across-nas-25gbe-interconnect.webp new file mode 100644 index 0000000..2c941f9 Binary files /dev/null and b/public/banners/tracking-down-ghost-uploads-across-nas-25gbe-interconnect.webp differ diff --git a/public/banners/why-you-cant-safely-shrink-a-btrfs-volume-in-five-seconds.jpg b/public/banners/why-you-cant-safely-shrink-a-btrfs-volume-in-five-seconds.jpg new file mode 100644 index 0000000..20aa74b Binary files /dev/null and b/public/banners/why-you-cant-safely-shrink-a-btrfs-volume-in-five-seconds.jpg differ diff --git a/public/banners/why-you-cant-safely-shrink-a-btrfs-volume-in-five-seconds.webp b/public/banners/why-you-cant-safely-shrink-a-btrfs-volume-in-five-seconds.webp new file mode 100644 index 0000000..4f03807 Binary files /dev/null and b/public/banners/why-you-cant-safely-shrink-a-btrfs-volume-in-five-seconds.webp differ diff --git a/public/og/five-automated-quality-gates-for-video-transcoding.jpg b/public/og/five-automated-quality-gates-for-video-transcoding.jpg new file mode 100644 index 0000000..f21d3b4 Binary files /dev/null and b/public/og/five-automated-quality-gates-for-video-transcoding.jpg differ diff --git a/public/og/thumb/five-automated-quality-gates-for-video-transcoding-400.webp b/public/og/thumb/five-automated-quality-gates-for-video-transcoding-400.webp new file mode 100644 index 0000000..c126985 Binary files /dev/null and b/public/og/thumb/five-automated-quality-gates-for-video-transcoding-400.webp differ diff --git a/public/og/thumb/five-automated-quality-gates-for-video-transcoding-800.webp b/public/og/thumb/five-automated-quality-gates-for-video-transcoding-800.webp new file mode 100644 index 0000000..c48d316 Binary files /dev/null and b/public/og/thumb/five-automated-quality-gates-for-video-transcoding-800.webp differ diff --git a/public/og/thumb/tracking-down-ghost-uploads-across-nas-25gbe-interconnect-400.webp b/public/og/thumb/tracking-down-ghost-uploads-across-nas-25gbe-interconnect-400.webp new file mode 100644 index 0000000..0857f1e Binary files /dev/null and b/public/og/thumb/tracking-down-ghost-uploads-across-nas-25gbe-interconnect-400.webp differ diff --git a/public/og/thumb/tracking-down-ghost-uploads-across-nas-25gbe-interconnect-800.webp b/public/og/thumb/tracking-down-ghost-uploads-across-nas-25gbe-interconnect-800.webp new file mode 100644 index 0000000..88b675a Binary files /dev/null and b/public/og/thumb/tracking-down-ghost-uploads-across-nas-25gbe-interconnect-800.webp differ diff --git a/public/og/thumb/why-you-cant-safely-shrink-a-btrfs-volume-in-five-seconds-400.webp b/public/og/thumb/why-you-cant-safely-shrink-a-btrfs-volume-in-five-seconds-400.webp new file mode 100644 index 0000000..26fa089 Binary files /dev/null and b/public/og/thumb/why-you-cant-safely-shrink-a-btrfs-volume-in-five-seconds-400.webp differ diff --git a/public/og/thumb/why-you-cant-safely-shrink-a-btrfs-volume-in-five-seconds-800.webp b/public/og/thumb/why-you-cant-safely-shrink-a-btrfs-volume-in-five-seconds-800.webp new file mode 100644 index 0000000..7e05a96 Binary files /dev/null and b/public/og/thumb/why-you-cant-safely-shrink-a-btrfs-volume-in-five-seconds-800.webp differ diff --git a/public/og/tracking-down-ghost-uploads-across-nas-25gbe-interconnect.jpg b/public/og/tracking-down-ghost-uploads-across-nas-25gbe-interconnect.jpg new file mode 100644 index 0000000..1766a13 Binary files /dev/null and b/public/og/tracking-down-ghost-uploads-across-nas-25gbe-interconnect.jpg differ diff --git a/public/og/why-you-cant-safely-shrink-a-btrfs-volume-in-five-seconds.jpg b/public/og/why-you-cant-safely-shrink-a-btrfs-volume-in-five-seconds.jpg new file mode 100644 index 0000000..b746a82 Binary files /dev/null and b/public/og/why-you-cant-safely-shrink-a-btrfs-volume-in-five-seconds.jpg differ diff --git a/public/og/zh-five-automated-quality-gates-for-video-transcoding.jpg b/public/og/zh-five-automated-quality-gates-for-video-transcoding.jpg new file mode 100644 index 0000000..a898623 Binary files /dev/null and b/public/og/zh-five-automated-quality-gates-for-video-transcoding.jpg differ diff --git a/public/og/zh-tracking-down-ghost-uploads-across-nas-25gbe-interconnect.jpg b/public/og/zh-tracking-down-ghost-uploads-across-nas-25gbe-interconnect.jpg new file mode 100644 index 0000000..cebb1f4 Binary files /dev/null and b/public/og/zh-tracking-down-ghost-uploads-across-nas-25gbe-interconnect.jpg differ diff --git a/public/og/zh-why-you-cant-safely-shrink-a-btrfs-volume-in-five-seconds.jpg b/public/og/zh-why-you-cant-safely-shrink-a-btrfs-volume-in-five-seconds.jpg new file mode 100644 index 0000000..e97cc24 Binary files /dev/null and b/public/og/zh-why-you-cant-safely-shrink-a-btrfs-volume-in-five-seconds.jpg differ diff --git a/scripts/og-gen/art-meta.json b/scripts/og-gen/art-meta.json index 61466ad..7c8b4bd 100644 --- a/scripts/og-gen/art-meta.json +++ b/scripts/og-gen/art-meta.json @@ -1,353 +1,368 @@ { - "_about": "Inputs for scripts/og-gen/render_from_art.mjs ('one art, four targets'). One entry per post: `art` = the zero-text base frame (default /.png), `evidence` = the short factual line shown in the card's evidence bar (REQUIRED, written by hand — never derived), optional `ogTitle_en` / `ogTitle_zh` = shortened display titles for the card only (consultant question 1, option C: the article keeps its real title), optional `tags` = override the three badge tags. Cards render from the post's own frontmatter (title/description/category) unless an ogTitle override is present.", - "_status": "73 of 73 posts have a hand-written evidence line; base art is generated from C:/AI/ideogram4/captions/.json", - "running-ai-video-locally-on-a-12gb-gpu": { - "evidence": "1280x736 -> 1080p - 32 min / 5 s - $0", - "ogTitle_en": "AI Video on a 12 GB GPU", - "ogTitle_zh": "12GB 显卡跑 1080p 视频" - }, - "adding-a-domain-to-someone-elses-mail-server": { - "evidence": "4 DNS records · 554 antispam reject" - }, - "adding-english-mode-to-a-chinese-only-web-app": { - "evidence": "no browser API · sub_filter EN mode" - }, - "ai-furniture-compositing-with-flux-kontext": { - "evidence": "kontext multi-image · tainted canvas fix" - }, - "authentik-css-greater-than-bug": { - "evidence": "1 escaped '>' · CSS silently dropped" - }, - "authentik-forward-auth-gate-wasnt-live": { - "evidence": "host 302 · public 200 · 2 ingress layers" - }, - "authentik-major-upgrade-gotchas": { - "evidence": "2025.8 → 2026.8 · auth_flow mixup" - }, - "automating-cyberpanel-without-the-ui": { - "evidence": "v2 JSON API gone · session + CSRF" - }, - "best-ai-video-generators-2026": { - "evidence": "free vs paid · local LTX-2.3 test" - }, - "calibrating-intel-quick-sync-hevc-quality": { - "evidence": "ICQ 28-30 cliff · fast == medium" - }, - "chainlink-vrf-v2-lottery-contract": { - "evidence": "VRF v2.5 · mock-funding bug" - }, - "docker-reported-exit-0-the-oom-killer-disagreed": { - "evidence": "exit 0 · dmesg: 6x cgroup OOM kills" - }, - "does-hevc-actually-shrink-your-files": { - "evidence": "NVENC cq27 bigger · x265 -10-22%" - }, - "embedding-fonts-so-a-pdf-looks-the-same-everywhere": { - "evidence": "4 families · 8 faces · 2 renderers" - }, - "every-player-stuttered-the-file-was-fine": { - "evidence": "5818/5818 intervals · 0 duplicate PTS" - }, - "five-step-ai-roadmap-what-i-actually-run": { - "evidence": "whisper + mem0 in production · step 4 skipped" - }, - "fully-on-chain-svg-nfts": { - "evidence": "base64 SVG in tokenURI() · mood flip on-chain" - }, - "hardening-a-tor-onion-service": { - "evidence": "bind 0.0.0.0:80 denied · onion v3" - }, - "hello-world": { - "evidence": "~140-container homelab · self-hosted" - }, - "how-i-built-the-digikedai-telegram-bot": { - "evidence": "Telegram + WhatsApp · LiteLLM gateway" - }, - "how-i-host-this-blog": { - "evidence": "git push · act_runner · nginx" - }, - "how-i-made-my-own-songs-with-suno-ai": { - "evidence": "7 songs · lyrics + prompts" - }, - "how-i-vetted-20-vps-providers-with-parallel-subagents": { - "evidence": "20 providers · 3 hours · subagents" - }, - "how-to-verify-a-hosting-provider-before-you-buy": { - "evidence": "rdap.org domain age · AUP read" - }, - "i-let-an-agent-manage-my-shopee-vouchers": { - "evidence": "mode=propose gate · RM140 voucher unapproved" - }, - "it-reported-success-nothing-had-changed": { - "evidence": "12.5 MB of 403 MB · rename never landed" - }, - "jpa-version-field-lost-update": { - "evidence": "@Version · stale PUT → 409" - }, - "loop-engineering-without-a-coding-agent": { - "evidence": "11 cron jobs · 8 zero-AI loops" - }, - "migrating-codeigniter-iis-to-openlitespeed": { - "evidence": "17,000-line CI4 · env() fatal" - }, - "my-backup-was-using-someone-elses-api-quota": { - "evidence": "1 TB restic seed · shared rclone quota" - }, - "n8n-v1-to-v2-upgrade-gotchas": { - "evidence": "1.x → 2.40.1 · 7 silent breaks" - }, - "nocodb-sso-is-a-licensed-feature": { - "evidence": "OIDC env accepted · first login crashes" - }, - "one-hostname-public-tracker-sso-dashboard": { - "evidence": "1 host · tracker public, dashboard SSO" - }, - "one-prometheus-for-unraid-synology-and-a-vps": { - "evidence": "3 hosts · 1 prometheus · 0 false panels" - }, - "passbolt-hang-three-failure-modes": { - "evidence": "null fingerprint · 3 failure modes" - }, - "patching-workbench-26-for-mariadb": { - "evidence": "26.7.0 TypeError · 3 patches" - }, - "putting-a-front-door-on-an-app-you-cant-modify": { - "evidence": "5879-byte SPA · 3 injected lines" - }, - "read-only-nocodb-dashboard-for-a-remote-database": { - "evidence": "SNAT source IP · 0 rows copied" - }, - "reading-a-containers-own-api-docs": { - "evidence": "4 docker commands · image is the spec" - }, - "replacing-rdpguard-with-ipban": { - "evidence": "RDPGuard 7.8.7 → IPBan 4.1.0 · 12 IPs" - }, - "running-production-infrastructure-solo": { - "evidence": "162 containers · 3 hosts · 78 compose stacks" - }, - "running-tts-as-a-service-with-token-sidecars": { - "evidence": "tokens expire 10 min / 1 h · sidecars" - }, - "scraping-bot-walled-marketplace-warm-browser-session": { - "evidence": "warm CDP session · split waits" - }, - "self-healing-digital-goods-entitlements": { - "evidence": "5 workflows · NocoDB + n8n + AList" - }, - "self-hosted-speech-to-text-api": { - "evidence": "whisper.cpp large-v3 · ~5x typing" - }, - "self-hosting-mem0-memory-stack": { - "evidence": "mem0 + LiteLLM + pgvector · :20015" - }, - "shipping-an-ai-photo-editor-as-a-wordpress-plugin": { - "evidence": "22 versions · fal.ai async queue" - }, - "smartctl-exit-code-32-skips-the-disks-that-matter": { - "evidence": "rc=32 is not failure · skips bad disks" - }, - "space-reclamation-wasnt-stuck-it-was-waiting": { - "evidence": "121 GiB returned · scheduled 09:29" - }, - "stop-writing-agent-prompts-for-deterministic-work": { - "evidence": "29 straight failures · 1 string compare" - }, - "syncing-a-self-improving-ai-agent-across-machines": { - "evidence": "git-backed profile · manual sync" - }, - "synology-api-401-with-the-correct-password": { - "evidence": "401 twice · 2 causes · 3 commands" - }, - "synology-spreadsheet-api-is-a-container": { - "evidence": "1515 APIs · 4 traps" - }, - "that-dying-ssd-was-just-a-bad-sata-cable": { - "evidence": "WRITE FPDMA timeout · 1 SATA cable" - }, - "the-cause-was-trim-not-the-ssds": { - "evidence": "corruption_errs 27 / 31 · queued TRIM" - }, - "the-nocodb-attachment-that-wouldnt-update": { - "evidence": "300 rows · 1 lookahead regex miss" - }, - "the-upstream-was-deleted-then-came-back-rewritten": { - "evidence": "repo 404 · 233 commits rewrite" - }, - "two-ways-a-javascript-file-stops-working-and-looks-fine": { - "evidence": "shadowed name · let below call" - }, - "unraid-stop-array-hangs-on-swapfile": { - "evidence": "8 GB swapfile pins /mnt/cache" - }, - "upgrading-codeigniter-46-to-47": { - "evidence": "4.6 → 4.7 · 2 unlisted fatals" - }, - "using-chinese-llm-apis-from-malaysia": { - "evidence": "GLM-5.3 · DeepSeek V4 · RMB top-up" - }, - "verifying-a-pdf-report-page-by-page": { - "evidence": "19 pages · every deviation < 2 pt" - }, - "vetting-an-open-source-dependency-before-you-bet-on-it": { - "evidence": "6 checks · grep beats the README" - }, - "when-smart-says-healthy-but-your-raid-is-corrupting-data": { - "evidence": "SMART healthy · checksum 0x8941f998" - }, - "why-500000-lines-of-commit-churn-only-left-230000-in-production": { - "evidence": "518,000 added · 235,000 kept · 5 repos" - }, - "why-chrome-forgets-its-tabs-in-a-container": { - "evidence": "RestoreOnStartup=1 · 70-line keeper" - }, - "why-i-still-bought-a-local-gpu": { - "evidence": "stronger frontier · local for retries + batch" - }, - "why-my-on-chain-nft-art-changed-on-windows": { - "evidence": "autocrlf CRLF · base64 differs" - }, - "why-telegram-bot-notifications-die": { - "evidence": "400 on sendPhoto · getMe fine · IPv6-only DNS" - }, - "why-your-cdp-clicks-silently-fail": { - "evidence": "scroll-behavior:smooth · rect expired" - }, - "why-your-grafana-dashboard-shows-no-data": { - "evidence": "41 panels No data · variable filtered itself" - }, - "why-your-headless-browser-cant-scrape-everything": { - "evidence": "Goofish blocks · Carousell serves" - }, - "your-disk-full-alert-is-lying": { - "evidence": "3% free = 500 GB · alert fires wrong way" - }, - "yue2-on-a-12gb-gpu-songs-that-lost-their-endings": { - "evidence": "12 takes - all 240.000 s - cap now 300 s" - }, - "generating-subtitles-for-songs-without-timestamps": { - "evidence": "18 songs - 342 lines - 0.96 anchor coverage" - }, - "why-i-built-a-video-knowledge-base": { - "evidence": "263 pages · 20ms search · 0 cloud STT fees" - }, - "how-i-built-an-automated-music-video-pipeline": { - "evidence": "LRC + Remotion 1080p · CDP upload · 8-lang subs published", - "ogTitle_en": "Automated MV Pipeline with Remotion & CDP", - "ogTitle_zh": "Remotion 与 Docker CDP 自动生成发布 MV" - }, - "uploading-large-videos-to-youtube-via-cdp": { - "evidence": "130MB video via Portainer archive PUT · 0 RAM spikes", - "ogTitle_en": "Upload 100MB+ Videos to YouTube via CDP", - "ogTitle_zh": "CDP 上传百兆视频:Docker 归档法" - }, - "debugging-remotion-video-jitter": { - "evidence": "bassScale 30fps tremor killed · 2-layer opacity crossfade", - "ogTitle_en": "Debugging Remotion Video Jitter", - "ogTitle_zh": "排查 Remotion 视频抽搐与透明度叠化" - }, - "self-hosted-tts-cosyvoice2-n8n-gpu": { - "evidence": "3.2GB VRAM · 300ms first-packet · 0 cloud API fees", - "ogTitle_en": "Self-Hosted Neural TTS with CosyVoice 2 & N8N", - "ogTitle_zh": "自建 CosyVoice 2 高保真语音栈与 N8N 联动" - }, - "why-is-my-tts-model-repeating-percent": { - "evidence": "URL percent-encoding trap killed · 2-layer defensive fix", - "ogTitle_en": "Why Your TTS Model Keeps Saying \"Percent\"", - "ogTitle_zh": "为什么本地语音合成一直在念 Percent?" - }, - "php2shell-patching-every-php-runtime-i-manage": { - "evidence": "8 public sites in 2 min · 7 on 8.5.12 · 8 dead rules" - }, - "giving-ai-your-mouse-and-keyboard-safely": { - "evidence": "PowerShell & Registry stripped · 0.5x downscale · 0 flash", - "ogTitle_en": "Safe Guardrails for Windows Desktop MCP", - "ogTitle_zh": "给 AI 鼠标键盘前的四道安全防线" - }, - "plugging-windows-desktop-control-into-four-ai-agents": { - "evidence": "1 Python 3.14 server · 4 agent configs · 19 native tools", - "ogTitle_en": "Plugging Windows Desktop Control into 4 Agents", - "ogTitle_zh": "把 Windows 桌面控制接进 4 款 AI Agent" - }, - "why-your-windows-mcp-calls-silently-fail": { - "evidence": "CONTROL_PREEMPTED killed · 10s idle gate bypassed", - "ogTitle_en": "Why Windows MCP Calls Silently Fail", - "ogTitle_zh": "攻破 Windows 桌面 MCP 10 秒空闲门禁" - }, - "when-to-give-your-agent-physical-clicks": { - "evidence": "API > CLI > CUA > Physical clicks · 4-tier matrix", - "ogTitle_en": "When to Give Your Agent Physical Clicks", - "ogTitle_zh": "什么时候该让 AI 操控物理鼠标" - }, - "the-single-writer-rule-for-coding-agents": { - "evidence": "1 write process · 0 merge collisions · isolated review", - "ogTitle_en": "The Single-Writer Rule for AI Agents", - "ogTitle_zh": "代码只让一个 AI 改:单写多审架构" - }, - "slashing-agent-context-with-a-code-graph": { - "evidence": "AST graph indexing · 80% token churn cut · 0 hallucination", - "ogTitle_en": "Slashing Context With Code Graph", - "ogTitle_zh": "用 Code Graph 斩断 Token 膨胀与遗忘" - }, - "why-multi-agent-coding-fails": { - "evidence": "Telephone game distortion · implicit architectural drift", - "ogTitle_en": "Why Multi-Agent Coding Fails", - "ogTitle_zh": "多 AI 写代码烂尾与隐式决策困境" - }, - "generating-full-length-songs-with-yue2-comfyui": { - "evidence": "60 songs - 9-part structure - 295s headroom cap" - }, - "when-lowering-crf-does-nothing-maxrate-deadlock": { - "evidence": "CRF 19→14 · SSIM +0.00003 · 106.2h wasted", - "ogTitle_en": "When Lowering CRF Does Nothing", - "ogTitle_zh": "降低 CRF 为何毫无效果:maxrate 死锁" - }, - "why-ffmpeg-map-0-breaks-your-mp4-and-mkv-remux": { - "evidence": "-map 0 copy · tx3g CC · udta/name dual-write", - "ogTitle_en": "Why ffmpeg -map 0 Breaks Remux", - "ogTitle_zh": "ffmpeg -map 0 搞崩跨容器混流" - }, - "traefik-yaegi-plugin-package-name-trap": { - "evidence": "Yaegi lookup · hyphen to underscore · panic", - "ogTitle_en": "Traefik Yaegi Plugin Package Trap", - "ogTitle_zh": "Traefik Yaegi 插件启动崩溃陷阱" - }, - "architecting-sea-payment-and-offline-licensing-pipelines": { - "evidence": "toyyibPay FPX · FOR UPDATE · Ed25519 offline", - "ogTitle_en": "SEA Payment & Offline Licensing", - "ogTitle_zh": "东南亚网银支付与离线机器码授权" - }, - "batch-generating-80-technical-covers-with-comfyui": { - "evidence": "89 covers in 48m · 35% safe zone · Laplacian filter", - "ogTitle_en": "Batch Generating 80+ Technical Covers", - "ogTitle_zh": "ComfyUI 批量闭环 80+ 张技术封面" - }, - "when-a-proxy-timeout-returns-html-instead-of-json": { - "evidence": "13.6 s -> 0.26 s · 2507 s worst · 499 at the gate", - "ogTitle_en": "The Proxy That Replied in HTML", - "ogTitle_zh": "反代用 HTML 回答了 JSON", - "tags": [ - "nginx", - "timeouts", - "caching" - ] - }, - "read-amplification-504-gateway-timeout-swr-cache": { - "evidence": "4 reads/file · 960 per page · 0.3 µs cache hit" - }, - "authentik-oidc-redirect-loop-node-set-header-overwrite": { - "evidence": "Set-Cookie overwrite · 0 server errors · 21 links verified" - }, - "six-chrome-containers-locked-my-nas-btrfs-d-state-igpu-offload": { - "evidence": "7.5 GB RAM freed · Load 27.4 → 6.8 · iGPU render node" - }, - "cascading-docker-failures-nocodb-heap-limit-starved-n8n": { - "evidence": "768 MB OOM · max-old-space-size 1536 · 100% workflow health" - }, - "apple-icloud-smtp-port-465-timeout-starttls-587-trap": { - "evidence": "Port 465 timeout · 587 STARTTLS only · exit code 0" - }, - "home-assistant-container-upgrade-ladder-four-hops": { - "evidence": "13 releases · 4-hop ladder · 259 → 265 entities intact" - } + "_about": "Inputs for scripts/og-gen/render_from_art.mjs ('one art, four targets'). One entry per post: `art` = the zero-text base frame (default /.png), `evidence` = the short factual line shown in the card's evidence bar (REQUIRED, written by hand — never derived), optional `ogTitle_en` / `ogTitle_zh` = shortened display titles for the card only (consultant question 1, option C: the article keeps its real title), optional `tags` = override the three badge tags. Cards render from the post's own frontmatter (title/description/category) unless an ogTitle override is present.", + "_status": "73 of 73 posts have a hand-written evidence line; base art is generated from C:/AI/ideogram4/captions/.json", + "running-ai-video-locally-on-a-12gb-gpu": { + "evidence": "1280x736 -> 1080p - 32 min / 5 s - $0", + "ogTitle_en": "AI Video on a 12 GB GPU", + "ogTitle_zh": "12GB 显卡跑 1080p 视频" + }, + "adding-a-domain-to-someone-elses-mail-server": { + "evidence": "4 DNS records · 554 antispam reject" + }, + "adding-english-mode-to-a-chinese-only-web-app": { + "evidence": "no browser API · sub_filter EN mode" + }, + "ai-furniture-compositing-with-flux-kontext": { + "evidence": "kontext multi-image · tainted canvas fix" + }, + "authentik-css-greater-than-bug": { + "evidence": "1 escaped '>' · CSS silently dropped" + }, + "authentik-forward-auth-gate-wasnt-live": { + "evidence": "host 302 · public 200 · 2 ingress layers" + }, + "authentik-major-upgrade-gotchas": { + "evidence": "2025.8 → 2026.8 · auth_flow mixup" + }, + "automating-cyberpanel-without-the-ui": { + "evidence": "v2 JSON API gone · session + CSRF" + }, + "best-ai-video-generators-2026": { + "evidence": "free vs paid · local LTX-2.3 test" + }, + "calibrating-intel-quick-sync-hevc-quality": { + "evidence": "ICQ 28-30 cliff · fast == medium" + }, + "chainlink-vrf-v2-lottery-contract": { + "evidence": "VRF v2.5 · mock-funding bug" + }, + "docker-reported-exit-0-the-oom-killer-disagreed": { + "evidence": "exit 0 · dmesg: 6x cgroup OOM kills" + }, + "does-hevc-actually-shrink-your-files": { + "evidence": "NVENC cq27 bigger · x265 -10-22%" + }, + "embedding-fonts-so-a-pdf-looks-the-same-everywhere": { + "evidence": "4 families · 8 faces · 2 renderers" + }, + "every-player-stuttered-the-file-was-fine": { + "evidence": "5818/5818 intervals · 0 duplicate PTS" + }, + "five-step-ai-roadmap-what-i-actually-run": { + "evidence": "whisper + mem0 in production · step 4 skipped" + }, + "fully-on-chain-svg-nfts": { + "evidence": "base64 SVG in tokenURI() · mood flip on-chain" + }, + "hardening-a-tor-onion-service": { + "evidence": "bind 0.0.0.0:80 denied · onion v3" + }, + "hello-world": { + "evidence": "~140-container homelab · self-hosted" + }, + "how-i-built-the-digikedai-telegram-bot": { + "evidence": "Telegram + WhatsApp · LiteLLM gateway" + }, + "how-i-host-this-blog": { + "evidence": "git push · act_runner · nginx" + }, + "how-i-made-my-own-songs-with-suno-ai": { + "evidence": "7 songs · lyrics + prompts" + }, + "how-i-vetted-20-vps-providers-with-parallel-subagents": { + "evidence": "20 providers · 3 hours · subagents" + }, + "how-to-verify-a-hosting-provider-before-you-buy": { + "evidence": "rdap.org domain age · AUP read" + }, + "i-let-an-agent-manage-my-shopee-vouchers": { + "evidence": "mode=propose gate · RM140 voucher unapproved" + }, + "it-reported-success-nothing-had-changed": { + "evidence": "12.5 MB of 403 MB · rename never landed" + }, + "jpa-version-field-lost-update": { + "evidence": "@Version · stale PUT → 409" + }, + "loop-engineering-without-a-coding-agent": { + "evidence": "11 cron jobs · 8 zero-AI loops" + }, + "migrating-codeigniter-iis-to-openlitespeed": { + "evidence": "17,000-line CI4 · env() fatal" + }, + "my-backup-was-using-someone-elses-api-quota": { + "evidence": "1 TB restic seed · shared rclone quota" + }, + "n8n-v1-to-v2-upgrade-gotchas": { + "evidence": "1.x → 2.40.1 · 7 silent breaks" + }, + "nocodb-sso-is-a-licensed-feature": { + "evidence": "OIDC env accepted · first login crashes" + }, + "one-hostname-public-tracker-sso-dashboard": { + "evidence": "1 host · tracker public, dashboard SSO" + }, + "one-prometheus-for-unraid-synology-and-a-vps": { + "evidence": "3 hosts · 1 prometheus · 0 false panels" + }, + "passbolt-hang-three-failure-modes": { + "evidence": "null fingerprint · 3 failure modes" + }, + "patching-workbench-26-for-mariadb": { + "evidence": "26.7.0 TypeError · 3 patches" + }, + "putting-a-front-door-on-an-app-you-cant-modify": { + "evidence": "5879-byte SPA · 3 injected lines" + }, + "read-only-nocodb-dashboard-for-a-remote-database": { + "evidence": "SNAT source IP · 0 rows copied" + }, + "reading-a-containers-own-api-docs": { + "evidence": "4 docker commands · image is the spec" + }, + "replacing-rdpguard-with-ipban": { + "evidence": "RDPGuard 7.8.7 → IPBan 4.1.0 · 12 IPs" + }, + "running-production-infrastructure-solo": { + "evidence": "162 containers · 3 hosts · 78 compose stacks" + }, + "running-tts-as-a-service-with-token-sidecars": { + "evidence": "tokens expire 10 min / 1 h · sidecars" + }, + "scraping-bot-walled-marketplace-warm-browser-session": { + "evidence": "warm CDP session · split waits" + }, + "self-healing-digital-goods-entitlements": { + "evidence": "5 workflows · NocoDB + n8n + AList" + }, + "self-hosted-speech-to-text-api": { + "evidence": "whisper.cpp large-v3 · ~5x typing" + }, + "self-hosting-mem0-memory-stack": { + "evidence": "mem0 + LiteLLM + pgvector · :20015" + }, + "shipping-an-ai-photo-editor-as-a-wordpress-plugin": { + "evidence": "22 versions · fal.ai async queue" + }, + "smartctl-exit-code-32-skips-the-disks-that-matter": { + "evidence": "rc=32 is not failure · skips bad disks" + }, + "space-reclamation-wasnt-stuck-it-was-waiting": { + "evidence": "121 GiB returned · scheduled 09:29" + }, + "stop-writing-agent-prompts-for-deterministic-work": { + "evidence": "29 straight failures · 1 string compare" + }, + "syncing-a-self-improving-ai-agent-across-machines": { + "evidence": "git-backed profile · manual sync" + }, + "synology-api-401-with-the-correct-password": { + "evidence": "401 twice · 2 causes · 3 commands" + }, + "synology-spreadsheet-api-is-a-container": { + "evidence": "1515 APIs · 4 traps" + }, + "that-dying-ssd-was-just-a-bad-sata-cable": { + "evidence": "WRITE FPDMA timeout · 1 SATA cable" + }, + "the-cause-was-trim-not-the-ssds": { + "evidence": "corruption_errs 27 / 31 · queued TRIM" + }, + "the-nocodb-attachment-that-wouldnt-update": { + "evidence": "300 rows · 1 lookahead regex miss" + }, + "the-upstream-was-deleted-then-came-back-rewritten": { + "evidence": "repo 404 · 233 commits rewrite" + }, + "two-ways-a-javascript-file-stops-working-and-looks-fine": { + "evidence": "shadowed name · let below call" + }, + "unraid-stop-array-hangs-on-swapfile": { + "evidence": "8 GB swapfile pins /mnt/cache" + }, + "upgrading-codeigniter-46-to-47": { + "evidence": "4.6 → 4.7 · 2 unlisted fatals" + }, + "using-chinese-llm-apis-from-malaysia": { + "evidence": "GLM-5.3 · DeepSeek V4 · RMB top-up" + }, + "verifying-a-pdf-report-page-by-page": { + "evidence": "19 pages · every deviation < 2 pt" + }, + "vetting-an-open-source-dependency-before-you-bet-on-it": { + "evidence": "6 checks · grep beats the README" + }, + "when-smart-says-healthy-but-your-raid-is-corrupting-data": { + "evidence": "SMART healthy · checksum 0x8941f998" + }, + "why-500000-lines-of-commit-churn-only-left-230000-in-production": { + "evidence": "518,000 added · 235,000 kept · 5 repos" + }, + "why-chrome-forgets-its-tabs-in-a-container": { + "evidence": "RestoreOnStartup=1 · 70-line keeper" + }, + "why-i-still-bought-a-local-gpu": { + "evidence": "stronger frontier · local for retries + batch" + }, + "why-my-on-chain-nft-art-changed-on-windows": { + "evidence": "autocrlf CRLF · base64 differs" + }, + "why-telegram-bot-notifications-die": { + "evidence": "400 on sendPhoto · getMe fine · IPv6-only DNS" + }, + "why-your-cdp-clicks-silently-fail": { + "evidence": "scroll-behavior:smooth · rect expired" + }, + "why-your-grafana-dashboard-shows-no-data": { + "evidence": "41 panels No data · variable filtered itself" + }, + "why-your-headless-browser-cant-scrape-everything": { + "evidence": "Goofish blocks · Carousell serves" + }, + "your-disk-full-alert-is-lying": { + "evidence": "3% free = 500 GB · alert fires wrong way" + }, + "yue2-on-a-12gb-gpu-songs-that-lost-their-endings": { + "evidence": "12 takes - all 240.000 s - cap now 300 s" + }, + "generating-subtitles-for-songs-without-timestamps": { + "evidence": "18 songs - 342 lines - 0.96 anchor coverage" + }, + "why-i-built-a-video-knowledge-base": { + "evidence": "263 pages · 20ms search · 0 cloud STT fees" + }, + "how-i-built-an-automated-music-video-pipeline": { + "evidence": "LRC + Remotion 1080p · CDP upload · 8-lang subs published", + "ogTitle_en": "Automated MV Pipeline with Remotion & CDP", + "ogTitle_zh": "Remotion 与 Docker CDP 自动生成发布 MV" + }, + "uploading-large-videos-to-youtube-via-cdp": { + "evidence": "130MB video via Portainer archive PUT · 0 RAM spikes", + "ogTitle_en": "Upload 100MB+ Videos to YouTube via CDP", + "ogTitle_zh": "CDP 上传百兆视频:Docker 归档法" + }, + "debugging-remotion-video-jitter": { + "evidence": "bassScale 30fps tremor killed · 2-layer opacity crossfade", + "ogTitle_en": "Debugging Remotion Video Jitter", + "ogTitle_zh": "排查 Remotion 视频抽搐与透明度叠化" + }, + "self-hosted-tts-cosyvoice2-n8n-gpu": { + "evidence": "3.2GB VRAM · 300ms first-packet · 0 cloud API fees", + "ogTitle_en": "Self-Hosted Neural TTS with CosyVoice 2 & N8N", + "ogTitle_zh": "自建 CosyVoice 2 高保真语音栈与 N8N 联动" + }, + "why-is-my-tts-model-repeating-percent": { + "evidence": "URL percent-encoding trap killed · 2-layer defensive fix", + "ogTitle_en": "Why Your TTS Model Keeps Saying \"Percent\"", + "ogTitle_zh": "为什么本地语音合成一直在念 Percent?" + }, + "php2shell-patching-every-php-runtime-i-manage": { + "evidence": "8 public sites in 2 min · 7 on 8.5.12 · 8 dead rules" + }, + "giving-ai-your-mouse-and-keyboard-safely": { + "evidence": "PowerShell & Registry stripped · 0.5x downscale · 0 flash", + "ogTitle_en": "Safe Guardrails for Windows Desktop MCP", + "ogTitle_zh": "给 AI 鼠标键盘前的四道安全防线" + }, + "plugging-windows-desktop-control-into-four-ai-agents": { + "evidence": "1 Python 3.14 server · 4 agent configs · 19 native tools", + "ogTitle_en": "Plugging Windows Desktop Control into 4 Agents", + "ogTitle_zh": "把 Windows 桌面控制接进 4 款 AI Agent" + }, + "why-your-windows-mcp-calls-silently-fail": { + "evidence": "CONTROL_PREEMPTED killed · 10s idle gate bypassed", + "ogTitle_en": "Why Windows MCP Calls Silently Fail", + "ogTitle_zh": "攻破 Windows 桌面 MCP 10 秒空闲门禁" + }, + "when-to-give-your-agent-physical-clicks": { + "evidence": "API > CLI > CUA > Physical clicks · 4-tier matrix", + "ogTitle_en": "When to Give Your Agent Physical Clicks", + "ogTitle_zh": "什么时候该让 AI 操控物理鼠标" + }, + "the-single-writer-rule-for-coding-agents": { + "evidence": "1 write process · 0 merge collisions · isolated review", + "ogTitle_en": "The Single-Writer Rule for AI Agents", + "ogTitle_zh": "代码只让一个 AI 改:单写多审架构" + }, + "slashing-agent-context-with-a-code-graph": { + "evidence": "AST graph indexing · 80% token churn cut · 0 hallucination", + "ogTitle_en": "Slashing Context With Code Graph", + "ogTitle_zh": "用 Code Graph 斩断 Token 膨胀与遗忘" + }, + "why-multi-agent-coding-fails": { + "evidence": "Telephone game distortion · implicit architectural drift", + "ogTitle_en": "Why Multi-Agent Coding Fails", + "ogTitle_zh": "多 AI 写代码烂尾与隐式决策困境" + }, + "generating-full-length-songs-with-yue2-comfyui": { + "evidence": "60 songs - 9-part structure - 295s headroom cap" + }, + "when-lowering-crf-does-nothing-maxrate-deadlock": { + "evidence": "CRF 19→14 · SSIM +0.00003 · 106.2h wasted", + "ogTitle_en": "When Lowering CRF Does Nothing", + "ogTitle_zh": "降低 CRF 为何毫无效果:maxrate 死锁" + }, + "why-ffmpeg-map-0-breaks-your-mp4-and-mkv-remux": { + "evidence": "-map 0 copy · tx3g CC · udta/name dual-write", + "ogTitle_en": "Why ffmpeg -map 0 Breaks Remux", + "ogTitle_zh": "ffmpeg -map 0 搞崩跨容器混流" + }, + "traefik-yaegi-plugin-package-name-trap": { + "evidence": "Yaegi lookup · hyphen to underscore · panic", + "ogTitle_en": "Traefik Yaegi Plugin Package Trap", + "ogTitle_zh": "Traefik Yaegi 插件启动崩溃陷阱" + }, + "architecting-sea-payment-and-offline-licensing-pipelines": { + "evidence": "toyyibPay FPX · FOR UPDATE · Ed25519 offline", + "ogTitle_en": "SEA Payment & Offline Licensing", + "ogTitle_zh": "东南亚网银支付与离线机器码授权" + }, + "batch-generating-80-technical-covers-with-comfyui": { + "evidence": "89 covers in 48m · 35% safe zone · Laplacian filter", + "ogTitle_en": "Batch Generating 80+ Technical Covers", + "ogTitle_zh": "ComfyUI 批量闭环 80+ 张技术封面" + }, + "when-a-proxy-timeout-returns-html-instead-of-json": { + "evidence": "13.6 s -> 0.26 s · 2507 s worst · 499 at the gate", + "ogTitle_en": "The Proxy That Replied in HTML", + "ogTitle_zh": "反代用 HTML 回答了 JSON", + "tags": [ + "nginx", + "timeouts", + "caching" + ] + }, + "read-amplification-504-gateway-timeout-swr-cache": { + "evidence": "4 reads/file · 960 per page · 0.3 µs cache hit" + }, + "authentik-oidc-redirect-loop-node-set-header-overwrite": { + "evidence": "Set-Cookie overwrite · 0 server errors · 21 links verified" + }, + "six-chrome-containers-locked-my-nas-btrfs-d-state-igpu-offload": { + "evidence": "7.5 GB RAM freed · Load 27.4 → 6.8 · iGPU render node" + }, + "cascading-docker-failures-nocodb-heap-limit-starved-n8n": { + "evidence": "768 MB OOM · max-old-space-size 1536 · 100% workflow health" + }, + "apple-icloud-smtp-port-465-timeout-starttls-587-trap": { + "evidence": "Port 465 timeout · 587 STARTTLS only · exit code 0" + }, + "home-assistant-container-upgrade-ladder-four-hops": { + "evidence": "13 releases · 4-hop ladder · 259 → 265 entities intact" + }, + "why-you-cant-safely-shrink-a-btrfs-volume-in-five-seconds": { + "evidence": "820GB dirty cache · 0 data loss · 4-tier stack", + "ogTitle_en": "The 5-Second Btrfs Shrink Myth", + "ogTitle_zh": "5秒Btrfs缩容神话破灭" + }, + "tracking-down-ghost-uploads-across-nas-25gbe-interconnect": { + "evidence": "14 MB/s isolated · Load 4.22 -> 1.15 · 35GB saved", + "ogTitle_en": "14 MB/s Ghost Uploads on 2.5GbE", + "ogTitle_zh": "群晖 2.5GbE 14 MB/s 幽灵流量排障" + }, + "five-automated-quality-gates-for-video-transcoding": { + "evidence": "SSIM >= 0.995 · 10,000+ assets · 0 corrupt stubs", + "ogTitle_en": "5 Quality Gates for FFmpeg", + "ogTitle_zh": "视频转码流水线五道质量门禁" + } } \ No newline at end of file diff --git a/scripts/og-gen/banner-plan.json b/scripts/og-gen/banner-plan.json index 5469a18..c0db585 100644 --- a/scripts/og-gen/banner-plan.json +++ b/scripts/og-gen/banner-plan.json @@ -412,6 +412,30 @@ 768 ] }, + "five-automated-quality-gates-for-video-transcoding": { + "sw": 1922, + "sh": 1086, + "left": 590, + "top": 102, + "fill": [ + 15, + 23, + 31 + ], + "zoom": 1.414, + "silhouette": 0.47, + "cut": 0.0, + "band": [ + 757, + 125, + 1289, + 656 + ], + "source_size": [ + 1360, + 768 + ] + }, "five-step-ai-roadmap-what-i-actually-run": { "sw": 1990, "sh": 1124, @@ -1684,6 +1708,30 @@ 768 ] }, + "tracking-down-ghost-uploads-across-nas-25gbe-interconnect": { + "sw": 1915, + "sh": 1082, + "left": 585, + "top": 80, + "fill": [ + 8, + 15, + 19 + ], + "zoom": 1.408, + "silhouette": 0.47, + "cut": 0.0, + "band": [ + 756, + 122, + 1290, + 631 + ], + "source_size": [ + 1360, + 768 + ] + }, "traefik-yaegi-plugin-package-name-trap": { "sw": 1930, "sh": 1090, @@ -2188,6 +2236,30 @@ 768 ] }, + "why-you-cant-safely-shrink-a-btrfs-volume-in-five-seconds": { + "sw": 2021, + "sh": 1141, + "left": 639, + "top": 119, + "fill": [ + 8, + 12, + 17 + ], + "zoom": 1.486, + "silhouette": 0.47, + "cut": 0.0, + "band": [ + 753, + 125, + 1259, + 641 + ], + "source_size": [ + 1360, + 768 + ] + }, "why-your-cdp-clicks-silently-fail": { "sw": 1887, "sh": 1066, diff --git a/src/content/posts/five-automated-quality-gates-for-video-transcoding.md b/src/content/posts/five-automated-quality-gates-for-video-transcoding.md index ffbdbc4..e224c0c 100644 --- a/src/content/posts/five-automated-quality-gates-for-video-transcoding.md +++ b/src/content/posts/five-automated-quality-gates-for-video-transcoding.md @@ -8,7 +8,7 @@ category: engineering blueprint: self-hosted-infrastructure blueprintLayer: L1-compute-storage-network tags: ["ffmpeg", "python", "video-transcoding", "quality-assurance", "automation"] -draft: true +draft: false summary: audience: "Media Pipeline Engineers, Backend Developers & Infrastructure Architects" painPoint: "Naive batch FFmpeg scripts silently leave truncated files, desynchronized audio, and corrupted headers when encoders crash or network mounts stall." diff --git a/src/content/posts/tracking-down-ghost-uploads-across-nas-25gbe-interconnect.md b/src/content/posts/tracking-down-ghost-uploads-across-nas-25gbe-interconnect.md index b60b331..5c5a31d 100644 --- a/src/content/posts/tracking-down-ghost-uploads-across-nas-25gbe-interconnect.md +++ b/src/content/posts/tracking-down-ghost-uploads-across-nas-25gbe-interconnect.md @@ -8,7 +8,7 @@ category: devops blueprint: self-hosted-infrastructure blueprintLayer: L3-observability-self-healing tags: ["synology", "networking", "smb", "jellyfin", "observability", "linux"] -draft: true +draft: false summary: audience: "Systems Architects, Infrastructure Engineers & Private Cloud Operators" painPoint: "A primary storage node sustained an unexplained 14 MB/s outbound stream and elevated disk I/O wait (Load Average 4.2+), while edge WAN gateways and replication jobs sat completely idle." diff --git a/src/content/posts/why-you-cant-safely-shrink-a-btrfs-volume-in-five-seconds.md b/src/content/posts/why-you-cant-safely-shrink-a-btrfs-volume-in-five-seconds.md index 22e5fe5..a5566be 100644 --- a/src/content/posts/why-you-cant-safely-shrink-a-btrfs-volume-in-five-seconds.md +++ b/src/content/posts/why-you-cant-safely-shrink-a-btrfs-volume-in-five-seconds.md @@ -8,7 +8,7 @@ category: devops blueprint: self-hosted-infrastructure blueprintLayer: L1-compute-storage-network tags: ["synology", "btrfs", "lvm", "storage-architecture", "disaster-recovery", "linux"] -draft: true +draft: false summary: audience: "Enterprise Storage Architects, SREs & Linux Systems Engineers" painPoint: "External guides suggest shrinking enterprise NAS volumes (like Synology DSM) is a harmless 5-second operation using btrfs filesystem resize followed immediately by lvreduce." diff --git a/src/content/posts/zh/five-automated-quality-gates-for-video-transcoding.md b/src/content/posts/zh/five-automated-quality-gates-for-video-transcoding.md index d0766d2..05ac6ff 100644 --- a/src/content/posts/zh/five-automated-quality-gates-for-video-transcoding.md +++ b/src/content/posts/zh/five-automated-quality-gates-for-video-transcoding.md @@ -1,5 +1,5 @@ --- -ogImage: "/og/five-automated-quality-gates-for-video-transcoding.jpg" +ogImage: "/og/zh-five-automated-quality-gates-for-video-transcoding.jpg" banner: "/banners/five-automated-quality-gates-for-video-transcoding.jpg" title: "超越 FFmpeg 预设:生产级视频转码流水线的五道自动化质量门禁" description: "如何通过五道确定性校验门禁(PTS 对齐 SSIM >= 0.995、解复用损坏扫描、绕过页缓存的 SHA-256 回读校验),在大规模转码流水线中实现零损坏交付。" @@ -8,7 +8,7 @@ category: engineering blueprint: self-hosted-infrastructure blueprintLayer: L1-compute-storage-network tags: ["ffmpeg", "python", "video-transcoding", "quality-assurance", "automation"] -draft: true +draft: false summary: audience: "多媒体流水线工程师、后端研发与基础设施架构师" painPoint: "传统的 FFmpeg 批处理脚本过度依赖退出码 0,在编码器崩溃或网络存储抖动时,会静默产生截断文件、音画不同步与损坏的容器头。" diff --git a/src/content/posts/zh/tracking-down-ghost-uploads-across-nas-25gbe-interconnect.md b/src/content/posts/zh/tracking-down-ghost-uploads-across-nas-25gbe-interconnect.md index fa12586..47b270f 100644 --- a/src/content/posts/zh/tracking-down-ghost-uploads-across-nas-25gbe-interconnect.md +++ b/src/content/posts/zh/tracking-down-ghost-uploads-across-nas-25gbe-interconnect.md @@ -8,7 +8,7 @@ category: devops blueprint: self-hosted-infrastructure blueprintLayer: L3-observability-self-healing tags: ["synology", "networking", "smb", "jellyfin", "observability", "linux"] -draft: true +draft: false summary: audience: "系统架构师、基础设施工程师与私有云平台管理者" painPoint: "核心私有存储节点持续被 14 MB/s 的上传流量跑满并伴随高 I/O 负载(Load 4.2+),但边界路由出口与全部备份任务均处于空闲状态。" diff --git a/src/content/posts/zh/why-you-cant-safely-shrink-a-btrfs-volume-in-five-seconds.md b/src/content/posts/zh/why-you-cant-safely-shrink-a-btrfs-volume-in-five-seconds.md index 9d8adfd..c0b18a3 100644 --- a/src/content/posts/zh/why-you-cant-safely-shrink-a-btrfs-volume-in-five-seconds.md +++ b/src/content/posts/zh/why-you-cant-safely-shrink-a-btrfs-volume-in-five-seconds.md @@ -8,7 +8,7 @@ category: devops blueprint: self-hosted-infrastructure blueprintLayer: L1-compute-storage-network tags: ["synology", "btrfs", "lvm", "storage-architecture", "disaster-recovery", "linux"] -draft: true +draft: false summary: audience: "企业存储架构师、SRE 稳定性工程师与 Linux 高级运维工程师" painPoint: "网络社区流传所谓‘群晖在线缩容只需 5 秒’的教程,主张直接用 btrfs filesystem resize 配合 lvreduce 粗暴截断底层存储卷。"