Branch8

Supply Chain Security: npm Package Vulnerabilities Audit Guide for APAC Teams

Tiexin Gao, Multi-Solution Architect at Adobe and Consulting Director at Branch8
Tiexin Gao
April 5, 2026
14 mins read
Supply Chain Security: npm Package Vulnerabilities Audit Guide for APAC Teams - Hero Image

Key Takeaways

  • Generate SBOMs for every project—you can't secure what you can't inventory
  • Use npm ci (never npm install) in CI/CD pipelines to enforce lockfile integrity
  • AI-assisted triage cuts vulnerability review time by 85% at under $10/month
  • Distributed APAC teams provide natural follow-the-sun incident response coverage
  • Pre-written playbooks reduce npm compromise response time from days to hours

Quick Answer: Audit your npm supply chain by generating SBOMs, gating CI/CD on npm audit results, deploying a private registry proxy, using AI-assisted vulnerability triage, and maintaining pre-written incident response playbooks across distributed APAC teams.


In September 2025, attackers compromised 18 widely-used npm packages—including chalk, debug, and ansi-styles—injecting destructive payloads that rippled across millions of downstream projects. According to ArmorCode's post-incident analysis, over 200 packages were ultimately affected, with the blast radius still expanding weeks later. For engineering teams running multi-service deployments across Asia-Pacific, this wasn't a theoretical exercise. It was a Monday morning.

Related reading: Claude AI Integration Business Workflows Tutorial for APAC Teams

I saw the impact firsthand. One of our Branch8 managed engineering squads in Ho Chi Minh City was mid-sprint on a Node.js microservices platform for a Singapore-based logistics client when the CISA advisory dropped. Their lockfile referenced three of the compromised packages. The team had 47 minutes between the first Slack alert and the first patched deployment—because they'd already rehearsed this scenario. Most teams aren't that prepared.

Related reading: Managed Squad Onboarding Timeline and Process Guide: Week-by-Week

This guide walks through a practitioner-level approach to supply chain security npm package vulnerabilities, built from patterns we've applied across projects in Hong Kong, Singapore, Vietnam, and Australia. It goes beyond the incident-response playbooks you'll find elsewhere and addresses the structural practices that make your dependency chain defensible before the next compromise.

Prerequisites: What You Need Before Starting

Required tooling and access

Before working through these steps, ensure you have the following in place:

  • Node.js 18 LTS or later (we standardize on v20.x across Branch8 projects)
  • npm v10+ or a compatible package manager (yarn v4, pnpm v8)
  • A private registry or registry proxy (Verdaccio, Artifactory, GitHub Packages)
  • CI/CD pipeline access with the ability to add pre-merge gates (GitHub Actions, GitLab CI, or Buildkite)
  • npm audit familiarity—run npm audit --json now and review the output structure
  • SBOM tooling: CycloneDX or Syft installed locally

Baseline knowledge

You should be comfortable reading a package-lock.json, understand semantic versioning ranges, and know the difference between a direct and transitive dependency. If you manage Android app builds alongside Node services (common in APAC super-app architectures), you'll also benefit from understanding how Android app developer verification security compliance intersects with your JavaScript supply chain—we cover that crossover in Step 4.

Related reading: AI Model Hallucination Risk Mitigation Strategy for APAC Enterprises

Related reading: LLM Integration into Customer Support Workflows: A Practical APAC Guide

Team structure considerations

In our experience running distributed teams across six APAC countries, the person who owns dependency management is rarely the person who notices a vulnerability first. Assign a rotation—what we call a "dependency steward" role—that cycles weekly. This costs roughly 3-4 hours per week of senior developer time, which at typical Vietnam or Philippines engineering rates translates to USD $25-40/week. That's a rounding error compared to the cost of a compromised production deployment.

Related reading: AI-Generated Product Descriptions Shopify Plus Workflow: A Production Guide

Step 1: Map Your Dependency Surface Area

Generate a complete Software Bill of Materials

You can't secure what you can't see. The first step in any developer supply chain security best practices framework is producing a full inventory of every package in your dependency tree.

1# Install CycloneDX npm plugin
2npm install -g @cyclonedx/cyclonedx-npm
3
4# Generate SBOM for your project
5cyclonedx-npm --output-format json --output-file sbom.json
6
7# Count total dependencies (direct + transitive)
8cat sbom.json | jq '.components | length'

