# Encore Shao — Personal Blog > Personal blog of Encore Shao, a full-stack engineer and AI researcher based in Shanghai. Writing on Rails/Ruby engineering, agentic AI systems, open-source gems, and lessons from shipping production software. This is a bilingual site (English and Chinese). Each article below is a standalone Markdown-rendered page. See /llms-full.txt for the complete text of every article in one file. ## Articles (English) - [encore-skills: Stop Re-Teaching Your AI](https://blog.icmoc.com/en/13-encore-skills-gitlab-loop): I kept re-teaching the same GitLab workflow to Claude Code, Cursor, and Codex, until an MR shipped with no issue number linked — so I built one skills library that talks to all three. - [More Than a Decade Building a VC Intelligence Platform](https://blog.icmoc.com/en/11-vc-intelligence-platform): What it actually takes to build a venture capital intelligence platform — data quality problems, 30+ integrations, and the infrastructure that makes it run at 3am. - [Setting Up PostgreSQL 10 Streaming Replication the Hard Way](https://blog.icmoc.com/en/10-postgres-replication): What it actually takes to get Postgres streaming replication working between two local VMs — without skipping the parts that matter. - [Building github-trending: From a Cron Script to a React App](https://blog.icmoc.com/en/09-github-trending): I wanted to track what was rising on GitHub each week without manually scrolling. A Node.js script became a full React app — here's what that journey looked like. - [Building bamboohr-mcp: An MCP Server for HR APIs](https://blog.icmoc.com/en/01-bamboohr-mcp): I wanted to let any LLM talk to BambooHR's API. Three days later I had a production MCP server in TypeScript. Here's exactly what I built and what surprised me along the way. - [AI-Powered Bookmark Dashboard: A Chrome Extension Story](https://blog.icmoc.com/en/03-bookmark-dashboard): Replacing the new tab page with something actually useful — how I built a bookmark dashboard powered by agentic AI, and what I'd do differently. - [Agentic AI in Production: What I Learned Building RanBOT](https://blog.icmoc.com/en/04-agentic-ai-ranbot): Autonomous workflows sound great until they hit the real world. Twelve months of running agentic systems in production, and the lessons I keep coming back to. - [The Whiteboard That Fired My Video Editor](https://blog.icmoc.com/en/14-excalidraw-recording): I kept losing forty minutes to captions and cropping after every client walkthrough, until I built a whiteboard that records, transcribes, and exports itself. - [10 Years of Rails: What I Still Reach For Every Day](https://blog.icmoc.com/en/05-ten-years-rails): Not a framework review. A personal account of which Rails patterns aged well, which didn't, and what I've built that I'm still proud of. - [Building TrendShop: When AI Meets Fashion Discovery](https://blog.icmoc.com/en/06-trendshop): How we built a social fashion platform powered by AI recommendation — what worked, what the users actually wanted, and the pivot we almost didn't make. - [WorkflowPro: Building Office Automation That Actually Gets Used](https://blog.icmoc.com/en/08-workflowpro): How I built an approval workflow system for an elevator manufacturer that ran three years without downtime — and what I learned about getting enterprise software right the first time. - [ruby-office365: A Ruby Client for Microsoft Graph](https://blog.icmoc.com/en/12-office365-ruby-gem): Why I built a small Ruby gem for Office 365 instead of using what already existed, and what it actually looks like to pull mail, calendars, and contacts through it. - [Building a Ruby Wrapper for the Crunchbase API](https://blog.icmoc.com/en/07-crunchbase-ruby): What I learned wrapping a third-party API in idiomatic Ruby — rate limits, authentication flows, model design, and the V3 to V4 migration I didn't see coming. - [china_regions: Lessons from a Ruby Gem](https://blog.icmoc.com/en/02-china-regions): What I learned shipping a Ruby library for Chinese administrative regions — and why documentation matters more than the code itself. ## 中文 (Chinese) - [encore-skills:别再重复教你的 AI](https://blog.icmoc.com/zh/13-encore-skills-gitlab-loop): 同一套 GitLab 工作流,我在 Claude Code、Cursor、Codex 里各教了一遍,直到某天一个 MR 漏了 issue 编号——于是干脆做了一个三端共用的技能库。 - [十余年,为风投构建一套情报平台](https://blog.icmoc.com/zh/11-vc-intelligence-platform): 做一套风投情报平台真正需要什么——数据质量、三十多个集成、以及让系统在凌晨三点还能跑的那些无聊基础设施。 - [用 Vagrant 搭建 PostgreSQL 10 主从复制](https://blog.icmoc.com/zh/10-postgres-replication): 团队只有一台数据库,没有备份节点。我用两台虚拟机把流复制从头搭了一遍,搞清楚每一步为什么这么做。 - [github-trending:从一个定时脚本到 React 应用](https://blog.icmoc.com/zh/09-github-trending): 我想每周追踪 GitHub 上快速上升的项目,不想靠手动刷页面。一个 Node.js 脚本最后变成了一个完整的 React 应用——记录这个过程。 - [开发 bamboohr-mcp:让 AI 直接对话 HR 系统](https://blog.icmoc.com/zh/01-bamboohr-mcp): 我想让任何 LLM 都能直接调用 BambooHR 的 API。三天后,一个生产可用的 MCP 服务器诞生了。记录整个过程,以及那些出乎意料的收获。 - [AI 书签仪表盘:一个 Chrome 扩展的开发故事](https://blog.icmoc.com/zh/03-bookmark-dashboard): 用真正有用的东西替换新标签页——我如何开发了一个 AI 驱动的书签仪表盘,以及我下次会怎么做。 - [生产环境中的 Agentic AI:RanBOT 带给我的十二个月](https://blog.icmoc.com/zh/04-agentic-ai-ranbot): 自主工作流听起来很美,直到碰上真实世界。十二个月在生产环境运行 AI Agent 系统的经验,以及那些我一再想起的教训。 - [这块白板,把我的剪辑软件炒了鱿鱼](https://blog.icmoc.com/zh/14-excalidraw-recording): 每次给客户录完讲解都要搭四十分钟补字幕、调裁切,直到我做了一块能自己录制、自己转录、自己导出的白板。 - [写了十年 Rails:那些我至今每天都在用的东西](https://blog.icmoc.com/zh/05-ten-years-rails): 这不是一篇框架评测,而是一份个人记录——哪些 Rails 模式经受住了时间考验,哪些没有,以及我仍然为之骄傲的几个项目。 - [构建 TrendShop:当 AI 遇上时尚发现](https://blog.icmoc.com/zh/06-trendshop): 我们做了一个由 AI 推荐驱动的社交时尚平台。用户说他们想要什么,和他们真正做了什么,完全是两回事。 - [WorkflowPro:做一个真正被人用的企业自动化系统](https://blog.icmoc.com/zh/08-workflowpro): 为一家电梯制造商开发的审批工作流系统,运行三年从未宕机。我学到了什么叫第一次就把企业软件做对。 - [ruby-office365:一个 Microsoft Graph 的 Ruby 客户端](https://blog.icmoc.com/zh/12-office365-ruby-gem): 为什么我没用现成方案,而是自己写了个 Office 365 的 Ruby Gem——以及用它拉邮件、日历、联系人到底是什么样子。 - [为 Crunchbase API 开发一个 Ruby 封装库](https://blog.icmoc.com/zh/07-crunchbase-ruby): 把一个第三方 API 包装成惯用 Ruby 的过程中,我学到了什么——限流、认证流程、模型设计,以及那次我没预料到的 V3 到 V4 迁移。 - [china_regions:一个 Ruby Gem 的诞生](https://blog.icmoc.com/zh/02-china-regions): 我为什么要写一个中国行政区划的 Ruby 库,为什么文档比代码本身更重要,以及那 Gem 背后真正的原因。 ## Optional - [Full text of every article](https://blog.icmoc.com/llms-full.txt): all EN/ZH posts inlined in one file - [English RSS feed](https://blog.icmoc.com/rss.xml) - [Chinese RSS feed](https://blog.icmoc.com/zh/rss.xml) - [Sitemap](https://blog.icmoc.com/sitemap-index.xml)