From fa8dafcfd36798f891709e9a4e01f98f627e792a Mon Sep 17 00:00:00 2001
From: Jenny-Jiani <70129215+Jenny-Jiani@users.noreply.github.com>
Date: Wed, 30 Sep 2026 10:45:35 +0800
Subject: [PATCH 1/9] update camera-preview-renders-incorrectly-ios.md
---
...mera-preview-renders-incorrectly-ios-27.md | 102 +++++++++++++++++
.../camera-preview-renders-incorrectly-ios.md | 107 +-----------------
.../camera-preview-renders-incorrectly-ios.md | 10 +-
3 files changed, 114 insertions(+), 105 deletions(-)
create mode 100644 _includes/shared/camera-preview-renders-incorrectly-ios-27.md
diff --git a/_includes/shared/camera-preview-renders-incorrectly-ios-27.md b/_includes/shared/camera-preview-renders-incorrectly-ios-27.md
new file mode 100644
index 0000000..b56655f
--- /dev/null
+++ b/_includes/shared/camera-preview-renders-incorrectly-ios-27.md
@@ -0,0 +1,102 @@
+# Why does the camera preview render incorrectly on iOS 27?
+
+## Applicable Products
+
+This article applies to:
+
+- Dynamsoft Barcode Reader (DBR) JavaScript SDK (`dynamsoft-barcode-reader-bundle`) 11.6.3000 and earlier
+- Dynamsoft Capture Vision (DCV) JavaScript SDK (`dynamsoft-capture-vision-bundle`) 3.6.3000 and earlier
+
+## Summary
+
+On iOS 27, switching cameras or changing resolution can make the live camera preview render incorrectly. The exact behavior depends on the SDK version:
+
+| Version | Behavior |
+|---|---|
+| DBR 11.4 - 11.6.3000 (DCV 3.4 - 3.6.3000) | The preview renders distorted - squeezed or stretched instead of filling its container. Intermittent: the same switch can render correctly on one attempt and distorted on the next. |
+| DBR 11.2 and earlier (DCV 3.2 and earlier) | The preview isn't distorted, but it no longer fits its container - shown at the wrong zoom or size and not extending to the borders. |
+
+It's reproducible on Safari, Chrome, Edge, and Firefox - all iOS browsers share WebKit's camera implementation, so we suspect the issue originates there rather than in any Dynamsoft SDK. It does not occur on iOS 26.
+
+> [!NOTE]
+> Reported to Apple, but not confirmed as an Apple bug and still open as of iOS 27 RC. Details here may change if Apple ships a fix.
+
+
+
+
+ Expected
+
+
+
+ Distorted after switching cameras
+
+
+
+## Resolution
+
+### Recommended: upgrade
+
+Upgrade to `dynamsoft-barcode-reader-bundle` **11.6.3200+** or `dynamsoft-capture-vision-bundle` **3.6.3200+**, which include a built-in workaround.
+
+### If you can't upgrade yet
+
+Both workarounds below are temporary and version-specific - neither replaces upgrading.
+
+**DBR 11.4 - 11.6.3000 (DCV 3.4 - 3.6.3000)**
+
+The distortion requires `object-fit: fill` on the video element plus an ancestor using `display: flex` with `flex: 0 0 auto`, so overriding `object-fit` with `cover` on the `` element that [Dynamsoft Camera Enhancer](https://www.dynamsoft.com/camera-enhancer/docs/web/) renders avoids it:
+
+```css
+.dm-camera-core-container video {
+ object-fit: cover !important;
+}
+```
+
+`!important` is needed because the SDK sets `object-fit` inline. The JavaScript equivalent, via [`cameraView.getVideoElement()`](https://www.dynamsoft.com/camera-enhancer/docs/web/programming/javascript/api-reference/cameraview.html?product=dbr&lang=javascript#getvideoelement):
+
+```javascript
+let videoElement = cameraView.getVideoElement();
+videoElement?.style.setProperty('object-fit', 'cover', 'important');
+```
+
+> [!WARNING]
+> `cover` crops rather than stretches to preserve the aspect ratio - confirm that trade-off works for your UI.
+
+**DBR 11.2 and earlier (DCV 3.2 and earlier)**
+
+Reset the video element's dimensions whenever the camera or resolution changes, registering the handlers before `cameraEnhancer.open()`:
+
+```javascript
+const resetVideoWH = () => {
+ const videoEl = cameraEnhancer.getVideoEl();
+ videoEl.style.width = "";
+ videoEl.style.height = "";
+
+ requestAnimationFrame(() => {
+ requestAnimationFrame(() => {
+ videoEl.style.width = "100%";
+ videoEl.style.height = "100%";
+ });
+ });
+};
+cameraEnhancer.on("cameraChange", resetVideoWH);
+cameraEnhancer.on("resolutionChange", resetVideoWH);
+
+cameraView.createDrawingLayer(2); // layer ID depends on the product - see below
+
+// Normal startup routine, shown here only to indicate placement
+await cameraEnhancer.open();
+await cvRouter.startCapturing();
+```
+
+The `createDrawingLayer` call is part of the workaround. Pass the layer ID for your product:
+
+| Product | Layer ID |
+|---|---|
+| Dynamsoft Barcode Reader (DBR) | 2 |
+| Mobile Document Scanner (MDS - DDN layer) | 1 |
+| MRZ Scanner (DLR layer) | 3 |
+
+## Need more help?
+
+[Contact the Dynamsoft Support team](https://www.dynamsoft.com/contact/).
\ No newline at end of file
diff --git a/barcode-reader/web/camera/camera-preview-renders-incorrectly-ios.md b/barcode-reader/web/camera/camera-preview-renders-incorrectly-ios.md
index 4779519..1014006 100644
--- a/barcode-reader/web/camera/camera-preview-renders-incorrectly-ios.md
+++ b/barcode-reader/web/camera/camera-preview-renders-incorrectly-ios.md
@@ -1,110 +1,9 @@
---
layout: default-layout
-title: Why does the camera preview render incorrectly on iOS 27?
+title: Why Does the Barcode Reader's Camera Preview Render Incorrectly on iOS 27?
keywords: iOS 27, camera, preview, distorted, video, switching camera, changing resolution, Safari, Chrome, Edge, Firefox, WebKit, Dynamsoft Camera Enhancer, Dynamsoft Barcode Reader, Dynamsoft MRZ Scanner
-description: On iOS 27, switching cameras or changing resolution can make the live camera preview render distorted or fit its container incorrectly. Fixed in dynamsoft-barcode-reader-bundle 11.6.3200 and dynamsoft-capture-vision-bundle 3.6.3200; workarounds are available for earlier versions.
+description: On iOS 27, switching cameras or resolution can distort or misfit the MRZ Scanner's live camera preview - a WebKit-wide issue, not specific to Dynamsoft. See the fix in 11.6.3200+/3.6.3200+ and workarounds for older versions.
needAutoGenerateSidebar: false
---
-# Why does the camera preview render incorrectly on iOS 27?
-
-## Applicable Products
-
-This article applies to:
-
-- Dynamsoft Barcode Reader (DBR) JavaScript SDK (`dynamsoft-barcode-reader-bundle`) 11.6.3000 and earlier
-- Dynamsoft Capture Vision (DCV) JavaScript SDK (`dynamsoft-capture-vision-bundle`) 3.6.3000 and earlier
-
-## Summary
-
-On iOS 27, switching cameras or changing resolution can make the live camera preview render incorrectly. The exact behavior depends on the SDK version:
-
-| Version | Behavior |
-|---|---|
-| DBR 11.4 – 11.6.3000 (DCV 3.4 – 3.6.3000) | The preview renders distorted — squeezed or stretched instead of filling its container. Intermittent: the same switch can render correctly on one attempt and distorted on the next. |
-| DBR 11.2 and earlier (DCV 3.2 and earlier) | The preview isn't distorted, but it no longer fits its container — shown at the wrong zoom or size and not extending to the borders. |
-
-It's reproducible on Safari, Chrome, Edge, and Firefox — all iOS browsers share WebKit's camera implementation, so we suspect the issue originates there rather than in any Dynamsoft SDK. It does not occur on iOS 26.
-
-> [!NOTE]
-> Reported to Apple, but not confirmed as an Apple bug and still open as of iOS 27 RC. Details here may change if Apple ships a fix.
-
-
-
-
- Expected
-
-
-
- Distorted after switching cameras
-
-
-
-## Resolution
-
-### Recommended: upgrade
-
-Upgrade to `dynamsoft-barcode-reader-bundle` **11.6.3200+** or `dynamsoft-capture-vision-bundle` **3.6.3200+**, which include a built-in workaround.
-
-### If you can't upgrade yet
-
-Both workarounds below are temporary and version-specific — neither replaces upgrading.
-
-**DBR 11.4 – 11.6.3000 (DCV 3.4 – 3.6.3000)**
-
-The distortion requires `object-fit: fill` on the video element plus an ancestor using `display: flex` with `flex: 0 0 auto`, so overriding `object-fit` with `cover` on the `` element that [Dynamsoft Camera Enhancer](https://www.dynamsoft.com/camera-enhancer/docs/web/) renders avoids it:
-
-```css
-.dm-camera-core-container video {
- object-fit: cover !important;
-}
-```
-
-`!important` is needed because the SDK sets `object-fit` inline. The JavaScript equivalent, via [`cameraView.getVideoElement()`](https://www.dynamsoft.com/camera-enhancer/docs/web/programming/javascript/api-reference/cameraview.html?product=dbr&lang=javascript#getvideoelement):
-
-```javascript
-let videoElement = cameraView.getVideoElement();
-videoElement?.style.setProperty('object-fit', 'cover', 'important');
-```
-
-> [!WARNING]
-> `cover` crops rather than stretches to preserve the aspect ratio — confirm that trade-off works for your UI.
-
-**DBR 11.2 and earlier (DCV 3.2 and earlier)**
-
-Reset the video element's dimensions whenever the camera or resolution changes, registering the handlers before `cameraEnhancer.open()`:
-
-```javascript
-const resetVideoWH = () => {
- const videoEl = cameraEnhancer.getVideoEl();
- videoEl.style.width = "";
- videoEl.style.height = "";
-
- requestAnimationFrame(() => {
- requestAnimationFrame(() => {
- videoEl.style.width = "100%";
- videoEl.style.height = "100%";
- });
- });
-};
-cameraEnhancer.on("cameraChange", resetVideoWH);
-cameraEnhancer.on("resolutionChange", resetVideoWH);
-
-cameraView.createDrawingLayer(2); // layer ID depends on the product — see below
-
-// Normal startup routine, shown here only to indicate placement
-await cameraEnhancer.open();
-await cvRouter.startCapturing();
-```
-
-The `createDrawingLayer` call is part of the workaround. Pass the layer ID for your product:
-
-| Product | Layer ID |
-|---|---|
-| Dynamsoft Barcode Reader (DBR) | 2 |
-| Mobile Document Scanner (MDS — DDN layer) | 1 |
-| MRZ Scanner (DLR layer) | 3 |
-
-## Need more help?
-
-[Contact the Dynamsoft Support team](https://www.dynamsoft.com/contact/).
+{% include shared/camera-preview-renders-incorrectly-ios-27.md %}
diff --git a/mrz-scanner/general/camera-preview-renders-incorrectly-ios.md b/mrz-scanner/general/camera-preview-renders-incorrectly-ios.md
index 4904f82..c68e2c3 120000
--- a/mrz-scanner/general/camera-preview-renders-incorrectly-ios.md
+++ b/mrz-scanner/general/camera-preview-renders-incorrectly-ios.md
@@ -1 +1,9 @@
-../../barcode-reader/web/camera/camera-preview-renders-incorrectly-ios.md
\ No newline at end of file
+---
+layout: default-layout
+title: Why Does the MRZ Scanner's Camera Preview Render Incorrectly on iOS 27?
+keywords: iOS 27, camera, preview, distorted, video, switching camera, changing resolution, Safari, Chrome, Edge, Firefox, WebKit, Dynamsoft Camera Enhancer, Dynamsoft Barcode Reader, Dynamsoft MRZ Scanner
+description: iOS 27 can render the Barcode Reader's live camera preview distorted or out of alignment after switching cameras or resolution. Learn which SDK versions are affected and how to fix or work around it.
+needAutoGenerateSidebar: false
+---
+
+{% include shared/camera-preview-renders-incorrectly-ios-27.md %}
\ No newline at end of file
From 3506cf14db35ec2e1f69cbaab25ab6010eb8d880 Mon Sep 17 00:00:00 2001
From: Jenny-Jiani <70129215+Jenny-Jiani@users.noreply.github.com>
Date: Wed, 30 Sep 2026 11:01:24 +0800
Subject: [PATCH 2/9] Revert "update camera-preview-renders-incorrectly-ios.md"
This reverts commit fa8dafcfd36798f891709e9a4e01f98f627e792a.
---
.../general/camera-preview-renders-incorrectly-ios.md | 9 ---------
1 file changed, 9 deletions(-)
delete mode 120000 mrz-scanner/general/camera-preview-renders-incorrectly-ios.md
diff --git a/mrz-scanner/general/camera-preview-renders-incorrectly-ios.md b/mrz-scanner/general/camera-preview-renders-incorrectly-ios.md
deleted file mode 120000
index c68e2c3..0000000
--- a/mrz-scanner/general/camera-preview-renders-incorrectly-ios.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-layout: default-layout
-title: Why Does the MRZ Scanner's Camera Preview Render Incorrectly on iOS 27?
-keywords: iOS 27, camera, preview, distorted, video, switching camera, changing resolution, Safari, Chrome, Edge, Firefox, WebKit, Dynamsoft Camera Enhancer, Dynamsoft Barcode Reader, Dynamsoft MRZ Scanner
-description: iOS 27 can render the Barcode Reader's live camera preview distorted or out of alignment after switching cameras or resolution. Learn which SDK versions are affected and how to fix or work around it.
-needAutoGenerateSidebar: false
----
-
-{% include shared/camera-preview-renders-incorrectly-ios-27.md %}
\ No newline at end of file
From d85808c416c59fe51d97fe678dcaa727b3ad2480 Mon Sep 17 00:00:00 2001
From: Jenny-Jiani <70129215+Jenny-Jiani@users.noreply.github.com>
Date: Wed, 30 Sep 2026 11:07:33 +0800
Subject: [PATCH 3/9] Create camera-preview-renders-incorrectly-ios.md
---
.../general/camera-preview-renders-incorrectly-ios.md | 9 +++++++++
1 file changed, 9 insertions(+)
create mode 100644 mrz-scanner/general/camera-preview-renders-incorrectly-ios.md
diff --git a/mrz-scanner/general/camera-preview-renders-incorrectly-ios.md b/mrz-scanner/general/camera-preview-renders-incorrectly-ios.md
new file mode 100644
index 0000000..e76ddf6
--- /dev/null
+++ b/mrz-scanner/general/camera-preview-renders-incorrectly-ios.md
@@ -0,0 +1,9 @@
+---
+layout: default-layout
+title: Why Does the MRZ Scanner's Camera Preview Render Incorrectly on iOS 27?
+keywords: iOS 27, camera, preview, distorted, video, switching camera, changing resolution, Safari, Chrome, Edge, Firefox, WebKit, Dynamsoft Camera Enhancer, Dynamsoft Barcode Reader, Dynamsoft MRZ Scanner
+description: On iOS 27, switching cameras or resolution can distort or misfit the MRZ Scanner's live camera preview — a WebKit-wide issue, not specific to Dynamsoft. See the fix in 11.6.3200+/3.6.3200+ and workarounds for older versions.
+needAutoGenerateSidebar: false
+---
+
+{% include shared/camera-preview-renders-incorrectly-ios-27.md %}
From 26fa6333745a46a44414cd91028ab71f7f000a25 Mon Sep 17 00:00:00 2001
From: Jenny-Jiani <70129215+Jenny-Jiani@users.noreply.github.com>
Date: Wed, 30 Sep 2026 13:07:04 +0800
Subject: [PATCH 4/9] Rollback changes
This reverts commit d85808c416c59fe51d97fe678dcaa727b3ad2480.
---
...mera-preview-renders-incorrectly-ios-27.md | 102 -----------------
.../camera-preview-renders-incorrectly-ios.md | 107 +++++++++++++++++-
.../camera-preview-renders-incorrectly-ios.md | 10 +-
3 files changed, 105 insertions(+), 114 deletions(-)
delete mode 100644 _includes/shared/camera-preview-renders-incorrectly-ios-27.md
diff --git a/_includes/shared/camera-preview-renders-incorrectly-ios-27.md b/_includes/shared/camera-preview-renders-incorrectly-ios-27.md
deleted file mode 100644
index b56655f..0000000
--- a/_includes/shared/camera-preview-renders-incorrectly-ios-27.md
+++ /dev/null
@@ -1,102 +0,0 @@
-# Why does the camera preview render incorrectly on iOS 27?
-
-## Applicable Products
-
-This article applies to:
-
-- Dynamsoft Barcode Reader (DBR) JavaScript SDK (`dynamsoft-barcode-reader-bundle`) 11.6.3000 and earlier
-- Dynamsoft Capture Vision (DCV) JavaScript SDK (`dynamsoft-capture-vision-bundle`) 3.6.3000 and earlier
-
-## Summary
-
-On iOS 27, switching cameras or changing resolution can make the live camera preview render incorrectly. The exact behavior depends on the SDK version:
-
-| Version | Behavior |
-|---|---|
-| DBR 11.4 - 11.6.3000 (DCV 3.4 - 3.6.3000) | The preview renders distorted - squeezed or stretched instead of filling its container. Intermittent: the same switch can render correctly on one attempt and distorted on the next. |
-| DBR 11.2 and earlier (DCV 3.2 and earlier) | The preview isn't distorted, but it no longer fits its container - shown at the wrong zoom or size and not extending to the borders. |
-
-It's reproducible on Safari, Chrome, Edge, and Firefox - all iOS browsers share WebKit's camera implementation, so we suspect the issue originates there rather than in any Dynamsoft SDK. It does not occur on iOS 26.
-
-> [!NOTE]
-> Reported to Apple, but not confirmed as an Apple bug and still open as of iOS 27 RC. Details here may change if Apple ships a fix.
-
-
-
-
- Expected
-
-
-
- Distorted after switching cameras
-
-
-
-## Resolution
-
-### Recommended: upgrade
-
-Upgrade to `dynamsoft-barcode-reader-bundle` **11.6.3200+** or `dynamsoft-capture-vision-bundle` **3.6.3200+**, which include a built-in workaround.
-
-### If you can't upgrade yet
-
-Both workarounds below are temporary and version-specific - neither replaces upgrading.
-
-**DBR 11.4 - 11.6.3000 (DCV 3.4 - 3.6.3000)**
-
-The distortion requires `object-fit: fill` on the video element plus an ancestor using `display: flex` with `flex: 0 0 auto`, so overriding `object-fit` with `cover` on the `` element that [Dynamsoft Camera Enhancer](https://www.dynamsoft.com/camera-enhancer/docs/web/) renders avoids it:
-
-```css
-.dm-camera-core-container video {
- object-fit: cover !important;
-}
-```
-
-`!important` is needed because the SDK sets `object-fit` inline. The JavaScript equivalent, via [`cameraView.getVideoElement()`](https://www.dynamsoft.com/camera-enhancer/docs/web/programming/javascript/api-reference/cameraview.html?product=dbr&lang=javascript#getvideoelement):
-
-```javascript
-let videoElement = cameraView.getVideoElement();
-videoElement?.style.setProperty('object-fit', 'cover', 'important');
-```
-
-> [!WARNING]
-> `cover` crops rather than stretches to preserve the aspect ratio - confirm that trade-off works for your UI.
-
-**DBR 11.2 and earlier (DCV 3.2 and earlier)**
-
-Reset the video element's dimensions whenever the camera or resolution changes, registering the handlers before `cameraEnhancer.open()`:
-
-```javascript
-const resetVideoWH = () => {
- const videoEl = cameraEnhancer.getVideoEl();
- videoEl.style.width = "";
- videoEl.style.height = "";
-
- requestAnimationFrame(() => {
- requestAnimationFrame(() => {
- videoEl.style.width = "100%";
- videoEl.style.height = "100%";
- });
- });
-};
-cameraEnhancer.on("cameraChange", resetVideoWH);
-cameraEnhancer.on("resolutionChange", resetVideoWH);
-
-cameraView.createDrawingLayer(2); // layer ID depends on the product - see below
-
-// Normal startup routine, shown here only to indicate placement
-await cameraEnhancer.open();
-await cvRouter.startCapturing();
-```
-
-The `createDrawingLayer` call is part of the workaround. Pass the layer ID for your product:
-
-| Product | Layer ID |
-|---|---|
-| Dynamsoft Barcode Reader (DBR) | 2 |
-| Mobile Document Scanner (MDS - DDN layer) | 1 |
-| MRZ Scanner (DLR layer) | 3 |
-
-## Need more help?
-
-[Contact the Dynamsoft Support team](https://www.dynamsoft.com/contact/).
\ No newline at end of file
diff --git a/barcode-reader/web/camera/camera-preview-renders-incorrectly-ios.md b/barcode-reader/web/camera/camera-preview-renders-incorrectly-ios.md
index 1014006..4779519 100644
--- a/barcode-reader/web/camera/camera-preview-renders-incorrectly-ios.md
+++ b/barcode-reader/web/camera/camera-preview-renders-incorrectly-ios.md
@@ -1,9 +1,110 @@
---
layout: default-layout
-title: Why Does the Barcode Reader's Camera Preview Render Incorrectly on iOS 27?
+title: Why does the camera preview render incorrectly on iOS 27?
keywords: iOS 27, camera, preview, distorted, video, switching camera, changing resolution, Safari, Chrome, Edge, Firefox, WebKit, Dynamsoft Camera Enhancer, Dynamsoft Barcode Reader, Dynamsoft MRZ Scanner
-description: On iOS 27, switching cameras or resolution can distort or misfit the MRZ Scanner's live camera preview - a WebKit-wide issue, not specific to Dynamsoft. See the fix in 11.6.3200+/3.6.3200+ and workarounds for older versions.
+description: On iOS 27, switching cameras or changing resolution can make the live camera preview render distorted or fit its container incorrectly. Fixed in dynamsoft-barcode-reader-bundle 11.6.3200 and dynamsoft-capture-vision-bundle 3.6.3200; workarounds are available for earlier versions.
needAutoGenerateSidebar: false
---
-{% include shared/camera-preview-renders-incorrectly-ios-27.md %}
+# Why does the camera preview render incorrectly on iOS 27?
+
+## Applicable Products
+
+This article applies to:
+
+- Dynamsoft Barcode Reader (DBR) JavaScript SDK (`dynamsoft-barcode-reader-bundle`) 11.6.3000 and earlier
+- Dynamsoft Capture Vision (DCV) JavaScript SDK (`dynamsoft-capture-vision-bundle`) 3.6.3000 and earlier
+
+## Summary
+
+On iOS 27, switching cameras or changing resolution can make the live camera preview render incorrectly. The exact behavior depends on the SDK version:
+
+| Version | Behavior |
+|---|---|
+| DBR 11.4 – 11.6.3000 (DCV 3.4 – 3.6.3000) | The preview renders distorted — squeezed or stretched instead of filling its container. Intermittent: the same switch can render correctly on one attempt and distorted on the next. |
+| DBR 11.2 and earlier (DCV 3.2 and earlier) | The preview isn't distorted, but it no longer fits its container — shown at the wrong zoom or size and not extending to the borders. |
+
+It's reproducible on Safari, Chrome, Edge, and Firefox — all iOS browsers share WebKit's camera implementation, so we suspect the issue originates there rather than in any Dynamsoft SDK. It does not occur on iOS 26.
+
+> [!NOTE]
+> Reported to Apple, but not confirmed as an Apple bug and still open as of iOS 27 RC. Details here may change if Apple ships a fix.
+
+
+
+
+ Expected
+
+
+
+ Distorted after switching cameras
+
+
+
+## Resolution
+
+### Recommended: upgrade
+
+Upgrade to `dynamsoft-barcode-reader-bundle` **11.6.3200+** or `dynamsoft-capture-vision-bundle` **3.6.3200+**, which include a built-in workaround.
+
+### If you can't upgrade yet
+
+Both workarounds below are temporary and version-specific — neither replaces upgrading.
+
+**DBR 11.4 – 11.6.3000 (DCV 3.4 – 3.6.3000)**
+
+The distortion requires `object-fit: fill` on the video element plus an ancestor using `display: flex` with `flex: 0 0 auto`, so overriding `object-fit` with `cover` on the `` element that [Dynamsoft Camera Enhancer](https://www.dynamsoft.com/camera-enhancer/docs/web/) renders avoids it:
+
+```css
+.dm-camera-core-container video {
+ object-fit: cover !important;
+}
+```
+
+`!important` is needed because the SDK sets `object-fit` inline. The JavaScript equivalent, via [`cameraView.getVideoElement()`](https://www.dynamsoft.com/camera-enhancer/docs/web/programming/javascript/api-reference/cameraview.html?product=dbr&lang=javascript#getvideoelement):
+
+```javascript
+let videoElement = cameraView.getVideoElement();
+videoElement?.style.setProperty('object-fit', 'cover', 'important');
+```
+
+> [!WARNING]
+> `cover` crops rather than stretches to preserve the aspect ratio — confirm that trade-off works for your UI.
+
+**DBR 11.2 and earlier (DCV 3.2 and earlier)**
+
+Reset the video element's dimensions whenever the camera or resolution changes, registering the handlers before `cameraEnhancer.open()`:
+
+```javascript
+const resetVideoWH = () => {
+ const videoEl = cameraEnhancer.getVideoEl();
+ videoEl.style.width = "";
+ videoEl.style.height = "";
+
+ requestAnimationFrame(() => {
+ requestAnimationFrame(() => {
+ videoEl.style.width = "100%";
+ videoEl.style.height = "100%";
+ });
+ });
+};
+cameraEnhancer.on("cameraChange", resetVideoWH);
+cameraEnhancer.on("resolutionChange", resetVideoWH);
+
+cameraView.createDrawingLayer(2); // layer ID depends on the product — see below
+
+// Normal startup routine, shown here only to indicate placement
+await cameraEnhancer.open();
+await cvRouter.startCapturing();
+```
+
+The `createDrawingLayer` call is part of the workaround. Pass the layer ID for your product:
+
+| Product | Layer ID |
+|---|---|
+| Dynamsoft Barcode Reader (DBR) | 2 |
+| Mobile Document Scanner (MDS — DDN layer) | 1 |
+| MRZ Scanner (DLR layer) | 3 |
+
+## Need more help?
+
+[Contact the Dynamsoft Support team](https://www.dynamsoft.com/contact/).
diff --git a/mrz-scanner/general/camera-preview-renders-incorrectly-ios.md b/mrz-scanner/general/camera-preview-renders-incorrectly-ios.md
index e76ddf6..4904f82 100644
--- a/mrz-scanner/general/camera-preview-renders-incorrectly-ios.md
+++ b/mrz-scanner/general/camera-preview-renders-incorrectly-ios.md
@@ -1,9 +1 @@
----
-layout: default-layout
-title: Why Does the MRZ Scanner's Camera Preview Render Incorrectly on iOS 27?
-keywords: iOS 27, camera, preview, distorted, video, switching camera, changing resolution, Safari, Chrome, Edge, Firefox, WebKit, Dynamsoft Camera Enhancer, Dynamsoft Barcode Reader, Dynamsoft MRZ Scanner
-description: On iOS 27, switching cameras or resolution can distort or misfit the MRZ Scanner's live camera preview — a WebKit-wide issue, not specific to Dynamsoft. See the fix in 11.6.3200+/3.6.3200+ and workarounds for older versions.
-needAutoGenerateSidebar: false
----
-
-{% include shared/camera-preview-renders-incorrectly-ios-27.md %}
+../../barcode-reader/web/camera/camera-preview-renders-incorrectly-ios.md
\ No newline at end of file
From 5b1404d50e319518c1566a250ba3657e9d37934f Mon Sep 17 00:00:00 2001
From: Louie-Dynamsoft
Date: Tue, 29 Sep 2026 22:40:39 -0700
Subject: [PATCH 5/9] Add local Jekyll development scripts for FAQ (#67)
* Add local Jekyll development scripts for FAQ
* Keep archived FAQ pages out of local preview builds
---
.gitattributes | 1 +
.gitignore | 1 +
AGENTS.md | 6 ++
README.md | 16 ++++-
check_links.py | 1 +
scripts/dev.ps1 | 159 ++++++++++++++++++++++++++++++++++++++++++
scripts/dev.sh | 180 ++++++++++++++++++++++++++++++++++++++++++++++++
7 files changed, 363 insertions(+), 1 deletion(-)
create mode 100644 .gitattributes
create mode 100644 scripts/dev.ps1
create mode 100755 scripts/dev.sh
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..0992525
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1 @@
+scripts/dev.sh text eol=lf
diff --git a/.gitignore b/.gitignore
index dc88a1b..55f042d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,4 +6,5 @@ logs/
temp/*
!temp/keep.txt
.idea
+.dev/
# *.py
\ No newline at end of file
diff --git a/AGENTS.md b/AGENTS.md
index d7219cd..591c020 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -47,6 +47,12 @@ Directories named `archive` under `barcode-reader/{mobile,server,web}/` hold his
If you find yourself wanting to *add* content to an archive directory, it almost certainly belongs in the live directory instead.
+## Testing the local site
+
+The Jekyll layout comes from `Docs-Template-Repo`, not this repository. Install Git and Ruby/Bundler plus `rsync` (Bash) or `robocopy` (PowerShell). From the repo root, run `./scripts/dev.sh` or `./scripts/dev.ps1` to prepare `.dev/DocHome` and serve at `http://localhost:5555/faq/`. The scripts exclude archived FAQ directories and local worktrees from that merged workspace.
+
+For preparation without a server, use `./scripts/dev.sh --no-serve` or `./scripts/dev.ps1 -NoServe`; rerun the script without that flag to start the server. Use `--no-template-update` / `-NoTemplateUpdate` to reuse the cloned template. Rerun after editing FAQ source because the merged workspace is a copy, then check the changed page in the local site. `.dev/` is generated and Git-ignored; do not edit it as source.
+
## Before finishing
Run the link checker from the repo root and fix anything it flags in files you touched:
diff --git a/README.md b/README.md
index 1fc04f5..d37240b 100644
--- a/README.md
+++ b/README.md
@@ -10,10 +10,24 @@ See [`AGENTS.md`](AGENTS.md) for the FAQ article structure, frontmatter, linking
The site is built with Jekyll using a shared theme/layout maintained in [dynamsoft-docs/Docs-Template-Repo](https://github.com/dynamsoft-docs/Docs-Template-Repo), which this repo doesn't include locally. Pushes to `main` and `preview` trigger the CI workflows in `.github/workflows/main.yml`, which build and sync to production and the preview/testing environment respectively.
+For a local preview, install Git, Ruby/Bundler, and rsync (Bash) or robocopy (PowerShell), then run from the repository root:
+
+```bash
+./scripts/dev.sh
+```
+
+Or on Windows:
+
+```powershell
+./scripts/dev.ps1
+```
+
+The scripts clone the shared template's preview branch into `.dev/`, merge it with this FAQ source, install gems, and serve Jekyll at `http://localhost:5555/faq/`. The generated `.dev/` workspace is ignored by Git and omits archived FAQ content and local worktrees. Use `--no-serve` / `-NoServe` to prepare without serving, then rerun without that flag to serve; `--no-template-update` / `-NoTemplateUpdate` reuses the cloned template. Changes to FAQ files require rerunning the script to refresh the merged workspace.
+
## Checking links
`check_links.py` crawls the repo's Markdown files and reports broken links. Run it before submitting a change that touches links:
```bash
python check_links.py
-```
+```
\ No newline at end of file
diff --git a/check_links.py b/check_links.py
index ce54653..798579b 100644
--- a/check_links.py
+++ b/check_links.py
@@ -26,6 +26,7 @@ def find_md_files(root_dir):
for root, dirs, files in os.walk(root_dir):
if '.git' in dirs: dirs.remove('.git')
if '_site' in dirs: dirs.remove('_site')
+ if '.dev' in dirs: dirs.remove('.dev')
for file in files:
if file.endswith('.md'):
diff --git a/scripts/dev.ps1 b/scripts/dev.ps1
new file mode 100644
index 0000000..0d5abd5
--- /dev/null
+++ b/scripts/dev.ps1
@@ -0,0 +1,159 @@
+[CmdletBinding()]
+param(
+ [string]$TemplateRepoUrl = "https://github.com/dynamsoft-docs/Docs-Template-Repo.git",
+ [string]$TemplateBranch = "preview",
+ [int]$Port = 5555,
+ [string]$BindHost = "localhost",
+ [switch]$NoTemplateUpdate,
+ [switch]$NoServe
+)
+
+Set-StrictMode -Version Latest
+$ErrorActionPreference = "Stop"
+
+function Write-Step {
+ param([string]$Message)
+ Write-Host "==> $Message"
+}
+
+function Ensure-Command {
+ param([string]$Name)
+ if (-not (Get-Command $Name -ErrorAction SilentlyContinue)) {
+ throw "Required command '$Name' was not found in PATH."
+ }
+}
+
+function Invoke-Native {
+ param(
+ [Parameter(Mandatory = $true)]
+ [string]$FilePath,
+ [string[]]$Arguments = @()
+ )
+
+ & $FilePath @Arguments
+ $code = $LASTEXITCODE
+ if ($code -ne 0) {
+ $argText = ($Arguments -join " ")
+ throw "Command failed with exit code ${code}: $FilePath $argText"
+ }
+}
+
+function Invoke-Robocopy {
+ param(
+ [string]$Source,
+ [string]$Destination,
+ [string[]]$ExtraArgs
+ )
+
+ $baseArgs = @(
+ $Source,
+ $Destination,
+ "/R:2",
+ "/W:2",
+ "/NFL",
+ "/NDL",
+ "/NJH",
+ "/NJS",
+ "/NP"
+ )
+ $allArgs = $baseArgs + $ExtraArgs
+ & robocopy @allArgs | Out-Null
+ $code = $LASTEXITCODE
+ if ($code -ge 8) {
+ throw "robocopy failed with exit code $code. Source: $Source Destination: $Destination"
+ }
+}
+
+Ensure-Command "git"
+Ensure-Command "robocopy"
+Ensure-Command "bundle"
+
+$repoRoot = Split-Path -Parent $PSScriptRoot
+$devRoot = Join-Path $repoRoot ".dev"
+$templateRoot = Join-Path $devRoot "Docs-Template-Repo"
+$docHome = Join-Path $devRoot "DocHome"
+$bundlePath = Join-Path $devRoot "vendor\bundle"
+$bundleConfig = Join-Path $devRoot ".bundle"
+$bundleUserHome = Join-Path $devRoot ".bundle-user"
+$jekyllCache = Join-Path $devRoot ".jekyll-cache"
+$siteDir = Join-Path $devRoot "_site"
+
+Write-Step "Preparing local workspace in $devRoot"
+New-Item -ItemType Directory -Force -Path $devRoot | Out-Null
+
+if (-not (Test-Path $templateRoot)) {
+ Write-Step "Cloning template repo ($TemplateBranch)"
+ Invoke-Native -FilePath "git" -Arguments @("clone", "--depth", "1", "--branch", $TemplateBranch, $TemplateRepoUrl, $templateRoot)
+} elseif (-not $NoTemplateUpdate) {
+ Write-Step "Syncing template repo ($TemplateBranch)"
+ Invoke-Native -FilePath "git" -Arguments @("-C", $templateRoot, "fetch", "origin", $TemplateBranch, "--depth", "1")
+ Invoke-Native -FilePath "git" -Arguments @("-C", $templateRoot, "reset", "--hard")
+ Invoke-Native -FilePath "git" -Arguments @("-C", $templateRoot, "clean", "-fd")
+ Invoke-Native -FilePath "git" -Arguments @("-C", $templateRoot, "checkout", "-B", $TemplateBranch, "origin/$TemplateBranch")
+} else {
+ Write-Step "Skipping template update"
+}
+
+Write-Step "Rebuilding merged site workspace"
+if (Test-Path $docHome) {
+ Remove-Item -LiteralPath $docHome -Recurse -Force
+}
+New-Item -ItemType Directory -Force -Path $docHome | Out-Null
+Invoke-Robocopy -Source $repoRoot -Destination $docHome -ExtraArgs @(
+ "/MIR",
+ "/XD", ".git", ".dev", ".claude", ".vs", "node_modules", "_site", ".bundle", ".jekyll-cache", ".sass-cache", "vendor",
+ (Join-Path $repoRoot "barcode-reader\mobile\archive"),
+ (Join-Path $repoRoot "barcode-reader\server\archive"),
+ (Join-Path $repoRoot "barcode-reader\web\archive")
+)
+Invoke-Robocopy -Source $templateRoot -Destination $docHome -ExtraArgs @(
+ "/E",
+ "/XD", ".git", ".github", "_site", "node_modules"
+)
+
+Write-Step "Applying local assetsPath replacements"
+$search = "assetsPath = '/webres/wwwroot'"
+$replace = "assetsPath = 'https://www.dynamsoft.com/webres/wwwroot'"
+foreach ($dirName in @("_includes", "_layouts")) {
+ $dirPath = Join-Path $docHome $dirName
+ if (-not (Test-Path $dirPath)) {
+ continue
+ }
+
+ Get-ChildItem -Path $dirPath -Recurse -File | ForEach-Object {
+ $path = $_.FullName
+ try {
+ $content = [System.IO.File]::ReadAllText($path)
+ } catch {
+ return
+ }
+ if ($content.Contains($search)) {
+ $updated = $content.Replace($search, $replace)
+ [System.IO.File]::WriteAllText($path, $updated)
+ }
+ }
+}
+
+Write-Step "Configuring Bundler and Jekyll local paths"
+$env:BUNDLE_PATH = $bundlePath
+$env:BUNDLE_APP_CONFIG = $bundleConfig
+$env:BUNDLE_USER_HOME = $bundleUserHome
+$env:BUNDLE_USER_CACHE = Join-Path $bundleUserHome "cache"
+$env:JEKYLL_CACHE_DIR = $jekyllCache
+$env:JEKYLL_ENV = "development"
+New-Item -ItemType Directory -Force -Path $bundlePath, $bundleConfig, $bundleUserHome, $jekyllCache, $siteDir | Out-Null
+
+Push-Location $docHome
+try {
+ Write-Step "Installing Ruby dependencies"
+ Invoke-Native -FilePath "bundle" -Arguments @("install")
+
+ if ($NoServe) {
+ Write-Step "Workspace prepared. Run this script again without -NoServe to start Jekyll."
+ } else {
+ Write-Step "Starting Jekyll server on port $Port"
+ Invoke-Native -FilePath "bundle" -Arguments @("exec", "jekyll", "serve", "-P", "$Port", "--trace", "--host=$BindHost", "--livereload", "--destination", "$siteDir")
+ }
+} finally {
+ Pop-Location
+}
diff --git a/scripts/dev.sh b/scripts/dev.sh
new file mode 100755
index 0000000..6ba3f39
--- /dev/null
+++ b/scripts/dev.sh
@@ -0,0 +1,180 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+template_repo_url="https://github.com/dynamsoft-docs/Docs-Template-Repo.git"
+template_branch="preview"
+port="5555"
+bind_host="localhost"
+no_template_update="false"
+no_serve="false"
+
+write_step() {
+ echo "==> $1"
+}
+
+require_cmd() {
+ if ! command -v "$1" >/dev/null 2>&1; then
+ echo "Required command '$1' was not found in PATH." >&2
+ exit 1
+ fi
+}
+
+show_help() {
+ cat <<'EOF'
+Usage: ./scripts/dev.sh [options]
+
+Options:
+ --template-repo-url URL Template repository URL
+ --template-branch NAME Template branch (default: preview)
+ --port N Jekyll port (default: 5555)
+ --bind-host HOST Jekyll bind host (default: localhost)
+ --no-template-update Skip template fetch/pull
+ --no-serve Prepare workspace only (do not start Jekyll)
+ -h, --help Show this help message
+EOF
+}
+
+require_option_value() {
+ if [[ $# -lt 2 || -z "${2:-}" || "${2:-}" == --* ]]; then
+ echo "Missing value for option: $1" >&2
+ show_help
+ exit 1
+ fi
+}
+
+while [[ $# -gt 0 ]]; do
+ case "$1" in
+ --template-repo-url)
+ require_option_value "$@"
+ template_repo_url="$2"
+ shift 2
+ ;;
+ --template-branch)
+ require_option_value "$@"
+ template_branch="$2"
+ shift 2
+ ;;
+ --port)
+ require_option_value "$@"
+ port="$2"
+ shift 2
+ ;;
+ --bind-host)
+ require_option_value "$@"
+ bind_host="$2"
+ shift 2
+ ;;
+ --no-template-update)
+ no_template_update="true"
+ shift
+ ;;
+ --no-serve)
+ no_serve="true"
+ shift
+ ;;
+ -h|--help)
+ show_help
+ exit 0
+ ;;
+ *)
+ echo "Unknown option: $1" >&2
+ show_help
+ exit 1
+ ;;
+ esac
+done
+
+require_cmd git
+require_cmd rsync
+require_cmd bundle
+require_cmd find
+require_cmd sed
+
+script_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
+repo_root="$(cd -- "$script_dir/.." && pwd)"
+dev_root="$repo_root/.dev"
+template_root="$dev_root/Docs-Template-Repo"
+doc_home="$dev_root/DocHome"
+bundle_path="$dev_root/vendor/bundle"
+bundle_config="$dev_root/.bundle"
+bundle_user_home="$dev_root/.bundle-user"
+jekyll_cache="$dev_root/.jekyll-cache"
+site_dir="$dev_root/_site"
+
+write_step "Preparing local workspace in $dev_root"
+mkdir -p "$dev_root"
+
+if [[ ! -d "$template_root/.git" ]]; then
+ write_step "Cloning template repo ($template_branch)"
+ git clone --depth 1 --branch "$template_branch" "$template_repo_url" "$template_root"
+elif [[ "$no_template_update" != "true" ]]; then
+ write_step "Syncing template repo ($template_branch)"
+ git -C "$template_root" fetch origin "$template_branch" --depth 1
+ git -C "$template_root" reset --hard
+ git -C "$template_root" clean -fd
+ git -C "$template_root" checkout -B "$template_branch" "origin/$template_branch"
+else
+ write_step "Skipping template update"
+fi
+
+write_step "Rebuilding merged site workspace"
+rm -rf "$doc_home"
+mkdir -p "$doc_home"
+rsync -a --delete \
+ --exclude '.git' \
+ --exclude '.dev' \
+ --exclude '.claude' \
+ --exclude '/barcode-reader/mobile/archive/' \
+ --exclude '/barcode-reader/server/archive/' \
+ --exclude '/barcode-reader/web/archive/' \
+ --exclude '.vs' \
+ --exclude 'node_modules' \
+ --exclude '_site' \
+ --exclude '.bundle' \
+ --exclude '.jekyll-cache' \
+ --exclude '.sass-cache' \
+ --exclude 'vendor' \
+ "$repo_root"/ "$doc_home"/
+rsync -a \
+ --exclude '.git' \
+ --exclude '.github' \
+ --exclude '_site' \
+ --exclude 'node_modules' \
+ "$template_root"/ "$doc_home"/
+
+write_step "Applying local assetsPath replacements"
+search="assetsPath = '/webres/wwwroot'"
+replace="assetsPath = 'https://www.dynamsoft.com/webres/wwwroot'"
+for dir_name in "_includes" "_layouts"; do
+ dir_path="$doc_home/$dir_name"
+ if [[ ! -d "$dir_path" ]]; then
+ continue
+ fi
+
+ while IFS= read -r -d '' file_path; do
+ sed -i.bak "s|$search|$replace|g" "$file_path"
+ rm -f -- "$file_path.bak"
+ done < <(find "$dir_path" -type f -print0)
+done
+
+write_step "Configuring Bundler and Jekyll local paths"
+export BUNDLE_PATH="$bundle_path"
+export BUNDLE_APP_CONFIG="$bundle_config"
+export BUNDLE_USER_HOME="$bundle_user_home"
+export BUNDLE_USER_CACHE="$bundle_user_home/cache"
+export JEKYLL_CACHE_DIR="$jekyll_cache"
+export JEKYLL_ENV="development"
+mkdir -p "$bundle_path" "$bundle_config" "$bundle_user_home" "$jekyll_cache" "$site_dir"
+
+pushd "$doc_home" >/dev/null
+write_step "Installing Ruby dependencies"
+bundle install
+
+if [[ "$no_serve" == "true" ]]; then
+ write_step "Workspace prepared. Run this script again without --no-serve to start Jekyll."
+else
+ write_step "Starting Jekyll server on port $port"
+ bundle exec jekyll serve -P "$port" --trace --host="$bind_host" --livereload --destination "$site_dir"
+fi
+popd >/dev/null
From f5e412a3d3b79241652d6456d0fe75c23ad642a6 Mon Sep 17 00:00:00 2001
From: Doby2333
Date: Wed, 30 Sep 2026 15:38:43 +0800
Subject: [PATCH 6/9] Restore MRZ camera preview metadata in shared FAQ
---
AGENTS.md | 2 +
README.md | 2 +-
.../camera-preview-renders-incorrectly-ios.md | 100 +++++++++++++++++
.../camera-preview-renders-incorrectly-ios.md | 101 +-----------------
.../camera-preview-renders-incorrectly-ios.md | 12 ++-
5 files changed, 115 insertions(+), 102 deletions(-)
create mode 100644 _includes/shared/camera-preview-renders-incorrectly-ios.md
diff --git a/AGENTS.md b/AGENTS.md
index 591c020..c7a673c 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -37,6 +37,8 @@ Rules:
- `mrz-scanner/general/` — MRZ Scanner FAQs
- `license/` — licensing FAQs shared across products
+For an answer published in more than one product section, keep each page’s own frontmatter and question H1, and put the common answer body in `_includes/shared/`. The iOS 27 camera-preview FAQ follows this pattern for Barcode Reader and MRZ Scanner; edit the shared include for answer changes.
+
## Archived content (`*/archive/*`)
Directories named `archive` under `barcode-reader/{mobile,server,web}/` hold historical, version-pinned content (e.g. `-v9.6.40`, `-v10.4.2000` snapshots). They are:
diff --git a/README.md b/README.md
index d37240b..7da79d1 100644
--- a/README.md
+++ b/README.md
@@ -22,7 +22,7 @@ Or on Windows:
./scripts/dev.ps1
```
-The scripts clone the shared template's preview branch into `.dev/`, merge it with this FAQ source, install gems, and serve Jekyll at `http://localhost:5555/faq/`. The generated `.dev/` workspace is ignored by Git and omits archived FAQ content and local worktrees. Use `--no-serve` / `-NoServe` to prepare without serving, then rerun without that flag to serve; `--no-template-update` / `-NoTemplateUpdate` reuses the cloned template. Changes to FAQ files require rerunning the script to refresh the merged workspace.
+The scripts clone the shared template's preview branch into `.dev/`, merge it with this FAQ source, install gems, and serve Jekyll at `http://localhost:5555/faq/`. The generated `.dev/` workspace is ignored by Git and omits archived FAQ content and local worktrees. Use `--no-serve` / `-NoServe` to prepare without serving, then rerun without that flag to serve; `--no-template-update` / `-NoTemplateUpdate` reuses the cloned template. Changes to FAQ files require rerunning the script to refresh the merged workspace. The Barcode Reader and MRZ Scanner iOS 27 camera-preview pages share their answer body in `_includes/shared/` while keeping separate page metadata.
## Checking links
diff --git a/_includes/shared/camera-preview-renders-incorrectly-ios.md b/_includes/shared/camera-preview-renders-incorrectly-ios.md
new file mode 100644
index 0000000..cd78030
--- /dev/null
+++ b/_includes/shared/camera-preview-renders-incorrectly-ios.md
@@ -0,0 +1,100 @@
+## Applicable Products
+
+This article applies to:
+
+- Dynamsoft Barcode Reader (DBR) JavaScript SDK (`dynamsoft-barcode-reader-bundle`) 11.6.3000 and earlier
+- Dynamsoft Capture Vision (DCV) JavaScript SDK (`dynamsoft-capture-vision-bundle`) 3.6.3000 and earlier
+
+## Summary
+
+On iOS 27, switching cameras or changing resolution can make the live camera preview render incorrectly. The exact behavior depends on the SDK version:
+
+| Version | Behavior |
+|---|---|
+| DBR 11.4 – 11.6.3000 (DCV 3.4 – 3.6.3000) | The preview renders distorted — squeezed or stretched instead of filling its container. Intermittent: the same switch can render correctly on one attempt and distorted on the next. |
+| DBR 11.2 and earlier (DCV 3.2 and earlier) | The preview isn't distorted, but it no longer fits its container — shown at the wrong zoom or size and not extending to the borders. |
+
+It's reproducible on Safari, Chrome, Edge, and Firefox — all iOS browsers share WebKit's camera implementation, so we suspect the issue originates there rather than in any Dynamsoft SDK. It does not occur on iOS 26.
+
+> [!NOTE]
+> Reported to Apple, but not confirmed as an Apple bug and still open as of iOS 27 RC. Details here may change if Apple ships a fix.
+
+
+
+
+ Expected
+
+
+
+ Distorted after switching cameras
+
+
+
+## Resolution
+
+### Recommended: upgrade
+
+Upgrade to `dynamsoft-barcode-reader-bundle` **11.6.3200+** or `dynamsoft-capture-vision-bundle` **3.6.3200+**, which include a built-in workaround.
+
+### If you can't upgrade yet
+
+Both workarounds below are temporary and version-specific — neither replaces upgrading.
+
+**DBR 11.4 – 11.6.3000 (DCV 3.4 – 3.6.3000)**
+
+The distortion requires `object-fit: fill` on the video element plus an ancestor using `display: flex` with `flex: 0 0 auto`, so overriding `object-fit` with `cover` on the `` element that [Dynamsoft Camera Enhancer](https://www.dynamsoft.com/camera-enhancer/docs/web/) renders avoids it:
+
+```css
+.dm-camera-core-container video {
+ object-fit: cover !important;
+}
+```
+
+`!important` is needed because the SDK sets `object-fit` inline. The JavaScript equivalent, via [`cameraView.getVideoElement()`](https://www.dynamsoft.com/camera-enhancer/docs/web/programming/javascript/api-reference/cameraview.html?product=dbr&lang=javascript#getvideoelement):
+
+```javascript
+let videoElement = cameraView.getVideoElement();
+videoElement?.style.setProperty('object-fit', 'cover', 'important');
+```
+
+> [!WARNING]
+> `cover` crops rather than stretches to preserve the aspect ratio — confirm that trade-off works for your UI.
+
+**DBR 11.2 and earlier (DCV 3.2 and earlier)**
+
+Reset the video element's dimensions whenever the camera or resolution changes, registering the handlers before `cameraEnhancer.open()`:
+
+```javascript
+const resetVideoWH = () => {
+ const videoEl = cameraEnhancer.getVideoEl();
+ videoEl.style.width = "";
+ videoEl.style.height = "";
+
+ requestAnimationFrame(() => {
+ requestAnimationFrame(() => {
+ videoEl.style.width = "100%";
+ videoEl.style.height = "100%";
+ });
+ });
+};
+cameraEnhancer.on("cameraChange", resetVideoWH);
+cameraEnhancer.on("resolutionChange", resetVideoWH);
+
+cameraView.createDrawingLayer(2); // layer ID depends on the product — see below
+
+// Normal startup routine, shown here only to indicate placement
+await cameraEnhancer.open();
+await cvRouter.startCapturing();
+```
+
+The `createDrawingLayer` call is part of the workaround. Pass the layer ID for your product:
+
+| Product | Layer ID |
+|---|---|
+| Dynamsoft Barcode Reader (DBR) | 2 |
+| Mobile Document Scanner (MDS — DDN layer) | 1 |
+| MRZ Scanner (DLR layer) | 3 |
+
+## Need more help?
+
+[Contact the Dynamsoft Support team](https://www.dynamsoft.com/contact/).
diff --git a/barcode-reader/web/camera/camera-preview-renders-incorrectly-ios.md b/barcode-reader/web/camera/camera-preview-renders-incorrectly-ios.md
index 4779519..07a3773 100644
--- a/barcode-reader/web/camera/camera-preview-renders-incorrectly-ios.md
+++ b/barcode-reader/web/camera/camera-preview-renders-incorrectly-ios.md
@@ -8,103 +8,4 @@ needAutoGenerateSidebar: false
# Why does the camera preview render incorrectly on iOS 27?
-## Applicable Products
-
-This article applies to:
-
-- Dynamsoft Barcode Reader (DBR) JavaScript SDK (`dynamsoft-barcode-reader-bundle`) 11.6.3000 and earlier
-- Dynamsoft Capture Vision (DCV) JavaScript SDK (`dynamsoft-capture-vision-bundle`) 3.6.3000 and earlier
-
-## Summary
-
-On iOS 27, switching cameras or changing resolution can make the live camera preview render incorrectly. The exact behavior depends on the SDK version:
-
-| Version | Behavior |
-|---|---|
-| DBR 11.4 – 11.6.3000 (DCV 3.4 – 3.6.3000) | The preview renders distorted — squeezed or stretched instead of filling its container. Intermittent: the same switch can render correctly on one attempt and distorted on the next. |
-| DBR 11.2 and earlier (DCV 3.2 and earlier) | The preview isn't distorted, but it no longer fits its container — shown at the wrong zoom or size and not extending to the borders. |
-
-It's reproducible on Safari, Chrome, Edge, and Firefox — all iOS browsers share WebKit's camera implementation, so we suspect the issue originates there rather than in any Dynamsoft SDK. It does not occur on iOS 26.
-
-> [!NOTE]
-> Reported to Apple, but not confirmed as an Apple bug and still open as of iOS 27 RC. Details here may change if Apple ships a fix.
-
-
-
-
- Expected
-
-
-
- Distorted after switching cameras
-
-
-
-## Resolution
-
-### Recommended: upgrade
-
-Upgrade to `dynamsoft-barcode-reader-bundle` **11.6.3200+** or `dynamsoft-capture-vision-bundle` **3.6.3200+**, which include a built-in workaround.
-
-### If you can't upgrade yet
-
-Both workarounds below are temporary and version-specific — neither replaces upgrading.
-
-**DBR 11.4 – 11.6.3000 (DCV 3.4 – 3.6.3000)**
-
-The distortion requires `object-fit: fill` on the video element plus an ancestor using `display: flex` with `flex: 0 0 auto`, so overriding `object-fit` with `cover` on the `` element that [Dynamsoft Camera Enhancer](https://www.dynamsoft.com/camera-enhancer/docs/web/) renders avoids it:
-
-```css
-.dm-camera-core-container video {
- object-fit: cover !important;
-}
-```
-
-`!important` is needed because the SDK sets `object-fit` inline. The JavaScript equivalent, via [`cameraView.getVideoElement()`](https://www.dynamsoft.com/camera-enhancer/docs/web/programming/javascript/api-reference/cameraview.html?product=dbr&lang=javascript#getvideoelement):
-
-```javascript
-let videoElement = cameraView.getVideoElement();
-videoElement?.style.setProperty('object-fit', 'cover', 'important');
-```
-
-> [!WARNING]
-> `cover` crops rather than stretches to preserve the aspect ratio — confirm that trade-off works for your UI.
-
-**DBR 11.2 and earlier (DCV 3.2 and earlier)**
-
-Reset the video element's dimensions whenever the camera or resolution changes, registering the handlers before `cameraEnhancer.open()`:
-
-```javascript
-const resetVideoWH = () => {
- const videoEl = cameraEnhancer.getVideoEl();
- videoEl.style.width = "";
- videoEl.style.height = "";
-
- requestAnimationFrame(() => {
- requestAnimationFrame(() => {
- videoEl.style.width = "100%";
- videoEl.style.height = "100%";
- });
- });
-};
-cameraEnhancer.on("cameraChange", resetVideoWH);
-cameraEnhancer.on("resolutionChange", resetVideoWH);
-
-cameraView.createDrawingLayer(2); // layer ID depends on the product — see below
-
-// Normal startup routine, shown here only to indicate placement
-await cameraEnhancer.open();
-await cvRouter.startCapturing();
-```
-
-The `createDrawingLayer` call is part of the workaround. Pass the layer ID for your product:
-
-| Product | Layer ID |
-|---|---|
-| Dynamsoft Barcode Reader (DBR) | 2 |
-| Mobile Document Scanner (MDS — DDN layer) | 1 |
-| MRZ Scanner (DLR layer) | 3 |
-
-## Need more help?
-
-[Contact the Dynamsoft Support team](https://www.dynamsoft.com/contact/).
+{% include shared/camera-preview-renders-incorrectly-ios.md %}
diff --git a/mrz-scanner/general/camera-preview-renders-incorrectly-ios.md b/mrz-scanner/general/camera-preview-renders-incorrectly-ios.md
index 4904f82..9f52bed 100644
--- a/mrz-scanner/general/camera-preview-renders-incorrectly-ios.md
+++ b/mrz-scanner/general/camera-preview-renders-incorrectly-ios.md
@@ -1 +1,11 @@
-../../barcode-reader/web/camera/camera-preview-renders-incorrectly-ios.md
\ No newline at end of file
+---
+layout: default-layout
+title: Why Does the MRZ Scanner's Camera Preview Render Incorrectly on iOS 27?
+keywords: iOS 27, camera, preview, distorted, video, switching camera, changing resolution, Safari, Chrome, Edge, Firefox, WebKit, Dynamsoft Camera Enhancer, Dynamsoft Barcode Reader, Dynamsoft MRZ Scanner
+description: On iOS 27, switching cameras or resolution can distort or misfit the MRZ Scanner's live camera preview — a WebKit-wide issue, not specific to Dynamsoft. See the fix in 11.6.3200+/3.6.3200+ and workarounds for older versions.
+needAutoGenerateSidebar: false
+---
+
+# Why does the camera preview render incorrectly on iOS 27?
+
+{% include shared/camera-preview-renders-incorrectly-ios.md %}
From 913add61d31aeaf1630872270ae75bb5d524efc9 Mon Sep 17 00:00:00 2001
From: Doby2333
Date: Wed, 30 Sep 2026 15:41:46 +0800
Subject: [PATCH 7/9] Revert "Restore MRZ camera preview metadata in shared
FAQ"
This reverts commit f5e412a3d3b79241652d6456d0fe75c23ad642a6.
---
AGENTS.md | 2 -
README.md | 2 +-
.../camera-preview-renders-incorrectly-ios.md | 100 -----------------
.../camera-preview-renders-incorrectly-ios.md | 101 +++++++++++++++++-
.../camera-preview-renders-incorrectly-ios.md | 12 +--
5 files changed, 102 insertions(+), 115 deletions(-)
delete mode 100644 _includes/shared/camera-preview-renders-incorrectly-ios.md
diff --git a/AGENTS.md b/AGENTS.md
index c7a673c..591c020 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -37,8 +37,6 @@ Rules:
- `mrz-scanner/general/` — MRZ Scanner FAQs
- `license/` — licensing FAQs shared across products
-For an answer published in more than one product section, keep each page’s own frontmatter and question H1, and put the common answer body in `_includes/shared/`. The iOS 27 camera-preview FAQ follows this pattern for Barcode Reader and MRZ Scanner; edit the shared include for answer changes.
-
## Archived content (`*/archive/*`)
Directories named `archive` under `barcode-reader/{mobile,server,web}/` hold historical, version-pinned content (e.g. `-v9.6.40`, `-v10.4.2000` snapshots). They are:
diff --git a/README.md b/README.md
index 7da79d1..d37240b 100644
--- a/README.md
+++ b/README.md
@@ -22,7 +22,7 @@ Or on Windows:
./scripts/dev.ps1
```
-The scripts clone the shared template's preview branch into `.dev/`, merge it with this FAQ source, install gems, and serve Jekyll at `http://localhost:5555/faq/`. The generated `.dev/` workspace is ignored by Git and omits archived FAQ content and local worktrees. Use `--no-serve` / `-NoServe` to prepare without serving, then rerun without that flag to serve; `--no-template-update` / `-NoTemplateUpdate` reuses the cloned template. Changes to FAQ files require rerunning the script to refresh the merged workspace. The Barcode Reader and MRZ Scanner iOS 27 camera-preview pages share their answer body in `_includes/shared/` while keeping separate page metadata.
+The scripts clone the shared template's preview branch into `.dev/`, merge it with this FAQ source, install gems, and serve Jekyll at `http://localhost:5555/faq/`. The generated `.dev/` workspace is ignored by Git and omits archived FAQ content and local worktrees. Use `--no-serve` / `-NoServe` to prepare without serving, then rerun without that flag to serve; `--no-template-update` / `-NoTemplateUpdate` reuses the cloned template. Changes to FAQ files require rerunning the script to refresh the merged workspace.
## Checking links
diff --git a/_includes/shared/camera-preview-renders-incorrectly-ios.md b/_includes/shared/camera-preview-renders-incorrectly-ios.md
deleted file mode 100644
index cd78030..0000000
--- a/_includes/shared/camera-preview-renders-incorrectly-ios.md
+++ /dev/null
@@ -1,100 +0,0 @@
-## Applicable Products
-
-This article applies to:
-
-- Dynamsoft Barcode Reader (DBR) JavaScript SDK (`dynamsoft-barcode-reader-bundle`) 11.6.3000 and earlier
-- Dynamsoft Capture Vision (DCV) JavaScript SDK (`dynamsoft-capture-vision-bundle`) 3.6.3000 and earlier
-
-## Summary
-
-On iOS 27, switching cameras or changing resolution can make the live camera preview render incorrectly. The exact behavior depends on the SDK version:
-
-| Version | Behavior |
-|---|---|
-| DBR 11.4 – 11.6.3000 (DCV 3.4 – 3.6.3000) | The preview renders distorted — squeezed or stretched instead of filling its container. Intermittent: the same switch can render correctly on one attempt and distorted on the next. |
-| DBR 11.2 and earlier (DCV 3.2 and earlier) | The preview isn't distorted, but it no longer fits its container — shown at the wrong zoom or size and not extending to the borders. |
-
-It's reproducible on Safari, Chrome, Edge, and Firefox — all iOS browsers share WebKit's camera implementation, so we suspect the issue originates there rather than in any Dynamsoft SDK. It does not occur on iOS 26.
-
-> [!NOTE]
-> Reported to Apple, but not confirmed as an Apple bug and still open as of iOS 27 RC. Details here may change if Apple ships a fix.
-
-
-
-
- Expected
-
-
-
- Distorted after switching cameras
-
-
-
-## Resolution
-
-### Recommended: upgrade
-
-Upgrade to `dynamsoft-barcode-reader-bundle` **11.6.3200+** or `dynamsoft-capture-vision-bundle` **3.6.3200+**, which include a built-in workaround.
-
-### If you can't upgrade yet
-
-Both workarounds below are temporary and version-specific — neither replaces upgrading.
-
-**DBR 11.4 – 11.6.3000 (DCV 3.4 – 3.6.3000)**
-
-The distortion requires `object-fit: fill` on the video element plus an ancestor using `display: flex` with `flex: 0 0 auto`, so overriding `object-fit` with `cover` on the `` element that [Dynamsoft Camera Enhancer](https://www.dynamsoft.com/camera-enhancer/docs/web/) renders avoids it:
-
-```css
-.dm-camera-core-container video {
- object-fit: cover !important;
-}
-```
-
-`!important` is needed because the SDK sets `object-fit` inline. The JavaScript equivalent, via [`cameraView.getVideoElement()`](https://www.dynamsoft.com/camera-enhancer/docs/web/programming/javascript/api-reference/cameraview.html?product=dbr&lang=javascript#getvideoelement):
-
-```javascript
-let videoElement = cameraView.getVideoElement();
-videoElement?.style.setProperty('object-fit', 'cover', 'important');
-```
-
-> [!WARNING]
-> `cover` crops rather than stretches to preserve the aspect ratio — confirm that trade-off works for your UI.
-
-**DBR 11.2 and earlier (DCV 3.2 and earlier)**
-
-Reset the video element's dimensions whenever the camera or resolution changes, registering the handlers before `cameraEnhancer.open()`:
-
-```javascript
-const resetVideoWH = () => {
- const videoEl = cameraEnhancer.getVideoEl();
- videoEl.style.width = "";
- videoEl.style.height = "";
-
- requestAnimationFrame(() => {
- requestAnimationFrame(() => {
- videoEl.style.width = "100%";
- videoEl.style.height = "100%";
- });
- });
-};
-cameraEnhancer.on("cameraChange", resetVideoWH);
-cameraEnhancer.on("resolutionChange", resetVideoWH);
-
-cameraView.createDrawingLayer(2); // layer ID depends on the product — see below
-
-// Normal startup routine, shown here only to indicate placement
-await cameraEnhancer.open();
-await cvRouter.startCapturing();
-```
-
-The `createDrawingLayer` call is part of the workaround. Pass the layer ID for your product:
-
-| Product | Layer ID |
-|---|---|
-| Dynamsoft Barcode Reader (DBR) | 2 |
-| Mobile Document Scanner (MDS — DDN layer) | 1 |
-| MRZ Scanner (DLR layer) | 3 |
-
-## Need more help?
-
-[Contact the Dynamsoft Support team](https://www.dynamsoft.com/contact/).
diff --git a/barcode-reader/web/camera/camera-preview-renders-incorrectly-ios.md b/barcode-reader/web/camera/camera-preview-renders-incorrectly-ios.md
index 07a3773..4779519 100644
--- a/barcode-reader/web/camera/camera-preview-renders-incorrectly-ios.md
+++ b/barcode-reader/web/camera/camera-preview-renders-incorrectly-ios.md
@@ -8,4 +8,103 @@ needAutoGenerateSidebar: false
# Why does the camera preview render incorrectly on iOS 27?
-{% include shared/camera-preview-renders-incorrectly-ios.md %}
+## Applicable Products
+
+This article applies to:
+
+- Dynamsoft Barcode Reader (DBR) JavaScript SDK (`dynamsoft-barcode-reader-bundle`) 11.6.3000 and earlier
+- Dynamsoft Capture Vision (DCV) JavaScript SDK (`dynamsoft-capture-vision-bundle`) 3.6.3000 and earlier
+
+## Summary
+
+On iOS 27, switching cameras or changing resolution can make the live camera preview render incorrectly. The exact behavior depends on the SDK version:
+
+| Version | Behavior |
+|---|---|
+| DBR 11.4 – 11.6.3000 (DCV 3.4 – 3.6.3000) | The preview renders distorted — squeezed or stretched instead of filling its container. Intermittent: the same switch can render correctly on one attempt and distorted on the next. |
+| DBR 11.2 and earlier (DCV 3.2 and earlier) | The preview isn't distorted, but it no longer fits its container — shown at the wrong zoom or size and not extending to the borders. |
+
+It's reproducible on Safari, Chrome, Edge, and Firefox — all iOS browsers share WebKit's camera implementation, so we suspect the issue originates there rather than in any Dynamsoft SDK. It does not occur on iOS 26.
+
+> [!NOTE]
+> Reported to Apple, but not confirmed as an Apple bug and still open as of iOS 27 RC. Details here may change if Apple ships a fix.
+
+
+
+
+ Expected
+
+
+
+ Distorted after switching cameras
+
+
+
+## Resolution
+
+### Recommended: upgrade
+
+Upgrade to `dynamsoft-barcode-reader-bundle` **11.6.3200+** or `dynamsoft-capture-vision-bundle` **3.6.3200+**, which include a built-in workaround.
+
+### If you can't upgrade yet
+
+Both workarounds below are temporary and version-specific — neither replaces upgrading.
+
+**DBR 11.4 – 11.6.3000 (DCV 3.4 – 3.6.3000)**
+
+The distortion requires `object-fit: fill` on the video element plus an ancestor using `display: flex` with `flex: 0 0 auto`, so overriding `object-fit` with `cover` on the `` element that [Dynamsoft Camera Enhancer](https://www.dynamsoft.com/camera-enhancer/docs/web/) renders avoids it:
+
+```css
+.dm-camera-core-container video {
+ object-fit: cover !important;
+}
+```
+
+`!important` is needed because the SDK sets `object-fit` inline. The JavaScript equivalent, via [`cameraView.getVideoElement()`](https://www.dynamsoft.com/camera-enhancer/docs/web/programming/javascript/api-reference/cameraview.html?product=dbr&lang=javascript#getvideoelement):
+
+```javascript
+let videoElement = cameraView.getVideoElement();
+videoElement?.style.setProperty('object-fit', 'cover', 'important');
+```
+
+> [!WARNING]
+> `cover` crops rather than stretches to preserve the aspect ratio — confirm that trade-off works for your UI.
+
+**DBR 11.2 and earlier (DCV 3.2 and earlier)**
+
+Reset the video element's dimensions whenever the camera or resolution changes, registering the handlers before `cameraEnhancer.open()`:
+
+```javascript
+const resetVideoWH = () => {
+ const videoEl = cameraEnhancer.getVideoEl();
+ videoEl.style.width = "";
+ videoEl.style.height = "";
+
+ requestAnimationFrame(() => {
+ requestAnimationFrame(() => {
+ videoEl.style.width = "100%";
+ videoEl.style.height = "100%";
+ });
+ });
+};
+cameraEnhancer.on("cameraChange", resetVideoWH);
+cameraEnhancer.on("resolutionChange", resetVideoWH);
+
+cameraView.createDrawingLayer(2); // layer ID depends on the product — see below
+
+// Normal startup routine, shown here only to indicate placement
+await cameraEnhancer.open();
+await cvRouter.startCapturing();
+```
+
+The `createDrawingLayer` call is part of the workaround. Pass the layer ID for your product:
+
+| Product | Layer ID |
+|---|---|
+| Dynamsoft Barcode Reader (DBR) | 2 |
+| Mobile Document Scanner (MDS — DDN layer) | 1 |
+| MRZ Scanner (DLR layer) | 3 |
+
+## Need more help?
+
+[Contact the Dynamsoft Support team](https://www.dynamsoft.com/contact/).
diff --git a/mrz-scanner/general/camera-preview-renders-incorrectly-ios.md b/mrz-scanner/general/camera-preview-renders-incorrectly-ios.md
index 9f52bed..4904f82 100644
--- a/mrz-scanner/general/camera-preview-renders-incorrectly-ios.md
+++ b/mrz-scanner/general/camera-preview-renders-incorrectly-ios.md
@@ -1,11 +1 @@
----
-layout: default-layout
-title: Why Does the MRZ Scanner's Camera Preview Render Incorrectly on iOS 27?
-keywords: iOS 27, camera, preview, distorted, video, switching camera, changing resolution, Safari, Chrome, Edge, Firefox, WebKit, Dynamsoft Camera Enhancer, Dynamsoft Barcode Reader, Dynamsoft MRZ Scanner
-description: On iOS 27, switching cameras or resolution can distort or misfit the MRZ Scanner's live camera preview — a WebKit-wide issue, not specific to Dynamsoft. See the fix in 11.6.3200+/3.6.3200+ and workarounds for older versions.
-needAutoGenerateSidebar: false
----
-
-# Why does the camera preview render incorrectly on iOS 27?
-
-{% include shared/camera-preview-renders-incorrectly-ios.md %}
+../../barcode-reader/web/camera/camera-preview-renders-incorrectly-ios.md
\ No newline at end of file
From d83884854061bdb462e1b5623070b2010e3ff1f0 Mon Sep 17 00:00:00 2001
From: Louie-Dynamsoft
Date: Wed, 30 Sep 2026 00:57:08 -0700
Subject: [PATCH 8/9] Share FAQ answers with product-specific pages and assets
(#69)
* Replace shared FAQ symlinks with Jekyll includes
* Keep shared license screenshots at one existing URL
* Publish shared license pages only under products
* Preserve MRZ camera FAQ metadata after shared cutover
---
AGENTS.md | 10 +-
README.md | 3 +
_config.yml | 9 --
.../camera-preview-renders-incorrectly-ios.md | 100 +++++++++++++++++
.../shared/license}/dbr-free-trial.md | 10 --
.../enable-supported-barcode-format.md | 10 --
.../shared/license}/ensure-no-overuse.md | 10 --
.../expand-quota-for-runtime-license.md | 10 --
.../how-hardware-is-bind-to-license.md | 10 --
.../license/how-license-tracking-works.md | 1 +
.../shared/license}/index.md | 11 --
...w-license-required-per-device-licensing.md | 10 --
.../license}/offline-registration-license.md | 22 ++--
.../license}/sdk-works-without-internet.md | 10 --
.../shared/license}/track-license.md | 10 --
...ting-unauthorized-device-clone-detected.md | 10 --
.../assets => assets/license}/activate.jpg | Bin
.../assets => assets/license}/cp-license.jpg | Bin
.../license}/offline-activate.jpg | Bin
.../assets => assets/license}/submit-uuid.jpg | Bin
.../assets => assets/license}/uuid-tool.jpg | Bin
.../server/assets => assets/license}/uuid.jpg | Bin
barcode-reader/license | 1 -
barcode-reader/license/dbr-free-trial.md | 11 ++
.../enable-supported-barcode-format.md | 11 ++
barcode-reader/license/ensure-no-overuse.md | 11 ++
.../expand-quota-for-runtime-license.md | 11 ++
.../how-hardware-is-bind-to-license.md | 11 ++
.../license}/how-license-tracking-works.md | 2 +-
barcode-reader/license/index.md | 12 +++
...w-license-required-per-device-licensing.md | 11 ++
.../license/offline-registration-license.md | 11 ++
.../license/sdk-works-without-internet.md | 11 ++
barcode-reader/license/track-license.md | 11 ++
...ting-unauthorized-device-clone-detected.md | 11 ++
.../camera-preview-renders-incorrectly-ios.md | 101 +-----------------
license/assets/activate.jpg | Bin 11061 -> 0 bytes
license/assets/cp-license.jpg | Bin 23842 -> 0 bytes
license/assets/offline-activate.jpg | Bin 18162 -> 0 bytes
license/assets/submit-uuid.jpg | Bin 23137 -> 0 bytes
license/assets/uuid-tool.jpg | Bin 18281 -> 0 bytes
license/assets/uuid.jpg | Bin 36204 -> 0 bytes
.../camera-preview-renders-incorrectly-ios.md | 12 ++-
mrz-scanner/license | 1 -
mrz-scanner/license/dbr-free-trial.md | 11 ++
.../enable-supported-barcode-format.md | 11 ++
mrz-scanner/license/ensure-no-overuse.md | 11 ++
.../expand-quota-for-runtime-license.md | 11 ++
.../how-hardware-is-bind-to-license.md | 11 ++
.../license/how-license-tracking-works.md | 11 ++
mrz-scanner/license/index.md | 12 +++
...w-license-required-per-device-licensing.md | 11 ++
.../license/offline-registration-license.md | 11 ++
.../license/sdk-works-without-internet.md | 11 ++
mrz-scanner/license/track-license.md | 11 ++
...ting-unauthorized-device-clone-detected.md | 11 ++
56 files changed, 386 insertions(+), 232 deletions(-)
create mode 100644 _includes/shared/camera-preview-renders-incorrectly-ios.md
rename {license => _includes/shared/license}/dbr-free-trial.md (65%)
rename {license => _includes/shared/license}/enable-supported-barcode-format.md (92%)
rename {license => _includes/shared/license}/ensure-no-overuse.md (94%)
rename {license => _includes/shared/license}/expand-quota-for-runtime-license.md (76%)
rename {license => _includes/shared/license}/how-hardware-is-bind-to-license.md (59%)
create mode 100644 _includes/shared/license/how-license-tracking-works.md
rename {license => _includes/shared/license}/index.md (69%)
rename {license => _includes/shared/license}/new-license-required-per-device-licensing.md (58%)
rename {license => _includes/shared/license}/offline-registration-license.md (86%)
rename {license => _includes/shared/license}/sdk-works-without-internet.md (78%)
rename {license => _includes/shared/license}/track-license.md (67%)
rename {license => _includes/shared/license}/troubleshooting-unauthorized-device-clone-detected.md (81%)
rename {barcode-reader/server/assets => assets/license}/activate.jpg (100%)
rename {barcode-reader/server/assets => assets/license}/cp-license.jpg (100%)
rename {barcode-reader/server/assets => assets/license}/offline-activate.jpg (100%)
rename {barcode-reader/server/assets => assets/license}/submit-uuid.jpg (100%)
rename {barcode-reader/server/assets => assets/license}/uuid-tool.jpg (100%)
rename {barcode-reader/server/assets => assets/license}/uuid.jpg (100%)
delete mode 120000 barcode-reader/license
create mode 100644 barcode-reader/license/dbr-free-trial.md
create mode 100644 barcode-reader/license/enable-supported-barcode-format.md
create mode 100644 barcode-reader/license/ensure-no-overuse.md
create mode 100644 barcode-reader/license/expand-quota-for-runtime-license.md
create mode 100644 barcode-reader/license/how-hardware-is-bind-to-license.md
rename {license => barcode-reader/license}/how-license-tracking-works.md (58%)
create mode 100644 barcode-reader/license/index.md
create mode 100644 barcode-reader/license/new-license-required-per-device-licensing.md
create mode 100644 barcode-reader/license/offline-registration-license.md
create mode 100644 barcode-reader/license/sdk-works-without-internet.md
create mode 100644 barcode-reader/license/track-license.md
create mode 100644 barcode-reader/license/troubleshooting-unauthorized-device-clone-detected.md
delete mode 100644 license/assets/activate.jpg
delete mode 100644 license/assets/cp-license.jpg
delete mode 100644 license/assets/offline-activate.jpg
delete mode 100644 license/assets/submit-uuid.jpg
delete mode 100644 license/assets/uuid-tool.jpg
delete mode 100644 license/assets/uuid.jpg
delete mode 120000 mrz-scanner/license
create mode 100644 mrz-scanner/license/dbr-free-trial.md
create mode 100644 mrz-scanner/license/enable-supported-barcode-format.md
create mode 100644 mrz-scanner/license/ensure-no-overuse.md
create mode 100644 mrz-scanner/license/expand-quota-for-runtime-license.md
create mode 100644 mrz-scanner/license/how-hardware-is-bind-to-license.md
create mode 100644 mrz-scanner/license/how-license-tracking-works.md
create mode 100644 mrz-scanner/license/index.md
create mode 100644 mrz-scanner/license/new-license-required-per-device-licensing.md
create mode 100644 mrz-scanner/license/offline-registration-license.md
create mode 100644 mrz-scanner/license/sdk-works-without-internet.md
create mode 100644 mrz-scanner/license/track-license.md
create mode 100644 mrz-scanner/license/troubleshooting-unauthorized-device-clone-detected.md
diff --git a/AGENTS.md b/AGENTS.md
index 591c020..27f9b37 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -26,7 +26,7 @@ Rules:
- **Link it from `index.md`.** Every subdirectory (`barcode-reader/general/`, `barcode-reader/web/configuration/`, `mrz-scanner/general/`, etc.) has an `index.md` that lists every article in that section. A new article with no entry there is orphaned — it exists but no one can navigate to it. Add a bullet there when you add the file, and remove the bullet if you remove the file.
- **Internal links use `.html`, not `.md`.** Link to sibling/other articles as `some-page.html` (Jekyll serves the built output), and to a parent-directory archive as `../archive/some-page.html`, etc. A link ending in `.md` will not resolve on the live site.
- **Don't add "back to index" links inside articles.** They were deliberately removed repo-wide; the sidebar/index already provides navigation.
-- **Images** go through a site variable per product/edition — `{{site.dbr_web_assets}}`, `{{site.dbr_mobile_assets}}`, `{{site.dbr_server_assets}}` (defined in `_config.yml`), pointing at that edition's `assets/` directory. Before referencing an image, confirm the file actually exists at that path — a stale or placeholder filename (e.g. a literal `undefined.png`) will silently 404.
+- **Images** go through a site variable — `{{site.assets}}` for shared assets or `{{site.dbr_web_assets}}`, `{{site.dbr_mobile_assets}}`, `{{site.dbr_server_assets}}` for edition assets (defined in `_config.yml`). Before referencing an image, confirm the file actually exists at that path — a stale or placeholder filename (e.g. a literal `undefined.png`) will silently 404.
- **Write the answer as a direct statement, not a raw Q&A fragment.** Don't leave phrasing like "Yes — ..." or "This can be expanded ..." floating with no visible question or antecedent above it — the H1 is the question; the body should read as its answer, not as a leftover snippet.
- **Don't duplicate a section under a second heading.** If a "what's new"/changelog-style heading and a "how to" heading right below it cover the same ground, merge them.
@@ -35,7 +35,13 @@ Rules:
- `barcode-reader/general/` — cross-edition Barcode Reader FAQs
- `barcode-reader/mobile/`, `barcode-reader/server/`, `barcode-reader/web/` — edition-specific Barcode Reader FAQs, each split into topic subdirectories (`configuration/`, `capabilities/`, `debug/`, `scan-setting/`, etc.)
- `mrz-scanner/general/` — MRZ Scanner FAQs
-- `license/` — licensing FAQs shared across products
+- `barcode-reader/license/`, `mrz-scanner/license/` — published licensing FAQs for each product; shared answer bodies live in `_includes/shared/license/`
+
+## Shared FAQ answers
+
+Published FAQs are regular Markdown pages under each product path. For an answer reused across products, keep the frontmatter and question H1 in each page and put only the answer body in `_includes/shared/`; include it with `{% include shared/.md %}`. Edit the include for shared answer changes, and keep each product section’s `index.md` linked to its own page. Do not use filesystem symlinks. The two product license sections share `_includes/shared/license/` for their answers; there is no bare `license/` section.
+
+The shared offline-registration answer references six screenshots through `{{site.assets}}license/`. Their only source files are in `assets/license/`; do not add copies in either product license directory.
## Archived content (`*/archive/*`)
diff --git a/README.md b/README.md
index d37240b..1fea87d 100644
--- a/README.md
+++ b/README.md
@@ -24,6 +24,9 @@ Or on Windows:
The scripts clone the shared template's preview branch into `.dev/`, merge it with this FAQ source, install gems, and serve Jekyll at `http://localhost:5555/faq/`. The generated `.dev/` workspace is ignored by Git and omits archived FAQ content and local worktrees. Use `--no-serve` / `-NoServe` to prepare without serving, then rerun without that flag to serve; `--no-template-update` / `-NoTemplateUpdate` reuses the cloned template. Changes to FAQ files require rerunning the script to refresh the merged workspace.
+Shared answers live in `_includes/shared/`. Product FAQ pages retain their own frontmatter and question H1, then include the answer body. The license FAQs are regular pages under `barcode-reader/license/` and `mrz-scanner/license/`; they share `_includes/shared/license/` and preserve their product URLs. Edit shared answer text in the include, not in each page.
+The license screenshots are stored once in `assets/license/` and referenced through `site.assets` from the shared answer. Do not copy them into the product license directories.
+
## Checking links
`check_links.py` crawls the repo's Markdown files and reports broken links. Run it before submitting a change that touches links:
diff --git a/_config.yml b/_config.yml
index da7d582..8f4aa09 100644
--- a/_config.yml
+++ b/_config.yml
@@ -55,15 +55,6 @@ defaults:
path: "Hide_Tree_Page.html"
values:
sitemap: false
- - scope:
- # license/ is shared content, duplicated at build time under
- # /faq/barcode-reader/license/ and /faq/mrz-scanner/license/. Those
- # product-scoped URLs are the ones linked from the site and correctly
- # highlighted in the sidebar; this bare path has no product context
- # for the sidebar to highlight, so keep it out of the sitemap.
- path: "license"
- values:
- sitemap: false
- scope:
path: "barcode-reader/mobile/capabilities"
values:
diff --git a/_includes/shared/camera-preview-renders-incorrectly-ios.md b/_includes/shared/camera-preview-renders-incorrectly-ios.md
new file mode 100644
index 0000000..cd78030
--- /dev/null
+++ b/_includes/shared/camera-preview-renders-incorrectly-ios.md
@@ -0,0 +1,100 @@
+## Applicable Products
+
+This article applies to:
+
+- Dynamsoft Barcode Reader (DBR) JavaScript SDK (`dynamsoft-barcode-reader-bundle`) 11.6.3000 and earlier
+- Dynamsoft Capture Vision (DCV) JavaScript SDK (`dynamsoft-capture-vision-bundle`) 3.6.3000 and earlier
+
+## Summary
+
+On iOS 27, switching cameras or changing resolution can make the live camera preview render incorrectly. The exact behavior depends on the SDK version:
+
+| Version | Behavior |
+|---|---|
+| DBR 11.4 – 11.6.3000 (DCV 3.4 – 3.6.3000) | The preview renders distorted — squeezed or stretched instead of filling its container. Intermittent: the same switch can render correctly on one attempt and distorted on the next. |
+| DBR 11.2 and earlier (DCV 3.2 and earlier) | The preview isn't distorted, but it no longer fits its container — shown at the wrong zoom or size and not extending to the borders. |
+
+It's reproducible on Safari, Chrome, Edge, and Firefox — all iOS browsers share WebKit's camera implementation, so we suspect the issue originates there rather than in any Dynamsoft SDK. It does not occur on iOS 26.
+
+> [!NOTE]
+> Reported to Apple, but not confirmed as an Apple bug and still open as of iOS 27 RC. Details here may change if Apple ships a fix.
+
+
+
+
+ Expected
+
+
+
+ Distorted after switching cameras
+
+
+
+## Resolution
+
+### Recommended: upgrade
+
+Upgrade to `dynamsoft-barcode-reader-bundle` **11.6.3200+** or `dynamsoft-capture-vision-bundle` **3.6.3200+**, which include a built-in workaround.
+
+### If you can't upgrade yet
+
+Both workarounds below are temporary and version-specific — neither replaces upgrading.
+
+**DBR 11.4 – 11.6.3000 (DCV 3.4 – 3.6.3000)**
+
+The distortion requires `object-fit: fill` on the video element plus an ancestor using `display: flex` with `flex: 0 0 auto`, so overriding `object-fit` with `cover` on the `` element that [Dynamsoft Camera Enhancer](https://www.dynamsoft.com/camera-enhancer/docs/web/) renders avoids it:
+
+```css
+.dm-camera-core-container video {
+ object-fit: cover !important;
+}
+```
+
+`!important` is needed because the SDK sets `object-fit` inline. The JavaScript equivalent, via [`cameraView.getVideoElement()`](https://www.dynamsoft.com/camera-enhancer/docs/web/programming/javascript/api-reference/cameraview.html?product=dbr&lang=javascript#getvideoelement):
+
+```javascript
+let videoElement = cameraView.getVideoElement();
+videoElement?.style.setProperty('object-fit', 'cover', 'important');
+```
+
+> [!WARNING]
+> `cover` crops rather than stretches to preserve the aspect ratio — confirm that trade-off works for your UI.
+
+**DBR 11.2 and earlier (DCV 3.2 and earlier)**
+
+Reset the video element's dimensions whenever the camera or resolution changes, registering the handlers before `cameraEnhancer.open()`:
+
+```javascript
+const resetVideoWH = () => {
+ const videoEl = cameraEnhancer.getVideoEl();
+ videoEl.style.width = "";
+ videoEl.style.height = "";
+
+ requestAnimationFrame(() => {
+ requestAnimationFrame(() => {
+ videoEl.style.width = "100%";
+ videoEl.style.height = "100%";
+ });
+ });
+};
+cameraEnhancer.on("cameraChange", resetVideoWH);
+cameraEnhancer.on("resolutionChange", resetVideoWH);
+
+cameraView.createDrawingLayer(2); // layer ID depends on the product — see below
+
+// Normal startup routine, shown here only to indicate placement
+await cameraEnhancer.open();
+await cvRouter.startCapturing();
+```
+
+The `createDrawingLayer` call is part of the workaround. Pass the layer ID for your product:
+
+| Product | Layer ID |
+|---|---|
+| Dynamsoft Barcode Reader (DBR) | 2 |
+| Mobile Document Scanner (MDS — DDN layer) | 1 |
+| MRZ Scanner (DLR layer) | 3 |
+
+## Need more help?
+
+[Contact the Dynamsoft Support team](https://www.dynamsoft.com/contact/).
diff --git a/license/dbr-free-trial.md b/_includes/shared/license/dbr-free-trial.md
similarity index 65%
rename from license/dbr-free-trial.md
rename to _includes/shared/license/dbr-free-trial.md
index 946de53..dff2202 100644
--- a/license/dbr-free-trial.md
+++ b/_includes/shared/license/dbr-free-trial.md
@@ -1,13 +1,3 @@
----
-layout: default-layout
-title: How to get a free trial?
-keywords: Dynamsoft Barcode Reader, FAQ, DBR Introduction, General, free trial
-description: How to get a free trial?
-needAutoGenerateSidebar: false
----
-
-# How to get a free trial?
-
To get a free trial of the SDK, please download it from [our website](https://www.dynamsoft.com/barcode-reader/downloads/).
The main way to get the trial license is via the [Request a Trial License](https://www.dynamsoft.com/customer/license/trialLicense?product=dbr&utm_source=docs){:target="\_blank"} link through which you can extend your trial license once your original expires. The trial can be extended twice, for 15 days each, and a total of 30 days.
diff --git a/license/enable-supported-barcode-format.md b/_includes/shared/license/enable-supported-barcode-format.md
similarity index 92%
rename from license/enable-supported-barcode-format.md
rename to _includes/shared/license/enable-supported-barcode-format.md
index 2dd273d..a151775 100644
--- a/license/enable-supported-barcode-format.md
+++ b/_includes/shared/license/enable-supported-barcode-format.md
@@ -1,13 +1,3 @@
----
-layout: default-layout
-title: Error [xxx] No license found
-keywords: Dynamsoft Barcode Reader, FAQ, JavaScript, tech basic, barcode format, no license found
-description: When moving from a trial license to a production license, you may encounter the error `[xxx] No license found` if your enabled barcode formats don't match the formats supported by your license?
-needAutoGenerateSidebar: false
----
-
-# Troubleshooting - Error: [xxx] No license found
-
## Problem
When moving from a trial license to a production license, you may encounter the error `[xxx] No license found` if your enabled barcode formats don't match the formats supported by your license. This occurs because the SDK validates enabled formats against your license's capabilities.
diff --git a/license/ensure-no-overuse.md b/_includes/shared/license/ensure-no-overuse.md
similarity index 94%
rename from license/ensure-no-overuse.md
rename to _includes/shared/license/ensure-no-overuse.md
index 82f4075..1c3362e 100644
--- a/license/ensure-no-overuse.md
+++ b/_includes/shared/license/ensure-no-overuse.md
@@ -1,13 +1,3 @@
----
-layout: default-layout
-title: How to properly use concurrent instance license?
-keywords: Dynamsoft Barcode Reader, FAQ, Pricing/Licensing, General, ensure no overuse
-description: How to properly use concurrent instance license?
-needAutoGenerateSidebar: false
----
-
-# How to properly use concurrent instance license?
-
The standard way to use concurrent instance license is:
* Call method `SetMaxConcurrentInstanceCount` to set the license count you purchased.
diff --git a/license/expand-quota-for-runtime-license.md b/_includes/shared/license/expand-quota-for-runtime-license.md
similarity index 76%
rename from license/expand-quota-for-runtime-license.md
rename to _includes/shared/license/expand-quota-for-runtime-license.md
index 47e64d1..ce094b3 100644
--- a/license/expand-quota-for-runtime-license.md
+++ b/_includes/shared/license/expand-quota-for-runtime-license.md
@@ -1,13 +1,3 @@
----
-layout: default-layout
-title: How to expand the quota of a runtime license?
-keywords: Dynamsoft Barcode Reader, FAQ, Pricing/Licensing, General, expand quota
-description: How to expand the quota of a runtime license?
-needAutoGenerateSidebar: false
----
-
-# How to expand the quota of a runtime license?
-
The quota of a runtime license can be expanded before the license expires. This can be done in a couple of ways.
- By accessing the license page in the [customer portal](https://www.dynamsoft.com/customer/license/fullLicense), under the `Manage License` operation, one of the options include `Add Quota`. This leads the user to a checkout page confirming the extra quantity that they want to add (by default they will be adding the same quantity that they originally bought, which can be multiplied by the `Quantity` number. After confirming the customer details and payment info, the order will be processed for the quota expansion.
diff --git a/license/how-hardware-is-bind-to-license.md b/_includes/shared/license/how-hardware-is-bind-to-license.md
similarity index 59%
rename from license/how-hardware-is-bind-to-license.md
rename to _includes/shared/license/how-hardware-is-bind-to-license.md
index 62d18de..2f42f39 100644
--- a/license/how-hardware-is-bind-to-license.md
+++ b/_includes/shared/license/how-hardware-is-bind-to-license.md
@@ -1,12 +1,2 @@
----
-layout: default-layout
-title: How is hardware bound to a license?
-keywords: Dynamsoft Barcode Reader, FAQ, Pricing/Licensing, General, information gathered, hardware bind, new license consumption
-description: How is hardware bound to a license?
-needAutoGenerateSidebar: false
----
-
-# How is hardware bound to a license?
-
- When devices are registered, they get a UUID that is generated based on some hardware and OS info. The exact breakdown of what is collected when using the mobile edition or server/desktop edition is mentioned [here](https://www.dynamsoft.com/license-server/docs/about/terms.html#generate-a-uuid).
- Should the user change the OS (upgrade/downgrade), then the same device will take up a new license since the UUID that is generated for the device after the change will be different.
diff --git a/_includes/shared/license/how-license-tracking-works.md b/_includes/shared/license/how-license-tracking-works.md
new file mode 100644
index 0000000..b3cb096
--- /dev/null
+++ b/_includes/shared/license/how-license-tracking-works.md
@@ -0,0 +1 @@
+Each option is explained in the [About section](https://www.dynamsoft.com/license-server/docs/about/licensetypes.html?ver=latest) of the license tracking documentation. Please read through each option to have a good understanding of what each entails. If you have any more questions, please contact the [Dynamsoft support team](https://www.dynamsoft.com/company/contact/).
diff --git a/license/index.md b/_includes/shared/license/index.md
similarity index 69%
rename from license/index.md
rename to _includes/shared/license/index.md
index 4eafb12..f66bff1 100644
--- a/license/index.md
+++ b/_includes/shared/license/index.md
@@ -1,14 +1,3 @@
----
-layout: default-layout
-title: "Dynamsoft Barcode Reader License FAQ \u2013 Key Questions"
-keywords: faq, license, dbr, dynamsoft, barcode reader, configuration
-description: "Find answers about Dynamsoft Barcode Reader licensing, activation, usage limits, and plans so teams can deploy Dynamsoft capture workflows confidently for modern web."
-needAutoGenerateSidebar: false
-noTitleIndex: true
----
-
-# License FAQ
-
Please use the links below to find answers to common questions and configuration guidance.
- [How to ensure no overuse of license?](ensure-no-overuse.html)
diff --git a/license/new-license-required-per-device-licensing.md b/_includes/shared/license/new-license-required-per-device-licensing.md
similarity index 58%
rename from license/new-license-required-per-device-licensing.md
rename to _includes/shared/license/new-license-required-per-device-licensing.md
index 58e1925..100739a 100644
--- a/license/new-license-required-per-device-licensing.md
+++ b/_includes/shared/license/new-license-required-per-device-licensing.md
@@ -1,13 +1,3 @@
----
-layout: default-layout
-title: When is a new license spot taken when using a per-device licensing model?
-keywords: Dynamsoft Barcode Reader, FAQ, Sales & Licensing, per-device, new license
-description: When is a new license spot taken when using a per-device licensing model?
-needAutoGenerateSidebar: false
----
-
-# When is a new license spot taken when using a per-device licensing model?
-
A new license spot is required in any of these three conditions -
- if you use another browser.
diff --git a/license/offline-registration-license.md b/_includes/shared/license/offline-registration-license.md
similarity index 86%
rename from license/offline-registration-license.md
rename to _includes/shared/license/offline-registration-license.md
index 35f4c37..9f1fb05 100644
--- a/license/offline-registration-license.md
+++ b/_includes/shared/license/offline-registration-license.md
@@ -1,23 +1,13 @@
----
-layout: default-layout
-title: How to use offline registration license type?
-keywords: Dynamsoft Barcode Reader, FAQ, offline, license type
-description: How to use offline registration license type?
-needAutoGenerateSidebar: false
----
-
-# How to use offline registration license type?
-
You can follow the steps below to manually register the device and get the license key for each device:
1. Log in [Customer Portal](https://www.dynamsoft.com/customer/license/fullLicense) -> Click the Activate button to activate the license
- 
+ 
2. Select the 3rd option "No License Server. Register Offline Device(s) Manually" and click Activate.
- 
+ 
3. Click the Add Device button then it will pop up a dialog. Download the tool from the pop up.
- 
+ 
4. Unzip the file and run the GenerateUUID tool on the device to be registered and get the UUID.
@@ -26,7 +16,7 @@ For Windows:
-Change the working directory to the one where GenerateUUID.exe is
-Run the command `GenerateUUID.exe`
The returned string, e.g. 8ECCA3B6-66F9-4fd6-B6B6-308C874140C6, is the machine ID.
-
+
For Linux:
-Open Terminal
@@ -54,10 +44,10 @@ SoftbindUUID:230e089a-7dc3-4caa-9c77-f7cc6d567f9b
> ```
5. Input the generated UUID and device name and click Submit.
- 
+ 
6. Then an authorization string will be generated. This string is the license for this device. Copy the license and set it in the code
- 
+ 
Code snippet in JavaScript:
diff --git a/license/sdk-works-without-internet.md b/_includes/shared/license/sdk-works-without-internet.md
similarity index 78%
rename from license/sdk-works-without-internet.md
rename to _includes/shared/license/sdk-works-without-internet.md
index f802fb3..eecf889 100644
--- a/license/sdk-works-without-internet.md
+++ b/_includes/shared/license/sdk-works-without-internet.md
@@ -1,13 +1,3 @@
----
-layout: default-layout
-title: Can the SDK work without internet connection?
-keywords: Dynamsoft Barcode Reader, FAQ, Pricing/Licensing, General, internet
-description: Can the SDK work without internet connection?
-needAutoGenerateSidebar: false
----
-
-# Can the SDK work without internet connection?
-
The SDK can indeed be used without an internet connection. In order to use the SDK without an internet connection, it is best to use the Self Hosting option when it comes to setting up the Dynamsoft License Server once you obtain a full license. If the Dynamsoft Hosted option is chosen, an internet connection will be needed for the per barcode scan and various per device license types in order to connect to the license server and validate the license.
- By using the Self Hosting option, the users will mainly just need an intranet connection in order to use the SDK since the server is hosted on the internal server(s) of the organization.
diff --git a/license/track-license.md b/_includes/shared/license/track-license.md
similarity index 67%
rename from license/track-license.md
rename to _includes/shared/license/track-license.md
index 3d7a31a..0b494e6 100644
--- a/license/track-license.md
+++ b/_includes/shared/license/track-license.md
@@ -1,13 +1,3 @@
----
-layout: default-layout
-title: How to track the number of devices?
-keywords: Dynamsoft Barcode Reader, FAQ, Pricing/Licensing, General, track license
-description: How to track the number of devices?
-needAutoGenerateSidebar: false
----
-
-# How to track the number of devices?
-
The Dynamsoft License Server (Dynamsoft hosted or self-hosted) is able to keep a track of the number of devices in different ways, depending on the edition of the SDK.
- On the browser (JavaScript Edition), a device is counted as a specific browser on that device. This license gets cached in the indexedDB of the browser. If another browser is used, or the indexedDB is cleared, then a new license seat is taken up by the same device.
diff --git a/license/troubleshooting-unauthorized-device-clone-detected.md b/_includes/shared/license/troubleshooting-unauthorized-device-clone-detected.md
similarity index 81%
rename from license/troubleshooting-unauthorized-device-clone-detected.md
rename to _includes/shared/license/troubleshooting-unauthorized-device-clone-detected.md
index e0596a2..1e92df4 100644
--- a/license/troubleshooting-unauthorized-device-clone-detected.md
+++ b/_includes/shared/license/troubleshooting-unauthorized-device-clone-detected.md
@@ -1,13 +1,3 @@
----
-layout: default-layout
-title: Error -20151 Unauthorized Device Clone Detected
-keywords: Dynamsoft Barcode Reader, Error -20151, Unauthorized Device Clone, License Error, DBR FAQ, License Validation
-description: Understand the cause of error -20151 Unauthorized Device Clone Detected in Dynamsoft Barcode Reader and how to resolve it.
-needAutoGenerateSidebar: false
----
-
-# Troubleshoot - Error -20151 — Unauthorized Device Clone Detected
-
## What does error **-20151** mean?
The error **-20151: Unauthorized device clone detected** indicates that the license system has identified abnormal behavior suggesting that the same license is being used on what appears to be a cloned or altered device environment.
diff --git a/barcode-reader/server/assets/activate.jpg b/assets/license/activate.jpg
similarity index 100%
rename from barcode-reader/server/assets/activate.jpg
rename to assets/license/activate.jpg
diff --git a/barcode-reader/server/assets/cp-license.jpg b/assets/license/cp-license.jpg
similarity index 100%
rename from barcode-reader/server/assets/cp-license.jpg
rename to assets/license/cp-license.jpg
diff --git a/barcode-reader/server/assets/offline-activate.jpg b/assets/license/offline-activate.jpg
similarity index 100%
rename from barcode-reader/server/assets/offline-activate.jpg
rename to assets/license/offline-activate.jpg
diff --git a/barcode-reader/server/assets/submit-uuid.jpg b/assets/license/submit-uuid.jpg
similarity index 100%
rename from barcode-reader/server/assets/submit-uuid.jpg
rename to assets/license/submit-uuid.jpg
diff --git a/barcode-reader/server/assets/uuid-tool.jpg b/assets/license/uuid-tool.jpg
similarity index 100%
rename from barcode-reader/server/assets/uuid-tool.jpg
rename to assets/license/uuid-tool.jpg
diff --git a/barcode-reader/server/assets/uuid.jpg b/assets/license/uuid.jpg
similarity index 100%
rename from barcode-reader/server/assets/uuid.jpg
rename to assets/license/uuid.jpg
diff --git a/barcode-reader/license b/barcode-reader/license
deleted file mode 120000
index 813e970..0000000
--- a/barcode-reader/license
+++ /dev/null
@@ -1 +0,0 @@
-../license
\ No newline at end of file
diff --git a/barcode-reader/license/dbr-free-trial.md b/barcode-reader/license/dbr-free-trial.md
new file mode 100644
index 0000000..64765a5
--- /dev/null
+++ b/barcode-reader/license/dbr-free-trial.md
@@ -0,0 +1,11 @@
+---
+layout: default-layout
+title: How to get a free trial?
+keywords: Dynamsoft Barcode Reader, FAQ, DBR Introduction, General, free trial
+description: How to get a free trial?
+needAutoGenerateSidebar: false
+---
+
+# How to get a free trial?
+
+{% include shared/license/dbr-free-trial.md %}
diff --git a/barcode-reader/license/enable-supported-barcode-format.md b/barcode-reader/license/enable-supported-barcode-format.md
new file mode 100644
index 0000000..2e88ef3
--- /dev/null
+++ b/barcode-reader/license/enable-supported-barcode-format.md
@@ -0,0 +1,11 @@
+---
+layout: default-layout
+title: Error [xxx] No license found
+keywords: Dynamsoft Barcode Reader, FAQ, JavaScript, tech basic, barcode format, no license found
+description: When moving from a trial license to a production license, you may encounter the error `[xxx] No license found` if your enabled barcode formats don't match the formats supported by your license?
+needAutoGenerateSidebar: false
+---
+
+# Troubleshooting - Error: [xxx] No license found
+
+{% include shared/license/enable-supported-barcode-format.md %}
diff --git a/barcode-reader/license/ensure-no-overuse.md b/barcode-reader/license/ensure-no-overuse.md
new file mode 100644
index 0000000..151e098
--- /dev/null
+++ b/barcode-reader/license/ensure-no-overuse.md
@@ -0,0 +1,11 @@
+---
+layout: default-layout
+title: How to properly use concurrent instance license?
+keywords: Dynamsoft Barcode Reader, FAQ, Pricing/Licensing, General, ensure no overuse
+description: How to properly use concurrent instance license?
+needAutoGenerateSidebar: false
+---
+
+# How to properly use concurrent instance license?
+
+{% include shared/license/ensure-no-overuse.md %}
diff --git a/barcode-reader/license/expand-quota-for-runtime-license.md b/barcode-reader/license/expand-quota-for-runtime-license.md
new file mode 100644
index 0000000..0e9e976
--- /dev/null
+++ b/barcode-reader/license/expand-quota-for-runtime-license.md
@@ -0,0 +1,11 @@
+---
+layout: default-layout
+title: How to expand the quota of a runtime license?
+keywords: Dynamsoft Barcode Reader, FAQ, Pricing/Licensing, General, expand quota
+description: How to expand the quota of a runtime license?
+needAutoGenerateSidebar: false
+---
+
+# How to expand the quota of a runtime license?
+
+{% include shared/license/expand-quota-for-runtime-license.md %}
diff --git a/barcode-reader/license/how-hardware-is-bind-to-license.md b/barcode-reader/license/how-hardware-is-bind-to-license.md
new file mode 100644
index 0000000..53f4824
--- /dev/null
+++ b/barcode-reader/license/how-hardware-is-bind-to-license.md
@@ -0,0 +1,11 @@
+---
+layout: default-layout
+title: How is hardware bound to a license?
+keywords: Dynamsoft Barcode Reader, FAQ, Pricing/Licensing, General, information gathered, hardware bind, new license consumption
+description: How is hardware bound to a license?
+needAutoGenerateSidebar: false
+---
+
+# How is hardware bound to a license?
+
+{% include shared/license/how-hardware-is-bind-to-license.md %}
diff --git a/license/how-license-tracking-works.md b/barcode-reader/license/how-license-tracking-works.md
similarity index 58%
rename from license/how-license-tracking-works.md
rename to barcode-reader/license/how-license-tracking-works.md
index e070683..e37bbf3 100644
--- a/license/how-license-tracking-works.md
+++ b/barcode-reader/license/how-license-tracking-works.md
@@ -8,4 +8,4 @@ needAutoGenerateSidebar: false
# How does license tracking work with the three standard licensing options - Per Scan, Per Device, Per Concurrent Device?
-Each option is explained in the [About section](https://www.dynamsoft.com/license-server/docs/about/licensetypes.html?ver=latest) of the license tracking documentation. Please read through each option to have a good understanding of what each entails. If you have any more questions, please contact the [Dynamsoft support team](https://www.dynamsoft.com/company/contact/).
+{% include shared/license/how-license-tracking-works.md %}
diff --git a/barcode-reader/license/index.md b/barcode-reader/license/index.md
new file mode 100644
index 0000000..66d2792
--- /dev/null
+++ b/barcode-reader/license/index.md
@@ -0,0 +1,12 @@
+---
+layout: default-layout
+title: "Dynamsoft Barcode Reader License FAQ \u2013 Key Questions"
+keywords: faq, license, dbr, dynamsoft, barcode reader, configuration
+description: "Find answers about Dynamsoft Barcode Reader licensing, activation, usage limits, and plans so teams can deploy Dynamsoft capture workflows confidently for modern web."
+needAutoGenerateSidebar: false
+noTitleIndex: true
+---
+
+# License FAQ
+
+{% include shared/license/index.md %}
diff --git a/barcode-reader/license/new-license-required-per-device-licensing.md b/barcode-reader/license/new-license-required-per-device-licensing.md
new file mode 100644
index 0000000..d67763b
--- /dev/null
+++ b/barcode-reader/license/new-license-required-per-device-licensing.md
@@ -0,0 +1,11 @@
+---
+layout: default-layout
+title: When is a new license spot taken when using a per-device licensing model?
+keywords: Dynamsoft Barcode Reader, FAQ, Sales & Licensing, per-device, new license
+description: When is a new license spot taken when using a per-device licensing model?
+needAutoGenerateSidebar: false
+---
+
+# When is a new license spot taken when using a per-device licensing model?
+
+{% include shared/license/new-license-required-per-device-licensing.md %}
diff --git a/barcode-reader/license/offline-registration-license.md b/barcode-reader/license/offline-registration-license.md
new file mode 100644
index 0000000..f39cfbd
--- /dev/null
+++ b/barcode-reader/license/offline-registration-license.md
@@ -0,0 +1,11 @@
+---
+layout: default-layout
+title: How to use offline registration license type?
+keywords: Dynamsoft Barcode Reader, FAQ, offline, license type
+description: How to use offline registration license type?
+needAutoGenerateSidebar: false
+---
+
+# How to use offline registration license type?
+
+{% include shared/license/offline-registration-license.md %}
diff --git a/barcode-reader/license/sdk-works-without-internet.md b/barcode-reader/license/sdk-works-without-internet.md
new file mode 100644
index 0000000..fd13c0f
--- /dev/null
+++ b/barcode-reader/license/sdk-works-without-internet.md
@@ -0,0 +1,11 @@
+---
+layout: default-layout
+title: Can the SDK work without internet connection?
+keywords: Dynamsoft Barcode Reader, FAQ, Pricing/Licensing, General, internet
+description: Can the SDK work without internet connection?
+needAutoGenerateSidebar: false
+---
+
+# Can the SDK work without internet connection?
+
+{% include shared/license/sdk-works-without-internet.md %}
diff --git a/barcode-reader/license/track-license.md b/barcode-reader/license/track-license.md
new file mode 100644
index 0000000..5d754b1
--- /dev/null
+++ b/barcode-reader/license/track-license.md
@@ -0,0 +1,11 @@
+---
+layout: default-layout
+title: How to track the number of devices?
+keywords: Dynamsoft Barcode Reader, FAQ, Pricing/Licensing, General, track license
+description: How to track the number of devices?
+needAutoGenerateSidebar: false
+---
+
+# How to track the number of devices?
+
+{% include shared/license/track-license.md %}
diff --git a/barcode-reader/license/troubleshooting-unauthorized-device-clone-detected.md b/barcode-reader/license/troubleshooting-unauthorized-device-clone-detected.md
new file mode 100644
index 0000000..2c531fe
--- /dev/null
+++ b/barcode-reader/license/troubleshooting-unauthorized-device-clone-detected.md
@@ -0,0 +1,11 @@
+---
+layout: default-layout
+title: Error -20151 Unauthorized Device Clone Detected
+keywords: Dynamsoft Barcode Reader, Error -20151, Unauthorized Device Clone, License Error, DBR FAQ, License Validation
+description: Understand the cause of error -20151 Unauthorized Device Clone Detected in Dynamsoft Barcode Reader and how to resolve it.
+needAutoGenerateSidebar: false
+---
+
+# Troubleshoot - Error -20151 — Unauthorized Device Clone Detected
+
+{% include shared/license/troubleshooting-unauthorized-device-clone-detected.md %}
diff --git a/barcode-reader/web/camera/camera-preview-renders-incorrectly-ios.md b/barcode-reader/web/camera/camera-preview-renders-incorrectly-ios.md
index 4779519..07a3773 100644
--- a/barcode-reader/web/camera/camera-preview-renders-incorrectly-ios.md
+++ b/barcode-reader/web/camera/camera-preview-renders-incorrectly-ios.md
@@ -8,103 +8,4 @@ needAutoGenerateSidebar: false
# Why does the camera preview render incorrectly on iOS 27?
-## Applicable Products
-
-This article applies to:
-
-- Dynamsoft Barcode Reader (DBR) JavaScript SDK (`dynamsoft-barcode-reader-bundle`) 11.6.3000 and earlier
-- Dynamsoft Capture Vision (DCV) JavaScript SDK (`dynamsoft-capture-vision-bundle`) 3.6.3000 and earlier
-
-## Summary
-
-On iOS 27, switching cameras or changing resolution can make the live camera preview render incorrectly. The exact behavior depends on the SDK version:
-
-| Version | Behavior |
-|---|---|
-| DBR 11.4 – 11.6.3000 (DCV 3.4 – 3.6.3000) | The preview renders distorted — squeezed or stretched instead of filling its container. Intermittent: the same switch can render correctly on one attempt and distorted on the next. |
-| DBR 11.2 and earlier (DCV 3.2 and earlier) | The preview isn't distorted, but it no longer fits its container — shown at the wrong zoom or size and not extending to the borders. |
-
-It's reproducible on Safari, Chrome, Edge, and Firefox — all iOS browsers share WebKit's camera implementation, so we suspect the issue originates there rather than in any Dynamsoft SDK. It does not occur on iOS 26.
-
-> [!NOTE]
-> Reported to Apple, but not confirmed as an Apple bug and still open as of iOS 27 RC. Details here may change if Apple ships a fix.
-
-
-
-
- Expected
-
-
-
- Distorted after switching cameras
-
-
-
-## Resolution
-
-### Recommended: upgrade
-
-Upgrade to `dynamsoft-barcode-reader-bundle` **11.6.3200+** or `dynamsoft-capture-vision-bundle` **3.6.3200+**, which include a built-in workaround.
-
-### If you can't upgrade yet
-
-Both workarounds below are temporary and version-specific — neither replaces upgrading.
-
-**DBR 11.4 – 11.6.3000 (DCV 3.4 – 3.6.3000)**
-
-The distortion requires `object-fit: fill` on the video element plus an ancestor using `display: flex` with `flex: 0 0 auto`, so overriding `object-fit` with `cover` on the `` element that [Dynamsoft Camera Enhancer](https://www.dynamsoft.com/camera-enhancer/docs/web/) renders avoids it:
-
-```css
-.dm-camera-core-container video {
- object-fit: cover !important;
-}
-```
-
-`!important` is needed because the SDK sets `object-fit` inline. The JavaScript equivalent, via [`cameraView.getVideoElement()`](https://www.dynamsoft.com/camera-enhancer/docs/web/programming/javascript/api-reference/cameraview.html?product=dbr&lang=javascript#getvideoelement):
-
-```javascript
-let videoElement = cameraView.getVideoElement();
-videoElement?.style.setProperty('object-fit', 'cover', 'important');
-```
-
-> [!WARNING]
-> `cover` crops rather than stretches to preserve the aspect ratio — confirm that trade-off works for your UI.
-
-**DBR 11.2 and earlier (DCV 3.2 and earlier)**
-
-Reset the video element's dimensions whenever the camera or resolution changes, registering the handlers before `cameraEnhancer.open()`:
-
-```javascript
-const resetVideoWH = () => {
- const videoEl = cameraEnhancer.getVideoEl();
- videoEl.style.width = "";
- videoEl.style.height = "";
-
- requestAnimationFrame(() => {
- requestAnimationFrame(() => {
- videoEl.style.width = "100%";
- videoEl.style.height = "100%";
- });
- });
-};
-cameraEnhancer.on("cameraChange", resetVideoWH);
-cameraEnhancer.on("resolutionChange", resetVideoWH);
-
-cameraView.createDrawingLayer(2); // layer ID depends on the product — see below
-
-// Normal startup routine, shown here only to indicate placement
-await cameraEnhancer.open();
-await cvRouter.startCapturing();
-```
-
-The `createDrawingLayer` call is part of the workaround. Pass the layer ID for your product:
-
-| Product | Layer ID |
-|---|---|
-| Dynamsoft Barcode Reader (DBR) | 2 |
-| Mobile Document Scanner (MDS — DDN layer) | 1 |
-| MRZ Scanner (DLR layer) | 3 |
-
-## Need more help?
-
-[Contact the Dynamsoft Support team](https://www.dynamsoft.com/contact/).
+{% include shared/camera-preview-renders-incorrectly-ios.md %}
diff --git a/license/assets/activate.jpg b/license/assets/activate.jpg
deleted file mode 100644
index 65a7ddb83b5874a8dd04343133f0f4ab71f6a086..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 11061
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
SKbOuNz8CKQ;onl|@&5uQEQg{1
diff --git a/license/assets/cp-license.jpg b/license/assets/cp-license.jpg
deleted file mode 100644
index 5474e2050e9d3b10d147e29af321faab15f1dd5c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 23842
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
TJW$Nsr?{8veLNriZuWlxA(qmV
diff --git a/license/assets/offline-activate.jpg b/license/assets/offline-activate.jpg
deleted file mode 100644
index d256a1a6a4e08e85e2730ba5b3461efd81de2e55..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 18162
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
Lv@cXKkrV$5Gk&zE
diff --git a/license/assets/submit-uuid.jpg b/license/assets/submit-uuid.jpg
deleted file mode 100644
index f8337b9717fb0d841927446a2152c07de420836f..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 23137
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