diff --git a/docz/docs/09-miscellany/02-errors.md b/docz/docs/09-miscellany/02-errors.md
new file mode 100644
index 0000000..f3a8649
--- /dev/null
+++ b/docz/docs/09-miscellany/02-errors.md
@@ -0,0 +1,174 @@
+---
+sidebar_position: 2
+title: Troubleshooting
+hide_table_of_contents: true
+---
+
+Here are some common errors and their resolutions. This is not comprehensive.
+The [issue tracker](https://github.com/SheetJS/sheetjs/issues) has a wealth of
+information and user-contributed examples.
+
+If issues are not covered in the docs or the issue tracker, or if a solution is
+not discussed in the documentation, we would appreciate a bug report.
+
+:::info Special Thanks
+
+Special thanks to the early adopters and users for discovering and sharing many
+workarounds and solutions!
+
+:::
+
+
+## Errors
+
+#### SCRIPT5022: DataCloneError
+
+IE10 does not properly support Transferables.
+
+#### Object doesn't support property or method 'slice'
+
+IE does not implement `Uint8Array#slice`. An implementation is included in the
+shim script. Check [the "Standalone" Installation note](../getting-started/installation/standalone#internet-explorer-and-older-browsers)
+
+#### TypeError: f.substr is not a function
+
+Some Google systems use the `base64url` encoding. `base64url` and `base64` are
+different encodings. A simple regular expression can translate the data:
+
+```js
+var wb = XLSX.read(b64.replace(/_/g, "/").replace(/-/g, "+"), {type:'base64'});
+```
+
+#### Error: Cannot read property '0' of undefined
+
+`FileReader#readAsText` will corrupt binary data including XLSX, XLSB, XLS, and
+other binary spreadsheet files.
+
+Applications should use `FileReader#readAsArrayBuffer` or `Blob#arrayBuffer`.
+Examples are included [in "User Submissions"](../06-solutions/01-input.md#example-user-submissions)
+
+Applications specifically targeting legacy browsers like IE10 should use
+`FileReader#readAsBinaryString` to read the data and call `XLSX.read` using the
+`binary` type.
+
+#### `Unsupported file undefined` when reading ArrayBuffer objects
+
+Old versions of the library did not automatically detect `ArrayBuffer` objects.
+
+Workaround (click to show)
+
+:::warning Legacy workaround
+
+This soltion is not recommended for production deployments. Native support
+for `ArrayBuffer` was added in library version `0.9.9`.
+
+:::
+
+After reading data with `FileReader#readAsArrayBuffer`, manually translate to
+binary string and call `XLSX.read` with type `"binary"`
+
+```js
+document.getElementById('file-object').addEventListener("change", function(e) {
+ var files = e.target.files,file;
+ if (!files || files.length == 0) return;
+ file = files[0];
+ var fileReader = new FileReader();
+ fileReader.onload = function (e) {
+ var filename = file.name;
+ // pre-process data
+ var binary = "";
+ var bytes = new Uint8Array(e.target.result);
+ var length = bytes.byteLength;
+ for (var i = 0; i < length; i++) {
+ binary += String.fromCharCode(bytes[i]);
+ }
+ // call 'xlsx' to read the file
+ var oFile = XLSX.read(binary, {type: 'binary', cellDates:true, cellStyles:true});
+ };
+ fileReader.readAsArrayBuffer(file);
+});
+```
+
+
+
+
+## Data Issues
+
+#### CSV and XLS files with Chinese or Japanese characters look garbled
+
+The ESM build, used in tools like Webpack and in Deno, does not include the
+codepage tables by default. The ["Frameworks and Bundlers"](../02-getting-started/01-installation/02-frameworks.md#encoding-support)
+section explains how to load support.
+
+#### Worksheet only includes one row of data
+
+Some third-party writer tools will not update the dimensions records in XLSX or
+XLS or XLSB exports. SheetJS utility functions will skip values not in range.
+
+The following helper function will recalculate the range:
+
+```js
+function update_sheet_range(ws) {
+ var range = {s:{r:Infinity, c:Infinity},e:{r:0,c:0}};
+ Object.keys(ws).filter(function(x) { return x.charAt(0) != "!"; }).map(XLSX.utils.decode_cell).forEach(function(x) {
+ range.s.c = Math.min(range.s.c, x.c); range.s.r = Math.min(range.s.r, x.r);
+ range.e.c = Math.max(range.e.c, x.c); range.e.r = Math.max(range.e.r, x.r);
+ });
+ ws['!ref'] = XLSX.utils.encode_range(range);
+}
+```
+
+More Code Snippets (click to show)
+
+
+`set_sheet_range` changes a sheet's range given a general target spec that can include only the start or end cell:
+
+```js
+/* given the old range and a new range spec, produce the new range */
+function change_range(old, range) {
+ var oldrng = XLSX.utils.decode_range(old), newrng;
+ if(typeof range == "string") {
+ if(range.charAt(0) == ":") newrng = {e:XLSX.utils.decode_cell(range.substr(1))};
+ else if(range.charAt(range.length - 1) == ":") newrng = {s:XLSX.utils.decode_cell(range.substr(0, range.length - 1))};
+ else newrng = XLSX.utils.decode_range(range);
+ } else newrng = range;
+ if(newrng.s) {
+ if(newrng.s.c != null) oldrng.s.c = newrng.s.c;
+ if(newrng.s.r != null) oldrng.s.r = newrng.s.r;
+ }
+ if(newrng.e) {
+ if(newrng.e.c != null) oldrng.e.c = newrng.e.c;
+ if(newrng.e.r != null) oldrng.e.r = newrng.e.r;
+ }
+
+ return XLSX.utils.encode_range(oldrng);
+}
+
+/* call change_sheet and modify worksheet */
+function set_sheet_range(sheet, range) {
+ sheet['!ref'] = change_range(sheet['!ref'], range);
+}
+```
+
+_Adding a cell to a range_
+
+```js
+function range_add_cell(range, cell) {
+ var rng = XLSX.utils.decode_range(range);
+ var c = typeof cell == 'string' ? XLSX.utils.decode_cell(cell) : cell;
+ console.log(rng, c);
+ if(rng.s.r > c.r) rng.s.r = c.r;
+ if(rng.s.c > c.c) rng.s.c = c.c;
+
+ if(rng.e.r < c.r) rng.e.r = c.r;
+ if(rng.e.c < c.c) rng.e.c = c.c;
+ return XLSX.utils.encode_range(rng);
+}
+range_add_cell("A1:C3","B2")
+
+function add_to_sheet(sheet, cell) {
+ sheet['!ref'] = range_add_cell(sheet['!ref'], cell);
+}
+```
+
+
\ No newline at end of file