# 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 - Sitemap: https://www.matthewswong.com/sitemap.xml - Any page as Markdown: request its URL with `Accept: text/markdown` ## 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): 636+ 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 ## 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 ## Blog — DevOps & Cloud Infrastructure - [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: Production on Budget VPS](https://www.matthewswong.com/en/blog/kubernetes-k3s-production-lightweight-indonesia) - [FinOps for Indonesian Cloud Teams: A Practical 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: A Practical Guide for Side-Project Developers](https://www.matthewswong.com/en/blog/google-cloud-vs-digital-ocean) - [Grafana + Prometheus Monitoring Stack for Your VPS: Complete Setup Guide](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: Metrics, Logs, and Alerts](https://www.matthewswong.com/en/blog/self-hosted-observability-digital-ocean) - [Kubernetes for the Solo Developer: A Practical GKE Guide Without the Overhead](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: A Production Guide](https://www.matthewswong.com/en/blog/event-driven-kafka-nestjs) - [gRPC vs REST for Internal Microservices APIs: A Practical Comparison](https://www.matthewswong.com/en/blog/microservices-grpc-vs-rest-internal) - [PostgreSQL Sharding Strategy: When and How to Scale Your Database](https://www.matthewswong.com/en/blog/postgresql-sharding-strategy) - [Message Queues in Node.js: RabbitMQ vs BullMQ — Which Should You Choose?](https://www.matthewswong.com/en/blog/message-queue-rabbitmq-bullmq) - [API Gateway Pattern with NestJS: Routing, Auth, and Rate Limiting in Production](https://www.matthewswong.com/en/blog/api-gateway-pattern-nestjs-guide) - [Distributed Tracing with OpenTelemetry: A Practical NestJS Implementation](https://www.matthewswong.com/en/blog/distributed-tracing-opentelemetry) - [Circuit Breaker Pattern in NestJS: Building Resilient Microservices](https://www.matthewswong.com/en/blog/circuit-breaker-nestjs-pattern) - [CQRS and Event Sourcing with NestJS: When Complexity 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: What I Actually Use](https://www.matthewswong.com/en/blog/jwt-vs-session-auth-production) - [SQL Injection Prevention with ORMs: Why Prisma and TypeORM Still Need Your Help](https://www.matthewswong.com/en/blog/sql-injection-orm-prevention) - [CORS Configuration for Next.js and NestJS: Getting It Right 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: The Controls I Actually 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: A Production Guide](https://www.matthewswong.com/en/blog/docker-container-security-scanning) - [Penetration Testing Basics for Developers: What I Learned from PwC CTF](https://www.matthewswong.com/en/blog/penetration-testing-developer-basics) - [Nginx vs Traefik: Choosing the Right Reverse Proxy for Your Stack](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 Platform Should You Choose?](https://www.matthewswong.com/en/blog/github-actions-vs-gitlab) - [PostgreSQL vs MySQL in Production: Which Database Should You Choose?](https://www.matthewswong.com/en/blog/postgresql-vs-mysql) - [Redis Caching Patterns for NestJS: From 450ms to 42ms API Response Times](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 That Works](https://www.matthewswong.com/en/blog/monitoring-alerting-solo) - [SSH Security Hardening for VPS: Stop the Brute Force Before It Starts](https://www.matthewswong.com/en/blog/ssh-security-hardening) - [PostgreSQL Backup Strategy for VPS: From pg_dump to WAL Archiving](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: The Right Way to Run Node.js in Production](https://www.matthewswong.com/en/blog/systemd-services-jobs) - [WireGuard VPN for Private Cloud Networking: Simple, Fast, Secure](https://www.matthewswong.com/en/blog/wireguard-vpn-cloud) - [Log Rotation in Linux: Managing Production Logs Before They Fill Your Disk](https://www.matthewswong.com/en/blog/log-rotation-linux) - [Docker Secrets in Production: Stop Putting API Keys in Environment Variables](https://www.matthewswong.com/en/blog/docker-secrets-production) - [Cloud Run vs Cloud Functions: Which Google Serverless 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 That Scale](https://www.matthewswong.com/en/blog/ansible-playbooks-production) - [How I Cut Cloud Costs by 40%: Real Optimization Strategies That Work](https://www.matthewswong.com/en/blog/cloud-cost-optimization) - [Multi-Cloud Strategy for Small Teams: Is It Worth the Complexity?](https://www.matthewswong.com/en/blog/multi-cloud-small-teams) - [CDN with Cloudflare: How to Properly Serve Static Assets at the Edge](https://www.matthewswong.com/en/blog/cdn-cloudflare-static) - [Nginx Load Balancer in Production: Configuration, Health Checks, and Failover](https://www.matthewswong.com/en/blog/load-balancer-production-config) - [Disaster Recovery Planning for VPS: Backups, RTO, and Actual Tested Recovery](https://www.matthewswong.com/en/blog/disaster-recovery-vps) - [Container Registry Strategy on GCP: From GCR to Artifact Registry](https://www.matthewswong.com/en/blog/container-registry-gcr) - [VPC Networking for Developers: A Practical Guide to Cloud Network Isolation](https://www.matthewswong.com/en/blog/vpc-networking-guide) - [Cloud Storage vs MinIO: Choosing Your Object Storage for Production](https://www.matthewswong.com/en/blog/cloud-storage-vs-minio) - [GitHub Actions Self-Hosted Runners: Complete Setup and Security Guide](https://www.matthewswong.com/en/blog/github-actions-runners) - [HashiCorp Vault for Production Secrets Management: Setup and Best Practices](https://www.matthewswong.com/en/blog/hashicorp-vault-secrets) - [Prometheus and AlertManager: Building an On-Call Alert System That Works](https://www.matthewswong.com/en/blog/prometheus-alertmanager) - [Elastic Stack (ELK) Self-Hosted: Production Setup and Operational 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 - [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) - [Sewa VPS Murah Indonesia: Panduan Jakarta Region 2026](https://www.matthewswong.com/en/blog/sewa-vps-murah-indonesia-panduan) - [Cloudflare Workers vs Vercel Edge: Cold Starts, Pricing, Lock-In](https://www.matthewswong.com/en/blog/cloudflare-workers-vs-vercel-edge) - [Azure Indonesia Central Region: A Developer's Complete Deployment Guide](https://www.matthewswong.com/en/blog/azure-indonesia-central-region-deployment-guide) ## Blog — ERP Systems - [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 11% and NSFP in Indonesia](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 from Business Events](https://www.matthewswong.com/en/blog/erp-email-automation) - [Why ERP Implementations Fail in Indonesian Businesses — And How to Avoid It](https://www.matthewswong.com/en/blog/why-erp-fails-indonesian-businesses) - [Automating Accounts Receivable in a Custom ERP: Reminders, Aging Reports, and Payment Tracking](https://www.matthewswong.com/en/blog/accounts-receivable-automation-erp) - [Building a Workflow Engine for Multi-Step Approvals: NestJS, PostgreSQL, and React](https://www.matthewswong.com/en/blog/workflow-engine-react-nestjs-postgresql) - [Migrating from Excel to a Custom ERP: Data Mapping, Validation, and Cutover Strategy](https://www.matthewswong.com/en/blog/excel-to-custom-erp-migration) - [Role-Based Access Control in a Custom ERP: NestJS Guards, PostgreSQL Permission Tables, and UU PDP Compliance](https://www.matthewswong.com/en/blog/erp-role-based-access-control) - [Building an ERP Audit Trail and Activity Log: PostgreSQL, NestJS Interceptors, and React Activity Feed](https://www.matthewswong.com/en/blog/erp-audit-trail-activity-log) - [Building a Multi-Level Purchase Order Approval Workflow in a Custom ERP](https://www.matthewswong.com/en/blog/erp-purchase-order-approval) - [Real-Time Inventory Tracking in a Custom ERP: From Stock Movements to Live Dashboards](https://www.matthewswong.com/en/blog/erp-inventory-real-time-tracking) - [Automating Financial Reporting in a Custom ERP: From Trial Balance to Management Reports](https://www.matthewswong.com/en/blog/erp-financial-reporting-automation) - [Implementing Multi-Currency Support in a Custom ERP: Exchange Rates, Revaluation, and Reporting](https://www.matthewswong.com/en/blog/erp-multi-currency-implementation) - [Building a Vendor and Supplier Portal Integrated with Your Custom ERP](https://www.matthewswong.com/en/blog/erp-vendor-supplier-portal) - [Project Costing and Time Tracking in a Custom ERP: Budgets, Timesheets, and Profitability](https://www.matthewswong.com/en/blog/erp-project-costing-time-tracking) - [Integrating Payroll with Your Custom ERP: From Timesheets to Payslips and Tax Reporting](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: Patterns, Webhooks, and Error Handling](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: From File Uploads to Searchable Archives](https://www.matthewswong.com/en/blog/erp-document-management) - [Warehouse Barcode Scanning Integration in a Custom ERP: From Hardware to Real-Time Inventory](https://www.matthewswong.com/en/blog/erp-warehouse-barcode-scanning) - [Indonesian Tax Compliance in a Custom ERP: PPN, PPh, and e-Faktur Integration](https://www.matthewswong.com/en/blog/erp-tax-compliance-indonesia-ppn) - [Budget vs. Actual Variance Analysis in a Custom ERP: Real-Time Financial Control](https://www.matthewswong.com/en/blog/erp-budget-variance-analysis) - [ERP and CRM Integration: Connecting Your Sales Pipeline 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, Not Software, Determine Success](https://www.matthewswong.com/en/blog/erp-change-management-employees) - [ERP Data Quality and Migration Prep: The Work Nobody Wants to Do](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: The Requirements Work That Saves Your Project](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 - [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, and 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 2.0: Open Banking Developer Guide](https://www.matthewswong.com/en/blog/indonesia-open-banking-snap-api-qris-developer-guide) ## Blog — Software Development - [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 - [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, Security](https://www.matthewswong.com/en/blog/nextjs-server-actions-production) - [Building a Production Landing Page That Scores 100 on Core Web Vitals](https://www.matthewswong.com/en/blog/production-landing-page-core-web-vitals) - [TypeScript Project Structure for Real-World Apps: What Actually Works](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 From Someone Who Actually Uses It](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, AVIF, and the Settings I Actually Ship](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 and Why You Need It](https://www.matthewswong.com/en/blog/database-connection-pooling-nestjs) - [PostgreSQL Full-Text Search Without Elasticsearch: What I Use in ERP Projects](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 That Stay Accurate](https://www.matthewswong.com/en/blog/openapi-swagger-nestjs) - [Environment Variables and Secrets in Next.js: What Goes Wrong and How to Fix It](https://www.matthewswong.com/en/blog/environment-variables-secrets-nextjs) - [E2E Testing Next.js Apps with Playwright: Setup, Patterns, and CI Integration](https://www.matthewswong.com/en/blog/e2e-testing-playwright-nextjs) - [Accessibility Audit for Next.js Apps: Automating WCAG Compliance](https://www.matthewswong.com/en/blog/accessibility-audit-nextjs) - [npm Dependency Management and Security Auditing: What I Actually Do](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, Flicker-Free, and the Implementation I Ship](https://www.matthewswong.com/en/blog/dark-mode-nextjs-system-aware) - [Testing Next.js Apps with Vitest and Jest: A Practical Comparison](https://www.matthewswong.com/en/blog/nextjs-testing-vitest-jest) - [Storybook for Component Documentation: Building 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 Ketenagakerjaan API Integration: Payroll Developer Guide](https://www.matthewswong.com/en/blog/bpjs-api-integration) ## Blog — AI & LLMs - [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 a Year of 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 You Are Not Using](https://www.matthewswong.com/en/blog/llm-prompt-caching-cost-optimization) - [Hermes AI Agent by Nous Research: Architecture, Self-Learning Loop, and Getting Started](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 Honest Comparison (2025)](https://www.matthewswong.com/en/blog/openai-vs-anthropic-vs-gemini-developers) - [LangChain vs Building Your Own LLM Orchestration: When to Use Each](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 Your Vector Database in 2025](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: What I Learned the Hard Way](https://www.matthewswong.com/en/blog/ai-content-generation-quality) - [Prompt Injection Defense: How I Harden AI Systems Against Manipulation](https://www.matthewswong.com/en/blog/ai-prompt-injection-defense) - [Building an MCP Server from Scratch: A Practical Developer Guide](https://www.matthewswong.com/en/blog/mcp-server-development-guide) - [AI Agent Memory Persistence Patterns: From Volatile to Long-Term](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 Applications](https://www.matthewswong.com/en/blog/ai-observability-llm-logging) - [Function Calling Patterns: OpenAI vs Anthropic Tool Use in Production](https://www.matthewswong.com/en/blog/function-calling-openai-anthropic) ## Blog — AI / Machine Learning - [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 Dedicated 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 - [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 - [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 Engineering 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 Development Teams](https://www.matthewswong.com/en/blog/technical-debt-management) - [Building a Documentation Culture: Why Engineers Don't Write Docs and How to Fix It](https://www.matthewswong.com/en/blog/developer-documentation-culture) - [Open Source Licenses Explained: MIT, Apache 2.0, and GPL for Developers](https://www.matthewswong.com/en/blog/open-source-license-guide) - [Building a Portfolio as a Junior Developer: What Actually Gets You Hired](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 (and How to Start)](https://www.matthewswong.com/en/blog/open-source-contribution-career) - [Tech Stack Used by Indonesian Companies in 2025: What the Market Actually Runs On](https://www.matthewswong.com/en/blog/tech-stack-indonesia) - [Remote Work as an Indonesian Developer: Opportunities, Platforms, and What Nobody Tells You](https://www.matthewswong.com/en/blog/remote-work-indonesia) - [Swiss German University IT Program Review: An Insider's Honest Assessment](https://www.matthewswong.com/en/blog/sgu-it-review) - [Cloud Adoption in Indonesian Companies: The Real Picture in 2025](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 Actually Works](https://www.matthewswong.com/en/blog/digital-transformation-sme) - [Indonesia Tech Startup Ecosystem in 2025: The Honest State of Play](https://www.matthewswong.com/en/blog/indonesia-tech-ecosystem) - [Freelance Pricing as an Indonesian Developer: How to Set Your Rates Without Underselling](https://www.matthewswong.com/en/blog/freelance-pricing-indonesia) - [Work-Life Balance as a Developer: What Nobody Tells You Until You're Already Burned Out](https://www.matthewswong.com/en/blog/work-life-balance-dev) - [Side Projects While Working Full-Time: A Real Strategy That Doesn't Destroy Your Life](https://www.matthewswong.com/en/blog/side-projects-full-time) - [Technical Interview Prep for Indonesian Developers: What's Actually Asked 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/`).