---
title: Blog
description: Technical writing by Zeng Liangyi on frontend engineering, AI coding, developer tools and debugging.
image: "https://zengliangyi.com/og/default.png"
---

All posts

# Blog

Notes on frontend engineering and AI coding: problems, implementation choices and lessons learned.

- [#ChatCrystal](/en/blog/tag/chatcrystal)

- [#Node.js](/en/blog/tag/node-js)

- [#TypeScript](/en/blog/tag/typescript)

- [#SQLite](/en/blog/tag/sqlite)

- [#AI](/en/blog/tag/ai)

- [#Data parsing](/en/blog/tag/data-parsing)

- [#Knowledge management](/en/blog/tag/knowledge-management)

- [#MCP](/en/blog/tag/mcp)

- [#Claude Code](/en/blog/tag/claude-code)

- [#Electron](/en/blog/tag/electron)

[##  Fixing 1px Carousel Seams: Subpixel Layout and Scale Fixes

Debug 1px mobile carousel seams caused by subpixel rounding. Compare negative margins, CSS translation, and scale transforms to eliminate rendering gaps.          曾亮懿       October 13, 2026      5 min read

#CSS

#Web Development

#Swiper

#Performance](/en/blog/carousel-subpixel-1px-seam)    [##  Google Indexing in Astro: Incremental Cache-Driven Submissions

How to fix Google indexing deadlocks in static Astro sites using incremental cache-driven API submissions, Git SHA hashing, and sitemap lastmod timestamps.          曾亮懿       October 13, 2026      4 min read

#Astro

#SEO

#Google

#Automation](/en/blog/google-indexing-incremental-cache)    [##  AI Conversation Formats: JSONL Events vs SQLite Snapshots

Compare 5 AI adapter formats: separate JSONL events from SQLite keys, and inspect indexed, orphan, and unknown-version chat transcripts in memory stores.          曾亮懿       October 7, 2026      4 min read

#ChatCrystal

#Node.js

#SQLite](/en/blog/ai-conversation-format-divergence)    [##  How Claude Code, Cursor, Copilot, and Trae Store Chats on Disk

Compare Claude Code, Cursor, Copilot, and Trae storage paths. Distinguish raw copies from exports, and verify migration retention with test manifests.          曾亮懿       October 7, 2026      4 min read

#ChatCrystal

#Node.js

#SQLite](/en/blog/ai-conversation-management-options)    [##  Five AI conversation parsers: retained fields and loss boundaries

Build an acceptance matrix from Claude Code, Codex, Cursor, Trae, and Copilot parsers, checking tool flags, thinking, order, and snapshot coverage.          曾亮懿       October 7, 2026      4 min read

#ChatCrystal

#TypeScript

#Node.js](/en/blog/ai-conversation-parser-boundaries)    [##  AI SDK Provider Abstraction: Capabilities and Protocols

Test 7 ChatCrystal providers and AI SDK factories with offline mocks for Responses, Chat Completions, embeddings, and structured output rejection.          曾亮懿       October 7, 2026      4 min read

#ChatCrystal

#Node.js

#TypeScript](/en/blog/ai-sdk-provider-abstraction)    [##  Bulk import with 1000 conversations: cost and performance checks

Separate parsing, SQL writes, WASM export, and summary queues; use synthetic inputs to check retention and data equivalence.          曾亮懿       October 7, 2026      4 min read

#ChatCrystal

#SQLite

#Performance](/en/blog/bulk-import-performance-plan)    [##  CLI knowledge workflows: exits, JSON contracts, and final states

Check current CLI commands and JSON shapes; reject false success with synthetic process and per-ID state checks before scheduling and recovery.          曾亮懿       October 7, 2026      4 min read

#ChatCrystal

#CLI

#Automation](/en/blog/cli-knowledge-workflow)    [##  Review AI coding conversations: denominators, quality, and reuse

Audit source and length denominators, false accepts and rejects, and empty samples; separate current filtering, summaries, and measured reuse.          曾亮懿       October 7, 2026      5 min read

#ChatCrystal

#Knowledge management

#Evaluation](/en/blog/conversation-knowledge-retrospective)    [##  Fastify and Electron: Desktop Startup & Shutdown Boundaries

Trace ChatCrystal local, cloud, and onboarding modes, verify CommonJS loading and port contention, and inspect window and shutdown boundaries.          曾亮懿       October 7, 2026      5 min read

#ChatCrystal

#Node.js

#Electron](/en/blog/fastify-electron-service-lifecycle)    [##  Graph-Assisted Refactoring: Turning Relational Clues into Checks

Turn note and code graph relations into verifiable fault checks: trace candidate edges, check dependencies, and avoid treating links as proof.          曾亮懿       October 7, 2026      5 min read

#ChatCrystal

#Knowledge graph

#Testing](/en/blog/graph-assisted-refactoring)    [##  MCP Boundaries: Discovery, Identity, and Call Permissions

Examine Model Context Protocol boundaries: tool discovery, server instance tracking, and execution permissions in reviewable developer environments.          曾亮懿       October 7, 2026      4 min read

#ChatCrystal

#MCP

#Node.js](/en/blog/mcp-protocol-boundaries)

##  From writing to code

Explore ChatCrystal, developer tools and daily learning notes on my GitHub. Questions about the implementation are welcome.

[Visit my GitHub](https://github.com/ZengLiangYi)

```json
{
  "@context": "https://schema.org",
  "@type": "WebSite",
  "name": "ZengLiangYi Blog",
  "alternateName": [
    "Zeng Liangyi",
    "ZengLiangYi",
    "zengliangyi.com"
  ],
  "url": "https://zengliangyi.com",
  "description": "曾亮懿的个人网站。记录 AI Native 探索、开发者工具与全栈产品实践。"
}
```