For a typical Express.js API service, you'll see 300-800 transitive dependencies. For a Next.js frontend, expect 1,200-2,000. Each one is an attack surface.

According to Synopsys's 2024 Open Source Security and Risk Analysis report, 96% of commercial codebases contain open-source components, and 84% contain at least one known vulnerability. In APAC-deployed services, the risk compounds because regulatory regimes differ: Australia's Critical Infrastructure Act imposes different reporting obligations than Singapore's Cybersecurity Act, and both differ from Hong Kong's forthcoming cybersecurity legislation.

Identify high-risk dependency patterns

Not all dependencies carry equal risk. Flag these patterns in your SBOM:

  • Single-maintainer packages with no organizational backing
  • Packages with install scripts (preinstall, postinstall)—these execute arbitrary code during npm install
  • Packages last published 2+ years ago that still resolve in your lockfile
  • Packages with namespace squatting indicators (typosquats of popular packages)
1# List all packages with install scripts
2npm query ':attr(scripts, [preinstall])' | jq '.[].name'
3npm query ':attr(scripts, [postinstall])' | jq '.[].name'

Establish your dependency baseline document

Create a dependency-policy.yml in your repository root. Here's the structure we use at Branch8:

1dependency-policy:
2 max-direct-dependencies: 45
3 allowed-license-types:
4 - MIT
5 - Apache-2.0
6 - BSD-2-Clause
7 - BSD-3-Clause
8 - ISC
9 blocked-packages:
10 - event-stream # Historical compromise
11 - ua-parser-js # Historical compromise
12 require-lockfile: true
13 require-exact-versions: false # Allow patch ranges only
14 max-semver-range: "~" # Tilde only, no caret

This document becomes your source of truth when onboarding new developers—particularly important when you're scaling teams across markets where hiring timelines vary. In Vietnam, we typically onboard a mid-level Node.js developer in 2-3 weeks; in Australia, it's 4-6 weeks. The policy file means every new team member inherits the same security posture from day one.

Ready to Transform Your Ecommerce Operations?

Branch8 specializes in ecommerce platform implementation and AI-powered automation solutions. Contact us today to discuss your ecommerce automation strategy.

Step 2: Implement Automated Vulnerability Scanning in CI/CD

Configure npm audit as a pipeline gate

The simplest gate is npm audit, but the default output is noisy and doesn't fail builds by default. Configure it properly:

1# .github/workflows/security-audit.yml
2name: Dependency Security Audit
3on:
4 pull_request:
5 paths:
6 - 'package.json'
7 - 'package-lock.json'
8 schedule:
9 - cron: '0 2 * * 1' # Weekly Monday 2AM UTC (10AM HKT)
10
11jobs:
12 audit:
13 runs-on: ubuntu-latest
14 steps:
15 - uses: actions/checkout@v4
16 - uses: actions/setup-node@v4
17 with:
18 node-version: '20'
19 - run: npm ci
20 - name: Run security audit
21 run: |
22 npm audit --audit-level=high --json > audit-results.json
23 HIGH_COUNT=$(cat audit-results.json | jq '.metadata.vulnerabilities.high')
24 CRITICAL_COUNT=$(cat audit-results.json | jq '.metadata.vulnerabilities.critical')
25 if [ "$CRITICAL_COUNT" -gt 0 ] || [ "$HIGH_COUNT" -gt 0 ]; then
26 echo "::error::Found $CRITICAL_COUNT critical and $HIGH_COUNT high vulnerabilities"
27 exit 1
28 fi

Layer in Socket.dev or Snyk for deeper analysis

The npm audit command only checks the npm advisory database. For supply chain security npm package vulnerabilities that involve behavioral analysis—detecting packages that suddenly start making network calls or accessing environment variables—you need a dedicated tool.

We've deployed Socket.dev across three Branch8 client projects since Q1 2025. It catches patterns that npm audit misses: typosquatting, install-time network requests, and obfuscated code. For teams with budget constraints (common when setting up new development centers in the Philippines or Indonesia), Snyk's free tier covers up to 200 tests per month per organization, which typically handles 2-3 active repositories.

1# Install Socket CLI
2npm install -g @socketsecurity/cli
3
4# Scan for supply chain risks
5socket scan create --repo . --branch main

Set up real-time alerting for new CVEs

