# Matthews Wong

> Software Engineer from Indonesia working as an ERP Developer, DevOps Engineer, and full-stack web developer. He specialises in DevOps & Cloud Infrastructure, ERP Systems, and Web App Development. Currently an AI Forward Deployed Engineer at Commsult Indonesia, building the company's MCP Console and Gateway.

Matthews Wong builds and operates production systems — from CI/CD pipelines and container orchestration to ERP modules (Accounts Payable/Receivable, approvals, inventory, HR workflows) and commercial web applications. He studied Information Technology at Swiss German University, Tangerang, and has held roles across DevOps engineering, software development engineering in test (SDET), data science, and mobile development.

Roles: ERP Developer · DevOps Engineer · Software Engineer · Full-Stack Web Developer

Contact: matthewswong2610@gmail.com
GitHub: https://github.com/matthews-wong
LinkedIn: https://www.linkedin.com/in/matthewswong

## Machine-Readable Resources

- Full version (with article summaries): https://www.matthewswong.com/llms-full.txt
- RSS feed: https://www.matthewswong.com/feed.xml
- JSON feed: https://www.matthewswong.com/feed.json
- RSS feed, Bahasa Indonesia: https://www.matthewswong.com/id/feed.xml
- JSON feed, Bahasa Indonesia: https://www.matthewswong.com/id/feed.json
- Sitemap: https://www.matthewswong.com/sitemap.xml
- Any page as Markdown: request its URL with `Accept: text/markdown`, or append `index.md` to it

## Developers: Matthews Wong API

