# Henry Chen

> Agentic engineer · Fullstack developer · Photographer, based in Sydney, New South Wales, Australia.

Personal site of Henry Chen — 8 projects, 8 blog posts and 91 photographs, in English and Chinese.
Chinese pages live under the /zh prefix of every path below; this document indexes the English ones, which are canonical.

## Site

- [Home](https://misoto22.com): index of work, writing and photography
- [About](https://misoto22.com/about): background and skills
- [Experience](https://misoto22.com/experience): work history and education
- [Projects](https://misoto22.com/projects): portfolio with live demos and source
- [Blog](https://misoto22.com/blog): technical writing
- [Photography](https://misoto22.com/photography): gallery with EXIF metadata
- [Agent Skills](https://misoto22.com/skills): installable Claude Code skills
- [Ask](https://misoto22.com/ask): grounded Q&A over this site
- [Music](https://misoto22.com/music): listening history
- [Stats](https://misoto22.com/stats): public site analytics
- [Contact](https://misoto22.com/contact): contact form and social links

## Writing (latest 8 of 8)

- [Where Should My Data Live?](https://misoto22.com/blog/where-should-my-data-live): 2026 — What limits how well we use AI stopped being model capability a while ago — it's that the data about me isn't mine. Any product can be swapped out; the only thing keeping you in place is the context that has settled inside it. I built a personal database to fix that, and building it showed me it's only a mirror.
- [From a Website Assistant to a Personal Knowledge Interface](https://misoto22.com/blog/building-a-rag-chatbot): 2026 — What began as a cited Q&A assistant for this site became two interfaces over Kioku: a public RAG path for visitors and a private MCP tool surface for my AI, sharing one source of truth without sharing permissions.
- [Ghostty + Tmux: One Tab Per Project, One Pane for Claude, One for the App](https://misoto22.com/blog/my-ghostty-setup): 2026 — How I use Ghostty tabs as project slots and tmux as the split manager — why tabs stay visible, why splits live in tmux, and the config choices that make eight projects open at once stop feeling like eight projects open at once.
- [Three Ways to Run Claude Code in Parallel](https://misoto22.com/blog/claude-code-parallel-development): 2026 — Worktrees, agent teams, and in-conversation subagents — when to reach for each, how they actually work under the hood, and the tradeoffs I've hit using them day-to-day.
- [My Claude Code IDE: Zed for Review, Ghostty and tmux for the Agent](https://misoto22.com/blog/my-claude-code-terminal): 2026 — Why I split the editor and the agent across two apps, how tmux keeps Claude Code sessions alive when the window closes, and the small configuration quirks that make it all feel native.
- [My 2026 Mac App Stack](https://misoto22.com/blog/my-2026-mac-apps): 2026 — Thirteen Mac apps I use every day as a developer — from terminals and editors to voice input, remote access, and credential management. Each one solves a specific problem.
- [How I Set Up Claude Code as My Daily Development Companion](https://misoto22.com/blog/my-claude-code-setup): 2026 — A walkthrough of Claude Code from the ground up — what it is, how configuration scopes work, and the rules, plugins, hooks, auto memory, and CLI glue that make it click for day-to-day engineering work.
- [Next.js Rendering: CSR, SSR, SSG, ISR Explained](https://misoto22.com/blog/nextjs-rendering-methods): 2025 — A practical breakdown of CSR, SSR, SSG and ISR in Next.js App Router — with code examples, data flow diagrams, and real use cases.

## Projects

- [INOVIT Dealer Portal](https://misoto22.com/projects/dealer-portal): A B2B e-commerce platform replacing a legacy .NET ERP — 49 API endpoints, 4-region database routing, cross-repo OpenAPI type generation, and zero-downtime migration on a shared production SQL Server. — Stack: React 19, TypeScript, Django 5, DRF, SQL Server, Ant Design 6
- [EFFICIENT System](https://misoto22.com/projects/efficient-system): A multi-tenant wheels and tyres ERP and commerce platform — one Django backend, a shared React UI kit, five portals, a storefront, a Rust CLI with an MCP server. My layer is the one underneath: an engineering contract of 160 rules that no repository is allowed to copy, and the agent workflows that hold fifteen repositories to it. — Stack: Agent Skills, Claude Code, Python, Django, React
- [SlateCourt - Badminton Venues & Games](https://misoto22.com/projects/slatecourt): A mobile-first PWA for Sydney badminton: a 54-venue directory with live court availability aggregated from the venues' own public booking pages, a game ledger with bill-splitting and a gear log, plus friends, groups and notifications. A personal, non-commercial demo — bilingual, self-hosted, registration by invite code only. — Stack: Next.js 16, TypeScript, FastAPI, Python, PostgreSQL, Redis
- [Personal Website](https://misoto22.com/projects/personal-website): A bilingual portfolio with an AI assistant grounded in the site's own content, privacy-first analytics, blog, photography gallery, and WCAG AAA accessibility — 17 pages, 17 API routes, self-hosted on my own Docker stack, all solo-built. — Stack: Next.js 16, React 19, TypeScript, Tailwind CSS, PostgreSQL + pgvector, Docker
- [Lumia Crystal - E-commerce Platform](https://misoto22.com/projects/lumia-crystal): A modern headless e-commerce platform for crystal jewelry brand. Built with Next.js 15 and Shopify Storefront API, featuring real-time product catalog, shopping cart, search with filtering, and responsive design with OKLCH color system. — Stack: Next.js, TypeScript, Tailwind CSS, Shopify API, React
- **Smart Vision Hat**: An IoT-based wearable device designed to assist visually impaired individuals. Built with Raspberry Pi and a YOLOv8 object detection model, it provides real-time audio feedback and emergency alerts. — Stack: Raspberry Pi, Python, Flask, Firebase, YOLOv8, OpenCV
- **Parallel Fish School Search**: A high-performance computing project simulating fish school behavior using C, OpenMP, and MPI. Achieved massive speedups on the Setonix supercomputer through thread/process-level optimization. — Stack: C, OpenMP, MPI, Bash
- **Australia EOI Points Calculator**: A modern web application for calculating points for Australian Expression of Interest (EOI) for skilled migration visas. Features real-time calculation, bilingual support, responsive design, and dark/light mode. — Stack: Next.js, TypeScript, Tailwind CSS, i18next, Framer Motion

## Agent Skills

- [email](https://misoto22.com/skills/email): Draft, reply to, forward, format, send, or verify outbound email under a policy — drafting is the default, and sending stays blocked until a narrow local scope authorizes that exact message. Use when recipients, external disclosure, attachments, authorization, HTML bodies, or Sent-folder confirmation matter, and on requests such as write an email to, reply to this thread, draft a note to the client, forward this with a cover note, send it and confirm it arrived, 写封邮件给, 回一下这个, 帮我发出去, 这封邮件再改改. Not for triaging or summarising a mailbox you are not answering, chat and internal notes, or rewriting how a message sounds without sending it.
- [tempering](https://misoto22.com/skills/tempering): Rewrites blunt, sarcastic, or impatient workplace messages into professional ones that retain the underlying request, offering three registers from collegial to formally documented. Use when a draft is addressed to a colleague, manager, client, vendor, or cross-team counterpart and carries visible frustration — sarcasm, blame, exasperation, ultimatums, or lines such as "are you serious", "脑子有问题", "到底做不做", "有没有一个准信". Trigger on requests to make a message professional, soften it, tone it down, check whether it is too harsh, or work out how to say something without damaging the relationship, including 润色一下, 帮我改得客气点, 这样发出去会不会太冲, 怎么说才不得罪人. Also handles the reverse direction — plain-language interpretation of corporate phrasing when asked what a message actually means, 说人话, or decode this. Not for marketing copy, resumes, blog posts, or grammar cleanup without interpersonal stakes.
- [personal-blog](https://misoto22.com/skills/personal-blog): Use when researching, outlining, drafting, revising, or polishing a personal blog article—an explainer, idea essay, personal essay, cultural review, or technical post—or when asked to preserve voice in a personal blog draft, turn notes into a personal blog post, 写博客, or 写一篇博客. Not for newsletters, magazine profiles, manuscript editing, email, chat, repository documentation, marketing copy, fiction, academic papers, or generic grammar cleanup.
- [repo-polish](https://misoto22.com/skills/repo-polish): Build or restore a repository's public face — README, hero banner, LICENSE, SECURITY.md, CONTRIBUTING.md, the forge's one-line About text, and its GitHub or GitLab topics — written from what the repository's own files say. Every pass runs unless flags narrow it. Use when asked to 装修一下仓库, 仓库装修, 美化仓库, 把开源文件补齐, 写个 readme, 加个 license, 补个安全策略, 设置仓库 topics, 仓库描述写一下, polish this repo, set the repo up properly, add a security policy, fill in the repository description, or tag a repository on GitHub. Not for API reference docs, changelogs, release notes, marketing landing pages, or the source code itself.
- [sync](https://misoto22.com/skills/sync): Bring the local repository in line with its remote — fetch, prune, fast-forward the base branch, and report what diverged. It never rebases a feature branch, never resolves a conflict, and never discards a local commit. Use when asked to sync, pull latest, update from main, get up to date, catch up with remote, 同步一下, 拉一下最新的, 更新到最新, 跟 main 对齐, 更新一下代码. Not for shipping changes, deleting merged branches, or resolving a merge conflict.
- [ship](https://misoto22.com/skills/ship): Ship the current changes as a merged pull request — branch off, run the project's tests, commit, open the PR, wait for CI, merge, and clean up the worktree. Runs a preflight first that marks each step RUN or SKIP, so a clean tree on the base branch exits without doing anything. Use when asked to ship it, ship this, land it, get this merged, open a PR and merge it, push this up and merge, 发出去, 合掉, 开个 PR 合了, 把这些改动提上去, 推上去合并. Not for tagging a release, publishing a package, deploying, or writing a commit message without pushing it.
- [cleanup](https://misoto22.com/skills/cleanup): Remove what shipping left behind — local and remote branches whose pull request merged, worktrees for those branches, and ignored residue a move stranded, such as a __pycache__ that git mv could not see. Every deletion is verified against the forge first, and anything unmerged or unexplained is reported rather than removed. Use when asked to clean up, tidy the repo, delete merged branches, remove stale branches, prune the remote branches, clear out old worktrees, 清理一下, 清掉合并过的分支, 删掉没用的分支, 清理远程分支, 收拾一下仓库. Not for discarding uncommitted work, resetting a branch, or removing untracked files you have not been shown.
- [synastry](https://misoto22.com/skills/synastry): Use when two people's birth details need an uncertainty-aware JSON v2 synastry calculation, including 合盘, 星盘配对, exact times, bounded time windows, or date-only records. Not for interpreting an existing v2 artifact, legacy TXT, one-person natal charts, transits, forecasts, predictions, or compatibility scores.
- [synastry-reading](https://misoto22.com/skills/synastry-reading): Use when $synastry hands off a JSON v2 artifact, or when someone supplies a synastry-chart schema 2.0 JSON path or object and asks for 合盘解读, interpretation, relationship dynamics, or an evidence-linked Markdown report. Not for legacy TXT, raw birth details, one-person natal charts, recalculation, transits, forecasts, predictions, or compatibility scores.
- [natal-chart](https://misoto22.com/skills/natal-chart): Compute one person's natal chart from an exact birth date, minute, and place — planet positions with sign, house, dignity and retrograde state, the four angles, intra-chart aspects, sect, and the classical lots, written as canonical JSON plus data-only Markdown. Use for 本命盘, 星盘, 出生星图, natal chart, birth chart, my rising sign, my chart's aspects, or where a planet sits. Not for two-person 合盘, interpreting a chart that already exists, transits, progressions, returns, or any dated prediction.
- [natal-reading](https://misoto22.com/skills/natal-reading): Explain a natal chart artifact someone already has — what the rising sign shapes, where the sect light sits, which aspects are tight enough to lean on, and what the angles and lots add. Writes a reader report plus an auditable evidence file, and a shareable ink-wash page on request. Use for 解读星盘, 看本命盘, 我的上升是什么意思, or asking what a placement or aspect pattern means. Not for computing a chart from raw birth details, 合盘 between two people, transits, progressions, returns, or predicting a dated event.
- [bazi-chart](https://misoto22.com/skills/bazi-chart): Calculate one reusable BaZi chart from a named person's exact birth date, minute, and birthplace, write canonical JSON plus data-only Markdown, then start the natal reading automatically. Use for 八字排盘, 生辰八字, four pillars, or informal single-person birth details. Not for two-person compatibility, existing-chart interpretation, Da Yun, annual luck, or event forecasts.
- [bazi-reading](https://misoto22.com/skills/bazi-reading): Interpret a completed single-person BaZi JSON chart or equivalent verified four-pillar data as an evidence-linked static natal report. Use when a calculator hands off its artifact or someone asks to 解读八字, 看命局, explain day-master strength, structure, or favorable elements from an existing chart. Not for raw birth details, relationship matching, luck cycles, dated predictions, or incomplete source data.
- [bazi-compatibility](https://misoto22.com/skills/bazi-compatibility): Compare two people from reusable BaZi chart JSON files, two complete birth records, or one of each; write auditable interaction data and transparent general or relationship-specific scores before automatic interpretation. Use for 八字合婚, 合八字, two-person compatibility, 配不配, or whether two charts work together. Not for one-person natal work, reading an existing comparison, forecasting, or missing birth minutes.
- [bazi-compatibility-reading](https://misoto22.com/skills/bazi-compatibility-reading): Interpret a completed BaZi compatibility JSON artifact or equivalent verified comparison as a balanced, directional, evidence-linked relationship report. Use after the compatibility calculator or when asked to explain general, romance, marriage, friendship, family, or work scores already computed for two charts. Not for raw birth records, one-person readings, recalculation, predictions, or a binary destiny verdict.
- [ziwei-chart](https://misoto22.com/skills/ziwei-chart): Place one twelve-palace Zi Wei Dou Shu 命盘 from someone's stated birth moment, birthplace, and gender, recording palaces, stars, 生年四化, and 大限 windows as reusable placement data. Use for 紫微斗数, 紫微排盘, 排紫微, 紫微命盘, 十二宫, or purple star astrology. Not for 八字 four pillars, matching two people, comparing two systems against each other, 流年 or monthly transformations, or a 命盘 that has already been placed.
- [ziwei-reading](https://misoto22.com/skills/ziwei-reading): Interpret an already-placed Zi Wei 命盘 artifact, or equivalent verified twelve-palace data, writing a reader report plus a separate audit artifact and, when asked, an ink-wash HTML poster. Use for 解读紫微, 看命盘, 看十二宫, or explaining the stars sitting in 命宫, the 生年四化, and what each 大限 window emphasizes. Not for unplaced birth records, 八字 four pillars, comparing two systems against each other, matching two people, 流年, or dated predictions.
- [bazi-ziwei-cross](https://misoto22.com/skills/bazi-ziwei-cross): Read one person's finished 八字 artifact and finished 紫微 artifact against each other, recording every place the two systems agree, complement, or flatly contradict, without merging them into a single number. Use for 八字紫微综合, 双系统印证, 两盘合参, or asking whether the two systems say the same thing about one person. Not for placing either 命盘, reading one system by itself, matching two people, or forecasting.
- [logo-banner](https://misoto22.com/skills/logo-banner): Create cohesive raster logo, app-icon, favicon, and repository-hero systems through ChatGPT Image when a user asks to design or refresh visual identity, a logo, a banner, branding assets, or light and dark brand variants; stop clearly when the host lacks that generator rather than substituting another tool; not for code-drawn SVG icons, general website layout, or ordinary photo retouching.
- [photo-abstract-editorial-native](https://misoto22.com/skills/photo-abstract-editorial-native): Assemble a source-faithful photograph with a supplied editorial abstraction panel as a sharp comparison board, preserving orientation, aspect ratio, source provenance, and lower-panel scale. Use for original-versus-abstract photography diptychs, photo comparison cards, or repairing blurred and stretched editorial boards; not for generating lower artwork or replacing a separately licensed art-direction skill.

## Contact

- Email: henrycxw@gmail.com
- GitHub: https://github.com/Misoto22
- LinkedIn: https://linkedin.com/in/henry-misoto22
- X: https://x.com/misoto222
- Instagram: https://instagram.com/hry.photography
- Unsplash: https://unsplash.com/@misoto22

## Optional

- [Full site content for LLMs](https://misoto22.com/llms-full.txt): this document, expanded
- [Atom feed](https://misoto22.com/feed.xml): English blog posts
- [Sitemap](https://misoto22.com/sitemap.xml): every canonical URL, both locales
- [OpenAPI description](https://misoto22.com/openapi.yaml): the public read API
- [API catalog](https://misoto22.com/.well-known/api-catalog): RFC 9727 linkset