Don't wait for your weekly audit. Configure GitHub Dependabot alerts at minimum, but supplement with:

  • OSV.dev webhooks for cross-database vulnerability matching
  • Slack integration for immediate team notification (we route to a #security-alerts channel per project)
  • PagerDuty escalation for critical severity CVEs in production dependency paths

The September 2025 npm attack, as reported by GitLab's Vulnerability Research team, was detected initially through behavioral anomaly rather than CVE publication. The time between compromise and advisory was measured in hours, not days. Your alerting pipeline needs to account for this gap.

Step 3: Lock Down Your Registry and Publish Pipeline

Deploy a private registry proxy

Every npm install from the public registry is a trust decision. A registry proxy gives you a cache, an audit point, and an emergency kill switch.

For teams in mainland China or regions with high latency to npmjs.com (common for our teams in Vietnam and Taiwan), a local proxy also improves install times by 40-60%.

1# Deploy Verdaccio as a Docker service
2docker run -d \
3 --name verdaccio \
4 -p 4873:4873 \
5 -v verdaccio-storage:/verdaccio/storage \
6 -v verdaccio-conf:/verdaccio/conf \
7 verdaccio/verdaccio:5
8
9# Configure npm to use your proxy
10npm set registry http://your-registry-host:4873/

Configure Verdaccio's config.yaml to proxy to the public registry but cache all packages locally:

1uplinks:
2 npmjs:
3 url: https://registry.npmjs.org/
4 cache: true
5 maxage: 30m
6
7packages:
8 '@your-org/*':
9 access: $authenticated
10 publish: $authenticated
11 '**':
12 access: $all
13 publish: $authenticated
14 proxy: npmjs

Enforce npm provenance and package signing

Since npm v9.5.0, packages can include provenance attestations linking them to specific source commits and build environments. As of GitHub's 2024 transparency report, over 14,000 packages on npm now publish with provenance.

1# Verify provenance of a package before install
2npm audit signatures
3
4# Publish your own packages with provenance (in GitHub Actions)
5npm publish --provenance

Add a check to your CI pipeline that flags any new dependency without provenance attestation. This doesn't block installation—the coverage isn't high enough yet—but it creates visibility.

Implement a package approval workflow

For mature teams, new dependency additions should require review. Here's a practical approach using a custom GitHub Action:

1# .github/workflows/new-dependency-review.yml
2name: New Dependency Review
3on:
4 pull_request:
5 paths:
6 - 'package.json'
7
8jobs:
9 dependency-review:
10 runs-on: ubuntu-latest
11 steps:
12 - uses: actions/checkout@v4
13 - uses: actions/dependency-review-action@v4
14 with:
15 fail-on-severity: high
16 deny-licenses: GPL-3.0, AGPL-3.0
17 comment-summary-in-pr: always

This approach aligns with developer supply chain security best practices recommended by the OpenSSF Scorecard project, which Branch8 uses as a benchmark across all managed engineering engagements.

Ready to Transform Your Ecommerce Operations?

Branch8 specializes in ecommerce platform implementation and AI-powered automation solutions. Contact us today to discuss your ecommerce automation strategy.

Step 4: Extend Security Posture to Mobile and Cross-Platform Builds

Where npm vulnerabilities bleed into Android builds

If your team ships React Native or Capacitor-based mobile apps—which roughly 35% of our APAC client projects involve—your npm dependency chain directly influences your mobile binary. Android app developer verification security compliance under Google Play's requirements now includes supply chain attestation for apps that handle sensitive data.

Google's Data Safety section, updated in 2024, requires disclosure of third-party code behavior. If a compromised npm package in your React Native bundle exfiltrates data, your Play Store listing is liable regardless of whether you wrote the offending code.

1# For React Native projects: audit both JS and native dependencies
2npm audit --json > js-audit.json
3cd android && ./gradlew dependencyCheckAnalyze

Cross-platform dependency governance

When running teams across Hong Kong (architecture), Vietnam (backend implementation), and the Philippines (QA), we've found that dependency governance needs a single owner regardless of platform. Create a shared security-baseline.md that covers:

  • npm packages (Node.js services and React Native)
  • Gradle/Maven dependencies (native Android modules)
  • CocoaPods/SPM (iOS builds)
  • Python packages (ML inference services)

Handling compliance across APAC jurisdictions

Australia's APRA CPS 234 requires entities to maintain "information security capability commensurate with the size and extent of threats." Singapore's MAS TRM Guidelines mandate that financial institutions assess third-party software risks. In practice, this means your SBOM isn't just a security artifact—it's a compliance document.

We maintain region-specific compliance templates for our clients: one for Australian financial services, one for Singapore-regulated entities, and a general template for Hong Kong and Taiwan deployments. The SBOM generated in Step 1 feeds directly into these compliance artifacts.

Step 5: Integrate AI-Assisted Vulnerability Triage

Using LLMs to prioritize vulnerability remediation

Here's where the volume problem becomes an AI problem. A mid-size Node.js project might surface 50-200 advisories from npm audit, most of which are in transitive dependencies with no exploitable path in your application. Manual triage at that volume burns senior developer time—time that costs USD $45-80/hour in Singapore or Australia.

We've integrated GPT-4o into our internal triage workflow at Branch8, feeding it the npm audit --json output alongside the project's actual import graph. The model classifies each advisory into "exploitable in context," "theoretically vulnerable but not in execution path," or "no practical impact." This reduced our mean triage time from 4.2 hours to 38 minutes per audit cycle across a sample of 12 client projects in Q2 2025.

The AI automation ROI calculation for operations teams is straightforward here: 3.5 hours saved per week × senior developer cost × 52 weeks. For a Singapore-based team, that's roughly USD $9,000-15,000 annually per project.

1# Simplified triage prompt structure (we use this with the OpenAI API)
2import openai
3import json
4
5def triage_vulnerabilities(audit_json, import_graph):
6 prompt = f"""Given this npm audit output and the project's actual import graph,
7 classify each vulnerability as:
8 1. EXPLOITABLE - the vulnerable code path is reachable
9 2. THEORETICAL - vulnerability exists but code path is not used
10 3. NO_IMPACT - dependency is dev-only or test-only
11
12 Audit output: {json.dumps(audit_json['vulnerabilities'])}
13 Import graph: {json.dumps(import_graph)}
14
15 Return JSON array with package name, classification, and reasoning."""
16
17 response = openai.chat.completions.create(
18 model="gpt-4o",
19 messages=[{"role": "user", "content": prompt}],
20 response_format={"type": "json_object"}
21 )
22 return json.loads(response.choices[0].message.content)

AI model inference cost optimization strategies for security workflows

Running GPT-4o on every PR with audit changes gets expensive. Practical AI model inference cost optimization strategies include:

  • Cache triage results: if the same advisory appears across PRs, reuse the classification
  • Use GPT-4o-mini for initial screening, escalating only ambiguous cases to GPT-4o
  • Batch audit outputs: run triage once daily rather than per-PR for non-critical advisories
  • Self-host with Ollama + Llama 3.1 70B for teams in regulated environments that can't send dependency data to external APIs

At current OpenAI pricing (as of June 2025), a typical triage run costs $0.03-0.12 per audit. Even at 20 audits per week, that's under $10/month—negligible compared to developer time saved.

Build feedback loops into your triage model

When your human reviewers override the AI classification, log that as training data. After three months, we found our override rate dropped from 22% to 7%, meaning the model learned our specific codebase context. This is a pattern that applies broadly—whether you're triaging npm vulnerabilities or reviewing AI-generated product descriptions in a Shopify Plus workflow for an e-commerce client. The principle is identical: AI handles volume, humans handle judgment, and the feedback loop tightens accuracy over time.

Ready to Transform Your Ecommerce Operations?

Branch8 specializes in ecommerce platform implementation and AI-powered automation solutions. Contact us today to discuss your ecommerce automation strategy.

Step 6: Build Incident Response Playbooks for npm Compromise Events

Create a pre-written response plan

The September 2025 npm attack demonstrated that response time matters more than response perfection. Teams that had pre-written playbooks contained the impact within hours. Teams that didn't spent days assessing exposure.

Here's the playbook template we use at Branch8:

1## npm Supply Chain Incident Response
2
3### Trigger Conditions
4- CISA advisory referencing npm packages
5- Socket.dev or Snyk alert for supply chain compromise
6- Community report (npm attack reddit threads, Twitter/X)
7
8### Immediate Actions (0-30 min)
91. Freeze all deployments across environments
102. Run `npm audit` against all active repositories
113. Cross-reference compromised package list against SBOMs
124. Notify engineering leads in all APAC time zones
13
14### Assessment (30-120 min)
151. Determine if compromised versions exist in lockfiles
162. Check if compromised code paths are reachable
173. Review deployment logs for anomalous behavior
184. Document exposure scope
19
20### Remediation (2-24 hours)
211. Pin to last-known-good versions in lockfiles
222. Rebuild and redeploy affected services
233. Rotate any secrets that may have been exposed
244. Update SBOM and compliance documents

Time zone coverage across APAC operations

One underappreciated advantage of distributed APAC teams: natural follow-the-sun coverage. When the September 2025 compromise was first reported (US evening, APAC morning), our Vietnam team was already at their desks. They completed initial assessment before our Hong Kong and Singapore colleagues had finished their first coffee.

This is why we structure our managed teams with intentional time zone overlap: Vietnam (UTC+7) handles early detection, Singapore/Hong Kong (UTC+8) runs assessment, and Australian team members (UTC+10/11) handle client communication for AU-based stakeholders.

Post-incident hardening

After every incident, update three things:

  • Your dependency-policy.yml with newly blocked packages
  • Your CI pipeline with any additional checks the incident revealed
  • Your SBOM generation to capture any dependency patterns you missed

Step 7: Evaluate Your Platform Architecture for Long-Term Resilience

Reducing dependency surface through architecture decisions

The most effective defense against supply chain security npm package vulnerabilities is having fewer dependencies to defend. When we help clients build a composable commerce platform selection scorecard for 2026 initiatives, dependency footprint is now a weighted criterion alongside traditional factors like API coverage and vendor support.

Practical architectural choices that reduce npm exposure:

  • Use Node.js built-in modules instead of packages (e.g., node:test instead of Jest for simple cases, fetch instead of axios in Node 18+)
  • Evaluate Deno or Bun for new services—both import from URLs with integrity checks rather than relying on a centralized registry
  • Prefer packages with zero dependencies when alternatives exist
1# Check dependency count before adding a package
2npm view lodash dependencies # Shows sub-dependencies
3npm view lodash.get dependencies # Compare modular alternative

Monorepo vs. polyrepo security trade-offs

Monorepos (using Nx, Turborepo, or pnpm workspaces) centralize dependency management—one lockfile, one audit, one policy. Polyrepos distribute risk but multiply maintenance overhead. For teams of 8-15 developers (our typical managed squad size), monorepos generally win on security posture because the audit surface is consolidated.

Ready to Transform Your Ecommerce Operations?

Branch8 specializes in ecommerce platform implementation and AI-powered automation solutions. Contact us today to discuss your ecommerce automation strategy.

Troubleshooting and Common Mistakes

Mistake 1: Trusting npm audit fix blindly

Running npm audit fix --force can introduce breaking changes by bumping major versions. Always review what fix proposes before applying:

1# See what would change WITHOUT applying
2npm audit fix --dry-run
3
4# Apply only semver-compatible fixes
5npm audit fix # Without --force

In one Branch8 engagement, an automated npm audit fix --force in CI bumped a database driver from v3 to v5, which changed the connection pooling API. The deployment passed tests (which used mocks) but failed in staging. Manual review would have caught this in 10 minutes.

Mistake 2: Ignoring devDependencies in security audits

A common argument: "devDependencies don't ship to production, so they're low risk." This ignores that devDependencies execute during your CI/CD build. A compromised build-time dependency can inject malicious code into your production artifact or exfiltrate secrets from your build environment.

1# Audit production AND dev dependencies
2npm audit --include=dev

Mistake 3: Using .npmrc to suppress audit warnings

We've seen teams add audit=false to .npmrc to avoid noisy warnings. This is the dependency security equivalent of disabling your smoke alarm because it beeps too often. If your audit is too noisy, fix the root cause—update or replace vulnerable packages—rather than silencing the alert.

Mistake 4: Not verifying lockfile integrity in CI

If your CI runs npm install instead of npm ci, it may modify the lockfile, potentially pulling in different (possibly compromised) package versions than what was reviewed in the PR.

1# Always use npm ci in CI/CD
2npm ci # Installs exactly what's in package-lock.json
3
4# NEVER use npm install in CI
5npm install # May resolve different versions

Mistake 5: Overlooking the SBOM in compliance reporting

For teams operating under APRA CPS 234 (Australia) or MAS TRM (Singapore), an outdated SBOM means your compliance documentation is inaccurate. Automate SBOM generation as part of every release:

1# Add to your release pipeline
2- name: Generate release SBOM
3 run: cyclonedx-npm --output-format json --output-file sbom-$(git describe --tags).json
4- name: Upload SBOM as release artifact
5 uses: actions/upload-artifact@v4
6 with:
7 name: sbom
8 path: sbom-*.json

Where npm Supply Chain Security Is Heading

The npm supply chain security landscape is shifting from reactive scanning to proactive attestation. GitHub's roadmap, outlined in their security blog, points toward mandatory provenance for high-impact packages—a move that will fundamentally change how the npm supply chain functions. The OpenSSF's SLSA framework is gaining traction, with Level 3 compliance becoming a de facto requirement for packages used in regulated industries.

For APAC engineering teams, this trend dovetails with tightening regional regulations. Japan's economic security legislation, Australia's expanded critical infrastructure requirements, and Singapore's ongoing MAS guidance updates all point in the same direction: you will need to prove your software supply chain is trustworthy, not just assert it.

The teams that treat supply chain security npm package vulnerabilities as a continuous discipline—not a one-time audit—will have a structural advantage. They'll ship faster because they won't be scrambling during the next compromise. They'll pass compliance reviews without emergency documentation sprints. And they'll attract better engineering talent, because strong developers want to work in environments where security is infrastructure, not afterthought.

If your team needs help building these practices into a distributed APAC engineering operation—or you need experienced Node.js developers who already know this discipline—reach out to Branch8. We've deployed these exact patterns across engagements in Hong Kong, Singapore, Vietnam, and Australia, and we can get your team hardened in weeks, not quarters.

Ready to Transform Your Ecommerce Operations?

Branch8 specializes in ecommerce platform implementation and AI-powered automation solutions. Contact us today to discuss your ecommerce automation strategy.

Sources

  • CISA Advisory on npm Supply Chain Compromise: https://www.cisa.gov/news-events/alerts
  • ArmorCode Analysis of September 2025 npm Attack: https://www.armorcode.com/blog/september-2025-npm-supply-chain-attack
  • GitHub Blog on npm Supply Chain Security Plans: https://github.blog/security/supply-chain-security/our-plan-for-a-more-secure-npm-supply-chain/
  • Synopsys 2024 Open Source Security and Risk Analysis Report: https://www.synopsys.com/software-integrity/resources/analyst-reports/open-source-security-risk-analysis.html
  • OpenSSF SLSA Framework: https://slsa.dev/
  • Socket.dev Supply Chain Security Documentation: https://socket.dev/
  • GitLab Vulnerability Research on npm Supply Chain Attack: https://about.gitlab.com/blog/
  • MAS Technology Risk Management Guidelines: https://www.mas.gov.sg/regulation/guidelines/technology-risk-management-guidelines

FAQ

The npm registry itself was not breached—the September 2025 attack compromised individual maintainer accounts through targeted phishing, which allowed attackers to publish malicious versions of 18+ packages. npm has since enforced stricter authentication requirements and is rolling out mandatory provenance attestation for high-impact packages. However, 'safe' is relative: the registry remains a trust-based system, and teams should implement the layered defenses described in this guide rather than assuming any single platform is inherently secure.

Tiexin Gao, Multi-Solution Architect at Adobe and Consulting Director at Branch8

About the Author

Tiexin Gao

Multi-Solution Architect, Adobe | Consulting Director, Branch8

Tiexin Gao is a Multi-Solution Architect at Adobe with over 12 years of experience delivering enterprise digital experience solutions across Asia-Pacific. As one of the earliest Adobe consultants in the region working on Adobe Experience Manager (AEM) and Adobe Experience Platform (AEP), he has led implementations for global brands including Huawei, OPPO, AIA, Cathay Pacific, and CLP Power Hong Kong. He holds Adobe Certified Expert (AEM Lead Developer) and AEM Sites Architect Master certifications, and an MSc in Software Engineering from Peking University. At Branch8, Tiexin brings deep platform expertise to help clients modernize their digital experience stacks.

Adobe Certified Expert — AEM Lead DeveloperAdobe Experience Manager Sites Architect MasterAdobe Sales Achievement Award (8 consecutive years)MSc Software Engineering, Peking UniversityAdobe Solution Partner — Branch8