- [Developer guide](https://www.matthewswong.com/en/developers/): quickstart, endpoints, error codes, versioning and deprecation policy, sandbox
- API description (OpenAPI 3.1): https://www.matthewswong.com/openapi.json
- API index (v1): https://www.matthewswong.com/api/v1/
- API catalog (RFC 9727): https://www.matthewswong.com/.well-known/api-catalog

## Core Expertise

- ERP Systems: ERP module development (AP/AR, approvals, inventory, HR), implementation, customisation vs configuration, data migration, SAP/Oracle API integration, digital transformation
- DevOps & Cloud Infrastructure: CI/CD (GitHub Actions, ArgoCD), Docker, Kubernetes, Terraform, Ansible, AWS, Google Cloud Platform, observability (Prometheus, Grafana, Loki)
- Full-Stack Web Development: Next.js, React, TypeScript, Node.js, NestJS, PostgreSQL, REST & GraphQL APIs

## Main Pages

- [Home](https://www.matthewswong.com/en/): Overview of skills, products, commercial projects, and workflow
- [About](https://www.matthewswong.com/en/about/): Who Matthews Wong is — a software engineer in Tangerang, Indonesia working across DevOps and cloud infrastructure, ERP systems and web development; career story, education (GPA 3.82, Magna Cum Laude), products, FAQ and a 24-second motion film
- [Experience](https://www.matthewswong.com/en/experience/): Work history — AI Forward Deployed Engineer at Commsult APAC (Oct 2026 - Present); DevOps & Infrastructure Engineer at Commsult APAC (Jul 2026 - Oct 2026); DevOps Engineer at Commsult APAC (Sep 2025 - Jul 2026); DevOps Engineer (Intern) at Commsult APAC (Jan 2025 - Sep 2025); Software Development Engineer in Test at Commsult APAC (Jul 2024 - Jan 2025); Project-Based Virtual Intern : Data Scientist x Rakamin Academy at id/x partners (May 2024 - Jun 2024); Project-Based Virtual Intern : Mobile Apps Developer x Rakamin Academy at PT Bank Mandiri (Persero) Tbk (Jan 2024 - Feb 2024)
- [Projects](https://www.matthewswong.com/en/projects/): Portfolio of ERP, engineering, and commercial projects
- [Case Studies](https://www.matthewswong.com/en/case-studies/): Real engineering case studies with outcomes
- [Education](https://www.matthewswong.com/en/education/): Swiss German University, Information Technology
- [Certifications](https://www.matthewswong.com/en/certifications/): Professional certifications including PagerDuty DevOps Professional Certificate
- [Hackathons](https://www.matthewswong.com/en/hackathons/): Competition participation including PwC Capture The Flag
- [Blog](https://www.matthewswong.com/en/blog/): 816+ technical articles on DevOps, Cloud, ERP, AI, and software engineering
- [Contact](https://www.matthewswong.com/en/contact/): Get in touch form and direct contact details
- [Uses](https://www.matthewswong.com/en/uses/): The tools, stack and infrastructure he works with
- [Now](https://www.matthewswong.com/en/now/): What he is working on this month
- [Press kit](https://www.matthewswong.com/en/press/): Ready-to-use bios in three lengths, photo and key facts

## Indonesia Field Guide

[Building software for Indonesia](https://www.matthewswong.com/en/indonesia/): Software built for Indonesia has to handle four local layers: tax through DJP's Coretax system, payments through QRIS and Bank Indonesia's SNAP standard, hosting and data placement, and the UU PDP data-protection law. Each hub below explains one layer, dates its sources, and links the hands-on articles behind it.

- [Tax & ERP](https://www.matthewswong.com/en/indonesia/tax-erp/): Coretax, e-Faktur, PPN and landed cost, as an ERP has to encode them.
- [Payments](https://www.matthewswong.com/en/indonesia/payments/): QRIS, SNAP, virtual accounts, e-wallets and choosing a gateway.
- [Cloud & Hosting](https://www.matthewswong.com/en/indonesia/cloud-hosting/): Local VPS, Jakarta regions or Singapore, data placement and cost in IDR.
- [Data Protection](https://www.matthewswong.com/en/indonesia/compliance/): UU PDP, PSE registration and identity checks, mapped to engineering controls.
- [Payment Gateway Fees](https://www.matthewswong.com/en/indonesia/payment-gateway-fees/): Published fees side by side, every cell linked to the provider's own page.
- [Glossary](https://www.matthewswong.com/en/indonesia/glossary/): Indonesian tax, payment and compliance terms, defined for developers.
- [Regulation Timeline](https://www.matthewswong.com/en/indonesia/timeline/): Every dated rule change from the four hubs in one list, newest first.
- [PPN Calculator](https://www.matthewswong.com/en/indonesia/ppn-calculator/): PPN at 12% with DPP nilai lain 11/12, with the integer-rupiah code behind it.
- [Landed Cost Calculator](https://www.matthewswong.com/en/indonesia/landed-cost-calculator/): CIF value, import duty and import taxes into a per-unit landed cost.

## AI & DevOps Field Guide

[The AI & DevOps field guide](https://www.matthewswong.com/en/ai-devops/): Five ordered reading paths: MCP and AI agent security, LLM inference serving, Kubernetes for AI, AI SRE and agentic ops, and software supply chain security and regulation. Each path is split into stages, and every article on it carries one line on why it sits where it does.

- [MCP & Agent Security](https://www.matthewswong.com/en/ai-devops/mcp-agent-security/): Prompt injection, the 2026 MCP incidents, access controls, sandboxes and vetting agent skills.
- [LLM Inference Serving](https://www.matthewswong.com/en/ai-devops/llm-inference-serving/): vLLM and SGLang, disaggregated serving, llm-d and KServe, autoscaling and cost per token.
- [Kubernetes for AI](https://www.matthewswong.com/en/ai-devops/kubernetes-for-ai/): The 1.36 and 1.37 upgrades, DRA and gang scheduling, Gateway API routing and agents in the cluster.
- [AI SRE & Agentic Ops](https://www.matthewswong.com/en/ai-devops/ai-sre-and-agentic-ops/): Incident-investigation agents, MCP servers for ops tools, agents in CI, and the IaC beneath.
- [Supply Chain & Regulation](https://www.matthewswong.com/en/ai-devops/software-supply-chain-and-regulation/): npm and PyPI worms, model signing and AIBOM, secrets in agent commits, the CRA and EU AI Act.

## Free Courses

[Free courses](https://www.matthewswong.com/en/learn/): Short lessons, each built around one animated diagram you step through at your own pace. Every lesson quotes the real configuration that runs this website, says what breaks, and ends with an exercise you can run on your own machine. Free, in English and Indonesian.

- [DevOps From Scratch: Free Course Built on a Real Pipeline](https://www.matthewswong.com/en/learn/devops-from-zero/): A free DevOps course for beginners, built on the real pipeline behind this website: Docker, GitHub Actions, a VPS, nginx, Cloudflare and monitoring.
  - [DevOps Pipeline Explained: From Git Push to Production](https://www.matthewswong.com/en/learn/devops-from-zero/devops-pipeline-explained/): A DevOps pipeline explained on a real site: how one git push is checked, built into a Docker image, run on a VPS and served through nginx and Cloudflare.
  - [SSH for Beginners: Log In to a Linux Server With a Key](https://www.matthewswong.com/en/learn/devops-from-zero/linux-server-ssh-for-beginners/): SSH for beginners: make an Ed25519 key, log in to a Linux server without a password, open only ports 22, 80 and 443, and avoid the Cloudflare SSH trap.
  - [Docker Tutorial for Beginners: Image, Container, Dockerfile](https://www.matthewswong.com/en/learn/devops-from-zero/docker-tutorial-for-beginners/): Learn Docker from a real Dockerfile: what an image and a container are, how layers and the build cache work, and how to order instructions for fast builds.
  - [Docker Multi-Stage Build: Shrink a Real Next.js Image](https://www.matthewswong.com/en/learn/devops-from-zero/docker-multi-stage-build/): Learn the Docker multi-stage build from a real Dockerfile: named stages, COPY --from, a non-root user, --target, and why only the final stage ships.
  - [Docker Compose in Production: Limits, Health, Restarts](https://www.matthewswong.com/en/learn/devops-from-zero/docker-compose-production/): Run Docker Compose in production safely: a restart policy, a memory limit paired with Node's heap cap, a health check, and a port bound to localhost.
  - [GitHub Actions Deploy to VPS: Build, Push to GHCR, SSH](https://www.matthewswong.com/en/learn/devops-from-zero/github-actions-deploy-to-vps/): Deploy to a VPS with GitHub Actions the way this site does: a verify gate, an image pushed to GHCR, then SSH and Docker Compose, with secrets kept safe.
  - [Nginx Reverse Proxy With Docker Compose, Behind Cloudflare](https://www.matthewswong.com/en/learn/devops-from-zero/nginx-reverse-proxy-cloudflare/): Put nginx in front of a Docker Compose app and Cloudflare in front of nginx, then decide header by header what the edge may cache and what it never should.
  - [Monitoring Docker Containers: Uptime, Rollback and Backups](https://www.matthewswong.com/en/learn/devops-from-zero/monitoring-rollback-backups/): Learn what to watch on a Docker server and why: health checks, uptime checks and metrics. Then roll back a broken release by its tag and test a backup.
  - [Speed Up Docker Builds in GitHub Actions: A Cache Guide](https://www.matthewswong.com/en/learn/devops-from-zero/speed-up-docker-builds-github-actions/): Speed up Docker builds in GitHub Actions: export layers with cache-to type=gha, know when a cache mount fails, and restore tool caches with actions/cache.
  - [Docker Env Vars and Secrets: Build Time vs Runtime](https://www.matthewswong.com/en/learn/devops-from-zero/docker-env-vars-and-secrets/): Learn how env vars and secrets work in a Docker deploy: build time vs runtime, GitHub secrets, env_file, and why ENV and ARG must never hold a secret.
  - [HTTP Cache-Control Headers Explained on a Real Next.js Site](https://www.matthewswong.com/en/learn/devops-from-zero/http-cache-control-headers-explained/): Learn HTTP Cache-Control headers from a real next.config.ts: max-age, immutable, no-cache vs no-store, ETag and 304, and how Cloudflare reads them.
  - [Docker Container Hardening: Non-Root, Small Image, Scanning](https://www.matthewswong.com/en/learn/devops-from-zero/docker-container-hardening-basics/): Harden a Docker container step by step: non-root user, minimal base image, loopback ports, resource caps and CVE scanning, checked against a real setup.
  - [Docker Logs for Beginners: Read, Cap and Rotate Logs](https://www.matthewswong.com/en/learn/devops-from-zero/docker-logs-for-beginners/): Learn docker logs from a real Compose file: stdout and stderr, the json-file and journald drivers, max-size rotation, and reading logs when a deploy fails.
  - [GitHub Actions Quality Gates: Check Before You Deploy](https://www.matthewswong.com/en/learn/devops-from-zero/github-actions-quality-gates/): Learn CI quality gates from a real workflow: typecheck, lint, tests and build, job dependencies with needs, fail-fast order, and branch protection.
  - [Docker No Space Left on Device: Find What Fills the Disk](https://www.matthewswong.com/en/learn/devops-from-zero/docker-no-space-left-on-device/): Fix Docker's no space left on device: read docker system df, prune images and build cache by age, keep the newest N images, cap logs and the journal.
  - [Docker Networking Explained: Bridges, DNS, Ports and ufw](https://www.matthewswong.com/en/learn/devops-from-zero/docker-networking-explained/): Docker networking explained: user-defined bridges, container names via Docker's DNS, published ports, why ufw misses them, and localhost in a container.
  - [DNS Records Explained: A, CNAME, MX, TXT, TTL and the Proxy](https://www.matthewswong.com/en/learn/devops-from-zero/dns-records-explained/): DNS records explained: trace a lookup from resolver to authoritative server, learn A, CNAME, MX, TXT, NS and CAA, what TTL caches and what proxying does.
  - [How SMTP Works: Ports, MX Lookup, SPF, DKIM and DMARC](https://www.matthewswong.com/en/learn/devops-from-zero/how-smtp-works-spf-dkim-dmarc/): How SMTP works, step by step: the EHLO to DATA dialogue, ports 25, 587 and 465, the MX lookup, and how SPF, DKIM and DMARC decide if your email lands.
  - [Docker Swarm Tutorial: Services, Routing Mesh, Rolling Updates](https://www.matthewswong.com/en/learn/devops-from-zero/docker-swarm-tutorial/): A Docker Swarm tutorial for beginners: managers and Raft, services and replicas, the routing mesh, rolling updates, and a real Compose file as a stack.
  - [Docker Volume vs Bind Mount: Where Container Data Lives](https://www.matthewswong.com/en/learn/devops-from-zero/docker-volumes-vs-bind-mounts/): Docker volume vs bind mount explained: where container data lives, how a new volume is filled from the image, who owns the files, and what down -v deletes.
  - [YAML Tutorial for Beginners: Maps, Lists, Quotes and Traps](https://www.matthewswong.com/en/learn/devops-from-zero/yaml-tutorial-for-beginners/): YAML tutorial for beginners: maps, lists, indentation, multi-line strings and quoting, plus the traps that turn on, NO and 3.10 into other values.
  - [Linux File Permissions Explained: ls -l, chmod, chown, umask](https://www.matthewswong.com/en/learn/devops-from-zero/linux-file-permissions-explained/): Linux file permissions explained: read ls -l, r/w/x on files and folders, octal 600/644/755, chmod, chown, umask, and the uid a container writes as.
  - [Docker Healthcheck Tutorial: Health States and Restart Policies](https://www.matthewswong.com/en/learn/devops-from-zero/docker-healthcheck-restart-policy/): Docker healthcheck tutorial: write one, read starting, healthy and unhealthy, gate a deploy with --wait, and see why restart policies ignore health.
  - [GitHub Actions Secrets Tutorial: Variables, Scopes and Forks](https://www.matthewswong.com/en/learn/devops-from-zero/github-actions-secrets-and-variables/): GitHub Actions secrets tutorial: secrets vs variables, repository and environment scope, log masking and its limits, fork pull requests and GITHUB_TOKEN.
  - [Nginx 502 Bad Gateway in Docker: Read the Log, Fix the Cause](https://www.matthewswong.com/en/learn/devops-from-zero/nginx-502-bad-gateway-docker/): Fix nginx 502 Bad Gateway with Docker: read the error log, tell 502 from 503 and 504, check the causes in order of likelihood, and decode Cloudflare's 5xx.
- [System Design Step by Step: A Free Course in 7 Modules](https://www.matthewswong.com/en/learn/system-design/): A free system design course in seven modules: scaling, caching, databases, consistency, reliability and case studies, with step-through animated diagrams.
  - [System Design Estimation for Beginners: Users to Servers](https://www.matthewswong.com/en/learn/system-design/system-design-estimation-for-beginners/): System design estimation step by step: turn daily users into peak requests per second, storage and servers, then link latency to load with Little's law.
  - [How to Scale a Web Application: Stateless Servers to CDN](https://www.matthewswong.com/en/learn/system-design/how-to-scale-a-web-application/): How to scale a web application step by step: stateless copies behind a load balancer, sessions in a shared store, then a CDN and a cache to absorb reads.
  - [How to Scale a Database: Indexes, Replicas and Sharding](https://www.matthewswong.com/en/learn/system-design/how-to-scale-a-database/): How to scale a database step by step: model data around queries, add the right index, use read replicas despite lag, then shard by key with IDs that scale.
  - [Consistency in Distributed Systems Explained: ACID, CAP, Sagas](https://www.matthewswong.com/en/learn/system-design/consistency-in-distributed-systems/): Consistency in distributed systems, step by step: ACID and isolation on one node, CAP and PACELC, two-phase commit versus sagas, and leases with fencing.
  - [Reliability Patterns Explained: Retries to Circuit Breakers](https://www.matthewswong.com/en/learn/system-design/reliability-patterns-explained/): Reliability patterns explained: SLOs, error budgets, redundancy, failover, retries with backoff and jitter, bulkheads, backpressure, circuit breakers.
  - [Microservices for Beginners: Boundaries, Sync vs Async, Queues](https://www.matthewswong.com/en/learn/system-design/microservices-for-beginners/): Learn microservices from the ground up: when a modular monolith is enough, how to draw service boundaries, and when a call should be sync, async or queued.
  - [System Design Case Study Example: Designing This Website](https://www.matthewswong.com/en/learn/system-design/system-design-case-study-example/): A worked system design case study: the seven-step framework applied to this website, from requirements and numbers to the request path and its weak spots.
  - [API Design for Beginners: Resources, Errors and Versioning](https://www.matthewswong.com/en/learn/system-design/api-design-for-beginners/): API design for beginners: resources and methods, honest status codes, one error shape, versioning and deprecation, rate limits, pagination and OpenAPI.
  - [WebSocket vs SSE vs Long Polling: Real-Time Updates Explained](https://www.matthewswong.com/en/learn/system-design/websocket-vs-sse-vs-long-polling/): WebSocket vs SSE vs long polling: how each one delivers server updates, what it keeps open, Last-Event-ID reconnects, proxy buffering and idle timeouts.
  - [Idempotency Explained: Safe Retries and Idempotency Keys](https://www.matthewswong.com/en/learn/system-design/idempotency-explained/): Idempotency explained: safe vs idempotent HTTP methods, why retries need it, how idempotency keys work, idempotent consumers, upserts and re-runnable jobs.
  - [Event-Driven Architecture Explained: Queues, Logs and Outbox](https://www.matthewswong.com/en/learn/system-design/event-driven-architecture-explained/): Event-driven architecture explained: events vs commands, queues vs logs, at-least-once delivery, idempotent consumers, ordering, backlog and the outbox.
- [Claude Code Tips: A Short Course From a Real Repo](https://www.matthewswong.com/en/learn/claude-code-tips/): Thirteen Claude Code lessons from a real repo: CLAUDE.md, permissions, skills, hooks, subagents, tokens, MCP, headless runs and settings, doc-checked.
  - [CLAUDE.md File Example: Global, Project and Local Layers](https://www.matthewswong.com/en/learn/claude-code-tips/claude-md-file-example/): A real CLAUDE.md file example: the managed, user, project and local layers, how they load, @imports, and what belongs in a skill or a hook instead.
  - [Claude Code settings.json Example: Allow, Ask and Deny Rules](https://www.matthewswong.com/en/learn/claude-code-tips/claude-code-permissions-settings/): A real Claude Code settings.json example: which settings file wins, how allow, ask and deny rules match, why deny wins, and how to keep .env out of reach.
  - [Claude Code Skills Examples: Write One That Actually Triggers](https://www.matthewswong.com/en/learn/claude-code-tips/claude-code-skills-examples/): Claude Code skills examples from a real repo: SKILL.md frontmatter, why the description decides triggering, what loads when, and skills vs CLAUDE.md.
  - [Claude Code Hooks Examples: Guardrails That Always Run](https://www.matthewswong.com/en/learn/claude-code-tips/claude-code-hooks-examples/): Claude Code hooks examples from a real repo: events, matchers, the JSON on stdin, exit codes and JSON output, and when a hook should block or only advise.
  - [Claude Code Subagents Examples: When to Delegate a Task](https://www.matthewswong.com/en/learn/claude-code-tips/claude-code-subagents-examples/): Claude Code subagents examples from a real repo: what a subagent sees, the name, description and tools fields, when to delegate, and safe parallel fan-out.
  - [Claude Code Tips to Save Tokens: Context, Compaction, Scope](https://www.matthewswong.com/en/learn/claude-code-tips/save-tokens-claude-code/): Claude Code tips to save tokens: read /context, compact or clear at the right time, scope reads, load skills on demand and keep exploration in subagents.
  - [Add an MCP Server to Claude Code: Scopes and Permissions](https://www.matthewswong.com/en/learn/claude-code-tips/add-mcp-server-claude-code/): Add an MCP server to Claude Code with claude mcp add: http vs stdio, local, project and user scope, .mcp.json, MCP permission rules, and the risks.
  - [Claude Code Headless Mode: claude -p With a Pass/Fail Gate](https://www.matthewswong.com/en/learn/claude-code-tips/claude-code-headless-pass-fail-gate/): Run Claude Code headless with claude -p: output formats, permission modes, allowedTools and dontAsk, plus a verification gate script that closes the loop.
  - [Claude Code Worktrees: Run Parallel Sessions Without Collisions](https://www.matthewswong.com/en/learn/claude-code-tips/claude-code-git-worktrees-parallel-sessions/): Run parallel Claude Code sessions with git worktrees: what claude --worktree creates, what it isolates, what stays shared, cleanup, and subagent isolation.
  - [Claude Code Rewind and Plan Mode: Undo Risky Changes](https://www.matthewswong.com/en/learn/claude-code-tips/claude-code-rewind-plan-mode-safe-changes/): How to undo Claude Code changes: what /rewind restores and what it cannot, how plan mode holds edits for review, and why git stays your real safety net.
  - [Claude Code Settings Scopes: Which File Wins, What Is Shared](https://www.matthewswong.com/en/learn/claude-code-tips/claude-code-settings-scopes-precedence/): Claude Code settings scopes explained from a real repo: user, project, local and managed files, which one wins, what git shares, and how lists merge.
  - [Where to Put Instructions in Claude Code: A Decision Guide](https://www.matthewswong.com/en/learn/claude-code-tips/where-to-put-instructions-claude-code/): Where to put instructions in Claude Code: CLAUDE.md, rules, skills, custom commands, hooks or auto memory. A decision table built on a real repo.
  - [Claude Code Git Workflow: Safe Commits, PRs and Push Rules](https://www.matthewswong.com/en/learn/claude-code-tips/claude-code-git-workflow-safe-commits/): A Claude Code git workflow that keeps main clean: commit and PR attribution, feature branches, and a deny rule or hook that stops git push and force-push.
- [Web App Skills: Next.js Lessons From a Real Production Site](https://www.matthewswong.com/en/learn/web-app-skills/): Short Next.js lessons from a live site: server and client components, i18n routing, SEO metadata and API routes, tied to real code and checked to the docs.
  - [Server vs Client Components in Next.js for Beginners](https://www.matthewswong.com/en/learn/web-app-skills/nextjs-server-vs-client-components/): Learn Next.js server vs client components with real code: what runs where, the use client boundary, passing children, and what ships to the browser.
  - [next-intl Routing in Next.js: i18n for Beginners](https://www.matthewswong.com/en/learn/web-app-skills/nextjs-i18n-next-intl-routing/): Learn i18n routing with next-intl in Next.js: locale prefix, middleware, getTranslations vs useTranslations, localized Link, static params and hreflang.
  - [Next.js SEO Metadata Tutorial: generateMetadata to JSON-LD](https://www.matthewswong.com/en/learn/web-app-skills/nextjs-seo-metadata-tutorial/): A Next.js SEO metadata tutorial from a live bilingual site: generateMetadata, canonical and hreflang, Open Graph, sitemap.ts, robots.ts and JSON-LD.
  - [Next.js API Route Tutorial: Validate, Rate Limit, Version](https://www.matthewswong.com/en/learn/web-app-skills/nextjs-api-route-handlers-tutorial/): A Next.js API route tutorial from a live site: validate input, rate limit per client, return one JSON error shape, version under /api/v1 and send email.
  - [Static vs Dynamic Rendering in Next.js: Caching Explained](https://www.matthewswong.com/en/learn/web-app-skills/nextjs-static-vs-dynamic-rendering-caching/): Learn static vs dynamic rendering in Next.js: generateStaticParams, revalidate, fetch and route caching, Next 15 defaults, cache headers and real code.
  - [Core Web Vitals in Next.js: next/image and next/font Basics](https://www.matthewswong.com/en/learn/web-app-skills/nextjs-core-web-vitals-image-font/): Learn web performance basics in Next.js: LCP, CLS and INP, next/image sizes and srcset, priority, and next/font, with the real files this site ships.
  - [Next.js Middleware Tutorial: Matcher, Rewrites and Accept](https://www.matthewswong.com/en/learn/web-app-skills/nextjs-middleware-matcher-rewrites/): Learn Next.js middleware with a real file: the matcher, rewrites vs redirects, and Accept header content negotiation that serves Markdown at the same URL.
  - [Test a Next.js Site With node:test and Build Gates](https://www.matthewswong.com/en/learn/web-app-skills/nextjs-testing-node-test-build-gates/): Test a Next.js site without Jest: node:test contract tests, prebuild gates like assertBlogParity, and how to decide what a test guards and a gate does.
  - [Web Accessibility Basics for Beginners in a Next.js Site](https://www.matthewswong.com/en/learn/web-app-skills/web-accessibility-basics-nextjs/): Learn web accessibility basics from a real Next.js site: semantic HTML, keyboard focus, accessible names, contrast thresholds and reduced motion.
  - [Self-Host Next.js: Standalone Output, Docker and Env Vars](https://www.matthewswong.com/en/learn/web-app-skills/self-host-nextjs-standalone-docker/): Learn to self-host Next.js: output standalone, the Docker runner image, build-time vs runtime env vars, NEXT_PUBLIC and a health check, from real files.
  - [Playwright Smoke Test in GitHub Actions: Serve, Wait, Fail](https://www.matthewswong.com/en/learn/web-app-skills/playwright-smoke-test-github-actions/): Add a Playwright smoke test to GitHub Actions: serve the built Next.js app, wait until it answers, install headless Chromium and print the log on failure.
- [AI Agents and MCP From Zero: A Free Beginner Course](https://www.matthewswong.com/en/learn/ai-agents-mcp/): Four free lessons on AI agents and MCP from zero: how a tool call travels, least-privilege servers, prompt injection in tool output, and agent sandboxes.
  - [What Is an MCP Server? How One Tool Call Travels](https://www.matthewswong.com/en/learn/ai-agents-mcp/what-is-mcp-how-a-tool-call-travels/): What an MCP server is, from zero: how one AI agent tool call travels from client to server and back, and when to use stdio or Streamable HTTP transport.
  - [MCP Server Least Privilege: Read-Only Mode and Toolsets](https://www.matthewswong.com/en/learn/ai-agents-mcp/scope-an-mcp-server-read-only-toolsets/): MCP server least privilege from zero: a credential that cannot write, read-only mode, toolsets, allow lists and a client deny list, proven with tools/list.
  - [Indirect Prompt Injection Explained: Tool Output Is Untrusted](https://www.matthewswong.com/en/learn/ai-agents-mcp/prompt-injection-through-tool-output/): Indirect prompt injection explained for beginners: why text an MCP tool returns is untrusted input, two real incidents, and the controls that still hold.
  - [How to Sandbox an AI Agent: Files, Network and Secrets](https://www.matthewswong.com/en/learn/ai-agents-mcp/run-an-ai-agent-in-a-sandbox/): How to sandbox an AI agent from zero: what a sandbox contains and what it misses, from files and network to credentials, in Claude Code, Docker and K8s.

## Projects

- [ANCoraPRO](https://www.matthewswong.com/en/projects/ancorapro/): Finance ERP — AP/AR, Hierarchical Approvals & Email Automation
- [AI Feeds](https://www.matthewswong.com/en/projects/ai-feeds/): Curated AI repository discovery — anti doom-scrolling
- [Review CI](https://www.matthewswong.com/en/projects/review-ci/): CI/CD pipeline analyzer with actionable insights
- [Jakarta Intl Denso](https://www.matthewswong.com/en/projects/jakarta-intl-denso/): Car care workshop website — local SEO & visibility
- [Parcel Cirebon](https://www.matthewswong.com/en/projects/parcel-cirebon/): Gift parcel storefront — catalogue, seasonal SEO & chat ordering
- [TikTok Agency Incubator](https://www.matthewswong.com/en/projects/tiktok-agency-incubator/): Official TikTok campaign web app — agency-speed delivery
- [Shibui Matcha Bar](https://www.matthewswong.com/en/projects/shibui-matcha-bar/): Café landing page — brand identity & organic growth
- [MPilates Website](https://www.matthewswong.com/en/projects/mpilates/): Pilates studio website — class showcase & WhatsApp booking
- [STADPASS](https://www.matthewswong.com/en/projects/stadpass/): Stadium indoor navigation app using BLE beacons
- [Observer KPU](https://www.matthewswong.com/en/projects/observer-kpu/): AI-powered election news platform with LLM chatbot
- [Credit Risk Analysis](https://www.matthewswong.com/en/projects/credit-risk-analysis/): XGBoost predictive model for financial risk classification
- [Security Onion Lab](https://www.matthewswong.com/en/projects/security-onion-lab/): Network threat detection with automated Discord alerting

## Case Studies

- [Cutting a Next.js Site's Origin Transfer by 90%](https://www.matthewswong.com/en/case-studies/vercel-origin-transfer/): How this portfolio went from blowing its Vercel bandwidth quota to serving 495 fully static pages from the CDN.
- [ERP Approvals: From Days to Hours at ANC](https://www.matthewswong.com/en/case-studies/ancorapro-erp/): Replacing manual, email-driven invoice signoffs with hierarchical approval chains in ANCoraPRO's AP/AR module.
- [Self-Hosted Observability for Production VPSs](https://www.matthewswong.com/en/case-studies/monitoring-stack/): One Grafana pane of glass — metrics, logs, and phone-call alerting — for every production server I run.
- [Observer KPU: AI Election Information Platform](https://www.matthewswong.com/en/case-studies/observer-kpu/): A single, queryable source of verified information for Indonesia's 2024 general election, with an LLM chatbot on top.

## Blog — DevOps & Cloud Infrastructure

- [How to Secure a Docker Container: 7 Steps for Beginners](https://www.matthewswong.com/en/blog/cara-mengamankan-container-docker/)
- [How to Roll Back a Docker Deploy on a VPS (Beginner Guide)](https://www.matthewswong.com/en/blog/cara-rollback-deploy-docker-di-vps/)
- [Docker Swarm vs Kubernetes: A Small Team Load Test Verdict](https://www.matthewswong.com/en/blog/docker-swarm-vs-kubernetes-small-team-load-test/)
- [How to Deploy Docker Compose in Production for Beginners](https://www.matthewswong.com/en/blog/cara-deploy-docker-compose-production-vps/)
- [How to Turn a Plain Dockerfile into a Docker Multi-Stage Build](https://www.matthewswong.com/en/blog/cara-membuat-multi-stage-build-docker/)
- [How to View Docker Logs: Tail, Follow and Compose Guide](https://www.matthewswong.com/en/blog/cara-melihat-docker-logs-untuk-pemula/)
- [How to Create CI/CD with GitHub Actions: 7 Beginner Steps](https://www.matthewswong.com/en/blog/cara-membuat-ci-cd-github-actions-pemula/)
- [How to Fix Docker No Space Left on Device (7 Steps)](https://www.matthewswong.com/en/blog/cara-mengatasi-docker-no-space-left-on-device/)
- [How to Store Docker Secrets and Environment Variables Safely](https://www.matthewswong.com/en/blog/cara-simpan-secret-environment-variable-docker-aman/)
- [Learn Docker from Scratch: First Container in 6 Steps](https://www.matthewswong.com/en/blog/belajar-docker-dari-nol-panduan-pemula/)
- [How to Deploy Next.js to a VPS with Docker and GitHub Actions](https://www.matthewswong.com/en/blog/cara-deploy-nextjs-ke-vps-docker-github-actions/)
- [How to Log In to a VPS Over SSH and Secure It (Beginner Guide)](https://www.matthewswong.com/en/blog/cara-login-ssh-vps-aman-pemula/)
- [How to Set Up Nginx Reverse Proxy for Docker and Cloudflare](https://www.matthewswong.com/en/blog/cara-setting-nginx-reverse-proxy-docker-cloudflare/)
- [Autoscale vLLM on Kubernetes with KEDA: Queue Depth, Not GPU %](https://www.matthewswong.com/en/blog/autoscale-vllm-keda-queue-depth-gpu-eks/)
- [AI Code Review Bottleneck: What CMU and Stanford Measured](https://www.matthewswong.com/en/blog/ai-code-review-bottleneck-cmu-stanford-silent-approvals/)
- [npm Trusted Publishing: 48-Hour Expiry and issue_comment Ban](https://www.matthewswong.com/en/blog/npm-trusted-publishing-48-hour-expiry-issue-comment/)
- [kubectl-ai Guide: Confirmation Gate, Limits and MCP Server Risk](https://www.matthewswong.com/en/blog/kubectl-ai-google-human-in-loop-guide/)
- [Argo CD 3.5: mTLS, Source Integrity and Helm 4 Upgrade Guide](https://www.matthewswong.com/en/blog/argo-cd-3-5-whats-new-upgrade/)
- [Flux 2.9: CLI Plugins, SSA Ignore Rules and OIDC Webhooks](https://www.matthewswong.com/en/blog/flux-2-9-cli-plugins-gitops-features/)
- [Terraform 1.16: What's New and How to Upgrade Safely](https://www.matthewswong.com/en/blog/terraform-1-16-whats-new-upgrade-guide/)
- [OpenTofu 1.13: convert, assume and Upgrade Breaking Changes](https://www.matthewswong.com/en/blog/opentofu-1-13-whats-new-upgrade-notes/)
- [KubeCon North America 2026 Guide: AI Track, Co-located Days](https://www.matthewswong.com/en/blog/kubecon-na-2026-salt-lake-city-guide/)
- [OpenTofu Ephemeral Resources and Write-Only Attributes](https://www.matthewswong.com/en/blog/opentofu-ephemeral-resources-write-only-attributes/)
- [ingress-nginx Retirement: Contour or Gateway API Migration](https://www.matthewswong.com/en/blog/ingress-nginx-retirement-migration-paths/)
- [Ingress2Gateway 1.0: Migrate ingress-nginx to Gateway API](https://www.matthewswong.com/en/blog/ingress2gateway-1-0-migration-walkthrough/)
- [kube-proxy ipvs Deprecated: Migrate to nftables by v1.40](https://www.matthewswong.com/en/blog/kube-proxy-ipvs-deprecation-nftables-migration/)
- [Kubernetes MCP Server: read_only, Toolsets, Denied Resources](https://www.matthewswong.com/en/blog/kubernetes-mcp-server-go-read-only-toolsets/)
- [Kubernetes HPA Scale to Zero for GPU Queue Workers (1.37)](https://www.matthewswong.com/en/blog/kubernetes-hpa-scale-to-zero-gpu-queue-workers/)
- [Kubernetes 1.37 Release: What Breaks When Upgrading From 1.36](https://www.matthewswong.com/en/blog/kubernetes-1-37-garhwal-whats-new/)
- [KYAML in Kubernetes 1.37: Stable YAML Subset, kubectl -o kyaml](https://www.matthewswong.com/en/blog/kyaml-kubernetes-stable-yaml-format/)
- [DORA AI-Assisted Development: Throughput Up, Instability Up](https://www.matthewswong.com/en/blog/dora-2026-ai-throughput-instability-devops/)
- [PagerDuty SRE Agent: Virtual Responder Setup and Guardrails](https://www.matthewswong.com/en/blog/pagerduty-sre-agent-virtual-responder-guide/)
- [Copilot Fix Failing GitHub Actions: Setup and Review Rules](https://www.matthewswong.com/en/blog/copilot-cloud-agent-fix-failing-github-actions/)
- [HolmesGPT Kubernetes Alerts: Runbooks Beat the Model Choice](https://www.matthewswong.com/en/blog/holmesgpt-runbooks-prometheus-slack-investigations/)
- [Agentic Workflow CI Failure Triage with gh-aw CI Doctor](https://www.matthewswong.com/en/blog/gh-aw-ci-doctor-failing-workflow-triage/)
- [GitHub Agentic Workflows: Markdown Automation with gh aw](https://www.matthewswong.com/en/blog/github-agentic-workflows-markdown-gh-aw-guide/)
- [Terraform MCP Server GA: A Safe Agent Setup Since 1.1.0](https://www.matthewswong.com/en/blog/terraform-mcp-server-ga-safe-agent-setup/)
- [Grafana MCP Server: OAuth Scopes for Claude Code and Cursor](https://www.matthewswong.com/en/blog/grafana-cloud-mcp-server-oauth-read-query-write/)
- [Grafana Assistant Investigations: Alert-Triggered RCA Setup](https://www.matthewswong.com/en/blog/grafana-assistant-investigations-alert-triggered-rca/)
- [NVIDIA Run:ai Open Source: KAI Scheduler, GPU Fractioning](https://www.matthewswong.com/en/blog/nvidia-runai-open-source-kai-scheduler-gpu-fractioning/)
- [Volcano Scheduler GPU Gang Preemption: v1.15 DRA Queue Quota](https://www.matthewswong.com/en/blog/volcano-1-15-gang-preemption-dra-queue-quota/)
- [Kubernetes DRA GPU Fallback: Prioritized List in 1.36](https://www.matthewswong.com/en/blog/kubernetes-1-36-dra-prioritized-list-gpu-fallback/)
- [Kubernetes DRA Extended Resources GA: Replace Device Plugin](https://www.matthewswong.com/en/blog/kubernetes-1-37-dra-extended-resources-ga/)
- [Kubernetes Gang Scheduling Beta in 1.37: What Works, What Not](https://www.matthewswong.com/en/blog/kubernetes-1-37-gang-scheduling-beta-ai-training/)
- [Gateway API Inference Extension: EPP Moves to llm-d, What Now](https://www.matthewswong.com/en/blog/gateway-api-inference-extension-epp-moves-to-llm-d/)
- [llm-d Kubernetes Inference: What v0.10 Hardening Changes](https://www.matthewswong.com/en/blog/llm-d-kubernetes-native-distributed-inference/)
- [Anthropic Scion: How Agent-Scale Source Control Replaced Git](https://www.matthewswong.com/en/blog/anthropic-scion-replaced-git-monorepo/)
- [Design a Metrics and Monitoring System: A Prometheus Pipeline](https://www.matthewswong.com/en/blog/design-metrics-monitoring-system/)
- [SLI vs SLO vs SLA: Definitions, Error Budgets and Burn Rates](https://www.matthewswong.com/en/blog/slo-sli-sla-reliability-explained/)
- [Load Balancing Algorithms: Round Robin, Least Conn, IP Hash](https://www.matthewswong.com/en/blog/load-balancing-algorithms-explained/)
- [AWS Bedrock AgentCore Guide: Runtime, Gateway, Memory, Policy](https://www.matthewswong.com/en/blog/aws-bedrock-agentcore-guide/)
- [Codex SDK Tutorial: Automate Coding Tasks in TypeScript](https://www.matthewswong.com/en/blog/codex-sdk-typescript-automation/)
- [Easypanel vs Coolify vs Dokploy: Self-Hosted PaaS on a VPS](https://www.matthewswong.com/en/blog/easypanel-vs-coolify-vs-dokploy/)
- [OpenTelemetry GenAI Semantic Conventions: Agent Spans in Tempo](https://www.matthewswong.com/en/blog/opentelemetry-genai-agent-spans-tracing/)
- [Reading Production Logs Without SSH on a Managed PaaS](https://www.matthewswong.com/en/blog/reading-production-logs-without-ssh/)
- [Zero-Downtime Schema Migrations on a Kubernetes Rolling Deploy](https://www.matthewswong.com/en/blog/zero-downtime-migration-rolling-deploy/)
- [Build Gates: Architecture Rules a README Cannot Enforce](https://www.matthewswong.com/en/blog/build-gates-architecture-rules-ci/)
- [Docker Build Cache: Faster PaaS Deploys From a Cold Builder](https://www.matthewswong.com/en/blog/docker-build-cache-paas-deploy-speed/)
- [Claude Code Plugin Upgrades: Version Pinning and Rollback](https://www.matthewswong.com/en/blog/claude-code-plugin-rollback-version-pinning/)
- [Claude Code Plugin Release Automation in GitHub Actions](https://www.matthewswong.com/en/blog/claude-code-plugin-ci-release-automation/)
- [AI DevOps Assistants for Kubernetes Production Triage](https://www.matthewswong.com/en/blog/ai-devops-assistant-production-triage/)
- [Self-Host n8n and Flowise in IDR: What One-Click Deploy Skips](https://www.matthewswong.com/en/blog/one-click-n8n-flowise-self-host-idr/)
- [How a PaaS Build Engine Auto-Writes Your Dockerfile](https://www.matthewswong.com/en/blog/helipack-auto-dockerfile-build-engine/)
- [Claude Code Environment Variables That Actually Matter](https://www.matthewswong.com/en/blog/claude-code-env-vars-reference-guide/)
- [Claude Code OpenTelemetry: Metrics, Events and Cost](https://www.matthewswong.com/en/blog/claude-code-analytics-otel-monitoring/)
- [Claude Code Network Config: Proxies, mTLS and Domains](https://www.matthewswong.com/en/blog/claude-code-network-config-proxy-firewall/)
- [Claude Code Dev Containers: Isolation That Holds](https://www.matthewswong.com/en/blog/claude-code-devcontainer-setup/)
- [Claude Code in GitLab CI/CD: Jobs, OIDC and MRs](https://www.matthewswong.com/en/blog/claude-code-gitlab-ci-cd-integration/)
- [Claude Code Scheduled Tasks: Loops, Cron and Routines](https://www.matthewswong.com/en/blog/claude-code-scheduled-tasks-routines/)
- [Claude Code Self-Hosted Runners: Cloud Sessions, Your Box](https://www.matthewswong.com/en/blog/claude-code-self-hosted-runners-guide/)
- [Running the Hermes Agent as an Autonomous Coder on a VPS](https://www.matthewswong.com/en/blog/hermes-agent-autonomous-coding-vps-setup/)
- [A Deterministic Merge Gate for a Self-Merging AI Agent](https://www.matthewswong.com/en/blog/autonomous-agent-merge-gate-hook/)
- [Debugging a Production VPS Incident With Claude Code](https://www.matthewswong.com/en/blog/claude-code-production-incident-debugging/)
- [AI Code Review Tools Compared for 2026](https://www.matthewswong.com/en/blog/ai-code-review-tools-compared/)
- [Parallel Claude Code Agents With Git Worktrees](https://www.matthewswong.com/en/blog/claude-code-parallel-agents-git-worktrees/)
- [Claude Code GitHub Actions: Issue to Merged PR](https://www.matthewswong.com/en/blog/claude-code-github-actions-guide/)
- [Claude Code Headless Mode for CI/CD Pipelines](https://www.matthewswong.com/en/blog/claude-code-headless-mode-ci-guide/)
- [Helm 4 Migration Guide: What's New and How to Upgrade](https://www.matthewswong.com/en/blog/helm-4-migration-guide/)
- [Load Testing Node.js APIs with k6 and Grafana Dashboards](https://www.matthewswong.com/en/blog/k6-load-testing-nodejs-grafana/)
- [Podman Quadlets: Replace Docker Compose with systemd](https://www.matthewswong.com/en/blog/podman-quadlets-replace-docker-compose/)
- [KEDA: Event-Driven Autoscaling & Scale-to-Zero on K8s](https://www.matthewswong.com/en/blog/keda-event-driven-autoscaling-kubernetes/)
- [Kubernetes In-Place Pod Resize: CPU & Memory No Restart](https://www.matthewswong.com/en/blog/kubernetes-in-place-pod-resize/)
- [kubectl debug: Fix CrashLoopBackOff & Distroless Pods](https://www.matthewswong.com/en/blog/kubectl-debug-crashloopbackoff-distroless/)
- [Prometheus 3.0: OTLP, Native Histograms, UTF-8 & New UI](https://www.matthewswong.com/en/blog/prometheus-3-0-whats-new/)
- [uv: The Fast Rust Python Package Manager Replacing pip](https://www.matthewswong.com/en/blog/uv-python-package-manager-rust/)
- [Kubernetes Native Sidecar Containers: A Practical Guide](https://www.matthewswong.com/en/blog/kubernetes-native-sidecar-containers/)
- [Feature Flags for Trunk-Based Development in DevOps](https://www.matthewswong.com/en/blog/feature-flag-driven-trunk-based-development/)
- [GitHub Actions Reusable Workflows vs Composite Actions Guide](https://www.matthewswong.com/en/blog/github-actions-reusable-workflows-composite-actions/)
- [Autoscaling GitHub Actions Runners on Kubernetes with ARC](https://www.matthewswong.com/en/blog/github-actions-runner-autoscaling-arc/)
- [Incus/LXC System Containers vs Docker: When to Use Each](https://www.matthewswong.com/en/blog/incus-lxc-system-containers-vs-docker/)
- [Kubernetes Gateway API vs Ingress: The Successor Explained](https://www.matthewswong.com/en/blog/kubernetes-gateway-api-vs-ingress/)
- [restic vs BorgBackup: Encrypted Deduplicated Backups Guide](https://www.matthewswong.com/en/blog/restic-vs-borg-encrypted-backups/)
- [k6 SLO Quality Gate for Bitbucket Pipelines CI/CD](https://www.matthewswong.com/en/blog/slo-quality-gate-bitbucket-pipeline/)
- [Argo Rollouts Canary & Blue-Green Progressive Delivery](https://www.matthewswong.com/en/blog/argo-rollouts-progressive-delivery-canary/)
- [Docker Buildx Bake: Declarative Multi-Platform Builds](https://www.matthewswong.com/en/blog/docker-bake-multi-platform-builds/)
- [OpenTofu vs Terraform: Migration Guide After BSL](https://www.matthewswong.com/en/blog/opentofu-vs-terraform-migration/)
- [Prometheus remote_write to Grafana Mimir at Scale](https://www.matthewswong.com/en/blog/prometheus-remote-write-mimir-scaling/)
- [Terraform Import Blocks: Bring Existing Infra Under IaC](https://www.matthewswong.com/en/blog/terraform-import-blocks-existing-infra/)
- [Grafana Alloy Migration from Promtail and Agent Guide](https://www.matthewswong.com/en/blog/grafana-alloy-opentelemetry-collector-migration/)
- [Postgres Row-Lock Bottleneck via Prometheus + InfluxDB](https://www.matthewswong.com/en/blog/postgres-row-lock-bottleneck-prometheus-influxdb/)
- [OpenTelemetry Collector: Designing a Telemetry Pipeline](https://www.matthewswong.com/en/blog/opentelemetry-collector-pipeline-design/)
- [I Self-Hosted Headscale for a Tailscale Mesh VPN Homelab](https://www.matthewswong.com/en/blog/tailscale-mesh-vpn-self-hosted/)
- [Building a Custom CPU Autoscaler for Docker Swarm](https://www.matthewswong.com/en/blog/docker-swarm-custom-autoscaler-cpu/)
- [Renovate: Automated Dependency Updates for DevOps Teams](https://www.matthewswong.com/en/blog/renovate-automated-dependency-updates/)
- [VictoriaMetrics vs Prometheus for Long-Term Metrics](https://www.matthewswong.com/en/blog/victoriametrics-vs-prometheus-long-term/)
- [Docker Swarm Replicas vs Throughput: A Load Testing Case Study](https://www.matthewswong.com/en/blog/docker-swarm-load-testing-replicas-throughput/)
- [Prometheus Cardinality: Recording Rules That Save Your TSDB](https://www.matthewswong.com/en/blog/prometheus-recording-rules-cardinality/)
- [Distroless Docker Images: Smaller, Safer Containers](https://www.matthewswong.com/en/blog/docker-distroless-image-optimization/)
- [GitHub Actions OIDC: Keyless Cloud Auth for CI/CD](https://www.matthewswong.com/en/blog/github-actions-oidc-keyless-cloud-auth/)
- [Kamal 2: Zero-Downtime Docker Deploys Without Kubernetes](https://www.matthewswong.com/en/blog/kamal-2-docker-deployment-guide/)
- [Coolify vs Dokploy: Self-Hosted PaaS for VPS Deployment](https://www.matthewswong.com/en/blog/coolify-vs-dokploy-self-hosted-paas/)
- [Dokploy: Self-Hosted PaaS on Your Own VPS with Docker](https://www.matthewswong.com/en/blog/dokploy-self-hosted-paas-vps/)
- [Docker BuildKit Cache Mounts: Cut CI Build Times in Half](https://www.matthewswong.com/en/blog/docker-buildkit-cache-mounts-faster-builds/)
- [Controlling Docker From Your Backend: dockerode and the Socket](https://www.matthewswong.com/en/blog/docker-daemon-socket-backend-control/)
- [Practical 3-2-1 Backups for VPSs with Restic and Object Storage](https://www.matthewswong.com/en/blog/backup-3-2-1-strategy-vps/)
- [What cgroups v2 Really Does When You Set Docker Memory Limits](https://www.matthewswong.com/en/blog/linux-cgroups-container-resource-limits/)
- [Blue-Green vs Canary Deployments on a Budget (No Kubernetes)](https://www.matthewswong.com/en/blog/blue-green-vs-canary-on-budget/)
- [Uptime Kuma: Self-Hosted Uptime Monitoring That Just Works](https://www.matthewswong.com/en/blog/self-hosted-uptime-kuma-monitoring/)
- [GitHub Actions Caching Strategies That Actually Cut CI Minutes](https://www.matthewswong.com/en/blog/github-actions-caching-strategies/)
- [Platform Engineering: Building an Internal Developer Platform](https://www.matthewswong.com/en/blog/platform-engineering-internal-developer-platform/)
- [Caddy vs Nginx for Automatic HTTPS: When Each One Wins](https://www.matthewswong.com/en/blog/caddy-vs-nginx-automatic-https/)
- [Docker Compose Watch: Instant Feedback for Local Container Dev](https://www.matthewswong.com/en/blog/docker-compose-watch-local-dev/)
- [k3s Kubernetes for Indonesian Startups on a Budget VPS](https://www.matthewswong.com/en/blog/kubernetes-k3s-production-lightweight-indonesia/)
- [FinOps for Indonesian Cloud Teams: Cost Optimization Guide](https://www.matthewswong.com/en/blog/finops-cloud-cost-optimization-indonesia/)
- [Indonesia PDN: Developer Guide to Government Cloud Migration](https://www.matthewswong.com/en/blog/pusat-data-nasional-pdn-cloud-developer-guide/)
- [Free Custom Email: Cloudflare Routing + SMTP2Go](https://www.matthewswong.com/en/blog/cloudflare-email-inbound-smtp2go/)
- [Google Cloud vs DigitalOcean for Side-Project Developers](https://www.matthewswong.com/en/blog/google-cloud-vs-digital-ocean/)
- [Grafana + Prometheus Monitoring Stack for Your VPS](https://www.matthewswong.com/en/blog/grafana-prometheus-monitoring-vps/)
- [Zero-Downtime Deployments with NGINX Blue-Green on a Single VPS](https://www.matthewswong.com/en/blog/zero-downtime-nginx-blue-green-deploy/)
- [Automate SSL Certificate Renewal with Certbot and NGINX](https://www.matthewswong.com/en/blog/automate-ssl-certbot-nginx/)
- [Self-Hosted Observability Stack on DigitalOcean](https://www.matthewswong.com/en/blog/self-hosted-observability-digital-ocean/)
- [Kubernetes for the Solo Developer: A Practical GKE Guide](https://www.matthewswong.com/en/blog/kubernetes-solo-developer-guide/)
- [The Docker Workflow I Use on Every Project](https://www.matthewswong.com/en/blog/docker-workflow-every-project/)
- [Google Cloud Managed Services vs Raw Compute: When to Use Which](https://www.matthewswong.com/en/blog/google-cloud-managed-services-vs-raw-compute/)
- [Event-Driven Architecture with Kafka and NestJS](https://www.matthewswong.com/en/blog/event-driven-kafka-nestjs/)
- [gRPC vs REST for Internal Microservices APIs](https://www.matthewswong.com/en/blog/microservices-grpc-vs-rest-internal/)
- [PostgreSQL Sharding Strategy: When and How to Scale](https://www.matthewswong.com/en/blog/postgresql-sharding-strategy/)
- [Message Queues in Node.js: RabbitMQ vs BullMQ](https://www.matthewswong.com/en/blog/message-queue-rabbitmq-bullmq/)
- [API Gateway Pattern with NestJS: Routing, Auth, Rate Limiting](https://www.matthewswong.com/en/blog/api-gateway-pattern-nestjs-guide/)
- [Distributed Tracing with OpenTelemetry in NestJS](https://www.matthewswong.com/en/blog/distributed-tracing-opentelemetry/)
- [Circuit Breaker Pattern in NestJS for Resilient Microservices](https://www.matthewswong.com/en/blog/circuit-breaker-nestjs-pattern/)
- [CQRS and Event Sourcing with NestJS: When It Is Worth It](https://www.matthewswong.com/en/blog/cqrs-event-sourcing-nestjs/)
- [Scaling WebSockets with Redis Pub/Sub: From One Server to Many](https://www.matthewswong.com/en/blog/websocket-scaling-redis-pubsub/)
- [OWASP Top 10 Developer Checklist: What I Actually Implement](https://www.matthewswong.com/en/blog/owasp-top-10-developer-checklist/)
- [JWT vs Session Authentication in Production](https://www.matthewswong.com/en/blog/jwt-vs-session-auth-production/)
- [SQL Injection Prevention with ORMs: Prisma and TypeORM](https://www.matthewswong.com/en/blog/sql-injection-orm-prevention/)
- [CORS Configuration for Next.js and NestJS in Production](https://www.matthewswong.com/en/blog/cors-configuration-nextjs-nestjs/)
- [HTTPS and TLS Beyond Certbot: Hardening Your SSL Configuration](https://www.matthewswong.com/en/blog/https-tls-beyond-certbot/)
- [API Security in NestJS Production: Controls I Deploy](https://www.matthewswong.com/en/blog/api-security-nestjs-production/)
- [Secret Scanning and Preventing Credentials Leaks in GitHub](https://www.matthewswong.com/en/blog/secret-scanning-github-prevention/)
- [Docker Container Security Scanning with Trivy](https://www.matthewswong.com/en/blog/docker-container-security-scanning/)
- [Penetration Testing Basics for Developers](https://www.matthewswong.com/en/blog/penetration-testing-developer-basics/)
- [Nginx vs Traefik: Choosing the Right Reverse Proxy](https://www.matthewswong.com/en/blog/nginx-vs-traefik/)
- [Linux Server Hardening Checklist: What I Do on Every Fresh VPS](https://www.matthewswong.com/en/blog/linux-server-hardening/)
- [GitHub Actions vs GitLab CI: Which CI/CD to Choose?](https://www.matthewswong.com/en/blog/github-actions-vs-gitlab/)
- [PostgreSQL vs MySQL in Production: Which to Choose?](https://www.matthewswong.com/en/blog/postgresql-vs-mysql/)
- [Redis Caching Patterns for NestJS: 450ms to 42ms](https://www.matthewswong.com/en/blog/redis-caching-nestjs/)
- [Docker Compose vs Kubernetes for Small Teams: When to Use Each](https://www.matthewswong.com/en/blog/docker-compose-vs-k8s/)
- [Monitoring and Alerting for Solo DevOps: A Practical Stack](https://www.matthewswong.com/en/blog/monitoring-alerting-solo/)
- [SSH Security Hardening for VPS](https://www.matthewswong.com/en/blog/ssh-security-hardening/)
- [PostgreSQL Backup Strategy for VPS: pg_dump to WAL](https://www.matthewswong.com/en/blog/postgresql-backup-strategy/)
- [Nginx Performance Tuning: From Default Config to 50,000 Req/s](https://www.matthewswong.com/en/blog/nginx-performance-tuning/)
- [Fail2ban on VPS: Automate Brute Force Protection in 15 Minutes](https://www.matthewswong.com/en/blog/fail2ban-vps-security/)
- [Systemd Services for Background Jobs: Node.js in Production](https://www.matthewswong.com/en/blog/systemd-services-jobs/)
- [WireGuard VPN for Private Cloud Networking](https://www.matthewswong.com/en/blog/wireguard-vpn-cloud/)
- [Log Rotation in Linux: Managing Production Logs](https://www.matthewswong.com/en/blog/log-rotation-linux/)
- [Docker Secrets in Production: Stop Using Env Variables](https://www.matthewswong.com/en/blog/docker-secrets-production/)
- [Cloud Run vs Cloud Functions: Which Platform Should You Use?](https://www.matthewswong.com/en/blog/cloud-run-vs-functions/)
- [Building Reusable Terraform Modules: A Production IaC Guide](https://www.matthewswong.com/en/blog/terraform-modules-reusable/)
- [Ansible Playbooks in Production: Real Automation Patterns](https://www.matthewswong.com/en/blog/ansible-playbooks-production/)
- [How I Cut Cloud Costs by 40%: Real Optimization Strategies](https://www.matthewswong.com/en/blog/cloud-cost-optimization/)
- [Multi-Cloud Strategy for Small Teams: Is It Worth It?](https://www.matthewswong.com/en/blog/multi-cloud-small-teams/)
- [CDN with Cloudflare: How to Serve Static Assets at the Edge](https://www.matthewswong.com/en/blog/cdn-cloudflare-static/)
- [Nginx Load Balancer in Production: Config and Health Checks](https://www.matthewswong.com/en/blog/load-balancer-production-config/)
- [Disaster Recovery Planning for VPS: Backups, RTO, Recovery](https://www.matthewswong.com/en/blog/disaster-recovery-vps/)
- [Container Registry on GCP: From GCR to Artifact Registry](https://www.matthewswong.com/en/blog/container-registry-gcr/)
- [VPC Networking for Developers: A Practical Guide](https://www.matthewswong.com/en/blog/vpc-networking-guide/)
- [Cloud Storage vs MinIO: Choosing Object Storage for Production](https://www.matthewswong.com/en/blog/cloud-storage-vs-minio/)
- [GitHub Actions Self-Hosted Runners: Setup and Security Guide](https://www.matthewswong.com/en/blog/github-actions-runners/)
- [HashiCorp Vault for Production Secrets Management: Setup](https://www.matthewswong.com/en/blog/hashicorp-vault-secrets/)
- [Prometheus and AlertManager: Building an On-Call Alert System](https://www.matthewswong.com/en/blog/prometheus-alertmanager/)
- [Elastic Stack (ELK) Self-Hosted: Production Setup and Lessons](https://www.matthewswong.com/en/blog/elastic-stack-self-hosted/)
- [Mastering Observability: Loki, Prometheus & Grafana](https://www.matthewswong.com/en/blog/loki-prometheus-observability/)
- [Cut GCS Egress Costs: Migrate to Cloudflare R2](https://www.matthewswong.com/en/blog/cloudflare-r2-gcs-egress/)
- [DevSecOps: Integrating Security into CI/CD](https://www.matthewswong.com/en/blog/devsecops-security-pipeline/)
- [SRE: SLOs, SLAs & Error Budgets Explained](https://www.matthewswong.com/en/blog/site-reliability-engineering-sre/)
- [GitOps with ArgoCD and Flux CD Explained](https://www.matthewswong.com/en/blog/gitops-argocd-flux/)
- [Infrastructure as Code with Terraform](https://www.matthewswong.com/en/blog/infrastructure-as-code-terraform/)
- [Ansible Infrastructure Automation Guide](https://www.matthewswong.com/en/blog/ansible-automation-infrastructure/)
- [Docker Swarm: Container Orchestration for Smaller Teams](https://www.matthewswong.com/en/blog/docker-swarm-orchestration/)
- [Docker Best Practices for Production Containers](https://www.matthewswong.com/en/blog/docker-containerization-best-practices/)
- [Kubernetes Deployment Strategies Explained](https://www.matthewswong.com/en/blog/kubernetes-deployment-strategies/)
- [CI/CD with GitHub Actions: From Zero to Production](https://www.matthewswong.com/en/blog/ci-cd-pipeline-github-actions/)

## Blog — Cloud

- [State of FinOps 2026: What 98% Managing AI Spend Means](https://www.matthewswong.com/en/blog/state-of-finops-2026-ai-cost-management/)
- [OpenCost Inference Cost per Million Tokens for Self-Hosted vLLM](https://www.matthewswong.com/en/blog/opencost-inference-cost-per-million-tokens-vllm/)
- [AWS Lambda MicroVMs for AI Agent Sandboxes: Hooks and Limits](https://www.matthewswong.com/en/blog/aws-lambda-microvms-ai-agent-sandboxes/)
- [Gemini Cloud Assist Investigations: Proactive RCA and FinOps](https://www.matthewswong.com/en/blog/gemini-cloud-assist-proactive-agents-finops-rca/)
- [Amazon EKS MCP Server: SigV4, CloudTrail and Write-Mode Risks](https://www.matthewswong.com/en/blog/amazon-eks-mcp-server-managed-cloudtrail-write-mode/)
- [AWS MCP Server in Claude Code: OAuth, SigV4 and IAM Scoping](https://www.matthewswong.com/en/blog/aws-mcp-server-ga-call-aws-sigv4-proxy/)
- [Azure SRE Agent: Tool Permissions, Hooks and Approval Gates](https://www.matthewswong.com/en/blog/azure-sre-agent-tool-permissions-approval-hooks/)
- [AWS DevOps Agent: Incident Investigation, Cost and Accuracy](https://www.matthewswong.com/en/blog/aws-devops-agent-incident-investigation-guide/)
- [High Availability Design: Redundancy, Failover and the Nines](https://www.matthewswong.com/en/blog/high-availability-redundancy-failover-design/)
- [Service Mesh vs API Gateway: Differences and When to Use Each](https://www.matthewswong.com/en/blog/service-mesh-vs-api-gateway/)
- [Design a Video Streaming System: HLS, CDN and Adaptive Bitrate](https://www.matthewswong.com/en/blog/design-video-streaming-system-hls-cdn/)
- [How a CDN Works: What to Cache at the Edge and What Not To](https://www.matthewswong.com/en/blog/how-cdn-works-edge-caching-explained/)
- [Horizontal vs Vertical Scaling: Which to Pick First](https://www.matthewswong.com/en/blog/horizontal-vs-vertical-scaling/)
- [Cloudflare Containers: 6x Faster Starts for Agent Sandboxes](https://www.matthewswong.com/en/blog/cloudflare-containers-agent-sandboxes/)
- [Indonesia Sovereign AI Data Centres: What Actually Changes](https://www.matthewswong.com/en/blog/indonesia-sovereign-ai-data-centre-impact/)
- [Jakarta GPU Capacity: VRAM Sizing for Indonesian AI Teams](https://www.matthewswong.com/en/blog/jakarta-gpu-capacity-indonesian-ai-startups/)
- [PaaS vs VPS in Indonesia: An Honest IDR Cost Breakdown](https://www.matthewswong.com/en/blog/paas-vs-vps-cost-indonesia-idr/)
- [Kubernetes HPA Autoscaling: Surviving a PaaS Traffic Spike](https://www.matthewswong.com/en/blog/helipod-hpa-autoscaling-traffic-spike/)
- [Jakarta vs Singapore PaaS Latency for Indonesian Users](https://www.matthewswong.com/en/blog/jakarta-vs-singapore-paas-latency/)
- [Helipod Review: Deploying Next.js on an Indonesian PaaS](https://www.matthewswong.com/en/blog/helipod-paas-indonesia-nextjs-deploy/)
- [Helipod vs Dokploy: Managed PaaS or Self-Hosted VPS](https://www.matthewswong.com/en/blog/helipod-vs-dokploy-managed-vs-self-hosted/)
- [Claude Code on Bedrock, Google Cloud and Microsoft Foundry](https://www.matthewswong.com/en/blog/claude-code-bedrock-vertex-foundry-setup/)
- [Claude Code on the Web: Cloud Sessions and Teleport](https://www.matthewswong.com/en/blog/claude-code-on-the-web-cloud-sessions/)
- [Claude Code Behind an LLM Gateway: What Breaks and Why](https://www.matthewswong.com/en/blog/claude-code-llm-gateway-enterprise/)
- [SumoPod Review: Cheap Indonesian VPS for Self-Hosting](https://www.matthewswong.com/en/blog/sumopod-cheap-indonesian-vps-review/)
- [Biznet Gio vs IDCloudHost: Indonesia Cloud VPS Compared](https://www.matthewswong.com/en/blog/biznet-gio-vs-idcloudhost-indonesia-cloud/)
- [Cheap VPS in Indonesia: A Practical Jakarta-Region Guide](https://www.matthewswong.com/en/blog/sewa-vps-murah-indonesia-panduan/)
- [Cloudflare Workers vs Vercel Edge: Cold Starts and Lock-In](https://www.matthewswong.com/en/blog/cloudflare-workers-vs-vercel-edge/)
- [Azure Indonesia Central Region: Developer Deployment Guide](https://www.matthewswong.com/en/blog/azure-indonesia-central-region-deployment-guide/)

## Blog — ERP Systems

- [ERP Expense Settlement Advance Reconciliation and Input VAT](https://www.matthewswong.com/en/blog/erp-expense-settlement-advance-reconciliation-input-vat/)
- [ERP Contract Billing Schedule Down Payment Without Double Bills](https://www.matthewswong.com/en/blog/erp-contract-billing-schedule-down-payment-invoices/)
- [ERP Payroll Amendment Closed Period: Fix It Without Editing](https://www.matthewswong.com/en/blog/erp-payroll-amendment-correct-closed-period/)
- [ERP AI Agent Tool Design: Drafts, Not Direct Writes](https://www.matthewswong.com/en/blog/erp-agent-tool-design-draft-documents/)
- [ERP Three-Way Match AI Agent: PO, Receipt and Invoice](https://www.matthewswong.com/en/blog/erp-three-way-match-ai-agent/)
- [Spec-Driven Development for ERP Requirements With AI Agents](https://www.matthewswong.com/en/blog/spec-driven-development-erp-requirements/)
- [AI-Assisted Legacy ERP Refactor With No Written Spec](https://www.matthewswong.com/en/blog/ai-assisted-legacy-erp-refactor/)
- [ERP Domain Rules as a Claude Code Plugin: Skills and Hooks](https://www.matthewswong.com/en/blog/claude-code-plugin-erp-domain-toolkit/)
- [Connect an ERP POS to a Bluetooth Printer With Flutter](https://www.matthewswong.com/en/blog/connect-erp-pos-bluetooth-printer-flutter/)
- [Epson TM-T82 ESC/POS Printing From a Custom POS App](https://www.matthewswong.com/en/blog/epson-tm-t82-escpos-pos-printing/)
- [Epson TM-T82 Cash Drawer, Auto Cutter and Status Bytes](https://www.matthewswong.com/en/blog/epson-tm-t82-cash-drawer-cutter-status/)
- [Coretax DJP Integration: e-Faktur & NPWP Guide for Devs](https://www.matthewswong.com/en/blog/coretax-djp-tax-integration-indonesia-developer/)
- [Kasbon ERP: Employee Cash Advance and Payroll Deduction](https://www.matthewswong.com/en/blog/kasbon-employee-cash-advance-payroll-deduction/)
- [ERP POS Cash-Session Reconciliation Design Guide](https://www.matthewswong.com/en/blog/pos-cash-session-reconciliation-design/)
- [Stock Opname ERP: ABC Cycle Counts Without Warehouse Freeze](https://www.matthewswong.com/en/blog/erp-stock-opname-cycle-count-indonesia/)
- [Landed Cost Calculation in ERP: True Import Cost in Indonesia](https://www.matthewswong.com/en/blog/erp-landed-cost-import-calculation-indonesia/)
- [Quote-to-Cash ERP Workflow: Quotation to Invoice to Payment](https://www.matthewswong.com/en/blog/erp-quotation-to-cash-sales-workflow/)
- [ERP Multi-Company Intercompany Transactions & Elimination](https://www.matthewswong.com/en/blog/erp-multi-company-intercompany-transactions/)
- [Consignment Inventory in ERP: Modeling Stock You Don't Own](https://www.matthewswong.com/en/blog/erp-consignment-inventory-workflow/)
- [e-Faktur Integration for ERP: PPN 12%, Coretax and NSFP](https://www.matthewswong.com/en/blog/erp-e-faktur-tax-integration-indonesia/)
- [Batch and Serial Tracking in ERP: Full Traceability](https://www.matthewswong.com/en/blog/erp-batch-serial-number-traceability/)
- [ERP General Ledger: Designing a Double-Entry Core in PostgreSQL](https://www.matthewswong.com/en/blog/erp-general-ledger-double-entry-design/)
- [ERP Manufacturing: BOM and MRP Module Design Guide](https://www.matthewswong.com/en/blog/erp-manufacturing-bom-mrp-design/)
- [ERP Fixed Asset Module: Depreciation Schedules Done Right](https://www.matthewswong.com/en/blog/erp-fixed-asset-depreciation-module/)
- [Procurement in ERP: PR to PO to Receipt to 3-Way Match](https://www.matthewswong.com/en/blog/erp-procurement-purchase-order-workflow/)
- [Outgrown Spreadsheets? A Decision Framework for SMBs](https://www.matthewswong.com/en/blog/spreadsheet-to-erp-decision-framework/)
- [ERP Adoption Playbook: Champions, Sandboxes, Cutover Comms](https://www.matthewswong.com/en/blog/erp-user-training-adoption-playbook/)
- [ERP Reporting Architecture: Read Models That Save Your OLTP](https://www.matthewswong.com/en/blog/erp-reporting-dashboard-architecture/)
- [ERP Approval Matrix Design: Stop Hardcoding Approval Chains](https://www.matthewswong.com/en/blog/erp-approval-matrix-configuration/)
- [Multi-Currency Accounting in ERP: Rates, FX Gains, IDR Rounding](https://www.matthewswong.com/en/blog/erp-multi-currency-accounting/)
- [ERP Inventory Module Design: Movements, Valuation, Guards](https://www.matthewswong.com/en/blog/erp-inventory-management-module-design/)
- [Odoo Custom Module Development for Indonesian Business](https://www.matthewswong.com/en/blog/odoo-erp-custom-module-development-indonesia/)
- [ERP Data Migration: Avoid Costly Mistakes](https://www.matthewswong.com/en/blog/erp-data-migration-strategy/)
- [Building an HR Leave Approval Flow in a Custom ERP](https://www.matthewswong.com/en/blog/erp-hr-leave-approval-flow/)
- [Accounts Payable Multi-Level Approval Workflow in NestJS](https://www.matthewswong.com/en/blog/accounts-payable-multi-approval-nestjs/)
- [ERP Invoice PDF Generation: Puppeteer + Handlebars in NestJS](https://www.matthewswong.com/en/blog/erp-invoice-pdf-generation/)
- [ERP Email Automation: Triggering Transactional Emails](https://www.matthewswong.com/en/blog/erp-email-automation/)
- [Why ERP Projects Fail in Indonesian SMEs and How to Avoid It](https://www.matthewswong.com/en/blog/why-erp-fails-indonesian-businesses/)
- [ERP Accounts Receivable Automation: Reminders, Aging and DSO](https://www.matthewswong.com/en/blog/accounts-receivable-automation-erp/)
- [Building a Workflow Engine for Multi-Step Approvals](https://www.matthewswong.com/en/blog/workflow-engine-react-nestjs-postgresql/)
- [Migrating from Excel to a Custom ERP: Data Mapping](https://www.matthewswong.com/en/blog/excel-to-custom-erp-migration/)
- [Role-Based Access Control in a Custom ERP: NestJS Guards](https://www.matthewswong.com/en/blog/erp-role-based-access-control/)
- [Building an ERP Audit Trail and Activity Log: PostgreSQL](https://www.matthewswong.com/en/blog/erp-audit-trail-activity-log/)
- [Building a Multi-Level Purchase Order Approval ERP Workflow](https://www.matthewswong.com/en/blog/erp-purchase-order-approval/)
- [Real-Time Inventory Tracking in a Custom ERP](https://www.matthewswong.com/en/blog/erp-inventory-real-time-tracking/)
- [ERP Financial Reporting Automation: P&L, Cash Flow, Tax Reports](https://www.matthewswong.com/en/blog/erp-financial-reporting-automation/)
- [Multi-Currency ERP in Indonesia: BI Rates, Kurs Pajak, PSAK 221](https://www.matthewswong.com/en/blog/erp-multi-currency-implementation/)
- [Building a Vendor and Supplier Portal for Your Custom ERP](https://www.matthewswong.com/en/blog/erp-vendor-supplier-portal/)
- [Project Costing and Time Tracking in a Custom ERP](https://www.matthewswong.com/en/blog/erp-project-costing-time-tracking/)
- [Integrating Payroll with Your Custom ERP: Payslips and Tax](https://www.matthewswong.com/en/blog/erp-payroll-integration-hr/)
- [Building a B2B Customer Portal Integrated with Your Custom ERP](https://www.matthewswong.com/en/blog/erp-customer-portal-b2b/)
- [Integrating Third-Party APIs with a Custom ERP](https://www.matthewswong.com/en/blog/erp-third-party-api-integration/)
- [Building an Executive KPI Dashboard for Your Custom ERP](https://www.matthewswong.com/en/blog/erp-kpi-dashboard-executives/)
- [Document Management in a Custom ERP](https://www.matthewswong.com/en/blog/erp-document-management/)
- [Warehouse Barcode Scanning Integration in a Custom ERP](https://www.matthewswong.com/en/blog/erp-warehouse-barcode-scanning/)
- [Indonesian Tax Compliance in a Custom ERP: PPN, PPh, e-Faktur](https://www.matthewswong.com/en/blog/erp-tax-compliance-indonesia-ppn/)
- [Budget vs. Actual Variance Analysis in a Custom ERP](https://www.matthewswong.com/en/blog/erp-budget-variance-analysis/)
- [ERP and CRM Integration: Connecting Sales to Operations](https://www.matthewswong.com/en/blog/erp-crm-integration-sales/)
- [Odoo vs SAP vs Custom ERP: Which Is Right for Your Business?](https://www.matthewswong.com/en/blog/odoo-vs-sap-vs-custom-erp/)
- [ERP Implementation Timeline: The Reality vs. The Sales Pitch](https://www.matthewswong.com/en/blog/erp-implementation-timeline-reality/)
- [ERP Change Management: Why People Determine Success](https://www.matthewswong.com/en/blog/erp-change-management-employees/)
- [ERP Data Quality and Migration Prep](https://www.matthewswong.com/en/blog/erp-data-quality-migration-prep/)
- [ERP ROI: Real Numbers from Real Implementations](https://www.matthewswong.com/en/blog/erp-roi-real-numbers/)
- [ERP Customization: A Brutal Cost-Benefit Analysis](https://www.matthewswong.com/en/blog/erp-customization-cost-benefit-analysis/)
- [ERP Go-Live Checklist: 40 Items Before You Switch On](https://www.matthewswong.com/en/blog/erp-go-live-checklist/)
- [ERP User Training Strategy for Faster Adoption](https://www.matthewswong.com/en/blog/erp-user-training-strategy/)
- [ERP Post Go-Live: What Happens in the First 90 Days](https://www.matthewswong.com/en/blog/erp-post-go-live-90-days/)
- [ERP Process Mapping: Requirements Work That Saves Projects](https://www.matthewswong.com/en/blog/erp-process-mapping-guide/)
- [ERP Security and Permissions Design: RBAC Done Right](https://www.matthewswong.com/en/blog/erp-security-permissions-design/)
- [ERP Mobile and PWA for Field Workers: Offline-First Design](https://www.matthewswong.com/en/blog/erp-mobile-pwa-field-workers/)
- [Migrating from Legacy Access Database to Custom ERP](https://www.matthewswong.com/en/blog/erp-legacy-access-db-migration/)
- [Cloud ERP vs On-Premise in Indonesia: Making the Right Call](https://www.matthewswong.com/en/blog/erp-cloud-vs-on-premise-indonesia/)
- [ERP Middleware and Integration Design: Connecting Your Systems](https://www.matthewswong.com/en/blog/erp-middleware-integration-design/)
- [ERP Customization vs Configuration Explained](https://www.matthewswong.com/en/blog/erp-customization-vs-configuration/)
- [ERP Integration: Connecting SAP & Oracle with APIs](https://www.matthewswong.com/en/blog/erp-integration-api-strategy/)
- [ERP as the Backbone of Digital Transformation](https://www.matthewswong.com/en/blog/erp-digital-transformation/)
- [ERP Implementation Guide: Selection to Go-Live](https://www.matthewswong.com/en/blog/erp-implementation-guide/)

## Blog — Backend & APIs

- [Integer vs Decimal Money Postgres: Two ERPs, Two Answers](https://www.matthewswong.com/en/blog/integer-rupiah-vs-numeric-decimal-postgres-erp/)
- [Envoy AI Gateway Is Now Agent Router: What 1.2 Changes](https://www.matthewswong.com/en/blog/envoy-ai-gateway-becomes-agent-router-1-2/)
- [Sync vs Async Microservices Communication: How to Choose](https://www.matthewswong.com/en/blog/sync-vs-async-microservices-communication/)
- [Database Partitioning vs Sharding: What Is the Difference?](https://www.matthewswong.com/en/blog/database-partitioning-vs-sharding/)
- [Latency vs Throughput: Differences, Trade-offs and Tuning](https://www.matthewswong.com/en/blog/latency-vs-throughput-explained/)
- [Bloom Filter Explained: Where It Fits in System Design](https://www.matthewswong.com/en/blog/bloom-filter-explained-system-design/)
- [Service Discovery in Microservices: How It Works](https://www.matthewswong.com/en/blog/service-discovery-microservices-explained/)
- [Leader Election in Distributed Systems: Leases and Fencing](https://www.matthewswong.com/en/blog/leader-election-distributed-systems/)
- [Pub/Sub vs Message Queue: Differences and When to Use Each](https://www.matthewswong.com/en/blog/pub-sub-vs-message-queue/)
- [Raft Consensus Algorithm Explained: Elections and Logs](https://www.matthewswong.com/en/blog/raft-consensus-algorithm-explained/)
- [Backpressure in Distributed Systems: Stop a Fast Producer](https://www.matthewswong.com/en/blog/backpressure-distributed-systems-explained/)
- [Bulkhead Pattern Explained: Isolate Failures in Backend Systems](https://www.matthewswong.com/en/blog/bulkhead-pattern-fault-isolation/)
- [Retry with Exponential Backoff and Jitter in TypeScript](https://www.matthewswong.com/en/blog/retry-exponential-backoff-jitter/)
- [ACID vs BASE: Database Consistency Models and When It Matters](https://www.matthewswong.com/en/blog/acid-vs-base-database-consistency/)
- [Transaction Isolation Levels Explained in PostgreSQL](https://www.matthewswong.com/en/blog/database-transaction-isolation-levels-explained/)
- [Design a Distributed Key-Value Store, Dynamo-Style](https://www.matthewswong.com/en/blog/design-key-value-store-from-scratch/)
- [Design a Flash Sale System That Never Oversells Stock](https://www.matthewswong.com/en/blog/design-flash-sale-inventory-system/)
- [Eventual Consistency Explained: When Is Stale Data Acceptable?](https://www.matthewswong.com/en/blog/eventual-consistency-explained/)
- [Two-Phase Commit vs Saga: Distributed Transactions Compared](https://www.matthewswong.com/en/blog/two-phase-commit-vs-saga/)
- [Design a Payment System: Ledger, Idempotency, Reconciliation](https://www.matthewswong.com/en/blog/design-payment-system-ledger-reconciliation/)
- [Design a Web Crawler: URL Frontier, robots.txt and Dedup](https://www.matthewswong.com/en/blog/design-web-crawler-system-design/)
- [Design a Distributed Job Scheduler That Runs Each Job Once](https://www.matthewswong.com/en/blog/design-distributed-job-scheduler/)
- [Distributed ID Generator: Snowflake vs UUIDv7 vs ULID](https://www.matthewswong.com/en/blog/distributed-id-generator-snowflake-uuid/)
- [Geohash vs Quadtree: How Nearby Driver Search Works](https://www.matthewswong.com/en/blog/geohash-quadtree-nearby-search-design/)
- [Design a Chat App Like WhatsApp: Real-Time System Design](https://www.matthewswong.com/en/blog/design-chat-application-system-design/)
- [News Feed System Design: Fan-Out on Write vs Fan-Out on Read](https://www.matthewswong.com/en/blog/design-news-feed-fan-out-on-write-vs-read/)
- [Design Search Autocomplete (Typeahead): Tries, Redis, Postgres](https://www.matthewswong.com/en/blog/design-search-autocomplete-typeahead/)
- [How to Design a Scalable Notification System (Push, Email, SMS)](https://www.matthewswong.com/en/blog/design-notification-system-architecture/)
- [Design a URL Shortener Like bit.ly: System Design Guide](https://www.matthewswong.com/en/blog/design-url-shortener-system-design/)
- [Token Bucket vs Sliding Window: Rate Limiting Algorithms](https://www.matthewswong.com/en/blog/rate-limiting-algorithms-token-bucket-sliding-window/)
- [Cache-Aside vs Write-Through vs Write-Back: Which Fits?](https://www.matthewswong.com/en/blog/cache-aside-vs-write-through-caching/)
- [Cache Invalidation Strategies: TTL, Events and Versioned Keys](https://www.matthewswong.com/en/blog/cache-invalidation-strategies/)
- [Database Indexing Explained: How B-Trees Work in Postgres](https://www.matthewswong.com/en/blog/database-indexing-b-tree-explained/)
- [Database Replication Explained: Leader-Follower, Sync vs Async](https://www.matthewswong.com/en/blog/database-replication-leader-follower/)
- [Read Replicas Return Stale Data: Handling Replication Lag](https://www.matthewswong.com/en/blog/read-replicas-replication-lag-pitfalls/)
- [SQL vs NoSQL: How to Choose a Database for a New System](https://www.matthewswong.com/en/blog/sql-vs-nosql-how-to-choose/)
- [CAP Theorem Explained: How It Shapes Your Database Choice](https://www.matthewswong.com/en/blog/cap-theorem-explained-practical-examples/)
- [Consistent Hashing Explained: Hash Ring and Virtual Nodes](https://www.matthewswong.com/en/blog/consistent-hashing-explained/)
- [A2A Protocol Tutorial: v1.0 Agent Cards, Tasks and Bindings](https://www.matthewswong.com/en/blog/a2a-protocol-v1-agent-cards-guide/)
- [Durable AI Agents With Temporal: Survive Crashes and Waits](https://www.matthewswong.com/en/blog/durable-ai-agents-temporal-workflows/)
- [MCP 2026-07-28 Spec Migration: Stateless Guide for Servers](https://www.matthewswong.com/en/blog/mcp-2026-07-28-stateless-spec-migration/)
- [OpenAI Assistants API Shutdown Migration to the Responses API](https://www.matthewswong.com/en/blog/openai-assistants-api-shutdown-migration/)
- [PaaS Postgres Connection Limits: Surviving max_connections](https://www.matthewswong.com/en/blog/paas-postgres-connection-limits-survival/)
- [Reviewing AI-Written Postgres Migrations Before They Run](https://www.matthewswong.com/en/blog/ai-database-migration-safety-review/)
- [Durable Execution for AI Agents: Surviving Hours-Long Runs](https://www.matthewswong.com/en/blog/durable-execution-ai-agent-workflows/)
- [My ERP Approval npm Library Passed 1,200 Weekly Downloads](https://www.matthewswong.com/en/blog/hierarchical-approval-1200-weekly-downloads/)
- [Deploy a NestJS ERP API to a Managed PaaS: Probes, Migrations](https://www.matthewswong.com/en/blog/deploy-nestjs-erp-api-paas-guide/)
- [Epson TM-T82 Network Printing: Port 9100 Troubleshooting](https://www.matthewswong.com/en/blog/epson-tm-t82-network-printing-troubleshooting/)
- [AI Agents for ERP Development: Real Use Cases](https://www.matthewswong.com/en/blog/ai-agents-erp-development-use-cases/)
- [MCP Primitives: Tools, Resources, and Prompts](https://www.matthewswong.com/en/blog/mcp-tools-resources-prompts-primitives/)
- [MCP Transports: stdio vs Streamable HTTP](https://www.matthewswong.com/en/blog/mcp-transports-stdio-vs-http/)
- [Build an MCP Server in TypeScript: A Guide](https://www.matthewswong.com/en/blog/build-mcp-server-typescript-guide/)
- [Distributed Locking with Redis Redlock in Node.js](https://www.matthewswong.com/en/blog/distributed-locking-redis-redlock-nodejs/)
- [Turso and libSQL: Edge SQLite with Embedded Replicas](https://www.matthewswong.com/en/blog/turso-libsql-edge-sqlite/)
- [DuckDB: In-Process OLAP Analytics on Parquet, CSV, and S3](https://www.matthewswong.com/en/blog/duckdb-in-process-analytics/)
- [Run TypeScript Natively in Node.js: Type Stripping](https://www.matthewswong.com/en/blog/nodejs-native-typescript-type-stripping/)
- [PostgreSQL 18: Async I/O, uuidv7 and Skip Scan Explained](https://www.matthewswong.com/en/blog/postgresql-18-async-io-performance/)
- [HTTP QUERY Method: The Safe GET With a Body (RFC 10008)](https://www.matthewswong.com/en/blog/http-query-method-rfc-10008/)
- [Midtrans Snap Payment Gateway Integration in Next.js](https://www.matthewswong.com/en/blog/midtrans-payment-gateway-integration-nextjs/)
- [Dynamic QRIS Payment Integration in Node.js (MPM, Midtrans)](https://www.matthewswong.com/en/blog/qris-dynamic-payment-integration-nodejs/)
- [WhatsApp Business API Integration for Indonesia (Cloud API)](https://www.matthewswong.com/en/blog/whatsapp-business-api-integration-indonesia/)
- [Bun vs Node.js Production Runtime in 2026: Which to Use](https://www.matthewswong.com/en/blog/bun-vs-nodejs-production-runtime/)
- [Drizzle ORM vs Prisma: TypeScript Backend ORM Guide](https://www.matthewswong.com/en/blog/drizzle-orm-vs-prisma-typescript/)
- [Hono Edge API Framework: Workers, Bun, Node Guide](https://www.matthewswong.com/en/blog/hono-edge-api-framework-guide/)
- [NATS JetStream vs Kafka: Streams for Lean Teams](https://www.matthewswong.com/en/blog/nats-jetstream-vs-kafka-lightweight/)
- [NestJS Request-Scoped Providers: DI Gotchas & Fixes](https://www.matthewswong.com/en/blog/nestjs-request-scoped-providers-di-gotchas/)
- [openapi-typescript: End-to-End Type Safety for APIs](https://www.matthewswong.com/en/blog/openapi-typescript-end-to-end-types/)
- [OpenTelemetry Tracing in NestJS with Auto-Instrumentation](https://www.matthewswong.com/en/blog/opentelemetry-tracing-nestjs-auto-instrumentation/)
- [PostgreSQL Zero-Downtime Upgrade with Logical Replication](https://www.matthewswong.com/en/blog/postgres-logical-replication-zero-downtime-upgrade/)
- [Server-Sent Events vs WebSockets for Realtime Apps](https://www.matthewswong.com/en/blog/server-sent-events-vs-websockets-realtime/)
- [Postgres UNION View for a Derived ERP Cash Book Ledger](https://www.matthewswong.com/en/blog/derived-cash-book-union-view-postgres/)
- [Integer Money in IDR: Why ERP Backends Avoid Float](https://www.matthewswong.com/en/blog/integer-money-idr-avoid-float-errors/)
- [POS Payment Idempotency Keys in NestJS + Prisma](https://www.matthewswong.com/en/blog/pos-payment-settlement-idempotency-keys/)
- [Inventory Source of Truth: Append-Only Stock Movement Ledger](https://www.matthewswong.com/en/blog/stock-movement-source-of-truth-vs-cached-qty/)
- [Shopee & Tokopedia Seller API Integration Guide](https://www.matthewswong.com/en/blog/tokopedia-shopee-marketplace-api-integration/)
- [Xendit vs Midtrans: Indonesia Payment Gateway Compared](https://www.matthewswong.com/en/blog/xendit-vs-midtrans-payment-gateway-indonesia/)
- [Expand/Contract Pattern for Zero-Downtime Schema Migration](https://www.matthewswong.com/en/blog/expand-contract-schema-migration-pattern/)
- [Idempotent Consumer Pattern for Message Queues](https://www.matthewswong.com/en/blog/idempotent-consumer-pattern-message-queue/)
- [PgBouncer Pooling Modes: Session vs Transaction Explained](https://www.matthewswong.com/en/blog/pgbouncer-connection-pooling-modes/)
- [PostgreSQL EXPLAIN ANALYZE: Reading Query Plans](https://www.matthewswong.com/en/blog/postgres-explain-analyze-reading-query-plans/)
- [PostgreSQL Generated Columns: STORED, Indexing & Derived Data](https://www.matthewswong.com/en/blog/postgres-generated-columns-computed-data/)
- [SQLite Litestream Replication in Production Guide](https://www.matthewswong.com/en/blog/sqlite-litestream-replication-production/)
- [Valkey vs Redis: Fork Migration Guide for Backend Teams](https://www.matthewswong.com/en/blog/valkey-vs-redis-fork-migration/)
- [Saga Pattern in NestJS: Distributed Transactions Without 2PC](https://www.matthewswong.com/en/blog/saga-pattern-distributed-transactions-nestjs/)
- [Postgres Job Queue with SELECT FOR UPDATE SKIP LOCKED](https://www.matthewswong.com/en/blog/postgres-skip-locked-job-queue/)
- [Transactional Outbox Pattern in PostgreSQL: Reliable Events](https://www.matthewswong.com/en/blog/transactional-outbox-pattern-postgres/)
- [Reliable Webhooks: HMAC Signing, Retries, Idempotency, Replay](https://www.matthewswong.com/en/blog/webhooks-reliable-delivery-design/)
- [Feature Flags in NestJS: Progressive Rollouts and Kill Switches](https://www.matthewswong.com/en/blog/feature-flags-nestjs-progressive-rollout/)
- [Testing NestJS Applications: Unit, Integration, E2E Guide](https://www.matthewswong.com/en/blog/testing-nestjs-applications-guide/)
- [Zero-Downtime Database Migrations with Prisma and Postgres](https://www.matthewswong.com/en/blog/zero-downtime-database-migrations-prisma/)
- [PostgreSQL Row-Level Security for Multi-Tenant SaaS](https://www.matthewswong.com/en/blog/postgres-row-level-security-multitenant/)
- [NestJS Custom Decorators: Metadata, Reflector & Guards](https://www.matthewswong.com/en/blog/nestjs-custom-decorators-metadata-reflection/)
- [I Built an npm Library for ERP Hierarchical Approval Workflows](https://www.matthewswong.com/en/blog/hierarchical-approval-npm-library/)
- [NestJS Health Checks with Terminus for Kubernetes & Docker](https://www.matthewswong.com/en/blog/nestjs-terminus-health-checks/)
- [Marketplace Price Monitoring SaaS: Tokopedia and Shopee](https://www.matthewswong.com/en/blog/marketplace-price-monitoring-saas-tokopedia-shopee/)
- [Reliable Background Jobs with BullMQ and NestJS](https://www.matthewswong.com/en/blog/background-jobs-bullmq-nestjs/)
- [Idempotency Keys: Designing APIs That Survive Retries](https://www.matthewswong.com/en/blog/idempotency-keys-api-design/)
- [Multi-Tenant SaaS Architecture With Postgres RLS](https://www.matthewswong.com/en/blog/multi-tenant-saas-postgres-rls-indonesia/)
- [PostgreSQL Indexing in Practice: B-tree, GIN, Partial Indexes](https://www.matthewswong.com/en/blog/postgres-indexing-practical-guide/)
- [SaaS Recurring Billing in Indonesia: Midtrans and Xendit](https://www.matthewswong.com/en/blog/saas-recurring-billing-midtrans-xendit-qris-indonesia/)
- [WhatsApp Invoice Reminder SaaS: Build It for Indonesia](https://www.matthewswong.com/en/blog/whatsapp-invoice-reminder-saas-indonesia/)
- [Indonesia SNAP API & QRIS Cross-Border: Developer Guide](https://www.matthewswong.com/en/blog/indonesia-open-banking-snap-api-qris-developer-guide/)

## Blog — Software Development

- [Back-of-the-Envelope Capacity Estimation: QPS to Servers](https://www.matthewswong.com/en/blog/back-of-the-envelope-capacity-estimation/)
- [Hexagonal Architecture (Ports and Adapters) in TypeScript](https://www.matthewswong.com/en/blog/hexagonal-architecture-ports-and-adapters/)
- [Bounded Contexts in Domain-Driven Design and How to Find Them](https://www.matthewswong.com/en/blog/domain-driven-design-bounded-contexts-explained/)
- [Modular Monolith Architecture: When It Beats Microservices](https://www.matthewswong.com/en/blog/modular-monolith-architecture-guide/)
- [Strangler Fig Pattern: Monolith to Microservices Migration](https://www.matthewswong.com/en/blog/strangler-fig-monolith-to-microservices-migration/)
- [System Design for Developers: What It Is and How to Learn It](https://www.matthewswong.com/en/blog/system-design-explained-for-developers/)
- [Open Source Maintenance from Indonesia: The UTC+7 Timezone Tax](https://www.matthewswong.com/en/blog/indonesian-open-source-maintainer-sustainability/)
- [AI Commit Messages and Changelog Automation: Why Beats What](https://www.matthewswong.com/en/blog/ai-commit-message-changelog-automation/)
- [AI-Generated Tests: Coverage Rose, Mutation Score Did Not](https://www.matthewswong.com/en/blog/ai-generated-tests-coverage-honesty/)
- [Bundling LSP Servers in a Claude Code Plugin, and Its Cost](https://www.matthewswong.com/en/blog/claude-code-plugin-lsp-bundling-guide/)
- [Migrating Claude Code Dotfiles into a Versioned Plugin](https://www.matthewswong.com/en/blog/claude-code-dotfiles-to-plugin-migration/)
- [Claude Code Plugin Marketplace Curation: What Earns a Slot](https://www.matthewswong.com/en/blog/claude-code-plugin-marketplace-curation/)
- [Claude Code Plugin vs Skill: When to Bundle a Workflow](https://www.matthewswong.com/en/blog/claude-code-plugin-vs-skill-bundling/)
- [Claude Code Plugin Eval: Catch a Skill That Never Activates](https://www.matthewswong.com/en/blog/claude-code-plugin-eval-test-suite/)
- [Claude Code Interactive Mode: Shortcuts and Prompt Tricks](https://www.matthewswong.com/en/blog/claude-code-interactive-mode-shortcuts/)
- [Claude Code LSP Plugins: Real Code Intelligence for Claude](https://www.matthewswong.com/en/blog/claude-code-lsp-code-intelligence/)
- [Claude Code Errors: What They Mean and How to Fix Them](https://www.matthewswong.com/en/blog/claude-code-troubleshooting-common-errors/)
- [Claude Code CLI Flags: The Ones Worth Knowing by Job](https://www.matthewswong.com/en/blog/claude-code-cli-reference-flags-guide/)
- [Claude Code Sessions: Resume, Branch and Name Your Work](https://www.matthewswong.com/en/blog/claude-code-sessions-resume-branch-naming/)
- [Claude Code Desktop Scheduled Tasks: Local Automation](https://www.matthewswong.com/en/blog/claude-code-desktop-scheduled-tasks/)
- [Claude Code for JetBrains: The Plugin and Its MCP Server](https://www.matthewswong.com/en/blog/claude-code-jetbrains-plugin-guide/)
- [Claude Code in VS Code: The Extension, Not the CLI](https://www.matthewswong.com/en/blog/claude-code-vs-code-extension-guide/)
- [Claude Code Accessibility: Screen Readers and Beyond](https://www.matthewswong.com/en/blog/claude-code-accessibility-screen-reader/)
- [Claude Code Fullscreen: Flicker-Free, With Trade-Offs](https://www.matthewswong.com/en/blog/claude-code-fullscreen-focus-view-tui/)
- [Claude Code Keybindings: Rebind, Unbind and Chords](https://www.matthewswong.com/en/blog/claude-code-keybindings-customization/)
- [Claude Code Status Line: Context, Cost and Cache Live](https://www.matthewswong.com/en/blog/claude-code-statusline-customization/)
- [Claude Code Terminal Setup: Shift+Enter, Bells, Themes](https://www.matthewswong.com/en/blog/claude-code-terminal-setup-notifications/)
- [Flutter Bluetooth Thermal Printer Setup: Panda 58mm POS](https://www.matthewswong.com/en/blog/flutter-panda-bluetooth-thermal-printer-setup/)
- [Build 58mm ESC/POS Receipts in Flutter With esc_pos_utils](https://www.matthewswong.com/en/blog/flutter-escpos-receipt-builder-58mm/)
- [Flutter Bluetooth Permissions on Android 12+ for Printers](https://www.matthewswong.com/en/blog/flutter-bluetooth-permissions-android-12-printer/)
- [Fixing Garbled Flutter Bluetooth Thermal Printer Receipts](https://www.matthewswong.com/en/blog/flutter-thermal-printer-garbled-receipt-fixes/)
- [Epson TM-T82: Windows Driver vs Raw ESC/POS Printing](https://www.matthewswong.com/en/blog/epson-tm-t82-driver-vs-raw-escpos/)
- [AI Agents for Legacy Code Migration: A Guide](https://www.matthewswong.com/en/blog/ai-agents-legacy-code-migration/)
- [Verification Loops: The Core Agentic Coding Skill](https://www.matthewswong.com/en/blog/verification-loops-agentic-coding/)
- [How to Test AI-Generated Code: Best Practices](https://www.matthewswong.com/en/blog/testing-ai-generated-code-guide/)
- [Spec-First AI Coding: Let the Agent Interview You](https://www.matthewswong.com/en/blog/spec-first-agent-interview-workflow/)
- [Vibe Coding vs Spec-Driven Development](https://www.matthewswong.com/en/blog/vibe-coding-vs-spec-driven-development/)
- [TDD With AI Coding Agents: A Practical Workflow](https://www.matthewswong.com/en/blog/tdd-with-ai-coding-agents/)
- [AGENTS.md vs CLAUDE.md: Agent Context Files](https://www.matthewswong.com/en/blog/agents-md-vs-claude-md/)
- [Integration Testing NestJS with Testcontainers and Postgres](https://www.matthewswong.com/en/blog/testcontainers-nestjs-integration-testing/)
- [TypeScript using Keyword: Explicit Resource Management](https://www.matthewswong.com/en/blog/typescript-using-keyword-disposal/)
- [pnpm Catalogs: Fix Monorepo Dependency Version Drift](https://www.matthewswong.com/en/blog/pnpm-catalogs-monorepo-versions/)
- [JavaScript Iterator Helpers (ES2025): Lazy map/filter/take](https://www.matthewswong.com/en/blog/javascript-iterator-helpers-es2025/)
- [Deno 2: Node.js and npm Compatibility for Existing Projects](https://www.matthewswong.com/en/blog/deno-2-nodejs-compatibility/)
- [TypeScript Goes Native: The 10x Faster Go Compiler tsgo](https://www.matthewswong.com/en/blog/typescript-native-go-compiler-tsgo/)
- [Effect-TS: Typed Functional Error Handling in TypeScript](https://www.matthewswong.com/en/blog/effect-ts-functional-error-handling/)
- [Flutter Offline-First Outbox Sync for Field Apps](https://www.matthewswong.com/en/blog/flutter-offline-outbox-sync-field-app/)
- [Repository Adapter Pattern for Next.js + Flutter Offline Parity](https://www.matthewswong.com/en/blog/mock-real-repository-adapter-offline-parity/)
- [TypeScript satisfies Operator: Config and Route Map Patterns](https://www.matthewswong.com/en/blog/typescript-satisfies-operator-patterns/)
- [API Versioning Strategies: URL, Header, or No Version at All](https://www.matthewswong.com/en/blog/api-versioning-strategies-rest/)
- [Event-Driven Architecture: When NOT to Use It](https://www.matthewswong.com/en/blog/event-driven-architecture-when-not-to/)
- [Next.js Performance: Core Web Vitals & Beyond](https://www.matthewswong.com/en/blog/nextjs-performance-optimization/)
- [PostgreSQL Performance: Indexing & Query Tuning](https://www.matthewswong.com/en/blog/database-optimization-postgresql/)
- [Software Architecture: MVC, CQRS, Event-Driven](https://www.matthewswong.com/en/blog/software-architecture-patterns/)
- [Test-Driven Development: Write Tests First](https://www.matthewswong.com/en/blog/test-driven-development-tdd/)
- [REST vs GraphQL: Choosing the Right API Design](https://www.matthewswong.com/en/blog/api-design-rest-graphql/)
- [Microservices vs Monolith: When to Split](https://www.matthewswong.com/en/blog/microservices-vs-monolith/)
- [Clean Code Principles Every Developer Should Know](https://www.matthewswong.com/en/blog/clean-code-principles/)

## Blog — Web Development

- [How to Build an Accessible Website in Next.js (Beginners)](https://www.matthewswong.com/en/blog/cara-membuat-website-accessible-nextjs/)
- [How to Run the Node Test Runner in Next.js for Beginners](https://www.matthewswong.com/en/blog/cara-menjalankan-node-test-runner-nextjs/)
- [How Next.js Caching Works: Static, Dynamic and Revalidate](https://www.matthewswong.com/en/blog/cara-kerja-caching-rendering-nextjs-static-dynamic/)
- [How to Improve Core Web Vitals in Next.js for Beginners](https://www.matthewswong.com/en/blog/cara-meningkatkan-core-web-vitals-nextjs/)
- [How to Build Next.js Middleware: Matcher, Redirect, Rewrite](https://www.matthewswong.com/en/blog/cara-membuat-middleware-nextjs/)
- [How to Build an API in Next.js with Route Handlers (route.ts)](https://www.matthewswong.com/en/blog/cara-membuat-api-nextjs-route-handlers/)
- [How to Add SEO Metadata in the Next.js App Router for Beginners](https://www.matthewswong.com/en/blog/cara-membuat-seo-metadata-nextjs-app-router/)
- [How to Build a Playwright Smoke Test in GitHub Actions](https://www.matthewswong.com/en/blog/cara-smoke-test-playwright-github-actions/)
- [Server vs Client Components in Next.js: A Beginner Guide](https://www.matthewswong.com/en/blog/perbedaan-server-component-client-component-nextjs/)
- [Next.js Standalone Docker Image Size: A Real Dockerfile](https://www.matthewswong.com/en/blog/nextjs-standalone-docker-image-size/)
- [Claude Code Plugin for Next.js: Skill, Hook, Subagent](https://www.matthewswong.com/en/blog/claude-code-plugin-nextjs-stack-toolkit/)
- [Claude Code Artifacts: Publish a Page From a Session](https://www.matthewswong.com/en/blog/claude-code-artifacts-publishing-guide/)
- [Answer Engine Optimization (AEO): Get Cited by AI Search](https://www.matthewswong.com/en/blog/answer-engine-optimization-ai-search/)
- [Speculation Rules API: Instant Prerender and Prefetch in Chrome](https://www.matthewswong.com/en/blog/speculation-rules-api-prerendering/)
- [JavaScript Temporal API: The Modern Replacement for Date](https://www.matthewswong.com/en/blog/javascript-temporal-api-guide/)
- [Next.js 16: Migrate middleware.ts to proxy.ts](https://www.matthewswong.com/en/blog/nextjs-16-proxy-ts-migration/)
- [Next.js Cache Components and the use cache Directive](https://www.matthewswong.com/en/blog/nextjs-cache-components-use-cache/)
- [Next.js Hydration Errors: Causes and How to Fix Them](https://www.matthewswong.com/en/blog/nextjs-hydration-errors-fix/)
- [Securing Next.js Server Actions: Auth, IDOR & Zod Validation](https://www.matthewswong.com/en/blog/nextjs-server-actions-security/)
- [Astro 5 Server Islands & Content Layer API: What's New](https://www.matthewswong.com/en/blog/astro-5-server-islands-content-layer/)
- [Svelte 5 Runes: $state, $derived, $effect Reactivity](https://www.matthewswong.com/en/blog/svelte-5-runes-reactivity/)
- [HTMX and the Hypermedia-Driven Application Approach](https://www.matthewswong.com/en/blog/htmx-hypermedia-driven-apps/)
- [Tailwind CSS v4: Oxide Engine and CSS-First Config](https://www.matthewswong.com/en/blog/tailwind-css-v4-oxide-engine/)
- [React Compiler: Automatic Memoization Without useMemo](https://www.matthewswong.com/en/blog/react-compiler-automatic-memoization/)
- [Biome vs ESLint + Prettier: One Rust Toolchain to Replace Two](https://www.matthewswong.com/en/blog/biome-vs-eslint-prettier-toolchain/)
- [Rolldown: Vite's Rust Bundler Replacing Rollup](https://www.matthewswong.com/en/blog/vite-rolldown-rust-bundler/)
- [Debouncing and Throttling in React: useDebounce Hook Guide](https://www.matthewswong.com/en/blog/debouncing-throttling-react-hooks-guide/)
- [React Server Components vs Islands Architecture Guide](https://www.matthewswong.com/en/blog/react-server-components-vs-islands-architecture/)
- [TanStack Router: Type-Safe React Routing Guide](https://www.matthewswong.com/en/blog/tanstack-router-type-safe-routing/)
- [Valibot vs Zod: Bundle Size and Tree-Shaking Compared](https://www.matthewswong.com/en/blog/valibot-vs-zod-bundle-size/)
- [React Web Workers with Comlink: Offload the Main Thread](https://www.matthewswong.com/en/blog/web-workers-offload-main-thread-react/)
- [Zod 4 Schema Validation: Performance, Mini, Migration](https://www.matthewswong.com/en/blog/zod-4-schema-validation-performance/)
- [Dynamic Open Graph Images with Next.js ImageResponse](https://www.matthewswong.com/en/blog/nextjs-dynamic-og-image-generation/)
- [React Hook Form and Zod: Type-Safe Forms Guide](https://www.matthewswong.com/en/blog/react-hook-form-zod-type-safe-forms/)
- [Zustand vs Redux Toolkit: Choosing React State in 2026](https://www.matthewswong.com/en/blog/zustand-vs-redux-toolkit-state/)
- [Next.js Streaming SSR and Suspense: Loading UI That Feels Fast](https://www.matthewswong.com/en/blog/nextjs-streaming-suspense-patterns/)
- [Optimizing INP: The Core Web Vital That Replaced FID](https://www.matthewswong.com/en/blog/web-vitals-inp-optimization-2026/)
- [shadcn/ui Architecture: Own Your Components, Not a Dependency](https://www.matthewswong.com/en/blog/shadcn-ui-component-architecture/)
- [TanStack Query in Next.js App Router: Prefetch and Hydrate](https://www.matthewswong.com/en/blog/tanstack-query-nextjs-app-router/)
- [React 19 use() Hook and Actions: A Practical Async Guide](https://www.matthewswong.com/en/blog/react-19-use-hook-actions-guide/)
- [Server-Sent Events in Next.js: Simpler Than WebSockets](https://www.matthewswong.com/en/blog/server-sent-events-nextjs-streaming/)
- [Next.js Partial Prerendering: Static Shell With Streamed Holes](https://www.matthewswong.com/en/blog/nextjs-partial-prerendering-ppr/)
- [Technical SEO for Developers: Canonical, hreflang, JSON-LD](https://www.matthewswong.com/en/blog/technical-seo-checklist-developers/)
- [What next/image Actually Does: srcset, AVIF, and the Cache](https://www.matthewswong.com/en/blog/nextjs-image-optimization-internals/)
- [Design Tokens with Tailwind: A Theme That Survives a Rebrand](https://www.matthewswong.com/en/blog/design-tokens-tailwind-theme/)
- [Self-Hosting Web Fonts for Performance: next/font Done Right](https://www.matthewswong.com/en/blog/self-hosting-web-fonts-performance/)
- [React Server Components: The Mental Model That Finally Clicks](https://www.matthewswong.com/en/blog/react-server-components-mental-model/)
- [Next.js Server Actions in Production: Forms, Validation](https://www.matthewswong.com/en/blog/nextjs-server-actions-production/)
- [Building a Production Landing Page: 100 on Core Web Vitals](https://www.matthewswong.com/en/blog/production-landing-page-core-web-vitals/)
- [TypeScript Project Structure for Real-World Apps](https://www.matthewswong.com/en/blog/typescript-project-structure-real-world/)
- [My Figma to Next.js Component Workflow](https://www.matthewswong.com/en/blog/figma-to-nextjs-component-workflow/)
- [Next.js i18n with next-intl: A Complete Guide](https://www.matthewswong.com/en/blog/nextjs-i18n-next-intl-guide/)
- [Scalable Next.js Project Structure with App Router](https://www.matthewswong.com/en/blog/nextjs-project-structure-scalable/)
- [How to Build a SaaS in 30 Days with Next.js and Tailwind](https://www.matthewswong.com/en/blog/build-saas-30-days-nextjs-tailwind/)
- [Building Type-Safe REST APIs with NestJS and Prisma](https://www.matthewswong.com/en/blog/type-safe-api-nestjs-prisma/)
- [SEO-First Next.js: The Complete Checklist for 2026](https://www.matthewswong.com/en/blog/seo-first-nextjs-checklist/)
- [React Query vs SWR: Which to Use in 2026](https://www.matthewswong.com/en/blog/react-query-vs-swr/)
- [Real User Monitoring: Why Lab Data Lies and Field Data Wins](https://www.matthewswong.com/en/blog/real-user-monitoring-web-performance/)
- [Image Optimization in Next.js: WebP and AVIF Settings](https://www.matthewswong.com/en/blog/image-optimization-nextjs-webp-avif/)
- [Next.js Caching in 2025: ISR, SSR, and When to Use Each](https://www.matthewswong.com/en/blog/nextjs-caching-isr-ssr-strategy/)
- [Database Connection Pooling in NestJS: PgBouncer](https://www.matthewswong.com/en/blog/database-connection-pooling-nestjs/)
- [PostgreSQL Full-Text Search Without Elasticsearch](https://www.matthewswong.com/en/blog/postgresql-full-text-search-no-elasticsearch/)
- [Cursor vs Offset Pagination: The 17x Performance Gap at Scale](https://www.matthewswong.com/en/blog/cursor-vs-offset-pagination/)
- [API Versioning in NestJS: The Strategy I Actually Ship](https://www.matthewswong.com/en/blog/api-versioning-nestjs-strategy/)
- [GraphQL vs REST in 2025: Which One for Your Next Project?](https://www.matthewswong.com/en/blog/graphql-vs-rest-2025/)
- [OpenAPI and Swagger in NestJS: Auto-Generated Docs](https://www.matthewswong.com/en/blog/openapi-swagger-nestjs/)
- [Environment Variables and Secrets in Next.js](https://www.matthewswong.com/en/blog/environment-variables-secrets-nextjs/)
- [E2E Testing Next.js Apps with Playwright: Setup and CI](https://www.matthewswong.com/en/blog/e2e-testing-playwright-nextjs/)
- [Accessibility Audit for Next.js Apps: Automating WCAG](https://www.matthewswong.com/en/blog/accessibility-audit-nextjs/)
- [npm Dependency Management and Security Auditing](https://www.matthewswong.com/en/blog/npm-dependency-management-audit/)
- [Security Headers in Next.js: The Config I Actually Ship](https://www.matthewswong.com/en/blog/security-headers-nextjs-configuration/)
- [Dark Mode in Next.js: System-Aware and Flicker-Free](https://www.matthewswong.com/en/blog/dark-mode-nextjs-system-aware/)
- [Testing Next.js Apps with Vitest and Jest: A Comparison](https://www.matthewswong.com/en/blog/nextjs-testing-vitest-jest/)
- [Storybook for Component Documentation: A Living Design System](https://www.matthewswong.com/en/blog/storybook-component-documentation/)
- [Next.js App Router Migration: Lessons from a Real Project](https://www.matthewswong.com/en/blog/nextjs-app-router-migration-lessons/)
- [Tailwind CSS vs CSS Modules: Which Should You Use in 2025?](https://www.matthewswong.com/en/blog/tailwindcss-vs-css-modules/)
- [Prisma vs TypeORM in NestJS: Which ORM Should You Choose?](https://www.matthewswong.com/en/blog/prisma-vs-typeorm-nestjs-comparison/)
- [NextAuth vs Clerk: Authentication in Next.js Apps in 2025](https://www.matthewswong.com/en/blog/nextauth-vs-clerk-comparison/)
- [WebSockets in NestJS: Building Real-Time Features in Production](https://www.matthewswong.com/en/blog/websockets-nestjs-realtime/)
- [File Upload to S3 in Next.js: The Production Pattern](https://www.matthewswong.com/en/blog/file-upload-s3-nextjs-production/)
- [Resend vs Nodemailer: Transactional Email in 2025](https://www.matthewswong.com/en/blog/resend-vs-nodemailer-email/)
- [Next.js API Routes vs NestJS: Choosing Your Backend in 2025](https://www.matthewswong.com/en/blog/nextjs-api-routes-vs-nestjs/)
- [TypeScript Strict Mode in Production: Why It's Non-Negotiable](https://www.matthewswong.com/en/blog/typescript-strict-mode-production/)
- [React Server Components: When and How to Use Them in Next.js](https://www.matthewswong.com/en/blog/react-server-components-usage/)
- [Next.js Middleware: Real Use Cases Beyond the Docs](https://www.matthewswong.com/en/blog/nextjs-middleware-real-use-cases/)
- [Framer Motion vs CSS Animations: When to Use Each](https://www.matthewswong.com/en/blog/framer-motion-vs-css-animations/)
- [Monorepo with Turborepo: Running Next.js and NestJS Together](https://www.matthewswong.com/en/blog/monorepo-turborepo-setup/)
- [API Rate Limiting in NestJS with Redis: A Production Guide](https://www.matthewswong.com/en/blog/api-rate-limiting-nestjs-redis/)
- [Next.js Error Handling Patterns: From error.tsx to Production](https://www.matthewswong.com/en/blog/nextjs-error-handling-patterns/)
- [BPJS API Integration for Developers: SIPP, EPS and Bridging](https://www.matthewswong.com/en/blog/bpjs-api-integration/)

## Blog — AI & LLMs

- [AI Agent Harness Engineering: What Research and Real Runs Show](https://www.matthewswong.com/en/blog/ai-agent-harness-engineering-research/)
- [How to Write a CLAUDE.md File That Works in Claude Code](https://www.matthewswong.com/en/blog/cara-menulis-claude-md-yang-efektif/)
- [Backstage MCP Actions Backend: Secure AI Access to Your Portal](https://www.matthewswong.com/en/blog/backstage-mcp-actions-backend-ai-agents/)
- [Stack Overflow Developer Survey 2026: AI Agent Trust](https://www.matthewswong.com/en/blog/stack-overflow-developer-survey-2026-ai-agent-trust/)
- [METR AI Developer Productivity Study 2026: What It Really Says](https://www.matthewswong.com/en/blog/metr-developer-productivity-2026-uplift-update/)
- [Perplexity SPACE: Firecracker Agent Sandbox, Warm Pools, E2B](https://www.matthewswong.com/en/blog/perplexity-space-firecracker-agent-sandbox/)
- [Docker Sandboxes sbx: Run Claude Code in Cloud MicroVMs](https://www.matthewswong.com/en/blog/docker-sandboxes-cloud-sandboxes-sbx-guide/)
- [kagent Kubernetes Tutorial: AI Agents on a Laptop Cluster](https://www.matthewswong.com/en/blog/kagent-ai-agents-kubernetes-tutorial/)
- [Kubernetes Agent Sandbox CRD: Isolated Stateful AI Agents](https://www.matthewswong.com/en/blog/kubernetes-agent-sandbox-crd-ai-agents/)
- [Kubernetes AI Conformance: What the KARs Demand of a Platform](https://www.matthewswong.com/en/blog/kubernetes-ai-conformance-program-explained/)
- [Cloudflare Code Mode MCP: Two Tools, 1,000 Tokens, a Sandbox](https://www.matthewswong.com/en/blog/cloudflare-code-mode-mcp-two-tools-1000-tokens/)
- [Elastic nightshift AI SRE: Start With the Investigation Engine](https://www.matthewswong.com/en/blog/elastic-nightshift-ai-sre-four-engines/)
- [A2A vs MCP: Which AI Agent Protocol Do You Actually Need?](https://www.matthewswong.com/en/blog/a2a-vs-mcp-agent-protocols/)
- [AI Agent Cost Optimization: Budget Per Task, Not Per Call](https://www.matthewswong.com/en/blog/ai-agent-cost-per-task-budgets/)
- [AI Agent Evaluation: How to Test Tool Calls and Trajectories](https://www.matthewswong.com/en/blog/ai-agent-evals-trajectory-testing/)
- [ChatGPT Plugins (Apps SDK) Guide: Build an ERP Plugin on MCP](https://www.matthewswong.com/en/blog/chatgpt-plugins-apps-sdk-mcp-guide/)
- [Claude Managed Agents vs OpenAI Agents API: Full Comparison](https://www.matthewswong.com/en/blog/claude-managed-agents-vs-openai-agents-api/)
- [Google ADK 2.0 Tutorial: Graph Workflows and Multi-Agents](https://www.matthewswong.com/en/blog/google-adk-2-graph-workflows-tutorial/)
- [LangChain create_agent Middleware Guide: PII, Limits, Fallback](https://www.matthewswong.com/en/blog/langchain-create-agent-middleware-guide/)
- [LangGraph vs CrewAI in 2026: Which for Production Agents?](https://www.matthewswong.com/en/blog/langgraph-vs-crewai-production-agents/)
- [Mastra TypeScript Agent Framework Tutorial: Workflows and Evals](https://www.matthewswong.com/en/blog/mastra-typescript-agent-framework-tutorial/)
- [Microsoft Agent Framework 1.0: Semantic Kernel Migration Guide](https://www.matthewswong.com/en/blog/microsoft-agent-framework-semantic-kernel-migration/)
- [OpenAI Agent Builder Shutdown: Migrate Before Nov 30, 2026](https://www.matthewswong.com/en/blog/openai-agent-builder-shutdown-migration/)
- [OpenAI Agents API Tutorial: Hosted Agents and Sandboxes](https://www.matthewswong.com/en/blog/openai-agents-api-hosted-sandbox-tutorial/)
- [OpenAI Agents API vs Agents SDK vs Responses API: Which?](https://www.matthewswong.com/en/blog/openai-agents-api-vs-agents-sdk/)
- [OpenAI Agents SDK Guardrails: Input, Output and Tool Checks](https://www.matthewswong.com/en/blog/openai-agents-sdk-guardrails-tripwires/)
- [OpenAI Agents SDK Handoffs vs Agents as Tools Explained](https://www.matthewswong.com/en/blog/openai-agents-sdk-handoffs-vs-agents-as-tools/)
- [OpenAI Agents SDK Sandbox Agents: Manifest, Docker, E2B](https://www.matthewswong.com/en/blog/openai-agents-sdk-sandbox-agents-manifest/)
- [OpenAI Agents SDK Sessions: SQLite, Redis and Postgres Memory](https://www.matthewswong.com/en/blog/openai-agents-sdk-sessions-redis-sqlalchemy/)
- [OpenAI Agents SDK TypeScript Tutorial: Build a Tool Agent](https://www.matthewswong.com/en/blog/openai-agents-sdk-typescript-tutorial/)
- [OpenAI Agents SDK vs Google ADK vs Claude Agent SDK (2026)](https://www.matthewswong.com/en/blog/openai-agents-sdk-vs-google-adk-vs-claude-agent-sdk/)
- [OpenAI ChatKit Tutorial: Self-Hosted Agent Chat in React](https://www.matthewswong.com/en/blog/openai-chatkit-self-hosted-chat-ui/)
- [OpenAI DevDay 2026 for Developers: Sol, Ultrafast, Agents API](https://www.matthewswong.com/en/blog/openai-devday-2026-developer-announcements/)
- [OpenAI Dots Agents Explained: Always-On ChatGPT Agents](https://www.matthewswong.com/en/blog/openai-dots-always-on-chatgpt-agents/)
- [OpenAI Evals Shutdown: Migrate Your Evals to Promptfoo](https://www.matthewswong.com/en/blog/openai-evals-shutdown-promptfoo-migration/)
- [OpenAI Realtime Voice Agent over SIP with gpt-realtime-2.1](https://www.matthewswong.com/en/blog/openai-realtime-voice-agent-sip-phone/)
- [OpenAI Responses API Remote MCP: Approvals, Filters, Tunnels](https://www.matthewswong.com/en/blog/openai-responses-remote-mcp-approvals/)
- [OpenAI Skills API: SKILL.md Bundles in the Hosted Shell](https://www.matthewswong.com/en/blog/openai-skills-api-hosted-shell/)
- [Playwright MCP vs Browser Use vs Stagehand: Browser Agents](https://www.matthewswong.com/en/blog/playwright-mcp-vs-browser-use-vs-stagehand/)
- [WhatsApp AI Agent Indonesia: UMKM Order Bot with Agents SDK](https://www.matthewswong.com/en/blog/whatsapp-ai-agent-umkm-indonesia/)
- [Bahasa Indonesia LLM Token Cost: 1.23x, Not 2-3x, Measured](https://www.matthewswong.com/en/blog/bahasa-indonesia-llm-token-cost/)
- [RAG Bahasa Indonesia: Postgres Full-Text Search Misses Docs](https://www.matthewswong.com/en/blog/rag-bahasa-indonesia-search-retrieval/)
- [Speech-to-Text Bahasa Indonesia in Production: Real Whisper WER](https://www.matthewswong.com/en/blog/speech-to-text-bahasa-indonesia-production/)
- [How ChatGPT Astra Built My 3D Portfolio Game, Step by Step](https://www.matthewswong.com/en/blog/chatgpt-astra-3d-portfolio-game-archipelago/)
- [Indonesia Grok Block: AI Image Moderation for Product Builders](https://www.matthewswong.com/en/blog/indonesia-grok-block-ai-moderation-lesson/)
- [Sahabat AI: Indonesian LLM Developer Guide and Token Costs](https://www.matthewswong.com/en/blog/sahabat-ai-indonesian-llm-developer-guide/)
- [Onboarding an AI Coding Agent to an Unfamiliar Codebase](https://www.matthewswong.com/en/blog/ai-agent-onboarding-unfamiliar-codebase/)
- [Prompt Regression Testing in CI: Assert a Rate, Not an Answer](https://www.matthewswong.com/en/blog/prompt-regression-testing-ci-evals/)
- [Deterministic Hooks vs Agent Judgement in Claude Code](https://www.matthewswong.com/en/blog/deterministic-hooks-vs-agent-judgement/)
- [LLM Token Budget for a Small Engineering Team: Where It Goes](https://www.matthewswong.com/en/blog/llm-token-budget-engineering-team/)
- [AI Code Review as a CI Merge Gate: What Should Block](https://www.matthewswong.com/en/blog/ai-code-review-merge-gate-ci/)
- [Context Engineering for AI Coding Agents in a Monorepo](https://www.matthewswong.com/en/blog/context-engineering-monorepo-ai-agents/)
- [A2A Protocol: How AI Agents Discover and Delegate to Peers](https://www.matthewswong.com/en/blog/a2a-protocol-agent-interoperability/)
- [Indonesia AI Adoption: Is the Country on the Right Path?](https://www.matthewswong.com/en/blog/indonesia-ai-adoption-right-path/)
- [Go and TypeScript: Strict Types for AI-Assisted Coding](https://www.matthewswong.com/en/blog/go-typescript-ai-assisted-coding/)
- [Claude Code Advisor Tool: A Second Model at Key Moments](https://www.matthewswong.com/en/blog/claude-code-advisor-tool-second-opinion/)
- [Claude Code Auto Memory: What Claude Remembers and Why](https://www.matthewswong.com/en/blog/claude-code-auto-memory-recall/)
- [Claude Code Fast Mode and Effort Levels: Speed vs Cost](https://www.matthewswong.com/en/blog/claude-code-fast-mode-effort-levels/)
- [Claude Code goal Command: Turns Until a Condition Holds](https://www.matthewswong.com/en/blog/claude-code-goal-command-autonomous-loop/)
- [Claude Code Plugin Dependencies and Version Constraints](https://www.matthewswong.com/en/blog/claude-code-plugin-dependencies-versioning/)
- [Claude Code Plugin Marketplace: Authoring marketplace.json](https://www.matthewswong.com/en/blog/claude-code-plugin-marketplace-authoring/)
- [Claude Code Background Agents: The Supervisor Model](https://www.matthewswong.com/en/blog/claude-code-agent-view-background-sessions/)
- [Claude Code Channels: Push Events Into a Live Session](https://www.matthewswong.com/en/blog/claude-code-channels-external-events/)
- [Claude Code Ultrareview: A Verified Multi-Agent Review](https://www.matthewswong.com/en/blog/claude-code-code-review-ultrareview/)
- [Claude Code in Chrome: Browser Automation From the CLI](https://www.matthewswong.com/en/blog/claude-code-chrome-browser-automation/)
- [Claude Code 1M Context: When It Helps and When It Hurts](https://www.matthewswong.com/en/blog/claude-code-1m-context-window-strategy/)
- [Claude Code Cross-Session Messaging: Sessions That Talk](https://www.matthewswong.com/en/blog/claude-code-cross-session-messaging/)
- [Claude Code Model Config: Aliases, Fallbacks, Effort](https://www.matthewswong.com/en/blog/claude-code-model-config-fallback-picker/)
- [Claude Code Prompt Caching: Tune the TTL, Cut the Bill](https://www.matthewswong.com/en/blog/claude-code-prompt-caching-ttl-tuning/)
- [Claude Code Tool Search: Defer MCP Tools, Save Context](https://www.matthewswong.com/en/blog/claude-code-tool-search-deferred-tools/)
- [Claude Code Agent Teams: Parallel Multi-Agent Workflows](https://www.matthewswong.com/en/blog/claude-code-agent-teams-guide/)
- [Claude Code Dynamic Workflows: Orchestrate 1,000 Agents](https://www.matthewswong.com/en/blog/claude-code-dynamic-workflows-orchestration/)
- [Claude Code Remote Control: Drive Local Sessions Remotely](https://www.matthewswong.com/en/blog/claude-code-remote-control-mobile-sessions/)
- [Claude Code Usage Data: What 400,000 Sessions Reveal](https://www.matthewswong.com/en/blog/claude-code-usage-statistics-research-2026/)
- [Free-Tier Model Fallback Chains for an Autonomous Agent](https://www.matthewswong.com/en/blog/hermes-agent-free-tier-model-fallback-chain/)
- [Autonomous Agent Prompt Design: Tiny Commits That Land](https://www.matthewswong.com/en/blog/hermes-agent-prompt-design-tiny-commits/)
- [Give an Autonomous Coding Agent Memory: KNOWLEDGE + RAG](https://www.matthewswong.com/en/blog/autonomous-agent-knowledge-rag-loop/)
- [Claude Code MCP Server Setup: Scopes, Auth, Tool Budget](https://www.matthewswong.com/en/blog/claude-code-mcp-server-setup-governance/)
- [Claude Code Context Window: Compaction and Token Control](https://www.matthewswong.com/en/blog/claude-code-context-window-compaction/)
- [Claude Code in a Monorepo: Scoped CLAUDE.md and Skills](https://www.matthewswong.com/en/blog/claude-code-monorepo-workflow/)
- [Claude Code Content Pipeline for a Bilingual Next.js Blog](https://www.matthewswong.com/en/blog/claude-code-bilingual-blog-content-pipeline/)
- [Best Terminal AI Coding Agents in 2026](https://www.matthewswong.com/en/blog/best-terminal-ai-coding-agents-2026/)
- [Fan-Out vs Pipeline: AI Agent Patterns](https://www.matthewswong.com/en/blog/fan-out-vs-pipeline-agent-pattern/)
- [How to Write a CLAUDE.md That Improves AI Output](https://www.matthewswong.com/en/blog/writing-claude-md-memory-guide/)
- [Best Claude Code Plugins 2026: 62 Agentic Workflow Tools](https://www.matthewswong.com/en/blog/claude-code-plugins-marketplace-guide/)
- [Claude Code Plan Mode: Ship Fewer Broken PRs](https://www.matthewswong.com/en/blog/claude-code-plan-mode-guide/)
- [Claude Code vs Cursor vs Copilot: 2026 Compared](https://www.matthewswong.com/en/blog/claude-code-vs-cursor-vs-copilot/)
- [Claude Code Skills: Author On-Demand Procedures](https://www.matthewswong.com/en/blog/claude-code-skills-authoring-guide/)
- [Claude Code Subagents: Setup and Workflow Guide](https://www.matthewswong.com/en/blog/claude-code-subagents-setup-guide/)
- [Agentic Coding Workflow: Best Practices for AI Agents](https://www.matthewswong.com/en/blog/agentic-coding-workflow-best-practices/)
- [AI Agent vs LLM: What Is the Difference?](https://www.matthewswong.com/en/blog/ai-agent-vs-llm-model/)
- [Claude Code vs Codex: Agentic Coding Compared](https://www.matthewswong.com/en/blog/claude-code-vs-codex-agentic-coding/)
- [DeepSeek V4 Flash: Building a Spider-Man Cafe Tracker](https://www.matthewswong.com/en/blog/deepseek-v4-flash-cafe-tracker/)
- [How Claude Code Works: Agentic Coding Explained](https://www.matthewswong.com/en/blog/how-claude-code-works-agentic-coding/)
- [Human-in-the-Loop Design for AI Agents](https://www.matthewswong.com/en/blog/human-in-the-loop-ai-agents/)
- [MCP OAuth: Why Authentication for AI Agents Is Hard](https://www.matthewswong.com/en/blog/mcp-oauth-authentication-hard/)
- [MCP vs Function Calling: How AI Agents Use Tools](https://www.matthewswong.com/en/blog/mcp-vs-function-calling/)
- [Multi-Agent Orchestration: Subagents Explained](https://www.matthewswong.com/en/blog/multi-agent-orchestration-subagents-workflow/)
- [Spec-Driven Development With AI Coding Agents](https://www.matthewswong.com/en/blog/spec-driven-development-ai-agents/)
- [Cloudflare Wallets: Programmable Payments for AI Agents](https://www.matthewswong.com/en/blog/cloudflare-wallets-agentic-payments/)
- [Claude Code Slash Commands: Automate Your Prompts](https://www.matthewswong.com/en/blog/claude-code-slash-commands-guide/)
- [Claude Code Output Styles: Custom System Prompts](https://www.matthewswong.com/en/blog/claude-code-output-styles-guide/)
- [How to Fix AI Agent Infinite Handoff Loops](https://www.matthewswong.com/en/blog/ai-agent-handoff-loops-fix/)
- [Claude Code Hooks: Deterministic Agent Guardrails](https://www.matthewswong.com/en/blog/claude-code-hooks-guardrails-guide/)
- [Claude Code Checkpointing: Rewind Risky Changes](https://www.matthewswong.com/en/blog/claude-code-checkpointing-rewind-guide/)
- [Claude Code Cost Optimization: Cut Token Spend](https://www.matthewswong.com/en/blog/claude-code-cost-optimization-guide/)
- [AI Writer-Reviewer Pattern for Coding Agents](https://www.matthewswong.com/en/blog/ai-writer-reviewer-agent-pattern/)
- [Claude Code Skills vs Hooks vs Subagents vs MCP](https://www.matthewswong.com/en/blog/claude-code-skills-vs-hooks-vs-subagents/)
- [Context Engineering for LLM Agents: Write, Select, Compress](https://www.matthewswong.com/en/blog/context-engineering-llm-agents/)
- [Run Local LLMs with Ollama: Models, API, and Modelfile](https://www.matthewswong.com/en/blog/ollama-run-local-llms/)
- [Vercel AI SDK 5 Guide: Type-Safe Chat, Tools & Agents](https://www.matthewswong.com/en/blog/vercel-ai-sdk-5-guide/)
- [llms.txt Explained: The AI Standard for Website Content](https://www.matthewswong.com/en/blog/llms-txt-ai-website-standard/)
- [Building a Streaming Chatbot with Groq and Next.js](https://www.matthewswong.com/en/blog/groq-nextjs-streaming-chatbot/)
- [Document Data Extraction with Multimodal LLMs: A Guide](https://www.matthewswong.com/en/blog/multimodal-llm-document-data-extraction/)
- [Semantic Caching for LLMs: Cut API Costs on Repeat Prompts](https://www.matthewswong.com/en/blog/semantic-caching-llm-cost-reduction/)
- [Building Production Agents with the Claude Agent SDK](https://www.matthewswong.com/en/blog/claude-agent-sdk-building-agents/)
- [LLM Evals in CI: Testing Prompts Like Code](https://www.matthewswong.com/en/blog/llm-evaluation-testing-ci-pipeline/)
- [LLM Structured Output: JSON Schema That Actually Validates](https://www.matthewswong.com/en/blog/llm-structured-output-json-schema/)
- [Claude Fable 5: What Developers Need to Know](https://www.matthewswong.com/en/blog/claude-fable-5-developers-guide/)
- [AI Agents in Production: Lessons from Agentic Workflows](https://www.matthewswong.com/en/blog/ai-agents-production-lessons/)
- [AI Product Description Generator SaaS for Sellers](https://www.matthewswong.com/en/blog/ai-product-description-saas-indonesia/)
- [MCP Explained: What the Model Context Protocol Actually Solves](https://www.matthewswong.com/en/blog/mcp-model-context-protocol-explained/)
- [How I Combine Opus 4.7 and Sonnet 4.6 in Claude Code](https://www.matthewswong.com/en/blog/claude-opus-4-7-whats-new/)
- [LLM Prompt Caching: The Cheapest Cost Optimization](https://www.matthewswong.com/en/blog/llm-prompt-caching-cost-optimization/)
- [Hermes AI Agent by Nous Research: Architecture Guide](https://www.matthewswong.com/en/blog/hermes-ai-agent-nousresearch-guide/)
- [MCP Authorization with Cerbos: Policy-as-Code for AI Agents](https://www.matthewswong.com/en/blog/mcp-auth-cerbos-authorization/)
- [How I Cut My LLM API Bill by 60% Without Touching Model Quality](https://www.matthewswong.com/en/blog/llm-api-cost-optimization/)
- [AI Agent Workflow Automation in 2025: What Actually Works](https://www.matthewswong.com/en/blog/ai-agent-workflow-automation-2025/)
- [RAG Pipeline Production Lessons: What Nobody Tells You](https://www.matthewswong.com/en/blog/rag-pipeline-production-lessons/)
- [Claude API Tool Use in Production: A Real-World Guide](https://www.matthewswong.com/en/blog/claude-api-tool-use-production/)
- [OpenAI vs Anthropic vs Google Gemini: A Developer's Comparison](https://www.matthewswong.com/en/blog/openai-vs-anthropic-vs-gemini-developers/)
- [LangChain vs Building Your Own LLM Orchestration](https://www.matthewswong.com/en/blog/langchain-vs-custom-llm/)
- [AI-Powered Code Review with GitHub Actions: My Setup](https://www.matthewswong.com/en/blog/ai-code-review-github-actions/)
- [pgvector vs Pinecone vs Qdrant: Choosing a Vector Database](https://www.matthewswong.com/en/blog/pgvector-vs-pinecone-comparison/)
- [Prompt Engineering for Production: Beyond the Basics](https://www.matthewswong.com/en/blog/prompt-engineering-production/)
- [AI Content Generation Quality Control at Scale](https://www.matthewswong.com/en/blog/ai-content-generation-quality/)
- [Prompt Injection Defense: How I Harden AI Systems](https://www.matthewswong.com/en/blog/ai-prompt-injection-defense/)
- [Building an MCP Server from Scratch: A Developer Guide](https://www.matthewswong.com/en/blog/mcp-server-development-guide/)
- [AI Agent Memory Persistence Patterns](https://www.matthewswong.com/en/blog/ai-agent-memory-persistence-patterns/)
- [Running Local LLMs with Ollama in Production: What I Learned](https://www.matthewswong.com/en/blog/local-llm-ollama-production/)
- [AI Observability: How to Log, Trace, and Monitor LLM Apps](https://www.matthewswong.com/en/blog/ai-observability-llm-logging/)
- [Function Calling Patterns: OpenAI vs Anthropic Tool Use](https://www.matthewswong.com/en/blog/function-calling-openai-anthropic/)

## Blog — AI / Machine Learning

- [Datadog Scout 1.0: What Cheaper AI SRE Investigations Mean](https://www.matthewswong.com/en/blog/datadog-scout-sre-model-bits-investigation-cost/)
- [LMCache Multi-Process Mode: Shared KV Cache for MoE Serving](https://www.matthewswong.com/en/blog/lmcache-multi-process-mode-moe-shared-kv-cache/)
- [vLLM Semantic Router v0.4: Mixture-of-Models Routing Guide](https://www.matthewswong.com/en/blog/vllm-semantic-router-v0-4-mixture-of-models-routing/)
- [KServe LLMInferenceService Guide: llm-d, WVA and vLLM](https://www.matthewswong.com/en/blog/kserve-llminferenceservice-llm-d-production-guide/)
- [OCI Model Artifacts: Faster Kubernetes Model Cold Start](https://www.matthewswong.com/en/blog/oci-model-artifacts-kserve-faster-model-cold-start/)
- [NVIDIA Dynamo on Kubernetes: Rust EPP and v1beta1 Upgrade](https://www.matthewswong.com/en/blog/nvidia-dynamo-1-5-rust-endpoint-picker-kubernetes/)
- [DeepSeek V4.1 Flash on vLLM vs SGLang: What the Numbers Mean](https://www.matthewswong.com/en/blog/deepseek-v4-1-flash-serving-vllm-vs-sglang/)
- [SGLang Unified Radix Cache: Prefix Caching for Hybrid Models](https://www.matthewswong.com/en/blog/sglang-unified-radix-cache-hybrid-model-prefix-caching/)
- [vllm-metal on Apple Silicon: a Local vLLM Server for Mac](https://www.matthewswong.com/en/blog/vllm-metal-apple-silicon-local-llm-server/)
- [vLLM 0.31 Release Notes: Fast Restart and Breaking Changes](https://www.matthewswong.com/en/blog/vllm-0-31-fast-restart-preload-weight-cache/)
- [vLLM Bi-Directional KV Transfer for Multi-Turn Agents](https://www.matthewswong.com/en/blog/vllm-bidirectional-kv-transfer-multi-turn-agents/)
- [vLLM Disaggregated Prefill Decode: A NixlConnector Guide](https://www.matthewswong.com/en/blog/vllm-disaggregated-prefill-decode-serving-guide/)
- [vLLM NixlPushConnector: Push vs Pull KV Transfer and TTFT](https://www.matthewswong.com/en/blog/vllm-nixl-push-connector-faster-ttft-disaggregated/)
- [Hybrid Search and Reranking: Boosting RAG Retrieval](https://www.matthewswong.com/en/blog/hybrid-search-reranking-rag/)
- [Embedding Model Selection: A Practical RAG Benchmark Guide](https://www.matthewswong.com/en/blog/embedding-model-selection-benchmark/)
- [Semantic Search with pgvector: Skip the Vector Database](https://www.matthewswong.com/en/blog/pgvector-semantic-search-postgres/)
- [RAG vs Fine-Tuning: An Honest Decision Framework](https://www.matthewswong.com/en/blog/rag-vs-fine-tuning-decision/)
- [Building Production RAG Applications: Architecture & Evaluation](https://www.matthewswong.com/en/blog/building-production-rag-llm-applications/)

## Blog — Security

- [Project Glasswing Patch Gap: 6,157 Disclosed, 516 Patched](https://www.matthewswong.com/en/blog/project-glasswing-patching-deficit-open-source/)
- [Cyber Resilience Act Reporting Obligations: A DevOps Runbook](https://www.matthewswong.com/en/blog/eu-cra-reporting-september-2026-devops-runbook/)
- [NIST AI Agent Standards Initiative: What CAISI Covers](https://www.matthewswong.com/en/blog/nist-ai-agent-standards-initiative-caisi/)
- [AIBOM Hugging Face Study: 97,940 Models, Docs Missing](https://www.matthewswong.com/en/blog/aibom-completeness-hugging-face-models-ml-bom/)
- [Pickle Model Scanner Evasion: ShadowPickle and Safetensors](https://www.matthewswong.com/en/blog/shadowpickle-model-scanner-evasion-safetensors/)
- [PP 33/2026 Pelindungan Data Pribadi: A Developer Guide](https://www.matthewswong.com/en/blog/gr-33-2026-pdp-implementing-regulation-developers/)
- [Malicious Agent Skills: ClawHavoc SKILL.md Supply Chain Guide](https://www.matthewswong.com/en/blog/agent-skills-supply-chain-clawhavoc-skill-md/)
- [GitGuardian Secrets Sprawl 2026: AI Agent Commits, MCP Configs](https://www.matthewswong.com/en/blog/gitguardian-secrets-sprawl-2026-ai-agent-commits/)
- [Anthropic Threat Report September 2026: DevOps Lessons](https://www.matthewswong.com/en/blog/anthropic-threat-report-september-2026-agent-attacks/)
- [AI Code Security Report 2026: Veracode Stuck at 56% Pass Rate](https://www.matthewswong.com/en/blog/veracode-2026-genai-code-security-report-pass-rate/)
- [Cursor CVE-2026-22708 RCE: Shell Built-ins Beat the Allowlist](https://www.matthewswong.com/en/blog/cursor-cve-2026-22708-shell-builtins-allowlist-bypass/)
- [Hijacked AI Coding Assistant Session Spread Shai-Hulud Worm](https://www.matthewswong.com/en/blog/hijacked-ai-coding-assistant-session-shai-hulud-100-repos/)
- [npm Worm With Valid SLSA Provenance: The keyv Lesson](https://www.matthewswong.com/en/blog/npm-valid-slsa-provenance-malicious-keyv-worm/)
- [EU AI Act Digital Omnibus Deadlines: A DevOps Team Calendar](https://www.matthewswong.com/en/blog/eu-ai-act-digital-omnibus-devops-deadlines/)
- [Tensorlake npm Shai-Hulud Compromise: Lock Down Install Scripts](https://www.matthewswong.com/en/blog/tensorlake-npm-shai-hulud-ai-sdk-worm/)
- [Slopsquatting 2026: Package Hallucination Rates and 127 Names](https://www.matthewswong.com/en/blog/slopsquatting-2026-frontier-models-package-hallucination/)
- [Deadbugz MCP Server: Runtime Tool Metadata Poisoning Defence](https://www.matthewswong.com/en/blog/deadbugz-mcp-runtime-metadata-poisoning/)
- [Splunk MCP Server CVE-2026-76404: Patch Triage for MCP Apps](https://www.matthewswong.com/en/blog/splunk-mcp-server-cve-2026-76404-ai-toolkit-advisory/)
- [GitLost: GitHub Agentic Workflows Prompt Injection Defence](https://www.matthewswong.com/en/blog/gitlost-github-agentic-workflows-prompt-injection/)
- [Claude Code and Gemini CLI GitHub Actions Secrets Vulnerability](https://www.matthewswong.com/en/blog/claude-code-gemini-cli-codex-ci-secrets-github-issue/)
- [containerd runAsNonRoot Bypass: CVE-2026-46680 Fix and Audit](https://www.matthewswong.com/en/blog/containerd-cve-2026-46680-runasnonroot-bypass/)
- [Kubernetes 1.36 Security Changes: userns, kubelet, gitRepo](https://www.matthewswong.com/en/blog/kubernetes-1-36-user-namespaces-kubelet-authz-gitrepo-removed/)
- [Kubernetes Manifest-Based Admission Control Beta in 1.37](https://www.matthewswong.com/en/blog/kubernetes-manifest-based-admission-control-beta/)
- [Sentry MCP Prompt Injection: Agentjacking Defence Guide](https://www.matthewswong.com/en/blog/sentry-mcp-agentjacking-prompt-injection-incident-agents/)
- [Pulumi Neo Security: Read-Only Scans, Fixes Only as a PR](https://www.matthewswong.com/en/blog/pulumi-neo-security-read-only-assessment-proposed-diff/)
- [AI Coding Agent Sandbox: Fixing Approval Fatigue in CI](https://www.matthewswong.com/en/blog/anthropic-how-we-contain-claude-sandbox-approval-fatigue/)
- [Enterprise MCP Reference Architecture with Cloudflare Portals](https://www.matthewswong.com/en/blog/cloudflare-enterprise-mcp-reference-architecture-portals/)
- [MCP Write Controls: Cloudflare WriteGuard vs Approval Prompts](https://www.matthewswong.com/en/blog/cloudflare-writeguard-mcp-write-controls/)
- [Shadow MCP Detection with Cloudflare Gateway Policy](https://www.matthewswong.com/en/blog/cloudflare-shadow-mcp-detection-gateway-policy/)
- [GitHub Agentic Workflows Study: The Prompt Injection Gap](https://www.matthewswong.com/en/blog/gh-aw-empirical-study-prompt-injection-gap/)
- [Hugging Face Security Incident 2026: Treat Datasets as Code](https://www.matthewswong.com/en/blog/hugging-face-july-2026-incident-dataset-pipeline-lessons/)
- [Transformers trust_remote_code Vulnerability: CVE-2026-4372](https://www.matthewswong.com/en/blog/transformers-cve-2026-4372-trust-remote-code-bypass/)
- [LiteLLM CVE-2026-42208: SQL Injection Fix and Gateway Hardening](https://www.matthewswong.com/en/blog/litellm-cve-2026-42208-sql-injection-hardening/)
- [LiteLLM Supply Chain Attack: PyPI Dependency Cooldowns](https://www.matthewswong.com/en/blog/litellm-pypi-supply-chain-attack-dependency-cooldowns/)
- [OpenSSF Model Signing: Sign and Verify ML Models With OMS](https://www.matthewswong.com/en/blog/openssf-model-signing-oms-sign-verify-ml-models/)
- [AI Agent Least Privilege: Credentials, Tokens and Secrets](https://www.matthewswong.com/en/blog/ai-agent-least-privilege-credentials/)
- [Red Teaming AI Agents With Promptfoo: A Practical Guide](https://www.matthewswong.com/en/blog/red-teaming-ai-agents-promptfoo/)
- [PaaS Environment Secrets: Build-Time vs Runtime Injection](https://www.matthewswong.com/en/blog/paas-environment-secrets-management-teams/)
- [UU PDP Compliance Checklist for AI Features in Indonesia](https://www.matthewswong.com/en/blog/uu-pdp-ai-feature-compliance-checklist/)
- [AI Agent Identity: Delegated Authorization Beyond OAuth 2.1](https://www.matthewswong.com/en/blog/ai-agent-identity-delegated-authorization/)
- [Claude Code Plugin Security: Audit Before You Install](https://www.matthewswong.com/en/blog/claude-code-plugin-supply-chain-security/)
- [Claude Code Authentication: Every Login Method Explained](https://www.matthewswong.com/en/blog/claude-code-authentication-login-methods/)
- [Claude Code Managed Settings: Policy That Actually Holds](https://www.matthewswong.com/en/blog/claude-code-managed-settings-enterprise-policy/)
- [Claude Code Security Model: Layers, Trust and Limits](https://www.matthewswong.com/en/blog/claude-code-security-model-layers/)
- [Claude Code Zero Data Retention: What You Give Up](https://www.matthewswong.com/en/blog/claude-code-zero-data-retention-compliance/)
- [Claude Code Auto Mode: Tune the Permission Classifier](https://www.matthewswong.com/en/blog/claude-code-auto-mode-permission-classifier/)
- [Claude Code Sandboxing: Run Bash Safely](https://www.matthewswong.com/en/blog/claude-code-sandboxing-bash-guide/)
- [Sandboxing AI Agents and the Lethal Trifecta](https://www.matthewswong.com/en/blog/sandboxing-ai-agents-lethal-trifecta/)
- [Claude Code Permission Modes: Autonomy vs Safety](https://www.matthewswong.com/en/blog/claude-code-permission-modes-guide/)
- [Prompt Injection Attacks on AI Coding Agents](https://www.matthewswong.com/en/blog/prompt-injection-ai-coding-agents/)
- [MCP Server Security Checklist for Developers](https://www.matthewswong.com/en/blog/mcp-server-security-checklist/)
- [OAuth 2.1 vs OAuth 2.0: What Changed and How to Migrate](https://www.matthewswong.com/en/blog/oauth-2-1-vs-2-0-migration/)
- [Content Security Policy in Next.js: Nonces & strict-dynamic](https://www.matthewswong.com/en/blog/content-security-policy-nextjs-nonce/)
- [OpenFGA ReBAC: Fine-Grained Multi-Tenant Authorization](https://www.matthewswong.com/en/blog/openfga-rebac-multi-tenant-authorization/)
- [Cloudflare Tunnel Zero Trust: Expose Self-Hosted Apps](https://www.matthewswong.com/en/blog/cloudflare-tunnel-zero-trust-homelab/)
- [eBPF Observability with Cilium Tetragon on Kubernetes](https://www.matthewswong.com/en/blog/ebpf-observability-cilium-tetragon/)
- [Fixing IDOR in a Multi-Branch ERP with Prisma branchId Scoping](https://www.matthewswong.com/en/blog/branchid-scoping-idor-multi-branch-erp/)
- [NIK Dukcapil e-KYC: Verify Indonesian KTP Identity](https://www.matthewswong.com/en/blog/nik-ktp-dukcapil-verification-api-indonesia/)
- [systemd Service Hardening: Sandbox Linux Daemons Safely](https://www.matthewswong.com/en/blog/systemd-hardening-sandboxing-services/)
- [Encrypting Git Secrets with SOPS and age (Not Plaintext)](https://www.matthewswong.com/en/blog/sops-age-encrypted-secrets-git/)
- [Automated Secrets Rotation Strategy That Survives Audits](https://www.matthewswong.com/en/blog/automated-secrets-rotation-strategy/)
- [Securing Software Supply Chains with SBOMs and Sigstore](https://www.matthewswong.com/en/blog/software-supply-chain-sbom-sigstore/)
- [Passkeys in Next.js: WebAuthn Passwordless Auth Guide](https://www.matthewswong.com/en/blog/passkeys-webauthn-nextjs-authentication/)
- [Zero Trust Security Architecture for Cloud-Native Apps](https://www.matthewswong.com/en/blog/zero-trust-security-architecture-indonesia/)
- [UU PDP No. 27/2022: Developer Compliance Guide for Indonesia](https://www.matthewswong.com/en/blog/uu-pdp-compliance-developer-guide-indonesia/)

## Blog — Career & Indonesia Tech

- [System Design Interview Framework: A Step-by-Step Approach](https://www.matthewswong.com/en/blog/system-design-interview-framework-step-by-step/)
- [How to Organise a Developer Meetup in an Indonesian City](https://www.matthewswong.com/en/blog/indonesian-dev-community-meetup-organizing/)
- [Indonesia Tech Funding Winter 2026: An Engineer's Cost Playbook](https://www.matthewswong.com/en/blog/indonesia-tech-funding-winter-engineer-plan/)
- [Bootcamp vs Self-Taught for Indonesian Developers in 2026](https://www.matthewswong.com/en/blog/indonesian-bootcamp-vs-self-taught-2026/)
- [Indonesian Developer Discourse on X and Threads: 5 Arguments](https://www.matthewswong.com/en/blog/indonesian-developer-x-discourse-patterns/)
- [AI Pair Programming and the Junior Developer Skill Gap](https://www.matthewswong.com/en/blog/ai-pair-programming-junior-skill-gap/)
- [Growing an Engineering Blog with SEO: What Actually Worked](https://www.matthewswong.com/en/blog/engineering-blog-seo-growth-developer/)
- [Building in Public as an Indonesian Developer: My Playbook](https://www.matthewswong.com/en/blog/building-in-public-indonesia-developer/)
- [Balancing DevOps, ERP, and Web Dev as a Final-Year Student](https://www.matthewswong.com/en/blog/balancing-devops-erp-webdev-engineer/)
- [Code Review That Actually Works: A Developer's Process Guide](https://www.matthewswong.com/en/blog/code-review-process-developer/)
- [Technical Debt Management: A Pragmatic Strategy for Teams](https://www.matthewswong.com/en/blog/technical-debt-management/)
- [Building a Documentation Culture: Why Engineers Skip Docs](https://www.matthewswong.com/en/blog/developer-documentation-culture/)
- [Open Source Licenses Explained: MIT, Apache 2.0, and GPL](https://www.matthewswong.com/en/blog/open-source-license-guide/)
- [Building a Portfolio as a Junior Developer](https://www.matthewswong.com/en/blog/portfolio-junior-developer-guide/)
- [Developer Productivity Tools I Actually Use in 2025](https://www.matthewswong.com/en/blog/developer-productivity-tools-2025/)
- [Learning a New Tech Stack Efficiently: My Actual Process](https://www.matthewswong.com/en/blog/learning-new-tech-stack-efficiently/)
- [How Open Source Contributions Boosted My Career](https://www.matthewswong.com/en/blog/open-source-contribution-career/)
- [Tech Stack Used by Indonesian Companies in 2025](https://www.matthewswong.com/en/blog/tech-stack-indonesia/)
- [Remote Developer Work From Indonesia: Platforms and Pitfalls](https://www.matthewswong.com/en/blog/remote-work-indonesia/)
- [Swiss German University IT Program Review: Honest Assessment](https://www.matthewswong.com/en/blog/sgu-it-review/)
- [Cloud Adoption in Indonesian Companies: The Real Picture](https://www.matthewswong.com/en/blog/cloud-adoption-indonesia/)
- [ERP Market in Indonesia: Who's Using What and Why in 2025](https://www.matthewswong.com/en/blog/erp-market-indonesia/)
- [Digital Transformation for SMEs in Indonesia: What Works](https://www.matthewswong.com/en/blog/digital-transformation-sme/)
- [Indonesia Tech Startup Ecosystem in 2025: Honest State of Play](https://www.matthewswong.com/en/blog/indonesia-tech-ecosystem/)
- [Freelance Pricing for Indonesian Developers: Models, Not Rates](https://www.matthewswong.com/en/blog/freelance-pricing-indonesia/)
- [Work-Life Balance as a Developer: What Nobody Tells You](https://www.matthewswong.com/en/blog/work-life-balance-dev/)
- [Side Projects While Working Full-Time: A Real Strategy](https://www.matthewswong.com/en/blog/side-projects-full-time/)
- [Technical Interview Prep for Indonesian Developers in 2025](https://www.matthewswong.com/en/blog/technical-interview-indonesia/)

## Blog — Product & SaaS

- [Bilingual Technical SEO: hreflang for Indonesian and English](https://www.matthewswong.com/en/blog/bilingual-technical-seo-indonesian-english/)
- [Threads vs X: Where Indonesian Developers Actually Read](https://www.matthewswong.com/en/blog/threads-vs-x-developer-audience-indonesia/)
- [Cloud Billing in Indonesia: The Credit Card Wall and QRIS](https://www.matthewswong.com/en/blog/credit-card-wall-indonesian-developers-qris/)
- [Claude Code Team Rollout: An Adoption Playbook That Works](https://www.matthewswong.com/en/blog/claude-code-team-rollout-adoption-playbook/)
- [Claude Code in Slack: Setup, Claude Tag, and Real Limits](https://www.matthewswong.com/en/blog/claude-code-slack-integration-claude-tag/)
- [Thermal Receipt Design Principles for Epson TM-T82](https://www.matthewswong.com/en/blog/epson-tm-t82-receipt-design-principles/)
- [Building a POS + Mobile ERP for an Indonesian Carwash SME](https://www.matthewswong.com/en/blog/building-pos-mobile-indonesian-sme-carwash/)
- [SaaS Distribution on LinkedIn and Threads in Indonesia](https://www.matthewswong.com/en/blog/saas-distribution-linkedin-threads-indonesia/)
- [Warung Inventory Micro-SaaS: Offline-First for Indonesia](https://www.matthewswong.com/en/blog/warung-inventory-micro-saas-indonesia/)
- [Vertical SaaS for Indonesian Clinics and Salons](https://www.matthewswong.com/en/blog/vertical-saas-klinik-salon-indonesia/)
- [Micro-SaaS Pricing for Indonesia: IDR Pricing That Converts](https://www.matthewswong.com/en/blog/micro-saas-pricing-indonesia-idr/)
- [Building My First SaaS: AI Gym Bro](https://www.matthewswong.com/en/blog/building-saas-ai-gymbro/)

## Blog — University

- [My Experience at Swiss German University](https://www.matthewswong.com/en/blog/life-at-swiss-german-university/)

## Blog — Hackathons

- [Competing in PwC Capture The Flag](https://www.matthewswong.com/en/blog/pwc-capture-the-flag/)

## Languages

This site is available in English (`/en/`) and Indonesian (`/id/`).

---

- HTML version: https://www.matthewswong.com/en/
- Bahasa Indonesia: https://www.matthewswong.com/id/
- Site index for agents: https://www.matthewswong.com/llms.txt
- Sitemap: https://www.matthewswong.com/sitemap.xml
- API description (OpenAPI): https://www.matthewswong.com/openapi.json
