TIL: Tự động hóa quy trình viết blog với AI Agent và Obsidian Headless
Viết blog kỹ thuật đều đặn dễ bị gián đoạn bởi các bước lặp đi lặp lại — format bài, thêm frontmatter, push lên GitHub. Với sự hỗ trợ của AI agent, toàn bộ phần đó được tự động hóa; người viết chỉ cần tập trung vào nội dung thực sự cần truyền đạt.
Kiến trúc tổng thể#
Obsidian Daily Note (## TIL seed)
│
▼
ob sync (Obsidian Headless)
│
▼
Hermes Agent (cron 21h)
│
├── viết TIL đầy đủ
├── lưu vào Blog/Publish/
└── ob sync (push lên cloud)
│
▼
Discord review
│
▼
git push → Cloudflare Pages (auto deploy)
Các thành phần#
Obsidian Headless (ob) là CLI client chính thức cho Obsidian Sync, cho phép đồng bộ vault trên môi trường headless (server, CI) mà không cần desktop app. Sử dụng cùng cơ chế end-to-end encryption như ứng dụng desktop.
Setup một lần trên server:
# 1. Đăng nhập tài khoản Obsidian
ob login
# 2. Liên kết vault local với remote vault
cd /path/to/vault
ob sync-setup --vault Main --path .
# → prompt nhập E2E encryption password
Sau khi setup, lệnh sync hàng ngày:
cd /path/to/vault && ob sync
ob sync thực hiện một lần đồng bộ hai chiều (bidirectional), conflict strategy mặc định là merge. Cần chạy trước khi đọc và sau khi ghi file để đảm bảo nhất quán với các thiết bị khác.
Hermes Agent là AI agent chạy nền trên VPS, có khả năng đọc file hệ thống, gọi terminal, và tương tác qua Discord. Cron job được cấu hình chạy lúc 21h mỗi ngày với prompt chứa toàn bộ logic xử lý.
Quy trình xử lý TIL:
- Đọc
Daily Notes/YYYY-MM-DD.md, trích nội dung dưới## TIL - Expand seed thành bài viết hoàn chỉnh (~200–400 từ) với cấu trúc rõ ràng
- Ghi file
Blog/Publish/TIL-DD-MM-YYYY-<slug>.mdvới frontmatter TOML đúng format Hugo - Sync lại lên Obsidian cloud
Quy trình xử lý full post: Nếu tồn tại file Blog/Draft/DD-MM-YYYY-Title.md trong vault, agent tự detect và xử lý song song với TIL trong cùng một lần chạy.
Review và xác nhận: Agent gửi toàn bộ nội dung draft qua Discord để review. Đây là bước kiểm soát thủ công duy nhất trong pipeline — không có gì được publish mà không qua xác nhận.
Publish lên blog: Sau khi xác nhận, agent copy file từ Blog/Publish/ sang repo Hugo local, commit và push lên GitHub. Cloudflare Pages nhận webhook và deploy tự động.
Frontmatter và cấu trúc file#
Blog sử dụng Hugo với theme PaperMod, config dạng TOML. Frontmatter của mỗi bài:
+++
title = "Tiêu đề bài"
date = "YYYY-MM-DDT21:00:00+07:00"
author = "dhphong"
tags = ["tag1", "tag2"]
description = "Mô tả ngắn"
showFullContent = false
readingTime = false
+++
File publish được đặt tên theo convention TIL-DD-MM-YYYY-slug.md hoặc Post-DD-MM-YYYY-slug.md, lưu trong Blog/Publish/ trên Obsidian — tách biệt với draft để dễ quản lý.
Kết quả#
Toàn bộ quy trình rút xuống còn một bước duy nhất từ phía người viết: ghi seed vào Daily Note. Phần còn lại — expand nội dung, format, sync, review, push — do pipeline xử lý tự động.