Project Structure:
📁 d361
├── 📁 data
│   └── 📁 offline
│       ├── 📄 d360_getsitenav.md
│       ├── 📄 d360_getsitenav.py
│       ├── 📄 d360_makesite.md
│       ├── 📄 d360_makesite.py
│       ├── 📄 d361_offline.css
│       ├── 📄 d361_offline.md
│       ├── 📄 nav.html
│       ├── 📄 nav.json
│       ├── 📄 nav.md
│       ├── 📄 README.md
│       └── 📄 sitemap-en.xml
├── 📁 docs
│   ├── 📄 d363.json
│   ├── 📄 d363.md
│   ├── 📄 d363.py
│   ├── 📄 d364.md
│   ├── 📄 d364.py
│   ├── 📄 d365.json
│   ├── 📄 d365.md
│   ├── 📄 d366.json
│   ├── 📄 d366.md
│   ├── 📄 document360.json
│   ├── 📄 document360.md
│   ├── 📄 document360_core.json
│   ├── 📄 document361.json
│   ├── 📄 document362.json
│   ├── 📄 mkdocs_export.md
│   ├── 📄 openapi_spec.json
│   ├── 📄 README.md
│   ├── 📄 summarize.py
│   ├── 📄 test.json
│   └── 📄 test.md
├── 📁 examples
│   ├── 📄 d361.example.toml
│   ├── 📄 d361api.example.toml
│   └── 📄 mkdocs_export_examples.py
├── 📁 schemas
│   └── 📄 d361.schema.json
├── 📁 scripts
│   ├── 📄 build.sh
│   ├── 📄 generate_d360_models.py
│   ├── 📄 install.sh
│   ├── 📄 json_compress.py
│   ├── 📄 monitor_d360_api.py
│   ├── 📄 process_d360_archive.py
│   ├── 📄 release.sh
│   ├── 📄 test.sh
│   └── 📄 text_replacement_utility.py
├── 📁 src
│   └── 📁 d361
│       ├── 📁 api
│       │   ├── 📄 __init__.py
│       │   ├── 📄 api_updater.py
│       │   ├── 📄 bulk_operations.py
│       │   ├── 📄 chunked_download.py
│       │   ├── 📄 circuit_breaker.py
│       │   ├── 📄 client.py
│       │   ├── 📄 data_sync.py
│       │   ├── 📄 errors.py
│       │   ├── 📄 generate_models.py
│       │   ├── 📄 metrics.py
│       │   ├── 📄 openapi_integration.py
│       │   └── 📄 token_manager.py
│       ├── 📁 archive
│       │   ├── 📄 __init__.py
│       │   ├── 📄 cache.py
│       │   ├── 📄 document360_parser.py
│       │   ├── 📄 parser.py
│       │   └── 📄 schema.py
│       ├── 📁 cli
│       │   ├── 📄 __init__.py
│       │   └── 📄 main.py
│       ├── 📁 config
│       │   ├── 📄 __init__.py
│       │   ├── 📄 environment.py
│       │   ├── 📄 loader.py
│       │   ├── 📄 schema.py
│       │   ├── 📄 secrets.py
│       │   └── 📄 secrets_manager.py
│       ├── 📁 core
│       │   ├── 📄 interfaces.py
│       │   ├── 📄 models.py
│       │   └── 📄 transformers.py
│       ├── 📁 edit
│       │   └── 📄 SPEC.md
│       ├── 📁 http
│       │   ├── 📄 __init__.py
│       │   ├── 📄 client.py
│       │   ├── 📄 compatibility.py
│       │   └── 📄 middleware.py
│       ├── 📁 mkdocs
│       │   ├── 📁 exporters
│       │   │   ├── 📄 __init__.py
│       │   │   ├── 📄 config_generator.py
│       │   │   ├── 📄 mkdocs_exporter.py
│       │   │   ├── 📄 navigation_builder.py
│       │   │   └── 📄 theme_optimizer.py
│       │   ├── 📁 processors
│       │   │   ├── 📄 __init__.py
│       │   │   ├── 📄 accessibility_optimizer.py
│       │   │   ├── 📄 asset_manager.py
│       │   │   ├── 📄 content_enhancer.py
│       │   │   ├── 📄 cross_reference_resolver.py
│       │   │   ├── 📄 markdown_processor.py
│       │   │   ├── 📄 plugin_manager.py
│       │   │   └── 📄 seo_optimizer.py
│       │   ├── 📁 templates
│       │   └── 📄 __init__.py
│       ├── 📁 offline
│       │   ├── 📄 __init__.py
│       │   ├── 📄 __main__.py
│       │   ├── 📄 browser.py
│       │   ├── 📄 config.py
│       │   ├── 📄 content.py
│       │   ├── 📄 d361_offline.css
│       │   ├── 📄 d361_offline.py
│       │   ├── 📄 generator.py
│       │   ├── 📄 navigation.py
│       │   └── 📄 parser.py
│       ├── 📁 plugins
│       │   ├── 📄 __init__.py
│       │   └── 📄 manager.py
│       ├── 📁 providers
│       │   ├── 📄 __init__.py
│       │   ├── 📄 api_provider.py
│       │   ├── 📄 archive_provider.py
│       │   ├── 📄 hybrid_provider.py
│       │   └── 📄 mock_provider.py
│       ├── 📁 scraping
│       │   ├── 📄 __init__.py
│       │   ├── 📄 content_processor.py
│       │   ├── 📄 converter.py
│       │   ├── 📄 deduplicator.py
│       │   ├── 📄 extractor.py
│       │   └── 📄 scraper.py
│       ├── 📁 utils
│       │   ├── 📄 __init__.py
│       │   ├── 📄 dependency_injection.py
│       │   ├── 📄 logging.py
│       │   ├── 📄 performance.py
│       │   └── 📄 validation.py
│       └── 📄 __init__.py
├── 📁 templates
├── 📁 tests
│   ├── 📁 data
│   │   └── 📄 v1_categories_articles.json
│   ├── 📁 fixtures
│   │   ├── 📁 markdown_samples
│   │   │   ├── 📄 about-this-guide.md
│   │   │   ├── 📄 actions-6.md
│   │   │   └── 📄 adding-a-fill.md
│   │   ├── 📁 vexy-lines-archive
│   │   └── 📄 README.md
│   ├── 📁 offline
│   │   ├── 📄 test_content.py
│   │   ├── 📄 test_integration.py
│   │   ├── 📄 test_navigation.py
│   │   ├── 📄 test_offline_core.py
│   │   └── 📄 test_parser.py
│   ├── 📄 conftest.py
│   ├── 📄 mkdocs_test_fixtures.py
│   ├── 📄 test_integration_api.py
│   ├── 📄 test_mkdocs_integration.py
│   ├── 📄 test_mkdocs_units.py
│   ├── 📄 test_package.py
│   ├── 📄 test_performance.py
│   ├── 📄 test_plugin_manager_enhanced.py
│   ├── 📄 test_seo_optimizer_enhanced.py
│   ├── 📄 test_theme_optimizer_enhanced.py
│   ├── 📄 test_unit_config.py
│   ├── 📄 test_unit_models.py
│   └── 📄 test_unit_providers.py
├── 📄 .gitignore
├── 📄 d361.spec
├── 📄 DEVELOPMENT.md
├── 📄 example_api_usage.py
├── 📄 HISTORY.md
├── 📄 LICENSE
├── 📄 llms.sh
├── 📄 PLAN.md
├── 📄 publish.sh
├── 📄 pyproject.toml
├── 📄 README.md
├── 📄 test_api_client.py
├── 📄 test_chunked_download.py
├── 📄 test_circuit_breaker.py
├── 📄 test_data_sync.py
├── 📄 test_metrics.py
├── 📄 test_streaming_bulk.py
└── 📄 TODO.md


<documents>
<document index="1">
<source>.gitignore</source>
<document_content>
*_autogen/
.DS_Store
__version__.py
__pycache__/
_Chutzpah*
_deps
_NCrunch_*
_pkginfo.txt
_Pvt_Extensions
_ReSharper*/
_TeamCity*
_UpgradeReport_Files/
!?*.[Cc]ache/
!.axoCover/settings.json
!.vscode/extensions.json
!.vscode/launch.json
!.vscode/settings.json
!.vscode/tasks.json
!**/[Pp]ackages/build/
!Directory.Build.rsp
.*crunch*.local.xml
.axoCover/*
.builds
.cr/personal
.fake/
.history/
.ionide/
.localhistory/
.mfractor/
.ntvs_analysis.dat
.paket/paket.exe
.sass-cache/
.vs/
.vscode
.vscode/*
.vshistory/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
[Bb]in/
[Bb]uild[Ll]og.*
[Dd]ebug/
[Dd]ebugPS/
[Dd]ebugPublic/
[Ee]xpress/
[Ll]og/
[Ll]ogs/
[Oo]bj/
[Rr]elease/
[Rr]eleasePS/
[Rr]eleases/
[Tt]est[Rr]esult*/
[Ww][Ii][Nn]32/
*_h.h
*_i.c
*_p.c
*_wpftmp.csproj
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
*- [Bb]ackup.rdl
*.[Cc]ache
*.[Pp]ublish.xml
*.[Rr]e[Ss]harper
*.a
*.app
*.appx
*.appxbundle
*.appxupload
*.aps
*.azurePubxml
*.bim_*.settings
*.bim.layout
*.binlog
*.btm.cs
*.btp.cs
*.build.csdef
*.cab
*.cachefile
*.code-workspace
*.coverage
*.coveragexml
*.d
*.dbmdl
*.dbproj.schemaview
*.dll
*.dotCover
*.DotSettings.user
*.dsp
*.dsw
*.dylib
*.e2e
*.exe
*.gch
*.GhostDoc.xml
*.gpState
*.ilk
*.iobj
*.ipdb
*.jfm
*.jmconfig
*.la
*.lai
*.ldf
*.lib
*.lo
*.log
*.mdf
*.meta
*.mm.*
*.mod
*.msi
*.msix
*.msm
*.msp
*.ncb
*.ndf
*.nuget.props
*.nuget.targets
*.nupkg
*.nvuser
*.o
*.obj
*.odx.cs
*.opendb
*.opensdf
*.opt
*.out
*.pch
*.pdb
*.pfx
*.pgc
*.pgd
*.pidb
*.plg
*.psess
*.publishproj
*.publishsettings
*.pubxml
*.pyc
*.rdl.data
*.rptproj.bak
*.rptproj.rsuser
*.rsp
*.rsuser
*.sap
*.sbr
*.scc
*.sdf
*.sln.docstates
*.sln.iml
*.slo
*.smod
*.snupkg
*.so
*.suo
*.svclog
*.tlb
*.tlh
*.tli
*.tlog
*.tmp
*.tmp_proj
*.tss
*.user
*.userosscache
*.userprefs
*.vbp
*.vbw
*.VC.db
*.VC.VC.opendb
*.VisualState.xml
*.vsp
*.vspscc
*.vspx
*.vssscc
*.xsd.cs
**/[Pp]ackages/*
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.HTMLClient/GeneratedArtifacts
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
*~
~$*
$tf/
AppPackages/
artifacts/
ASALocalRun/
AutoTest.Net/
Backup*/
BenchmarkDotNet.Artifacts/
bld/
BundleArtifacts/
ClientBin/
cmake_install.cmake
CMakeCache.txt
CMakeFiles
CMakeLists.txt.user
CMakeScripts
CMakeUserPresets.json
compile_commands.json
coverage*.info
coverage*.json
coverage*.xml
csx/
CTestTestfile.cmake
dlldata.c
DocProject/buildhelp/
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/*.HxC
DocProject/Help/*.HxT
DocProject/Help/html
DocProject/Help/Html2
ecf/
FakesAssemblies/
FodyWeavers.xsd
Generated_Code/
Generated\ Files/
healthchecksdb
install_manifest.txt
ipch/
Makefile
MigrationBackup/
mono_crash.*
nCrunchTemp_*
node_modules/
nunit-*.xml
OpenCover/
orleans.codegen.cs
Package.StoreAssociation.xml
paket-files/
project.fragment.lock.json
project.lock.json
publish/
PublishScripts/
rcf/
ScaffoldingReadMe.txt
ServiceFabricBackup/
StyleCopReport.xml
Testing
TestResult.xml
UpgradeLog*.htm
UpgradeLog*.XML
x64/
x86/
# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
build/
develop-eggs/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST

# Distribution / packaging
!dist/.gitkeep

# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/
.ruff_cache/

# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/

# IDE
.idea/
.vscode/
*.swp
*.swo
*~

# OS
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db

# Project specific
__version__.py
_private
docs.document360.com/
docs.document360.com1/
</document_content>
</document>

<document index="2">
<source>.pre-commit-config.yaml</source>
<document_content>
repos:
  - repo: https://github.com/astral-sh/ruff-pre-commit
    rev: v0.3.4
    hooks:
      - id: ruff
        args: [--fix]
      - id: ruff-format
        args: [--respect-gitignore]
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v4.5.0
    hooks:
      - id: end-of-file-fixer
      - id: check-yaml
      - id: check-toml
      - id: check-added-large-files
      - id: debug-statements
      - id: check-case-conflict
      - id: mixed-line-ending
        args: [--fix=lf] 
</document_content>
</document>

<document index="3">
<source>DEVELOPMENT.md</source>
<document_content>
# Development Guide

This document explains how to set up, build, test, and release the d361 project.

## Table of Contents

- [Development Setup](#development-setup)
- [Build System](#build-system)
- [Testing](#testing)
- [Release Process](#release-process)
- [CI/CD Pipeline](#cicd-pipeline)
- [Binary Distribution](#binary-distribution)
- [Contributing](#contributing)

## Development Setup

### Prerequisites

- Python 3.10 or newer (3.12 recommended)
- [uv](https://github.com/astral-sh/uv) – fast Python package installer
- [hatch](https://hatch.pypa.io/) – project management tool
- Git

### Quick Setup

```bash
# Clone the repo
git clone https://github.com/twardoch/d361.git
cd d361

# Install uv if missing
curl -LsSf https://astral.sh/uv/install.sh | sh

# Install hatch
uv pip install hatch

# Activate dev environment
hatch shell

# Install Playwright browsers
playwright install chromium

# Run tests to confirm setup
hatch run test:test
```

## Build System

### Local Build Scripts

The `scripts/` directory contains useful automation tools:

#### Build Script (`scripts/build.sh`)

```bash
# Full build with checks
./scripts/build.sh

# Quick build (skip tests and linting)
./scripts/build.sh --quick

# Clean previous builds
./scripts/build.sh --clean

# Show options
./scripts/build.sh --help
```

#### Test Script (`scripts/test.sh`)

```bash
# All tests
./scripts/test.sh

# Unit tests only
./scripts/test.sh --quick

# Include integration tests
./scripts/test.sh --integration

# Install Playwright browsers
./scripts/test.sh --install-browsers

# Auto-fix lint issues
./scripts/test.sh --fix
```

#### Release Script (`scripts/release.sh`)

```bash
# Tag and release version 1.0.0
./scripts/release.sh --version 1.0.0

# Dry run using Test PyPI
./scripts/release.sh --version 1.0.0 --dry-run

# Skip steps like testing or GitHub actions
./scripts/release.sh --version 1.0.0 --skip-tests --skip-github
```

### Hatch Commands

Hatch handles virtual environments and tasks:

```bash
# Run tests with coverage report
hatch run test:test-cov

# Lint and format code
hatch run lint:fix

# Type check
hatch run lint:typing

# Run all quality checks
hatch run lint:all

# Build package
hatch run build
```

## Testing

### Test Structure

```
tests/
├── test_package.py           # Basic package tests
├── offline/
│   ├── test_offline_core.py  # Core offline functionality
│   ├── test_parser.py        # Sitemap parsing tests
│   ├── test_content.py       # Content extraction tests
│   ├── test_navigation.py    # Navigation extraction tests
│   └── test_integration.py  # Integration tests
```

### Test Categories

- **Unit Tests** – Test single components
- **Integration Tests** – Test component interactions
- **End-to-End Tests** – Test full workflows

### Running Tests

```bash
# Run all tests
hatch run test:test

# With coverage
hatch run test:test-cov

# Specific file
hatch run test:test tests/offline/test_parser.py

# Match pattern
hatch run test:test -k "test_navigation"

# Verbose output
hatch run test:test -v
```

### Test Configuration

Defined in `pyproject.toml`:

```toml
[tool.pytest.ini_options]
asyncio_mode = "auto"
testpaths = ["tests"]
python_files = ["test_*.py"]
python_functions = ["test_*"]
markers = [
    "unit: unit tests",
    "integration: integration tests",
    "slow: slow tests"
]
```

## Release Process

### Semantic Versioning

We follow [Semantic Versioning](https://semver.org/):

- **MAJOR** – Breaking changes
- **MINOR** – New features (backward compatible)
- **PATCH** – Bug fixes (backward compatible)

### Version Management

Versions come from Git tags via `hatch-vcs`:

- Tag format: `v1.0.0`, `v1.0.0-alpha.1`
- No manual version strings in source

### Release Steps

1. **Prepare Release**
   ```bash
   git checkout main
   git pull origin main
   ./scripts/test.sh
   ./scripts/build.sh
   ```

2. **Create Release**
   ```bash
   ./scripts/release.sh --version 1.0.0
   ```

3. **Verify Release**
   - Check GitHub Actions
   - Confirm PyPI upload
   - Test binary downloads
   - Review GitHub release

### Pre-release Testing

```bash
# Dry run to Test PyPI
./scripts/release.sh --version 1.0.0-beta.1 --dry-run

# Install from Test PyPI
pip install --index-url https://test.pypi.org/simple/ d361==1.0.0-beta.1
```

## CI/CD Pipeline

### GitHub Actions Workflows

#### Push Workflow (`.github/workflows/push.yml`)

Triggers on every push to `main` or PR:

- Code quality checks (lint, format)
- Type checking with MyPy
- Tests on Ubuntu, Windows, macOS
- Python 3.10–3.12 support
- Build verification
- Installation test

#### Release Workflow (`.github/workflows/release.yml`)

Triggers on tag push (`v*`):

- Full test matrix
- Source and wheel builds
- PyInstaller binaries for all platforms
- PyPI publish
- GitHub release with assets
- Post-release install test

### Workflow Features

- Cancels outdated runs
- Caches dependencies using UV
- Matrix testing across OS and Python versions
- Secure action permissions

## Binary Distribution

### PyInstaller Configuration

Standalone executables built with PyInstaller:

```bash
pyinstaller --onefile --name d361-offline-linux \
    --add-data "src/d361/offline/d361_offline.css:d361/offline" \
    src/d361/offline/__main__.py
```

### Binary Artifacts

Each release includes:

- Linux: `d361-offline-ubuntu-latest`
- Windows: `d361-offline-windows-latest.exe`
- macOS: `d361-offline-macos-latest`

### Usage

```bash
# Download binary
curl -L -o d361-offline https://github.com/twardoch/d361/releases/latest/download/d361-offline-ubuntu-latest

# Make executable
chmod +x d361-offline

# Run
./d361-offline --help
```

## Contributing

### Code Quality

- Use Ruff for linting and formatting
- Use MyPy for type checking
- Keep test coverage high

### Development Workflow

1. **Fork and Clone**
   ```bash
   git clone https://github.com/YOUR-USERNAME/d361.git
   cd d361
   ```

2. **Create Feature Branch**
   ```bash
   git checkout -b feature/your-feature-name
   ```

3. **Develop and Test**
   ```bash
   # Make changes
   ./scripts/test.sh
   ./scripts/build.sh
   ```

4. **Commit and Push**
   ```bash
   git add .
   git commit -m "feat: add your feature description"
   git push origin feature/your-feature-name
   ```

5. **Create Pull Request**
   - Target `main` branch
   - Describe changes clearly
   - Ensure CI passes

### Code Standards

- Follow PEP 8
- Add type hints everywhere
- Write docstrings for public functions
- Include tests for new code
- Update docs when needed

### Commit Messages

Use [Conventional Commits](https://www.conventionalcommits.org/):

```
feat: add new feature
fix: resolve bug
docs: update documentation
test: add test coverage
refactor: improve code structure
```

## Troubleshooting

### Common Issues

1. **Playwright Browser Issues**
   ```bash
   playwright install chromium
   ```

2. **Build Failures**
   ```bash
   ./scripts/build.sh --clean
   ./scripts/build.sh
   ```

3. **Test Failures**
   ```bash
   hatch run test:test tests/offline/test_parser.py -v
   ```

4. **Version Issues**
   ```bash
   git describe --tags --abbrev=0
   hatch version
   ```

### Getting Help

- [GitHub Issues](https://github.com/twardoch/d361/issues)
- [GitHub Discussions](https://github.com/twardoch/d361/discussions)
- [README.md](README.md)

## Resources

- [Hatch Documentation](https://hatch.pypa.io/)
- [UV Documentation](https://github.com/astral-sh/uv)
- [Pytest Documentation](https://docs.pytest.org/)
- [Ruff Documentation](https://docs.astral.sh/ruff/)
- [MyPy Documentation](https://mypy.readthedocs.io/)
- [PyInstaller Documentation](https://pyinstaller.org/)
- [Semantic Versioning](https://semver.org/)
</document_content>
</document>

<document index="4">
<source>HISTORY.md</source>
<document_content>
# D361: From Document360 to Offline Documentation

*A story of automated documentation tools, featuring humans, LLMs, and offline access*

---

## Chapter 1: The Beginning (February 27, 2025)

On a cold February evening, Adam Twardoch decided that Document360's online-only format was too limiting. The problem was clear: you're on a plane, the WiFi is unreliable, and you need access to documentation that’s only available online.

```python
# The start of d361.py
class D361:
    """Foundation for offline documentation"""
    def __init__(self):
        self.ambition = "unlimited"
        self.patience_with_online_only_docs = 0
```

The first commit (`a6070ce`) on February 27th was unexpectedly complete – 925 lines across 11 files, with GitHub Actions workflows and a proper Python package structure. This wasn’t just a prototype; it had real intent behind it.

Key features from the start:
- **GitHub Workflows**: Automated CI/CD setup.
- **Python Packaging**: `pyproject.toml` with standard configurations.
- **Pre-commit Hooks**: Basic code formatting and linting checks.

The structure showed early planning for enterprise-grade documentation processing.

---

## Chapter 2: Major Improvements (February 28, 2025)

One day later, commit `3051861` added **61,739 lines of code**. It wasn’t an incremental update – it was a major overhaul focused on navigation extraction, content processing, and file generation.

```python
# Simple sitemap parsing...
urls = await parse_sitemap("https://docs.example.com/sitemap-en.xml")

# Became full browser automation:
async with setup_browser(headless=False) as browser:
    page = await browser.new_page()
    await expand_all_items(navigation_tree, page)
    nav_data = await extract_tree_structure(navigation_tree)
```

This update introduced the **Three-Phase Approach**:

1. **PREP**: Parse sitemaps to find documentation structure.
2. **FETCH**: Download content using browser automation.
3. **BUILD**: Generate unified offline documentation.

### Browser Automation

The standout feature was Playwright-powered navigation extraction. This wasn’t basic web scraping – it handled modern web complexities like cookie banners, virtual scrolling, and dynamic content loading.

```python
async def expand_all_items(tree_element, page):
    """Expand navigation nodes in Document360 UI"""
    
    # Scroll to load dynamically rendered items
    await scroll_to_bottom(tree_element, page)
    
    # Click expand buttons with fallback strategies
```

---

## Chapter 3: System Updates (June-July 2025)

### Documentation Overhaul (June 29, 2025)

On June 29th, a bot (`google-labs-jules[bot]`) updated the README.md. The result was a detailed 692-line document with:

- Working usage examples
- Clear architecture descriptions
- Performance benchmarks
- Troubleshooting steps

> "D361 is a **robust offline documentation generator** and part of the Document360 unified toolkit."

### Build System Upgrade (July 17, 2025)

Commits `e68ad95` and `a52edd6` introduced enterprise-grade tooling:

```yaml
# Multi-platform testing
strategy:
  matrix:
    python: ["3.10", "3.11", "3.12"]
    os: [ubuntu-latest, macos-latest, windows-latest]
```

New features:
- **PyInstaller support** for standalone binaries
- **Semantic versioning** via git tags
- **Cross-platform releases**
- **Reliable installation scripts**

---

## Chapter 4: Plugin System Development (March-August 2025)

### Code Structure

By March 2025, D361 had evolved beyond a simple offline generator. The project adopted a **hexagonal architecture**:

```
d361/
├── api/              # Document360 API integration
├── archive/          # Archive processing
├── scraping/         # Content extraction
├── providers/        # Data source abstraction
├── config/          # Configuration management
├── core/            # Core logic
└── offline/         # Offline documentation generation
```

### MkDocs Integration Plan

The `PLAN.md` outlined a vision: transform D361 into a **Document360 → MkDocs conversion toolkit**.

Planned enhancements over 10 weeks:
- Material theme support
- Plugin architecture
- Template system
- Performance improvements

### Human-AI Collaboration

Development followed a clear pattern:

**Humans handled**: Vision, architecture, real-world requirements  
**AI assisted with**: Implementation, documentation, code organization  

Example commit messages:
```bash
# Human
"Enhance navigation extraction, content processing, and file generation"

# AI-assisted
"feat(build): add build system, testing, and release automation"
```

---

## Chapter 5: Technical Features

### Sitemap Parsing Strategies

D361 uses a **five-strategy approach** for parsing sitemaps:

1. **Direct Navigation**
2. **Stealth Browser**
3. **HTTP Direct**
4. **Robots.txt Discovery**
5. **Google Cache**

```python
urls = await parse_sitemap(
    "https://docs.example.com/sitemap-en.xml",
    strategy="stealth"
)
```

### Performance Configuration

The system is designed for speed and reliability:

```python
config = Config(
    max_concurrent=12,  # Parallel processing
    timeout=60,        # Per-page limit
    retries=5,         # Retry failed requests
    pause=0            # No artificial delays
)
```

### Content Extraction Pipeline

The pipeline handles modern web challenges:

```python
async def extract_page_content(page, url):
    """Extract page content and convert to Markdown"""
    
    await dismiss_cookie_banners(page)
    await page.wait_for_load_state("networkidle")
    
    title = await extract_title(page)
    content = await extract_article_content(page)
    markdown = markdownify(content)
    
    return {"title": title, "content": content, "markdown": markdown}
```

---

## Chapter 6: Current Status and Future Goals

### As of Version 2.2.3

D361 now includes:
- 25+ Python modules in a clean architecture
- Multi-format output (HTML, Markdown, combined)
- Browser automation for complex UIs
- Plugin-ready design
- Automated tests for reliability

### MkDocs Transformation Plan

The `TODO.md` lists 75 items for improving Document360 → MkDocs conversion:

```markdown
## Success Criteria

- [ ] Export 1000+ pages in <5 minutes
- [ ] >95% link resolution accuracy
- [ ] >90% test coverage
```

These are measurable engineering goals, not vague ideas.

---

## Epilogue: Human-AI Software Development

### What D361 Shows Us

1. **Architecture First**: Clean structure from the start.
2. **Documentation Matters**: README and guides are part of the process.
3. **AI as Assistant**: Automates repetitive tasks; humans guide direction.
4. **Performance Built-In**: Designed for speed, not patched later.
5. **Real-World Focus**: Handles browser quirks and network issues.

### Human Decisions

Despite AI help, the core design choices were human:

- Three-phase processing workflow
- Fallback strategies for failures
- Flexible configuration options
- Plugin system for future growth

### Next Steps

D361 is moving toward becoming a **complete documentation ecosystem**.

Goal: **Convert any Document360 site into a fast, offline-capable documentation site with minimal effort.**

With its track record, that goal is likely within reach.

---

*The development of D361 continues with each commit, test, and user. It’s software built to solve real problems, combining human planning with AI assistance to make documentation more accessible.*

**Current Version**: `v2.2.3`  
**Next Milestone**: MkDocs support  
**Goal**: Reliable offline documentation for everyone
</document_content>
</document>

<document index="5">
<source>LICENSE</source>
<document_content>
MIT License

Copyright (c) 2025 AUTHOR_NAME

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
</document_content>
</document>

<document index="6">
<source>PLAN.md</source>
<document_content>
# d361 MkDocs Export Enhancement Plan

## [∞](#tldr) TL;DR

This plan enhances the d361 package with comprehensive, modern MkDocs export capabilities, transforming it from a basic Document360 toolkit into a complete Document360 → MkDocs conversion system. Building on the existing solid hexagonal architecture, this enhancement adds extensive, performant, modular MkDocs export functionality that supports the full MkDocs ecosystem including Material theme, popular plugins, and Python Markdown extensions.

## Current d361 Status ✅

The d361 package is already well-structured with:
- **Hexagonal Architecture**: Clean separation of concerns with interfaces, providers, and adapters
- **API Client Integration**: Uses d361api auto-generated client for Document360 API access
- **Archive Processing**: Basic archive handling capabilities
- **Configuration Management**: Environment-specific configuration with secrets management
- **Testing Framework**: Comprehensive test infrastructure
- **CLI Interface**: Command-line interface for offline operations

## MkDocs Export Enhancement Objectives

### 1. Document360 Archive Processing with Numerical Ordering
**Goal**: Create Document360 offline archive → MkDocs conversion with proper file ordering

**Key Requirements**:
- Process Document360 archives (like Vexy-Lines-2025-Aug-07-12-38-29.zip)
- Generate numerical prefixes matching Document360 ordering
- Support mkdocs-awesome-nav and vexy-mkdocs-strip-number-prefix plugins
- Enable two-stage build process for enhanced processing

**Components to Enhance**:
- `d361/mkdocs/exporters/` - Enhanced MkDocs export with numerical ordering
- `d361/mkdocs/templates/` - Templates for specialized plugin configurations  
- `d361/mkdocs/processors/` - Archive processing with ordering preservation
- `d361/archive/` - Enhanced archive handling for structure extraction

**Research-Informed Design**:
- **MkDocs Core Features**: Static site generation, YAML configuration, live preview, navigation
- **Material Theme Integration**: Modern UI, advanced features, extensive customization
- **Plugin Ecosystem**: autorefs, literate-nav, section-index, gen-files, redirects
- **Markdown Extensions**: SuperFences, tabbed content, admonitions, math support

### 2. Modern MkDocs Feature Integration  
**Goal**: Full integration with contemporary MkDocs ecosystem and best practices

**Advanced Capabilities**:
- **Navigation Intelligence**: Smart structure generation from Document360 hierarchy
- **Content Enhancement**: HTML → optimized Markdown with extensions support
- **Asset Management**: Intelligent image processing with CDN URL rewriting
- **Cross-Reference Resolution**: Automatic link resolution and validation
- **Template System**: Extensible Jinja2 templates for different use cases

**Plugin Integrations**:
- **mkdocs-material**: Full Material Design theme support with custom styling
- **mkdocs-autorefs**: Automatic cross-reference linking between pages  
- **mkdocs-section-index**: Clickable sections with index pages
- **mkdocs-redirects**: URL migration and redirect management
- **Performance Plugins**: Minification, compression, caching optimizations

### 3. Production-Ready Export Pipeline
**Goal**: Enterprise-grade MkDocs export with performance and quality focus

**Quality Assurance**:
- Content validation and quality checks
- Broken link detection and resolution
- Image optimization and asset management
- SEO enhancement with meta descriptions and social cards
- Accessibility compliance features

**Performance Optimization**:
- Parallel processing for large Document360 archives
- Intelligent caching strategies
- Memory usage optimization
- Incremental build support for faster iterations
- Export validation and quality reporting

### 4. Dual-Stage Export Architecture Enhancement
**Goal**: Enhance existing dual-stage approach with MkDocs-specific optimizations

**Stage 1**: Document360 → Structured Markdown
- Archive/API content loading with d361's existing capabilities
- Enhanced content processing pipeline
- Asset extraction and optimization
- Navigation structure generation
- Metadata preservation and enrichment

**Stage 2**: Markdown → Optimized MkDocs Site  
- Dynamic MkDocs configuration generation
- Theme-specific optimizations
- Plugin configuration and setup
- Build pipeline orchestration
- Quality validation and reporting

## MkDocs Export Implementation Plan

### Phase 1: Document360 Archive Processing Enhancement (Week 1-2)
**Objective**: Enhance d361 archive processing for Document360 structure extraction with ordering

- **Week 1**: Archive Processing Enhancement
  - Enhance existing archive module for Document360 structure extraction
  - Extract category/article hierarchy with original ordering information
  - Process Document360 metadata for numerical prefix generation
  - Handle Document360-specific content types and relationships
  - Preserve cross-references and internal linking structure

- **Week 2**: Numerical Ordering System
  - Implement numerical prefix generation based on Document360 order
  - Create file naming system: "01_category/02_article.md" format
  - Ensure compatibility with mkdocs-awesome-nav navigation discovery
  - Support vexy-mkdocs-strip-number-prefix for clean URLs
  - Add validation for ordering consistency and completeness

### Phase 2: Advanced Content Processing (Week 3-4)
**Objective**: Enhanced content processing with MkDocs-specific optimizations

- **Week 3**: Content Enhancement Pipeline
  - Implement `ContentEnhancer` for Document360 → MkDocs content optimization
  - Add HTML → Markdown conversion with MkDocs extensions support
  - Create `CrossReferenceResolver` for internal link processing
  - Build frontmatter enrichment system for MkDocs metadata
  - Add content validation and quality assurance checks

- **Week 4**: Asset and Navigation Processing
  - Enhance image processing for MkDocs workflows
  - Implement CDN URL rewriting for optimized asset delivery
  - Add support for responsive images and lazy loading
  - Implement smart navigation generation from Document360 hierarchy
  - Add support for mkdocs-literate-nav integration

### Phase 3: Plugin Ecosystem Integration (Week 5-6)
**Objective**: Integrate popular MkDocs plugins and extensions

- **Week 5**: Core Plugin Support
  - Add mkdocs-material theme integration and customization
  - Implement mkdocs-autorefs automatic cross-referencing
  - Integrate mkdocs-section-index for clickable sections
  - Add mkdocs-redirects for URL migration support
  - Configure advanced search with offline capability

- **Week 6**: Extensions and Performance
  - Configure Python Markdown Extensions (SuperFences, tabbed, admonitions)
  - Integrate mkdocs-minify for production optimization
  - Add social cards generation for better sharing
  - Configure caching and compression optimizations
  - Add accessibility compliance features

### Phase 4: Integration and Testing (Week 7-8)
**Objective**: Integration with existing systems and comprehensive testing

- **Week 7**: vexy-help Integration
  - Update vexy-help to use d361 MkDocs export capabilities
  - Maintain backward compatibility with existing workflows
  - Add Vexy-specific customizations and branding
  - Update CLI to support new MkDocs export options
  - Create migration guide for existing users

- **Week 8**: Testing and Documentation
  - Unit tests for all MkDocs export components
  - Integration tests with both archive and API data sources
  - Performance benchmarks for large Document360 projects
  - Create comprehensive MkDocs export documentation
  - Add usage examples and troubleshooting guides

### Phase 5: Advanced Features (Week 9-10)
**Objective**: Advanced features and production optimization

- **Week 9**: Advanced Export Features
  - Multi-site export for large Documentation projects
  - Incremental build support for faster iterations
  - Advanced caching strategies for improved performance
  - Custom plugin development framework
  - Export validation and quality reporting

- **Week 10**: Production Readiness
  - Performance profiling and optimization
  - Memory usage optimization for large archives
  - Error handling and graceful degradation
  - Monitoring and observability integration
  - Production deployment documentation

## Enhanced d361 Architecture

After MkDocs enhancement, d361 will have this structure:

```
d361/
├── api/              # Document360 API client integration (EXISTING)
├── archive/          # Archive processing and parsing (EXISTING)
├── scraping/         # Content processing and conversion (EXISTING)
├── providers/        # Data source providers (EXISTING)
├── config/          # Configuration management (EXISTING)
├── core/            # Core models and interfaces (EXISTING)
├── utils/           # Utilities and helpers (EXISTING)
└── mkdocs/          # MkDocs export capabilities (NEW)
    ├── exporters/
    │   ├── mkdocs_exporter.py           # Main MkDocs export orchestrator
    │   ├── config_generator.py          # MkDocs YAML config generation
    │   ├── navigation_builder.py        # Smart navigation structure creation
    │   └── theme_optimizer.py           # Theme-specific optimizations
    ├── templates/
    │   ├── mkdocs_base.yml.j2          # Base MkDocs config template
    │   ├── material_theme.yml.j2       # Material theme specific template
    │   └── plugin_configs.yml.j2       # Popular plugin configurations
    ├── processors/
    │   ├── markdown_processor.py       # Enhanced Markdown processing
    │   ├── content_enhancer.py         # Document360 → MkDocs content optimization
    │   ├── asset_manager.py            # Image and asset processing
    │   └── cross_reference_resolver.py # Internal link resolution
    └── plugins/
        ├── d360_compatibility.py       # Document360 compatibility plugin
        ├── vexy_integration.py         # Vexy Lines specific enhancements
        └── export_validation.py        # Export quality validation
```

## Integration Points with vexy-help

After MkDocs enhancement, the integration will be:

**d361 provides**:
- **Universal MkDocs Export**: Complete Document360 → MkDocs conversion for any project
- **Modern MkDocs Features**: Material theme, plugins, extensions, optimization
- **Template System**: Extensible Jinja2 templates for different use cases
- **Quality Assurance**: Content validation, link checking, asset optimization
- **Performance**: Parallel processing, caching, incremental builds

**vexy-help utilizes d361 for**:
- **Core MkDocs Conversion**: `d361.mkdocs.exporters.MkDocsExporter` as primary engine
- **Content Processing**: `d361.mkdocs.processors` for enhanced Document360 → Markdown
- **Template Customization**: `d361.mkdocs.templates` with Vexy-specific overrides
- **Archive/API Processing**: `d361.archive` and `d361.providers` for data access

**vexy-help focuses on**:
- **Vexy Lines Branding**: Vexy-specific templates, colors, logos, styling
- **Workflow Orchestration**: Combining d361 MkDocs capabilities with Vexy workflows
- **Legacy Compatibility**: Maintaining existing CLI and user interfaces
- **Domain Expertise**: Vexy Lines specific content organization and navigation

## Success Metrics and Validation

### Technical Success Metrics
1. **Performance**: Export 1000+ page Document360 archive to MkDocs in <5 minutes
2. **Quality**: >95% link resolution accuracy with automated validation
3. **Compatibility**: Support for all major MkDocs themes and popular plugins
4. **Test Coverage**: >90% test coverage for all MkDocs export functionality
5. **Documentation**: Complete API documentation and user guides

### User Experience Metrics
1. **Ease of Use**: Single command export from Document360 to production MkDocs site
2. **Customization**: Template-based configuration for different use cases
3. **Integration**: Seamless integration with existing CI/CD pipelines
4. **Error Handling**: Clear error messages with actionable troubleshooting steps
5. **Migration**: Smooth migration path from legacy vexy-help MkDocs workflows

### Business Impact Metrics
1. **Code Reusability**: d361 MkDocs export works for any Document360 project
2. **Clean Separation**: vexy-help contains no Document360-specific export code
3. **Maintainability**: Reduced code duplication and clear responsibility boundaries
4. **Extensibility**: Template and plugin system allows easy customization
5. **Production Readiness**: Enterprise-grade export with monitoring and optimization

## Risk Mitigation Strategy

### Technical Risks
- **Performance Regression**: Comprehensive benchmarking before and after implementation
- **Feature Compatibility**: Exhaustive testing with existing vexy-help workflows
- **Plugin Conflicts**: Isolated testing environment for MkDocs plugin interactions
- **Template Complexity**: Gradual template system rollout with fallback options

### Project Risks
- **Scope Creep**: Clear phase boundaries with defined deliverables
- **Integration Complexity**: Incremental integration with comprehensive testing
- **Timeline Overruns**: Buffer time built into each phase for testing and refinement
- **Resource Constraints**: Modular implementation allows for priority-based development

### Mitigation Actions
- **Backward Compatibility**: All existing vexy-help workflows continue working unchanged
- **Incremental Migration**: Phase-by-phase implementation with validation at each step
- **Comprehensive Testing**: Unit, integration, and end-to-end testing at all levels
- **Documentation**: Detailed migration guides and troubleshooting documentation
- **Rollback Strategy**: Ability to revert to previous implementation if needed

## Project Impact and Vision

**🎯 Primary Objective**: Transform d361 into the definitive Document360 → MkDocs conversion toolkit

**Expected Outcomes**:
- **Universal MkDocs Export**: Any Document360 project can export to modern MkDocs
- **Best-in-Class Features**: Full Material theme, plugin ecosystem, performance optimization
- **Production Quality**: Enterprise-ready with validation, monitoring, error handling
- **Extensible Architecture**: Template and plugin system for custom requirements
- **Clean Architecture**: Clear separation between generic (d361) and specific (vexy-help) concerns

**Long-Term Vision**: d361 becomes the go-to solution for Document360 → static site generation, supporting not just MkDocs but potentially Hugo, Docusaurus, and other popular documentation frameworks.

**Timeline**: 10 weeks for complete MkDocs export enhancement with production-ready quality and comprehensive testing.
</document_content>
</document>

<document index="7">
<source>README.md</source>
<document_content>
# D361: Robust Offline Documentation Generator

[![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://opensource.org/licenses/MIT)
[![PyPI version](https://badge.fury.io/py/d361.svg)](https://badge.fury.io/py/d361)
[![Python Versions](https://img.shields.io/pypi/pyversions/d361.svg)](https://pypi.org/project/d361/)
[![Code style: Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
[![Checked with MyPy](http://www.mypy-lang.org/static/mypy_badge.svg)](http://mypy-lang.org/)
[![Tests Passing](https://github.com/twardoch/d361/actions/workflows/push.yml/badge.svg)](https://github.com/twardoch/d361/actions/workflows/push.yml)

## TL;DR

D361 creates offline versions of Document360 knowledge bases and other sitemap-based documentation sites. It's the foundation of the Document360 unified toolkit, designed for reliability and performance.

**Quick Start:**
```bash
# Install and generate offline docs in one command
pip install d361 && playwright install chromium
d361-offline all --map-url="https://docs.example.com/sitemap-en.xml" --output-dir="offline_docs"

# Or use the standalone binary (no Python required)
curl -L -o d361-offline https://github.com/twardoch/d361/releases/latest/download/d361-offline-ubuntu-latest
chmod +x d361-offline && ./d361-offline all --map-url="https://docs.example.com/sitemap-en.xml"
```

**Key Features:**
- Complete documentation capture
- Multi-strategy sitemap parsing with fallbacks
- Browser automation for dynamic content
- HTML and Markdown output formats
- Concurrent downloads with retry logic
- Preserved navigation structure

---

## What is D361?

D361 is an offline documentation generator that extracts, processes, and organizes content from Document360 and similar sites for offline access.

**Core Purpose:**
Automate downloading of entire documentation sites and converting them into offline formats. Handles dynamic content, virtual scrolling, and complex navigation.

**The D361 Workflow:**

1. Multi-strategy sitemap discovery
2. Navigation structure extraction
3. Concurrent content fetching
4. Multi-format processing
5. Structured organization

**Result:** A complete, self-contained documentation snapshot that works offline.

## Who Uses D361?

**Enterprise Documentation Teams:**
- **Technical Writers** - Archive versions, offline reviews, distribution packages
- **DevOps Engineers** - Integration into deployment pipelines
- **Support Engineers** - Instant access to knowledge bases
- **Compliance Teams** - Immutable snapshots for regulatory requirements

**Development & Integration:**
- **Software Developers** - Bundle documentation with applications
- **System Integrators** - Deploy in air-gapped environments
- **CI/CD Pipelines** - Automated documentation processing
- **Documentation Toolkit Builders** - Foundation component (used in `vexy-help`)

**Specialized Use Cases:**
- **Industrial/Manufacturing** - Factory floor access
- **Healthcare/Government** - Regulated environments
- **Field Service** - Remote locations with limited connectivity
- **Training & Education** - Portable learning packages

## Why Choose D361?

**Technical Excellence:**
- Handles complex documentation sites with dynamic content
- Concurrent processing with intelligent retries
- Multiple fallback strategies for content extraction
- Outputs HTML, Markdown, and combined formats

**Real-World Reliability:**
- Tested on large-scale sites with thousands of pages
- Playwright techniques handle cookie banners and virtual scrolling
- Preserves navigation structure, styling, and cross-references
- Comprehensive error handling for partial success

**Integration-Friendly:**
- Works independently
- Clean programmatic interface
- Docker-friendly with minimal resource requirements
- Cross-platform support for Linux, macOS, and Windows

## Core Features & Capabilities

### Complete Documentation Extraction
D361 captures entire documentation ecosystems:

```python
# Advanced content discovery with multiple fallback strategies
from d361.offline.parser import parse_sitemap

# Strategy 1: Direct sitemap parsing
urls = await parse_sitemap("https://docs.example.com/sitemap-en.xml")

# Strategy 2: Robots.txt discovery + parsing  
urls = await parse_sitemap("https://docs.example.com/robots.txt", strategy="robots")

# Strategy 3: Stealth browser automation for protected sites
urls = await parse_sitemap("https://docs.example.com", strategy="stealth")
```

**What gets captured:**
- All article content (HTML + Markdown)
- Complete navigation hierarchy
- Referenced images and media
- Cross-references and internal links
- Original styling and CSS (optional)

### Multi-Strategy Sitemap Parsing
Robust discovery mechanisms ensure content extraction:

```python
from d361.offline.d361_offline import D361Offline
from d361.offline.config import Config

config = Config(
    map_url="https://docs.example.com/sitemap-en.xml",
    effort=True,  # Enable additional discovery strategies
    max_concurrent=8,  # Concurrent parsing attempts
    retries=3  # Per-strategy retry attempts
)

offline_gen = D361Offline(config)
await offline_gen.prep()  # Intelligent sitemap discovery and parsing
```

**Parsing Strategies:**
1. Direct navigation via HTTP GET
2. Stealth browser automation
3. aiohttp-based lightweight parsing
4. Robots.txt discovery
5. Google cache fallback

### Advanced Browser Automation
Playwright handles modern web complexity:

```python
from d361.offline.browser import setup_browser, expand_all_items

# Configure stealth browser
browser_config = {
    'headless': True,
    'user_agent': 'Mozilla/5.0 (compatible; D361 Documentation Archiver)',
    'viewport': {'width': 1920, 'height': 1080},
    'extra_http_headers': {
        'Accept-Language': 'en-US,en;q=0.9',
        'Accept-Encoding': 'gzip, deflate, br'
    }
}

async with setup_browser(**browser_config) as browser:
    page = await browser.new_page()
    await page.goto("https://docs.example.com")
    
    # Handle dynamic content loading
    navigation_tree = await page.locator('#left-panel d360-data-list-tree-view').first
    await expand_all_items(navigation_tree, page)  # Recursively expand all navigation
    
    # Extract complete navigation structure
    nav_data = await extract_tree_structure(navigation_tree)
```

**Capabilities:**
- Cookie banner dismissal
- Virtual scrolling content loading
- Dynamic tree expansion
- Network idle detection
- Retry logic for failures

### Multi-Format Output Generation
Flexible output formats for different needs:

```python
# Configure output formats
config = Config(
    map_url="https://docs.example.com/sitemap-en.xml",
    output_dir=Path("./offline_docs"),
    css_file=Path("./custom-styling.css"),
    
    # File naming
    all_docs_html_filename="complete_documentation.html",
    all_docs_md_filename="complete_documentation.md",
    
    # Processing options
    test=False,
    verbose=True
)

offline_gen = D361Offline(config)
await offline_gen.all()  # Generate all formats
```

**Generated Output Structure:**
```
offline_docs/docs.example.com/
├── prep.json              # Sitemap discovery metadata
├── fetch.json             # Content extraction results  
├── nav.json               # Navigation structure data
├── nav.html               # Standalone navigation menu
├── nav.md                 # Markdown navigation index
├── all_docs.html          # Complete HTML with embedded navigation
├── all_docs.md            # Complete Markdown with TOC
├── html/                  # Individual HTML pages
│   ├── getting-started.html
│   ├── api-reference.html
│   └── ...
└── md/                    # Individual Markdown pages
    ├── getting-started.md
    ├── api-reference.md
    └── ...
```

### Performance-Optimized Processing
Enterprise-grade performance with intelligent resource management:

```python
from d361.offline.config import Config

# Performance-tuned configuration
config = Config(
    map_url="https://docs.example.com/sitemap-en.xml",
    max_concurrent=12,        # Concurrent page fetching
    timeout=60,              # Per-page timeout (seconds)
    retries=5,               # Retry attempts for failed pages  
    pause=0                  # No artificial delays
)

offline_gen = D361Offline(config)
start_time = time.time()
result = await offline_gen.all()
processing_time = time.time() - start_time

print(f"Processed {len(result['content'])} pages in {processing_time:.2f}s")
```

**Performance Features:**
- Concurrent downloads (default: 5 concurrent)
- Exponential backoff with `tenacity`
- Memory-efficient streaming processing
- Progress tracking and metrics
- Connection pooling for HTTP efficiency

### Installation

D361 can be installed in multiple ways:

#### Quick Installation
```bash
curl -sSL https://raw.githubusercontent.com/twardoch/d361/main/scripts/install.sh | bash
```

#### Manual Installation

**Via pip:**
```bash
pip install d361
playwright install chromium
```

**Via uv:**
```bash
uv pip install d361
playwright install chromium
```

**Binary Download:**
```bash
# Linux
curl -L -o d361-offline https://github.com/twardoch/d361/releases/latest/download/d361-offline-ubuntu-latest
chmod +x d361-offline

# macOS
curl -L -o d361-offline https://github.com/twardoch/d361/releases/latest/download/d361-offline-macos-latest
chmod +x d361-offline

# Windows
curl -L -o d361-offline.exe https://github.com/twardoch/d361/releases/latest/download/d361-offline-windows-latest.exe
```

#### Installation Options

The installation script supports various options:

```bash
# Install specific version
./scripts/install.sh --version 1.0.0

# Install via specific method
./scripts/install.sh --method binary

# Install with Playwright browsers
./scripts/install.sh --install-browsers

# Install to custom directory
./scripts/install.sh --install-dir ~/.local/bin

# See all options
./scripts/install.sh --help
```

### Command Line Usage

The package provides a command-line interface `d361-offline` with several operations: `prep`, `fetch`, `build`, and `all`.

**1. `all` (Recommended):**
Runs the entire process: preparation, fetching, and building.
```bash
d361-offline all --map-url="https://docs.example.com/sitemap-en.xml" --output-dir="my_offline_docs"
```
*   `--map-url`: (Required) Documentation sitemap URL.
*   `--output-dir`: (Optional) Output directory. Defaults to domain-named folder.
*   `--style`: (Optional) Custom CSS file for HTML output.
*   `--nav-url`: (Optional) Page to extract navigation from.

**2. Individual Steps:**

*   **`prep`**: Parses sitemap and extracts navigation.
    ```bash
    d361-offline prep --map-url="https://docs.example.com/sitemap-en.xml" --output-dir="my_docs"
    ```
    Creates `prep.json`.

*   **`fetch`**: Downloads content for all URLs.
    ```bash
    d361-offline fetch --prep-file="my_docs/prep.json" --output-dir="my_docs"
    ```
    Creates `fetch.json` and saves individual pages.

*   **`build`**: Generates combined documentation files.
    ```bash
    d361-offline build --fetch-file="my_docs/fetch.json" --output-dir="my_docs" --style="path/to/custom.css"
    ```

**Getting Help:**
Use `d361-offline <command> --help` for options.
Example: `d361-offline all --help`.

### Programmatic Usage

Use D361 from Python scripts:

```python
import asyncio
from pathlib import Path
from d361.offline.config import Config
from d361.offline.d361_offline import D361Offline

async def generate_my_docs():
    sitemap_url = "https://docs.example.com/sitemap-en.xml"
    if not sitemap_url:
        raise ValueError("map_url must be set")

    config = Config(
        map_url=sitemap_url,
        output_dir=Path("custom_offline_docs"),
        css_file=Path("styles/my_custom_style.css") if Path("styles/my_custom_style.css").exists() else None,
        max_concurrent=5,
        retries=3,
        timeout=60,
        verbose=False,
        test=False
    )

    offline_generator = D361Offline(config)

    try:
        print(f"Starting offline generation for {config.map_url}...")
        print(f"Output will be saved to: {config.output_dir.resolve()}")
        await offline_generator.all()
        print("Offline documentation generated successfully!")
        print(f"Combined HTML: {config.output_dir / config.all_docs_html_filename}")
        print(f"Combined Markdown: {config.output_dir / config.all_docs_md_filename}")

    except Exception as e:
        print(f"An error occurred: {e}")
        import traceback
        traceback.print_exc()

if __name__ == "__main__":
    # Run `playwright install` if browsers aren't installed
    asyncio.run(generate_my_docs())
```

### Configuration Options

Behavior controlled by `Config` model (see `src/d361/offline/config.py`):

| Option | CLI Argument | Description | Default |
|--------|-------------|-------------|---------|
| `map_url` | `--map-url` | Sitemap URL | Required |
| `nav_url` | `--nav-url` | Navigation extraction URL | None |
| `output_dir` | `--output-dir` | Base output directory | Current directory |
| `css_file` | `--style` | Custom CSS file | None |
| `effort` | `--effort` | Aggressive sitemap mapping | `False` |
| `max_concurrent` | `--parallel` | Concurrent downloads | 5 |
| `retries` | `--retries` | Retry attempts | 3 |
| `timeout` | `--timeout` | Page load timeout | 60 |
| `verbose` | `--verbose` | Verbose logging | `False` |
| `test` | `--test` | Test mode (5 items) | `False` |
| `pause` | `--wait` | Navigation extraction pause | `False` |

*Note: Output directory behavior - if `map_url` is `https://docs.example.com/...` and `output_dir` is `my_docs`, actual path becomes `my_docs/docs.example.com/`.*

### Output Structure

Generated documentation organized as follows:

```
output_dir/your_domain_com/
├── prep.json          # Preparation data (URLs, navigation)
├── fetch.json         # Fetched content map
├── nav.json           # Navigation structure
├── nav.html           # Navigation menu (HTML)
├── nav.md             # Navigation menu (Markdown)
├── all_docs.html      # Combined HTML documentation
├── all_docs.md        # Combined Markdown documentation
├── html/              # Individual HTML pages
│   ├── page-slug-1.html
│   ├── page-slug-2.html
│   └── ...
└── md/                # Individual Markdown pages
    ├── page-slug-1.md
    ├── page-slug-2.md
    └── ...
```
Custom CSS copied to `html/assets/` and linked in `all_docs.html`.

## Part 2: Technical Deep-Dive

This section describes D361's internal architecture and contribution guidelines.

### How the Code Works

D361 operates in three asynchronous phases: **Prep**, **Fetch**, and **Build**.

**Core Workflow:**

1.  **Prep Phase:**
    *   Parses sitemap to get unique page URLs
    *   Extracts navigation structure
    *   Saves data to `prep.json`
    *   Generates `nav.json`, `nav.html`, and `nav.md`

2.  **Fetch Phase:**
    *   Reads `prep.json`
    *   Fetches content for each URL (title, HTML, Markdown)
    *   Saves individual pages to `html/<slug>.html` and `md/<slug>.md`
    *   Saves all content to `fetch.json`

3.  **Build Phase:**
    *   Reads `fetch.json`
    *   Generates `all_docs.html`: single HTML file with navigation and styling
    *   Generates `all_docs.md`: single Markdown file with table of contents

**Key Components:**

*   **Configuration (`src/d361/offline/config.py`):**
    *   `Config` class manages settings with Pydantic validation
    *   Computes defaults and provides output file paths

*   **Main Orchestrator (`src/d361/offline/d361_offline.py`):**
    *   `D361Offline` class coordinates all operations
    *   Methods: `prep()`, `fetch()`, `build()`, `all()`

*   **Command Line Interface (`src/d361/offline/__main__.py`):**
    *   Exposes `D361Offline` methods via `fire` library
    *   CLI commands: `prep`, `fetch`, `build`, `all`

*   **Sitemap Parsing (`src/d361/offline/parser.py`):**
    *   `parse_sitemap` extracts URLs from sitemap.xml
    *   Multiple strategies for robustness:
        1.  Direct Playwright navigation
        2.  Playwright with stealth techniques
        3.  Direct HTTP GET with `aiohttp`
        4.  Robots.txt discovery
        5.  Google cache fallback
    *   Uses `BeautifulSoup` with `lxml` parser

*   **Navigation Extraction (`src/d361/offline/navigation.py`):**
    *   `extract_navigation` uses Playwright to load navigation page
    *   Complex interaction due to Document360's dynamic UI:
        *   Cookie/consent banner dismissal
        *   Tree expansion via `expand_navigation_tree`
        *   `expand_all_items` scrolls and clicks expand icons recursively
        *   Structure parsing with `extract_tree_structure`
    *   Fallback mechanisms for non-standard selectors

*   **Content Processing (`src/d361/offline/content.py`, `D361Offline.process_url`):**
    *   `process_url` launches Playwright page for each URL
    *   `extract_page_content`:
        *   Navigates to URL
        *   Dismisses cookie banners
        *   Waits for network idle and rendering
        *   Extracts title and content
        *   Converts HTML to Markdown with `markdownify`
    *   Saves content to `html/<slug>.html` and `md/<slug>.md`

*   **Browser Automation (`src/d361/offline/browser.py`):**
    *   `setup_browser`: Configures Playwright with realistic arguments
    *   `scroll_to_bottom`: Handles virtual scrolling
    *   `expand_all_items`: Recursively expands tree nodes

*   **Output Generation (`D361Offline._generate_combined_files`, `src/d361/offline/generator.py`):**
    *   `_generate_combined_files` creates `all_docs.html` and `all_docs.md`
    *   HTML includes navigation and custom/default CSS
    *   Markdown includes table of contents and article content
    *   `generator.py` handles directory creation

*   **Error Handling:**
    *   `tenacity` library provides exponential backoff retries
    *   Individual URL errors don't stop entire batch processing

### Development Environment

Project uses [Hatch](https://hatch.pypa.io/) for dependency management and [uv](https://github.com/astral-sh/uv) for speed.

**Setup:**

1.  **Install Hatch and uv**:
    ```bash
    curl -LsSf https://astral.sh/uv/install.sh | sh
    uv pip install hatch
    ```

2.  **Create/Activate Environment**:
    ```bash
    hatch shell
    ```
    *   Creates isolated virtual environment
    *   Installs dependencies using `uv`

3.  **Install Playwright Browsers**:
    ```bash
    playwright install
    ```

**Running Tasks:**

*   **Run Tests**:
    ```bash
    hatch run test:test-cov    # With coverage
    hatch run test:test        # Without coverage
    ```

*   **Linting and Formatting**:
    ```bash
    hatch run lint:fix         # Format and fix
    hatch run lint:style       # Check style
    hatch run lint:typing      # Type checking
    hatch run lint:all         # All checks
    ```

*   **Pre-commit Hooks**:
    ```bash
    pre-commit install
    ```

### Coding and Contribution Guidelines

Contributions welcome. Follow these guidelines:

1.  **Branching:**
    *   Create branches from `main` (e.g., `feat/add-feature`, `fix/bug-name`)

2.  **Code Quality:**
    *   Format with Ruff: `hatch run lint:fix`
    *   Lint with Ruff: `hatch run lint:style`
    *   Type check with MyPy: `hatch run lint:typing`
    *   Write idiomatic Python with docstrings and comments

3.  **Commit Messages:**
    *   Follow [Conventional Commits](https://www.conventionalcommits.org/)
    *   Examples:
        *   `feat: add support for Confluence sitemap parsing`
        *   `fix: improve resilience of cookie banner dismissal`
        *   `docs: update README with advanced usage examples`
        *   `refactor: simplify content extraction logic`
        *   `test: add unit tests for slug generation`

4.  **Testing:**
    *   Write `pytest` tests for new features
    *   Place tests in `tests/` directory
    *   Check coverage: `hatch run test:test-cov`
    *   Ensure all tests pass locally

5.  **Pull Requests:**
    *   Submit against `main` branch
    *   Provide clear title and description
    *   Explain changes and link issues
    *   Ensure CI checks pass

6.  **Dependencies:**
    *   Minimize new dependencies
    *   Add to `pyproject.toml` under appropriate section

### Releases

D361 follows [Semantic Versioning](https://semver.org/) with multiple distribution formats:

- **PyPI Package**: For `pip` and `uv` installation
- **Binary Releases**: Pre-built executables for all platforms
- **Source Code**: Available on GitHub

Each release includes:
- Source distribution
- Wheel distribution
- Standalone binaries
- Automated testing across Python 3.10-3.12

#### Release Process

Automatic releases triggered by version tags:

```bash
git tag v1.0.0
git push origin v1.0.0
```

CI/CD pipeline:
1. Runs comprehensive tests
2. Builds packages and binaries
3. Publishes to PyPI
4. Creates GitHub release

See [DEVELOPMENT.md](DEVELOPMENT.md) for detailed guidelines.

### License

D361 is licensed under the MIT License. See [LICENSE](LICENSE) for details.
</document_content>
</document>

<document index="8">
<source>TODO.md</source>
<document_content>
# d361 MkDocs Export Enhancement TODO List

This document contains the linearized itemized plan for enhancing the d361 package with comprehensive MkDocs export capabilities.

## 📊 Current Status
**✅ FOUNDATION COMPLETE**: d361 package has solid hexagonal architecture
**🎯 CURRENT FOCUS**: Implementing comprehensive Document360 → MkDocs export functionality
**📋 RESEARCH COMPLETE**: MkDocs ecosystem, Material theme, plugins, and extensions analyzed

---

## Phase 1: Document360 Archive Processing Enhancement (Week 1-2)

### 1.1 Archive Processing Enhancement
- [ ] Enhance existing d361.archive module for Document360 structure extraction
- [ ] Extract category/article hierarchy with original ordering information
- [ ] Process Document360 metadata for numerical prefix generation
- [ ] Handle Document360-specific content types and relationships
- [ ] Preserve cross-references and internal linking structure

### 1.2 Numerical Ordering System Implementation
- [ ] Implement numerical prefix generation based on Document360 order
- [ ] Create file naming system: "01_category/02_article.md" format
- [ ] Ensure compatibility with mkdocs-awesome-nav navigation discovery
- [ ] Support vexy-mkdocs-strip-number-prefix for clean URLs
- [ ] Add validation for ordering consistency and completeness

### 1.3 Archive Processing Integration
- [ ] Integrate with existing d361.providers for archive data access
- [ ] Connect with d361.scraping.content_processor for content enhancement
- [ ] Add MkDocs-specific archive processing capabilities
- [ ] Test with Vexy-Lines-2025-Aug-07-12-38-29.zip
- [ ] Validate structure extraction accuracy and completeness

### 1.3 Template System Foundation
- [ ] Create base MkDocs configuration templates (mkdocs_base.yml.j2)
- [ ] Add Material theme specific template (material_theme.yml.j2) with all features
- [ ] Design plugin configuration templates (plugin_configs.yml.j2) for popular plugins
- [ ] Implement template inheritance and customization system
- [ ] Add validation for generated configurations with comprehensive error reporting

### 1.4 Integration with Existing d361 Systems
- [ ] Integrate MkDocs exporters with d361.providers for archive/API data access
- [ ] Connect with d361.scraping.content_processor for enhanced content processing
- [ ] Utilize d361.config system for MkDocs-specific configuration management
- [ ] Implement proper error handling and logging using d361 infrastructure
- [ ] Add MkDocs export capabilities to d361 CLI interface

---

## Phase 2: Advanced Content Processing (Week 3-4)

### 2.1 Content Enhancement Pipeline
- [ ] Implement `ContentEnhancer` for Document360 → MkDocs content optimization
- [ ] Add HTML → Markdown conversion with MkDocs extensions support (SuperFences, tabbed, etc.)
- [ ] Create `CrossReferenceResolver` for internal link processing and validation
- [ ] Build frontmatter enrichment system for MkDocs metadata (SEO, social cards)
- [ ] Add content validation and quality assurance checks (broken links, images)

### 2.2 Asset Processing Enhancement
- [ ] Enhance image processing for MkDocs workflows with format optimization
- [ ] Implement CDN URL rewriting for optimized asset delivery
- [ ] Add support for responsive images and lazy loading configurations
- [ ] Create asset bundling and optimization pipeline for Material theme
- [ ] Add support for Material theme social cards generation from Document360 content

### 2.3 Navigation Intelligence System
- [ ] Implement smart navigation generation from Document360 hierarchy
- [ ] Add support for mkdocs-literate-nav integration (SUMMARY.md generation)
- [ ] Create section index page generation with proper Material theme styling
- [ ] Build automatic cross-reference detection and linking using mkdocs-autorefs
- [ ] Add navigation validation and optimization for large documentation sites

### 2.4 Markdown Extensions Integration
- [ ] Configure pymdownx.superfences for enhanced code blocks with syntax highlighting
- [ ] Add pymdownx.tabbed for tabbed content containers from Document360 content
- [ ] Integrate admonitions for Document360 callouts and note boxes
- [ ] Configure table of contents with permalink anchors for better navigation
- [ ] Add task list support for GitHub-style checkboxes in converted content

---

## Phase 3: Plugin Ecosystem Integration (Week 5-6)

### 3.1 Core Plugin Support
- [ ] Add mkdocs-material theme integration and customization with d361 templates
- [ ] Implement mkdocs-autorefs automatic cross-referencing for Document360 links  
- [ ] Integrate mkdocs-section-index for clickable sections in navigation
- [ ] Add mkdocs-redirects for URL migration support from Document360 slugs
- [ ] Configure advanced search with offline capability for Material theme

### 3.2 Python Markdown Extensions Configuration
- [ ] Configure pymdownx.superfences for enhanced code blocks with custom formats
- [ ] Add pymdownx.tabbed for tabbed content containers with Material theme styling
- [ ] Integrate admonitions for Document360 callout boxes (notes, warnings, tips)
- [ ] Configure table of contents with permalink anchors and proper Material theme integration
- [ ] Add task list support for GitHub-style checkboxes in converted Document360 content

### 3.3 Performance and SEO Optimization
- [ ] Integrate mkdocs-minify for production optimization (HTML, CSS, JS)
- [ ] Add social cards generation for better sharing using Material theme features
- [ ] Implement structured data and SEO enhancements from Document360 metadata
- [ ] Configure caching and compression optimizations for large documentation sites
- [ ] Add accessibility compliance features (ARIA labels, alt text, keyboard navigation)

### 3.4 Custom MkDocs Plugins Development
- [ ] Create d360_compatibility.py plugin for Document360-specific features
- [ ] Develop vexy_integration.py plugin for Vexy Lines specific enhancements
- [ ] Build export_validation.py plugin for quality reporting and validation
- [ ] Implement custom plugin discovery and registration system
- [ ] Add plugin configuration validation and error handling

---

## Phase 4: Integration and Testing (Week 7-8)

### 4.1 vexy-help Integration
- [ ] Update vexy-help to use d361 MkDocs export capabilities instead of local implementation
- [ ] Maintain backward compatibility with existing vexy-help workflows and CLI
- [ ] Add Vexy-specific customizations and branding through d361 template system
- [ ] Update CLI to support new MkDocs export options with enhanced features
- [ ] Create migration guide for existing users moving from legacy implementation

### 4.2 Comprehensive Testing Framework
- [ ] Unit tests for all MkDocs export components (exporters, processors, templates)
- [ ] Integration tests with both archive and API data sources from d361.providers
- [ ] Performance benchmarks for large Document360 projects (1000+ pages)
- [ ] Template validation and generation testing for all supported configurations
- [ ] End-to-end workflow testing from Document360 archive to deployed MkDocs site

### 4.3 Documentation and User Guides
- [ ] Create comprehensive MkDocs export documentation with API reference
- [ ] Add usage examples for different scenarios (Material theme, custom plugins)
- [ ] Document template customization and plugin configuration options
- [ ] Create troubleshooting guide for common issues and error resolution
- [ ] Add performance optimization guide for large documentation projects

### 4.4 Quality Assurance and Validation
- [ ] Implement export validation with content quality reporting
- [ ] Add broken link detection and resolution for internal Document360 links
- [ ] Create image optimization validation and missing asset detection
- [ ] Build SEO validation for generated MkDocs sites (meta tags, social cards)
- [ ] Add accessibility compliance checking and reporting

---

## Phase 5: Advanced Features and Optimization (Week 9-10)

### 5.1 Advanced Export Features
- [ ] Multi-site export for large Documentation projects with cross-site linking
- [ ] Incremental build support for faster iterations and CI/CD integration
- [ ] Advanced caching strategies for improved performance with large archives
- [ ] Custom plugin development framework for extending MkDocs export capabilities
- [ ] Export validation and quality reporting with detailed analytics

### 5.2 Production Readiness and Optimization
- [ ] Performance profiling and optimization for memory and CPU usage
- [ ] Memory usage optimization for large archives (>10GB Document360 exports)
- [ ] Error handling and graceful degradation for network failures and malformed content
- [ ] Monitoring and observability integration with metrics and health checks
- [ ] Production deployment documentation with Docker and CI/CD examples

### 5.3 Enterprise Features
- [ ] Multi-tenant support for hosting multiple Document360 exports
- [ ] Advanced security features (content sanitization, access control)
- [ ] Backup and recovery mechanisms for generated MkDocs sites
- [ ] Analytics integration for tracking documentation usage and performance
- [ ] API rate limiting and throttling for large-scale Document360 API usage

### 5.4 Future-Proofing and Extensibility
- [ ] Plugin API for third-party MkDocs theme and extension integration
- [ ] Webhook support for automated rebuilds on Document360 content changes
- [ ] GraphQL API for querying exported content metadata and structure
- [ ] Integration hooks for content management systems and wikis
- [ ] Extensible template system for supporting additional static site generators

---

## Success Criteria and Validation

### Technical Excellence
- [ ] **Performance**: Export 1000+ page Document360 archive to MkDocs in <5 minutes
- [ ] **Quality**: >95% link resolution accuracy with automated validation
- [ ] **Compatibility**: Support for all major MkDocs themes and popular plugins
- [ ] **Test Coverage**: >90% test coverage for all MkDocs export functionality
- [ ] **Documentation**: Complete API documentation and user guides

### User Experience
- [ ] **Ease of Use**: Single command export from Document360 to production MkDocs site
- [ ] **Customization**: Template-based configuration for different use cases
- [ ] **Integration**: Seamless integration with existing CI/CD pipelines
- [ ] **Error Handling**: Clear error messages with actionable troubleshooting steps
- [ ] **Migration**: Smooth migration path from legacy vexy-help MkDocs workflows

### Business Impact
- [ ] **Code Reusability**: d361 MkDocs export works for any Document360 project
- [ ] **Clean Separation**: vexy-help contains no Document360-specific export code
- [ ] **Maintainability**: Reduced code duplication and clear responsibility boundaries
- [ ] **Extensibility**: Template and plugin system allows easy customization
- [ ] **Production Readiness**: Enterprise-grade export with monitoring and optimization

---

**Total Tasks: 75+ MkDocs export enhancement items**

**Timeline: 10 weeks for complete d361 MkDocs export enhancement**

This enhancement will transform d361 into the definitive Document360 → MkDocs conversion toolkit, providing enterprise-grade capabilities with modern MkDocs features, comprehensive plugin support, and production-ready performance.
</document_content>
</document>

<document index="9">
<source>d361.spec</source>
<document_content>
# this_file: d361.spec
# PyInstaller spec file for d361

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None

a = Analysis(
    ['src/d361/offline/__main__.py'],
    pathex=[],
    binaries=[],
    datas=[
        ('src/d361/offline/d361_offline.css', 'd361/offline'),
    ],
    hiddenimports=[
        'playwright',
        'playwright.async_api',
        'aiohttp',
        'aiofiles',
        'beautifulsoup4',
        'bs4',
        'lxml',
        'markdownify',
        'html2text',
        'tenacity',
        'pydantic',
        'loguru',
        'fire',
    ],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    win_no_prefer_redirects=False,
    win_private_assemblies=False,
    cipher=block_cipher,
    noarchive=False,
)

pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)

exe = EXE(
    pyz,
    a.scripts,
    a.binaries,
    a.zipfiles,
    a.datas,
    [],
    name='d361-offline',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    upx_exclude=[],
    runtime_tmpdir=None,
    console=True,
    disable_windowed_traceback=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
)
</document_content>
</document>

<document index="10">
<source>data/offline/README.md</source>
<document_content>
# D361Offline

A tool for generating offline documentation from Document360 sites.

## Features

- Extract URLs from a sitemap
- Extract navigation structure from Document360 pages
- Fetch and process HTML content
- Generate static HTML and Markdown documentation

## Installation

```bash
pip install -e .
```

Or with uv:

```bash
uv pip install -e .
```

## Usage

### Command Line Interface

```bash
# Extract sitemap and navigation
d361-offline prep --map-url=https://docs.document360.com/sitemap-en.xml --output-dir=docs

# Download content for all URLs
d361-offline fetch --prep-file=docs/prep.json

# Build HTML and Markdown files
d361-offline build --fetch-file=docs/fetch.json

# Run all steps at once
d361-offline all --map-url=https://docs.document360.com/sitemap-en.xml --output-dir=docs
```

### Python API

```python
import asyncio
from d361_offline import D361Offline
from d361_offline.config import Config

# Configure
config = Config(
    map_url="https://docs.document360.com/sitemap-en.xml",
    output_dir="docs"
)

# Initialize
offline = D361Offline(config)

# Run the process
async def main():
    # Step by step
    await offline.prep()
    await offline.fetch()
    await offline.build()
    
    # Or all at once
    # await offline.all()

# Execute
asyncio.run(main())
```

## Options

| Option | Description |
|--------|-------------|
| `--map-url` | URL of the sitemap.xml file |
| `--nav-url` | Navigation page URL (if different from sitemap URLs) |
| `--output-dir` | Output directory (defaults to domain name) |
| `--css-file` | Custom CSS file path |
| `--effort` | Processing level (1-3, higher = more aggressive) |
| `--max-concurrent` | Maximum concurrent requests |
| `--retries` | Retry attempts for failed requests |
| `--timeout` | Page load timeout in seconds |
| `--verbose` | Enable verbose logging |
| `--test` | Test mode with limited output |
| `--pause` | Delay between requests in seconds |

## Development

Requires Python 3.11+ and Playwright.

```bash
# Install dependencies
uv pip install -e ".[dev]"

# Install Playwright browsers
playwright install chromium

# Run tests
pytest

# Format code
ruff check --fix . && ruff format .
```

## License

MIT
</document_content>
</document>

<document index="11">
<source>data/offline/d360_getsitenav.md</source>
<document_content>
# d360_getsitenav

Python Fire CLI tool using Playwright to:

- Navigate to https://docs.document360.com/docs/
- Target the navigation panel: `#left-panel > div.catergory-list > site-category-list-tree-view > d360-data-list-tree-view`
- Recursively expand all collapsible sections by clicking triangle icons
- Scroll to reveal all content
- Extract and collect all navigation links
- Process links upward through the hierarchy until complete
- Include links from https://docs.document360.com/s
</document_content>
</document>

# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/data/offline/d360_getsitenav.py
# Language: python

import json
from urllib.parse import urljoin
import fire
from playwright.sync_api import sync_playwright

BASE_URL = =

def scroll_to_bottom((page, tree_view)) -> None:

def expand_all_items((page, tree_view)) -> None:

def scroll_to_bottom((page, tree_view)) -> None:

def extract_tree((tree_view)):

def generate_markdown((tree, filepath)) -> None:

def build_md((node, level=0)):

def generate_html((tree, filepath)) -> None:

def build_html((node)):

def generate_json((tree, filepath)) -> None:

def main((md_file="nav.md", html_file="nav.html", json_file="nav.json")) -> None:


<document index="12">
<source>data/offline/d360_makesite.md</source>
<document_content>
# d360_makesite

A Python CLI tool that consolidates downloaded Document360 documentation into a single HTML file and a single Markdown file.

## 1. Read the TOC

Read the table of contents generated by `d360_getsitenav.py`. It contains links in this general format:

```html
<li xmlns="http://www.w3.org/1999/xhtml">
  <a href="/docs/creating-a-sandbox-project">
    <span>Creating a sandbox project</span>
  </a>
</li>
```

### 1.1. Parse the links

The local `docs` folder contains files like `creating-a-sandbox-project.html`. Convert TOC links to relative file paths.

## 2. Read each page

### 2.1. Extract the title

From each page, extract the title using:

```css
#main-content > d360-article-header > div.d-flex.justify-content-between.align-items-center.mb-3 > h1
```

or the equivalent XPath:

```xpath
//*[@id="main-content"]/d360-article-header/div[1]/h1
```

Example HTML:

```html
<h1 _ngcontent-serverapp-c2150518017="" class="article-title"> Creating a sandbox project </h1>
```

### 2.2. Extract the content

Extract the main article content using:

```css
#articleContent
```

or the equivalent XPath:

```xpath
//*[@id="articleContent"]
```

Example HTML:

```html
<article _ngcontent-serverapp-c3082681425="" id="articleContent" class="block-article">
  <p data-block-id="8963fc1c-9933-4271-aeba-f2278090bd13">
    <strong>Plans supporting for creating a Sandbox project</strong>
  </p>
  <div contenteditable="false" translate="no" data-snippet="Ent plan supported" class="fr-deletable" id="blocksnippet">
    <table style="width: 100%;">
      <thead>
        <tr>(...)</tr>
      </thead>
    </table>
  </div>
</article>
```

## 3. Compile a complete document

### 3.1. HTML document

Generate a complete HTML file with this structure:

```html
<html>
  <body>
    <aside>
      <nav>
        <!-- original nav with relative links -->
      </nav>
    </aside>
    <main>
      <div id="<!-- original filename without .html -->">
        <h1>...</h1>
        <!-- title -->
        <article>...</article>
        <!-- article content -->
      </div>
      <!-- repeat for each page -->
    </main>
  </body>
</html>
```

### 3.2. Markdown document

Convert the compiled HTML document to Markdown using `html2text`.
</document_content>
</document>

# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/data/offline/d360_makesite.py
# Language: python

import asyncio
from pathlib import Path
from typing import Any, cast
import fire
import html2text
import tqdm
import tqdm.asyncio
from bs4 import BeautifulSoup, Tag
from loguru import logger
from rich.console import Console
from playwright.async_api import async_playwright
import asyncio
import asyncio
from playwright.async_api import async_playwright
import asyncio
from playwright.async_api import TimeoutError
import random

SCRIPT_DIR = =
DEFAULT_CSS_PATH = =
PLAYWRIGHT_TIMEOUT = =
PLAYWRIGHT_RETRY_COUNT = =
USER_AGENT = =

class Document360Extractor:
    def __init__((
        self,
        nav_file: str | None = None,
        docs_dir: str = "docs",
        output_html: str = "document360_docs.html",
        output_md: str = "document360_docs.md",
        site_url: str | None = None,
        css_file: str | None = None,
        *,
        pages: int | None = None,
        verbose: bool = False,
        email: str | None = None,
        password: str | None = None,
    )) -> None:
    def parse_toc((self)) -> list[dict[str, str]]:
    def _parse_toc_from_file((self)) -> list[dict[str, str]]:
    def _setup_browser((self)):
    def _parse_toc_from_site_async((self)):
    def _parse_toc_from_site((self)) -> list[dict[str, str]]:
    def extract_article_content((self, source: str)) -> dict[str, Any]:
    def _extract_content_from_file((self, file_path: str)) -> dict[str, Any]:
    def _extract_content_from_site((self, url: str)) -> dict[str, Any]:
    def _extract_content_from_site_async((self, url: str)) -> dict[str, Any]:
    def process_articles_async((self)) -> dict[str, dict[str, Any]]:
    def process_articles((self)) -> dict[str, dict[str, Any]]:
    def generate_html_document((self)) -> str:
    def generate_markdown_document((self, html_document: str)) -> str:
    def run((self)) -> tuple[str, str]:

def load_css((css_path: str | None = None)) -> str:

def __init__((
        self,
        nav_file: str | None = None,
        docs_dir: str = "docs",
        output_html: str = "document360_docs.html",
        output_md: str = "document360_docs.md",
        site_url: str | None = None,
        css_file: str | None = None,
        *,
        pages: int | None = None,
        verbose: bool = False,
        email: str | None = None,
        password: str | None = None,
    )) -> None:

def parse_toc((self)) -> list[dict[str, str]]:

def _parse_toc_from_file((self)) -> list[dict[str, str]]:

def _setup_browser((self)):

def _parse_toc_from_site_async((self)):

def _parse_toc_from_site((self)) -> list[dict[str, str]]:

def extract_article_content((self, source: str)) -> dict[str, Any]:

def _extract_content_from_file((self, file_path: str)) -> dict[str, Any]:

def _extract_content_from_site((self, url: str)) -> dict[str, Any]:

def get_content_from_url(()):

def _extract_content_from_site_async((self, url: str)) -> dict[str, Any]:

def process_articles_async((self)) -> dict[str, dict[str, Any]]:

def process_with_semaphore((
                i: int, link: dict[str, str]
            )) -> tuple[str, dict[str, Any]]:

def process_local_file((
                link: dict[str, str],
            )) -> tuple[str, dict[str, Any]]:

def process_articles((self)) -> dict[str, dict[str, Any]]:

def generate_html_document((self)) -> str:

def generate_markdown_document((self, html_document: str)) -> str:

def run((self)) -> tuple[str, str]:

def main((
    nav: str | None = None,
    docs_dir: str = "docs",
    html: str = "document360_docs.html",
    md: str = "document360_docs.md",
    site: str | None = None,
    css: str | None = None,
    pages: int | None = None,
    *,
    email: str | None = None,
    password: str | None = None,
    verbose: bool = False,
)) -> None:


<document index="13">
<source>data/offline/d361_offline.css</source>
<document_content>
:root {
    --font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
    --font-mono: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
    --font-serif: Georgia, Cambria, "Times New Roman", Times, serif;
    
    --color-background: #ffffff;
    --color-text: #333333;
    --color-text-muted: #666666;
    --color-link: #0366d6;
    --color-link-hover: #2188ff;
    --color-border: #e1e4e8;
    --color-heading: #24292e;
    --color-code-bg: #f6f8fa;
    --color-blockquote: #f0f4f8;
    --color-sidebar-bg: #f8f9fa;
    
    --spacing-unit: 16px;
    --content-width: 760px;
    --sidebar-width: 280px;
}

@media (prefers-color-scheme: dark) {
    :root {
        --color-background: #0d1117;
        --color-text: #c9d1d9;
        --color-text-muted: #8b949e;
        --color-link: #58a6ff;
        --color-link-hover: #79c0ff;
        --color-border: #30363d;
        --color-heading: #e6edf3;
        --color-code-bg: #161b22;
        --color-blockquote: #161b22;
        --color-sidebar-bg: #0d1117;
    }
}

html {
    box-sizing: border-box;
    font-size: 16px;
    -webkit-text-size-adjust: 100%;
}

*, *:before, *:after {
    box-sizing: inherit;
}

body {
    margin: 0;
    padding: 0;
    font-family: var(--font-sans);
    line-height: 1.6;
    color: var(--color-text);
    background-color: var(--color-background);
    display: flex;
    min-height: 100vh;
    font-size: 1rem;
}

/* Layout */
aside {
    position: fixed;
    width: var(--sidebar-width);
    height: 100vh;
    overflow-y: auto;
    padding: var(--spacing-unit);
    border-right: 1px solid var(--color-border);
    background-color: var(--color-sidebar-bg);
}

aside nav ul {
    padding-left: 0;
    list-style-type: none;
}

aside nav li {
    margin-bottom: calc(var(--spacing-unit) / 2);
}

aside nav li a {
    display: block;
    padding: calc(var(--spacing-unit) / 4) 0;
    text-decoration: none;
    color: var(--color-text);
    border-radius: 4px;
    transition: color 0.2s ease;
}

aside nav li a:hover {
    color: var(--color-link-hover);
}

main {
    flex: 1;
    padding: var(--spacing-unit) var(--spacing-unit) var(--spacing-unit) calc(var(--sidebar-width) + var(--spacing-unit));
    max-width: calc(var(--content-width) + var(--sidebar-width) + var(--spacing-unit));
    margin: 0 auto;
}

/* Typography */
h1, h2, h3, h4, h5, h6 {
    margin-top: calc(var(--spacing-unit) * 2);
    margin-bottom: var(--spacing-unit);
    font-weight: 600;
    line-height: 1.25;
    color: var(--color-heading);
}

h1 { font-size: 2em; border-bottom: 1px solid var(--color-border); padding-bottom: calc(var(--spacing-unit) / 2); }
h2 { font-size: 1.5em; border-bottom: 1px solid var(--color-border); padding-bottom: calc(var(--spacing-unit) / 2); }
h3 { font-size: 1.25em; }
h4 { font-size: 1em; }
h5 { font-size: 0.875em; }
h6 { font-size: 0.85em; color: var(--color-text-muted); }

p, ul, ol, dl, blockquote, table, pre {
    margin-top: 0;
    margin-bottom: var(--spacing-unit);
}

a {
    color: var(--color-link);
    text-decoration: none;
    transition: color 0.2s ease;
}

a:hover {
    color: var(--color-link-hover);
    text-decoration: underline;
}

code, pre {
    font-family: var(--font-mono);
    font-size: 0.9em;
    background-color: var(--color-code-bg);
    border-radius: 3px;
}

code {
    padding: 0.2em 0.4em;
}

pre {
    padding: var(--spacing-unit);
    overflow-x: auto;
    line-height: 1.45;
    border-radius: 6px;
}

pre code {
    padding: 0;
    background-color: transparent;
}

blockquote {
    margin-left: 0;
    padding: var(--spacing-unit);
    background-color: var(--color-blockquote);
    border-left: 4px solid var(--color-border);
}

table {
    border-collapse: collapse;
    width: 100%;
}

table th, table td {
    padding: 8px 12px;
    border: 1px solid var(--color-border);
}

table th {
    background-color: var(--color-code-bg);
    font-weight: 600;
}

img {
    max-width: 100%;
    height: auto;
}

/* Custom styles for article content */
#articleContent {
    margin-bottom: calc(var(--spacing-unit) * 3);
}

/* Responsive adjustments */
@media screen and (max-width: 900px) {
    :root {
        --sidebar-width: 220px;
    }
    
    body {
        font-size: 0.95rem;
    }
}

@media screen and (max-width: 768px) {
    body {
        flex-direction: column;
    }
    
    aside {
        position: static;
        width: 100%;
        height: auto;
        border-right: none;
        border-bottom: 1px solid var(--color-border);
    }
    
    main {
        padding: var(--spacing-unit);
        max-width: var(--content-width);
        margin: 0 auto;
    }
} 
</document_content>
</document>

<document index="14">
<source>data/offline/d361_offline.md</source>
<document_content>
The tool:

- map: url = "https://docs.document360.com/sitemap-en.xml" # sitemap defining job scope (all links)
- nav: url # page to gather navigation, uses first sitemap link if not provided
- dir: str | Path # work folder, defaults to cwd + domain of map url (e.g., "./site.document360.com") 
- css: str | Path # path to CSS file for site.html, defaults to `d361_offline`
- effort: bool = False # attempt to mirror all map links in navigation

## prep phase

- Read the `map` and build a flat list of target URLs

- Visit the `nav` page and extract navigation structure. Map page URLs between the sitemap and navigation. If `effort` is True, aggressively match all sitemap links.

- FIXME: Write `nav.json`, `nav.md`, and `nav.html` files to `dir`

## fetch phase

- Create `html` and `md` folders in `dir`

- Mirror all pages from `map` into `html` folder, storing only H1 and article elements. Use `map` as it's flat and authoritative.

- Convert each HTML file to markdown and save in `md` folder

## build phase

- With all pages and navigation data collected, build final output files

- Create single `site.html` and `site.md` files combining all content
</document_content>
</document>

<document index="15">
<source>data/offline/nav.html</source>
<document_content>
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document360 Navigation Tree</title>
</head>
<body>
<h1>Navigation Tree</h1>
  <li><a href="https://docs.document360.com/docs/getting-started">Getting started</a>
  <li><a href="https://docs.document360.com/docs/document360-getting-started">What is Document360?</a>
</li>
  <li><a href="https://docs.document360.com/docs/sign-up-to-document-360">Sign up to Document360</a>
</li>
  <li><a href="https://docs.document360.com/docs/system-and-browser-requirements">System and browser requirements</a>
</li>
  <li><a href="https://docs.document360.com/docs/understanding-basic-structure">Understanding basic structure</a>
  <li><a href="https://docs.document360.com/docs/document360-my-projects">Project dashboard</a>
</li>
  <li><a href="https://docs.document360.com/docs/top-right-menu-overview">Top-right menu overview</a>
</li>
  <li><a href="https://docs.document360.com/docs/creating-a-project">Creating a project in Document360</a>
</li>
  <li><a href="https://docs.document360.com/docs/dashboard">Dashboard</a>
</li>
  <li><a href="https://docs.document360.com/docs/workspaces-1">Workspaces</a>
</li>
  <li><a href="https://docs.document360.com/docs/getting-started-with-multi-lingual-knowledge-base">Multilingual Knowledge bases</a>
</li>
  <li><a href="https://docs.document360.com/docs/creating-a-sandbox-project">Creating a sandbox project</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/security">Security</a>
  <li><a href="https://docs.document360.com/docs/quick-summary-of-the-security-and-infrastructure-aspects">Document360 security and infrastructure</a>
</li>
  <li><a href="https://docs.document360.com/docs/x-frame-options">X-Frame options</a>
</li>
  <li><a href="https://docs.document360.com/docs/content-security-policy">Content security policy</a>
</li>
  <li><a href="https://docs.document360.com/docs/csp-guidelines-for-document360-widget">CSP and Whitelisting guidelines for Document360 widget</a>
</li>
  <li><a href="https://docs.document360.com/docs/bot-management">Bot management</a>
</li>
  <li><a href="https://docs.document360.com/docs/fair-usage-policy-for-bot-management">Fair usage policy for bot management</a>
</li>
  </li>
  </li>
  <li><a href="https://docs.document360.com/docs/editor">Editor choices</a>
  <li><a href="https://docs.document360.com/docs/using-the-text-editor">Editor choices in Document360</a>
</li>
  <li><a href="https://docs.document360.com/docs/elements-of-the-editor">Elements of the editor</a>
</li>
  <li><a href="https://docs.document360.com/docs/markdown-editor-overview">Markdown editor</a>
  <li><a href="https://docs.document360.com/docs/markdown-basics">Basic Markdown syntax</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/wysiwyg-editor">WYSIWYG editor</a>
</li>
  <li><a href="https://docs.document360.com/docs/advanced-wysiwyg-editor-overview">Advanced WYSIWYG editor</a>
  <li><a href="https://docs.document360.com/docs/advanced-wysiwyg-editor">Advanced WYSIWYG editor</a>
</li>
  <li><a href="https://docs.document360.com/docs/advanced-wysiwyg-editor-basics">Advanced WYSIWYG editor basics</a>
</li>
  <li><a href="https://docs.document360.com/docs/movable-blocks-in-advanced-wysiwyg-editor">Movable blocks in Advanced WYSIWYG editor</a>
</li>
  <li><a href="https://docs.document360.com/docs/conditional-content-blocks">Conditional content blocks in Advanced WYSIWYG editor</a>
</li>
  <li><a href="https://docs.document360.com/docs/tables-in-advanced-wysiwyg-editor">Tables in Advanced WYSIWYG editor</a>
</li>
  <li><a href="https://docs.document360.com/docs/image-formatting-in-the-advanced-wysiwyg-editor">Image formatting in the Advanced WYSIWYG editor</a>
</li>
  <li><a href="https://docs.document360.com/docs/tabs-in-the-advanced-wysiwyg-editor">Tabs in the Advanced WYSIWYG editor</a>
</li>
  </li>
  </li>
  <li><a href="https://docs.document360.com/docs/categories-articles">Managing content</a>
  <li><a href="https://docs.document360.com/docs/categories-and-subcategories">Categories and subcategories</a>
  <li><a href="https://docs.document360.com/docs/managing-categories">Managing categories</a>
</li>
  <li><a href="https://docs.document360.com/docs/category-types">Category types</a>
</li>
  <li><a href="https://docs.document360.com/docs/assigning-drive-folder-for-a-category">Mapping a category with a folder in Drive</a>
</li>
  <li><a href="https://docs.document360.com/docs/downloading-category-and-article-in-kb-site">Downloading category and article in KB site</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/article">Articles</a>
  <li><a href="https://docs.document360.com/docs/managing-articles">Managing articles</a>
</li>
  <li><a href="https://docs.document360.com/docs/article-import-from-word-files">Word .docx files</a>
</li>
  <li><a href="https://docs.document360.com/docs/publishing-an-article">Publishing an article</a>
</li>
  <li><a href="https://docs.document360.com/docs/reviewing-an-article-inline-comments">Reviewing an article using Inline comments</a>
</li>
  <li><a href="https://docs.document360.com/docs/adding-images-to-articles">Adding images to articles</a>
</li>
  <li><a href="https://docs.document360.com/docs/adding-videos-in-articles">Adding videos in articles</a>
</li>
  <li><a href="https://docs.document360.com/docs/adding-files-to-articles">Adding files to article</a>
</li>
  <li><a href="https://docs.document360.com/docs/linking-to-other-articles">Adding hyperlinks</a>
</li>
  <li><a href="https://docs.document360.com/docs/code-blocks">Code blocks</a>
</li>
  <li><a href="https://docs.document360.com/docs/private-notes">Adding private notes</a>
</li>
  <li><a href="https://docs.document360.com/docs/embedding-microsoft-streams-video-in-articles">Embedding Stream videos in articles</a>
</li>
  <li><a href="https://docs.document360.com/docs/embedding-google-forms-in-article">Embedding Google forms in articles</a>
</li>
  <li><a href="https://docs.document360.com/docs/embedding-a-drawio-diagram">Embedding a Draw.io diagram</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/bulk-operations-overview">All articles</a>
  <li><a href="https://docs.document360.com/docs/all-articles-overview-page">All articles - Overview page</a>
</li>
  <li><a href="https://docs.document360.com/docs/filter-bulk-operations">Using filters in All articles page</a>
</li>
  <li><a href="https://docs.document360.com/docs/export-bulk-operations">Export All articles list</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/article-management">Article settings</a>
  <li><a href="https://docs.document360.com/docs/review-reminders">Article review reminder</a>
</li>
  <li><a href="https://docs.document360.com/docs/article-seo">Article SEO</a>
</li>
  <li><a href="https://docs.document360.com/docs/excluding-articles-from-searches">Excluding articles from search engines</a>
</li>
  <li><a href="https://docs.document360.com/docs/changing-the-url-of-an-article">Change the URL of an article</a>
</li>
  <li><a href="https://docs.document360.com/docs/article-tags">Article tags</a>
</li>
  <li><a href="https://docs.document360.com/docs/adding-article-labels">Add article labels</a>
</li>
  <li><a href="https://docs.document360.com/docs/related-articles">Related articles</a>
</li>
  <li><a href="https://docs.document360.com/docs/featured-image">Featured image</a>
</li>
  <li><a href="https://docs.document360.com/docs/attachments">Attachments</a>
</li>
  <li><a href="https://docs.document360.com/docs/status-indicator">Status indicator</a>
</li>
  <li><a href="https://docs.document360.com/docs/article-status">Article status</a>
</li>
  <li><a href="https://docs.document360.com/docs/preferences">Preferences</a>
</li>
  <li><a href="https://docs.document360.com/docs/showhide-table-of-contents-for-an-article">Show/hide table of contents for an article</a>
</li>
  <li><a href="https://docs.document360.com/docs/marking-articles-as-deprecated">Mark as deprecated</a>
</li>
  <li><a href="https://docs.document360.com/docs/updating-article-contributors">Update article contributors</a>
</li>
  <li><a href="https://docs.document360.com/docs/schedule-publishing">Schedule publishing</a>
</li>
  <li><a href="https://docs.document360.com/docs/article-discussion-feed">Discussion feed</a>
</li>
  <li><a href="https://docs.document360.com/docs/revision-history">Revision history</a>
</li>
  <li><a href="https://docs.document360.com/docs/article-analytics">Article analytics</a>
</li>
  <li><a href="https://docs.document360.com/docs/article-access-control-knowledge-base-site">Security - Article access control</a>
</li>
  <li><a href="https://docs.document360.com/docs/health-check-metrics">Health check metrics</a>
</li>
  <li><a href="https://docs.document360.com/docs/readability-score">Readability score</a>
</li>
  <li><a href="https://docs.document360.com/docs/sitemap-generator">Sitemap</a>
</li>
  <li><a href="https://docs.document360.com/docs/public-comments">Public article comments</a>
</li>
  <li><a href="https://docs.document360.com/docs/robotstxt">Robots.txt</a>
</li>
  <li><a href="https://docs.document360.com/docs/read-receipt">Read receipt</a>
</li>
  <li><a href="https://docs.document360.com/docs/share-articles-via-private-link">Share articles via private link</a>
</li>
  </li>
  </li>
  <li><a href="https://docs.document360.com/docs/ai-features">AI features</a>
  <li><a href="https://docs.document360.com/docs/ai-customization">Eddy AI customization</a>
</li>
  <li><a href="https://docs.document360.com/docs/ai-machine-translation">AI machine translation</a>
</li>
  <li><a href="https://docs.document360.com/docs/eddy-ai-trust-page">Eddy AI trust page</a>
</li>
  <li><a href="https://docs.document360.com/docs/ai-writer-suite">AI writer suite</a>
  <li><a href="https://docs.document360.com/docs/ai-writer">AI writer</a>
</li>
  <li><a href="https://docs.document360.com/docs/ai-faq-generator">AI FAQ generator</a>
</li>
  <li><a href="https://docs.document360.com/docs/ai-title-recommender">AI title recommender</a>
</li>
  <li><a href="https://docs.document360.com/docs/seo-description-generator">AI SEO description generator</a>
</li>
  <li><a href="https://docs.document360.com/docs/ai-tag-recommender">AI tag recommender</a>
</li>
  <li><a href="https://docs.document360.com/docs/ai-related-articles-recommender">AI related articles recommender</a>
</li>
  <li><a href="https://docs.document360.com/docs/ai-chart-generator">AI Chart generator</a>
</li>
  <li><a href="https://docs.document360.com/docs/ai-alt-text-generator">AI alt text generator</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/ai-search-suite">AI search suite</a>
  <li><a href="https://docs.document360.com/docs/ai-assistive-search-ask-eddy">AI assistive search (Ask Eddy AI)</a>
</li>
  <li><a href="https://docs.document360.com/docs/eddy-search-analytics-1">Eddy AI search analytics</a>
</li>
  <li><a href="https://docs.document360.com/docs/ai-dynamic-related-articles-recommendation">AI dynamic related articles recommendation</a>
</li>
  <li><a href="https://docs.document360.com/docs/ai-chatbot">AI Chatbot</a>
  <li><a href="https://docs.document360.com/docs/securing-chatbot-authentication-using-jwt">Securing Chatbot authentication using JWT</a>
</li>
  <li><a href="https://docs.document360.com/docs/styling-the-chatbot">Styling the Chatbot</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/eddy-ai-federated-search">Adding external sources for AI Assistive search</a>
</li>
  <li><a href="https://docs.document360.com/docs/ai-article-summarizer">AI article summarizer</a>
</li>
  <li><a href="https://docs.document360.com/docs/ask-eddy-ai-api">Ask Eddy AI API</a>
</li>
  <li><a href="https://docs.document360.com/docs/text-to-voice-functionality">Enhancing accessibility with our read out loud feature</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/ai-premium-suite">AI premium suite</a>
  <li><a href="https://docs.document360.com/docs/ai-glossary-generator">AI glossary generator</a>
</li>
  </li>
  <li>AI tips and tricks
  <li><a href="https://docs.document360.com/docs/how-to-write-genai-friendly-content">How to write GenAI friendly content</a>
</li>
  <li><a href="https://docs.document360.com/docs/prompt-engineering-tips">Prompt engineering tips</a>
</li>
  </li>
  </li>
  <li><a href="https://docs.document360.com/docs/drive">File management</a>
  <li><a href="https://docs.document360.com/docs/adding-folders-and-files">Adding folders and files</a>
</li>
  <li><a href="https://docs.document360.com/docs/folder-actions-in-drive">Folder actions in Drive</a>
</li>
  <li><a href="https://docs.document360.com/docs/file-actions-in-drive">File actions in Drive</a>
</li>
  <li><a href="https://docs.document360.com/docs/all-content-overview">All files overview</a>
</li>
  <li><a href="https://docs.document360.com/docs/recycle-bin-recent-and-starred-files">Recent, Starred, and Recycle bin files</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/content-tools">Content tools</a>
  <li><a href="https://docs.document360.com/docs/workflow">Workflows</a>
  <li><a href="https://docs.document360.com/docs/workflow-designer">Workflow designer</a>
</li>
  <li><a href="https://docs.document360.com/docs/managing-workflow-status">Managing workflow status</a>
</li>
  <li><a href="https://docs.document360.com/docs/workflow-assignment">Workflow assignment</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/content-reuse">Content reuse</a>
  <li><a href="https://docs.document360.com/docs/article-templates">Templates</a>
</li>
  <li><a href="https://docs.document360.com/docs/variables">Variables</a>
</li>
  <li><a href="https://docs.document360.com/docs/snippets">Snippet</a>
</li>
  <li><a href="https://docs.document360.com/docs/glossary">Glossary</a>
  <li><a href="https://docs.document360.com/docs/adding-glossary-term">Adding glossary terms</a>
</li>
  <li><a href="https://docs.document360.com/docs/adding-glossary-term-in-articles">Inserting glossary term in an article</a>
</li>
  <li><a href="https://docs.document360.com/docs/editing-and-deleting-glossary-term">Managing glossary terms</a>
</li>
  <li><a href="https://docs.document360.com/docs/glossary-overview-page">Managing the glossary landing page</a>
</li>
  </li>
  </li>
  <li><a href="https://docs.document360.com/docs/feedback-manager-overview">Feedback manager</a>
</li>
  <li><a href="https://docs.document360.com/docs/custom-pages">Custom pages</a>
</li>
  <li><a href="https://docs.document360.com/docs/tags">Tags</a>
  <li><a href="https://docs.document360.com/docs/tag-manager-overview-page">Manage tags page overview</a>
</li>
  <li><a href="https://docs.document360.com/docs/adding-a-new-tag">Adding a new tag</a>
</li>
  <li><a href="https://docs.document360.com/docs/tag-groups-overview">Tag groups page overview</a>
</li>
  <li><a href="https://docs.document360.com/docs/tag-dependency-viewer">Manage tag dependencies</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/content-essentials">Content essentials</a>
  <li><a href="https://docs.document360.com/docs/find-and-replace">Find and replace</a>
</li>
  <li><a href="https://docs.document360.com/docs/seo-descriptions">SEO descriptions</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/import-export">Import & Export project/article</a>
  <li><a href="https://docs.document360.com/docs/export-documentation-as-zip">Exporting your Document360 project as a ZIP file</a>
</li>
  <li><a href="https://docs.document360.com/docs/import-a-documentation-project">Importing a Document360 project ZIP file</a>
</li>
  <li><a href="https://docs.document360.com/docs/migrating-documentation-from-another-knowledge-base-platform">Migrating documentation from other platforms</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/export-to-pdf">Export to PDF</a>
  <li><a href="https://docs.document360.com/docs/pdf-design-templates">Designing a PDF template</a>
</li>
  <li><a href="https://docs.document360.com/docs/compliling-content-for-pdf">Compiling content for PDF</a>
</li>
  </li>
  </li>
  <li><a href="https://docs.document360.com/docs/analytics">Analytics</a>
  <li><a href="https://docs.document360.com/docs/articles-analytics">Articles analytics</a>
</li>
  <li><a href="https://docs.document360.com/docs/eddy-ai-search-analytics">Eddy AI search analytics</a>
</li>
  <li><a href="https://docs.document360.com/docs/analytics-search">Search analytics</a>
</li>
  <li><a href="https://docs.document360.com/docs/reader-analytics">Reader analytics</a>
</li>
  <li><a href="https://docs.document360.com/docs/analytics-team-accounts">Team accounts analytics</a>
</li>
  <li><a href="https://docs.document360.com/docs/feedback">Feedback analytics</a>
</li>
  <li><a href="https://docs.document360.com/docs/links-status">Links status analytics</a>
</li>
  <li><a href="https://docs.document360.com/docs/page-not-found-analytics">Page not found analytics</a>
</li>
  <li><a href="https://docs.document360.com/docs/ticket-deflector-overview">Ticket deflector analytics</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/api-documentation-tool">API Documentation</a>
  <li><a href="https://docs.document360.com/docs/api-documentation-getting-started">Getting started with API documentation</a>
</li>
  <li><a href="https://docs.document360.com/docs/manage-api-documentation">Managing API documentation</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/knowledge-base-widget">Knowledge base widget</a>
  <li><a href="https://docs.document360.com/docs/knowledge-base-widget-getting-started">Knowledge base widget - Getting started</a>
</li>
  <li><a href="https://docs.document360.com/docs/installing-the-knowledge-base-widget">Installing the Knowledge base widget</a>
</li>
  <li><a href="https://docs.document360.com/docs/edit-clone-and-delete">Edit, Clone, and Delete widget</a>
</li>
  <li><a href="https://docs.document360.com/docs/managing-and-customizing-the-knowledge-base-widget">Managing and customizing the Knowledge base widget</a>
</li>
  <li><a href="https://docs.document360.com/docs/url-mapping">URL Mapping</a>
</li>
  <li><a href="https://docs.document360.com/docs/customizing-the-kb-widget-using-custom-css-javascript">Customizing the Knowledge base widget using Custom CSS/JavaScript</a>
</li>
  <li><a href="https://docs.document360.com/docs/faq-knowledge-base-widget">FAQ - Knowledge base widget</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/design-and-styling-knowledge-base-site">Knowledge base site</a>
  <li><a href="https://docs.document360.com/docs/knowledge-base-site-20">Knowledge base site 2.0</a>
</li>
  <li><a href="https://docs.document360.com/docs/customize-site">Customize site</a>
  <li><a href="https://docs.document360.com/docs/kb-site-20-migration">KB site 2.0 migration</a>
</li>
  <li><a href="https://docs.document360.com/docs/web-content-accessibility-guidelines-wcag">Web Content Accessibility Guidelines (WCAG)</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/site-header-and-footer">Site header and footer</a>
  <li><a href="https://docs.document360.com/docs/header-primary-navigation">Header - Primary navigation</a>
</li>
  <li><a href="https://docs.document360.com/docs/header-secondary-navigation">Header - Secondary navigation</a>
</li>
  <li><a href="https://docs.document360.com/docs/footer-navigation">Footer</a>
</li>
  <li><a href="https://docs.document360.com/docs/custom-footer">Custom footer</a>
</li>
  <li><a href="https://docs.document360.com/docs/rss-feeds">RSS Feeds</a>
</li>
  <li><a href="https://docs.document360.com/docs/themes">Themes</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/main-pages">Main pages</a>
  <li><a href="https://docs.document360.com/docs/hero-section">Hero section</a>
</li>
  <li><a href="https://docs.document360.com/docs/text-block">Rich text blocks</a>
</li>
  <li><a href="https://docs.document360.com/docs/text-columns-block">Multicolumn card section</a>
</li>
  <li><a href="https://docs.document360.com/docs/image-and-text">Image with text block</a>
</li>
  <li><a href="https://docs.document360.com/docs/html-block">Custom code section</a>
</li>
  <li><a href="https://docs.document360.com/docs/knowledge-base-categories">Knowledge base categories block</a>
</li>
  <li><a href="https://docs.document360.com/docs/widgets">Widgets block</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/error-pages">Error pages</a>
  <li><a href="https://docs.document360.com/docs/404-page">404 page</a>
</li>
  <li><a href="https://docs.document360.com/docs/access-denied-page">Access denied page</a>
</li>
  <li><a href="https://docs.document360.com/docs/unauthorized-page">Unauthorized page</a>
</li>
  <li><a href="https://docs.document360.com/docs/ip-restriction-page">IP restriction page</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/custom-css-javascript">Custom CSS & JavaScript</a>
  <li><a href="https://docs.document360.com/docs/css-snippets">CSS Snippets</a>
</li>
  <li><a href="https://docs.document360.com/docs/callout-styles">Callout styles</a>
</li>
  <li><a href="https://docs.document360.com/docs/body-font-style">Body font style</a>
</li>
  <li><a href="https://docs.document360.com/docs/image-alignment">Image alignment</a>
</li>
  <li><a href="https://docs.document360.com/docs/header-font-style">Header font style</a>
</li>
  <li><a href="https://docs.document360.com/docs/table-style">Table style</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/article-redirect-rules">Article redirect rule</a>
</li>
  <li><a href="https://docs.document360.com/docs/configuring-the-article-settings">Article settings & SEO</a>
  <li><a href="https://docs.document360.com/docs/article-header">Article header</a>
</li>
  <li><a href="https://docs.document360.com/docs/document-header">Site header-What's new</a>
</li>
  <li><a href="https://docs.document360.com/docs/follow-articles-and-categories">Follow articles and categories</a>
</li>
  <li><a href="https://docs.document360.com/docs/search-in-knowledge-base-site">Search in Knowledge base site</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/liking-or-disliking-an-article">Liking or disliking an article</a>
</li>
  <li><a href="https://docs.document360.com/docs/smart-bar-cookie-consent">Smart bar & Cookie consent</a>
  <li><a href="https://docs.document360.com/docs/smart-bar">Smart bars</a>
</li>
  <li><a href="https://docs.document360.com/docs/cookie-consent">Cookie consent</a>
</li>
  </li>
  <li>Ticket deflectors
  <li><a href="https://docs.document360.com/docs/accessing-the-ticket-deflectors">Accessing the ticket deflectors in portal</a>
</li>
  <li><a href="https://docs.document360.com/docs/adding-a-new-ticket-deflector">Adding a new ticket deflector</a>
</li>
  </li>
  </li>
  <li><a href="https://docs.document360.com/docs/integrations">Integrations</a>
  <li><a href="https://docs.document360.com/docs/integrations-getting-started">Integrations in Document360</a>
</li>
  <li><a href="https://docs.document360.com/docs/advanced-insertion-rules-in-integration">Code inclusion and exclusion conditions</a>
</li>
  <li><a href="https://docs.document360.com/docs/chat">Chat</a>
  <li><a href="https://docs.document360.com/docs/livechat">LiveChat</a>
</li>
  <li><a href="https://docs.document360.com/docs/olark">Olark</a>
</li>
  <li><a href="https://docs.document360.com/docs/freshchat">Freshchat</a>
</li>
  <li><a href="https://docs.document360.com/docs/crisp">Crisp</a>
</li>
  <li><a href="https://docs.document360.com/docs/chatra">Chatra</a>
</li>
  <li><a href="https://docs.document360.com/docs/door-bell">Doorbell</a>
</li>
  <li><a href="https://docs.document360.com/docs/gorgias">Gorgias</a>
</li>
  <li><a href="https://docs.document360.com/docs/belco">Belco</a>
</li>
  <li><a href="https://docs.document360.com/docs/sunshine">Sunshine Conversations</a>
</li>
  <li><a href="https://docs.document360.com/docs/kommunicate">Kommunicate</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/analytics-1">Analytics</a>
  <li><a href="https://docs.document360.com/docs/google-analytics-integration">Google Analytics</a>
</li>
  <li><a href="https://docs.document360.com/docs/google-analytics-new">Google Analytics (GA4)</a>
</li>
  <li><a href="https://docs.document360.com/docs/google-tag-manager">Google Tag Manager</a>
</li>
  <li><a href="https://docs.document360.com/docs/heap">Heap</a>
</li>
  <li><a href="https://docs.document360.com/docs/segment-integration">Segment</a>
</li>
  <li><a href="https://docs.document360.com/docs/hotjar">Hotjar</a>
</li>
  <li><a href="https://docs.document360.com/docs/amplitude">Amplitude</a>
</li>
  <li><a href="https://docs.document360.com/docs/fullstory">FullStory</a>
</li>
  <li><a href="https://docs.document360.com/docs/mixpanel">Mixpanel</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/marketing-automation">Marketing automation</a>
  <li><a href="https://docs.document360.com/docs/vwo">VWO</a>
</li>
  <li><a href="https://docs.document360.com/docs/freshmarketer">Freshmarketer</a>
</li>
  <li><a href="https://docs.document360.com/docs/zoho-page-sense">ZOHO PageSense</a>
</li>
  <li><a href="https://docs.document360.com/docs/gosquared">GoSquared</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/commenting">Commenting</a>
  <li><a href="https://docs.document360.com/docs/commento">Commento</a>
</li>
  <li><a href="https://docs.document360.com/docs/disqus">Disqus</a>
</li>
  </li>
  </li>
  <li><a href="https://docs.document360.com/docs/extensions">Extensions</a>
  <li><a href="https://docs.document360.com/docs/all-extensions">Document360 Extensions - Getting started</a>
</li>
  <li><a href="https://docs.document360.com/docs/customer-support">Helpdesk</a>
  <li><a href="https://docs.document360.com/docs/freshdesk">Freshdesk</a>
</li>
  <li><a href="https://docs.document360.com/docs/freshservice">Freshservice</a>
</li>
  <li><a href="https://docs.document360.com/docs/zendesk">Zendesk</a>
</li>
  <li><a href="https://docs.document360.com/docs/intercom-integration">Intercom</a>
</li>
  <li><a href="https://docs.document360.com/docs/salesforce-integration">Salesforce</a>
  <li><a href="https://docs.document360.com/docs/salesforce">Salesforce</a>
</li>
  <li><a href="https://docs.document360.com/docs/cases-page">Cases page</a>
</li>
  </li>
  </li>
  <li><a href="https://docs.document360.com/docs/team-collaboration">Team collaboration</a>
  <li><a href="https://docs.document360.com/docs/slack">Slack</a>
</li>
  <li><a href="https://docs.document360.com/docs/microsoft-teams">Microsoft Teams</a>
</li>
  <li><a href="https://docs.document360.com/docs/drift">Drift</a>
</li>
  <li><a href="https://docs.document360.com/docs/zapier-integration">Zapier</a>
  <li><a href="https://docs.document360.com/docs/zapier-setup-guide">Zapier - Setup guide</a>
</li>
  <li><a href="https://docs.document360.com/docs/use-cases-for-zap-templates">Use cases of Zapier</a>
  <li><a href="https://docs.document360.com/docs/google-docs-document360-integration">Integrating Google Docs with Document360</a>
</li>
  <li><a href="https://docs.document360.com/docs/document360-with-google-sheets-integration">Integrating Google Sheets with Document360</a>
</li>
  <li><a href="https://docs.document360.com/docs/google-drive-document360">Integrating Document360 with Google Drive</a>
</li>
  <li><a href="https://docs.document360.com/docs/document360-with-trello-integration">Integrating Trello with Document360</a>
</li>
  <li><a href="https://docs.document360.com/docs/github-document360">Integrating GitHub with Document360</a>
</li>
  <li><a href="https://docs.document360.com/docs/confluence-document360">Integrating Confluence Server with Document360</a>
</li>
  <li><a href="https://docs.document360.com/docs/zoho-crm-document360">Integrating Zoho CRM with Document360</a>
</li>
  <li><a href="https://docs.document360.com/docs/pipedrive-document360">Integrating Pipedrive with Document360</a>
</li>
  <li><a href="https://docs.document360.com/docs/hubspot-document360">Integrating Hubspot with Document360</a>
</li>
  <li><a href="https://docs.document360.com/docs/asana-document360">Integrating Asana with Document360</a>
</li>
  <li><a href="https://docs.document360.com/docs/mondaycom-document360">Integrating Monday.com with Document360</a>
</li>
  <li><a href="https://docs.document360.com/docs/typeform-document360">Integrating Typeform with Document360</a>
</li>
  <li><a href="https://docs.document360.com/docs/document360-gmail">Integrating Gmail with Document360</a>
</li>
  <li><a href="https://docs.document360.com/docs/document360-mailchimp">Integrating Mailchimp with Document360</a>
</li>
  </li>
  </li>
  <li><a href="https://docs.document360.com/docs/make-1">Make</a>
  <li><a href="https://docs.document360.com/docs/make-setup-guide">Make - Setup guide</a>
</li>
  <li><a href="https://docs.document360.com/docs/use-cases-for-make-scenarios">Use cases for Make Scenarios</a>
  <li><a href="https://docs.document360.com/docs/asana-and-document360-integration">Integrating Asana with Document360</a>
</li>
  <li><a href="https://docs.document360.com/docs/monday-document360-integration">Integrating Monday.com with Document360</a>
</li>
  <li><a href="https://docs.document360.com/docs/typeform-and-document360-integration">Integrating Typeform with Document360</a>
</li>
  <li><a href="https://docs.document360.com/docs/google-docs-and-document360-integration">Integrating Google Docs with Document360</a>
</li>
  <li><a href="https://docs.document360.com/docs/jira-and-document360-integration">Integrating Jira with Document360</a>
</li>
  </li>
  </li>
  </li>
  <li>Code repositories
  <li><a href="https://docs.document360.com/docs/github-extension">GitHub</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/translation">Translation and browser</a>
  <li><a href="https://docs.document360.com/docs/chrome-extension">Chrome</a>
</li>
  <li><a href="https://docs.document360.com/docs/crowdin">Crowdin</a>
</li>
  <li><a href="https://docs.document360.com/docs/phrase">Phrase</a>
</li>
  </li>
  </li>
  <li><a href="https://docs.document360.com/docs/portal-management">Portal management</a>
  <li><a href="https://docs.document360.com/docs/general-project-settings">General project settings</a>
</li>
  <li><a href="https://docs.document360.com/docs/team-auditing">Team auditing</a>
</li>
  <li><a href="https://docs.document360.com/docs/localization-workspace">Localization & Workspace</a>
  <li><a href="https://docs.document360.com/docs/localization">Localization</a>
  <li><a href="https://docs.document360.com/docs/localization-getting-started">Localization - Getting started</a>
</li>
  <li><a href="https://docs.document360.com/docs/setting-up-a-multi-lingual-knowledge-base">Setting up a Multi-lingual knowledge base</a>
</li>
  <li><a href="https://docs.document360.com/docs/localization-variables">Localization variables</a>
</li>
  <li><a href="https://docs.document360.com/docs/ai-machine-translation-1">AI machine translation</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/workspaces">Workspaces</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/backup-restore">Backup and restore</a>
</li>
  <li><a href="https://docs.document360.com/docs/notifications">Notifications</a>
  <li><a href="https://docs.document360.com/docs/webhook-notification-channel">Webhook notification channel</a>
</li>
  <li><a href="https://docs.document360.com/docs/slack-notification-channel">Slack notification channel</a>
</li>
  <li><a href="https://docs.document360.com/docs/microsoft-teams-notification-channel">Microsoft Teams notification channel</a>
</li>
  <li><a href="https://docs.document360.com/docs/smtp-email-notification-channel">SMTP notification channel</a>
</li>
  <li><a href="https://docs.document360.com/docs/notification-mapping">Notification mapping</a>
</li>
  <li><a href="https://docs.document360.com/docs/notification-history">Notification history</a>
</li>
  <li><a href="https://docs.document360.com/docs/send-notifications-from-custom-email-domain">Email domain</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/api-tokens">API tokens</a>
</li>
  <li><a href="https://docs.document360.com/docs/external-api-tools">External API Tools</a>
  <li><a href="https://docs.document360.com/docs/how-to-use-postman">How to use Postman?</a>
</li>
  <li><a href="https://docs.document360.com/docs/how-to-use-swagger">How to use Swagger?</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/full-portal-search">Portal search</a>
  <li><a href="https://docs.document360.com/docs/article-full-portal-search">Article-portal search</a>
</li>
  <li><a href="https://docs.document360.com/docs/drive-full-portal-search">Drive-portal search</a>
</li>
  <li><a href="https://docs.document360.com/docs/users-groups-full-portal-search">Users & groups-portal search</a>
</li>
  <li><a href="https://docs.document360.com/docs/tags-full-portal-search">Tags-portal search</a>
</li>
  <li><a href="https://docs.document360.com/docs/settings-full-portal-search">Settings-portal search</a>
</li>
  </li>
  </li>
  <li><a href="https://docs.document360.com/docs/domain-management">Domain management</a>
  <li><a href="https://docs.document360.com/docs/custom-domain-mapping">Custom domain mapping</a>
</li>
  <li><a href="https://docs.document360.com/docs/document360-on-a-sub-folder">Hosting Document360 on a sub-directory</a>
</li>
  <li><a href="https://docs.document360.com/docs/nginx-server">Nginx server - Subfolder hosting</a>
</li>
  <li><a href="https://docs.document360.com/docs/aspnet-core-server">ASP.NET Core server</a>
</li>
  <li><a href="https://docs.document360.com/docs/microsoft-iis-server">Microsoft - IIS server</a>
</li>
  <li><a href="https://docs.document360.com/docs/apache-http-server">Apache HTTP server</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/user-management">User management</a>
  <li><a href="https://docs.document360.com/docs/managing-team-account">Managing team accounts</a>
</li>
  <li><a href="https://docs.document360.com/docs/team-account-groups-overview-page">Managing team account groups</a>
</li>
  <li><a href="https://docs.document360.com/docs/reader-accounts">Managing readers</a>
</li>
  <li><a href="https://docs.document360.com/docs/managing-reader-groups">Managing reader groups</a>
</li>
  <li><a href="https://docs.document360.com/docs/reader-self-registration">Readers self registration</a>
</li>
  <li><a href="https://docs.document360.com/docs/managing-reviewer-accounts">Managing reviewer accounts</a>
</li>
  <li><a href="https://docs.document360.com/docs/account-locked">Account locked</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/access-management">Access management</a>
  <li><a href="https://docs.document360.com/docs/roles">Roles and permissions</a>
</li>
  <li><a href="https://docs.document360.com/docs/content-role-and-access">Content access</a>
</li>
  <li><a href="https://docs.document360.com/docs/block-inheritance">Block inheritance</a>
</li>
  <li><a href="https://docs.document360.com/docs/site-access">Site access</a>
</li>
  <li><a href="https://docs.document360.com/docs/ip-restriction">IP restriction</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/single-sign-on-sso">Single Sign-On (SSO)</a>
  <li><a href="https://docs.document360.com/docs/login-using-sso-knowledge-base-portal">Login using SSO - Knowledge base portal</a>
</li>
  <li><a href="https://docs.document360.com/docs/login-using-sso-knowledge-base-site">Login using SSO - Knowledge base site</a>
</li>
  <li><a href="https://docs.document360.com/docs/inviting-or-adding-sso-users">Inviting or Adding SSO users</a>
</li>
  <li><a href="https://docs.document360.com/docs/mapping-an-existing-sso-configuration-to-other-projects">Mapping an existing SSO configuration to other projects</a>
</li>
  <li><a href="https://docs.document360.com/docs/disable-document360-login-page">Disable Document360 login page</a>
</li>
  <li><a href="https://docs.document360.com/docs/auto-assign-reader-group">Auto assign reader group</a>
</li>
  <li><a href="https://docs.document360.com/docs/convert-to-sso-account">Convert to SSO account</a>
</li>
  <li><a href="https://docs.document360.com/docs/team-account-idle-timeout">Sign out idle SSO team account</a>
</li>
  <li><a href="https://docs.document360.com/docs/saml">SAML</a>
  <li><a href="https://docs.document360.com/docs/saml-sso-with-okta">SAML SSO with Okta</a>
</li>
  <li><a href="https://docs.document360.com/docs/saml-sso-with-entra">SAML SSO with Entra</a>
</li>
  <li><a href="https://docs.document360.com/docs/google-sso-saml-configuration">SAML SSO with Google</a>
</li>
  <li><a href="https://docs.document360.com/docs/saml-sso-with-onelogin">SAML SSO with OneLogin</a>
</li>
  <li><a href="https://docs.document360.com/docs/saml-sso-with-adfs">SAML SSO with ADFS</a>
</li>
  <li><a href="https://docs.document360.com/docs/saml-sso-with-other-configurations">SAML SSO with other configurations</a>
</li>
  <li><a href="https://docs.document360.com/docs/idp-initiated-login">Identity Provider (IdP) initiated sign in</a>
</li>
  <li><a href="https://docs.document360.com/docs/removing-a-configured-saml-sso">Removing a configured SAML SSO</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/openid">OpenID</a>
  <li><a href="https://docs.document360.com/docs/okta-with-openid-sso">Okta with OpenID SSO</a>
</li>
  <li><a href="https://docs.document360.com/docs/auth0-with-openid-sso">Auth0 with OpenID SSO</a>
</li>
  <li><a href="https://docs.document360.com/docs/adfs-with-openid-sso">ADFS with OpenID SSO</a>
</li>
  <li><a href="https://docs.document360.com/docs/other-configurations-with-openid-sso">Other configurations with OpenID SSO</a>
</li>
  <li><a href="https://docs.document360.com/docs/removing-a-configured-openid-sso">Removing a configured OpenID SSO</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/jwt">JWT</a>
  <li><a href="https://docs.document360.com/docs/configuring-the-jwt-sso">Setting up JWT SSO</a>
</li>
  <li><a href="https://docs.document360.com/docs/jwt-reader-groups">JWT reader groups</a>
</li>
  </li>
  </li>
  <li><a href="https://docs.document360.com/docs/customization-editor">Customization</a>
  <li><a href="https://docs.document360.com/docs/how-to-enlarge-the-pdf-preview-in-the-article">How to enlarge the pdf preview in the article?</a>
</li>
  <li><a href="https://docs.document360.com/docs/how-to-change-the-color-of-the-hyperlinks-in-dark-mode">How to change the color of the hyperlinks in Dark mode?</a>
</li>
  <li><a href="https://docs.document360.com/docs/how-to-change-the-highlighted-search-result-color-in-articles">How to change the highlighted search result color in articles?</a>
</li>
  <li><a href="https://docs.document360.com/docs/how-to-hide-the-project-versions-dropdown-in-the-knowledge-base-site">How to hide the project's workspace dropdown in the Knowledge base site?</a>
</li>
  <li><a href="https://docs.document360.com/docs/how-to-add-a-vertical-scrollbar-to-the-code-blocks">How to add a vertical scrollbar to the code blocks?</a>
</li>
  <li><a href="https://docs.document360.com/docs/how-to-set-the-default-height-and-width-of-the-embedded-pdf">How to set the default height and width of the embedded PDF?</a>
</li>
  <li><a href="https://docs.document360.com/docs/how-to-make-the-table-border-bold-in-knowledge-base">How to make the table border bold in knowledge base?</a>
</li>
  <li><a href="https://docs.document360.com/docs/how-to-vertically-align-table-contents-at-the-top-in-the-knowledge-base">How to vertically align table contents at the top in the Knowledge base?</a>
</li>
  <li><a href="https://docs.document360.com/docs/how-to-restrict-the-readers-from-copying-the-content">How to restrict the readers from copying the content?</a>
</li>
  <li><a href="https://docs.document360.com/docs/how-to-keep-dark-mode-for-the-knowledge-base-site-by-default">How to keep dark mode for the Knowledge base site by default?</a>
</li>
  <li><a href="https://docs.document360.com/docs/how-to-center-align-the-text-in-markdown">How to center align the text in Markdown?</a>
</li>
  <li><a href="https://docs.document360.com/docs/how-to-change-the-color-of-the-text-in-markdown">How to change the color of the text in Markdown?</a>
</li>
  <li><a href="https://docs.document360.com/docs/how-to-change-the-language-name-text-in-code-blocks">How to change the language name text in code blocks?</a>
</li>
  <li><a href="https://docs.document360.com/docs/how-to-change-the-callouts-color-in-dark-mode">How to change the callouts color in dark mode?</a>
</li>
  <li><a href="https://docs.document360.com/docs/how-to-center-align-the-heading-in-the-articles">How to center align the heading in the articles?</a>
</li>
  <li><a href="https://docs.document360.com/docs/how-to-change-the-color-of-the-table-header">How to change the color of the table header?</a>
</li>
  <li><a href="https://docs.document360.com/docs/how-to-add-accordion-in-markdown">How to add accordion in Markdown?</a>
</li>
  <li><a href="https://docs.document360.com/docs/how-to-add-extra-space-in-markdown">How to add extra space in Markdown?</a>
</li>
  <li><a href="https://docs.document360.com/docs/how-to-align-the-image-in-markdown">How to align the image in Markdown?</a>
</li>
  <li><a href="https://docs.document360.com/docs/how-to-add-a-background-image-for-a-text-content">How to add a background image for a text content?</a>
</li>
  <li><a href="https://docs.document360.com/docs/how-to-change-the-color-of-the-table-of-contents">How to change the color of the table of contents?</a>
</li>
  <li><a href="https://docs.document360.com/docs/how-to-sort-the-contents-of-a-table">How to sort the contents of a table?</a>
</li>
  <li><a href="https://docs.document360.com/docs/how-to-customize-the-hyperlink">How to customize the hyperlink size?</a>
</li>
  <li><a href="https://docs.document360.com/docs/how-to-make-all-links-open-in-new-tab">How to make all links open in new tab?</a>
</li>
  <li><a href="https://docs.document360.com/docs/how-to-set-a-default-featured-image-in-knowledge-base">How to set a default featured image in knowledge base?</a>
</li>
  <li><a href="https://docs.document360.com/docs/how-to-add-shadows-to-an-image-in-markdown">How to add shadows to an image in Markdown?</a>
</li>
  <li><a href="https://docs.document360.com/docs/how-to-add-borders-to-an-image-in-markdown">How to add borders to an image in Markdown?</a>
</li>
  <li><a href="https://docs.document360.com/docs/embed-youtube-shorts">How to embed YouTube Shorts?</a>
</li>
  <li><a href="https://docs.document360.com/docs/how-to-embed-loom-video">How to embed a Loom video?</a>
</li>
  <li><a href="https://docs.document360.com/docs/how-to-embed-an-excel-file">How to embed an Excel file?</a>
</li>
  <li><a href="https://docs.document360.com/docs/how-to-change-the-color-of-feedback-buttons">How to change the color of Feedback buttons?</a>
</li>
  <li><a href="https://docs.document360.com/docs/how-to-hide-footer-in-mobile-view">How to hide footer in mobile view?</a>
</li>
  <li><a href="https://docs.document360.com/docs/how-to-change-the-hover-color-of-the-header-options">How to change the hover color of the header options?</a>
</li>
  <li><a href="https://docs.document360.com/docs/how-to-move-the-related-articles-above-the-feedback-section">How to move the related articles above the feedback section?</a>
</li>
  <li><a href="https://docs.document360.com/docs/how-to-hide-the-change-password-option-for-readers">How to hide the change password option for readers?</a>
</li>
  <li><a href="https://docs.document360.com/docs/how-to-configure-a-custom-header-font-in-the-knowledge-base">How to configure a custom header font in the knowledge base?</a>
</li>
  <li><a href="https://docs.document360.com/docs/how-to-hide-the-category-manager">How to hide the category manager?</a>
</li>
  <li><a href="https://docs.document360.com/docs/how-to-configure-a-custom-font-in-the-knowledge-base">How to configure a custom font in the knowledge base?</a>
</li>
  <li><a href="https://docs.document360.com/docs/how-to-hide-the-left-navigation-bar-in-knowledge-base-site">How to hide the left navigation bar in the knowledge base site?</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/billing">Billing & Subscription</a>
  <li><a href="https://docs.document360.com/docs/plans-and-pricing">Plans and pricing</a>
</li>
  <li><a href="https://docs.document360.com/docs/upgrading-your-plan">Upgrading your subscription plan</a>
</li>
  <li><a href="https://docs.document360.com/docs/downgrading-your-plan">Downgrading your subscription plan</a>
</li>
  <li><a href="https://docs.document360.com/docs/add-ons">Purchasing add-ons</a>
</li>
  <li><a href="https://docs.document360.com/docs/upgrading-from-trial-version">Upgrading from trial version</a>
</li>
  <li><a href="https://docs.document360.com/docs/changing-payment-information">Changing payment information</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/release-notes">Release notes</a>
  <li><a href="https://docs.document360.com/docs/2025">2025</a>
  <li><a href="https://docs.document360.com/docs/february-2025-1112">February 2025 - 11.1.2</a>
</li>
  <li><a href="https://docs.document360.com/docs/january-2025-1111">January 2025 - 11.01.1</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/2024">2024</a>
  <li><a href="https://docs.document360.com/docs/december-2024-10121">December 2024 - 10.12.1</a>
</li>
  <li><a href="https://docs.document360.com/docs/november-2024-10111">November 2024 - 10.11.1</a>
</li>
  <li><a href="https://docs.document360.com/docs/october-2024-10101">October 2024 - 10.10.1</a>
</li>
  <li><a href="https://docs.document360.com/docs/september-2024-1091">September 2024 - 10.9.1</a>
</li>
  <li><a href="https://docs.document360.com/docs/september-2024-1082">September 2024 - 10.8.2</a>
</li>
  <li><a href="https://docs.document360.com/docs/august-2024-1081">August 2024 - 10.8.1</a>
</li>
  <li><a href="https://docs.document360.com/docs/july-2024-1071">July 2024 - 10.7.1</a>
</li>
  <li><a href="https://docs.document360.com/docs/july-2024-1062">July 2024 - 10.6.2</a>
</li>
  <li><a href="https://docs.document360.com/docs/june-2024-1061">June 2024 - 10.6.1</a>
</li>
  <li><a href="https://docs.document360.com/docs/june-2024-1052">June 2024 - 10.5.2</a>
</li>
  <li><a href="https://docs.document360.com/docs/may-2024-1051">May 2024 - 10.5.1</a>
</li>
  <li><a href="https://docs.document360.com/docs/may-2024-1042">May 2024 - 10.4.2</a>
</li>
  <li><a href="https://docs.document360.com/docs/1041-release-note">April 2024 - 10.4.1</a>
</li>
  <li><a href="https://docs.document360.com/docs/april-2024-minor-release">April 2024 - Minor release</a>
</li>
  <li><a href="https://docs.document360.com/docs/march-2024">March 2024</a>
</li>
  <li><a href="https://docs.document360.com/docs/february-2024">February 2024</a>
</li>
  <li><a href="https://docs.document360.com/docs/january-2024">January 2024</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/2023">2023</a>
  <li><a href="https://docs.document360.com/docs/december-2023">December 2023</a>
</li>
  <li><a href="https://docs.document360.com/docs/november-2023">November 2023</a>
</li>
  <li><a href="https://docs.document360.com/docs/october-2023">October 2023</a>
</li>
  <li><a href="https://docs.document360.com/docs/august-3">August 2023</a>
</li>
  <li><a href="https://docs.document360.com/docs/july-2">July 2023</a>
</li>
  <li><a href="https://docs.document360.com/docs/june-3">June 2023</a>
</li>
  <li><a href="https://docs.document360.com/docs/may-1">May 2023</a>
</li>
  <li><a href="https://docs.document360.com/docs/april-3">April 2023</a>
</li>
  <li><a href="https://docs.document360.com/docs/march-4">March 2023</a>
</li>
  <li><a href="https://docs.document360.com/docs/february-3">February 2023</a>
</li>
  <li><a href="https://docs.document360.com/docs/january-2">January 2023</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/2022">2022</a>
  <li><a href="https://docs.document360.com/docs/december-2022-release-note">December 2022</a>
</li>
  <li><a href="https://docs.document360.com/docs/november-2022-release-note">November 2022</a>
</li>
  <li><a href="https://docs.document360.com/docs/october-2022-release-note">October 2022</a>
</li>
  <li><a href="https://docs.document360.com/docs/september-2022-release-note">September 2022</a>
</li>
  <li><a href="https://docs.document360.com/docs/august-2022-release-note">August 2022</a>
</li>
  <li><a href="https://docs.document360.com/docs/july-2022-release-note">July 2022</a>
</li>
  <li><a href="https://docs.document360.com/docs/june-2022-release-notes">June 2022</a>
</li>
  <li><a href="https://docs.document360.com/docs/may-2022-release-note">May 2022</a>
</li>
  <li><a href="https://docs.document360.com/docs/april-2022-release-note">April 2022</a>
</li>
  <li><a href="https://docs.document360.com/docs/march-2022-release-note">March 2022</a>
</li>
  <li><a href="https://docs.document360.com/docs/february-2022-release-note">February 2022</a>
</li>
  <li><a href="https://docs.document360.com/docs/january-2022-release-note">January 2022</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/2021">2021</a>
  <li><a href="https://docs.document360.com/docs/december-2021-release-note">December 2021</a>
</li>
  <li><a href="https://docs.document360.com/docs/november-2021-release-note">November 2021</a>
</li>
  <li><a href="https://docs.document360.com/docs/october-2021-release-note">October 2021</a>
</li>
  <li><a href="https://docs.document360.com/docs/september-2021-release-note">September 2021</a>
</li>
  <li><a href="https://docs.document360.com/docs/august-2021-release-notes">August 2021</a>
</li>
  <li><a href="https://docs.document360.com/docs/july-2021-release-note">July 2021</a>
</li>
  <li><a href="https://docs.document360.com/docs/june-2021-release-note">June 2021</a>
</li>
  <li><a href="https://docs.document360.com/docs/may-2021-release-note">May 2021</a>
</li>
  <li><a href="https://docs.document360.com/docs/april-2021-release-note">April 2021</a>
</li>
  <li><a href="https://docs.document360.com/docs/march-2021-release-note">March 2021</a>
</li>
  <li><a href="https://docs.document360.com/docs/february-2021-release-note">February 2021</a>
</li>
  <li><a href="https://docs.document360.com/docs/january-2021-release-note">January 2021</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/2020">2020</a>
  <li><a href="https://docs.document360.com/docs/november-2020-release-note">November 2020</a>
</li>
  <li><a href="https://docs.document360.com/docs/october-2020-release-note">October 2020</a>
</li>
  <li><a href="https://docs.document360.com/docs/august-2020-release-note">August 2020</a>
</li>
  <li><a href="https://docs.document360.com/docs/june-2020-release-note">June 2020</a>
</li>
  <li><a href="https://docs.document360.com/docs/may-2020-release-note">May 2020</a>
</li>
  <li><a href="https://docs.document360.com/docs/april-2020-release-note">April 2020</a>
</li>
  <li><a href="https://docs.document360.com/docs/march-2020-release-note">March 2020</a>
</li>
  <li><a href="https://docs.document360.com/docs/february-2020-release-note">February 2020</a>
</li>
  <li><a href="https://docs.document360.com/docs/january-2020">January 2020</a>
</li>
  </li>
  <li><a href="https://docs.document360.com/docs/2019">2019</a>
  <li><a href="https://docs.document360.com/docs/december">December 2019</a>
</li>
  <li><a href="https://docs.document360.com/docs/november">November 2019</a>
</li>
  <li><a href="https://docs.document360.com/docs/october">October 2019</a>
</li>
  <li><a href="https://docs.document360.com/docs/september-2019">September 2019</a>
</li>
  <li><a href="https://docs.document360.com/docs/august">August 2019</a>
</li>
  <li><a href="https://docs.document360.com/docs/july">July 2019</a>
</li>
  <li><a href="https://docs.document360.com/docs/june">June 2019</a>
</li>
  <li><a href="https://docs.document360.com/docs/may-2019">May 2019</a>
</li>
  <li><a href="https://docs.document360.com/docs/april-2019">April 2019</a>
</li>
  <li><a href="https://docs.document360.com/docs/march">March 2019</a>
</li>
  <li><a href="https://docs.document360.com/docs/february">February 2019</a>
</li>
  <li><a href="https://docs.document360.com/docs/january-2019">January 2019</a>
</li>
  </li>
  </li>
  <li><a href="https://docs.document360.com/docs/support">Support</a>
</li>
</body>
</html>
</document_content>
</document>

<document index="16">
<source>data/offline/nav.json</source>
<document_content>
[
  {
    "title": "Getting started",
    "link": "https://docs.document360.com/docs/getting-started",
    "children": [

... (Data file content truncated to first 5 lines)
</document_content>
</document>

<document index="17">
<source>data/offline/nav.md</source>
<document_content>
Here's the cleaned-up version of your documentation structure with more precise and lively language:

---

## Documentation Navigation

### Getting Started
- [What is Document360?](https://docs.document360.com/docs/document360-getting-started)
- [Sign up to Document360](https://docs.document360.com/docs/sign-up-to-document-360)
- [System and browser requirements](https://docs.document360.com/docs/system-and-browser-requirements)
- [Understanding basic structure](https://docs.document360.com/docs/understanding-basic-structure)
  - [Project dashboard](https://docs.document360.com/docs/document360-my-projects)
  - [Top-right menu overview](https://docs.document360.com/docs/top-right-menu-overview)
  - [Creating a project in Document360](https://docs.document360.com/docs/creating-a-project)
  - [Dashboard](https://docs.document360.com/docs/dashboard)
  - [Workspaces](https://docs.document360.com/docs/workspaces-1)
  - [Multilingual Knowledge bases](https://docs.document360.com/docs/getting-started-with-multi-lingual-knowledge-base)
  - [Creating a sandbox project](https://docs.document360.com/docs/creating-a-sandbox-project)
- [Security](https://docs.document360.com/docs/security)
  - [Document360 security and infrastructure](https://docs.document360.com/docs/quick-summary-of-the-security-and-infrastructure-aspects)
  - [X-Frame options](https://docs.document360.com/docs/x-frame-options)
  - [Content security policy](https://docs.document360.com/docs/content-security-policy)
  - [CSP and Whitelisting guidelines for Document360 widget](https://docs.document360.com/docs/csp-guidelines-for-document360-widget)
  - [Bot management](https://docs.document360.com/docs/bot-management)
  - [Fair usage policy for bot management](https://docs.document360.com/docs/fair-usage-policy-for-bot-management)

### Editor Choices
- [Editor choices in Document360](https://docs.document360.com/docs/using-the-text-editor)
- [Elements of the editor](https://docs.document360.com/docs/elements-of-the-editor)
- [Markdown editor](https://docs.document360.com/docs/markdown-editor-overview)
  - [Basic Markdown syntax](https://docs.document360.com/docs/markdown-basics)
- [WYSIWYG editor](https://docs.document360.com/docs/wysiwyg-editor)
- [Advanced WYSIWYG editor](https://docs.document360.com/docs/advanced-wysiwyg-editor-overview)
  - [Advanced WYSIWYG editor](https://docs.document360.com/docs/advanced-wysiwyg-editor)
  - [Advanced WYSIWYG editor basics](https://docs.document360.com/docs/advanced-wysiwyg-editor-basics)
  - [Movable blocks in Advanced WYSIWYG editor](https://docs.document360.com/docs/movable-blocks-in-advanced-wysiwyg-editor)
  - [Conditional content blocks in Advanced WYSIWYG editor](https://docs.document360.com/docs/conditional-content-blocks)
  - [Tables in Advanced WYSIWYG editor](https://docs.document360.com/docs/tables-in-advanced-wysiwyg-editor)
  - [Image formatting in the Advanced WYSIWYG editor](https://docs.document360.com/docs/image-formatting-in-the-advanced-wysiwyg-editor)
  - [Tabs in the Advanced WYSIWYG editor](https://docs.document360.com/docs/tabs-in-the-advanced-wysiwyg-editor)

### Managing Content
- [Categories and subcategories](https://docs.document360.com/docs/categories-and-subcategories)
  - [Managing categories](https://docs.document360.com/docs/managing-categories)
  - [Category types](https://docs.document360.com/docs/category-types)
  - [Mapping a category with a folder in Drive](https://docs.document360.com/docs/assigning-drive-folder-for-a-category)
  - [Downloading category and article in KB site](https://docs.document360.com/docs/downloading-category-and-article-in-kb-site)
- [Articles](https://docs.document360.com/docs/article)
  - [Managing articles](https://docs.document360.com/docs/managing-articles)
  - [Word .docx files](https://docs.document360.com/docs/article-import-from-word-files)
  - [Publishing an article](https://docs.document360.com/docs/publishing-an-article)
  - [Reviewing an article using Inline comments](https://docs.document360.com/docs/reviewing-an-article-inline-comments)
  - [Adding images to articles](https://docs.document360.com/docs/adding-images-to-articles)
  - [Adding videos in articles](https://docs.document360.com/docs/adding-videos-in-articles)
  - [Adding files to article](https://docs.document360.com/docs/adding-files-to-articles)
  - [Adding hyperlinks](https://docs.document360.com/docs/linking-to-other-articles)
  - [Code blocks](https://docs.document360.com/docs/code-blocks)
  - [Adding private notes](https://docs.document360.com/docs/private-notes)
  - [Embedding Stream videos in articles](https://docs.document360.com/docs/embedding-microsoft-streams-video-in-articles)
  - [Embedding Google forms in articles](https://docs.document360.com/docs/embedding-google-forms-in-article)
  - [Embedding a Draw.io diagram](https://docs.document360.com/docs/embedding-a-drawio-diagram)
- [All articles](https://docs.document360.com/docs/bulk-operations-overview)
  - [All articles - Overview page](https://docs.document360.com/docs/all-articles-overview-page)
  - [Using filters in All articles page](https://docs.document360.com/docs/filter-bulk-operations)
  - [Export All articles list](https://docs.document360.com/docs/export-bulk-operations)
- [Article settings](https://docs.document360.com/docs/article-management)
  - [Article review reminder](https://docs.document360.com/docs/review-reminders)
  - [Article SEO](https://docs.document360.com/docs/article-seo)
  - [Excluding articles from search engines](https://docs.document360.com/docs/excluding-articles-from-searches)
  - [Change the URL of an article](https://docs.document360.com/docs/changing-the-url-of-an-article)
  - [Article tags](https://docs.document360.com/docs/article-tags)
  - [Add article labels](https://docs.document360.com/docs/adding-article-labels)
  - [Related articles](https://docs.document360.com/docs/related-articles)
  - [Featured image](https://docs.document360.com/docs/featured-image)
  - [Attachments](https://docs.document360.com/docs/attachments)
  - [Status indicator](https://docs.document360.com/docs/status-indicator)
  - [Article status](https://docs.document360.com/docs/article-status)
  - [Preferences](https://docs.document360.com/docs/preferences)
  - [Show/hide table of contents for an article](https://docs.document360.com/docs/showhide-table-of-contents-for-an-article)
  - [Mark as deprecated](https://docs.document360.com/docs/marking-articles-as-deprecated)
  - [Update article contributors](https://docs.document360.com/docs/updating-article-contributors)
  - [Schedule publishing](https://docs.document360.com/docs/schedule-publishing)
  - [Discussion feed](https://docs.document360.com/docs/article-discussion-feed)
  - [Revision history](https://docs.document360.com/docs/revision-history)
  - [Article analytics](https://docs.document360.com/docs/article-analytics)
  - [Security - Article access control](https://docs.document360.com/docs/article-access-control-knowledge-base-site)
  - [Health check metrics](https://docs.document360.com/docs/health-check-metrics)
  - [Readability score](https://docs.document360.com/docs/readability-score)
  - [Sitemap](https://docs.document360.com/docs/sitemap-generator)
  - [Public article comments](https://docs.document360.com/docs/public-comments)
  - [Robots.txt](https://docs.document360.com/docs/robotstxt)
  - [Read receipt](https://docs.document360.com/docs/read-receipt)
  - [Share articles via private link](https://docs.document360.com/docs/share-articles-via-private-link)

### AI Features
- [Eddy AI customization](https://docs.document360.com/docs/ai-customization)
- [AI machine translation](https://docs.document360.com/docs/ai-machine-translation)
- [Eddy AI trust page](https://docs.document360.com/docs/eddy-ai-trust-page)
- [AI writer suite](https://docs.document360.com/docs/ai-writer-suite)
  - [AI writer](https://docs.document360.com/docs/ai-writer)
  - [AI FAQ generator](https://docs.document360.com/docs/ai-faq-generator)
  - [AI title recommender](https://docs.document360.com/docs/ai-title-recommender)
  - [AI SEO description generator](https://docs.document360.com/docs/seo-description-generator)
  - [AI tag recommender](https://docs.document360.com/docs/ai-tag-recommender)
  - [AI related articles recommender](https://docs.document360.com/docs/ai-related-articles-recommender)
  - [AI Chart generator](https://docs.document360.com/docs/ai-chart-generator)
  - [AI alt text generator](https://docs.document360.com/docs/ai-alt-text-generator)
- [AI search suite](https://docs.document360.com/docs/ai-search-suite)
  - [AI assistive search (Ask Eddy AI)](https://docs.document360.com/docs/ai-assistive-search-ask-eddy)
  - [Eddy AI search analytics](https://docs.document360.com/docs/eddy-search-analytics-1)
  - [AI dynamic related articles recommendation](https://docs.document360.com/docs/ai-dynamic-related-articles-recommendation)
  - [AI Chatbot](https://docs.document360.com/docs/ai-chatbot)
    - [Securing Chatbot authentication using JWT](https://docs.document360.com/docs/securing-chatbot-authentication-using-jwt)
    - [Styling the Chatbot](https://docs.document360.com/docs/styling-the-chatbot)
  - [Adding external sources for AI Assistive search](https://docs.document360.com/docs/eddy-ai-federated-search)
  - [AI article summarizer](https://docs.document360.com/docs/ai-article-summarizer)
  - [Ask Eddy AI API](https://docs.document360.com/docs/ask-eddy-ai-api)
  - [Enhancing accessibility with our read out loud feature](https://docs.document360.com/docs/text-to-voice-functionality)
- [AI premium suite](https://docs.document360.com/docs/ai-premium-suite)
  - [AI glossary generator](https://docs.document360.com/docs/ai-glossary-generator)
- AI tips and tricks
  - [How to write GenAI friendly content](https://docs.document360.com/docs/how-to-write-genai-friendly-content)
  - [Prompt engineering tips](https://docs.document360.com/docs/prompt-engineering-tips)

### File Management
- [Adding folders and files](https://docs.document360.com/docs/adding-folders-and-files)
- [Folder actions in Drive](https://docs.document360.com/docs/folder-actions-in-drive)
- [File actions in Drive](https://docs.document360.com/docs/file-actions-in-drive)
- [All files overview](https://docs.document360.com/docs/all-content-overview)
- [Recent, Starred, and Recycle bin files](https://docs.document360.com/docs/recycle-bin-recent-and-starred-files)

### Content Tools
- [Workflows](https://docs.document360.com/docs/workflow)
  - [Workflow designer](https://docs.document360.com/docs/workflow-designer)
  - [Managing workflow status](https://docs.document360.com/docs/managing-workflow-status)
  - [Workflow assignment](https://docs.document360.com/docs/workflow-assignment)
- [Content reuse](https://docs.document360.com/docs/content-reuse)
  - [Templates](https://docs.document360.com/docs/article-templates)
  - [Variables](https://docs.document360.com/docs/variables)
  - [Snippet](https://docs.document360.com/docs/snippets)
  - [Glossary](https://docs.document360.com/docs/glossary)
    - [Adding glossary terms](https://docs.document360.com/docs/adding-glossary-term)
    - [Inserting glossary term in an article](https://docs.document360.com/docs/adding-glossary-term-in-articles)
    - [Managing glossary terms](https://docs.document360.com/docs/editing-and-deleting-glossary-term)
    - [Managing the glossary landing page](https://docs.document360.com/docs/glossary-overview-page)
- [Feedback manager](https://docs.document360.com/docs/feedback-manager-overview)
- [Custom pages](https://docs.document360.com/docs/custom-pages)
- [Tags](https://docs.document360.com/docs/tags)
  - [Manage tags page overview](https://docs.document360.com/docs/tag-manager-overview-page)
  - [Adding a new tag](https://docs.document360.com/docs/adding-a-new-tag)
  - [Tag groups page overview](https://docs.document360.com/docs/tag-groups-overview)
  - [Manage tag dependencies](https://docs.document360.com/docs/tag-dependency-viewer)
- [Content essentials](https://docs.document360.com/docs/content-essentials)
  - [Find and replace](https://docs.document360.com/docs/find-and-replace)
  - [SEO descriptions](https://docs.document360.com/docs/seo-descriptions)
- [Import & Export project/article](https://docs.document360.com/docs/import-export)
  - [Exporting your Document360 project as a ZIP file](https://docs.document360.com/docs/export-documentation-as-zip)
  - [Importing a Document360 project ZIP file](https://docs.document360.com/docs/import-a-documentation-project)
  - [Migrating documentation from other platforms](https://docs.document360.com/docs/migrating-documentation-from-another-knowledge-base-platform)
- [Export to PDF](https://docs.document360.com/docs/export-to-pdf)
  - [Designing a PDF template](https://docs.document360.com/docs/pdf-design-templates)
  - [Compiling content for PDF](https://docs.document360.com/docs/compliling-content-for-pdf)

### Analytics
- [Articles analytics](https://docs.document360.com/docs/articles-analytics)
- [Eddy AI search analytics](https://docs.document360.com/docs/eddy-ai-search-analytics)
- [Search analytics](https://docs.document360.com/docs/analytics-search)
- [Reader analytics](https://docs.document360.com/docs/reader-analytics)
- [Team accounts analytics](https://docs.document360.com/docs/analytics-team-accounts)
- [Feedback analytics](https://docs.document360.com/docs/feedback)
- [Links status analytics](https://docs.document360.com/docs/links-status)
- [Page not found analytics](https://docs.document360.com/docs/page-not-found-analytics)
- [Ticket deflector analytics](https://docs.document360.com/docs/ticket-deflector-overview)

### API Documentation
- [Getting started with API documentation](https://docs.document360.com/docs/api-documentation-getting-started)
- [Managing API documentation](https://docs.document360.com/docs/manage-api-documentation)

### Knowledge Base Widget
- [Knowledge base widget - Getting started](https://docs.document360.com/docs/knowledge-base-widget-getting-started)
- [Installing the Knowledge base widget](https://docs.document360.com/docs/installing-the-knowledge-base-widget)
- [Edit, Clone, and Delete widget](https://docs.document360.com/docs/edit-clone-and-delete)
- [Managing and customizing the Knowledge base widget](https://docs.document360.com/docs/managing-and-customizing-the-knowledge-base-widget)
- [URL Mapping](https://docs.document360.com/docs/url-mapping)
- [Customizing the Knowledge base widget using Custom CSS/JavaScript](https://docs.document360.com/docs/customizing-the-kb-widget-using-custom-css-javascript)
- [FAQ - Knowledge base widget](https://docs.document360.com/docs/faq-knowledge-base-widget)

### Knowledge Base Site
- [Knowledge base site 2.0](https://docs.document360.com/docs/knowledge-base-site-20)
- [Customize site](https://docs.document360.com/docs/customize-site)
  - [KB site 2.0 migration](https://docs.document360.com/docs/kb-site-20-migration)
  - [Web Content Accessibility Guidelines (WCAG)](https://docs.document360.com/docs/web-content-accessibility-guidelines-wcag)
- [Site header and footer](https://docs.document360.com/docs/site-header-and-footer)
  - [Header - Primary navigation](https://docs.document360.com/docs/header-primary-navigation)
  - [Header - Secondary navigation](https://docs.document360.com/docs/header-secondary-navigation)
  - [Footer](https://docs.document360.com/docs/footer-navigation)
  - [Custom footer](https://docs.document360.com/docs/custom-footer)
  - [RSS Feeds](https://docs.document360.com/docs/rss-feeds)
  - [Themes](https://docs.document360.com/docs/themes)
- [Main pages](https://docs.document360.com/docs/main-pages)
  - [Hero section](https://docs.document360.com/docs/hero-section)
  - [Rich text blocks](https://docs.document360.com/docs/text-block)
  - [Multicolumn card section](https://docs.document360.com/docs/text-columns-block)
  - [Image with text block](https://docs.document360.com/docs/image-and-text)
  - [Custom code section](https://docs.document360.com/docs/html-block)
  - [Knowledge base categories block](https://docs.document360.com/docs/knowledge-base-categories)
  - [Widgets block](https://docs.document360.com/docs/widgets)
- [Error pages](https://docs.document360.com/docs/error-pages)
  - [404 page](https://docs.document360.com/docs/404-page)
  - [Access denied page](https://docs.document360.com/docs/access-denied-page)
  - [Unauthorized page](https://docs.document360.com/docs/unauthorized-page)
  - [IP restriction page](https://docs.document360.com/docs/ip-restriction-page)
- [Custom CSS & JavaScript](https://docs.document360.com/docs/custom-css-javascript)
  - [CSS Snippets](https://docs.document360.com/docs/css-snippets)
  - [Callout styles](https://docs.document360.com/docs/callout-styles)
  - [Body font style](https://docs.document360.com/docs/body-font-style)
  - [Image alignment](https://docs.document360.com/docs/image-alignment)
  - [Header font style](https://docs.document360.com/docs/header-font-style)
  - [Table style](https://docs.document360.com/docs/table-style)
- [Article redirect rule](https://docs.document360.com/docs/article-redirect-rules)
- [Article settings & SEO](https://docs.document360.com/docs/configuring-the-article-settings)
  - [Article header](https://docs.document360.com/docs/article-header)
  - [Site header-What's new](https://docs.document360.com/docs/document-header)
  - [Follow articles and categories](https://docs.document360.com/docs/follow-articles-and-categories)
  - [Search in Knowledge base site](https://docs.document360.com/docs/search-in-knowledge-base-site)
- [Liking or disliking an article](https://docs.document360.com/docs/liking-or-disliking-an-article)
- [Smart bar & Cookie consent](https://docs.document360.com/docs/smart-bar-cookie-consent)
  - [Smart bars](https://docs.document360.com/docs/smart-bar)
  - [Cookie consent](https://docs.document360.com/docs/cookie-consent)
- Ticket deflectors
  - [Accessing the ticket deflectors in portal](https://docs.document360.com/docs/accessing-the-ticket-deflectors)
  - [Adding a new ticket deflector](https://docs.document360.com/docs/adding-a-new-ticket-deflector)

### Integrations
- [Integrations in Document360](https://docs.document360.com/docs/integrations-getting-started)
- [Code inclusion and exclusion conditions](https://docs.document360.com/docs/advanced-insertion-rules-in-integration)
- [Chat](https://docs.document360.com/docs/chat)
  - [LiveChat](https://docs.document360.com/docs/livechat)
  - [Olark](https://docs.document360.com/docs/olark)
  - [Freshchat](https://docs.document360.com/docs/freshchat)
  - [Crisp](https://docs.document360.com/docs/crisp)
  - [Chatra](https://docs.document360.com/docs/chatra)
  - [Doorbell](https://docs.document360.com/docs/door-bell)
  - [Gorgias](https://docs.document360.com/docs/gorgias)
  - [Belco](https://docs.document360.com/docs/belco)
  - [Sunshine Conversations](https://docs.document360.com/docs/sunshine)
  - [Kommunicate](https://docs.document360.com/docs/kommunicate)
- [Analytics](https://docs.document360.com/docs/analytics-1)
  - [Google Analytics](https://docs.document360.com/docs/google-analytics-integration)
  - [Google Analytics (GA4)](https://docs.document360.com/docs/google-analytics-new)
  - [Google Tag Manager](https://docs.document360.com/docs/google-tag-manager)
  - [Heap](https://docs.document360.com/docs/heap)
  - [Segment](https://docs.document360.com/docs/segment-integration)
  - [Hotjar](https://docs.document360.com/docs/hotjar)
  - [Amplitude](https://docs.document360.com/docs/amplitude)
  - [FullStory](https://docs.document360.com/docs/fullstory)
  - [Mixpanel](https://docs.document360.com/docs/mixpanel)
- [Marketing automation](https://docs.document360.com/docs/marketing-automation)
  - [VWO](https://docs.document360.com/docs/vwo)
  - [Freshmarketer](https://docs.document360.com/docs/freshmarketer)
  - [ZOHO PageSense](https://docs.document360.com/docs/zoho-page-sense)
  - [GoSquared](https://docs.document360.com/docs/gosquared)
- [Commenting](https://docs.document360.com/docs/commenting)
  - [Commento](https://docs.document360.com/docs/commento)
  - [Disqus](https://docs.document360.com/docs/disqus)

### Extensions
- [Document360 Extensions - Getting started](https://docs.document360.com/docs/all-extensions)
- [Helpdesk](https://docs.document360.com/docs/customer-support)
  - [Freshdesk](https://docs.document360.com/docs/freshdesk)
  - [Freshservice](https://docs.document360.com/docs/freshservice)
  - [Zendesk](https://docs.document360.com/docs/zendesk)
  - [Intercom](https://docs.document360.com/docs/intercom-integration)
  - [Salesforce](https://docs.document360.com/docs/salesforce-integration)
    - [Salesforce](https://docs.document360.com/docs/salesforce)
    - [Cases page](https://docs.document360.com/docs/cases-page)
- [Team collaboration](https://docs.document360.com/docs/team-collaboration)
  - [Slack](https://docs.document360.com/docs/slack)
  - [Microsoft Teams](https://docs.document360.com/docs/microsoft-teams)
  - [Drift](https://docs.document360.com/docs/drift)
  - [Zapier](https://docs.document360.com/docs/zapier-integration)
    - [Zapier - Setup guide](https://docs.document360.com/docs/zapier-setup-guide)
    - [Use cases of Zapier](https://docs.document360.com/docs/use-cases-for-zap-templates)
      - [Integrating Google Docs with Document360](https://docs.document360.com/docs/google-docs-document360-integration)
      - [Integrating Google Sheets with Document360](https://docs.document360.com/docs/document360-with-google-sheets-integration)
      - [Integrating Document360 with Google Drive](https://docs.document360.com/docs/google-drive-document360)
      - [Integrating Trello with Document360](https://docs.document360.com/docs/document360-with-trello-integration)
      - [Integrating GitHub with Document360](https://docs.document360.com/docs/github-document360)
      - [Integrating Confluence Server with Document360](https://docs.document360.com/docs/confluence-document360)
      - [Integrating Zoho CRM with Document360](https://docs.document360.com/docs/zoho-crm-document360)
      - [Integrating Pipedrive with Document360](https://docs.document360.com/docs/pipedrive-document360)
      - [Integrating Hubspot with Document360](https://docs.document360.com/docs/hubspot-document360)
      - [Integrating Asana with Document360](https://docs.document360.com/docs/asana-document360)
      - [Integrating Monday.com with Document360](https://docs.document360.com/docs/mondaycom-document360)
      - [Integrating Typeform with Document360](https://docs.document360.com/docs/typeform-document360)
      - [Integrating Gmail with Document360](https://docs.document360.com/docs/document360-gmail)
      - [Integrating Mailchimp with Document360](https://docs.document360.com/docs/document360-mailchimp)
  - [Make](https://docs.document360.com/docs/make-1)
    - [Make - Setup guide](https://docs.document360.com/docs/make-setup-guide)
    - [Use cases for Make Scenarios](https://docs.document360.com/docs/use-cases-for-make-scenarios)
      - [Integrating Asana with Document360](https://docs.document360.com/docs/asana-and-document360-integration)
      - [Integrating Monday.com with Document360](https://docs.document360.com/docs/monday-document360-integration)
      - [Integrating Typeform with Document360](https://docs.document360.com/docs/typeform-and-document360-integration)
      - [Integrating Google Docs with Document360](https://docs.document360.com/docs/google-docs-and-document360-integration)
      - [Integrating Jira with Document360](https://docs.document360.com/docs/jira-and-document360-integration)
- Code repositories
  - [GitHub](https://docs.document360.com/docs/github-extension)
- [Translation and browser](https://docs.document360.com/docs/translation)
  - [Chrome](https://docs.document360.com/docs/chrome-extension)
  - [Crowdin](https://docs.document360.com/docs/crowdin)
  - [Phrase](https://docs.document360.com/docs/phrase)

### Portal Management
- [General project settings](https://docs.document360.com/docs/general-project-settings)
- [Team auditing](https://docs.document360.com/docs/team-auditing)
- [Localization & Workspace](https://docs.document360.com/docs/localization-workspace)
  - [Localization](https://docs.document360.com/docs/localization)
    - [Localization - Getting started](https://docs.document360.com/docs/localization-getting-started)
    - [Setting up a Multi-lingual knowledge base](https://docs.document360.com/docs/setting-up-a-multi-lingual-knowledge-base)
    - [Localization variables](https://docs.document360.com/docs/localization-variables)
    - [AI machine translation](https://docs.document360.com/docs/ai-machine-translation-1)
  - [Workspaces](https://docs.document360.com/docs/workspaces)
- [Backup and restore](https://docs.document360.com/docs/backup-restore)
- [Notifications](https://docs.document360.com/docs/notifications)
  - [Webhook notification channel](https://docs.document360.com/docs/webhook-notification-channel)
  - [Slack notification channel](https://docs.document360.com/docs/slack-notification-channel)
  - [Microsoft Teams notification channel](https://docs.document360.com/docs/microsoft-teams-notification-channel)
  - [SMTP notification channel](https://docs.document360.com/docs/smtp-email-notification-channel)
  - [Notification mapping](https://docs.document360.com/docs/notification-mapping)
  - [Notification history](https://docs.document360.com/docs/notification-history)
  - [Email domain](https://docs.document360.com/docs/send-notifications-from-custom-email-domain)
- [API tokens](https://docs.document360.com/docs/api-tokens)
- [External API Tools](https://docs.document360.com/docs/external-api-tools)
  - [How to use Postman?](https://docs.document360.com/docs/how-to-use-postman)
  - [How to use Swagger?](https://docs.document360.com/docs/how-to-use-swagger)
- [Portal search](https://docs.document360.com/docs/full-portal-search)
  - [Article-portal search](https://docs.document360.com/docs/article-full-portal-search)
  - [Drive-portal search](https://docs.document360.com/docs/drive-full-portal-search)
  - [Users & groups-portal search](https://docs.document360.com/docs/users-groups-full-portal-search)
  - [Tags-portal search](https://docs.document360.com/docs/tags-full-portal-search)
  - [Settings-portal search](https://docs.document360.com/docs/settings-full-portal-search)

### Domain Management
- [Custom domain mapping](https://docs.document360.com/docs/custom-domain-mapping)
- [Hosting Document360 on a sub-directory](https://docs.document360.com/docs/document360-on-a-sub-folder)
- [Nginx server - Subfolder hosting](https://docs.document360.com/docs/nginx-server)
- [ASP.NET Core server](https://docs.document360.com/docs/aspnet-core-server)
- [Microsoft - IIS server](https://docs.document360.com/docs/microsoft-iis-server)
- [Apache HTTP server](https://docs.document360.com/docs/apache-http-server)

### User Management
- [Managing team accounts](https://docs.document360.com/docs/managing-team-account)
- [Managing team account groups](https://docs.document360.com/docs/team-account-groups-overview-page)
- [Managing readers](https://docs.document360.com/docs/reader-accounts)
- [Managing reader groups](https://docs.document360.com/docs/managing-reader-groups)
- [Readers self registration](https://docs.document360.com/docs/reader-self-registration)
- [Managing reviewer accounts](https://docs.document360.com/docs/managing-reviewer-accounts)
- [Account locked](https://docs.document360.com/docs/account-locked)

### Access Management
- [Roles and permissions](https://docs.document360.com/docs/roles)
- [Content access](https://docs.document360.com/docs/content-role-and-access)
- [Block inheritance](https://docs.document360.com/docs/block-inheritance)
- [Site access](https://docs.document360.com/docs/site-access)
- [IP restriction](https://docs.document360.com/docs/ip-restriction)

### Single Sign-On (SSO)
- [Login using SSO - Knowledge base portal](https://docs.document360.com/docs/login-using-sso-knowledge-base-portal)
- [Login using SSO - Knowledge base site](https://docs.document360.com/docs/login-using-sso-knowledge-base-site)
- [Inviting or Adding SSO users](https://docs.document360.com/docs/inviting-or-adding-sso-users)
- [Mapping an existing SSO configuration to other projects](https://docs.document360.com/docs/mapping-an-existing-sso-configuration-to-other-projects)
- [Disable Document360 login page](https://docs.document360.com/docs/disable-document360-login-page)
- [Auto assign reader group](https://docs.document360.com/docs/auto-assign-reader-group)
- [Convert to SSO account](https://docs.document360.com/docs/convert-to-sso-account)
- [Sign out idle SSO team account](https://docs.document360.com/docs/team-account-idle-timeout)
- [SAML](https://docs.document360.com/docs/saml)
  - [SAML SSO with Okta](https://docs.document360.com/docs/saml-sso-with-okta)
  - [SAML SSO with Entra](https://docs.document360.com/docs/saml-sso-with-entra)
  - [SAML SSO with Google](https://docs.document360.com/docs/google-sso-saml-configuration)
  - [SAML SSO with OneLogin](https://docs.document360.com/docs/saml-sso-with-onelogin)
  - [SAML SSO with ADFS](https://docs.document360.com/docs/saml-sso-with-adfs)
  - [SAML SSO with other configurations](https://docs.document360.com/docs/saml-sso-with-other-configurations)
  - [Identity Provider (IdP) initiated sign in](https://docs.document360.com/docs/idp-initiated-login)
  - [Removing a configured SAML SSO](https://docs.document360.com/docs/removing-a-configured-saml-sso)
- [OpenID](https://docs.document360.com/docs/openid)
  - [Okta with OpenID SSO](https://docs.document360.com/docs/okta-with-openid-sso)
  - [Auth0 with OpenID SSO](https://docs.document360.com/docs/auth0-with-openid-sso)
  - [ADFS with OpenID SSO](https://docs.document360.com/docs/adfs-with-openid-sso)
  - [Other configurations with OpenID SSO](https://docs.document360.com/docs/other-configurations-with-openid-sso)
  - [Removing a configured OpenID SSO](https://docs.document360.com/docs/removing-a-configured-openid-sso)
- [JWT](https://docs.document360.com/docs/jwt)
  - [Setting up JWT SSO](https://docs.document360.com/docs/configuring-the-jwt-sso)
  - [JWT reader groups](https://docs.document360.com/docs/jwt-reader-groups)

### Customization
- [How to enlarge the pdf preview in the article?](https://docs.document360.com/docs/how-to-enlarge-the-pdf-preview-in-the-article)
- [How to change the color of the hyperlinks in Dark mode?](https://docs.document360.com/docs/how-to-change-the-color-of-the-hyperlinks-in-dark-mode)
- [How to change the highlighted search result color in articles?](https://docs.document360.com/docs/how-to-change-the-highlighted-search-result-color-in-articles)
- [How to hide the project's workspace dropdown in the Knowledge base site?](https://docs.document360.com/docs/how-to-hide-the-project-versions-dropdown-in-the-knowledge-base-site)
- [How to add a vertical scrollbar to the code blocks?](https://docs.document360.com/docs/how-to-add-a-vertical-scrollbar-to-the-code-blocks)
- [How to set the default height and width of the embedded PDF?](https://docs.document360.com/docs/how-to-set-the-default-height-and-width-of-the-embedded-pdf)
- [How to make the table border bold in knowledge base?](https://docs.document360.com/docs/how-to-make-the-table-border-bold-in-knowledge-base)
- [How to vertically align table contents at the top in the Knowledge base?](https://docs.document360.com/docs/how-to-vertically-align-table-contents-at-the-top-in-the-knowledge-base)
- [How to restrict the readers from copying the content?](https://docs.document360.com/docs/how-to-restrict-the-readers-from-copying-the-content)
- [How to keep dark mode for the Knowledge base site by default?](https://docs.document360.com/docs/how-to-keep-dark-mode-for-the-knowledge-base-site-by-default)
- [How to center align the text in Markdown?](https://docs.document360.com/docs/how-to-center-align-the-text-in-markdown)
- [How to change the color of the text in Markdown?](https://docs.document360.com/docs/how-to-change-the-color-of-the-text-in-markdown)
- [How to change the language name text in code blocks?](https://docs.document360.com/docs/how-to-change-the-language-name-text-in-code-blocks)
- [How to change the callouts color in dark mode?](https://docs.document360.com/docs/how-to-change-the-callouts-color-in-dark-mode)
- [How to center align the heading in the articles?](https://docs.document360.com/docs/how-to-center-align-the-heading-in-the-articles)
- [How to change the color of the table header?](https://docs.document360.com/docs/how-to-change-the-color-of-the-table-header)
- [How to add accordion in Markdown?](https://docs.document360.com/docs/how-to-add-accordion-in-markdown)
- [How to add extra space in Markdown?](https://docs.document360.com/docs/how-to-add-extra-space-in-markdown)
- [How to align the image in Markdown?](https://docs.document360.com/docs/how-to-align-the-image-in-markdown)
- [How to add a background image for a text content?](https://docs.document360.com/docs/how-to-add-a-background-image-for-a-text-content)
- [How to change the color of the table of contents?](https://docs.document360.com/docs/how-to-change-the-color-of-the-table-of-contents)
- [How to sort the contents of a table?](https://docs.document360.com/docs/how-to-sort-the-contents-of-a-table)
- [How to customize the hyperlink size?](https://docs.document360.com/docs/how-to-customize-the-hyperlink)
- [How to make all links open in new tab?](https://docs.document360.com/docs/how-to-make-all-links-open-in-new-tab)
- [How to set a default featured image in knowledge base?](https://docs.document360.com/docs/how-to-set-a-default-featured-image-in-knowledge-base)
- [How to add shadows to an image in Markdown?](https://docs.document360.com/docs/how-to-add-shadows-to-an-image-in-markdown)
- [How to add borders to an image in Markdown?](https://docs.document360.com/docs/how-to-add-borders-to-an-image-in-markdown)
- [How to embed YouTube Shorts?](https://docs.document360.com/docs/embed-youtube-shorts)
- [How to embed a Loom video?](https://docs.document360.com/docs/how-to-embed-loom-video)
- [How to embed an Excel file?](https://docs.document360.com/docs/how-to-embed-an-excel-file)
- [How to change the color of Feedback buttons?](https://docs.document360.com/docs/how-to-change-the-color-of-feedback-buttons)
- [How to hide footer in mobile view?](https://docs.document360.com/docs/how-to-hide-footer-in-mobile-view)
- [How to change the hover color of the header options?](https://docs.document360.com/docs/how-to-change-the-hover-color-of-the-header-options)
- [How to move the related articles above the feedback section?](https://docs.document360.com/docs/how-to-move-the-related-articles-above-the-feedback-section)
- [How to hide the change password option for readers?](https://docs.document360.com/docs/how-to-hide-the-change-password-option-for-readers)
- [How to configure a custom header font in the knowledge base?](https://docs.document360.com/docs/how-to-configure-a-custom-header-font-in-the-knowledge-base)
- [How to hide the category manager?](https://docs.document360.com/docs/how-to-hide-the-category-manager)
- [How to configure a custom font in the knowledge base?](https://docs.document360.com/docs/how-to-configure-a-custom-font-in-the-knowledge-base)
- [How to hide the left navigation bar in the knowledge base site?](https://docs.document360.com/docs/how-to-hide-the-left-navigation-bar-in-knowledge-base-site)

### Billing & Subscription
- [Plans and pricing](https://docs.document360.com/docs/plans-and-pricing)
- [Upgrading your subscription plan](https://docs.document360.com/docs/upgrading-your-plan)
- [Downgrading your subscription plan](https://docs.document360.com/docs/downgrading-your-plan)
- [Purchasing add-ons](https://docs.document360.com/docs/add-ons)
- [Upgrading from trial version](https://docs.document360.com/docs/upgrading-from-trial-version)
- [Changing payment information](https://docs.document360.com/docs/changing-payment-information)

### Release Notes
- [2025](https://docs.document360.com/docs/2025)
  - [February 2025 - 11.1.2](https://docs.document360.com/docs/february-2025-1112)
  - [January 2025 - 11.01.1](https://docs.document360.com/docs/january-2025-1111)
- [2024](https://docs.document360.com/docs/2024)
  - [December 2024 - 10.12.1](https://docs.document360.com/docs/december-2024-10121)
  - [November 2024 - 10.11.1](https://docs.document360.com/docs/november-2024-10111)
  - [October 2024 - 10.10.1](https://docs.document360.com/docs/october-2024-10101)
  - [September 2024 - 10.9.1](https://docs.document360.com/docs/september-2024-1091)
  - [September 2024 - 10.8.2](https://docs.document360.com/docs/september-2024-1082)
  - [August 2024 - 10.8.1](https://docs.document360.com/docs/august-2024-1081)
  - [July 2024 - 10.7.1](https://docs.document360.com/docs/july-2024-1071)
  - [July 2024 - 10.6.2](https://docs.document360.com/docs/july-2024-1062)
  - [June 2024 - 10.6.1](https://docs.document360.com/docs/june-2024-1061)
  - [June 2024 - 10.5.2](https://docs.document360.com/docs/june-2024-1052)
  - [May 2024 - 10.5.1](https://docs.document360.com/docs/may-2024-1051)
  - [May 2024 - 10.4.2](https://docs.document360.com/docs/may-2024-1042)
  - [April 2024 - 10.4.1](https://docs.document360.com/docs/1041-release-note)
  - [April 2024 - Minor release](https://docs.document360.com/docs/april-2024-minor-release)
  - [March 2024](https://docs.document360.com/docs/march-2024)
  - [February 2024](https://docs.document360.com/docs/february-2024)
  - [January 2024](https://docs.document360.com/docs/january-2024)
- [2023](https://docs.document360.com/docs/2023)
  - [December 2023](https://docs.document360.com/docs/december-2023)
  - [November 2023](https://docs.document360.com/docs/november-2023)
  - [October 2023](https://docs.document360.com/docs/october-2023)
  - [August 2023](https://docs.document360.com/docs/august-3)
  - [July 2023](https://docs.document360.com/docs/july-2)
  - [June 2023](https://docs.document360.com/docs/june-3)
  - [May 2023](https://docs.document360.com/docs/may-1)
  - [April 2023](https://docs.document360.com/docs/april-3)
  - [March 2023](https://docs.document360.com/docs/march-4)
  - [February 2023](https://docs.document360.com/docs/february-3)
  - [January 2023](https://docs.document360.com/docs/january-2)
- [2022](https://docs.document360.com/docs/2022)
  - [December 2022](https://docs.document360.com/docs/december-2022-release-note)
  - [November 2022](https://docs.document360.com/docs/november-2022-release-note)
  - [October 2022](https://docs.document360.com/docs/october-2022-release-note)
  - [September 2022](https://docs.document360.com/docs/september-2022-release-note)
  - [August 2022](https://docs.document360.com/docs/august-2022-release-note)
  - [July 2022](https://docs.document360.com/docs/july-2022-release-note)
  - [June 2022](https://docs.document360.com/docs/june-2022-release-notes)
  - [May 2022](https://docs.document360.com/docs/may-2022-release-note)
  - [April 2022](https://docs.document360.com/docs/april-2022-release-note)
  - [March 2022](https://docs.document360.com/docs/march-2022-release-note)
  - [February 2022](https://docs.document360.com/docs/february-2022-release-note)
  - [January 2022](https://docs.document360.com/docs/january-2022-release-note)
- [2021](https://docs.document360.com/docs/2021)
  - [December 2021](https://docs.document360.com/docs/december-2021-release-note)
  - [November 2021](https://docs.document360.com/docs/november-2021-release-note)
  - [October 2021](https://docs.document360.com/docs/october-2021-release-note)
  - [September 2021](https://docs.document360.com/docs/september-2021-release-note)
  - [August 2021](https://docs.document360.com/docs/august-2021-release-notes)
  - [July 2021](https://docs.document360.com/docs/july-2021-release-note)
  - [June 2021](https://docs.document360.com/docs/june-2021-release-note)
  - [May 2021](https://docs.document360.com/docs/may-2021-release-note)
  - [April 2021](https://docs.document360.com/docs/april-2021-release-note)
  - [March 2021](https://docs.document360.com/docs/march-2021-release-note)
  - [February 2021](https://docs.document360.com/docs/february-2021-release-note)
  - [January 2021](https://docs.document360.com/docs/january-2021-release-note)
- [2020](https://docs.document360.com/docs/2020)
  - [November 2020](https://docs.document360.com/docs/november-2020-release-note)
  - [October 2020](https://docs.document360.com/docs/october-2020-release-note)
  - [August 2020](https://docs.document360.com/docs/august-2020-release-note)
  - [June 2020](https://docs.document360.com/docs/june-2020-release-note)
  - [May 2020](https://docs.document360.com/docs/may-2020-release-note)
  - [April 2020](https://docs.document360.com/docs/april-2020-release-note)
  - [March 2020](https://docs.document360.com/docs/march-2020-release-note)
  - [February 2020](https://docs.document360.com/docs/february-2020-release-note)
  - [January 2020](https://docs.document360.com/docs/january-2020)
- [2019](https://docs.document360.com/docs/2019)
  - [December 2019](https://docs.document360.com/docs/december)
  - [November 2019](https://docs.document360.com/docs/november)
  - [October 2019](https://docs.document360.com/docs/october)
  - [September 2019](https://docs.document360.com/docs/september-2019)
  - [August 2019](https://docs.document360.com/docs/august)
  - [July 2019](https://docs.document360.com/docs/july)
  - [June 2019](https://docs.document360.com/docs/june)
  - [May 2019](https://docs.document360.com/docs/may-2019)
  - [April 2019](https://docs.document360.com/docs/april-2019)
  - [March 2019](https://docs.document360.com/docs/march)
  - [February 2019](https://docs.document360.com/docs/february)
  - [January 2019](https://docs.document360.com/docs/january-2019)

### Support
- [Support](https://docs.document360.com/docs/support)

--- 

Let me know if you'd like this reformatted into a table or grouped differently.
</document_content>
</document>

<document index="18">
<source>data/offline/sitemap-en.xml</source>
<document_content>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://docs.document360.com</loc>
    <lastmod>2025-02-27T22:57:03.4633306Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/configuring-the-jwt-sso</loc>
    <lastmod>2025-02-27T05:29:00.695Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/custom-pages</loc>
    <lastmod>2025-02-26T05:16:16.084Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/ai-alt-text-generator</loc>
    <lastmod>2025-02-26T04:44:27.119Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-add-extra-space-in-markdown</loc>
    <lastmod>2025-02-26T04:05:45.231Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-center-align-the-text-in-markdown</loc>
    <lastmod>2025-02-26T04:02:25.115Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/integrations-getting-started</loc>
    <lastmod>2025-02-25T16:33:17.76Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/revision-history</loc>
    <lastmod>2025-02-24T13:43:12.703Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/general-project-settings</loc>
    <lastmod>2025-02-21T09:52:04.752Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-change-the-callouts-color-in-dark-mode</loc>
    <lastmod>2025-02-21T09:26:56.091Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/glossary</loc>
    <lastmod>2025-02-17T07:13:34.846Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/adding-glossary-term</loc>
    <lastmod>2025-02-17T07:12:48.391Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/knowledge-base-site-20</loc>
    <lastmod>2025-02-17T06:52:10.387Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/february-2025-1112</loc>
    <lastmod>2025-02-17T06:52:10.387Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/workspaces</loc>
    <lastmod>2025-02-16T07:55:29.19Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/system-and-browser-requirements</loc>
    <lastmod>2025-02-14T13:03:55.147Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/sitemap-generator</loc>
    <lastmod>2025-02-14T11:44:06.779Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/adding-folders-and-files</loc>
    <lastmod>2025-02-14T09:31:25.603Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/read-receipt</loc>
    <lastmod>2025-02-14T09:16:45.443Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/managing-articles</loc>
    <lastmod>2025-02-14T07:31:33.724Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/follow-articles-and-categories</loc>
    <lastmod>2025-02-14T07:14:19.418Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/downloading-category-and-article-in-kb-site</loc>
    <lastmod>2025-02-14T07:13:37.141Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/links-status</loc>
    <lastmod>2025-02-14T06:42:29.889Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/login-using-sso-knowledge-base-portal</loc>
    <lastmod>2025-02-13T13:16:55.467Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/saml</loc>
    <lastmod>2025-02-13T13:16:05.499Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/openid</loc>
    <lastmod>2025-02-13T13:15:43.542Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/feedback</loc>
    <lastmod>2025-02-11T11:26:54.811Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/document360-getting-started</loc>
    <lastmod>2025-02-07T11:57:17.22Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/articles-analytics</loc>
    <lastmod>2025-02-07T11:26:22.092Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-add-a-background-image-for-a-text-content</loc>
    <lastmod>2025-02-07T09:01:07.8Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/tables-in-advanced-wysiwyg-editor</loc>
    <lastmod>2025-02-07T08:56:08.489Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/nginx-server</loc>
    <lastmod>2025-02-07T06:34:55.274Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/customize-site</loc>
    <lastmod>2025-02-07T06:19:17.867Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/adding-images-to-articles</loc>
    <lastmod>2025-02-07T05:13:11.909Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/ai-machine-translation</loc>
    <lastmod>2025-02-07T05:03:48.837Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/creating-a-sandbox-project</loc>
    <lastmod>2025-02-07T04:43:53.788Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/markdown-basics</loc>
    <lastmod>2025-02-06T14:43:56.436Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/customizing-the-kb-widget-using-custom-css-javascript</loc>
    <lastmod>2025-02-06T11:15:55.656Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/ai-assistive-search-ask-eddy</loc>
    <lastmod>2025-02-05T05:43:06.309Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-move-the-related-articles-above-the-feedback-section</loc>
    <lastmod>2025-02-04T13:47:39.871Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/linking-to-other-articles</loc>
    <lastmod>2025-02-04T13:41:29.254Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/july-2022-release-note</loc>
    <lastmod>2025-02-03T07:24:11.199Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/file-actions-in-drive</loc>
    <lastmod>2025-02-03T06:34:15.876Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/image-alignment</loc>
    <lastmod>2025-02-03T06:13:47.848Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-add-a-vertical-scrollbar-to-the-code-blocks</loc>
    <lastmod>2025-02-02T11:29:26.535Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/ai-writer-suite</loc>
    <lastmod>2025-02-01T07:59:39.74Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/seo-description-generator</loc>
    <lastmod>2025-02-01T07:59:38.118Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/ai-title-recommender</loc>
    <lastmod>2025-02-01T07:59:38.118Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/ai-tag-recommender</loc>
    <lastmod>2025-02-01T07:59:38.118Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/ai-writer</loc>
    <lastmod>2025-02-01T07:59:38.118Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/ai-related-articles-recommender</loc>
    <lastmod>2025-02-01T07:59:38.118Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/ai-faq-generator</loc>
    <lastmod>2025-02-01T07:59:38.118Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/ai-chart-generator</loc>
    <lastmod>2025-02-01T07:59:38.118Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/ai-search-suite</loc>
    <lastmod>2025-02-01T07:55:33.098Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/article-seo</loc>
    <lastmod>2025-02-01T07:28:27.897Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/related-articles</loc>
    <lastmod>2025-02-01T07:28:27.897Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/article-tags</loc>
    <lastmod>2025-02-01T07:28:27.897Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/adding-article-labels</loc>
    <lastmod>2025-02-01T06:46:24.807Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/managing-categories</loc>
    <lastmod>2025-02-01T06:46:24.807Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/january-2025-1111</loc>
    <lastmod>2025-02-01T06:43:34.037Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/tags</loc>
    <lastmod>2025-01-30T06:27:38.842Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/pipedrive-document360</loc>
    <lastmod>2025-01-29T13:00:24.383Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/hubspot-document360</loc>
    <lastmod>2025-01-29T12:58:59.197Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-hide-footer-in-mobile-view</loc>
    <lastmod>2025-01-29T11:31:04.132Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/markdown-editor-overview</loc>
    <lastmod>2025-01-29T04:36:29.179Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/account-locked</loc>
    <lastmod>2025-01-28T12:45:08.973Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/reader-self-registration</loc>
    <lastmod>2025-01-28T07:16:15.418Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/eddy-ai-federated-search</loc>
    <lastmod>2025-01-27T16:15:30.704Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-enlarge-the-pdf-preview-in-the-article</loc>
    <lastmod>2025-01-27T06:49:21.502Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-hide-the-left-navigation-bar-in-knowledge-base-site</loc>
    <lastmod>2025-01-26T17:04:17.558Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-hide-the-change-password-option-for-readers</loc>
    <lastmod>2025-01-26T13:05:44.638Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-change-the-color-of-the-table-of-contents</loc>
    <lastmod>2025-01-26T13:03:10.03Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-restrict-the-readers-from-copying-the-content</loc>
    <lastmod>2025-01-26T12:51:15.163Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-change-the-color-of-the-hyperlinks-in-dark-mode</loc>
    <lastmod>2025-01-26T12:47:46.693Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/csp-guidelines-for-document360-widget</loc>
    <lastmod>2025-01-25T18:09:42.581Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/css-snippets</loc>
    <lastmod>2025-01-25T18:05:37.246Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/intercom-integration</loc>
    <lastmod>2025-01-25T17:15:44.147Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/zendesk</loc>
    <lastmod>2025-01-24T14:19:01.139Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/article-access-control-knowledge-base-site</loc>
    <lastmod>2025-01-23T12:07:52.822Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/export-bulk-operations</loc>
    <lastmod>2025-01-23T11:18:53.72Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/workflow-designer</loc>
    <lastmod>2025-01-23T08:30:43.677Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-make-all-links-open-in-new-tab</loc>
    <lastmod>2025-01-22T05:13:46.095Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-change-the-color-of-feedback-buttons</loc>
    <lastmod>2025-01-22T05:13:38.761Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-change-the-color-of-the-table-header</loc>
    <lastmod>2025-01-22T05:13:31.277Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-change-the-hover-color-of-the-header-options</loc>
    <lastmod>2025-01-22T05:13:26.039Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/ask-eddy-ai-api</loc>
    <lastmod>2025-01-21T17:22:21.981Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/changing-the-url-of-an-article</loc>
    <lastmod>2025-01-21T10:28:27.14Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/mixpanel</loc>
    <lastmod>2025-01-17T07:32:17.353Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/document360-on-a-sub-folder</loc>
    <lastmod>2025-01-16T11:26:29.209Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/custom-domain-mapping</loc>
    <lastmod>2025-01-16T06:35:42.131Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/advanced-wysiwyg-editor</loc>
    <lastmod>2025-01-15T12:10:46.841Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/compliling-content-for-pdf</loc>
    <lastmod>2025-01-15T09:33:49.25Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/managing-and-customizing-the-knowledge-base-widget</loc>
    <lastmod>2025-01-15T04:32:46.084Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/top-right-menu-overview</loc>
    <lastmod>2025-01-13T13:47:09.839Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/creating-a-project</loc>
    <lastmod>2025-01-13T13:45:20.847Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/editing-and-deleting-glossary-term</loc>
    <lastmod>2025-01-13T11:33:49.194Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/main-pages</loc>
    <lastmod>2025-01-13T11:32:26.096Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/article-redirect-rules</loc>
    <lastmod>2025-01-13T09:37:03.473Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/review-reminders</loc>
    <lastmod>2025-01-13T09:28:10.27Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/ai-premium-suite</loc>
    <lastmod>2025-01-08T11:58:42.636Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/categories-and-subcategories</loc>
    <lastmod>2025-01-08T11:22:03.343Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/upgrading-your-plan</loc>
    <lastmod>2025-01-08T09:32:13.941Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/text-to-voice-functionality</loc>
    <lastmod>2025-01-07T12:32:08.699Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/ai-article-summarizer</loc>
    <lastmod>2025-01-07T12:26:36.755Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/styling-the-chatbot</loc>
    <lastmod>2025-01-07T12:21:32.869Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/securing-chatbot-authentication-using-jwt</loc>
    <lastmod>2025-01-07T12:19:38.569Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/ai-chatbot</loc>
    <lastmod>2025-01-07T12:08:04.364Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/ai-dynamic-related-articles-recommendation</loc>
    <lastmod>2025-01-07T12:04:03.168Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/eddy-ai-search-analytics</loc>
    <lastmod>2025-01-07T11:59:51.128Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/custom-css-javascript</loc>
    <lastmod>2025-01-06T11:41:50.987Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/eddy-ai-trust-page</loc>
    <lastmod>2025-01-06T07:36:48.904Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/notifications</loc>
    <lastmod>2025-01-06T07:20:49.444Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/prompt-engineering-tips</loc>
    <lastmod>2025-01-06T06:06:52.681Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-write-genai-friendly-content</loc>
    <lastmod>2025-01-06T06:00:22.838Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/wysiwyg-editor</loc>
    <lastmod>2025-01-06T05:56:15.337Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/publishing-an-article</loc>
    <lastmod>2025-01-03T11:20:59.533Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/404-page</loc>
    <lastmod>2025-01-03T05:09:09.735Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/header-primary-navigation</loc>
    <lastmod>2025-01-03T04:56:44.398Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/widgets</loc>
    <lastmod>2025-01-03T04:50:34.778Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/recycle-bin-recent-and-starred-files</loc>
    <lastmod>2025-01-01T11:33:03.121Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/all-content-overview</loc>
    <lastmod>2025-01-01T11:31:25.553Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/folder-actions-in-drive</loc>
    <lastmod>2025-01-01T09:46:21.553Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/drive</loc>
    <lastmod>2025-01-01T09:33:08.782Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/1041-release-note</loc>
    <lastmod>2025-01-01T04:58:48.649Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/article-templates</loc>
    <lastmod>2024-12-31T09:53:44.136Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/single-sign-on-sso</loc>
    <lastmod>2024-12-30T18:55:13.849Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/december-2024-10121</loc>
    <lastmod>2024-12-30T13:23:52.293Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/import-a-documentation-project</loc>
    <lastmod>2024-12-30T11:26:34.251Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/ticket-deflector-overview</loc>
    <lastmod>2024-12-24T11:31:09.58Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/reader-analytics</loc>
    <lastmod>2024-12-24T09:32:06.283Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/ai-glossary-generator</loc>
    <lastmod>2024-12-24T08:53:00.786Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/ai-customization</loc>
    <lastmod>2024-12-24T04:06:01.139Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/november-2024-10111</loc>
    <lastmod>2024-12-23T10:19:26.178Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/tabs-in-the-advanced-wysiwyg-editor</loc>
    <lastmod>2024-12-23T09:59:09.613Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/analytics-search</loc>
    <lastmod>2024-12-23T09:59:02.165Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/analytics-team-accounts</loc>
    <lastmod>2024-12-23T09:59:02.165Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/analytics</loc>
    <lastmod>2024-12-23T09:59:02.165Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/search-in-knowledge-base-site</loc>
    <lastmod>2024-12-23T09:57:34.539Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/all-articles-overview-page</loc>
    <lastmod>2024-12-23T09:57:34.539Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/filter-bulk-operations</loc>
    <lastmod>2024-12-23T09:57:34.539Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/using-the-text-editor</loc>
    <lastmod>2024-12-23T09:57:34.539Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/elements-of-the-editor</loc>
    <lastmod>2024-12-23T09:57:34.539Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/liking-or-disliking-an-article</loc>
    <lastmod>2024-12-23T09:57:34.539Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/article-import-from-word-files</loc>
    <lastmod>2024-12-18T10:37:59.074Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/team-auditing</loc>
    <lastmod>2024-12-18T09:44:41.54Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/notification-mapping</loc>
    <lastmod>2024-12-18T08:39:46.401Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/webhook-notification-channel</loc>
    <lastmod>2024-12-18T06:54:00.301Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/notification-history</loc>
    <lastmod>2024-12-18T06:52:24.497Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/smtp-email-notification-channel</loc>
    <lastmod>2024-12-18T06:51:22.459Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/microsoft-teams-notification-channel</loc>
    <lastmod>2024-12-18T06:50:26.675Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/slack-notification-channel</loc>
    <lastmod>2024-12-18T06:49:44.949Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/adding-a-new-ticket-deflector</loc>
    <lastmod>2024-12-16T11:41:41.861Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/microsoft-teams</loc>
    <lastmod>2024-12-13T13:07:26.064Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/accessing-the-ticket-deflectors</loc>
    <lastmod>2024-12-13T09:29:41.073Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/smart-bar</loc>
    <lastmod>2024-12-13T09:28:31.62Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/fullstory</loc>
    <lastmod>2024-12-13T07:38:10.971Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/amplitude</loc>
    <lastmod>2024-12-13T07:30:58.876Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/hotjar</loc>
    <lastmod>2024-12-13T07:18:41.052Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/segment-integration</loc>
    <lastmod>2024-12-13T07:13:21.1Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/heap</loc>
    <lastmod>2024-12-13T06:33:16.807Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/google-tag-manager</loc>
    <lastmod>2024-12-12T10:36:22.545Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/google-analytics-new</loc>
    <lastmod>2024-12-12T10:34:20.159Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/google-analytics-integration</loc>
    <lastmod>2024-12-12T10:31:56.777Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/make-setup-guide</loc>
    <lastmod>2024-12-12T09:04:20.309Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/asana-and-document360-integration</loc>
    <lastmod>2024-12-12T09:03:18.455Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/monday-document360-integration</loc>
    <lastmod>2024-12-12T09:02:24.868Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/typeform-and-document360-integration</loc>
    <lastmod>2024-12-12T07:46:04.667Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/jira-and-document360-integration</loc>
    <lastmod>2024-12-12T07:45:14.943Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/google-docs-and-document360-integration</loc>
    <lastmod>2024-12-12T07:41:48.928Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/freshdesk</loc>
    <lastmod>2024-12-11T10:28:49.825Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/freshservice</loc>
    <lastmod>2024-12-11T10:28:49.825Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/livechat</loc>
    <lastmod>2024-12-11T10:28:35.397Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/olark</loc>
    <lastmod>2024-12-11T10:28:35.397Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/freshchat</loc>
    <lastmod>2024-12-11T10:28:35.397Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/crisp</loc>
    <lastmod>2024-12-11T10:28:35.397Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/chatra</loc>
    <lastmod>2024-12-11T10:28:35.397Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/door-bell</loc>
    <lastmod>2024-12-11T10:28:35.397Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/gorgias</loc>
    <lastmod>2024-12-11T10:28:35.397Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/belco</loc>
    <lastmod>2024-12-11T10:28:35.397Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/sunshine</loc>
    <lastmod>2024-12-11T10:28:35.397Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/kommunicate</loc>
    <lastmod>2024-12-11T10:28:35.397Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/updating-article-contributors</loc>
    <lastmod>2024-12-10T13:06:11.267Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/gosquared</loc>
    <lastmod>2024-12-10T10:21:35.591Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/hero-section</loc>
    <lastmod>2024-12-10T09:50:05.552Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/share-articles-via-private-link</loc>
    <lastmod>2024-12-09T07:34:18.297Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/web-content-accessibility-guidelines-wcag</loc>
    <lastmod>2024-12-09T07:34:18.297Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/kb-site-20-migration</loc>
    <lastmod>2024-12-09T07:34:18.297Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/document360-mailchimp</loc>
    <lastmod>2024-12-09T06:09:30.996Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/document360-gmail</loc>
    <lastmod>2024-12-09T05:59:00.814Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/mondaycom-document360</loc>
    <lastmod>2024-12-09T05:52:09.175Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/typeform-document360</loc>
    <lastmod>2024-12-09T05:50:58.709Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/zoho-crm-document360</loc>
    <lastmod>2024-12-06T11:03:38.014Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/document360-with-trello-integration</loc>
    <lastmod>2024-12-06T10:27:05.039Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/confluence-document360</loc>
    <lastmod>2024-12-06T10:24:55.03Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/asana-document360</loc>
    <lastmod>2024-12-06T10:19:40.455Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/github-document360</loc>
    <lastmod>2024-12-06T10:14:51.266Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/url-mapping</loc>
    <lastmod>2024-12-06T09:49:14.617Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-change-the-color-of-the-text-in-markdown</loc>
    <lastmod>2024-12-06T09:36:22.971Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-add-accordion-in-markdown</loc>
    <lastmod>2024-12-06T09:14:34.325Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/header-secondary-navigation</loc>
    <lastmod>2024-12-06T08:05:49.237Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/rss-feeds</loc>
    <lastmod>2024-12-06T07:58:44.337Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/html-block</loc>
    <lastmod>2024-12-06T07:49:50.449Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/knowledge-base-categories</loc>
    <lastmod>2024-12-06T07:48:03.278Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/google-docs-document360-integration</loc>
    <lastmod>2024-12-05T10:47:19.717Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/document360-with-google-sheets-integration</loc>
    <lastmod>2024-12-05T10:31:57.627Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/google-drive-document360</loc>
    <lastmod>2024-12-05T10:25:47.229Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/text-columns-block</loc>
    <lastmod>2024-12-04T06:36:00.25Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/feedback-manager-overview</loc>
    <lastmod>2024-12-03T10:54:33.15Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/ip-restriction</loc>
    <lastmod>2024-12-03T09:42:04.977Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/plans-and-pricing</loc>
    <lastmod>2024-12-02T14:07:16.73Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/variables</loc>
    <lastmod>2024-12-02T13:40:50.793Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/snippets</loc>
    <lastmod>2024-12-02T13:38:46.385Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/jwt-reader-groups</loc>
    <lastmod>2024-12-02T13:17:08.245Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/configuring-the-article-settings</loc>
    <lastmod>2024-12-02T09:05:49.729Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/content-security-policy</loc>
    <lastmod>2024-12-02T07:39:20.023Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/support-ticket</loc>
    <lastmod>2024-12-01T19:55:18.027Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/schedule-publishing</loc>
    <lastmod>2024-12-01T07:06:47.169Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/getting-started-with-multi-lingual-knowledge-base</loc>
    <lastmod>2024-12-01T07:06:47.169Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/setting-up-a-multi-lingual-knowledge-base</loc>
    <lastmod>2024-11-29T14:33:39.118Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/text-block</loc>
    <lastmod>2024-11-29T09:55:15.212Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/tag-groups-overview</loc>
    <lastmod>2024-11-29T09:53:59.283Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/image-and-text</loc>
    <lastmod>2024-11-29T09:50:51.833Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/upgrading-from-trial-version</loc>
    <lastmod>2024-11-29T09:48:44.429Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/changing-payment-information</loc>
    <lastmod>2024-11-29T09:48:44.429Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/downgrading-your-plan</loc>
    <lastmod>2024-11-29T09:48:44.429Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/add-ons</loc>
    <lastmod>2024-11-29T09:48:44.429Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/apache-http-server</loc>
    <lastmod>2024-11-29T06:42:09.563Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/aspnet-core-server</loc>
    <lastmod>2024-11-29T06:42:09.563Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/microsoft-iis-server</loc>
    <lastmod>2024-11-29T06:42:09.563Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/convert-to-sso-account</loc>
    <lastmod>2024-11-29T05:33:27.475Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/disable-document360-login-page</loc>
    <lastmod>2024-11-29T05:33:27.475Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/auto-assign-reader-group</loc>
    <lastmod>2024-11-29T05:33:27.475Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/inviting-or-adding-sso-users</loc>
    <lastmod>2024-11-29T05:33:27.475Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/mapping-an-existing-sso-configuration-to-other-projects</loc>
    <lastmod>2024-11-29T05:33:27.475Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/team-account-idle-timeout</loc>
    <lastmod>2024-11-29T05:33:27.475Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/login-using-sso-knowledge-base-site</loc>
    <lastmod>2024-11-29T05:33:27.475Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/saml-sso-with-entra</loc>
    <lastmod>2024-11-29T05:33:27.475Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/google-sso-saml-configuration</loc>
    <lastmod>2024-11-29T05:33:27.475Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/idp-initiated-login</loc>
    <lastmod>2024-11-29T05:33:27.475Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/removing-a-configured-saml-sso</loc>
    <lastmod>2024-11-29T05:33:27.475Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/saml-sso-with-okta</loc>
    <lastmod>2024-11-29T05:33:27.475Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/saml-sso-with-onelogin</loc>
    <lastmod>2024-11-29T05:33:27.475Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/saml-sso-with-adfs</loc>
    <lastmod>2024-11-29T05:33:27.475Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/saml-sso-with-other-configurations</loc>
    <lastmod>2024-11-29T05:33:27.475Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/auth0-with-openid-sso</loc>
    <lastmod>2024-11-29T05:33:27.475Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/removing-a-configured-openid-sso</loc>
    <lastmod>2024-11-29T05:33:27.475Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/okta-with-openid-sso</loc>
    <lastmod>2024-11-29T05:33:27.475Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/adfs-with-openid-sso</loc>
    <lastmod>2024-11-29T05:33:27.475Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/other-configurations-with-openid-sso</loc>
    <lastmod>2024-11-29T05:33:27.475Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/ip-restriction-page</loc>
    <lastmod>2024-11-28T16:34:49.721Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/unauthorized-page</loc>
    <lastmod>2024-11-28T16:29:26.41Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/access-denied-page</loc>
    <lastmod>2024-11-28T16:25:01.157Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/error-pages</loc>
    <lastmod>2024-11-28T16:12:33.609Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/manage-api-documentation</loc>
    <lastmod>2024-11-28T15:42:11.982Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/export-documentation-as-zip</loc>
    <lastmod>2024-11-28T15:28:34.812Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-use-swagger</loc>
    <lastmod>2024-11-28T14:57:41.511Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-use-postman</loc>
    <lastmod>2024-11-28T14:54:19.067Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/tag-dependency-viewer</loc>
    <lastmod>2024-11-28T14:24:58.545Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/adding-a-new-tag</loc>
    <lastmod>2024-11-28T14:19:35.788Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/tag-manager-overview-page</loc>
    <lastmod>2024-11-28T14:15:46.095Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/send-notifications-from-custom-email-domain</loc>
    <lastmod>2024-11-28T07:17:34.513Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/health-check-metrics</loc>
    <lastmod>2024-11-28T06:57:33.74Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/readability-score</loc>
    <lastmod>2024-11-28T06:55:00.789Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/workflow-assignment</loc>
    <lastmod>2024-11-28T06:40:57.808Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/managing-workflow-status</loc>
    <lastmod>2024-11-28T06:30:01.841Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/block-inheritance</loc>
    <lastmod>2024-11-28T05:42:39.512Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/disqus</loc>
    <lastmod>2024-11-27T18:48:49.77Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/all-extensions</loc>
    <lastmod>2024-11-26T12:40:14.211Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/sign-up-to-document-360</loc>
    <lastmod>2024-11-24T16:47:10.992Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/october-2024-10101</loc>
    <lastmod>2024-11-23T11:29:23.098Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/managing-reviewer-accounts</loc>
    <lastmod>2024-11-23T10:26:01.444Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/chrome-extension</loc>
    <lastmod>2024-11-23T10:26:01.444Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/reviewing-an-article-inline-comments</loc>
    <lastmod>2024-11-21T13:49:31.275Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/localization-variables</loc>
    <lastmod>2024-11-20T12:10:25.066Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/drift</loc>
    <lastmod>2024-11-20T09:33:34.54Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/phrase</loc>
    <lastmod>2024-11-20T09:21:41.456Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/zapier-setup-guide</loc>
    <lastmod>2024-11-19T17:02:34.659Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/slack</loc>
    <lastmod>2024-11-19T17:00:48.153Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/salesforce</loc>
    <lastmod>2024-11-19T15:56:59.436Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/cases-page</loc>
    <lastmod>2024-11-19T15:56:36.201Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/crowdin</loc>
    <lastmod>2024-11-19T07:22:09.203Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/dashboard</loc>
    <lastmod>2024-11-18T13:32:49.48Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/seo-descriptions</loc>
    <lastmod>2024-11-18T13:08:45.597Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/full-portal-search</loc>
    <lastmod>2024-11-18T06:49:31.218Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/migrating-documentation-from-another-knowledge-base-platform</loc>
    <lastmod>2024-11-17T22:00:09.108Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/quick-summary-of-the-security-and-infrastructure-aspects</loc>
    <lastmod>2024-11-17T20:57:16.647Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/article-header</loc>
    <lastmod>2024-11-13T09:25:10.78Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/robotstxt</loc>
    <lastmod>2024-11-05T08:21:07.926Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/conditional-content-blocks</loc>
    <lastmod>2024-11-05T06:47:39.654Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/article-analytics</loc>
    <lastmod>2024-10-28T05:52:21.933Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/advanced-insertion-rules-in-integration</loc>
    <lastmod>2024-10-25T09:37:49.956Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/fair-usage-policy-for-bot-management</loc>
    <lastmod>2024-10-25T09:05:25.399Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/bot-management</loc>
    <lastmod>2024-10-25T09:04:44.642Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/backup-restore</loc>
    <lastmod>2024-10-24T06:54:38.676Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-configure-a-custom-font-in-the-knowledge-base</loc>
    <lastmod>2024-10-23T05:05:25.79Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/marking-articles-as-deprecated</loc>
    <lastmod>2024-10-17T04:43:48.55Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/custom-footer</loc>
    <lastmod>2024-10-15T09:52:35.804Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/movable-blocks-in-advanced-wysiwyg-editor</loc>
    <lastmod>2024-10-15T05:12:21.47Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/commento</loc>
    <lastmod>2024-10-14T17:41:45.514Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/cookie-consent</loc>
    <lastmod>2024-10-14T06:04:16.791Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/status-indicator</loc>
    <lastmod>2024-10-14T05:45:29.393Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/preferences</loc>
    <lastmod>2024-10-09T10:49:17.594Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/september-2024-1091</loc>
    <lastmod>2024-10-09T08:34:43.3Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/featured-image</loc>
    <lastmod>2024-10-09T07:40:02.992Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/september-2024-1082</loc>
    <lastmod>2024-10-07T06:32:22.97Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-change-the-highlighted-search-result-color-in-articles</loc>
    <lastmod>2024-10-05T08:19:28.798Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-hide-the-project-versions-dropdown-in-the-knowledge-base-site</loc>
    <lastmod>2024-10-05T08:19:28.798Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-set-the-default-height-and-width-of-the-embedded-pdf</loc>
    <lastmod>2024-10-05T08:19:28.798Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-make-the-table-border-bold-in-knowledge-base</loc>
    <lastmod>2024-10-05T08:19:28.798Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-change-the-language-name-text-in-code-blocks</loc>
    <lastmod>2024-10-05T08:19:28.798Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-center-align-the-heading-in-the-articles</loc>
    <lastmod>2024-10-05T08:19:28.798Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-set-a-default-featured-image-in-knowledge-base</loc>
    <lastmod>2024-10-05T08:19:28.798Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-hide-the-category-manager</loc>
    <lastmod>2024-10-05T08:19:28.798Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/callout-styles</loc>
    <lastmod>2024-10-05T08:19:28.798Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/body-font-style</loc>
    <lastmod>2024-10-05T08:19:28.798Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/header-font-style</loc>
    <lastmod>2024-10-05T08:19:28.798Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-keep-dark-mode-for-the-knowledge-base-site-by-default</loc>
    <lastmod>2024-10-05T08:16:03.792Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-sort-the-contents-of-a-table</loc>
    <lastmod>2024-10-05T08:16:03.792Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-customize-the-hyperlink</loc>
    <lastmod>2024-10-05T08:16:03.792Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-vertically-align-table-contents-at-the-top-in-the-knowledge-base</loc>
    <lastmod>2024-10-05T08:16:03.792Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/table-style</loc>
    <lastmod>2024-10-05T08:16:03.792Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/showhide-table-of-contents-for-an-article</loc>
    <lastmod>2024-10-03T11:42:14.409Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/article-status</loc>
    <lastmod>2024-09-29T13:31:20.99Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/excluding-articles-from-searches</loc>
    <lastmod>2024-09-24T11:15:17.346Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/x-frame-options</loc>
    <lastmod>2024-09-24T10:14:29.165Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/adding-glossary-term-in-articles</loc>
    <lastmod>2024-09-24T09:27:07.385Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/document360-my-projects</loc>
    <lastmod>2024-09-24T06:19:18.944Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/category-types</loc>
    <lastmod>2024-09-24T06:19:14.576Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/may-2024-1051</loc>
    <lastmod>2024-09-24T06:19:11.413Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/june-2024-1061</loc>
    <lastmod>2024-09-24T06:19:10.33Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/may-2024-1042</loc>
    <lastmod>2024-09-24T06:19:09.873Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/assigning-drive-folder-for-a-category</loc>
    <lastmod>2024-09-24T06:19:08.386Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/document360-support-generating-a-har-file</loc>
    <lastmod>2024-09-24T06:19:08.006Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/january-2024</loc>
    <lastmod>2024-09-24T06:18:35.533Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/march-2024</loc>
    <lastmod>2024-09-24T06:18:32.024Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/november-2023</loc>
    <lastmod>2024-09-24T06:18:30.187Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/february-2024</loc>
    <lastmod>2024-09-24T06:18:27.596Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/public-comments</loc>
    <lastmod>2024-09-20T12:48:14.547Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/embedding-a-drawio-diagram</loc>
    <lastmod>2024-09-20T12:47:23.223Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/embedding-google-forms-in-article</loc>
    <lastmod>2024-09-20T12:46:13.421Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/embedding-microsoft-streams-video-in-articles</loc>
    <lastmod>2024-09-20T12:44:36.083Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/code-blocks</loc>
    <lastmod>2024-09-20T12:37:50.898Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/private-notes</loc>
    <lastmod>2024-09-19T04:38:23.779Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/image-formatting-in-the-advanced-wysiwyg-editor</loc>
    <lastmod>2024-09-16T06:05:04.959Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/adding-files-to-articles</loc>
    <lastmod>2024-09-14T05:29:38.375Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/adding-videos-in-articles</loc>
    <lastmod>2024-09-14T05:28:02.703Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/july-2</loc>
    <lastmod>2024-09-12T03:33:29.472Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/august-3</loc>
    <lastmod>2024-09-12T03:33:17.666Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/march-4</loc>
    <lastmod>2024-09-12T03:33:00.865Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/june-2022-release-notes</loc>
    <lastmod>2024-09-09T08:37:15.445Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/january-2019</loc>
    <lastmod>2024-09-09T08:24:55.47Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/february</loc>
    <lastmod>2024-09-09T08:24:12.798Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/march</loc>
    <lastmod>2024-09-09T08:24:03.876Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/april-2019</loc>
    <lastmod>2024-09-09T08:23:52.61Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/may-2019</loc>
    <lastmod>2024-09-09T08:23:17.248Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/june</loc>
    <lastmod>2024-09-09T08:22:06.005Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/july</loc>
    <lastmod>2024-09-09T08:21:54.335Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/august</loc>
    <lastmod>2024-09-09T08:21:40.916Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/september-2019</loc>
    <lastmod>2024-09-09T08:21:15.152Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/october</loc>
    <lastmod>2024-09-09T08:20:36.162Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/november</loc>
    <lastmod>2024-09-09T08:19:30.313Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/december</loc>
    <lastmod>2024-09-09T08:19:20.731Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/january-2020</loc>
    <lastmod>2024-09-09T08:19:08.003Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/february-2020-release-note</loc>
    <lastmod>2024-09-09T08:18:56.835Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/march-2020-release-note</loc>
    <lastmod>2024-09-09T08:18:44.769Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/april-2020-release-note</loc>
    <lastmod>2024-09-09T08:18:32.569Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/may-2020-release-note</loc>
    <lastmod>2024-09-09T08:18:20.94Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/june-2020-release-note</loc>
    <lastmod>2024-09-09T08:18:05.668Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/august-2020-release-note</loc>
    <lastmod>2024-09-09T08:17:53.533Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/october-2020-release-note</loc>
    <lastmod>2024-09-09T08:17:41.962Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/november-2020-release-note</loc>
    <lastmod>2024-09-09T08:17:30.465Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/january-2021-release-note</loc>
    <lastmod>2024-09-09T08:17:18.21Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/february-2021-release-note</loc>
    <lastmod>2024-09-09T08:17:06.688Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/march-2021-release-note</loc>
    <lastmod>2024-09-09T08:16:33.863Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/april-2021-release-note</loc>
    <lastmod>2024-09-09T08:16:24.325Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/may-2021-release-note</loc>
    <lastmod>2024-09-09T08:16:10.053Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/june-2021-release-note</loc>
    <lastmod>2024-09-09T08:15:58.853Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/july-2021-release-note</loc>
    <lastmod>2024-09-09T08:15:46.503Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/august-2021-release-notes</loc>
    <lastmod>2024-09-09T08:15:33.418Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/september-2021-release-note</loc>
    <lastmod>2024-09-09T08:15:05.197Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/october-2021-release-note</loc>
    <lastmod>2024-09-09T08:08:01.938Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/november-2021-release-note</loc>
    <lastmod>2024-09-09T08:07:49.083Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/december-2021-release-note</loc>
    <lastmod>2024-09-09T08:07:37.686Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/january-2022-release-note</loc>
    <lastmod>2024-09-09T08:06:46.838Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/february-2022-release-note</loc>
    <lastmod>2024-09-09T08:06:36.091Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/march-2022-release-note</loc>
    <lastmod>2024-09-09T08:06:24.775Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/april-2022-release-note</loc>
    <lastmod>2024-09-09T08:06:13.281Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/may-2022-release-note</loc>
    <lastmod>2024-09-09T08:06:00.248Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/august-2022-release-note</loc>
    <lastmod>2024-09-09T08:04:41.673Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/september-2022-release-note</loc>
    <lastmod>2024-09-09T08:04:29.193Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/december-2022-release-note</loc>
    <lastmod>2024-09-09T08:03:59.081Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/january-2</loc>
    <lastmod>2024-09-09T08:03:49.039Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/february-3</loc>
    <lastmod>2024-09-09T08:03:37.293Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/april-3</loc>
    <lastmod>2024-09-09T08:03:17.732Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/june-3</loc>
    <lastmod>2024-09-09T08:02:57.111Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/localization-getting-started</loc>
    <lastmod>2024-09-09T06:52:32.371Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/attachments</loc>
    <lastmod>2024-09-07T10:43:26.542Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/article-discussion-feed</loc>
    <lastmod>2024-09-07T10:42:31.468Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/article-full-portal-search</loc>
    <lastmod>2024-09-07T07:57:20.858Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/drive-full-portal-search</loc>
    <lastmod>2024-09-07T07:57:20.858Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/users-groups-full-portal-search</loc>
    <lastmod>2024-09-07T07:57:20.858Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/tags-full-portal-search</loc>
    <lastmod>2024-09-07T07:57:20.858Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/settings-full-portal-search</loc>
    <lastmod>2024-09-07T07:57:20.858Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/vwo</loc>
    <lastmod>2024-09-07T07:56:17.182Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/freshmarketer</loc>
    <lastmod>2024-09-07T07:56:17.182Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/zoho-page-sense</loc>
    <lastmod>2024-09-07T07:56:17.182Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/pdf-design-templates</loc>
    <lastmod>2024-09-07T07:55:50.608Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/glossary-overview-page</loc>
    <lastmod>2024-09-07T07:55:50.608Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/find-and-replace</loc>
    <lastmod>2024-09-07T07:55:50.608Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/faq-knowledge-base-widget</loc>
    <lastmod>2024-09-07T07:44:06.556Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/edit-clone-and-delete</loc>
    <lastmod>2024-09-07T07:44:06.556Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/themes</loc>
    <lastmod>2024-09-07T07:32:39.882Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/document-header</loc>
    <lastmod>2024-09-07T07:27:45.902Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/footer-navigation</loc>
    <lastmod>2024-09-07T07:27:45.902Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/advanced-wysiwyg-editor-basics</loc>
    <lastmod>2024-09-07T07:25:12.085Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-align-the-image-in-markdown</loc>
    <lastmod>2024-09-07T07:22:11.667Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-add-shadows-to-an-image-in-markdown</loc>
    <lastmod>2024-09-07T07:22:11.667Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-add-borders-to-an-image-in-markdown</loc>
    <lastmod>2024-09-07T07:22:11.667Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/embed-youtube-shorts</loc>
    <lastmod>2024-09-07T07:22:11.667Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-embed-loom-video</loc>
    <lastmod>2024-09-07T07:22:11.667Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/how-to-embed-an-excel-file</loc>
    <lastmod>2024-09-07T07:22:11.667Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/august-2024-1081</loc>
    <lastmod>2024-09-03T06:37:26.301Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/october-2022-release-note</loc>
    <lastmod>2024-08-20T11:31:22.247Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/november-2022-release-note</loc>
    <lastmod>2024-08-20T11:31:11.386Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/may-1</loc>
    <lastmod>2024-08-20T11:29:39.947Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/december-2023</loc>
    <lastmod>2024-08-20T11:09:28.826Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/july-2024-1071</loc>
    <lastmod>2024-07-29T09:24:46.075Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/july-2024-1062</loc>
    <lastmod>2024-07-20T18:03:33.689Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/april-2024-minor-release</loc>
    <lastmod>2024-07-08T05:19:17.894Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
  <url>
    <loc>https://docs.document360.com/docs/june-2024-1052</loc>
    <lastmod>2024-06-10T11:02:48.447Z</lastmod>
    <changefreq>Weekly</changefreq>
  </url>
</urlset>
</document_content>
</document>

<document index="19">
<source>docs/README.md</source>
<document_content>
# Markdown Summarizer

A tool that splits Markdown files at H2 headings and summarizes each section using an LLM.

## 1. Features

- Splits Markdown documents at H2 headings  
- Summarizes each section with an LLM  
- Preserves key information and technical details  
- Outputs a new Markdown file containing the summaries  
- Supports multiple LLM providers with automatic fallback  
- Tracks progress via console output  
- Saves intermediate results to resume processing if interrupted  

## 2. Usage

The tool is broken into three commands for flexible workflows:

### 2.1. Load Command

Splits a Markdown file into sections (at H2 headings) and saves them to a JSON file:

```bash
# Basic usage
python summarize.py load input.md

# Specify output JSON file
python summarize.py load input.md --output_file=sections.json

# Enable verbose output
python summarize.py load input.md --verbose
```

### 2.2. Process Command

Processes the JSON file, generating summaries for each section and saving progress after each:

```bash
# Basic usage
python summarize.py process sections.json

# Use a specific LLM model
python summarize.py process sections.json --model=gpt-4o-mini

# Enable verbose output
python summarize.py process sections.json --verbose
```

### 2.3. Save Command

Converts the processed JSON back into a summarized Markdown file:

```bash
# Basic usage
python summarize.py save sections.json

# Specify output Markdown file
python summarize.py save sections.json --output_file=summary.md

# Enable verbose output
python summarize.py save sections.json --verbose
```

### 2.4. All-in-One Command

Runs all steps in sequence:

```bash
# Basic usage
python summarize.py all input.md

# Specify output file and model
python summarize.py all input.md --output_file=summary.md --model=gpt-4o-mini

# Enable verbose output
python summarize.py all input.md --verbose
```

### 2.5. Using with uv

Thanks to a built-in shebang line, you can also run the script directly with `uv`:

```bash
uv run summarize.py load input.md
```

## 3. Workflow Benefits

Splitting the process into steps helps with:

1. **Resumable runs**: If something crashes, pick up where you left off  
2. **Selective edits**: Manually clear individual summaries in the JSON to reprocess only those  
3. **Progress tracking**: JSON acts as a checkpoint during long jobs  
4. **Output control**: Tweak the JSON before generating the final Markdown  

## 4. LLM Support

Uses the `llm` library to connect to various providers. Tries these models in order:

1. `gpt-4o-mini` (OpenAI)  
2. `openrouter/google/gemini-flash-1.5`  
3. `openrouter/openai/gpt-4o-mini`  
4. `haiku` (Claude 3 Haiku)  

Override the default with the `--model` flag.

## 5. Requirements

- Python 3.9+  
- Dependencies: fire, rich, llm, tenacity, pathos  

## 6. Example

Input:

```markdown
# My Document

## 7. Introduction
This is an introduction to my document.

## 8. Section 1
This is the first section with important details.

## 9. Section 2
This is the second section with more information.
```

Output:

```markdown
# My Document

## 7. Introduction
Summary of the introduction...

## 8. Section 1
Summary of section 1...

## 
</document_content>
</document>

<document index="20">
<source>docs/d363.json</source>
<document_content>
[
  {
    "heading": "What is Document360?",
    "text": "## What is Document360?\n\nHere is an overview and a navigation guide to help you get started with your Document360 experience.\n\n### What is Document360?\n\n**Document360** is a Knowledge management platform that allows you to create and curate a self-service public, private, or mixed access Knowledge base.\n\nWhen using Document360, you'll interact with several key interfaces:\n\n* #### [My Projects](/help/docs/document360-getting-started#my-projects)\n* #### [Knowledge base portal](/help/docs/document360-getting-started#knowledge-base-portal)\n* #### [Knowledge base site](/help/docs/document360-getting-started#knowledge-base-site)\n* #### [Document360 AI - Eddy AI](/help/docs/ai-features)\n* #### [Resources](/help/docs/document360-getting-started#other-resources)\n\n---",
    "summary": "## What is Document360?\n\nDocument360 is a knowledge management platform enabling creation and curation of public, private, or mixed-access knowledge bases.  Key features include My Projects, Knowledge base portal/site, and Document360 AI (Eddy AI) for interacting with the platform."

... (Data file content truncated to first 5 lines)
</document_content>
</document>

<document index="21">
<source>docs/d363.md</source>
<document_content>
# Document360

## 1. What is Document360?

Document360 is a knowledge management platform for creating and managing public, private, or mixed-access knowledge bases. Key features include project management, knowledge base portals, and AI assistance through Eddy AI.

## 2. Knowledge base portal

The Knowledge Base Portal lets you create, manage, and configure knowledge base sites. Core functions include:
- Creating and managing categories, articles, and templates
- File, team, and reader management
- Branding, domain, and security configuration

Additional features:
- Dashboard (project overview, individual contributions)
- Documentation (tree-view structure, bulk actions)
- API documentation (interactive testing)
- Analytics (user engagement metrics)
- Widgets (in-app search)
- Drive (cloud storage)
- Settings (customization)
- Universal search across projects
- Site preview and publishing

## 3. Table of Contents

Complete documentation guide covering:
- Platform overview and project creation
- Editor tools (Markdown, WYSIWYG, Advanced WYSIWYG)
- Article management (publishing, SEO, access control)
- AI features (Eddy AI tools, machine translation, search analytics)
- Security measures (SSO, authentication, CSP)
- File management and collaboration tools
- Branding options and customizations
- Release notes from 2019-2025

## 4. My projects

The project dashboard displays all projects you own, belong to teams, or have reader access upon login. Each project shows a visibility tag (public, private, or mixed).

## 5. Other Resources

Document360 provides:
- Public feedback portal
- Feature explorer for trial projects
- In-app support chat
- Categorized articles and templates
- File, team, and reader management
- Analytics and AI assistance (Eddy AI)
- Article revision history
- Email support and documentation
- Scheduled maintenance notifications

## 6. Document360 AI - Eddy AI

Eddy AI assists with:
- Article writing and SEO descriptions
- Tag, title, and related article recommendations
- Assistive search functionality
- Article summarization

## 7. Sign up to Document360

Create an account by visiting the signup page.

## 8. Knowledge base site

End-users access articles through the knowledge base site. Three access levels:
- **Public**: Open to everyone
- **Private**: Login required
- **Mixed**: Combination of public and private content

## 9. System Requirements

**Supported operating systems**: Windows 7+, macOS Mavericks+, Linux, Android 5+, iOS 12+
**Minimum hardware**: 2-core CPU, 4GB RAM
**Supported browsers**: Chrome 91+, Firefox 79+, Safari 13.1.2+, Edge 88+
**Required browser features**: JavaScript, Cookies, Session/Local Storage, IndexedDB, HTTPS-TLS v1.2+
**Unsupported**: Internet Explorer

## 10. Troubleshooting

Common login issues (reCAPTCHA, blocked access, loading) can be resolved by:
1. Switching browsers/networks, clearing browser cache
2. Checking VPN connection and system time
3. Providing HAR files or console errors to support@document360.com

Incorrect system time can cause callback URL failures.

## 11. System and browser requirements

### 11.1. System Requirements

- **Operating System**: Windows 10+, macOS High Sierra+, Ubuntu 18.04+
- **Processor**: Dual-core, 2 GHz+
- **RAM**: 4GB minimum, 8GB recommended
- **Disk Space**: 500MB available
- **Graphics**: Integrated graphics (dedicated GPU recommended)
- **Network**: Stable internet with TLS 1.2+, ports 80/443 open
- **Dependencies**: Java 8+, .NET Framework 4.7.2+
- **Security**: HTTPS required, SAML for SSO

### 11.2. Browser Requirements

- **Supported Browsers**: Chrome 90+, Firefox 88+, Safari 13+, Edge 90+
- **Plugins**: Adobe Acrobat for PDF viewing
- **Resolution**: 1280x720 minimum
- **Essentials**: JavaScript and Cookies enabled
- **Mobile**: Responsive design for iOS/Android

### 11.3. Additional Notes

- **Testing**: Verified on VMs and physical hardware
- **Updates**: Auto-update available
- **Accessibility**: Screen reader and keyboard navigation support

## 12. Signing Up to Document360

Signup process:
1. Navigate to signup page
2. Provide basic details
3. Verify email with 6-digit code (5 failed attempts = lockout)
4. Set password (8+ characters, upper/lower/number/special character)
5. Choose use case and select up to two templates
6. Customize URL and branding
7. Set privacy (Private, Public, Mixed)
8. Complete setup with pre-loaded content

Free trial available, paid plans after trial. FAQs cover language support, plans, verification, migration, and post-trial access.

## 13. Navigating the 'Your projects' page

Dashboard displays project tiles for owned, team, and reader projects. Users can:
- Create new projects or sandboxes
- View project details (logo, name, access, settings)
- Access documentation
- Manage profile
- View release updates
- Access help resources

## 14. Project dashboard

"Your Projects" dashboard shows projects by role (owner, team member, reader). Access tiers:

| Professional | Business | Enterprise |
| --- | --- | --- |
| Basic project access | Enhanced team features | Unlimited project associations |

## 15. Accessing profile options

Profile menu (top-right corner) includes:
- **My profile**: Edit personal info, image, name, email, bio, language, role, content access
- **View Access/Permissions**: See portal and content role permissions (admin edit required)
- **Change Password**: Enter current password, set strong new password (8+ chars, mixed case, number, special char)

## 16. Top-right menu overview

Quick access to:
- Profile management
- Access level checks
- Password changes
- Updates
- Help resources

## 17. Release updates

Access release notes via:
- Knowledge base portal button
- Summaries on dashboard
- Dedicated changelog page

## 18. Key features in the top-right menu

- **My profile**: Personal info, image, bio, roles, permissions
- **View access and permissions**: Check assigned roles
- **Change password**: Secure credential updates
- **Release updates**: Latest feature notifications
- **Help menu**: Documentation and support access

## 19. Help menu

Access tools:
- Search answers
- Documentation at `https://docs.document360.com/docs`
- Support chat
- Ticket creation
- Feature requests
- System status at `https://status.document360.com/`

Contact support directly at <support@document360.com>.

## 20. Switching between Document360 projects

Switch projects via dropdown menu or dashboard. Projects can be:
- Public, private, or mixed
- Sandbox environments for testing

### 20.1. Step-by-Step Guide to Creating a Knowledge Base Project

1. **Access Dashboard**: Login, click Document360 icon, click **+ Project**
2. **Select Use Case**: Choose from Knowledge Base, Software Documentation, SOPs, User Manuals, API Docs
3. **Choose Templates**: Select up to two relevant templates
4. **Personalize**:
   - Enter preferred URL or use default
   - Customize logo, colors, language
5. **Set Privacy**: Choose Private, Public, or Mixed access
6. **Access Portal**: Start with pre-loaded template content

## 21. Creating a project in Document360

Projects centralize documentation including articles, categories, home pages, teams, readers, groups, and custom settings for organized knowledge base management.

## 22. Overview tab

Project-level insights for Owners/Admins:
- Contribution metrics
- Performance data
- Storage details
- User statistics
- Issues (broken links, search failures)

Data includes article counts, team accounts, reader stats, drive capacity, and backup dates. Filter by workspace and language.

## 23. Multilingual Knowledge bases

Support for multiple languages improves user experience through internationalization features.

## 24. Dashboard

Project insights with two tabs:
- **My Contribution**: Personal metrics
- **Overview**: Team-level data

## 25. My contribution tab

Track personal work:
- **Article summary**: Created/published/draft counts, views, likes/dislikes
- **Assigned to me**: Workflow status and due dates
- **Review reminders**: Stale articles needing updates
- **Feedback**: User feedback assigned to you
- **Broken links**: Articles with link issues

Filter by workspace, language, and date range.

## 26. Creating a sandbox project

Isolated testing environment for:
- Feature experimentation
- Workflow refinement
- Team training
- Risk-free development

## 27. FAQ

- **Languages per Plan**: Professional (2), Business (3), Enterprise (5)
- **Knowledge Base**: Self-service platform managed through categories, branding, and security

## 28. Adding multiple languages to a single workspace

Navigate to **Settings > Knowledge base portal > Localization & workspaces**.

Two methods:
1. Edit workspace, select languages via "New language"
2. Use "Add new language" icon on overview page

Translate content manually or via Crowdin. Manage default language, display names, and text direction.

## 29. Quick summary - Security and infrastructure

Data stored in MongoDB Atlas three-server cluster with encryption and TLS. Backups include:
- Daily/weekly/monthly retention
- Azure Blob Storage replication
- Authenticated API tokens

Hosted on Microsoft Azure with DDoS protection.

## 30. Document360 security and infrastructure

Data security through partnerships with:
- Algolia (search)
- MongoDB Atlas (database)
- Microsoft Azure (storage)

TLS encryption and industry-standard backup protocols.

## 31. Security information of integrations and partners

- **Algolia**: SOC2/SOC3 compliant, HTTPS/TLS encryption, data isolation
- **MongoDB Atlas**: VPC isolation, firewalls, end-to-end encryption, encryption at rest
- **Azure Blob Storage**: HTTPS encryption, storage/client-side encryption, threat protection

## 32. Creating a Sandbox project

Steps:
1. **Settings**: Navigate to **Settings > Knowledge base portal > General**
2. **Create**: Click **Create Sandbox** in Sandbox section
3. **Configure**: Enter project name (≤30 chars), select language
4. **Visibility**: Defaults to Private
5. **Invite**: Add team members and assign roles
6. **Finalize**: Click **Create project** then **Open Sandbox**

Notes:
- Sandbox badge indicates environment
- SSO users cannot create sandboxes
- Custom domains available through mapping
- Manual export/import for migration
- Non-SSO account required for access

## 33. Best practices

- Secure API keys (don't share, delete compromised)
- Assign minimal necessary permissions
- Use predefined roles for team access
- Enable automatic and manual backups
- Set document visibility appropriately

## 34. Business continuity and disaster recovery

High availability through:
- Geographically replicated databases
- Multiple service instances
- Code reviews and QA testing
- Version control systems
- Azure CDN for service delivery

## 35. GDPR compliance

Full GDPR compliance with explicit consent for data collection/storage. [Learn more](https://document360.com/gdpr-compliance/).

## 36. X-Frame options

Security feature preventing unauthorized embedding in frames/iframes. Blocks malicious sites from displaying your knowledge base.

## 37. Content security policy

CSP restricts external CSS, scripts, and frames to prevent malicious content. Controls allowed domains via `Content-Security-Policy` header.

## 38. Enable the content security policy

Enable CSP to prevent XSS attacks:
- Specify allowed domains for CSS, JavaScript, frames
- Use correct URL format (`https://example.com`)
- Separate entries with commas
- Add nonce attributes to custom HTML scripts

## 39. Access X-Frame Options

Enable to prevent unauthorized embedding:
- Navigate to **Settings > Users & Security > Security**
- Toggle **Enable X-Frame options**
- Blocks clickjacking attacks
- Specific domains can be allowed via CSP

## 40. Testing your content security policy settings

CSP implemented via meta elements. Verify by checking page source for `Content-Security-Policy`. Video playback issues often indicate inconsistent CSP settings.

## 41. Bot management

Document360 uses Cloudflare for bot detection:
- Heuristics and machine learning analysis
- User-agent and traffic pattern monitoring
- Good bots (GoogleBot, BingBot, GPTBot) allowed
- Bad bots (DDoS, scraping, credential stuffing) blocked

## 42. Troubleshooting

Blocked content usually from incorrect CSP:
- Update CSP settings to whitelist domains
- Clear browser cache
- Test in different environments
- Contact support with CSP header details
- Verify widget CSP settings

## 43. Fair usage policy details

Rate limiting prevents bot traffic and DoS attacks while maintaining user experience.

## 44. Rate limiting

Cloudflare enforces:
- 1,500 requests per minute per IP
- 300 requests per 10 seconds per IP
- Supplemented by heuristic and ML bot detection

## 45. Editor choices in Document360

Three editors available:
1. **Markdown**: Syntax and HTML customization
2. **WYSIWYG**: Rich text formatting (no custom code)
3. **Advanced WYSIWYG**: Hybrid of Markdown and WYSIWYG

## 46. Markdown editor

Split-screen editor for typing and previewing. Ensures consistent formatting through guided flexibility. Supports image insertion with adjustable sizes.

## 47. WYSIWYG editor

HTML-based editor displaying formatting as you type. Recommended for articles with heavy code/media content. Easy for HTML-savvy users.

## 48. Advanced WYSIWYG editor

Lightweight editor combining Markdown syntax with visual editing. Type '/' for commands. Ideal for text-centric, code-heavy, or media-rich content.

## 49. Changing default editor at project level

- Navigate to **Settings > Knowledge base portal > General**
- Select desired editor (WYSIWYG/Advanced WYSIWYG)
- Click **Save** (affects new articles only)

## 50. Left navigation bar: Category tree manager

Sections include:
- Dashboard, Documentation, API Documentation
- Analytics, Widgets, Drive, Settings
- Categories & Articles options: All articles, Workflow, Starred, Recycle bin, Site builder, Content tools

## 51. Article editor's header section

Displays:
- Article URL/slug
- Status (New, Draft, Published, Stale)
- Contributors, stats, dates
- Preview functionality
- Title/slug/description editing
- AI Glossary recommendations
- Workflow status updates
- More menu actions (clone, move, hide, delete, SEO, tags, related articles)
- Comments section
- Full-screen view

## 52. Using Markdown in your Knowledge base

Format using:
- Markdown syntax or toolbar
- Correct syntax: no spaces in bold (`**Text**`), spaces in headings (`### Heading`)
- Reference: [Markdown syntax guide](https://www.markdownguide.org/basic-syntax/)

## 53. Markdown toolbar

Features:
- Headings (H2-H4)
- Text formatting (bold, italic, strikethrough, blockquote)
- Lists (ordered, unordered)
- Inserts (tables, images, files, links)
- Callouts (info, warning, error)
- Private notes, LaTeX, content reuse
- Code blocks, glossary, video embedding
- Spell checker and find/replace

## 54. Heading levels

Create headings with `##`, `###`, `####` (space required between `#` and text). Blank line before heading recommended.

## 55. Styling text

Supported formats:
- Bold: `**text**`
- Italics: `*text*` or `_text_`
- Strikethrough: `~~text~~`
- Highlight: `==text==`
- Superscript: `text^superscript`
- Subscript: `text~subscript`

## 56. Basic Markdown syntax

Lightweight markup language for professional content formatting. No coding knowledge required.

## 57. Markdown Commands

- **Headings**: `##` to `######` (H1 reserved for titles)
- **Bold**: `**text**` (Ctrl+B)
- **Italics**: `*text*` or `_text_` (Ctrl+I)
- **Strikethrough**: `~~text~~`
- **Lists**: `1.` (numbered), `*` or `-` (bulleted)
- **Links**: `[text](URL)`
- **Blockquotes**: `>`
- **Horizontal Line**: `***`

## 58. Lists

- **Numbered**: `1.`, `2.`, `3.` (auto-increment)
- **Bulleted**: `*`, `-`, or `+`

## 59. Links and blockquotes

- Links: `[text](URL)` (e.g., [Document360](https://docs.document360.com))
- Blockquotes: `>` prefix (e.g., > This quotes the line)

## 60. More elements

Additional Markdown features:
- **Images**: `![Alt text](URL "Title")`
- **Reference Links**: `[Link text][ref]` with `[ref]: URL`
- **Escaping**: Use `\` before special characters
- **Videos**: Embed via `<iframe>` tags

## 61. Quick tips for beginners

- Structure with headings (`##`, `###`)
- Highlight with **bold** or _italics_
- Organize with lists (`*` or `1.`)
- Link to resources

## 62. WYSIWYG editor

Displays content exactly as it will appear when published. Conversion to WYSIWYG is permanent (no switching back to Markdown).

## 63. WYSIWYG toolbar

Text editing and formatting options including:
- Heading styles
- Media insertion
- Advanced formatting tools

## 64. Example: Creating a simple article

Demonstrates Markdown article structure with headings, links, and dividers. References advanced syntax resources.

## 65. Heading 2

Rich text editor features:
- Text formatting and media insertion
- LaTeX and callouts
- Content reuse and glossary integration
- Advanced WYSIWYG switch
- Code view, undo/redo, find/replace
- Table and alignment options

## 66. Using Advanced WYSIWYG editor

Slash commands for quick insertion. Standard Markdown syntax works only when typed directly (not pasted).

## 67. Advanced WYSIWYG editor

Lightweight rich-text editor with Markdown support. More visual than traditional Markdown, more flexible than standard WYSIWYG.

Switching:
- Advanced WYSIWYG ↔ WYSIWYG (Draft/New articles only)
- Markdown → Advanced WYSIWYG (irreversible)

## 68. Toolbar

Categorized toolbar for:
- Formatting (styles, headings, typography, colors, lists)
- Inserting elements (images, videos, links, files, tables, code, FAQs)
- Inline comments and Word pasting
- LaTeX support

## 69. When, Where, and Why to Use the WYSIWYG Editor

Best for users familiar with HTML editors who prefer Word-like experience. Supports direct content pasting and large table insertion.

## 70. Typography

Conversion table for typographic symbols (em dash, ellipsis, quotes, arrows, copyrights, fractions, mathematical symbols, currency).

## 71. Keyboard shortcuts overview

Access via article **More** icon → **Keyboard shortcuts**. Includes Windows and Mac shortcuts for:
- General commands (copy, paste, undo, redo)
- Text formatting (bold, italic, underline)
- Paragraph formatting (headings, lists, alignment)
- Selection (Ctrl+A)

## 72. Unsupported markdown syntax

Does not support:
- Markdown tables
- Subscript/superscript syntax
- Manual formatting required for these features

## 73. Conditional content blocks

Personalized content delivery based on:
- IP address, country, device type
- Reader groups, dates

Available only for KB site 2.0. Not indexed by search engines.

## 74. Movable blocks

Drag blocks to rearrange content. Insert new blocks above/below. Delete blocks with automatic content shifting.

Limitations:
- Dividers and FAQ sections are fixed
- FAQ treated as single block

## 75. Creating a table

Two methods:
1. `/table` command (3x3 table with header)
2. Format menu Insert option (up to 10x10)

## 76. Set up conditional content blocks

Steps:
1. Open article in Advanced WYSIWYG editor
2. Enable via settings icon (Show/Hide)
3. Use AND/OR logic for conditions
4. Select parameters (country, date, device, etc.)
5. Save conditions for reuse (max 25 per article)

## 77. Tables in Advanced WYSIWYG editor

Supported across all plans. Essential for organizing data clearly.

Features:
- Row/column insertion/deletion
- Cell color customization
- Advanced table styling

## 78. Customizing table appearance

Options include:
- Background/border color
- Border styles (solid, dashed, dotted)
- Header row visibility
- Alternating row colors
- CSS styling
- Word/Excel web app paste support

## 79. Formatting table content

- **Insert/delete rows/columns**: Menu options for positioning
- **Merge cells**: Combine multiple selected cells
- **Alignment**: Vertical (top/middle/bottom), Horizontal (left/center/right/justify)
- **Fit to page**: Adjust table width distribution

## 80. Image formatting in Advanced WYSIWYG editor

Features:
- Alignment (left, center, right, inline)
- Captions and alt text
- Hyperlinking with new tab option
- Styling (rounded, bordered, shadow)
- Resizing, cropping, flipping, rotating
- Drawing tools (lines, shapes)
- Filters (grayscale, blur)

## 81. Editing tabs

Via "Edit" icon:
- **Duplicate**: Click "Duplicate tab"
- **Rename**: "Change tab name" (50 char limit)
- **Delete**: "Delete tab" (Ctrl+Z to undo)
- Cannot delete if only two tabs remain

## 82. Customizing tabs

- Background/border color selection (preset, HEX, RGB)
- Drag/drop reordering
- Changes affect entire tab content block

## 83. Tabs in Advanced WYSIWYG editor

Organize content into sections within articles. Typically available in Business and Enterprise plans.

## 84. Viewing tabs in Knowledge base site

Consistent across devices. Switch without page refresh. Sequential export to PDF with headings.

Limitations:
- No nested tabs
- Tab headings excluded from TOC
- No page breaks within tabs
- Cannot embed in other components

## 85. Creating tabs

Insert via editor menu. Default two tabs structure. Add tabs with + button (2-10 tabs maximum).

Content supports text, images, tables, links, callouts, code, and enhancements.

## 86. Categories and subcategories

Organizational tools for logical grouping:
- Categories: Broad topics
- Subcategories: Specific divisions
- Customizable naming and icons
- Multi-category article assignment

Best practices:
- Clear naming
- Logical hierarchy (max 3 levels)
- User-centric organization

## 87. Creating a category

Four methods:
1. Top-bar "Create"
2. Flywheel icon
3. More icon
4. Within Folder/Index

Types: Folder, Index, Page, GitHub. Max 3 subcategory levels recommended.

## 88. Changing category icon

Navigate to Documentation, select folder/index category, choose emoji, confirm. Not available for Page-type categories.

## 89. Managing categories

Features across all plans:
- Create, rename, delete, move, clone
- Reorder, star, customize icons

Improves knowledge base organization and accessibility.

## 90. Hiding and unhiding a category

Restrict team access to categories/subcategories. Hidden items marked visually. Four methods via navigation menus.

Hiding a category hides all content beneath it.

## 91. Renaming a category

Two methods:
1. Direct edit on category page
2. More menu → Rename

Does not change URL slug - only display name.

## 92. Deleting a category

Four methods:
1. Categories & Articles: Hover → More → Delete
2. Folder/Index: Click More → Delete
3. Multiple selection: Checkboxes → Delete
4. Specific items: Hover → More → Delete

Root category deletion removes all subcategories and articles (30-day recycle bin retention).

## 93. Cloning a category

Select "More" → "Clone". Choose target workspace/category. Optional automatic link updates.

Security restrictions apply based on destination settings.

## 94. Category types

Organizational containers for articles:
- **Folder**: Content container (no URL)
- **Index**: Generates URL, lists articles
- **Page**: Functions as article with content

Switch types anytime without data loss.

## 95. Starring a category

Star categories/subcategories/articles for quick access. Remove via Starred section or clicking star icon again.

## 96. Moving a category

Five methods across workspaces:
1. Drag and drop
2. Categories & Articles More menu
3. Folder/Index More menu
4. Multiple item selection
5. Specific item More menu

Cannot move root categories into subcategories.

## 97. Drive folder mapping

Automatically places contributor-uploaded images into Drive folders based on article category/subcategory.

## 98. Associating Drive folders to categories

Navigate to category, click More → Set drive folder, select folder, click Update.

Subcategory mappings override parent mappings. Only affects new images.

## 99. Downloading categories and articles

Export to PDF with customizable templates. Private projects/workspaces only.

Enable via Settings → Knowledge base site → Article settings. 500MB daily limit.

## 100. Creating an article

Four methods:
1. Top-bar Create button
2. Flywheel icon
3. More icon
4. Create button within folders/indexes

Plan limits: Professional/Business (5,000 articles), Enterprise (10,000 articles).

## 101. Managing articles

| Feature | Professional | Business | Enterprise |
|--------|-------------|---------|----------|
| Create/Edit/Publish | ✅ | ✅ | ✅ |
| Basic Organization | ✅ | ✅ | ✅ |
| Version Control | ❌ | ✅ | ✅ |
| Multi-user Collaboration | ❌ | ✅ | ✅ |
| Advanced Access Controls | ❌ | ❌ | ✅ |
| Custom Workflows | ❌ | ❌ | ✅ |

## 102. Locking an article

Prevents simultaneous edits. Auto-unlocks after 15 minutes of inactivity or navigation away.

Manual unlock via portal Lock icon.

## 103. Creating article templates

Save and reuse templates for consistent content structure. Three creation methods:
1. Flywheel icon
2. More option
3. Top-bar Create button

Auto-populates slugs. Access template management from Templates overview.

## 104. Deleting an article

Five methods:
1. Categories & Articles More menu
2. Editing mode deletion
3. Bulk deletion in folders/indexes
4. Specific article deletion
5. All articles section bulk deletion

## 105. Renaming an article

Navigate to Documentation, click article name or More → Rename. Enter new name and Update.

Confirmation required for published articles.

## 106. Moving an article

Five methods:
1. Drag-and-drop categories
2. More menu
3-4. Folder/Index navigation
5. All articles section

Select destination workspace/category. Optional link reference updates.

## 107. Editing an article

Process:
1. Select article
2. Click **Edit** (status changes to Draft)
3. Make changes
4. Click **Publish** to update live version

View markdown formatting via More menu without creating new version.

## 108. Replicating an article

Copy articles to multiple categories:
1. Navigate to article
2. Select "Replicate"
3. Choose target category
4. Click confirm

Source article edits only. Replicated article settings may be restricted.

## 109. Hiding and Unhiding an article

Hide articles for team-only access. Four methods:
1. Categories & Articles section hover
2. Folder/Index category selection
3. Specific article hover
4. All Articles section filtering

Hidden articles show strikethrough in Documentation view.

## 110. Word .docx files

Import .docx files under 15MB for direct content transfer.

## 111. Cloning an article

Two methods:

**Method 1**: Categories & Articles navigation
- Hover article → More → Clone
- Fill details and confirm

**Method 2**: Within Folder/Index
- Navigate to folder → Hover article → More → Clone
- Fill details and confirm

Considerations:
- Cross-workspace cloning possible
- Security restrictions apply
- Auto-update links adjust references

## 112. Importing Word files

Options:
- Single article: Imports entire document
- Multiple articles: Creates article per H1/H2 heading
- Preserves media and hyperlinks

## 113. Troubleshooting

Errors:
- `documentation.categoriesAndArticles.maxArticlesCountReached`
- `documentation.categoriesAndArticles.articleLimitExceedsPerCategory`

Limits:
- 100 articles per category
- 5,000 per workspace (Pro/Business)
- 10,000 per workspace (Enterprise)

Solutions: Reduce articles or upgrade plan.

## 114. Publishing from the editor

Click Publish with optional comment. Configure:
- Tags (manual or AI)
- SEO descriptions (manual or AI)
- Related articles (manual or AI)
- Status indicators (manual or AI)

AI features require minimum article lengths (50-200 words).

## 115. Publishing articles in bulk

Select unpublished articles, click Publish. AI features require minimum lengths.

Hidden/restricted articles won't appear in search. Verify workspace settings and restrictions.

## 116. Publishing an article

Make drafted articles live. Plan features:

- **Professional**: Basic customization and SEO
- **Business**: Audience targeting and analytics
- **Enterprise**: Custom domains and multi-language

## 117. Determining editors while importing .docx files

Editor selection in Settings → Knowledge base portal → General → Editor.

Markdown does not support .docx imports.

Best practices:
- Split large documents into multiple articles
- Keep files under 15MB
- Troubleshoot TOC conflicts, firewall blocks, password protection, style mismatches

## 118. Adding inline comments to an article

Select text, click comment icon, type comment, send. Mention collaborators with @ symbol.

Unresolved comments automatically deleted from published articles.

## 119. Reviewing an article using Inline comments

Streamlines article reviews and feedback. Available exclusively in Advanced WYSIWYG editor.

## 120. Inserting images in Markdown editor

Four methods:
1. Upload from local device
2. Insert via URL
3. File Picker
4. Drag and Drop

Specify dimensions with {height="x" width="y"}. Upload to Drive recommended.

## 121. Inserting images in Advanced WYSIWYG editor

Three methods:
1. `/image` command
2. Insert menu (device, Drive, URL)
3. Copy/paste/drag-and-drop

Images automatically saved to Drive.

## 122. Managing comments

Actions:
- View: Click highlighted areas or comment icon
- Resolve: Creator marks resolved
- Edit/Delete: Comment author only
- Reply: Team accounts only
- Filter: All, Mentioned me, Open, Resolved

Limits: 20 replies per comment, 500 comments per article, 500 characters per comment.

## 123. Adding videos to articles

Enhance complex concepts and processes through video embedding via toolbar options.

## 124. Insert video in Advanced WYSIWYG editor

Three methods:
1. Embed URL (self-hosted or platform)
2. Embed code insertion
3. Drive file upload

Use `/video` command. Broken link detection available.

## 125. Troubleshooting broken images

Common causes:
- Incorrect image URL
- Missing image file

Solutions:
1. Retrieve URL from code view or element inspection
2. Test URL in browser (404 = missing image)
3. Verify image exists at correct path
4. Upload to Document360 Drive for permanence

## 126. Insert video in Markdown editor

Two methods:
1. URL insertion (YouTube, Wistia, Vimeo)
2. Drive file insertion

Both support alt text and dimension adjustment.

## 127. Adding files to articles

Embed files via:
- Markdown editor: Insert file button
- Advanced WYSIWYG: `/Insert file` command, drag-and-drop, or file selector

Files appear with Download option.

## 128. Adding hyperlinks

Connect text, images, or files to:
- Related content
- External resources
- Internal sections

Replicated articles cannot be linked within other articles.

## 129. Editing or unlinking hyperlinks

**WYSIWYG**: Click linked text → Edit/Unlink options
**Markdown**: Manual syntax editing required

## 130. Adding hyperlinks to articles

Select text, open Link panel, specify:
- Internal article links
- Internal heading links
- External URLs

Optional new tab opening. Slight differences between editors.

## 131. Attaching files to articles

Upload or provide URL. Files appear above tags and TOC on right side.

Process:
1. Click More icon
2. Access Attachments
3. Choose method (URL or upload)
4. Arrange if needed
5. Save

Enable Show article files in settings if missing.

## 132. Bookmark links inside articles

Link to specific headings (H2, H3, H4) via Advanced WYSIWYG editor.

Select text, choose heading from dropdown, optionally open in new tab.

## 133. Effect of Machine translation on Hyperlinks

- Internal links automatically update to translated versions
- Consistent article slugs across languages prevent broken links
- Relative paths recommended for internal links

## 134. Adding Email links

**Markdown**: `[link_text](mailto:email_id)`
**Advanced WYSIWYG**: Select text → Ctrl+K or /link → Enter `(mailto:email_id)`

## 135. Code blocks

Prism.js syntax highlighting for:
HTML, C#, Java, JavaScript, XML, JSON, CSS, SQL, Python, Markdown, PHP, PowerShell, Text

## 136. Effect of changing article headings on hyperlinks

Heading changes break existing hyperlinks. Prevent this by:
1. Using WYSIWYG editor
2. Adding anchor tags within headings
3. Separating hyperlink name from visible text

## 137. Creating code blocks in Markdown editor

Use triple backticks (```) before and after code, or Ctrl+Shift+P shortcut.

## 138. Creating code blocks in Advanced WYSIWYG editor

Three methods:
1. Insert → Code Block
2. Triple backticks + Enter
3. `/code block` + Enter

Floating menu for language selection and block management.

## 139. Creating code blocks in WYSIWYG editor

Process:
1. Navigate to article
2. Click Code block icon
3. Select language from dropdown
4. Enter code
5. Click Insert

Edit/Delete icons modify existing blocks.

## 140. Using private notes

Reminders and internal context for articles. Excluded from PDF downloads but included in browser-generated PDFs.

## 141. Adding private notes

Available across all plans. Visible only to:
- Reader groups
- Project team members

Create in Markdown or Advanced WYSIWYG editors.

## 142. Private notes in Markdown editor

Syntax: `:::(Internal) (Private notes)\nOnly visible to team accounts\n:::`

Editable by modifying content. Delete by removing syntax.

## 143. Private notes in Advanced WYSIWYG editor

Create via `/Private note` or Insert menu. Manage visibility for:
- All team members
- Security groups
- Reader groups

Copy, edit, or delete via floating menu. Cannot modify in published articles.

## 144. Embedding Stream videos

Support for Microsoft SharePoint Stream videos in Markdown and WYSIWYG editors.

## 145. Embedding SharePoint Stream videos

Process:
1. Navigate to video
2. Select Share → Embed code
3. Customize with start time, size, autoplay, responsive options
4. Manage viewer access permissions

## 146. Embedding Google forms

Use embed HTML code blocks within articles.

## 147. Embedding Draw.io diagrams

Two methods:
1. **Embed**: Copy image tag from Diagrams.net, paste into Markdown or Code view
2. **Export**: Save as PNG/SVG, upload via Insert Image

Privacy settings must be public in storage location.

## 148. Embedding Microsoft Stream videos

Paste embed code directly in Markdown or use Advanced WYSIWYG Code View/Insert Video.

Typical embed code:
`<iframe src="<Stream video URL>" width="640" height="360" frameborder="0" scrolling="no" allowfullscreen title="<Video_file_name>"></iframe>`

## 149. All articles overview page

Bulk actions for multiple articles/categories:
- Publish, preview, copy links
- Hide, move, delete
- Set reminders, check status
- Tag, translate, download PDF
- Deprecate

Streamlines large-scale operations.

## 150. Managing multiple articles

Efficient bulk handling with actions for:
- Publishing and scheduling
- Previewing and link copying
- Hiding, moving, deleting
- Reviewing and status updates
- Tagging and machine translation
- PDF exporting

Important: Article status affects available actions. Categories with subcategories restrict hide/move/delete options.

## 151. Exporting all articles

Export via platform interface:
1. Navigate to All articles
2. Filter by criteria (status, category, etc.)
3. Click Export

CSV includes: title, category, status, date, URLs. Draft articles require category export.

API endpoint available for programmatic access.

## 152. Article review reminder

Alert system for article reviews ensuring accuracy and timeliness.

Create reminders for:
- Immediate review
- Future dates (30 days, 3 months, custom)
- Individual or multiple articles

Red "Needs review" tag appears with hover reason. Clear by clicking tag and marking reviewed.

## 153. Marking multiple articles as Reviewed

Two methods:

**All Articles Method**:
1. Filter by "Stale" under Review reminder
2. Select articles
3. Click Mark as Reviewed or set reminder days

**Content Tools Method**:
1. Documentation → Content tools → Article review reminders
2. Create reminder, specify details
3. Select workspace, language, articles
4. Use filters for efficient selection

## 154. Excluding articles from search engines

Maintain confidentiality for sensitive content. Available across all plans.

## 155. Adding SEO title and description

Process:
1. Navigate to article
2. Click More → SEO
3. Enter meta title (5-60 chars) and description (150-160 chars)
4. Use AI generator for articles with 200+ words
5. Update for article name changes
6. Manage per language version

## 156. Excluding articles from external search engines

Navigate to article → Click More → SEO settings → Check "Exclude from external search engine results" → Save.

## 157. Excluding articles from Search results and Eddy AI

Process:
1. Navigate to article/category
2. Click More → Article settings
3. Select exclusion checkboxes:
   - Exclude from knowledge base search
   - Exclude from Eddy AI assistive search
4. Save changes

Cloned articles retain parent search visibility settings.

## 158. Changing article slug

Modify URL slug via:
1. Portal SEO tab
2. Article editor

Create redirect rules to prevent broken links. Special characters require proper encoding.

## 159. Article tags

Keywords for searching, filtering, and bulk actions. Apply to articles, categories, and drive files.

Manage via Tags page. Drive file tags visible only in knowledge base.

## 160. Adding tags to articles or categories

Process:
1. Navigate to portal
2. Click More → Tags
3. Create/select tags
4. Generate AI suggestions (200+ word articles)
5. Save and publish

Tag limits: 30 characters with permissible symbols.

## 161. Related articles

Links appear at article bottom pointing to published knowledge base articles only.

Not displayed in widgets.

## 162. Adding Related articles

Three methods:
1. Knowledge Base portal selection
2. Publish checklist selection
3. Eddy AI suggestions (50+ word articles)

Auto-relate option available. Access restrictions apply.

## 163. Add article labels

Streamline content management across all plans. Enable quick sorting and filtering (e.g., release notes location).## 194. Adding labels to articles

**Five methods** available in Knowledge Base portal:

1. **Article Editor**: More → Labels → Add
2. **All Articles**: Select articles → More → Add labels → Apply filters
3. **Workflow Assignments**: Select articles → Add labels → Apply filters  
4. **Starred Section**: Select articles → Add labels OR hover → More → Add labels
5. **Folder/Index Category**: Navigate to category → Select articles → More or bulk selection

**Limits**:
- Max **10 labels per article**
- Max **10,000 labels per project**
- **Internal only** - not visible on site, not searchable, but filterable

**Key difference**: Tags are public/searchable, labels are private/organizational.

## 195. Adding a featured image to an article

Click "More article options" → "Featured image" → "Upload an image." 

Use high-quality JPEG or PNG images sized between **1200x800 and 2000x1200 pixels** for optimal clarity and device responsiveness.

## 196. Featured image

Enhances SEO and link previews in Document360. **Does not appear on the article itself.**

Available only in **Business and Enterprise plans**.

## 197. Adding attachments to an article

Navigate to article → "More article options" → "Attachments" → Add URL or upload from Drive → Select and insert → Arrange or remove as needed.

Attachments display near **Table of Contents and Tags** on the knowledge base site.

## 198. Status indicator

Displays near article titles on knowledge base site as "New", "Updated", or "Custom".

No specific implementation details or plan relationships provided.

## 199. Attachments

**Storage limits by plan**:

| Professional | Business | Enterprise |
| --- | --- | --- |
| 5MB | 10MB | 20MB |

Professional: Basic support (5MB limit)
Business: Standard support (10MB limit)  
Enterprise: Advanced support (20MB limit)

## 200. Manually updating the "Status indicator" for an article

Navigate to article → "More article options" → "Article settings" → Change status.

Customize indicator text via **localization variables** and color in **Article settings**.

Specify display duration in article settings.

## 201. Knowledge base site view

Public website for end-user article access. Project members manage all content.

Article status indicated visually:
- **New** = green
- **Updated** = orange  
- **Custom** = user-defined color

## 202. Article status

**Portal statuses** streamline content management:
- **Draft**: Initial creation
- **Needs review**: Pending approval

Readers see update/new indicators. Improves team efficiency.

## 203. Article status in the Knowledge base portal

Four article statuses:
1. **New**: Draft articles, team-only access
2. **Draft**: Published articles with draft updates, original remains live
3. **Published**: Publicly accessible
4. **Needs review**: Flagged for contributor review or automated system

Applies to category pages also.

## 204. Preferences

No preference settings defined for any plans.

## 205. Automatic "Status indicator" update

Enable via **Settings > Knowledge base site > Article settings & SEO**.

Turn on "Automatically set article status" in Category manager accordion.

Set display duration in days.

See [Category manager](/help/docs/knowledge-base-category-manager) for details.

## 206. Article status of hidden articles

Hidden articles show strikethrough in portal and are inaccessible on site.

Can be hidden in any status (New, Draft, Published, Needs review).

Articles flagged as Needs review require contributor action or automated reminders.

Hidden categories also hide their articles.

Category pages display article statuses for maintenance tracking.

## 207. Show/hide table of contents for an article

Control TOC visibility via **site-wide settings** or **individual article settings**.

Only **headings (H2, H3, H4)** appear in TOC - not bold text.

## 208. What is a deprecated article?

Outdated articles marked as obsolete. May be replaced due to:
- Subject removal
- Content changes  
- New concepts

Deprecation tagging occurs at article/category level.

Optional custom message with links to updated versions improves UX.

## 209. Mark as deprecated

Feature indicates when plans are retired or phased out.

## 210. Updating the preferences for an article

Navigate to article → More icon (•••) → Preferences in Article settings → Adjust checkboxes for comments, TOC, feedback → Save.

Article-specific process. Disqus setup may require additional configuration.

## 211. Marking multiple articles as deprecated

Select articles → "Deprecate" → Add reason → "Apply".

Visual tag appears on knowledge base site view.

## 212. Marking an article as deprecated

Navigate to article in portal → Article settings via More icon → Enable Deprecated toggle → Optionally add formatted reason → Save.

## 213. Schedule publishing

Schedule content publication for specific dates/times.

Improves content calendar planning and consistency.

## 214. Update article contributors

Automatic contributor tracking based on actions (create, update, publish).

Readers can view contributors' other articles.

**Enterprise plan**: Manual contributor addition/removal
**Professional/Business**: No manual contributor management

## 215. Setting up schedule publishing

Navigate to article/category → "Publish later" → Choose date/time/timezone → Optional comments → "Schedule".

Works for articles and categories.

## 216. Adding or deleting contributors

Access contributor list via Article information icon → Manage popup → Add (search) or remove (icons).

If no contributors listed, search and add one.

Contributors persist until team account deletion.

## 217. Editing a schedule publication

Navigate to article → **Scheduled** dropdown → "Edit schedule" → Modify date/time/timezone → Optional comments → "Schedule".

Publish immediately via "Publish now" option.

## 218. Schedule publishing on multiple articles

Select articles → Choose date/time/timezone → "Schedule".

Scheduled articles show "Publish later" icon.

Cannot edit scheduled articles - must cancel schedule first.

No API publishing for scheduled articles.

Moving scheduled articles to new workspace clears schedule.

## 219. Cancel schedule publishing

Navigate to article → **Scheduled** dropdown → "Cancel" → Confirm "Yes".

## 220. Discussion feed

Collaboration feature for users across roles to review articles/categories.

Supports peer reviews and approvals.

Available across all plans - specific tier features unknown.

## 221. Delete from feed

Hover over message → Delete icon → Undo available.

Feed disabled after article publication.

## 222. FAQ

Comments enabled during draft/edit mode, disabled after publishing.

Inline comments possible in Advanced WYSIWYG editor.

Access articles, categories, versions, languages.

## 223. Article revision

Editing creates new unpublished version, preserving old version in history until published.

Team accounts can compare/revert versions.

Must manually delete older versions.

Supports collaboration, audit, and accuracy.

## 224. Creating an article version

Two methods:
1. **Direct edit**: Modify published article
2. **Fork**: Create new version from older revision

Both require publishing new draft.

## 225. Revision history

| Features | Professional | Business | Enterprise |
| --- | --- | --- | --- |
| Version Control | | | |
| Change Tracking | | | |  
| Collaboration Features | | | |

## 226. Comparing article versions

Highlight additions/removals/formatting changes.

Swap comparison views.

View revision history.

Revert to previous versions (published articles require deletion first).

Published article dates auto-generated, cannot be changed.

## 227. Article analytics

Provides article-specific insights:
- Reads (engagement-based)
- Views (unique clicks)  
- Likes/dislikes
- Link status

Available across all plans.

Optimize content strategy and UX.

## 228. Article revision actions

- **Fork**: Create editable version
- **Delete**: Remove unpublished version  
- **Open**: Access previous versions
- **Workflow history**: Track stages, assignees, comments, dates
- **Publish**: Make version public

Version details include number, contributor, date, visibility.

## 229. Security - Article access control

Granular access via team/reader accounts and groups.

Control access levels across Professional, Business, Enterprise plans.

## 230. Health check metrics

Analyze articles/categories (English only) for:
- Readability issues (long sentences, missing links)
- SEO optimization

Improve content quality and search performance.

## 231. Accessing article analytics

Click **More (•••)** → **Analytics** in editor.

Metrics:
- **Reads**: Daily updated engagement
- **Views**: Unique browser clicks  
- **Likes/Dislikes**: Reader feedback
- **Link Status**: Working/broken/unknown/ignored

Use link validation tool for maintenance.

Real-time updates. Project-wide insights via **Go to Analytics**.

## 232. SEO metrics

Optimize with:
- Titles: 50-70 characters
- Descriptions: 120-160 characters  
- Featured image present
- 1-3 external/internal links ideal

Tool categorizes as Problems/Suggestions/Good Work.

## 233. Accessing the Article access control

1. Navigate to article
2. Click **More** > **Security**  
3. Choose **Knowledge base portal** (team) or **Knowledge base site** (readers)

**Portal**: Manage team access for updates/settings
**Site**: Control reader access to published articles

## 234. Readability score

Health Check Metrics score (0-100 scale).

Higher scores = easier reading.

## 235. Checking the readability score

Open article → "More" → "Health check metrics" → Expand "Readability metrics".

Score thresholds:
- Below 30: Problems  
- 30-59: Suggest improvement
- Above 59: Good

Click "Check now" for immediate results.

## 236. Accessing health check metrics

Navigate to article → Click **More (•••)** → Select **Health Check Metrics**.

Panel includes:
- SEO metrics  
- Readability metrics
- Classification: Problems/Suggestions/Good Work

Click **Check now** for updated insights.

## 237. Readability metrics

- **Readability Score (0-100)**: Higher = better
  - Problems: below 30
  - Suggestions: 30-59  
  - Good Work: above 59
- **Paragraph Length**: Optimal ≤150 words
- **Sentence Length**: Recommended ≤20 words
- **Sub-heading Distribution**: Presence = Good Work, absence = Suggestions

> NOTE: Excludes LaTeX and code blocks.

## 238. Accessing the Sitemap in Document360

Manage sitemaps via **Settings > Knowledge base site > Article settings & SEO > SEO**.

Choose update frequency (e.g., Daily).

Submit XML sitemap to Google Search Console.

Lists URLs and metadata (last modification times).

## 239. Public article comments

Enable via Disqus plugin.

Configure Disqus integration for automatic activation.

## 240. Sitemap

XML file detailing website structure for search engine crawling.

| Professional | Business | Enterprise |
| --- | --- | --- |
| No | Supported | Supported |

Only for public projects.

## 241. Robots.txt

No meaningful data available.

## 242. What is a Robots.txt file?

Text file instructing web crawlers on site access/indexing.

Controls crawler access to specific files/directories.

## 243. Read receipt

Confirms article acknowledgment - crucial for important updates.

Available only in KB site 2.0 for private/mixed projects.

Not supported for JWT configured projects.

## 244. Enabling comments on a public article

Ensure Disqus integration active → Navigate to article → More icon → More article options → Preferences tab → Check "Enable feedback" → Save.

Disable by deselecting checkbox.

Removing Disqus disables all comments.

## 245. Managing Read receipts in the Knowledge base portal

Manage via:
- Bulk actions on all articles  
- Individual article settings
- Category rules in settings

Settings rules have priority.

Republishing forces re-acknowledgment.

## 246. Accessing Robots.txt in Document360

Navigate to **Settings > Knowledge base site > Article settings & SEO > SEO** → Click **Edit** under Robots.txt.

Set crawl rules, block pages/folders, add crawl delays.

Examples: Block admin data, prevent tag indexing, allow sitemap access.

Include sitemap links. Ensure no duplicate files.

## 247. Reader acknowledgement in the Knowledge base site

Prompt appears after configuring read receipts.

Scroll to bottom → Check box → Click submit.

Confirmation message displays upon successful acknowledgment.

## 248. Read receipt page

Manage read receipt rules:
- Create new category rules  
- Rearrange rule priority
- View/edit rule details
- Modify dependencies
- Edit/delete rules
- Set visibility (Show/Hide)

## 249. Share articles via private link

KB Site 2.0 (post-June 10th projects) supports external sharing.

Generate unique link for any article - even unpublished.

External users don't need portal access.

Manage links via delete/regenerate.

Links expire if article deleted.

## 250. Acknowledgement required in the Knowledge base site

Announcement icon on home page indicates pending acknowledgments.

Click icon → **Acknowledgement required** page.

Filter by workspace (Current/All/Specific) and status (Required/Acknowledged).

## Bulk folder actions

Document360 Drive supports efficient folder management across all plans with tiered storage (Professional: 50GB, Business: 100GB, Enterprise: 500GB). Key capabilities include creating folders mirroring KB structure, starring for quick access, bulk operations (move, copy, delete), and system folders (Images, Settings, Documentation) with restricted modification. Folder actions encompass renaming, color customization, breadcrumb navigation, and dependency tracking. The Recycle Bin retains deleted items 30 days. Workflow integration assigns statuses/members with due dates, enhancing team collaboration. Content reuse features (Variables, Snippets, Glossary) streamline documentation through centralized updates, with templates enabling consistent article creation. AI-powered tools (Eddy AI suite) assist in writing, SEO, translation (16 languages), and search (Ask Eddy API), consuming credits managed via settings. Security measures include GDPR/SOC2 compliance, access control, and JWT authentication for private projects.## 393. Creating a snippet

To create a snippet, go to Documentation > Content tools > Content reuse > Snippets. Click "Create snippets," name your snippet (up to 30 characters: letters, numbers, hyphens, underscores), set language (Global by default), choose WYSIWYG or Markdown editor, add content, and click "Create snippet."

## 394. Quick navigation for glossary management

Manage glossary terms via Content tools > Content reuse. Add/edit/delete single or multiple terms, import from CSV, link overview page to header/footer/menu/homepage. Filter by language. Terms apply project-wide, not per workspace. Check article usage before deleting. Bulk import supported. Terms can be removed from articles.

## 395. Managing glossary terms

Access glossary through Content tools > Content reuse > Glossary. Features include language filtering, term creation/editing, bulk import/export (CSV), term search with preview, usage tracking across articles, and AI-powered generation with Eddy AI. SEO benefit: improved search relevance through keyword definitions.

## 396. Adding a glossary term

Navigate to Content tools > Content reuse > Glossary. Create new term with Name (max 100 chars), Language, Term (max 100 chars), and Content (max 500 chars). Click "Create Glossary." Translate terms using Name field as reference. Global terms can't be language-specific. CSV import available.

## 397. Troubleshooting

CSV upload issues often stem from non-English Excel regional settings. Switch Excel to English (United Kingdom) region, ensure headers match template, then save and re-upload. Use HTML tags (`<img src="...">`, `<a href="...">`) for images and links in definitions. Contact support for persistent problems.

## 398. Adding glossary terms

Add glossary terms via left menu or search. Use "Add Term" button to create entries across Professional, Business, or Enterprise categories. Organize alphabetically. Write clear definitions and proofread. Edit or delete entries as needed. Bulk import available for efficiency.

## 399. Importing glossary terms

Prepare CSV with terms and definitions using downloaded template (with/without sample data) or create your own. Edit in Excel or Google Docs. Go to Content tools > Content reuse > Glossary > Import terms. Upload CSV and wait for validation. Fix errors (duplicates, long definitions) using error log. Import valid terms to streamline management.

## 400. Managing glossary terms

(No data provided)

## 401. Editing a Glossary term

Edit terms via Content reuse > Glossary. Hover over term, click "Edit." Update term/definition, translate to desired languages ("Translate" or "Translate again"). Remove translations with "Remove language." Save with "Update." Global glossaries support translation.

## 402. Inserting glossary term in an article

Glossary terms provide instant definitions on hover, marked with dotted underline.

**Markdown Editor**: Use Glossary icon or `{{glossary.Term_name}}` syntax (case-sensitive).

**WYSIWYG Editor**: Click Glossary option in toolbar.

**Advanced WYSIWYG Editor**: Access via Insert menu, select terms, insert merge codes. Preview required to see rendered terms.

## 403. Deleting a Glossary

Delete terms individually (hover/click) or bulk (select/click). Check dependencies first. Remove terms from articles manually before deleting from glossary to avoid data loss. View references before deletion. Open articles and remove terms manually to preserve content.

## 404. Translating glossaries

Create multilingual glossaries for consistency and localization. Navigate to glossary section, create new entry, select language, enter terms/content, translate to other languages, save. Default language marked as Main. Completed translations show green tick.

## 405. Feedback manager

Feedback manager tracks, evaluates, and responds to user feedback on knowledge base articles. Access via Documentation > Content tools > Feedback manager. Two tabs: Article feedback (ratings/comments) and No search results feedback (unsuccessful searches).

## 406. Managing the glossary landing page

Add glossary overview page link to KB site header/footer/secondary navigation. URL format: `https://yourdomain/docs/glossary-overview` (replace with your domain). Customize site navigation to improve accessibility.

## 407. Exporting glossary terms

Export via Documentation > Content tools > Content reuse > Glossary. Select language, click "Export CSV." Download includes: Glossary Name, Definition, Dependencies, Updated By, Updated On.

## 408. Managing feedback in the No search results feedback tab

Handle user reports of unsuccessful searches. Review queries, understand context, assign tasks, take action (create/update content, add keywords). Track progress with status updates. Notify users of replies. Improves search experience and fills content gaps.

## 409. Feedback manager overview

Access Feedback manager via Documentation > Content tools > Feedback manager.

Two tabs:
- **Article feedback**: Reader ratings (Yes/No) and comments on specific articles
- **No search results feedback**: User searches that returned no results

## 410. Managing feedback in the Article feedback tab

Handle article feedback ratings and comments. Readers rate helpfulness and provide comments. Respond by reviewing feedback, opening related article, assigning tasks, discussing with team, updating status (Open, Planned, In Progress, Complete, Closed). Enable notify toggle to automatically close feedback.

## 411. Custom pages

Create standalone pages separate from articles for policies, terms, etc. Available only for KB site 2.0 projects. Supports customization and multilingual content.

## 412. Additional features

Filter, bulk update, and export feedback (up to 90 days). Status clarification: "Complete" allows reopening, "Closed" means resolved permanently.

Create custom pages via Documentation > Content Tools > Custom Pages (Draft Writer or Editor roles). Click Create Page, enter details, use editor to add/format content. Set SEO details, collaborate via comments, publish when ready.

## 413. Managing a Custom page

Manage via Content tools > Custom Pages list. Edit by selecting and clicking "Edit." Delete by selecting and clicking "Delete" (confirm, check dependencies, click again). Clone with "Clone" button (prefixed "Clone -"). Deleted pages cannot be restored.

## 414. Try this feature

Add custom pages to header/footer for easy access. Initial limit: 5 pages per project. Restrict access by user role. Deleted pages are permanent.

## 415. Multilingual custom pages

Translate pages via language dropdown. View translation details and click to translate content.

## 416. What are tags?

Tags are labels (letters, numbers, words, phrases) describing content. Example: "Installation" tag for software installation article.

Benefits: Improved navigation, content grouping, better keyword searches, increased external search visibility.

Best practices: Concise tags, broad categories, consistent naming, avoid overuse/irrelevant tags. AI tool recommends tags.

## 417. FAQs

Multiple tags allowed per article/file. Tags improve search results. Limit: 1000 tags per project. No limit per item. Bulk import not supported.

## 418. Tags

Professional plan: Basic tag support. Business plan: Advanced management. Enterprise plan: Premium features with customization/analytics.

## 419. Key features of the Manage tags page

Manage via Documentation > Content tools > Tags. Create, search, view creation info (creator, date), examine dependencies (Articles, Page category, Files). Edit, move, merge, or remove references. Export to CSV. Filter by associations, creation date, creator.

Cannot delete tags with dependencies. Remove dependencies first.

## 420. Adding a new tag

Team accounts use tags to organize articles, pages, and files. AI recommendations help create relevant tags efficiently.

## 421. Manage tags page overview

Central hub for tag management. Assign tags to articles, categories, files. Organize tag groups. Access via Documentation > Content tools > Tags.

## 422. Adding tags to the library

Four methods:
1. Manage Tags page (create new)
2. Documentation editor
3. Drive file tagging
4. All articles page

Use dropdown/search to select or create tags.

## 423. FAQs

All tag actions through Manage tags page (Content tools > Tags).

View associated articles/files by clicking reference numbers.

Edit/delete tags directly from Manage tags page.

Merge similar tags with "Merge tags" option.

Remove dependencies individually or bulk with "Remove dependencies."

## 424. Tag naming guidelines

Allowed: uppercase, lowercase, numbers, spaces, special characters (_ + - @ # % ^ & ! ())

Forbidden: \ / : * ? " < > |

## 425. Tag groups page overview

Organize related tags (articles, categories, Drive files) for easier management. Shows relationships and dependencies.

## 426. Tag limitations and details

Up to 1000 tags per project. Tag names max 30 characters; descriptions max 100. Descriptions show as tooltips on hover and below titles on Tags page.

## 427. Adding tags to tag groups

Two methods:
1. Assign group during tag creation
2. Select existing tags and move to group in tag library

## 428. Deleting tag groups

Permanently removes group and all tags. Breaks links to articles, categories, files. Tags cannot be added to articles directly. Groups organize tags only.

## 429. Manage tag dependencies

Track where tags apply (articles, categories, files). Efficient tag usage and cleanup.

## 430. Creating a tag group

Steps:
1. Knowledge base portal > Documentation tab
2. Content tools > Documentation > Tags
3. Groups tab > Create group
4. Enter name/description > Create

Organize tags effectively.

## 431. Find and replace

Search and replace keywords/phrases across articles/categories. Works with words, numbers, selected characters.

## 432. Viewing tag dependencies

Steps:
1. Documentation > Content tools > Tags
2. Click number under Articles/Page category/Files in drive
3. Review usage details in Tag dependencies window

### 432.1. Information available

Articles: title, status, workspace, language, creator, date

Page categories: title, status, workspace, language, creator, date

Files: file name

## 433. Removing tag dependencies

Steps:
- Select items with checkboxes
- Click "Remove dependencies"
- Bulk removal: "Select all" then "Remove dependencies"

Manage tag associations efficiently.

## 434. Performing the find and replace operation

Access via Content tools > Documentation > Find and replace. Enter search text (use filters optionally) and replacement text. Select articles to update. Choose publish/draft status. Click "Replace."

Control precision with whole-word matching. Advanced filters: workspace, language, status.

## 435. SEO descriptions

Add SEO descriptions to articles or generate for multiple articles/categories. Access via Content tools > Documentation > SEO description. Settings vary by plan.

## 436. Generating SEO descriptions

Generate via Content tools > Documentation > SEO description. Select articles, click "Ask Eddy AI." Review/save generated descriptions.

Best practices: 155-160 characters, keyword-rich, align with user intent, actionable. Filters available for article selection. Titles: 50-60 characters with relevant keywords.

## 437. Find and replace in editor

Locate/modify text within specific article. Access via editor icon. Works on current article only.

## 438. FAQ(s)

Available to team accounts with Editor role or custom roles with "Perform Find and replace" permission.

Replace with empty field removes found text.

Markdown/HTML syntax unaffected - only visible text replaced.

Search excludes Recycle Bin articles.

Limit: 1000 articles per replacement.

## 439. Downloading the ZIP file

Navigate to Import & Export project. Find latest export under Recent files. Click Download or Copy link.

## 440. Export project API endpoint

Business/Enterprise plans only. API endpoint exports project content. Limit: 2 exports per day. Overwrites previous downloads.

Exports: Markdown (.md), WYSIWYG (.html), JSON (multilingual).

## 441. Exporting a project

Steps:
1. Documentation > Content tools > Import & Export > Import & Export project
2. Click Export
3. Choose articles by modification date (All, 7/30/90 days, Custom)
4. Select workspaces, languages, categories
5. Include media files as needed
6. Click Export - completion notified via popup

Export includes selected content. Media files optional. Times vary by content size. Background processing supported.

## 442. Exporting your Document360 project as a ZIP file

Export project as ZIP including articles, category pages, optional media. Import ZIP into another Document360 project. Plan capabilities unspecified.

## 443. Importing a project ZIP file

Import ZIP files into Knowledge Base portal. Matching workspace slugs merge data; differing slugs create new workspace. Avoid conflicts by modifying workspace slug before import.

Verify supported features, file formats, destination workspace. Check FAQs for common errors. Max file size: 1GB. Only Document360 ZIP files supported.

## 444. Migrating documentation from other platforms

Migration support for 100+ platforms (Zendesk, Freshdesk, etc.) across all plans. Initiate via website form or within Document360. Provide current KB URL and platform. Experts handle transfer.

## 445. Document360 migration - What happens next?

Three steps:
1. Expert consultation and estimate
2. Automated and manual transfer
3. Quality assurance including SEO redirect rules

Redirect rules prevent broken links, 404 errors, and search ranking loss. Critical for maintaining user experience.

## 446. Importing a Document360 project ZIP file

Supported across all plans. Migrate between projects or restore from backups. Import articles, category pages, media. Requires Editor role or custom role with Update/Publish access.

## 447. PDF templates overview page

Access via Content tools > Import & Export > Export to PDF. List templates sortable by date. System and custom templates available. Actions: clone, edit, delete (with confirmation). Create new templates with dedicated button.

Default templates cannot be deleted. Single template becomes default automatically.

## 448. New PDF template

Create customizable PDF templates with: name, layout, margins, cover page (title, description, logo, image), terms & conditions (existing/custom), table of contents, watermark (text/image), header/footer images/text, page numbers, text formatting (font, size, color).

Various character limits and image size requirements apply.

## 449. Default template

Set any template as default for automatic use during exports. Click "Set as default" before saving. Default templates cannot be deleted.

## 450. Designing a PDF template

PDF templates (formerly "Design templates") control PDF design, styling, and formatting for brand consistency. Available across all plans. Select or create during PDF export.

## 451. Compiling content for PDF

All plans export content to customized PDFs. Features: naming, templating, password protection.

## 452. Other actions on PDF

Actions: download, regenerate, clone, edit, view details, delete. Share draft articles. Export SVG images addressed.

Limitation: SVG rendering issues with SelectPDF plugin. Workaround: convert to PNG/JPG.

## 453. FAQ(s)

PDF templates offer customizable layouts for professional documents, saving time while ensuring branding consistency. Templates adapt to specific needs.

Knowledge base platform manages content creation, categories, articles, templates, files, team accounts, and site settings (branding, domain, security).

## 454. Analytics

Various analytics (article, search, reader, team, feedback, links, page not found, Eddy AI, ticket deflection) categorized by plan. Data specific to active workspace/language. Presented in UTC time.

Professional: limited features. Business/Enterprise: expanded options.

## 455. Export to PDF

Steps:
1. Documentation > Content tools > Import & Export > Export to PDF
2. Select published content only
3. Create new PDF: name, optional password, template, workspace, language
4. Preview template, select categories/articles
5. Click Export - wait for Success status

## 456. Accessing Articles analytics

Navigate to Analytics > Articles. Shows views, reads, likes, dislikes. Filter by date range, user type (Team accounts or readers), JWT authentication. Metrics distinguish views from engagement (reads).

Location- and category-based analytics available. Data includes deleted articles. Graphical and list presentation. Export options available.

## 457. Accessing Eddy AI search analytics

Dashboard tracks search performance: conversations, answered/unanswered queries, conversation depth, popular/unanswered queries, referenced articles. Filter by date.

Address unanswered queries to improve accuracy. Data aggregates across chatbots/widgets/languages. Some metrics language-specific.

## 458. Articles analytics

**Plans supporting article analytics**

| Professional | Business | Enterprise |
| ------------ | -------- | ---------- |
|              |          | ✓          |

Insights into article performance: user engagement, geographic distribution, top content. Data-driven KB improvements.

## 459. Search analytics

Tracks user search behavior. Optimizes content and identifies gaps. Monitors search trends, successful queries, no-result searches.

## 460. Eddy AI search analytics

Insights into AI search performance. Supports all plans. Metrics: unanswered searches, visualizations. Multilingual support. Conversational metrics require KB site 2.0.

## 461. Knowledge base site view

User feedback on no-result searches identifies content gaps. Analyze popular terms for relevant content creation. "Bounced search" = searches with no result clicks.

## 462. Accessing the Reader analytics page

Access via Analytics > Reader. Filter by date, reader type (self-registered, SSO, JWT, invited), knowledge base/widget analytics.

Data: total readers, self-registered, frequent readers, detailed info (views, reads, likes, dislikes, articles accessed, last login). Export as CSV. Refresh up to 15 minutes.

## 463. Accessing the Search analytics page

(No summary available)

## 464. Reader analytics

Insights into reader activity for Private/Mixed access projects. Track engagement to optimize content strategy.

## 465. Team accounts analytics

Detailed analytics on team members: account types, content access/creation, contributions, last logins.

## 466. Accessing the Feedback analytics page

Access via Analytics > Feedback. Filter by date, widget type, JWT. Analyze metrics (article feedback, likes, dislikes, comments) via graphs/tables.

View specific articles and feedback. Export as CSV. Important: Only feedback with comments included. Refresh up to 15 minutes.

## 467. Feedback analytics

Track total comments, likes, dislikes for articles/pages. Data visualization in charts/graphs. Supported across all plans.

Team accounts analytics via Analytics section. Filter by date ranges (15-minute delay). Metric tiles: total accounts, published articles, top performers.

Click team accounts for detailed contributions. Export overall/individual data as CSV.

## 468. Accessing the Team accounts analytics page

Navigate to Analytics > Team accounts. Use date filters (15-minute update delay). Three metric tiles plus detailed contribution data.

Click team accounts for article performance details. Export options for analysis/reporting.

## 469. Accessing the Links status analytics page

Navigate to Analytics > Link status.

## 470. Links status overview page

Shows internal/external links with status (working, broken, redirect, ignored). List includes article name, link type, URL, status, filtering options.

Broken links show 404 errors or broken image thumbnails. Filter/export (CSV) options. Identify articles with deleted links.

Tracks all workspace links for functionality accuracy.

## 471. Links status analytics

Broken link checker under Analytics. Validates internal, external, media links. Scheduled, manual, article-level validations improve SEO/user experience.

## 472. Manage links

Search/filter links by type/dependency/status (included/ignored). Add/remove to ignore/include lists via checkboxes/dropdown/button. Export as CSV.

## 473. Link validation

Three validation methods:

1. **Scheduled**: Automatic based on plan. Analytics > Links status > Scheduled validation.
2. **Manual**: On-demand. Analytics > Links status > Manual validation > Validate links. 24-hour report generation, overwrites previous.
3. **Article-level**: Unlimited checks from article editor. More > Analytics > Validate now.

Manual validation requires permission. Overwrites previous reports within 24 hours. Article-level per article.

## 474. Troubleshooting

5-second timeout for link validation. If links appear broken but work in browser, use Postman to check HTTP response (200 = good).

Error codes 404, 500, 502 indicate true problems. Contact support for persistent issues.

Exclude links from validation (placeholders). Validation limits apply.

## 475. Actions and controls

**Validation types**: Scheduled (weekly), Manual, Article-level.

**Report date**: Shows generated dates. Tooltips for upcoming scheduled validations.

**Manage links**: Opens window showing all links (ignored/included).

**Validate links**: Initiates manual validation. Confirmation prompt about remaining validations.

**Manual validation usage**: Shows remaining validations (resets monthly) for internal/external links.

**Link analytics usage**: Displays used vs. limit (Business: 5000, Enterprise: 10000).

**Limit exceeded**: Validates only up to limit. Contact support to increase capacity.

## 476. Sections of Ticket deflector tab

Performance analysis of forms and knowledge base:

1. **Satisfaction Analysis**: Form submissions vs. KB answers. Interactable graphs.
2. **Frequently Selected Questions**: Top 5 form questions.
3. **Satisfaction Summary**: Pie chart of submissions vs. KB answers.
4. **Most Useful Articles**: Top articles resolving queries. Shows count.
5. **Keywords**: Keywords, search counts, answer success. Exportable as CSV.
6. **Search Success Rate**: Percentage of successful searches. Graph visualization.

All sections support image exports.

## 477. Accessing the Ticket deflector analytics page

(No summary available)

## 478. Ticket deflector analytics

Analyzes ticket deflector form metrics. Supports all plans. Table currently empty.

## 479. Generating API documentation

Generate from URLs, JSON/YAML files, or CI/CD flow. Select source, input specification (URL/file path), provide API token, click "Publish."

CI/CD requires Node.js and `d360` npm package. Review drafts before publishing.

## 480. Feedback tab

Displays user feedback on ticket deflector forms. Labels: Form Submitted, Answered from Knowledge Base. Includes timestamps.

Click entries to view feedback content.

Ticket deflector reduces support tickets by suggesting KB articles. 'Answered from Knowledge Base' tracks resolved queries without ticket submission.

Improve effectiveness with updated KB, relevant keywords, frequent question review, Search Success Rate analysis. Chart legend explains data series.

## 481. Regenerate API documentation

Automatically regenerate from updated API specifications (URLs, JSON/YAML). Preserves custom content.

CI/CD integration recommended using d360 npm package. Manual regeneration via web UI or command line. Draft saving and relocation restricted.

## 482. Managing API documentation

| Professional | Business | Enterprise |
| ------------ | -------- | ---------- |
| ✓            | ✓        | ✓          |

API documentation generation across all plans. Create interactive, detailed docs by uploading specification files. Covers endpoints, methods, responses.

## 483. Helpful links

- [**d360 npm package**](https://www.npmjs.com/package/d360)
- [**Source code**](https://github.com/document360/d360)

d360 npm package facilitates API communication between applications.

## 484. Edit, Clone, and Delete widget

Manage KB widget: edit, clone, delete. Table missing plan details.

| Professional    | Business        | Enterprise      |
| --------------- | --------------- | --------------- |
| [Plan details]  | [Plan details]  | [Plan details]  |

## 485. Edit Knowledge base Widget

Navigate to widget in portal. Hover, click "Edit." Update configurations in "Configure & connect" tab. Click "Save."

## 486. Delete Knowledge base Widget

Navigate to widget in portal. Hover over widget, click "Delete." Confirm action, click "Yes."

## 487. Managing and customizing the Knowledge base widget

Manage/customize KB widget. Table missing plan support details (Professional, Business, Enterprise).

## 488. Customizing the knowledge base widget

Customize appearance/behavior: color, icon, position (left/right, spacing), hide widget or most searched articles.

Access via 'Configure & connect' and 'Style widget' sections. Select 'Edit,' click 'Save.' Color changes update icon color. Replace icons with images.

Hiding frequently searched articles disables URL mapping.

## 489. Adding a ticket deflector in Knowledge base widget

Enable "Show ticket deflector" toggle in widget configuration. Select deflector. Save changes.

Requires portal login, project selection, widget configuration access.

## 490. Domain restriction

Restrict widget to specific domains. Add domains to "Widget security" list in settings.

Widget accessible on any domain if none specified. Exclude "www" - use suffix only (e.g., document360.com).

## 491. Clone Knowledge base Widget

Steps:
1. Navigate to KB Widget section
2. Hover over widget, click "Clone"
3. Provide title, update configurations in "Configure & connect" tab
4. Click "Save"

## 492. Adding custom links

Add custom links (downloads, contact) to widget. Navigate to "Widget Settings."

In "Add Custom Links" section: link title, display text, URL, optional icon. Edit/delete via respective sections. Use `mailto:` for emails.

## 493. URL Mapping

Customize widget display by user location (URLs). Show/hide widget, customize search placeholders. Configure per user role.

Control content visibility through Project, Workspace, Category options:

1. **Edit Widget**: Navigate to widget, hover, click Edit
2. **Content Access**:
   - **Project**: All articles
   - **Workspace**: Specific workspaces/languages
   - **Category**: Specific categories from workspaces
3. **Considerations**:
   - Content access changes may disable URL mappings
   - Navigating tabs autosaves changes

## 494. Securing Knowledge base widget authentication using JWT

Enable JWT authentication: configure client ID, widget ID, token endpoint, client secret. Embed authorization URL in code.

Implement auth endpoint for token requests. Include reader group IDs for proper rendering. Troubleshoot visibility/loading issues by checking permissions/API keys.

## 495. Using URL mapping

Configure behavior on specific URLs via four actions: show article, list articles, display search results, hide widget.

Requires installed widget. Supports path, query, hash parameters. Optional regex for advanced matching.

## 496. Deleting URL mapping

Navigate to widget, click "Edit." Find URL mapping, click "Delete." Confirm action.

## 497. Adding URL Mapping to your Widget

Steps:
1. URL Mapping tab in Widget section
2. Click "New URL mapping"
3. Specify:
   - **Name**: Internal label
   - **URL structure**: Path, query, or hash
   - **URL**: Exclude domain (e.g., `/ebook/...`)
   - **Action**: Desired behavior
   - **Workspace**: Version selection
   - **Language**: Language selection
   - **Article**: Search/select page/categories
4. Click "Create"

Widget displays mapped content on specified URLs. Maintains consistency across tabs in same version/language.

## 498. Basic URL matching

Use regex to match URL components (protocol, domain, path, query, fragment). Examples show path matching, query parameters, optional parameters, wildcards.

Regex patterns for subdomains and complete URLs provided. Essential for effective URL mapping in web applications.

## 499. URL mapping settings

Configure behavior for unmapped URLs: Widget > Configure & connect > URL mapping settings.

Choose to display page help/Knowledge base or retain last opened article. Save settings.

## 500. Customizing the Knowledge base widget using Custom CSS/JavaScript

Customize appearance/behavior with CSS/JavaScript. Methods: modify icon/buttons, implement show/hide callbacks, styling/localization.

## 501. How to change the default widget icon?

Create custom button. Add JavaScript callbacks controlling visibility based on widget load status and URL mappings.

Integrate callbacks into widget JavaScript snippet. Use JavaScript to open widget on click. Customize appearance with CSS.

Key details: custom button HTML, CSS, JavaScript for callbacks, widget config integration.

## 502. How to change dark theme in Knowledge base widget?

**Method**: Custom CSS. Target: Knowledge Base Widget.

Modify Custom CSS to change background/text colors of widget modal and elements (divs, paragraphs, buttons) to black/white.

Feedback button hover style/background also modified.

## 503. How to change the fields displayed in the Knowledge base Widget?

Customize widget text by modifying HTML with JavaScript. Replace "Page help," "Knowledge base," "Top search articles" with localized alternatives.

Use `$(document).ready` to execute JavaScript after page load. Replace placeholder text via jQuery. Save settings after updating.

To remove Page help and Search bar when mapping single article:

1. **Access Widget Editor**: Widget section > edit widget
2. **Add Custom CSS** (Custom CSS tab):

```css
li#page-help-tab { display: none; }
.article-header .article-back-icon { display: none; }
.search-container { display: none !important; }
```

3. **Add Custom JavaScript** (Custom JavaScript tab):

```javascript
setTimeout(function () { $('.search-container').hide(); }, 2000);
setTimeout(function () { $('#knowledge-base-tab').click(); }, 2000);
```

4. **Save Changes**
5. **Cache Considerations**: Up to 15 minutes for changes. Clear cache for immediate updates.

Combines CSS styling and JavaScript dynamic adjustments.

## 504. How to set the Knowledge base Widget to open automatically in the knowledge base site?

Add custom JavaScript to widget settings. Script simulates button click after 2-second delay, ensuring full page load before opening.

## 505. Knowledge base site 2.0

Enhanced UI with AI-powered search, streamlined content, real-time updates, interactive elements. Better user experience.

Migration guide available [here](/help/docs/kb-site-20-migration).

## 506. Overview of Knowledge base site 2.0

Redesigned header: logo, workspace navigation, customizable primary/secondary navigation, announcements, acknowledgment requests, theme/language options, search.

Left pane: search, navigation (tree view), article status, follow/export options.

Article sections: breadcrumbs, title, links, status, date, contributors, sharing, summary, acknowledgment.

Image viewers: zoom, download, navigate.

Right pane: attachments, tags, table of contents.

Footer: feedback, navigation to related/previous/next articles.

Improvements: Eddy AI search and summarization.

## 507. Customize site

Tailor KB site appearance (themes, colors, layouts) to match brand. Project-level setting affecting entire project.

KB Site 2.0 supports customization with accessibility features. Requires migration from KB Site 1.0.

## 508. FAQ - Knowledge Base widget

Tool for finding answers within app/site. Supports up to 10 configurations.

Helps with onboarding, troubleshooting, learning features.

Features: customizable positions, hide top search, URL mapping with regex, custom links, ticket deflector, domain restriction, default language detection.

Available on Enterprise plans. Enhances user experience with in-app assistance.

## 509. Troubleshooting

- **Website fails to load**: Check URL, clear cache, disable VPN, verify system date/time
- **504 Gateway Timeout**: Review server changes, revert Sub-folder Configuration
- **Page unresponsive while editing**: Clear cache, reduce article length, fix unclosed HTML tags
- **Too many redirects**: Correct JWT Login URL, remove domain from configuration
- **Project not found**: Ensure correct/verified CNAME record
- **/home/error/ message**: Contact support with HAR file/console errors
- **Icons not rendering**: Check FontAwesome settings in custom CSS
- **Site without CSS**: Whitelist Document360 domains
- **Secure connection issues**: Verify CAA records, update DNS settings
- **ResourceNotFound & AuthenticationFailed**: Ensure valid SaaS tokens

## 510. Advanced site customization

Centralized KB site customization. Branding (logo, favicon), header/footer, homepage, login, error pages, CSS/JavaScript.

Preview feature for interactive changes. Light/dark themes, favicon uploads/URLs, logo changes (images/text), logo URLs, custom CSS/JavaScript.

FAQs address themes, favicon issues, logo customization, font selection, button styles, site layout. Instructions and visual aids provided.

## 511. KB site 2.0 migration

KB Site 2.0 upgrade offers enhanced features (following articles/categories, private sharing) and improved configuration.

Professional, Business, Enterprise projects supported. Projects after June 10th, 2024 get automatic access.

## 512. Basic site customization

Customize via Settings > Knowledge base site > Customize site.

Choose themes (light, dark, both). Brand with logo, favicon, custom logo redirect link.

Apply WCAG-compliant colors automatically or adjust manually. Modify brand colors, hyperlink colors (standard, brand, custom), fonts.

Select button styles (rounded, sharp, bubble) and site layout (full width, centered). Save changes.

Existing logos/favicons unchanged until updated in settings.

## 513. Implementing WCAG 2.1 A and AA in Document360

Accessibility through text alternatives for images/icons, full keyboard navigation, readable text with sufficient contrast/clear language.

## 514. Customizing your knowledge base site 2.0

Settings > Knowledge Base Site > Customize Site > 2.0 preview.

Choose immediate go-live (retains 1.0 settings) or further customization (headers, footers, CSS/JavaScript).

Preview changes before publishing. 30-day rollback option to revert to 1.0. Integrations remain intact.

## 515. Web Content Accessibility Guidelines (WCAG)

(No summary available)

## 516. Key Principles of WCAG 2.1

Accessible web content for everyone.

**Perceivable**: Text alternatives for non-text content

**Operable**: Keyboard usable, sufficient time, clear navigation

**Understandable**: Readable content, predictable operation

**Robust**: Compatible with various user agents including assistive technology

Promotes inclusive web experience.

## 517. Header - Secondary navigation

Customizable menu below logo for quick access to frequently visited pages (Pricing, Documentation, Support).

Improves navigation on large knowledge bases. Easy access to key information.

## 518. Accessing the Header - Secondary navigation

Customize via Settings > Knowledge base site > Customize site.

Create single-level, multi-level, or ticket-deflector menus. Add titles, links (hyperlinks, email, phone), open in new tabs.

Manage/reorder items. Optionally display secondary navigation on home page. Publish changes.

## 519. Header - Primary navigation

Bar next to logo at site top. Add menus for easy navigation between Home/Knowledge base pages.

Supported across different plans with varying functionality.

## 520. Accessing the Header - Primary navigation

Steps:
1. Settings > Knowledge base site > Customize site
2. Site header & footer > Header > Primary navigation
3. Add up to 6 items (Home, Custom URL, Call to action, RSS feed, Ticket deflector, Glossary, API documentation, Custom page)
4. Customize colors, edit, delete, reorder via left navigation
5. Preview, save, publish

Use custom CSS/JavaScript for advanced features (social media icons, feedback links).

## 521. Custom footer

(No plan details specified)

## 522. Creating a custom footer

Customize via Knowledge Base portal settings. Choose blank or themed footer.

Add HTML/CSS or external links. Preview, save, publish changes. Incorporate external files (PDFs) as needed.

## 523. Accessing the Footer navigation settings

Navigate to Settings > Knowledge base site > Customize site. Header & Footer > Footer.

Choose Basic footer or Custom footer. Preview before saving/publishing. Custom footer allows HTML input.

## 524. Footer

**Plans supporting KB site customization**

| Professional | Business | Enterprise |
| ------------ | -------- | ---------- |
|              |          |            |

Add footer to knowledge base site. Up to six custom links on left for essential resources. Social media links on right. Available across all plans.

## 525. Removing an RSS Feed from the Knowledge base site

Navigate to Settings > Knowledge base site > Customize site. Site header & footer > locate RSS feed > Delete.

Note: Existing subscribers still receive updates. RSS feed shows 404 error if project private. Requires public access.

## 526. RSS Feeds

XML-based format providing automatic updates. Keeps readers informed about new/modified articles.

Integrate into header/footer for effortless updates. Example: Software company uses RSS for product releases/bug fixes.

Ensures engagement and informed readers.

## 527. Adding an RSS Feed option to your Knowledge base site

Add RSS feeds for real-time updates via RSS tools.

**Primary Navigation**: Customization settings > Primary Navigation > add RSS Feed item with title > open in new tab

**Secondary Navigation**: Similar process > Single Level > RSS title > paste XML URL

**Footer**: Basic Footer (add new link) or Custom Footer (embed XML URL in HTML)

Usage: Readers stay updated using browser extensions (Feeder.co) or apps (Feedly, Inoreader). Subscribe via provided links.

## 528. Home page

Customize via Customize site settings. Body blocks: rich text, image sections, custom code.

Themes: Engage, Innovate, Learn, Default. Configure SEO (meta titles, descriptions, featured images).

Recommended hero image size: 1920x415 pixels. Reorder sections, preview, publish changes.

Themes available on Professional, Business, Enterprise plans.

## 529. Main pages

Focus on Home page customization: links, colors, categories.

Structured comparison table for Professional, Business, Enterprise plans.

## 530. Login page

Customize login page appearance (images, styles) and add elements (buttons, video loaders, search bars).

Handles homepage and documentation page customization. Emphasizes HTML, CSS, JavaScript for personalization.

## 531. Hero section

Customizable, visually-prominent homepage area. Introduce knowledge base with engaging text, buttons, search.

Creates strong first impression. Directs users to key resources.

## 532. Documentation

Customize Documentation page: search bar position (Left panel or Secondary Header), left navigation panel background color.

Access via Settings > Knowledge base site > Customize site > Documentation. Make changes, preview, save, publish.

## 533. Multicolumn card section

Homepage section showcasing features, "About," or "Contact." Columns with icons, titles, descriptions.

Visually appealing. Quick information access. Promote key offerings.

## 534. Rich text blocks

Customize homepage with rich text blocks. Add headings/paragraphs with formatting (colors, bold, italics, links).

Steps: Settings > Customize site > add rich text block > edit content > choose styles/alignment > reorder > save.

Supports Markdown. Delete option available.

## 535. Accessing Hero section

Navigate to Settings > Knowledge base site > Customize site. Home page dropdown > Hero section (top).

Configure background (image, color, gradient, pattern). Customize text, buttons, search functionality.

Edit/hide Welcome text, Promo text, Buttons, Search as needed. Save, preview, publish.

## 536. Adding Multicolumn cards

Customize homepage > add multicolumn card section. Edit titles, icons (Document360 or Font Awesome), descriptions.

Reorder, hide, customize appearance. Delete instructions and Font Awesome icon usage provided.

Visual aids improve process understanding.

## 537. Image with text block

Combine visuals with text for enhanced homepage. Differs from Rich text block by adding imagery.

Ideal for features/announcements. Example: Highlight new feature with description.

## 538. Adding an Image with text block

Customize homepage > select "Image with text" block. Upload/update image. Edit heading/paragraph text.

Format, align, color text. Save, publish. Deletion instructions provided.

## 539. Adding a Custom code section

Steps:
1. Customize Site
2. Home page
3. Add Custom Code Section
4. Edit HTML/CSS
5. Preview, Save, Publish

Delete: Similar steps > "Delete" > "Yes"

Platform manages content, files, site settings.

## 540. Custom code section

Embed custom HTML/CSS for enhanced KB site. Add visuals/interactive elements.

Example: Dynamic banners, countdown timers for promotions. Versatile customization tool.

## 541. Widgets block

Embeddable blocks placed below homepage header. Various functionalities.

## 542. Knowledge base categories block

Display popular categories as cards on homepage. Improves navigation/user experience.

Helps users find relevant sections quickly (Getting Started, Troubleshooting). Reduces search time, boosts satisfaction.

## 543. Adding Knowledge base categories block

Steps:
1. Settings > Knowledge base site > Customize site
2. Home page > Add section > Knowledge base categories
3. Customize: add categories, reorder, toggle visibility
4. Edit elements: icons (Document360/Font Awesome), titles, descriptions, colors
5. Save, preview, publish

Enhances content organization/navigation.

## 544. Error pages

Custom error pages improve user experience for broken/unauthorized/restricted links instead of generic messages.

Applies across all plans.

## 545. Deleting the widget section

Steps:
1. Settings > Knowledge base site > Customize site
2. Home dropdown > Widgets
3. Delete at bottom > Yes
4. Individual widgets: repeat process
5. Save/Publish changes

FAQs: Hide widgets (hover > Hide icon), rearrange (drag-drop), Recently Created/Modified overlap possible.

## 546. Adding widget(s) on your Home page

Steps:
1. Settings > Knowledge base site > Customize site
2. Home page from left menu
3. Add section > Widgets
4. Select: Most Viewed, Most Liked, Most Read, Recently Modified, Recently Created
5. Edit headings, preview
6. Save/Publish

Notes: New articles appear in both Recently Created/Modified. Content filtered by user permissions. Reorder/preview icons for arrangement.

## 547. What is a 404 page?

Appears for non-existent webpages. Customize with message, imagery, links to improve user experience.

Customization irreversible.

## 548. Accessing the Error Pages Design Settings

Customize via Settings > Knowledge base site > Customize site. Choose error page type from dropdown (404, Access denied, Unauthorized, IP restriction).

Basic style: Change images. Custom style: HTML/CSS editing. Preview toggle for changes.

Save, preview, publish to activate. Cannot revert to default static page once configured.

Access denied = permission issues. Unauthorized = unauthenticated users.

## 549. 404 page

Plans supporting error pages. Business/Enterprise typically support custom 404. Professional typically does not.

## 550. Access denied page

Redirects users with insufficient permissions. Customizable pages improve user experience.

Explain access denial clearly. Provide next steps for permission requests.

Private/Mixed knowledge bases only. Custom page prevents default reversion.

## 551. Access denied page

**Plans supporting error page**

| Professional | Business | Enterprise |
| ------------ | -------- | ---------- |
|              | ✅       | ✅         |

Business/Enterprise support Access denied page.

## 552. Customizing the 404 page

Navigate to Customize site > 404 page option.

**Basic style**: Customize image, heading, paragraph. Add up to three buttons with suggested links (Home, Contact, Sitemap).

**Custom style**: HTML/CSS with preview.

Use Page Not Found analytics and Link status tools to monitor/fix broken links.

Best practices: Consistent design, clear language, navigation options, search bars, feedback mechanisms, mobile-friendly.

## 553. Unauthorized page

(No plan information provided)

## 554. Customizing the Access denied page

Settings > Knowledge base site > Customize site > Access Denied page.

Choose Basic or Custom style. Modify images, headings, paragraphs. Advanced changes with custom HTML/CSS.

Preview/Publish changes. Cannot revert to default once customized.

FAQs for guidance. Best practices: clear messaging, responsive design.

## 555. Unauthorized page

Appears for users lacking permissions to restricted content. Customizable with messages like requesting admin access.

Customization irreversible once implemented.

## 556. Customizing the Unauthorized page

Customize via basic style (modify default images, headings, paragraphs) or custom style (add custom HTML/CSS).

Basic: Change visuals. Custom: Full design control for tailored experience.

Instructions for image changes, heading updates, paragraph editing. Save, preview, publish for implementation.

## 557. IP restriction page

(Plan information not provided)

## 558. Customizing the IP restriction page

Customize by adjusting basic styles (images, text) or creating custom HTML/CSS.

Preview toggle for testing. Save, preview, publish to apply.

Basic: Change existing elements. Custom: Full HTML/CSS control.

Navigate to site customization settings > IP restriction page > modify elements > preview > publish.

## 559. IP restriction page

Appears for users accessing KB from restricted IP addresses.

Customize to inform users (e.g., "Your IP address is not authorized. Please contact your admin for access.")

Enterprise plan exclusive. Cannot restore default version once customized. Recommended for better user experience.

## 560. Custom CSS & JavaScript

(Insufficient data for TLDR)

## 561. JavaScript snippets

Customize website JavaScript: Navigate to site settings > JavaScript tab > add code > save.

Example code reorders elements.

## 562. Troubleshooting

SPA transition requires updating custom JavaScript (previously relied on page refresh events).

Use `articleload` event for updated content: `window.addEventListener('articleload', function() { ... });`

Contact support for persistent issues.

Custom CSS supported. Multiple brands via separate workspaces or different stylesheets within same workspace.

CSS applies universally across all workspaces.

## 563. CSS snippets

Reusable code blocks for common CSS functionality. Save time, reduce errors.

Example: `.shadow` snippet adds box-shadows.

Settings > add custom/preloaded snippets (7 available) > save.

More details: [CSS Snippets](/help/docs/css-snippets).

## 564. CSS Snippets

Customize KB site with pre-loaded or custom CSS snippets.

Settings > Knowledge base site > Customize site > Custom CSS > CSS tab > add snippets.

Includes preloaded snippets for body font, headings, tables, images, hero sections, callouts, back-to-top.

Save changes. Custom CSS also supported.

## 565. CSS Snippets

Plans supporting custom CSS/JS in KB site. Comparative table provided.

## 566. Callout styles

(No data available)

## 567. What is a "Callout"?

Feature highlighting important content. Four types: Info, Warning, Error, Success.

Each offers title and content section. Accessible via Markdown or WYSIWYG editors.

## 568. Body font style

Plans to allow custom CSS/JS for body font styling. Improves reader experience.

## 569. Setting up the body font style using Custom CSS & JavaScript

Change body font: Settings > Knowledge base site > Customize site > Custom CSS & JavaScript.

Custom CSS tab > Add code snippets > Select "Change body text font" snippet > modify code > customize font face/color > save.

## 570. Styling the Callouts

Steps:
1. Settings > Knowledge base site > Customize site > Custom CSS & JavaScript
2. CSS > Add code snippets > Select "Change callout colors"
3. Edit code with branding colors > Save for site-wide application

Dark mode styling: Refer to [How to change callouts color in dark mode](/help/docs/how-to-change-the-callouts-color-in-dark-mode).

## 571. Image alignment

Control image placement (left, right, center). Maintain proportions when resizing.

Default alignment: left.

## 572. Header font style

Customize header fonts (`<h1>`, `<h2>`, `<h3>`, `<h4>`). Common: sans-serif fonts for technical documentation.

## 573. How to change the Header font style in Document360?

Change header fonts: Custom CSS in KB settings > add/edit "Change heading font" snippet > customize CSS > save.

Applies to all headers. Default font: Montserrat.

## 574. Resizing images on the Knowledge base site

Maintain proportions during zoom: Settings > Knowledge base site > Customize site > Custom CSS & JavaScript.

Paste appropriate code snippet based on site version:

**KB 1.0**:
```
.content_block .content_container .content_block_text img {
height: auto !important;
}
```

**KB 2.0**:
```
article img {
height: auto !important;
}
```

Save changes for proportional resizing.

## 575. Center images in your Document360 Knowledge base

Center images: Custom CSS in KB settings > add CSS snippet > save.

Centering uses `margin: 0 auto` and `display: block`.

For alignment, use left/right margins. Delete previous snippets to avoid conflicts.

Key snippets:
- **Center**: `.content_block .content_container .content_block_text img { margin: 0 auto; display: block; }`
- **Left**: `margin: auto 0 0 0 !important;`
- **Right**: `margin: 0 0 0 auto !important;`

## 576. Why are the table elements important for a document?

Tables organize/structure data for complex information presentation in rows/columns.

## 577. Style the tables using CSS Snippets in Document360

Style tables: Settings > Custom CSS & JavaScript section.

Add/modify CSS snippets for borders, padding, background colors, font styles, hide empty headers.

Save changes for effect. Custom CSS in addition to pre-built snippets.

## 578. Table style

Importance of table styles for rich layouts. Document360 offers robust customization.

Comparison table for Professional, Business, Enterprise support of custom CSS/JS:

| Professional | Business | Enterprise |
| --- | --- | --- |
| Limited CSS/JS customization | Advanced CSS/JS customization | Full CSS/JS customization with priority support |

## 579. Editing a redirect rule

Navigate to Knowledge base > Article redirect rules. Filter to find rule > hover > click "Edit" > update fields > click "Update."

## 580. Adding an article redirect rule

Configure URL redirects for articles. Two methods:
1. Article slugs at URL end ("Ends with")
2. Replace URL segments ("Replace with")

Specify correct paths (start/end with `/`). Consider multilanguage/multi-project contexts. Site-level redirects described.

## 581. Article redirect rule

Enterprise plan supports article redirect rules. Prevents broken links, maintains cross-references.

Bulk import supported.

## 582. Filter a redirect rule

Filter by searching source/destination URLs, selecting rule type (Ends with, Replace with, Both), filtering by modification date (preset/custom ranges).

## 583. Importing redirect rules

Bulk import via properly formatted CSV (Source, Destination, RedirectionType, max 1MB).

Settings > Knowledge base site > Article redirect rules. Upload CSV > review valid/invalid rules.

Download invalid rule list if needed. Import accepted rules.

## 584. Exporting redirect rules

Export as CSV: KB settings > Article redirect rules.

Rules manage broken links/redirects. Max 10,000 rules per project. Import limits apply.

Customize redirects with JavaScript, replace workspace names, send to homepage.

Address errors like too many redirects by validating/correcting within system.

## 585. Deleting a redirect rule

Navigate to Settings > Knowledge base site > Article redirect rules. Use Filter to find rule.

Hover > Delete icon, or select multiple rules > Delete. Confirm with Yes popup.

Deleted rules cannot be retrieved.

Access via Settings > filter/select rules > delete > confirm for permanent removal.

## 586. Configuring the Knowledge base site article settings

Configure article settings (accessibility, headers, sidebars, footers, categories, search, FAQ) at site level with global impact.

Customize individual elements: read-aloud, table of contents, comments, statuses, related articles.

Support for localization. Adjust search options/FAQs separately.

Individual article settings can override global configurations, though site-level often takes precedence.

## 587. Article header

Article settings will include customizable header elements: contributor lists, estimated read times, sharing options.

Improves user engagement.

## 588. Article settings & SEO

Customize KB sites via Article settings & SEO section. Improve user experience with headers, footers, search options, accessibility.

Tailor settings for contributor names, read times, social sharing, related articles.

Enhances engagement and user feedback.

## 589. Enabling the Article header elements

Enhance article headers: Enable settings in Article settings panel - contributors, read time, follow button, share, print, dates, PDF download.

Project-wide change affecting all articles. Requires verification.

## 590. Accessing the What's new feature

View recently published articles via announcement icon. Select workspace/language. Filter by date range (24 hours, 7 days, 30 days).

Settings > Knowledge base site > Article settings & SEO. Toggle 'Show What's New' option.

(Plan availability unspecified - table empty)## 591. Article header elements in the Knowledge base site

Article headers include: contributors, read time estimate, follow button, share icon, print option, published/updated dates, PDF export.

Localization allows customizing text per language.

FAQs cover hiding breadcrumbs, exporting drafts, setting default email apps, disabling print/PDF options.

## 592. Follow articles and categories

"Follow articles and categories" notifies users of new/updated knowledge base articles.

Available only for Private/Mixed projects in KB site 2.0 (projects created after June 10th).

## 593. Search in Knowledge base site

Search function covers articles, categories, and PDF attachments.

Advanced search filters and keyword operators improve efficiency - essential for large organizations with extensive documentation.

## 594. Attributes used in the Knowledge base site search

Search utilizes article/category titles, tags, slugs, breadcrumbs, content text.

Priority order: article titles → tags → slugs → breadcrumbs → content.

## 595. Enabling the 'Show Follow button' from KB Portal

Enable via: Settings > Knowledge base site > Article settings & SEO.

Toggle on 'Show Follow button' in Article header section.

Enabled by default for new Private/Mixed projects.

## 596. Using Follow articles and categories in KB Site

(No details provided)

## 597. Search attachments

Search PDF files (up to 10MB) within knowledge base.

Finds content even if file names don't match search terms.

Filters by categories, articles, API docs, files.

Requires "Show article files" toggle.

If "Show attachment tab" is off: limited to article content, titles, slugs, tags.

## 598. Advanced search

Filter results across multiple workspaces/languages.

Features: workspace, language, tags, contributors, date, category filters.

Enable via Knowledge base portal settings.

Filters include:
- Workspace (current, all, specific)
- Language (current, all, specific)
- Tags
- Contributor
- Date (preset/custom range)
- Categories

## 599. Search filters

Refine results by category, attachments, workspace, language.

Located to the left of search bar.

## 600. Search operator support

Use double quotes for exact phrases, minus signs to exclude terms.

Important: "-" excludes results; part of words require different handling.

## 601. FAQs

Advanced search covers all workspaces/languages with filters.

Hide home page search via header customization.

Exclude articles by hiding them.

External search engines handled separately.

Include API documentation via "All workspaces" filter.

RTL languages (Hebrew, Arabic) adjust search bar alignment.

Search behavior depends on default language when mixing RTL/LTR.

Enable "Include all workspaces in site searches" in Article settings for Document360 1.0 to search all workspaces.

## 602. Smart bars

Customizable banners in knowledge base site.

Convey info/announcements/updates.

Tailored to user location, browser, project language.

Enhance engagement and highlight updates.

## 603. Liking or disliking an article

Users provide feedback via like/dislike icons.

Improves content quality.

Multiple submissions allowed.

Undo feature: KB Site 2.0 projects only (requires migration).

## 604. Creating a new Smart bar

Create custom banners for knowledge base.

Configure content (text, formatting), appearance (position, color theme), visibility rules (URLs, IP, browsers, devices, language, project).

Edit/delete created Smart bars.

Supports global or language-specific display.

## 605. Liking or Disliking an article

Click icons at article end.

Liking is straightforward.

Disliking requires comment - both open feedback panels.

Options: comments, email update notifications.

Undo within 30 days (unless cache cleared).

Dislikes without comments aren't counted.

Analytics record active interactions only.

Switch like/dislike retains previous comments.

Consistent across Knowledge base widget.

30-day window for undoing actions in Public site.

## 606. Smart bar overview

Manage Smart bars via centralized interface.

Features: language selection, status toggles, previews, show/hide rules, edit/delete options, filters, new Smart bar creation.

## 607. Accessing ticket deflectors in portal

Reduce support tickets by enabling self-service resolution.

Improves user satisfaction and reduces workload.

## 608. Ticket deflectors overview page

Manage ticket deflection forms.

View titles, status, update history.

Create/clone/edit/delete forms.

Integrate with helpdesks.

Preview before publication.

Copy for sharing.

Limitation: main workspace and languages only.

Set to offline before deleting.

## 609. Cookie consent

Websites store small data pieces (cookies) in user browsers.

Consent required, especially under GDPR.

Document360 allows adding consent bar/popup for compliance.

## 610. Adding cookie consent message to knowledge base site

Enable via: Settings > Knowledge base site > Cookie consent.

Customize message for all/specific languages.

Format with basic tools.

Choose bar/popup banner.

Select position and theme (light, dark, custom colors).

Add CTA (text, button, icon).

Preview and save.

## 611. Adding Ticket deflectors in Header and Footer sections

Add forms to header/footer navigation and relevant sections.

Instructions cover primary/secondary navigation in header or basic/custom footer.

Forms must be activated.

Use copied links for other placements (articles, home pages).

Clone to duplicate forms.

Preview changes before publishing.

Delete inactive forms.

Copy link from: Settings > Knowledge base site > Ticket deflectors.

## 612. Adding a new ticket deflector

Route users to self-service resources (FAQs, guides).

If no solution found, direct to tailored contact form.

Business/Enterprise plans support multiple deflectors (up to 10).

## 613. Helpdesk configuration

Integrate with Freshdesk and Zendesk for direct ticket creation.

Configure via: Settings > Knowledge base site > Ticket deflectors.

Select platform (Freshdesk/Zendesk).

Enter credentials (API key, domain URL, agent email for Zendesk).

Validate and save.

## 614. Adding a new integration

Navigate to: Settings > Knowledge base site > Integrations.

Select app.

Choose Basic/Custom configuration.

Provide required information (Description, App ID).

Click "Add".

Check "Learn more" link for specific instructions.

## 615. Integrations in Document360

Over 25 third-party integrations across categories:

Analytics, chat, comments, marketing automation.

Supported by Professional, Business, Enterprise plans.

## 616. Creating a new Ticket deflector

1. Navigate to: Settings > Knowledge base site > Ticket deflectors. Click "New ticket deflector".

2. Configure Title, Slug, Description (max 150 chars). Adjust slug if needed. Ensure deflector is online.

3. Set up context questions (statements/prompts). Enable search options. Define next actions (contact form/article).

4. Add suggestions (optional): additional questions, answers, links to articles.

5. Customize contact form: mandatory fields (Email, First Name, Description). Optional: Last Name, Telephone. Allow attachments (max 5 files, 2MB each). Enable CAPTCHA. Set thank-you message (max 250 chars).

6. Configure ticket submission: email notifications (custom subject, recipients). Map deflectors to emails. Connect to helpdesk (Freshdesk) for automatic ticket creation.

7. Localize text via: Localization & Workspaces > Localization variables.

## 617. Editing or deleting an integration

Update credentials, description, status, App ID/URL via "Edit" on Integrations page.

Delete via "Delete" after confirmation.

Troubleshoot: check App ID/URL, internet connection, app-specific instructions.

Best practices: periodic review, keep integrations updated.

Add analytics scripts via Custom HTML in site settings.

## 618. Integration controls

Manage integrations via overview page.

Toggle status, view type, description, user involvement.

Categories:
- Analytics (9 tools)
- Chat (11 tools)
- Commenting (2 tools)
- Marketing automation (3 tools)

Notable options: Google Analytics, Intercom, Disqus, Zoho PageSense.

## 619. Code inclusion and exclusion conditions

Configure conditions (IP address, workspace, language) for integrated apps.

Target specific users/cases.

Use AND/OR logic to combine conditions.

Example: filter Google Analytics by IP, workspace, language for targeted data collection.

## 620. Integrating Document360 and LiveChat

Configure via Knowledge Base portal.

Select LiveChat integration.

Add description, LiveChat ID.

Optional: conditional code.

Enables LiveChat users to access Document360 knowledge base through chat interface.

## 621. Custom HTML

Add snippets for third-party integrations.

Navigate to: Settings > Knowledge base site > Integrations.

Choose insertion point (Header, Begin Body, End Body).

Paste code and save.

Appears on Integrations overview page.

Enables widgets based on placement.

## 622. Olark

Live chat tool integrates with Document360.

Features: visitor co-browsing, geolocation, browsing history, chat transcripts.

Improves communication, troubleshooting, support quality.

Available across Professional, Business, Enterprise plans.

## 623. LiveChat

AI-powered customer service tool.

Enables real-time communication.

Integrated with Document360 for instant support during knowledge base browsing.

Enhances user experience, reduces costs.

Plans: Professional, Business, Enterprise (details unspecified).

## 624. Obtaining the LiveChat ID

Existing users:
- Access LiveChat dashboard
- Click "Install"
- Find ID in manual installation snippet (prefix: `window.lc.license=`)

New users:
- Copy ID during initial setup
- Integrate with Document360 for chat functionality
- Enable bots for common queries

## 625. Obtaining the Olark ID

Log into Olark.

Navigate to: Settings > Channels > Installation Code.

Copy code.

Find `olark.identify()` function.

Copy 13-digit ID following it.

Use for Document360 integration.

## 626. Freshchat

Messaging platform for sales/customer engagement.

Supports AI chatbots.

Integrates with WhatsApp, Apple Business Chat, Facebook Messenger, LINE.

Features: consolidated inbox, AI self-service chatbots.

## 627. Integrating Document360 and Olark

Log into Document360 Knowledge Base portal.

Navigate to: Settings > Knowledge Base Site > Integrations.

Select Olark.

Enter Olark ID.

Add description.

Click "Add".

## 628. Integrating Document360 and Freshchat

Access Document360 Knowledge Base portal settings.

Select "Freshchat" integration.

Enter description.

Paste Freshchat token (from Freshchat dashboard: Settings > Admin settings > Configuration and Workflows > Web Chat Settings > Integration Settings).

Optional: configure code inclusion/exclusion rules.

Click "Add".

Enables searchable knowledge articles within Freshchat.

## 629. Chatra

Real-time chat software.

Integrate with Document360 knowledge base for instant customer support.

Reduces operational costs.

Improves customer satisfaction.

## 630. Integrating Document360 and Chatra

Integrate knowledge base with Chatra live chat.

Get Chatra ID.

Configure via: Document360 Settings > Knowledge base site > Integrations.

Add Chatra ID to Document360.

Optional: code inclusion/exclusion conditions.

Existing/new user ID retrieval instructions included.

Enables real-time support, targeted chats, visitor tracking.

## 631. Crisp

Centralized shared inbox platform.

Streamlines customer interactions.

Features:
- Cost efficiency: handle multiple conversations simultaneously
- Predefined answers: automated responses for common queries
- Enhanced communication: images, GIFs in messages

Integrates third-party tools across plans.

Scales from essential to advanced based on organizational needs.

## 632. Gorgias

Multi-channel helpdesk solution.

Integrates with business applications/channels.

Provides unified customer view.

Connects with Document360 knowledge base.

Streamlines customer query management.

## 633. Integrating Document360 and Gorgias

Get Gorgias ID from Gorgias platform.

Add as new integration in Document360 Knowledge Base portal settings.

Optional: configure conditional code inclusion (IP, Workspace, Language).

## 634. Doorbell

User-friendly chat software.

Collects, manages, analyzes customer feedback.

Enhances feedback with screenshot attachments.

Integrates with Document360.

Provides insights to improve customer interactions and conversions.

## 635. Integrating Document360 and Doorbell

(No details provided)

## 636. Obtaining the Gorgias App ID

Existing users:
- Log in
- Navigate to Settings > Channels > Chat
- Add new chat integration
- Install manually

New users:
- Copy Gorgias ID during LiveChat setup
- Integrate with Document360

Enables team collaboration and ticket management.

## 637. Sunshine Conversations

API-based CRM tool on AWS.

Handles customer communication via social media/messaging.

Integrates with Document360 knowledge base.

Streamlines communication.

Boosts engagement.

## 638. Integrating Document360 and Belco

Integrate knowledge base with Belco platform.

Get Belco Shop ID via Belco application setup/initial installation.

Configure via Document360 Knowledge Base portal.

Add description and Shop ID.

Optional: code inclusion/exclusion rules.

Log into Belco to manage chats.

Links chatbot interface to Document360 knowledge base for e-commerce users.

## 639. Belco

Real-time chat software.

Integrate with Document360 for instant customer support.

Manage multiple conversations simultaneously.

Enhances efficiency.

Reduces operational costs.

## 640. Kommunicate

Integration provides real-time customer support via chat.

Powered by AI chatbots.

Improves efficiency, reduces costs, enhances satisfaction.

Integrates AI chatbots for faster query resolution.

Improves support experience within knowledge base.

## 641. Integrating Document360 and Sunshine Conversations

Navigate to Knowledge Base portal.

Go to: Settings > Knowledge base site > Integrations.

Select Sunshine Conversations.

Add description.

Enter App ID.

Optional: code inclusion/exclusion conditions.

Click "Add".

## 642. Obtaining the Sunshine Conversations ID

Access dashboard.

Create new app.

Fill details, save app.

Navigate to app settings.

Find App ID in App Details section.

Optional: generate API keys in same menu.

## 643. Integrating Document360 and Kommunicate

Navigate to: Document360 Knowledge Base Settings > Integrations.

Select Kommunicate.

Add description.

Enter Kommunicate ID (from Kommunicate app).

Optional: configure code inclusion/exclusion (IP, workspace, language).

Click "Add".

## 644. Integrating Document360 and Google Analytics

Connect via Basic (standard ID) or Custom (snippet) configurations.

Basic requires Google Analytics ID.

Custom requires snippet.

Optional: code inclusion/exclusion (IP, Workspace, Language).

Navigate to: Document360 Settings > Integrations > Google Analytics (New).

## 645. Obtaining Google Analytics ID

Navigate to Google Analytics account.

Find "Tracking ID" in property settings.

Input ID into Document360 portal field.

Tracks key metrics: views, location, behavior.

## 646. Obtaining the Kommunicate App ID

Existing users:
- Navigate to Settings > Install in account
- New users: ID provided during installation

Crucial for Document360 integration.

Enables efficient chat management, lead qualification, 24/7 support.

## 647. Google Analytics (GA4)

Supported across plans.

Tracks metrics: conversions, traffic, user behavior.

GA4 uses Measurement ID ('G-') instead of GA3's 'UA-' Tracking ID.

Latest analytics evolution with enhanced data capabilities.

## 648. Obtaining Google Analytics ID (Measurement ID)

Go to: Google Analytics Admin > Property Settings > Data Streams.

Select stream, click Configure tag settings.

Copy 'G-' ID from top right of "Your Google Tag" section.

Paste into Document360 portal's Google Analytics ID field.

## 649. Google Tag Manager

Tag management system.

Easily update website/app tags for better analytics, marketing, remarketing.

## 650. Integrating Document360 and Google Analytics(GA4)

Track user interactions, popular articles, locations.

Requires Google Analytics account and ID.

Enable via: Settings > Knowledge base site > Integrations.

Choose Basic (Measurement ID) or Custom (custom events).

Optional: code inclusion conditions (IP, workspace, language).

## 651. Integrating Google Tag Manager with Document360

Select Basic or Custom configuration.

Basic requires Google Tag Manager ID.

Custom allows snippet code and conditional inclusion.

Both methods add tracking.

## 652. Heap

Product analytics tool.

Analyzes user behavior.

Provides event feeds, funnels, retention tools.

Improves product/marketing effectiveness.

## 653. Integrating Document360 and Heap

Select "Heap" in Document360 Integrations settings.

Choose Basic (needs Heap App ID) or Custom (custom event snippets, conditional code inclusion).

Provide description and Heap App ID for basic integration.

## 654. Obtaining Google Tag Manager ID

Existing users:
- Navigate to workspace section in Google Tag Manager account
- Find code snippet containing ID

New users:
- During initial setup, after container creation
- Receive code snippet with ID

Essential for Google Tag Manager integration.

Enables conversion tracking, site analytics.

## 655. Segment

Data platform simplifies third-party tool integration.

Efficient customer data collection, transformation, analysis.

Streamlines data management.

Teams spend more time utilizing insights than collecting data.

Key value: enhanced user behavior understanding, competitive advantage.

## 656. Obtaining the Segment ID

Navigate to Segment dashboard.

Find "Develop" section in left toolbar.

Copy Account SID from "Account info" section.

Needed for Document360 integration.

Enables better user understanding and knowledge base enhancement.

## 657. Obtaining Heap App ID

Existing Heap customers:
- Navigate to Account > Install in dashboard
- Select Web, copy Heap ID from snippet

New Heap customers:
- App ID provided during integration setup
- Access Heap account post-setup to view ID

Enables advanced analytics for user behavior analysis and product improvements.

## 658. Hotjar

User behavior analytics tool.

Offers heatmaps, session recordings, surveys.

Understands user interactions.

Provides product insights.

## 659. Integrating Document360 and Segment

Integrate via Settings > Integrations.

Choose Basic (Segment ID) for standard tracking.

Choose Custom (snippet code) for advanced event tracking.

Optional: set conditions for code execution.

Complete setup and verify functionality.

## 660. Integrating Document360 and Hotjar

Track user behavior via heatmaps and recordings.

Enhance knowledge base interaction insights.

Steps:
1. Navigate to Settings > Knowledge base site > Integrations
2. Select Hotjar
3. Choose Basic (Hotjar ID) or Custom (event codes)
4. Enter Description and Hotjar ID for Basic
5. Or add custom snippet for advanced tracking
6. Optional: set inclusion/exclusion conditions (IP, Workspace, Language)
7. Save configuration

## 661. Integrating Amplitude and Document360

Use Basic or Custom configuration.

Provide Amplitude API key.

Optional: code inclusion/exclusion conditions (IP, Workspace, Language).

Basic: straightforward.

Custom: custom events, advanced integrations.

Enable Session Replay with Autocapture via JavaScript snippet.

## 662. Obtaining the Hotjar ID

Navigate to Hotjar setup.

Click "Set up Hotjar" from left sidebar.

Locate snippet with `hjid` variable.

Copy ID.

Essential for heatmaps, surveys.

## 663. Amplitude

Product analytics tool.

Analyzes product usage data and user behavior.

Features: real-time analytics, flexible user segmentation, Microscope.

Integration plans:
- Professional: basic analytics, SEO tools
- Business: advanced analytics, customer support software
- Enterprise: custom tools, APIs, advanced analytics

## 664. FAQ

Amplitude tracks product usage.

Provides reports for optimization.

Tracks visitors.

Knowledge base platform manages content/users separately.

## 665. Obtaining the Amplitude API Key

New customers:
- Register at amplitude.com
- Receive API key during setup

Existing customers:
- Access project dashboard
- Go to Projects > General section
- Find and copy API key

## 666. FullStory

User-experience intelligence tool.

Offers real-time analytics, retention tracking, Magic Moments.

Reviews user sessions.

Plans:
- Professional: basic metrics
- Business: advanced analytics
- Enterprise: unlimited access

## 667. FAQs

Integrate FullStory for website analytics/recording.

Document360 uses FullStory ID.

Manages knowledge base content (categories, articles).

## 668. Obtaining the FullStory ID

Existing users:
- Navigate to dashboard
- Click work name dropdown
- Select Settings
- Find ID under "Install your FullStory snippet" using `window['_fs_org']`

New users:
- Access FullStory account segment post-integration
- View analytics, track site behavior

## 669. Integrating Document360 and FullStory

Navigate to Settings > Integrations.

Select FullStory.

Configure with Basic (description + ID) or Custom (snippet code).

Optional: set inclusion/exclusion conditions.

Click "Add".

## 670. Mixpanel

Event-based analytics tool.

Tracks user activity:
- Feature page conversions
- Sales funnel drop-off rates
- Effective referral sites

Focuses on user journey, not general site data.

## 671. Integrating Document360 and Mixpanel

Navigate to Integrations in Knowledge Base settings.

Select Mixpanel.

Choose Basic or Custom configuration.

Basic: add JavaScript via Document360 Customize site after setup.

Custom: add JavaScript directly in integration configuration.

Both options permit conditional code inclusion (IP, workspace, language).

## 672. Obtaining the Mixpanel ID

1. Log into Mixpanel account
2. Go to Settings > Set up Mixpanel
3. Copy displayed Mixpanel ID

Integration options:
- Basic: minimal setup, manual JavaScript later
- Custom: advanced tracking, direct code input during setup

Data transmission requires JavaScript implementation.

Customize for specific needs.

Test thoroughly (sandbox recommended).

Technical expertise may be needed.

## 673. VWO

All-in-one optimization platform.

Enables:
- Feature testing
- User intent extraction
- Push notification management
- Product roadmap creation/optimization

## 674. Integrating Document360 and VWO

Integrate knowledge base with VWO for A/B testing.

Get VWO Account ID from VWO account (new/existing).

Configure Document360 integration:
- Basic or Custom settings
- Optional custom events
- Code inclusion/exclusion conditions (IP, workspace, language)

Manage/run optimization tests through VWO interface.

## 675. Sample JavaScript Codes for Mixpanel Integration

Foundational code snippets for Mixpanel tracking in Document360.

Focus: page view and button click tracking.

Require customization for specific use cases.

Need Mixpanel ID for implementation.

Enhance event-based analytics for user behavior insights.

## 676. ZOHO PageSense

Website optimization/personalization platform.

Enables tracking, analysis, optimization.

Boosts conversion rates.

(No pricing/features detailed)

## 677. Integrating Document360 and Zoho PageSense

Navigate to Document360 Integrations settings.

Select Zoho PageSense.

Input Zoho PageSense ID (from Zoho PageSense Interface).

Optional: apply code inclusion/exclusion conditions.

Unified platform offers complete CRO solutions:
- Heatmaps
- A/B testing
- Form analytics
- Session recordings

## 678. Freshmarketer

Cloud-based marketing automation tool.

Features:
- A/B testing
- Heatmaps
- Funnel analysis

Enhances conversion optimization.

Identifies user behavior patterns and drop-offs.

Improves user experience.

Seamless access to analytics via Document360 integration.

## 679. Integrating GoSquared with Document360

Get GoSquared Project Token from GoSquared account.

Add token to Document360 Knowledge Base portal integrations.

Enables behavioral data analysis and chat features.

Uses Document360 user data for insights.

## 680. GoSquared

Platform to convert visitors into loyal customers.

Features:
- Analytics
- Live Chat
- Automation
- Customer Data Hub
- Now dashboard (real-time insights)
- Trend dashboard (historical insights)

## 681. Commento

Modern commenting system.

Fast, bloat-free, visually appealing.

Integrates with knowledge base website.

(Subscription tier details pending)

## 682. FAQ

Why integrate GoSquared with Document360?
- Multi-channel messaging
- Live chat for conversions
- Web analytics

Document360 is knowledge base platform enabling:
- Content creation/management (categories, articles, templates)
- File management
- Team account administration
- Site settings configuration (branding, domain, security)

## 683. Disqus

Multilingual commenting platform for Document360 articles.

Features:
- Design integration
- Moderation tools

Suitable for Professional, Business, Enterprise users.

## 684. FAQ

Fix '_This domain is not registered with Commento_' error:
- Navigate to Settings > Knowledge base site > Integrations
- Turn off Commento toggle

Two integration methods:

Method 1: Direct Integration
1. Navigate to Settings > Knowledge base site > Integrations
2. Select Commento under Comments, click Add
3. Enter description, set conditions (optional)
4. Click Add
5. Check Commento analytics, import Disqus comments

Method 2: Custom HTML Integration
1. In Commento, go to Staging tab > Installation Guide
2. Modify Universal Snippet URL to project domain
3. Copy code
4. In Document360, navigate to Settings > Knowledge base site > Integrations
5. Under Custom HTML, paste code at end of body
6. Click Add

Choose Method 1 for simplicity, Method 2 for customization.

## 685. Accessing the Extensions page

Navigate to: Knowledge Base portal Settings > Knowledge Base Portal > Extensions.

Filter by category:
- All extensions
- Helpdesk (Freshdesk, Zendesk, Intercom, Salesforce)
- Team collaboration (Slack, Microsoft Teams, Drift, Zapier, Make)
- Code repositories (GitHub)
- Translation & browser (Chrome, Crowdin, Phrase)

Click "Connect" on desired extension tile.

## 686. Freshdesk

Integrates with Document360 knowledge base.

Support agents access/use articles directly within Freshdesk.

Improves efficiency.

Agents create Document360 articles from Freshdesk.

## 687. Document360 Extensions - Getting started

Extensions enhance Knowledge Base through third-party integrations.

Enable connected workflows.

Available across Professional, Business, Enterprise plans.

Direct access, management, sharing from other tools.

Reduces app switching.

Improves team collaboration.

## 688. Feature highlights

Freshdesk integration enables agents to:
- Search/share knowledge base articles directly
- Create articles from ticket responses

Streamlines support workflows.

Provides quick access to relevant information.

Allows knowledge base updates without leaving Freshdesk.

## 689. Freshservice

(No details provided)

## 690. Basic configuration steps

Integrate Document360 & Freshservice:

1. Generate Document360 API token, copy it
2. Access Freshservice
3. Find Document360 app in marketplace
4. Paste token, click "Install"
5. Repeat for multiple knowledge bases

## 691. Zendesk

Integrates with Document360 knowledge base.

Support agents access/create articles directly within Zendesk.

Improves response times, article creation efficiency.

## 692. Basic setup guide

(No details provided)

## 693. Basic setup guide

Connect Document360 to Zendesk:

1. Install app from Zendesk Marketplace
2. Generate API token in Document360
3. Paste into Zendesk setup
4. Enter title, restriction settings (optional)

## 694. Feature highlights

Search and Share Articles:
- Access Document360 sidebar from Freshservice tickets
- Auto-suggestions based on ticket titles
- +Link to add URLs
- +Content to paste full articles
- Automated search recommends articles using ticket title

Create Articles:
- Direct creation/publishing from Freshservice
- Text editor with formatting (H2/H3, bold, italic, lists)
- Insert features (code blocks, hyperlinks, images)
- Note: Cannot create new categories via Freshservice

## 695. Create an article on Knowledge base from Zendesk

Create articles directly from Document360 app.

No extra team accounts needed.

Click "Create Article", input title/category.

Write content in Markdown, publish.

Quick launch feature for linking/inserting articles in Zendesk chat replies.

## 696. Search and share articles on ticket responses

Document360 app in Zendesk allows instant search/sharing while responding to tickets.

Automatic article search based on ticket title or via search bar.

Preview articles, choose to:
- Link them
- Insert full content
- Open in new tab

Enhances efficiency without tab switching.

## 697. Zendesk federated search

Setup via: Settings > Knowledge base portal > Extensions > Zendesk > Setup.

Configure under "Zendesk federated search":
- Provide Zendesk subdomain
- Admin email from Zendesk support addresses
- API token from Zendesk API settings

Validate details.

Select workspace/language for syncing.

Save configuration.

Enables searching Document360 articles within Zendesk as external sources.

## 698. Intercom

Integrates with Document360.

Enables real-time customer support.

Agents search/share knowledge base articles within Intercom chats.

Requires valid Intercom account and workspace ID.

## 699. Removing Document360 from Zendesk

Uninstall via: Apps and integrations > Zendesk Support apps.

Locate Document360 app.

Hover to access settings icon.

Click "Uninstall", confirm.

## 700. FAQ

Can push multiple articles from Zendesk to Document360 simultaneously?

No - transfer one article at a time.

## 701. Search for and share articles in chat response

Share knowledge base articles in Intercom chat:

1. Click Document360 icon
2. Search relevant article
3. Choose from list
4. Send to customer

Customers:
- Click article assistant to open in new tab
- Or send Article search app assistant for self-initiated searches

## 702. Article search app assistant

Integrates with Intercom for article creation.

Users create articles by filling title, body, category.

Mirrors Document360 portal creation process.

## 703. Salesforce

Enterprise plan add-on feature only.

Support agents access/create knowledge base articles directly within Salesforce console.

## 704. Basic setup guide

Connect Salesforce with Document360:

1. Create Salesforce account via signup page
2. Verify account, choose plan
3. Install Document360 app from AppExchange
4. Select environment (Production/Sandbox), user access level
5. Add Visualforce page in Salesforce Developer Console using provided code snippet

## 705. Authorize Salesforce integration from Document360 portal

Connect via: Settings > Knowledge Base Portal > Extensions > Salesforce.

Purchase Salesforce add-on if needed.

Choose live/sandbox environment.

Click "Connect", "Allow" in authorization window.

Confirm connection status in Salesforce assistant.

View configuration details/delete connection if needed.

Salesforce is separate purchase within Document360 project.

## 706. Searching and managing Knowledge base content in Salesforce

Use "Knowledge Base" tab in Salesforce.

Search/view articles/categories.

Select workspaces/languages via dropdowns.

Search by name, content, tag, slug.

Filter results by name.

Click article/category opens Reader View with options:
- Copy links
- Open articles on site
- Copy excerpts for reuse

Quick access via "Copy link"/"Open site" icons.

"Filter" field refines searches.

Category manager aids content organization.

## 707. Cases page

Enterprise Salesforce plan only.

Integrate Document360 with Cases.

Direct agent access to knowledge base articles.

Accelerates case resolution.

Other plans unsupported.

## 708. Integrating Document360 and Cases home page

Embed Visualforce component in Cases.

Customize component size in Lightning App Builder.

Create/manage articles directly within Salesforce.

Accessible from cases.

Articles drafted initially.

Require admin/owner approval for publishing.

## 709. Recommendations

Document360 automatically recommends articles based on case subject keywords.

Display includes:
- Title
- Snippet
- Copy options
- Open in new tab links

Users customize workspace/language for filtering.

Displays up to 5 articles.

## 710. FAQs

Document360-Salesforce integration uses REST APIs.

Authentication via API keys, OAuth tokens, secure methods.

Custom fields map to Salesforce custom objects.

Document versioning tracks changes, updates Salesforce records.

Security includes encryption, secure authentication, role-based access, compliance.

Upgrading requires reviewing API changes, testing staging, ensuring compatibility.

Salesforce acts as Identity Provider (IdP) via SAML/OpenID for Single Sign-On.

## 711. Commands and uses

Document360 integrates with Slack via `/doc360` commands.

Search articles: `/doc360 search query`

Select version/language for results.

Open/link articles directly in Slack.

Create articles: `/doc360 create Title`

Use Markdown editor.

Select version/category.

Articles created in draft form.

Cannot create categories from Slack.

## 712. Slack

Cloud-based communication platform.

Enables team collaboration.

Integration allows:
- Direct knowledge base access
- Article search
- Documentation creation
- Markdown editor for any version/language

## 713. Basic setup guide

Connect Document360 with Slack:

1. Navigate to Knowledge base portal settings
2. Select Extensions
3. Find Slack, click Connect
4. Grant workspace access
5. Confirm connection

## 714. Removing Document360 app from Slack workspace

Remove via Slack App Directory:

1. Select Manage
2. Choose Document360
3. Find "Remove application"
4. Click it

Contact support@document360.com if needed.

## 715. Teams and Document360

Integrate for seamless article search/sharing within Teams.

Eliminates context switching.

## 716. Basic setup guide

Connect Document360 to Microsoft Teams:

1. Add Document360 app to Teams
2. Generate API key in Document360 knowledge base portal
3. Add API key in Teams app
4. Access knowledge base via `/Document360` command
5. Uninstall by right-clicking app

## 717. Microsoft Teams

Collaboration platform.

Streamlines messaging, document sharing, team discussions.

Enterprise plan supports MS Teams extensions integration.

Professional/Business plans unsupported.

## 718. Searching and Sharing Articles

Search/share Document360 articles within Teams.

Use app logo or `/Document360search` command.

Select articles from results.

Customize share messages.

Send to contacts/channels.

## 719. Drift

Integrate Drift (conversational messaging) with Document360.

Support agents share articles directly within Drift chats.

Improves response time.

Streamlines customer support.

## 720. FAQs

Microsoft Teams lacks built-in Knowledge base feature.

Integrate platforms like Document360 for this purpose.

Share knowledge base content (articles, links, files) directly in Teams chats/posts.

Add Teams extension for non-readers using API token.

Enables communication between applications.

## 721. Zapier - Setup guide

Integrate Document360 with other apps via Zapier.

Requirements:
- Zapier account
- Connected account in other app

Zapier automates workflows between applications.

Refer to Zapier's getting started guide for detailed setup.

## 722. Basic setup guide

Integrate Drift with Document360:

1. Obtain JavaScript code:
   - Sign up for Drift, log in
   - Go to Settings > App Settings > Install
   - Select JavaScript, copy script
   - Existing users skip steps 1-2

2. Set up Drift Chat:
   - Paste JavaScript into Document360's Custom CSS & JavaScript section
   - Under Knowledge base settings

3. Configure knowledge base:
   - Connect via Extensions section
   - Authorize
   - Use /doc360 slash commands to search/share articles

## 723. Zapier use cases for Document360

Connects Document360 to various applications.

Enables workflow automation.

Key integrations:
- Google Docs, Sheets, Drive
- Trello, GitHub, Confluence
- CRM platforms (Zoho, Pipedrive, Hubspot, Asana, monday.com)
- Typeform, email (Gmail, Mailchimp)

Streamlines document management, task/project execution.

Automated data transfer, updates, notifications between apps via API rules.

## 724. Integrating Google Docs with Document360

Automate content flow from Google Docs.

Connect platforms via Zapier.

Map Google Docs fields (title, content) to Document360.

Test connection.

Configure trigger events in Google Docs (e.g., new documents).

Create new articles in Document360 automatically.

Saves manual transfer time/effort.

## 725. Integrating Google Docs with Document360

Enterprise plan exclusive.

Via Zapier extensions.

Seamless document management.

Automates workflows.

Enhances collaboration through centralized documents.

Streamlines operations.

Requires appropriate security measures.

## 726. Integrating Google Sheets with Document360

Automate syncing article additions to Google Sheet.

Connect via Zapier.

Create "Zap" triggering on new articles.

Automatically add details (mapped attributes) to specified sheet.

Requirements:
- Sign into Zapier, Document360, Google accounts
- Select trigger/action events
- Map columns

Re-selection required if sheet names change.

Supported in Business/Enterprise plans.

## 727. Zap overview

Delete Zap via Zapier dashboard:

1. Locate desired Zap
2. Click arrow
3. Select "Turn off and delete Zap"

Permanently removes Zap.

Note: Google Sheets setup required, detailed separately.

## 728. Integrating Document360 with Google Drive

Seamless file access, linking, management, sharing within Document360.

Improves collaboration.

Enhances documentation workflows.

## 729. FAQ

Spreadsheet vs. worksheet:
- Spreadsheet: overall file in Google Drive
- Worksheet: specific tab within file for data entry/management

## 730. Zap overview

Zapier automates workflows between web apps.

View/edit/delete Zaps on overview page.

Delete via Zapier dashboard:
1. Click arrow next to Zap
2. Select "Turn off and delete Zap"

## 731. Integrating Trello with Document360

Automate documentation task management.

Sync article publishing events to Trello cards.

Includes attributes: content, contributor, publish date.

Configure triggers (Document360 publishing) and actions (Trello card creation) via Zapier.

Ensures consistent updates across platforms.

Improves documentation team efficiency.

## 732. Integrating Document360 with Google Drive

Automate workflows between platforms via Zapier.

Create Zap:
1. Connect Document360 as trigger
2. Connect Google Drive as action
3. Obtain API token from Document360 Zapier extension
4. Configure action to upload files to specific Drive folder
5. Test integration

Publish Zap for automatic file syncing.

Saves time.

Streamlines document management.

## 733. Zap overview

View/edit Zaps from overview page.

Delete via Zapier dashboard:
1. Select desired Zap
2. Click arrow icon
3. Choose "Turn off and delete Zap" to remove permanently

## 734. Integrating Trello with Document360

(No details provided)

## 735. Integrating GitHub with Document360

Automate content creation triggered by GitHub commits.

Connect GitHub via Zapier trigger.

Connect Document360 via API token.

Map fields:
- Title
- Content
- Version
- Language
- Category
- Publish Status

Test Zap, activate for seamless synchronization.

Articles created reflecting GitHub code changes.

## 736. Zap overview

Automates Document360 article creation from GitHub commits.

Delete via Zapier dashboard:
1. Find Zap
2. Select "Zap actions"
3. Choose "Delete"

View Zaps from overview page.

## 737. Integrating Confluence Server with Document360

(No integration details provided)

## 738. Zap overview

Creates Document360 articles from Confluence Server pages.

Delete via Zapier dashboard:
1. Locate Zap
2. Click "Zap actions" → "Delete"

## 739. Integrating GitHub with Document360

Enterprise plan supports Zapier extensions.

Automate GitHub-Document360 workflows.

Trigger actions based on GitHub events (commits, pull requests).

Connect repositories via API tokens.

Automate tasks:
- Article creation for new features
- Updates for resolved issues

Ensure security via limited permissions.

Monitor integration for smooth operation.

## 740. Integrating Zoho CRM with Document360

Automate knowledge base article creation.

Trigger: new leads/contacts in Zoho CRM.

Action: create Document360 article.

Connect via Zapier.

Configure API tokens.

Map fields (version, language, article, publish status).

Test and publish Zap.

Results in new Document360 article for each Zoho lead/contact.

## 741. Integrating Confluence Server with Document360

Automate content synchronization via Zapier.

Create Zap with:
- Confluence Server as trigger (e.g., "New Page or Blog Post")
- Document360 as action (e.g., "Create Article")

Connect platforms:
- Authenticate accounts
- Generate Document360 API token

Customize Zap by mapping fields:
- Workspace
- Language
- Category
- Publish status

Test integration.

Ensure seamless article creation in Document360 when Confluence updates.

Eliminates manual effort.

## 742. Zap overview

View/edit existing Zaps.

Delete via Zapier dashboard:
1. Navigate to dashboard
2. Select desired Zap
3. Click arrow icon
4. Choose "Turn off and delete Zap" for permanent removal

## 743. Integrating Pipedrive with Document360

<table>
<thead>
   <tr>
      <th>Professional</th>
      <th>Business</th>
      <th>Enterprise</th>
   </tr>
</thead>
<tbody>
   <tr>
      <td></td>
      <td>✓</td>
      <td>✓</td>
   </tr>
</tbody>
</table>

Integrate via Zapier extensions.

Business/Enterprise plans supported.

Efficient CRM-knowledge base automation.

## 744. Integrating Zoho CRM with Document360

Ensure Enterprise plan for Zapier support.

Connect platforms to Zapier.

Create zap:
- Zoho CRM as trigger
- Document360 as action

Map fields, test, enable, monitor.

Enhances data synchronization.

Improves customer support efficiency.

## 745. Integrating Hubspot with Document360

Available across tiered plans (Professional, Business, Enterprise).

Automates workflows via Zapier extensions.

Manages marketing, controls sales processes.

(Functionality/pricing details needed)

## 746. Integrating Pipedrive with Document360

Connect via Zapier for automatic knowledge base article creation.

Trigger: new leads/contacts in Pipedrive.

Action: create Document360 article.

Authenticate both platforms in Zapier.

Customize field mappings:
- Title
- Content
- Version
- Language
- Category
- Publish status

Test integration.

Publish Zap.

Ensures seamless documentation of lead/contact information.

## 747. Integrating HubSpot with Document360

Automate support ticket resolution.

Create Document360 articles based on new HubSpot tickets.

Connect platforms via Zapier.

Enable automated workflows when related article missing.

Key steps:
1. Connect HubSpot and Document360 accounts in Zapier
2. Map fields (ticket title/description, workspace, language)
3. Test and activate Zap

Use Document360 API token for connection.

## 748. Zap overview

Automatically creates Document360 article for each new Pipedrive sales deal.

Manage/delete Zaps via Zapier dashboard.

## 749. Integrating Asana with Document360

Automate adding Asana-created articles to Document360 Knowledge Base.

Connect accounts via Zapier.

Map article fields (title, content).

Configure trigger/action within Zapier.

Test and publish.

Key steps:
- Obtain API tokens
- Select Asana project/workspace
- Choose Document360 location for article

## 750. Zap overview

Creates Document360 articles from new HubSpot support tickets.

Manage/edit Zaps via Zapier dashboard.

Delete Zaps:
1. Navigate to dashboard
2. Click Zap actions icon
3. Select "Delete"

## 751. Integrating Asana with Document360

Streamline project management, task tracking, collaboration.

Integrate via Zapier.

Check Document360 plan support for Zapier.

Set up Zaps:
- Trigger actions (e.g., create Asana tasks when articles published)
- Streamline workflow

## 752. Zap overview

Creates Document360 articles from new Asana tasks.

Manage Zaps via Zapier dashboard.

Delete process:
1. Navigate to dashboard
2. Select desired Zap
3. Click delete

## 753. Integrating Monday.com with Document360

Automate content transfer from Monday.com.

Connect platforms via API tokens.

Map necessary fields (title, content).

Test automated article creation in Document360.

Publish Zap for continuous content flow.

Key tools: Monday.com, Document360, Zapier.

## 754. Integrating Monday.com with Document360

Streamline workflows via Zapier integration.

Common use cases:
- Automate document creation/updates when tasks added/completed

Key benefits:
- Reduced manual work
- Improved collaboration
- Minimized errors

Setup:
- Define triggers in Monday.com
- Define actions in Document360
- Within Zapier

Ensure platform compatibility.

Check for pre-made Zaps.

Secure data transfer.

Enhances productivity through task-documentation synchronization.

## 755. Integrating Typeform with Document360

Automate transferring Typeform responses to Document360.

Connect accounts via Zapier.

Map Typeform fields to Document360 article attributes.

Generate API token.

Test then publish Zap.

Streamlines knowledge base updates.

## 756. Integrating Gmail with Document360

Automatically notify stakeholders of new articles via Gmail.

Use Zapier to connect platforms.

Configure email settings (recipients, subject, body).

Detailed steps:
- Document360-Gmail connection
- Trigger setup (new article creation)
- Action setup (email sending)
- Zap testing/publishing

Customize email contents/attachments per notification.

## 757. Zap overview

Automatically creates Document360 articles from new Typeform entries.

Manage Zaps via Zapier dashboard.

View, edit, delete via:
1. Zap actions icon
2. Select delete

## 758. Integrating Gmail with Document360

Supported via Zapier extensions.

(Plan details unspecified)

Gmail features:
- Powerful search
- Spam filtering
- Google service integration

Versatile communication/collaboration tool.

## 759. Zap overview

View/edit created Zaps.

Delete via Zapier dashboard:
1. Click Zap actions icon
2. Select Delete

Screenshot illustrates process (may not load).

## 760. Integrating Document360 with Mailchimp

Automate Mailchimp marketing campaigns via Zapier.

Configure trigger (Document360 updates) and action (Mailchimp campaigns).

Map audience, subject, email content fields.

Generate Document360 API token for authentication.

Test and publish Zap for automated content communication to subscribers.

## 761. Make - Setup guide

Integrate Make with Document360.

Requirements:
- Make account
- Account in other app

Make automates workflows (Scenarios) between platforms.

## 762. Integrating Mailchimp with Document360

Mailchimp is robust email marketing platform.

Features:
- Contact list management
- Interaction tracking
- Audience insights

Supported across Professional, Business, Enterprise plans via Zapier.

Automate tasks:
- Sync new users
- Send notifications for new articles

Enhances marketing efficiency/documentation processes.

## 763. Make use cases for Document360

Integrate with popular tools (Asana, Monday.com, Typeform, Google Docs, Jira) via APIs.

Enable seamless document management/workflow automation.

Connect document creation/management activities within Document360 to:
- Tasks
- Projects
- Other workflows in integrated applications

Centralized platform (Document360) maintains consistent records.

Link related actions across tools.

## 764. Zap overview

Create Mailchimp campaigns from new Document360 articles.

View/edit Zaps on overview page.

Delete via Zapier dashboard:
1. Click actions menu
2. Select delete

## 765. Integrating Asana with Document360

Streamline project management, task tracking, collaboration.

Supported across Professional, Business, Enterprise plans.

Asana provides centralized platform for:
- Work organization
- Progress tracking
- Accountability in documentation projects

## 766. API key generation in Document360

Generate via: Settings > Knowledge base portal > Extensions.

Select Team Collaboration section.

Click "Connect" on Make extension tile.

Obtain Token for connecting to third-party apps.

Copy and secure Token for integration.

## 767. Integrating Monday.com with Document360

Plans support integration via Make extensions.

Streamline content creation/collaboration.

Leverage Monday.com's organization/tracking features.

(No specific details provided)

## 768. Integrating Typeform with Document360

(Insufficient details for meaningful summary)

## 769. Integrating Typeform with Document360

Automate article creation triggered by new Typeform submissions.

Configure Make scenario:
- Connect Typeform (specify form ID, desired fields)
- Connect Document360 (API key)

Map Typeform response fields to Document360 article title/content.

Test and schedule scenario for automated data flow.

## 770. Integrating Monday.com with Document360

Quickly connect via Make (Integromat).

Setup:
1. Create scenario in Make
2. Authenticate platforms with API tokens
   - Monday.com token from profile
   - Document360 key from Make extension
3. Link modules to trigger actions
4. Test integration

Schedule and activate workflow for seamless automation.

## 771. Integrating Document360 with Google Docs

Integrate via Make.

Create Make scenario:
- Monitor Google Docs (e.g., new documents in specific folder)
- Trigger Document360 action (e.g., create article)

Configure criteria:
- Document folder
- Execution frequency
- API tokens

Test and schedule integration for automated workflow.

## 772. Integrating Jira with Document360

Plans exist for integration across:
- Professional
- Business
- Enterprise tiers

(Current details unspecified)

## 773. Integrating Jira with Document360

Integrate via Make.

Create scenario connecting platforms via APIs.

Map Jira task fields to Document360 article attributes.

Configure triggers for new Jira tasks to create Document360 articles.

Schedule integration for continuous operation.

Test thoroughly.

Requirements:
- Make account
- Jira API token
- Document360 API key

## 774. Feature highlights

Document360 Chrome extension features:

- Easy launch with customizable positioning
- Quick launch label for access
- "Page Help" tab: search/view articles in reader view (copy, open, expand options)
- "Knowledge base" tab: complete tree-view access to integrated articles
- Browse/view in reader view

## 775. Removing Document360 extension in Chrome

Two methods:

1. Visit Chrome Web Store Document360 page. Click "Remove from Chrome".

2. Right-click Document360 icon in Chrome. Select "Remove from Chrome". Confirm.

## 776. Chrome

Document360 Chrome extension available in Chrome Web Store.

Enables access/search of knowledge base articles/categories via API key.

Integration plans listed for Professional, Business, Enterprise tiers.

(Details pending)## 777. Crowdin

Document360 integrates with Crowdin's localization platform.

- Professional plans: extension not supported
- Business plans: requires add-on
- Enterprise plans: included
- Crowdin account required

## 778. Chrome extension: setup

Setup steps:

1. **Install:**

- Open Chrome
- Visit Chrome Web Store
- Search Document360
- Click "Add to Chrome"
- Confirm with "Add extension"

2. **Manage:**

- More (> ) > Extensions > Manage Extensions
- Requires Google account (guests can't add extensions)
- For Incognito: enable "Allow in Incognito" in Manage Extensions

3. **Configure API key:**

- Click Document360 icon (top right)
- Enter API key in side window
- Get key from Document360 portal:
  - Settings > Knowledge Base Portal > Extensions
  - Select Chrome extension > Details
  - Copy Internal Integration Token
  - Paste in extension window > Save

## 779. FAQ

Document360 Chrome extension lets users access articles and categories from their knowledge base. Features include search, viewing, and navigation. API enables software communication. Crowdin integration available for translation.

## 780. Push to Crowdin from Document360

Push content updates directly from Document360 to connected Crowdin project.

- No platform switching needed
- Automatic synchronization of latest changes
- Timestamps for translation actions
- View translation progress on Crowdin
- Team collaboration for edits/reviews
- Only synced categories/articles eligible

## 781. Phrase

Phrase extension: Enterprise-only feature.

Enables multilingual content translation with high accuracy, speed, and scalability. Potential benefits include resource savings and increased customer engagement.

## 782. Basic setup guide

1. Create Crowdin enterprise project (matching name, source language, target languages)
2. Generate Document360 API token
3. Integrate with Crowdin
4. Obtain Crowdin API token
5. Configure in Document360
6. Sync categories/articles (project names must match)
7. Machine translations enabled by default (customizable)

## 783. Language Configuration

Configure default language and script direction:

- Workspace settings > choose language
- Set as default
- Toggle LTR/RTL
- Save changes

## 784. Translation Configuration

Configure translation:

- Knowledge Base portal > Extensions > Phrase > Details
- Select workspace, languages, articles
- Click "Translate"
- Monitor status: "Yet to initiate", "Translated", "Failed", "In Progress"
- Refresh and filter to check status
- Translated articles move to Advanced WYSIWYG editor (unrecoverable)
- Supports single/multiple workspace selection

## 785. Setting up Phrase Translation Service

- Settings > Knowledge base portal > Extensions
- Connect to Phrase
- Create configuration with API token
- Select workspaces > Create
- Use Resync for language changes

## 786. FAQ

Document360 subscriptions don't include Crowdin translation services. Integration possible via API. API: communication rules between software applications.

## 787. FAQ

Translation options limited to project-supported languages.

## 788. General project settings

"Project settings" page customization options:

- Project details
- Editor preferences
- File formats
- Analytics rules

Settings apply broadly across user roles.

## 789. Accessing the Project settings page

Path: Settings > Knowledge base portal > General

Configure:

- Project name, country
- Editor: Markdown or WYSIWYG
- "Remember state": enable/disable UI state retention
- Review reminders
- Drive settings (media format restrictions)
- Analytics (IP exclusions)
- Support access

Save changes when done.

## 790. Preview Translated Content

- Documentation > set workspace language to match translation
- Preview unpublished articles via preview option
- View published articles in knowledge base
- Requires Phrase subscription

## 791. Accessing team auditing

Path: Settings > Knowledge base portal > Team auditing

- Filter by event, date, or user
- Refresh for updates
- Export as CSV
- Display limit: 20 records at a time

## 792. Localization - Getting started

Localization available across all plans (add-ons may apply).

Translate content, visuals, and cultural elements (units, dates).

Options:

- Manual translation
- Machine translation + human review

Recommendations:

- Prioritize languages by customer demographics
- Use single multilingual workspace (security/access benefits)
- Style guides/glossaries for consistency
- Regular content updates
- Track metrics: engagement, support tickets, satisfaction
- Consider third-party tools like Crowdin## Team auditing

Track actions performed by team accounts (adding/updating articles, changing settings).

Useful for tracing activities like restoring deleted articles or reviewing changes during product releases.

Access: Owners, Admins, and users with custom roles only.

## 793. Setting up a Multi-lingual knowledge base

Two options:

- Single project with multiple languages
- Separate language-specific knowledge bases

## 794. Setting up the audit configuration

Path: **Settings > Knowledge base portal > Team auditing**

Options:

- Enable **All events** toggle to monitor everything
- Select specific event categories from modules:
  - Documentation editor
  - Drive
  - Knowledge base portal settings
  - Site settings
  - Widget settings
  - Users & security
  - Tools settings

Each module tracks various actions (article updates, folder changes, site design modifications, user management, etc.).

Filter audit data by user, event, or date range. Updates in real-time.

Access restrictions possible based on roles.

Auditing doesn't recover deleted content but provides detailed logs.

## 795. Adding multiple languages to a single version

Two methods:

**Method 1**: Edit existing workspace
- Select languages
- Set defaults
- Change display names

**Method 2**: Add new workspaces
- Start with machine translation
- Requires manual translation

Key details:
- Updates may take up to 15 minutes due to caching
- Each language requires manual updates
- Cannot delete or hide default language
- Both methods require manual translation effort

## 796. **FAQ(s)**

**Document360 TLDR**: 
- Supports 49 languages (5/3/2 based on plan)
- No auto-translation between languages
- Bulk translation needed via "All articles" section
- Three components: CMS, online library, public website

## 797. Available languages

48 languages supported including:
- Major: English, Spanish, French, Chinese, Japanese, Korean
- Regional variants: English (US/UK), Chinese (Simplified), Portuguese (Brazil)

## 798. Defining workspaces and their role

Projects = central knowledge hubs.

Workspaces = specialized areas within projects (plan-limited).

Organize documentation by audience (internal/external) or product lines.

## 799. Localization variables

Tailor text across Knowledge Base portal by language.

Path: Settings > Knowledge Base Portal > Localization & Workspaces > Localization Variables

Process:
- Select language
- Update variables in accordion sections (Eddy AI, Accessibility, etc.)
- Save changes

Key details:
- Updates may take up to 15 minutes due to caching
- Each language requires manual updates

Examples: Customizing "Search" or "In this article" labels.

## 800. Workspaces

Create multiple distinct knowledge bases within a single project.

Cater to diverse audiences or documentation needs.

Keep content organized, accessible, and relevant.

## 801. Benefits of using workspaces

- Ensure relevant information reaches specific audiences
- Improve content organization
- Facilitate team collaboration through structured peer reviews

## 802. Starting with Workspaces

Document360 creates default workspace ("v1") automatically.

Multiple workspaces streamline documentation targeting.

## 803. Use cases of workspaces

- **Product-specific documentation**: Separate workspaces for multiple SaaS products
- **Audience-specific documentation**: Dedicated workspaces for different user roles (developers, end-users, administrators)
- **Internal/external separation**: Different workspaces for support teams vs. customers

## 804. Troubleshooting

404 errors with secondary workspaces usually mean:
- Workspace is private
- No published articles
- Articles are hidden

Ensure workspace is public with at least one published article.

Workspace status directly impacts visibility.

Subscription tiers affect available workspaces and features (backup/restore).

## 805. Purchasing workspaces from Localization & Workspaces

Steps:
1. **Settings** > **Knowledge base portal** > **Localization & Workspaces** > **Localization & Workspaces**
2. Click **buy more** link (Owner role required)
3. Adjust workspace count in **Purchase add-on** window
4. Review **Amount due**
5. Confirm payment
6. Download invoice

Alternative: Purchase through Billing section.

## 806. Backup and restore

Daily automatic backups at 00:00 UTC.

Manual backups also possible.

Restore components:
- Documentation
- API docs
- Homepage builder
- Custom CSS & JavaScript

Recover lost/altered content from latest backup.

## 807. Restoring from a Backup

Path: Settings > Knowledge Base Portal > Backup & Restore

Process:
1. Select desired backup
2. Choose elements to restore (documentation, API, Homepage, CSS, JS)
3. Compare Custom CSS/JS versions before restoring
4. Click "Restore"
5. Confirm
6. Wait for "Backup restored" message

## 808. Adding a new workspace

Path: **Settings > Knowledge base portal > Localization & Workspaces > Localization & Workspaces**

Steps:
1. Click **Add workspace**
2. Choose workspace type
3. Enter name (max 30 alphanumeric/hyphen characters)
4. Customize URL
5. Select status: Main (default, public), beta, public, or deprecated
6. Option to create new workspace or copy existing content
7. Configure languages (default, display name, right-to-left, visibility)
8. Click **Add**

## 809. Creating a manual backup

Path: **Settings** > **Knowledge base portal** > **Backup and Restore**

Steps:
1. Click **New backup**
2. Enter backup name
3. Click **Backup**
4. Backup added to log when complete

## 810. Restore options

Restore components:
- Documentation
- API docs
- Homepage
- Custom CSS/JS

Options:
- Select specific elements or restore everything
- Preview before restoring

Backup retention: 90 days.

Cannot manually delete backups.

Compare and copy code snippets for custom CSS/JS.

## 811. Webhook notification channel

Send real-time notifications (e.g., to Slack) about knowledge base updates.

Automate information sharing between applications.

## 812. Accessing notification channels

Path: Settings > Knowledge base portal > Notifications > Notification channels

Available channels:
- Webhook
- Slack
- Microsoft Teams
- SMTP (email)

SMTP channel is pre-configured and cannot be deleted.

Edit, delete, or add new channels.

## 813. Slack notification channel

Configure Slack notifications for new articles and document updates.

Real-time updates for support teams.

Available across all subscription plans.

## 814. Notifications

Setup notification channels for project changes.

Supported channels: email, Slack, Teams, webhooks.

Available across Professional, Business, Enterprise plans.

Real-time updates for users (project managers, etc.).

## 815. Setting up Slack notification channel

Steps:
1. Create Slack app
2. Activate incoming webhooks
3. Copy generated webhook URL
4. Configure channel in Document360 settings
5. Specify "Friendly name" and webhook URL
6. Optionally map specific notifications in Notification Mapping

## 816. Microsoft Teams notification channel

Receive real-time notifications about knowledge base updates.

Available across subscription tiers.

## 817. Setting up a Webhook notification channel

Path: Settings > Notifications > Webhook

Configuration:
- Friendly name
- Request method (POST/PUT)
- URL
- Format
- Headers
- Authorization (if needed)

Save and map notifications.

## 818. SMTP notification channel

Configure SMTP to send email notifications about knowledge base updates.

Covers portal, site, and widget changes.

Instant alerts to team members.

## 819. Setting up the SMTP notification channel

Path: Settings > Knowledge base portal > Notifications > New channel > SMTP

Steps:
1. Input descriptive name
2. Enter recipient emails (semicolon-separated)
3. Save
4. Map events to trigger notifications

## 820. Notification mapping

Configure alerts for updates (documentation, security, analytics).

Works across Professional, Business, Enterprise plans.

Automate updates without manual checking.

Table is empty - no specific mapping details available.

## 821. Mapping Notification channels to events

Path: Knowledge base portal > Notifications

Process:
1. Enable events (all or specific modules/events)
2. Map events to desired channels (email, Slack, etc.)

Default: All events off.

Enable specific events like "Analytics weekly mail" per module.

Each enabled event requires at least one assigned notification channel.

## 822. Notification history

Track delivery statuses of alerts sent to configured channels.

Monitor delivery and troubleshoot failures.

Ensure critical updates are received.

## 823. Setting Up the Microsoft Teams Notification Channel

Three steps:

1. **Create Teams Channel**
   - Open Teams
   - Navigate to desired team
   - Add new channel (e.g., "Document360 Notifications")

2. **Get Webhook URL**
   - Manage channel settings
   - Add incoming webhook
   - Generate and copy URL

3. **Configure in Document360**
   - Settings > Notification channels
   - Add new channel
   - Select Teams
   - Enter friendly name
   - Paste webhook URL
   - Save

Test setup by triggering notification.

Use Notification Mapping to customize events.

For multiple channels: repeat process with different webhooks.

## 824. Email domain

Enterprise users can configure custom email domains for notifications.

Process:
1. Add domain
2. Obtain MX/TXT records from Document360
3. Add records to DNS provider
4. Verify configuration
5. Specify "From" email address and sender name

## 825. Notification events

Events by module:

- **Documentation editor**: Article updates, visibility changes, workflow status
- **Drive**: Folder/file modifications
- **Portal settings**: Workspace updates, tag changes
- **Site**: Feedback and user interaction alerts
- **AI**: Credit usage alerts
- **Analytics**: Weekly metrics
- **Comments**: Inline comment notifications

Stay informed about knowledge base activities.

## 826. **Linking your Document360 project in Postman**

Import Document360 API: `https://apihub.document360.io/swagger/v2/swagger.json`

Authentication:
- Use Document360 API token
- Obtain from Settings > Knowledge Base portal > API tokens

Setup:
- Create Postman environment variable (`base_URL`)
- Set value to `https://apihub.document360.io`

Access endpoints via Postman.

Re-authentication needed if session ends.

## 827. Managing Notification history

Path: **Settings > Knowledge base portal > Notification** > **Notification history** tab

Details tracked:
- Channel name
- Delivery status
- Submission date
- Sent date
- Event details

Use **View details** to review content sent to users.

## 828. **Swagger documentation site**

Authenticate with API token.

Methods:
- `GET`: Retrieve
- `POST`: Add
- `PUT`: Update
- `DELETE`: Remove

Required fields use underscores (e.g., `email_id`).

Proper formatting crucial.

Session may end - re-authentication required.

## 829. Portal search

Search across all project content, files, tags, users, content tools, and settings.

Works across all workspaces and languages simultaneously.

## 830. How to use Postman?

API platform for building and using APIs.

Integrates with Document360 projects.

Access options: on-premises or web-based.

Resources:
- [Download Postman](https://www.postman.com/downloads/)
- [Install and Update Postman](https://learning.postman.com/docs/getting-started/installation-and-updates/)
- [Postman Documentation](https://learning.postman.com/docs/)
- [Postman FAQs](https://www.google.com/search?q=FAQs+in+Postman%3F&rlz=1C1CHBD_enIN1119IN1119&oq=FAQs+in+Postman%3F&gs_lcrp=EgZjaHJvbWUqBggAEEUYOzIGCAAQRRg7MgoIARAAGIAEGKIE0gEHNjI5ajBqN6gCALACAA&sourceid=chrome&ie=UTF-8)

## 831. How to use Swagger?

1. **Definition**: Define API using JSON/YAML specification
2. **Documentation**: Generate web interface with Swagger UI
3. **Interaction**: Send requests and view responses directly
4. **Integration**: Automatically updates with API changes

Simplifies API understanding through visual interaction.

## 832. Article-portal search

Search all project articles and categories.

Works across all workspaces and languages.

## 833. Accessing the articles through full portal search

Steps:
1. Click search icon
2. Select "Articles" in dropdown
3. Type keywords
4. Results show: title, workspace, language, status
5. Use filters to refine
6. Preview by clicking
7. Use full-screen option to expand
8. Click "Go to article" for full document

## 834. Filters

Article search filters:
- Workspace/language
- Visibility (None, Visible, Hidden)
- Status (None, New, Draft, Published)
- Contributors (search by username)
- Tags (multi-select)
- Updated date (7 days, 30 days, 3 months, 1 year, custom)

Clear filters as needed.

## 835. Accessing the full portal search

Steps:
1. Click search icon (top navigation bar)
2. Select module: All, Article, Drive file, Users & Groups, Tags, Settings
3. Enter keywords
4. Each module shows up to five results
5. Expand with "More articles"
6. Apply filters or preview items
7. Navigate with "Go to article"
8. Press Escape to exit

## 836. Drive-portal search

Search all Drive files in project.

Support varies by Professional, Business, Enterprise plans.

## 837. **Accessing the Drive - Full portal search page**

Steps:
1. Click search icon
2. Select "Drive" from dropdown
3. Type keywords

Results show:
- File name
- Dependencies
- Update details
- Size
- Tags

Filters:
- Status (all, deleted, starred)
- File type (image, word, etc.)
- Uploaded by
- Tags
- Upload date or custom range

Click file to see details (location, type, upload info).

View dependencies to see usage in articles/categories.

## 838. **Accessing the Users & Groups - Full portal search page**

Steps:
1. Use search icon
2. Select "Users & Groups"
3. Type keyword

Results categories:
- **Team accounts & groups**: View permissions, manage permissions, see members
- **Readers & groups**: View readers, manage associated readers

Click entry for detailed information and actions.

Search team accounts, groups, readers, reader groups.

## 839. Tags-portal search

Search knowledge base tags and view dependencies.

Access varies by user role (Professional, Business, Enterprise).

## 840. Filters

Users & Groups filters:

1. **Type**: All entity, Team account, Team account groups, Reader, Reader Groups (default: All entity)
2. **Last logged in**: All, 7 days, 30 days, 3 months, 1 year, Custom date (default: All)

Click **Apply** to use filters or **Clear** to reset.

## 841. Users & groups-portal search

Search team accounts, team account groups, readers, reader groups.

Plan support unspecified.

## 842. Settings-portal search

Search knowledge base portal features and settings.

No functionality details provided.

## 843. **Accessing the Settings - Full portal search page**

Steps:
1. Click Search icon
2. Select "Settings" from dropdown
3. Search by keyword
4. Click setting to view/modify

Settings grouped by:
- Knowledge base portal
- Knowledge base site
- Users & Security

Results show: name, icon, short description.

## 844. Custom domain mapping

Change default `project-name.document360.com` to custom domain (e.g., `help.yourcompany.com`).

Improves branding and user experience.

Path: Settings > Knowledge base site > Custom domain.

New projects use project name as default.

## 845. **Accessing the Tags - Full portal search page**

Steps:
1. Click Search icon (top right)
2. Press Escape to close
3. Select "Tags" from dropdown
4. Type keyword

Results show:
- Tag name
- Dependencies (articles, categories, files)

Click tag for detailed dependency info:
- Articles/categories: name, version, language, contributor, status, publish date
- Files: thumbnail and filename

Actions:
- Download files
- Remove dependencies (select checkboxes, click "Remove dependencies")
- Cancel to close panel

## 846. Creating a custom domain

Steps:
1. Add domain in Document360 settings
2. Create CNAME record in domain registrar
3. Point to Document360-provided value
4. Verify setup in Document360

Warning handling:
- "Deceptive site ahead": Check Google Safe Browsing status
- Address reported issues

Registrar-specific instructions included.

## 847. Configuring a custom domain for Apex domains

Requirements:
- Domain registrar must support DNS flattening
- Some don't (e.g., GoDaddy)
- Alternative: Use DNS provider like Cloudflare

SSL certificate:
- Provided by Document360
- Must renew within 90 days
- Common Name (CN) required

## 848. Editing a default domain

Steps:
1. Go to **Custom domain** page in settings
2. Click **Edit** icon next to default domain
3. Enter preferred domain

Status:
- If unavailable: **Update** button disabled
- If available: **Update** button enabled

4. Click **Update** to save

## 849. Hosting Document360 on a sub-directory

Plan support information unavailable.

## 850. Load balancer

Distributes traffic across multiple servers.

Keeps site fast and reliable during high traffic.

Upgrade benefits: security, traffic management, performance.

Process:
1. Settings > Knowledge base site > Custom domain > Custom domain mapping
2. Click **Upgrade**
3. Verify configuration
4. Copy generated CNAME record
5. Set up CNAME in domain registrar
6. Re-verify in Document360

Contact support if needed.

## 851. **What is subfolder hosting?**

Organize content hierarchically within folders under root domain.

Example: `example.com/docs`

SEO benefits over subdomains.

Subdirectories beneath primary domain.

## 852. Troubleshooting

Common issues:

- **Domain Verification Failed**: Check CNAME records match, no duplicates
- **DNS Propagation**: Allow 24 hours, check TTL settings
- **CAA Restrictions**: Verify SSL provider CAA entries
- **"This site can't be reached" Error**: Check DNS, duplicate records, SSL CAA
- **SSL Certificate Issues**: Check expiration, browser settings, DNS resolver

FAQs:
- Document360 provides SSL certificates automatically
- Custom domains reflect in invitation emails
- Multiple domains per project not supported
- Naked domains = those without "www"
- Domain registrars manage purchases and DNS

## 853. What happens next?

Site live on custom subfolder.

Need redirect from main domain to prevent duplicate content.

Contact support for redirect setup.

Configure canonical URL in portal settings for search engines.

Avoids duplicate content issues.

## 854. Web servers

Deliver content (text, images, video, app data) to clients.

Common servers:
- Apache HTTP Server
- Nginx
- ASP.NET Core
- Microsoft IIS
- OpenResty
- LiteSpeed
- Cloudflare

## 855. Enabling Subfolder Hosting

Steps:
1. Settings > Knowledge base site > Custom domain > Subfolder hosting tab
2. Toggle on feature (default path: `/docs`)
3. For custom paths (e.g., `/help`): enter path, click **Update**
4. Ensure subfolder hosting enabled
5. Configure languages for server

KB Site 2.0:
- Customize Site API path (e.g., `/docs-api`)
- Both Subfolder and Site API paths required

Note: Article preview not supported for custom domains with subfolder hosting.

## 856. Nginx server - Subfolder hosting

Open-source web server supporting subfolder hosting.

Details: [Nginx documentation](https://nginx.org/en/docs/)

## 857. Helpful Links

Nginx location blocks direct requests based on URL patterns.

Selection algorithms determine which block to use.

See external documentation for configuration details.

## 858. Sitemap generation

Configure Nginx to proxy sitemap requests.

Example uses `example.document360.io` (replace with your domain).

Supports language-specific sitemaps (e.g., `/sitemap.xml.en`).

Forward headers for security and tracking.

## 859. What happens next?

Knowledge base accessible via project URL and custom domain.

Duplicate content issue possible.

Contact support for redirect from existing URL to custom domain.

## 860. Setting up a subfolder/subdirectory

Configure Nginx:
1. Add location blocks for desired subdirectory
2. Specify proxy_pass, headers, sub_filter directives
3. For multiple workspaces: add separate blocks and redirects
4. Restart Nginx

## 861. Home page hosted on a subfolder

Steps:
1. Add Nginx configuration blocks for each workspace
2. Each block proxies requests to Document360 domain
3. Set appropriate headers
4. Use redirects for language-specific paths
5. Restart Nginx

Key: Configure exact location blocks, proxy to Document360, handle redirects.

## 862. ASP.NET Core server

Host knowledge base as subfolder (`/docs`) of main website.

Requirements:
- Install `Microsoft.AspNetCore.Proxy` package
- Configure proxy to route requests to actual server
- Define subfolder path and API path (KB Site 2.0)
- Replace example domain with Document360/custom domain

## 863. What happens next?

Duplicate content after subdirectory configuration.

Redirect required from original URL to custom subfolder.

Contact `support@document360.com` for setup.

## 864. Microsoft - IIS server

Integrate knowledge base via subfolder (`/help`).

Prerequisites:
- Application Request Routing module
- URL Rewrite module

Replace example domain with Document360/custom domain.

## 865. Troubleshooting

NGINX common issues:

- **Invalid "location" Directive**: Ensure within server block

```nginx
server {
  listen 80;
  server_name example.com;
  location /docs {
    proxy_pass https://example.document360.io/docs;
    proxy_set_header Host example.document360.io;
  }
}
```

- **Certbot Package Unavailable**: Enable EPEL repository

```bash
sudo yum install epel-release
sudo yum install certbot
```

- **NGINX Configuration Test Failed**: Run `sudo nginx -t`

```nginx
# Incorrect
proxy_pas https://example.com;

# Correct
proxy_pass https://example.com;
```

- **SSL Certificate Issue**: Verify with OpenSSL

```bash
openssl x509 -in /etc/letsencrypt/live/yourdomain.com/fullchain.pem -text -noout
```

## 866. What happens next?

Duplicate content issue after custom subfolder setup.

Redirect required from original URL to custom subfolder.

Contact `support@document360.com` to enable redirect.

Prevents search engine ranking issues.

## 867. Sitemap generation

Proxy sitemap.xml requests to internal/external server.

Example uses `example.document360.io` (replace with your domain).

Supports language-specific sitemaps.

Hide internal sitemap location.

## 868. What happens next?

Knowledge base accessible via two URLs.

Duplicate content possible.

Redirect required from project URL to custom subfolder.

Contact support for implementation.

## 869. Setting up a sub-folder path

IIS setup:

1. **Install Required Modules**:
   - [URL Rewrite module](https://www.iis.net/downloads/microsoft/url-rewrite)
   - Application Request Routing (ARR) module

2. **Configure web.config**: Add rewrite rules

```xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <rewrite>
      <rules>
        <rule name="ReverseProxy_HomePage" enabled="true" stopProcessing="true">
          <match url="^help$" />
          <action type="Rewrite" url="https://example.document360.io/v1" />
          <serverVariables>
            <set name="HTTP_requested_by" value="proxy" />
            <set name="HTTP_X_ORIGINAL_ACCEPT_ENCODING" value="{HTTP_ACCEPT_ENCODING}" />
            <set name="HTTP_ACCEPT_ENCODING" value="" />
          </serverVariables>
        </rule>
        <rule name="ReverseProxy_DocsPage" enabled="true" stopProcessing="true">
          <match url="^help/(.*)" />
          <action type="Rewrite" url="https://example.document360.io/help/{R:1}" />
          <serverVariables>
            <set name="HTTP_requested_by" value="proxy" />
            <set name="HTTP_X_ORIGINAL_ACCEPT_ENCODING" value="{HTTP_ACCEPT_ENCODING}" />
            <set name="HTTP_ACCEPT_ENCODING" value="" />
          </serverVariables>
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>
```

Important:
- Backup `web.config` before changes
- KB Site 2.0: define both Subfolder and Site API paths

## 870. Readers self-registration

Process:
1. Share knowledge base URL
2. Users enter name & email
3. Verify email for password setup

Control:
- Project members control reader access
- Email verification = one-time process (usable across projects)

## 871. Readers self registration

Available for Business and Enterprise plans.

Requires Knowledge base site access set to Private or Mixed.

## 872. Apache HTTP server

Free, open-source solution for hosting Document360 as subfolders.

Steps:
1. Enable modules (proxy, headers, substitute)
2. Configure VirtualHost for proxying and URL substitutions
3. Set up redirects
4. Restart server

Substitutions ensure links reflect subfolder structure.

Redirects manage URL paths seamlessly.

## 873. Accessing the Reader self-registration option

Enable in Document360 settings.

Options:
- Configure default reader groups
- Restrict access by email domain (allow/block specific domains)

New readers added to default groups unless domain already assigned.

## 874. Adding a domain restriction

Configure self-registration by domain.

Process:
1. Specify email domains (allow/block)
2. Assign reader groups to domains

Domain-specific settings override default reader groups.

## 875. Creating a Reviewer account

Two methods:

**Individual creation**:
1. Select "Reviewer" portal role during team account creation

**Bulk import**:
1. Use CSV file with email addresses

Both methods:
- Ensure correct portal and content roles
- Specify content access permissions

## 876. FAQs

- **No default reader group**: Self-registered readers get unrestricted access
- **Multiple group memberships**: Readers get highest access level per content item
- **Individual vs. group access**: Highest privilege from both settings applies
- **Access prioritization**: Highest privilege at each content level determines access
- **Self-registration not working with SSO**: Requires Document360 login page (bypassed by SSO)

## 877. Managing reviewer accounts

**Reviewer** role:
- View articles
- Add comments
- Update workflow statuses
- No content editing

Available across Professional, Business, Enterprise plans.

Controlled access to Documentation module.

## 878. Managing Reviewer accounts

Path: "Team accounts & groups" section in settings.

Actions:
- Edit/delete existing accounts
- Convert to/from reader accounts
- Purchase reviewer add-ons via billing section

Conversion to reader:
- Select content access permissions
- Optional mapping to reader groups

## 879. Reviewer role functionality

Purpose: Content review without editing.

Capabilities:
- Access articles (draft mode)
- Leave comments
- Suggest edits
- Update workflow statuses

Control:
- Access controlled by category/article
- Plan-dependent account limits (Professional: 5, Business: 10, Enterprise: 20)

Restriction: No direct content edits permitted.

## 880. Account locked

Five incorrect password attempts = 30-minute lockout.

User receives: "Account locked due to multiple failed attempts! Please try again after 30 minutes"

## 881. Reviewer permissions and access

Access:
- Documentation module only
- View articles in Draft or workflow states
- Add comments (inline or general)
- Update workflow statuses
- Set due dates
- Manage assignments
- Bulk updates across articles

Restrictions:
- No comments in Read-only mode
- One reviewer per article at a time
- Others notified when reviewer active

## 882. New password requirements

Minimum 8 characters including:
- 1 uppercase letter
- 1 lowercase letter
- 1 number
- 1 special character

## 883. Resetting your password

Steps:
1. Click "Forgot password?"
2. Enter email
3. Check inbox for reset link
4. Click link
5. Set new password
6. Confirm

Changes apply to entire account.

## 884. Block inheritance

Plan feature information unavailable (empty table).

## 885. Changing your current password

Follow instructions in [Change password article](https://docs.document360.com/v3/docs/change-password).

## 886. Block inheritance

Override inherited content access permissions.

Granular control over who sees specific content (workspaces, languages, categories, articles).

Administrators grant access on per-content-level basis.

Removing inherited permissions isolates access to explicitly added accounts.

## 887. IP restriction

Control knowledge base access by IP address.

Supports IPv4 and IPv6.

Applies to all workspaces and languages within project.

## 888. FAQs

Disabling inheritance:
- Restricts access to specified team accounts and groups only
- Performing account automatically selected (cannot remove)

## 889. Allow inheritance

Steps:
1. Navigate to category/article in Documentation section
2. Access Security settings via More icon
3. Toggle off **Block inherited account**
4. Confirm with **Yes**
5. Close blade

Allows inherited team accounts and groups to access content.

## 890. IP restriction page

Overview:
- Path: Settings > User & Security > IP Restriction

IP Details:
- Friendly name
- IP address (IPv4/IPv6)
- Allow/Block status
- Remove/Save options

Add IP:
- Enter name and IP/range
- Supports specific IPv6 formats

Permissions:
- Set IPs to Allow or Block
- Avoid duplicates to prevent conflicts

Deletion:
- Permanently remove IPs with Remove icon

## 891. Single Sign-On (SSO)

Plan details unavailable for Professional, Business, Enterprise tiers.

## 892. What is SSO?

**Single Sign-On (SSO)**: Access multiple applications with one login.

Process:
1. Log in once
2. Gain access to all connected applications
3. No repeated credential entry

Operates via central authentication service.

## 893. Reasons to configure Single Sign-On (SSO) in your project

Benefits:
- **Enhanced Security**: Fewer credential storage points
- **Increased Productivity**: Faster access, fewer passwords
- **Improved UX**: Fewer login prompts
- **Simplified IT**: Centralized credential management
- **Compliance Support**: Industry/sector adherence
- **Cost Reduction**: Less redundant systems and support

## 894. FAQ(s)

**IP address**: Identifying number for computers/networks enabling internet communication.

**IPv4 format**: Four numbers (0-255) separated by dots (e.g., 49.206.113.170).

**IPv6 format**: Eight groups of hexadecimal digits, colon-separated (e.g., FE38:DCE3:124C:C1A2:BA03:6745:EF1C:683D).

**IPv6 unicast address**: Identifies single interface for direct communication.

## 895. How does SSO work?

Collaboration between:
- **Service Provider** (e.g., Document360)
- **Identity Provider (IdP)**

Process:
1. User accesses Service Provider
2. Redirected to IdP for authentication
3. IdP issues Access/ID token
4. Service Provider validates token
5. Trust relationship established
6. Access SSO-enabled applications without additional sign-ins

Document360 supports multiple IdPs.

## 896. What is an IdP?

**Identity Provider (IdP)**: External entity managing user identities and authentication.

Functions:
- Stores credentials
- Handles logins for multiple applications
- Enables SSO access

Each stored entity = **principal**.

Examples: Okta, Entra ID, Google, ADFS, OneLogin.

## 897. Logging in using SSO

Steps:
1. Navigate to Knowledge base portal URL
2. Input email or subdomain
3. Click "Continue with SSO"
4. Log in to IdP
5. Automatically logged into Knowledge base portal

## 898. IdP initiated sign-in

Login directly from IdP dashboard.

Process:
1. Find Document360 app in IdP dashboard
2. Click to initiate login
3. Bypass separate portal visit
4. Use existing SSO credentials

## 899. SSO Standards on Document360

Supported protocols:
- **SAML 2.0**: Secure cross-application authentication
- **OpenID Connect**: Modern, user-friendly alternative

Both support various IdPs (Okta, ADFS, Google, etc.).

Configuration guides available.

## 900. Login using SSO - Knowledge base portal

Access portal with existing IdP credentials.

Eliminates multiple passwords.

Plan support unspecified.

## 901. Login using SSO - Knowledge base site

Access knowledge base site with IdP credentials.

No separate passwords needed.

## 902. Logging in using SSO

Process:
1. Visit site
2. Select IdP login button
3. Log into IdP
4. Automatically logged in

SSO login buttons vary by configuration.

## 903. Troubleshooting

HTTP 500 error during SSO login likely causes:
- Outdated SAML certificate
- Incorrect attribute mappings

Solutions:
1. Update IdP with latest Document360 metadata
2. Verify SAML attributes match exactly (email, name)
3. Contact support if issues persist

## 904. Adding a new team account as an SSO user

Standard team account creation + SSO configuration:

Requirements:
1. User email matches SSO domain
2. Select desired SSO configuration
3. Optional: Skip invitation email

Only Owners/Admins can add accounts.

## 905. IdP Initiated Sign-In

Enable during SSO setup:
- Toggle on **Allow IdP initiated Sign-In**
- Find Document360 application in IdP dashboard
- Click to initiate login
- Securely access Knowledge base with SSO credentials

## 906. Inviting or Adding SSO users

After SAML/OpenID configuration:

Authentication via:
- Okta
- Azure AD
- Google Workspace

Add users directly or invite existing users to SSO.

## 907. Deleting an SSO user

Steps:
1. Settings > Team accounts & groups
2. Hover over SSO account
3. Click "Delete"
4. Confirm

SSO users identified by SSO label.

Note: Does not delete associated team account.

## 908. FAQ

Cannot add user twice as SSO reader account.

If user exists as SSO reader, "Create reader account" button disabled.

SAML used for single sign-on.

## 909. Inviting an existing user

Steps:
1. Log in
2. Settings > Users & Security > SAML/OpenID
3. Edit SSO configuration
4. Select **All users** or **Selected users only**
5. Save

Users receive invitation email.

Additional SSO account created alongside existing one.

## 910. Mapping an existing SSO configuration to other projects

Steps:
1. Log in
2. Navigate to project settings
3. Select "Create SSO"
4. Choose existing configuration from dropdown

Requirements:
- Existing IdP and SSO protocol must match (SAML/OpenID)

## 911. Disabling the Document360 login page

Force SSO-only login:

Steps:
1. Enable "Disable Document360 login page" toggle
2. In project's SAML/OpenID settings

Affects SAML and OpenID SSO setups.

## 912. FAQs

Enabling toggle forces SSO login via SAML.

Eliminates email/password login option.

## 913. Automatically assigning SSO readers

Steps:
1. Settings > Users & security > SAML/OpenID
2. Enable "Auto assign reader group" option
3. Select desired existing reader groups

Requirements:
- Reader groups must already exist

## 914. Disable Document360 login page

Redirect users directly to SSO login.

Plan support unspecified.

Warning:
- Affects regular accounts if both SSO and regular present
- May prevent regular users from accessing accounts

## 915. Convert Document360 account to SSO account

Simplify login with SSO conversion.

Requirements:
- SAML/OpenID projects only

Process:
1. Select accounts
2. Click "Convert to SSO account"
3. Confirm

Effects:
- Previous contributions remain but appear as "Anonymous"
- Owner accounts become both Document360 and SSO (preserve access)
- SSO accounts cannot convert back

## 916. Auto assign reader group

Automate reader access for SSO users.

Supported across Professional, Business, Enterprise plans.

Eliminates manual invitations.

## 917. FAQ(s)

Conversion allowed for:
- Document360 account owners/admins
- Team account managers

Restrictions:
- JWT projects cannot convert
- Accidental conversions require manual recreation

## 918. Convert to SSO account

SSO typically supported in Business and Enterprise plans.

Professional plan availability varies by provider.

## 919. FAQs

SSO user accounts timeout after 2 hours of inactivity.

Timeout configurable.

SAML = SSO standard used.

## 920. SAML

SAML 2.0 enables SSO for Document360.

Users log in with existing IdP credentials.

Supports multiple SSO endpoints for teams and readers.

## 921. Sign out idle SSO team account

Automatically log out inactive SSO accounts.

Prevents unauthorized access.

Streamlines management.

Applies to SAML/OpenID accounts only.

## 922. How to enable the 'Sign out idle SSO team account' option?

Steps:
1. Settings > Users & Security > SAML/OpenID
2. Hover over SSO configuration
3. Click **Edit** icon
4. **More settings** tab
5. Toggle **ON** **Sign out idle SSO team account**
6. Set idle timeout (hours:minutes format)
7. Click **Save**

Note: Applies only to SSO team accounts, not Document360 team accounts.

## 923. Troubleshooting

Common SAML SSO login problems:

Cause: Incorrect or expired certificate in Document360 settings.

Solutions:
1. Obtain _active certificate_ from IdP
2. Replace certificate in Document360 settings
3. If issues persist:
   - Use SAML Tracer extension to capture logs
   - Contact support with screenshots (IdP config, certificate details, logs)

## 924. SAML SSO with Okta

Requirements:
- Owner or Admin Project role in Document360

Process:
- Configure SAML SSO with Okta
- User authenticates once in Okta, accesses Document360
- Switch between Okta and Document360 multiple times
- Use separate browser tabs recommended

## 925. Configuring SSO using SAML

Steps:
1. Select identity provider in Document360
2. Configure SP and IdP settings with provided details
3. Enable SSO access alongside traditional email/password login

## 926. Supported identity providers

Document360 supports:
- Okta
- Entra ID
- Google
- Auth0
- ADFS
- OneLogin
- Others

## 927. Okta to Document360 SAML SSO configuration

Process:
1. Gather parameters from Okta Application settings:
   - Sign-on URL
   - Identity Provider Issuer
   - X.509 Certificate
2. Document360 configuration:
   - Enter Okta mappings (Sign-on URL, Identity Provider Issuer)
   - Upload X.509 certificate
   - Configure optional settings:
     - Idle sign-out
     - Auto-assign reader groups
     - Custom login button text
3. Click "Create" to complete

Mapping: Okta IdP data to Document360 SP

## 928. Sign up for Okta

Steps:
1. Visit <https://developer.okta.com/signup/>
2. Receive email with login credentials and activation link
3. Click link to activate account
4. Log in to Okta Domain
5. Access developer console

Adding Document360 application:

1. **Log in as Admin**: Access with admin credentials, switch to admin role
2. **Create App Integration**: Applications > "Create App Integration" > SAML 2.0
3. **Configure SAML Settings**:
   - Enter app name and optional logo/visibility
   - Obtain parameters from Document360 SP page
   - Map parameters:
     - Callback path → Single sign-on URL
     - Service provider entity ID → Audience URI
   - Set Name ID format to EmailAddress
   - Set Application username to Email
   - Add Attribute Statements for email and name (case-sensitive)
4. **Finish Configuration**: Complete setup in Document360

## 929. Other configuration settings in the Azure AD portal

Customize Azure AD for SSO:
- Edit User Attributes & Claims (add new/group claims)
- Manage SAML signing certificates (add/import)
- Configure multiple notification emails
- Test configuration with user credentials

## 930. SAML SSO with Entra

Configure SAML SSO with Microsoft Entra as IdP.

Requirements:
- Owner or Admin role

Recommendation: Use separate browser tabs for Document360 and Entra.

## 931. Adding a custom SAML app on Google

Steps:
1. Create custom SAML app
2. Download certificate
3. Note SSO URL & Entity ID
4. Enable service for all users

Details used for IdP configuration in other systems.

## 932. Adding an application in the Azure portal

Key steps:

1. **Access Azure AD Portal**: Sign in, navigate to [portal.azure.com](https://portal.azure.com)
2. **Add New Application**:
   - "+ New application"
   - Select "Non-gallery application"
   - Enter application name
   - Click "Add"
3. **Set Up Single Sign-On**:
   - "Getting started" > "Set up single sign-on"
   - Select "SAML"
   - Configure using Document360 parameters
4. **Configure SP in Document360**:
   - Settings > Users & security > SAML/OpenID
   - "Create SSO"
   - Select "Entra ID" for auto-configuration
5. **Map Azure AD Fields to Document360**:
   - Copy SP parameters (Identifier, Reply URL, Sign-on URL, Logout URL)
   - Paste into Azure AD
6. **Complete IdP Configuration in Document360**:
   - Enter Azure AD values (Sign On URL, Entity ID, Logout URL, certificate)
   - Optional: Enable "Allow IdP initiated sign-in"
7. **Finalize More Settings**:
   - Assign SSO name
   - Customize login button
   - Other optional settings
8. **Save and Complete**: Click "Create" to finalize

## 933. SAML SSO with Google

Requirements:
- Owner or Admin project role in Document360
- Google Workspace account

Process:
1. Log in to Document360, select project
2. Log in to Google Workspace Admin console
3. Follow SSO configuration steps
4. Switch between platforms as needed

## 934. SAML SSO with OneLogin

Configure Document360 SSO with OneLogin using SAML.

Requirements:
- Owner or Admin Project role

Keep both platforms open during configuration.

## 935. Identity Provider configuration

Steps:
1. Navigate to Document360 configuration page
2. Enter SAML details from Google:
   - Sign on URL
   - Entity ID
   - Certificate
3. Adjust toggles (IdP-initiated sign-in)
4. Complete setup with additional settings (SSO naming, user assignments)

## 936. Service Provider configuration

Google Workspace SSO configuration:

1. Settings > Users & Security > SAML/OpenID
2. Click "Create SSO"
3. Select "Google" as Identity Provider
4. Copy ACS URL and Entity ID from Document360 SP page
5. Google Workspace setup:
   - Paste ACS URL and Entity ID into custom SAML app
   - Set Name ID format to EMAIL
   - Select Primary email for Name ID
6. Map Google Directory attributes:
   - Add Primary email for `name`, `email`, `urn:oasis:names:tc:SAML:2.0:nameid`
   - Click "Add Mapping" for each
   - Click "Finish"

## 937. Adding an Application in OneLogin

Configure Document360 SSO in OneLogin:

1. Add SAML Custom Connector application
2. Name "Document360 SSO"
3. Follow OneLogin Admin interface steps

## 938. Document360 SSO Configuration

Steps:
1. Populate SP configuration fields with IdP details
2. Match:
   - Issuer URL
   - SAML 2.0 Endpoint
   - SAML Certificate
3. Enable/disable IdP-initiated sign-in
4. Proceed to more settings page

Establishes connection between IdP and Document360 for SSO.

## 939. More Settings

Configure SSO settings:
- SSO name
- Custom login button text
- Auto-assign reader groups
- Idle account sign-out
- Existing account invitation

Click "Create" to finish.

## 940. Adding an Application in ADFS

Steps:
1. Create new claims-aware Relying Party Trust
2. Name (e.g., "Document360 SAML SSO")
3. Enable SAML 2.0 WebSSO protocol support

## 941. Configuring SAML in OneLogin

Document360 steps:
1. Settings > Users & security > SAML/OpenID
2. Click "Create SSO"
3. Select OneLogin as IdP
4. Gather from SP page:
   - Service provider entity ID
   - Callback path

OneLogin Configuration Tab:
- Audience (EntityID): Service provider entity ID
- Recipient: Callback path
- ACS URL Validator: Callback path
- ACS URL: Callback path

Parameters Tab:
- Add fields:
  - `urn:oasis:names:tc:SAML:2.0:nameid` = Email
  - `email` = Email
  - `name` = Email
- Ensure "Include in SAML assertion" checked

SSO Tab:
- Download X.509 Certificate (SHA256, PEM format)
- Copy Issuer URL and SAML 2.0 Endpoint (HTTP)

## 942. Document360 Service Provider (SP) Configuration

ADFS SAML SSO configuration:

1. Retrieve from Document360:
   - Subdomain
   - Callback URL
   - Signed-out Callback URL
   - Metadata URL
   - Service Provider Entity ID
2. Enter into ADFS Relying Party settings:
   - Relying Party Identifier
   - Sign-On URL
   - Sign-Out URL
   - Relying Party Trust Identifier
   - Metadata URL
3. Complete ADFS wizard
4. Review and finalize

## 943. Configuring Claim Rules

Map Active Directory LDAP attributes to claims:
- User-Principal-Name → Name ID
- E-Mail-Addresses → Email
- Display-Name → Name

Translates LDAP data into usable format.

## 944. SAML SSO with ADFS

Requirements:
- Administrative access to both platforms
- Owner or Admin role in Document360
- Separate browser tabs for both platforms

## 945. SAML SSO with other configurations

Configure SSO with non-listed IdPs:
- Owner/Admin project roles required
- Keep Document360 and IdP in separate tabs

## 946. Configuring SAML in your Identity Provider

Process:
1. Get from Document360:
   - Callback path
   - Service Provider Entity ID
   - Single Sign-On URL (if needed)
2. Configure in IdP's SAML settings
3. Attribute mapping often required (email, name, user ID)
4. Consult IdP documentation and Document360 requirements
5. Save settings after verification

## 947. Document360 SAML SSO Configuration

Steps:
1. Map ADFS values
2. Upload X.509 certificate
3. Enable/disable IdP-initiated sign-in
4. Customize settings (SSO name, login button text)
5. Finalize setup

## 948. Adding an Application in your Identity Provider

General steps:
1. Log in to IdP admin console
2. Navigate to application management
3. Create new application
4. Configure basic settings:
   - Application Name: Descriptive name (e.g., "Document360 SSO")
   - Application Type: SAML 2.0 sign-in method
5. Save application settings

## 949. Enabling the IdP-initiated sign in

Steps:
1. Settings > Users & security > SAML/OpenID
2. Edit existing SSO configuration
3. Enable "Allow IdP initiated sign in" toggle
4. Users access via dedicated IdP sign-on URL
5. Authenticate through IdP

## 950. FAQs

Supported IdPs:
- Okta
- Microsoft Entra
- Google Workspace
- OneLogin
- ADFS

Access from Okta requires "Allow IdP initiated sign in" enabled.

Document360 = knowledge base platform for content creation, file management, site configuration.

## 951. Document360 SAML SSO Configuration

Complete configuration process:

1. Enter IdP details:
   - SSO URL
   - Entity ID
   - SAML certificate
2. Upload X.509 certificate
3. Enable/disable IdP-initiated sign-in
4. Configure additional settings:
   - SSO name
   - Login button text
   - Auto-assign reader groups
   - Idle sign-out
   - User invitations
5. Complete setup to enable SSO

## 952. Identity Provider (IdP) initiated sign in

Document360 supports IdP-initiated sign-in using SAML for SSO.

Compatible IdPs:
- Okta
- Entra ID
- Google Workspace
- OneLogin
- ADFS

## 953. OpenID

OpenID Connect (OIDC) = open standard for SSO.

Benefits:
- Log in with existing IdP accounts
- Eliminate multiple passwords
- Improve security

Document360 supports multiple SSO endpoints for team accounts and readers.

## 954. Removing a configured SAML SSO

Steps:
1. Project Knowledge base portal
2. Settings > Users & security > SAML/OpenID
3. Hover over configuration
4. Click Delete icon
5. Confirm with Proceed

Warning: Deletes all associated users.

**SAML**: Standard for SSO allowing single credential access to multiple applications.

## 955. Configuring SSO using OpenID

Steps:
1. Settings > OpenID
2. Input IdP details in IdP configuration screen
3. Input Document360 details in SP configuration screen
4. Users log in via existing credentials or external SSO provider

## 956. Supported identity providers

Document360 supports:
- Okta
- Entra ID
- Google
- Auth0
- ADFS
- OneLogin
- Others

## 957. Troubleshooting

OpenID SSO error (IDX20803) likely cause: Wrong IdP Authority URL.

Fix:
1. Find correct "issuer" from IdP discovery document (`.well-known/openid-configuration`)
2. Paste "issuer" into Document360 SSO settings Authority field
3. Verify URL, network/firewall, IdP certificate validity

## 958. Adding an Application in Okta

Steps:
1. Log in to Okta as admin
2. Navigate to Applications
3. Click "Create App Integration"
4. Select OIDC and Web Application
5. Proceed to next step

## 959. Document360 Service Provider (SP) Configuration

Okta OpenID SSO configuration:

1. Create new OpenID connection in Document360
2. Select Okta as identity provider
3. Copy from Document360:
   - Subdomain name
   - Sign-in redirect URI
   - Sign-out redirect URI
4. Paste into Okta's new web app integration setup

Establishes SSO connection.

## 960. Sign up for Okta

Required for Document360 SSO configuration.

Sign up at [Okta Developer Sign-Up](https://developer.okta.com/signup/).

## 961. Okta with OpenID SSO Setup and Configuration

Requirements:
- Administrative access to Okta
- Owner or Admin Project role in Document360

Process:
- Open both platforms in separate tabs for easier switching

## 962. Creating an application in Auth0

Steps:
1. Log in to Auth0
2. Navigate to Applications
3. Create new application
4. Specify name
5. Select "Regular Web Application" type
6. Click create

## 963. Configure Auth0 OpenID with Document360

Steps:
1. Document360 settings
2. Choose "OpenID" protocol
3. Enter Auth0 details in corresponding Document360 fields:
   - Sign in redirect URI
   - Sign out redirect URI
4. Save changes

## 964. Document360 OpenID SSO Configuration

Process:
1. Enter Okta IdP settings:
   - Client ID
   - Client Secret
   - Issuer URI
2. Enable/disable IdP-initiated sign-in based on project needs
3. More Settings configuration:
   - SSO name
   - Login button text
   - Auto-assign reader groups
   - Idle sign-out
   - SSO invitations
4. Save configuration

## 965. Auth0 with OpenID SSO

Requirements:
- Auth0 account
- Owner or Admin project role in Document360

Setup:
- Use separate tabs for Auth0 and Document360
- Plan details unspecified
- Includes incorrect Microsoft Entra steps

## 966. ADFS with OpenID SSO

Requirements:
- Administrative access to both systems
- Owner or Admin project role in Document360

Process:
- Open both platforms in separate browser windows
- Switch between them during setup

## 967. Document360 Service Provider (SP) Configuration

ADFS OpenID SSO configuration:

1. Obtain from Document360:
   - Subdomain
   - Sign-in URI
   - Sign-out URI
2. Enter into ADFS Relying Party settings:
   - Relying Party Identifier
   - Sign-On URL
   - Sign-Out URL
3. Complete ADFS setup wizard
4. Review settings
5. Enable user access

## 968. Configuring Claim Rules

Steps:
1. Configure claim rule to send LDAP attributes as claims
2. Select "Send LDAP Attributes as Claims" template
3. Map LDAP attributes using Active Directory:
   - User-Principal-Name → Name ID
   - E-Mail-Addresses → Email
   - Display-Name → Name
4. Click "Finish" and "Apply" to save

## 969. Adding an Application in ADFS

Steps:
1. Log in to ADFS Management console
2. Navigate to Relying Party Trusts
3. Add new Relying Party Trust
4. Wizard steps:
   - Select "Claims aware"
   - Choose manual data entry
   - Provide display name
   - Optionally configure certificate (can skip)

## 970. Document360 OpenID SSO Configuration

Key steps:

1. Navigate to **Configure the Identity Provider (IdP)** page
2. Enter IdP **Client ID**, **Client Secret**, and **Authority** (domain)
3. Enable/disable **IdP initiated sign-in**
4. Configure **More Settings**:
   - **SSO name**
   - **Login button text**
   - Toggle **Auto assign reader group** and **Sign out idle SSO team account**
   - Choose whether to invite existing accounts to SSO
5. Click **Create** to complete

Enables secure OpenID-based authentication.

## 971. Other configurations with OpenID SSO

Configure SSO with unlisted OpenID IdP:

Requirements:
- Owner or Admin Project role
- Access to both Document360 and chosen IdP

Process:
- Keep both platforms open in separate browser tabs

## 972. Configuring OpenID in Your Identity Provider

Process:
1. Document360 SSO settings
2. Select "Others" as IdP
3. Choose "OpenID"
4. Document360 provides:
   - Subdomain name
   - Redirect URIs (sign-in/sign-out)
5. Crucial requirements:
   - Include scopes: _openid_, _email_, _profile_
   - Map claims: _sub_, _email_, _name_ (per Document360 specifications)
6. Review and save IdP configuration

## 973. Document360 OpenID SSO Configuration

Configuration steps:
1. Provide IdP Client ID, Secret, Authorization URL
2. Enter details:
   - SSO name
   - Custom login text
3. Enable/disable:
   - Auto-assignment of reader groups
   - IdP initiated logins
   - Account sign out
4. Upload certificates/keys where needed
5. Click 'Create' to finalize

## 974. Adding an Application in Your Identity Provider

General process:
1. Log in to admin console
2. Navigate to Applications or Enterprise Applications section
3. Create new application:
   - Name (e.g., "Document360 OpenID SSO")
   - Select OpenID Connect as sign-in method
4. Save settings

## 975. Document360 OpenID SSO Configuration

ADFS OpenID configuration:

1. Navigate to **Configure the Identity Provider (IdP)** page
2. Enter ADFS **Client ID** and **Client Secret** in corresponding fields
3. Ensure **Client Identifier** matches ADFS **Relying Party Identifier**
4. Toggle **Allow IdP initiated sign in** based on project needs
5. Enter ADFS **Issuer URL** as **Authority** in Document360
6. Proceed to **More settings** page:
   - **SSO Name**: Descriptive name
   - **Customize login button**: User-friendly text
   - **Auto assign reader group**: Enable/disable based on access policies
   - **Sign out idle SSO team account**: Set according to security requirements
   - Choose to invite existing users to SSO
7. Click **Create** to complete

Integrates Document360 with ADFS for seamless authentication.

## 976. Enterprise SSO using **JWT**

Process:
1. User logs into customer application
2. Customer app requests auth code via backchannel from IdP (using client credentials)
3. Document360 receives auth code
4. Document360 requests ID token/access token
5. Document360 creates session
6. Session automatically renews within configurable timeframe (5-1440 minutes)

Requirements:
- No separate Document360 reader account needed
- Exclusive to other SSO methods (SAML, OpenID)

## 977. Removing a configured OpenID SSO

Steps:
1. Access project Knowledge base
2. Settings > Users & security > SAML/OpenID
3. Hover over SSO configuration
4. Click Delete icon
5. Confirm deletion

Warning: Removes associated user accounts.

## 978. SSO configuration

JWT setup:
1. Create JWT: Settings > Users & security > JWT
2. Copy Client ID, Callback URL, Client secret for application
3. Enable/disable JWT SSO login
4. Configure login URL
5. Set up redirection using `redirectUrl` parameter
6. Note: Client secret only available once (regenerate if lost)

## 979. Setting up JWT SSO

JWT SSO configuration:

1. **Understand JWT**: JSON Web Token securely transfers authentication/authorization data
   - Contains header, payload, signature

2. **Check SSO Plan Compatibility**: Verify subscription plan support
   - Higher-tier plans (Enterprise) typically include SSO

3. **Generate JWT Token**: Upon user login
   - Include necessary claims (user ID, email)
   - Set expiration time for security

4. **Configure Secret Key**: Use strong secret key for signing
   - Share key with Document360 for verification

5. **Set Up Redirect Flow**: 
   - Users redirected to login page when accessing Document360
   - Post-login: generate JWT and redirect back with token

6. **Test the Flow**: Validate entire process
   - Ensure smooth authentication without additional logins

7. **Consult Documentation**: Refer to Document360 API documentation
   - Check specific requirements and endpoints

Result: Enhanced user convenience and security.

## 980. Reader groups in Document360

Grant precise access to private knowledge base content.

Process:
1. Users must log in
2. Create groups to restrict access (e.g., sales team sees only pricing/billing)
3. Assign members to groups

## 981. JWT reader groups

Link JWT reader accounts to existing Document360 reader groups.

Inherit restriction settings to control knowledge base access.

Function like regular reader groups.

Support SSO across Free, Professional, Business, Enterprise plans.

## 982. Reader group IDs

Find Reader group IDs:
- JWT SSO projects: Settings > Users and Security > Readers & groups
- Each group shows Group Id below name
- Copy icon for easy pasting into payload

Note: Available only for JWT-configured projects, not regular private knowledge bases.

## 983. Enabling JWT reader groups

Configuration:
1. Provide user details (name, email)
2. Include list of reader group IDs in specific JSON format
3. Changes apply after current JWT session expires
4. Use comma-separated IDs in `readerGroupIds` array
5. Token validity: minimum 5 minutes, maximum 1 day

## 984. How to change the highlighted search result color in articles?

Customize search highlight colors:

1. Knowledge Base site > Customize site > Custom CSS & JavaScript
2. Modify CSS snippet (different for KB Site 1.0 and 2.0)
3. Change `background-color` and `color` properties
4. Save changes

Replace default yellow with any desired color.

## 985. How to hide the project's workspace dropdown in the Knowledge base site?

Hide workspace dropdown:

Add CSS to site's custom CSS:
```css
header .header_bottom .header_bottom_nav ul li.versions-selection { display: none; }
```

Effect: Removes dropdown.

Users must navigate to workspaces via direct URLs.

## 986. How to change the color of the hyperlinks in Dark mode?

Customize dark mode hyperlink colors:

1. Access Custom CSS section in Knowledge Base settings
2. Add CSS snippet targeting hyperlinks in Dark mode
3. Customize color preference
4. Save changes

## 987. How to enlarge the pdf preview in the article?

Enlarge PDF preview:

1. Access Knowledge Base site settings
2. Navigate to Custom CSS section
3. Apply CSS snippet to adjust PDF container width

Result: Preview expands to full width for better visibility.

## 988. How to add a vertical scrollbar to the code blocks?

Two methods:

**Method 1**: Wrap specific code blocks
- Use `<div class="scroll">`
- Add custom CSS to set height and enable scrolling

**Method 2**: Apply globally
- Use `.code-toolbar` selectors in custom CSS

Outcome: Scrollbars appear for code blocks exceeding specified height.

Content stays within fixed area.

## 989. How to vertically align table contents at the top in the Knowledge base?

Align table content to top:

Add CSS to custom CSS settings:
```css
table td, table th, table tr { vertical-align: top !important; }
```

Overrides default alignment.

Follow Knowledge base customization steps to save.

## 990. How to make the table border bold in knowledge base?

Bold table borders:

1. Settings > Knowledge base site > Customize site > Custom CSS & JavaScript
2. Add CSS snippet:
```css
table td,
table th,
table tr {
  border: 3px solid #000000 !important;
}
```
3. Adjust `3px` thickness and `#000000` color as needed
4. Save

Applies to all tables in knowledge base.## 991. How to restrict readers from copying content?

Prevent content copying:

1. Intercept "cut," "copy," and "paste" events using JavaScript
2. Target specific HTML elements (`content_block`, `d360-article-content`)
3. Allow content selection but block Ctrl+C and alternative copy methods

This is a mitigation strategy, not foolproof protection.

## 992. How to set default height and width of embedded PDF?

Set custom PDF dimensions:

1. Navigate to CSS settings in knowledge base site
2. Add provided CSS snippet with desired pixel values

## 993. Center align headings in Markdown

Center headings using HTML tags:
```html
<hN style="text-align:center;">
```

Markdown lacks native centering.

Document360 provides WYSIWYG and markdown editors.

## 994. How to center align text in Markdown?

Center text with HTML:
```html
<p style="text-align:center;">Your text here</p>
```

Replace "Your text here" with actual content.

Basic formatting works inside paragraph tags.

## 995. How to change text color in Markdown?

Change text color using HTML:
```html
<span style="color:desiredColor;">Text</span>
```

Replace `desiredColor` with actual color value.

Markdown doesn't support inline styles directly.

## 996. How to change language name in code blocks?

Change language display name globally:

1. Modify Custom CSS targeting code block toolbar
2. Hide default language name
3. Display new custom label (e.g., "Example")

## 997. How to set dark mode as default?

Enable dark mode by default:

1. **Settings** > **Knowledge base site** > **Customize site** > **Custom CSS & JavaScript**
2. Add JavaScript to trigger dark mode:
```javascript
$(document).ready(function () {
  setTimeout(function () {
    document.getElementById('darkTheme').click();
  }, 100);
});
```
3. **Optional**: Enforce dark mode only
   - **Settings** > **Knowledge base site** > **Customize site**
   - Select **Dark only** under **Site theme**

Test implementation to ensure compatibility.

## 998. How to center align headings in articles?

Center H2, H3, H4 headings:

1. **Settings** > **Knowledge base site** > **Customize site** > **Custom CSS & JavaScript**
2. Add CSS:
```css
h2, h3, h4 { text-align: center; }
```
3. Save

Applies globally to all specified headings.

## 999. How to change table header color?

Change table header background:

1. Navigate to **Settings** > **Knowledge base site** > **Customize site** > **Custom CSS & JavaScript**
2. Target appropriate selector:
   - **KB Site 1.0**: `table th`
   - **KB Site 2.0**: `.editor360-table th`
3. Modify background color
4. Save

## 1000. How to change callout colors in dark mode?

Customize callout colors:

1. **Settings** > **Knowledge base site** > **Customize site** > **Custom CSS & JavaScript**
2. Modify these properties for callout classes:
   - `.infoBox`
   - `.errorBox`
   - `.warningBox`
3. Adjust `background-color`, `color`, and `border-left`
4. Use `!important` to override defaults

## 1001. How to add extra space in Markdown?

Add spacing using HTML:

- Vertical space: `<br>`
- Horizontal space: `&nbsp;`

Markdown doesn't support extra spacing natively.

## 1002. How to align images in Markdown?

Default image alignment is left.

Workaround using HTML:
```html
<p style="text-align: center"><img src="[Image-URL]" /></p>
```

Steps:
1. Find image URL in Document360 Drive
2. Replace `[Image-URL]` with actual URL
3. Adjust `text-align` value as needed (`left`, `right`, `center`)

Works with all image file types.

## 1003. How to make all links open in new tab?

Force links to open in new tabs:

1. **Settings** > **Knowledge base site** > **Customize site** > **Custom CSS & JavaScript**
2. Target selectors:
   - `content_block_text a`
   - `block-article a`
3. Set `target` attribute to `_blank`

## 1004. How to change table of contents color?

Modify TOC colors via custom CSS:

**KB Site 1.0**:
```css
.content_block .content_container .page-action .article_action_links ul li a
```

**KB Site 2.0**:
```css
d360-table-of-content .toc-item .toc-toggle-icon,
d360-table-of-content .toc-item a
```

Selected items:
```css
d360-table-of-content .toc-item.selected a
```

## 1005. How to add background image to text?

Add background images:

1. **Settings** > **Knowledge base site** > **Customize site** > **Custom CSS & JavaScript**
2. Create CSS class specifying background image URL
3. Apply class to text elements in HTML
4. Use publicly accessible images only

## 1006. How to sort table contents?

Add sorting functionality:

1. **Settings** > **Knowledge base site** > **Customize site** > **Custom CSS & JavaScript**
2. CSS: Style headers for clickability, display sort indicators
3. JavaScript: Handle sorting logic, maintain sort state, update indicators
4. Users click headers to sort

## 1007. How to set default featured image?

Configure social media default image:

1. **Settings** > **Knowledge base portal** > **Knowledge base site** > **Integrations**
2. **Custom HTML** > **Add**
3. Paste meta tags:
```html
<meta property="og:image" content="Image_URL" />
<meta property="og:image:secure_url" content="Image_URL" />
```
4. Replace "Image_URL" with actual link
5. Image must be publicly accessible

## 1008. How to customize hyperlink size?

Modify link font size (Enterprise plan):

1. **Settings** > **Knowledge Base Site** > **Customize Site** > **Custom CSS & JavaScript**
2. Add CSS:
```css
.CustomLink {
  font-size: 25px;
}
```
3. Apply class to links:
```html
<a class="CustomLink" href="your-link">Link Text</a>
```
4. Adjust font-size value

## 1009. How to add borders to images?

Add borders using HTML:
```html
<img src="image.jpg" alt="description" style="border: 2px solid grey;">
```

Adjust width, style, and color values as needed.

## 1010. How to embed YouTube Shorts?

Embed YouTube Shorts using iframe:

1. Replace `/shorts/` with `/embed/` in URL
2. Use provided iframe code
3. Optimal size: 315px × 560px

## 1011. How to add shadows to images?

Add shadows using HTML:
```html
<img src="image.jpg" alt="description" style="box-shadow: 3px 3px 3px gray;">
```

Customize horizontal offset, vertical offset, blur radius, and color.

## 1012. How to embed Excel files?

Embed Excel files directly into articles.

Available in Professional, Business, and Enterprise plans.

Process:
1. Share Excel file (File > Share > Embed)
2. Copy embed code
3. Paste into Document360 editor

## 1013. How to change feedback button colors?

Customize feedback buttons:

1. **Settings** > **Knowledge base site** > **Customize Site** > **Custom CSS & JavaScript**
2. Target specific classes with CSS
3. Update color values
4. Save

Example:
```css
.feedback-button {
  background-color: #ff6b6b;
}
```

## 1014. How to change header menu hover color?

Customize header hover colors (Business/Enterprise plans):

1. **Settings** > **Knowledge base site** > **Customize site** > **Custom CSS & JavaScript**
2. Apply CSS rule targeting hover state:
```css
.header-link:hover {
  color: #yourdesiredcolor;
}
```

## 1015. How to move related articles above feedback?

Relocate related articles section:

1. **Settings** > **Knowledge base site** > **Customize site** > **Custom CSS & JavaScript**
2. Add JavaScript:
```javascript
window.onload = function () {
  $('.content_block_text').append('<div class="sperator"><hr></div>');
  $('.related-articles-container').appendTo('.content_block_text');
};
```
3. Save

## 1016. How to hide footer in mobile view?

Hide footers on mobile devices:

1. **Settings** > **Knowledge base site** > **Customize site** > **Custom CSS & JavaScript**
2. Select appropriate CSS snippet:
   - **KB site 1.0**: Target `.custom-footer` with `max-width: 469px`
   - **KB site 2.0**: Target `site-footer-section` with `max-width: 767px`
3. Paste in CSS tab
4. Save and test

## 1017. How to hide change password option?

Hide password change UI:

1. Locate HTML element using browser dev tools
2. Add CSS to hide element:
```css
.change-password-link {
  display: none;
}
```
3. **Alternative**: Use JavaScript for dynamic content:
```javascript
window.addEventListener('DOMContentLoaded', function () {
  document.querySelector('.change-password-link').remove();
});
```

Note: UI hiding doesn't prevent direct URL access.

## 1018. How to hide category manager?

Hide category manager globally:

1. **Settings** > **Knowledge base site** > **Customize site** > **Custom CSS & JavaScript**
2. Target appropriate selectors:
   - **KB site 1.0**: `.left_sidebar` and `.left-sidebar-toggle`
   - **KB site 2.0**: `site-docs-left-panel-container`
3. Add CSS to hide elements
4. Save

## 1019. How to hide left navigation bar?

Hide left sidebar:

1. **Settings** > **Knowledge base site** > **Customize site** > **Custom CSS & JavaScript**
2. Add CSS:
```css
site-docs-left-panel-container {
  display: none !important;
}
```
3. Save

Users can still display sidebar by clicking "Show category" icon.

## 1020. How to configure custom fonts?

Add custom fonts:

1. Obtain font embed link (e.g., Google Fonts)
2. **Settings** > **Knowledge base site** > **Integrations** > **Custom HTML**
3. Paste font link in Header section
4. **Settings** > **Knowledge base site** > **Customize site** > **Custom CSS & JavaScript**
5. Add CSS specifying `font-family`

## 1021. How to access billing overview?

Access billing information:

**Settings** > **Knowledge base portal** > **Billing**

Tabs:
- **My Plan**: Change requires support assistance
- **Payment Information**: Update card details
- **Invoice History**: View past invoices

Free plan discontinued. Check pricing page for current options.

## 1022. How to upgrade subscription plan?

Upgrade Document360 plan:

1. **Settings** > **Knowledge base portal** > **Billing**
2. Click **Change plan**
3. Compare features in **Compare plans and features** section
4. Select plan and click **Let's talk**
5. Sales team assists with upgrade

Only Owners or users with Billing permissions can upgrade.

## 1023. Document360 plan options

Available plans:
- **Professional**
- **Business**
- **Enterprise**
- **Enterprise +**: Dedicated servers
- **Startup program**: Six months free, then discounted rate

Plan differences include storage, translation credits, workspaces, sandbox availability, and team accounts.

Add-ons available: storage, languages, team accounts, readers.

## 1024. Plan feature comparison

Tiered plans with increasing capabilities:

**Business vs Professional**:
- More storage
- Enhanced team collaboration
- Advanced analytics
- Workflow Designer
- Ticket Deflector
- Additional AI features

**Enterprise vs Business**:
- Substantially more storage
- Larger teams
- Sandbox environment
- IP restrictions
- Premium AI support
- Health checks

## 1025. How to downgrade subscription plan?

Downgrade plan:

1. **Settings** > **Billing** > **Change plan**
2. Select target plan (Professional, Business, or Enterprise)
3. Compare features and limits
4. Sales team assists with process

Note: Some features may be lost.

Only Owners or users with Billing permissions can downgrade.

## 1026. Post-downgrade considerations

Downgrading impacts:

- Limits new content creation
- Removes access to some features
- Restricts add-on usage
- May lose data exceeding new plan limits

Preserved items:
- Existing articles
- Tags
- Feedback
- PDF exports (with reduced limits)

## 1027. Changing plans during trial

Switch plans during 14-day trial:

1. **Settings** > **Billing**
2. Choose **Try other plans**
3. Select desired plan
4. Confirm

Process is free. Downgrading may lose features.

## 1028. How to subscribe to Document360

Subscribe to service:

1. **Settings** > **Knowledge base portal** > **Billing**
2. Click **Buy now**
3. Select plan
4. Click **Let's talk**
5. Sales team assists with purchase

## 1029. Purchasing add-ons

Available add-ons:
- Workspaces
- Languages
- Translation credits (1M characters)
- Storage (50GB)
- Team accounts
- Readers (5000 per unit)
- PDF export limits

**Business plans**: Crowdin and Phrase extensions
**Enterprise plans**: Salesforce extensions, additional sandboxes

Purchase process:
1. **Settings** > **Billing** > **Add-ons**
2. Select required add-ons
3. Confirm payment

Saved card required. Legacy users contact support for offline purchases.

## 1030. How to change payment information

Update payment details:

1. **Settings** > **Billing** > **Payment information**
2. Edit payment method and billing address under Credit card tile
3. **Optional**: Add secondary card via **Add another card**
4. Set secondary card as primary if needed

Only team account owner can modify billing information.

## 1031. Managing notification channels

Configure custom notifications:

1. **Settings** > **Notifications** > **Event Mapping**
2. Enable alerts for events like:
   - Custom domains
   - CSS/JavaScript changes
   - Backups
   - Project members
   - Documentation updates
   - Landing page changes
   - Article modifications
   - Payment activities

Ensures timely notifications for maintenance.

## 1032. Viewing notification history

Access notification history:

**Settings** > **Notifications** > **History**

Shows all previously sent notifications across configured channels.

## 1033. Hiding categories

Hide categories from:

- Knowledge base navigation
- Search results

Applies to categories under development and their subcategories/articles.

## 1034. Custom footer configuration

Two footer options:

1. **Blank layout**: Complete HTML/CSS customization
2. **Predefined themes**: Themes A and B with built-in styles

## 1035. Category tree performance

Improved emoji library loading speed in category manager.

## 1036. Viewing support ticket status

Check ticket status:

1. Log in to support.document360.com
2. Search tickets using keywords
3. Filter by status:
   - All
   - Open/Pending
   - Resolved/Closed
   - Archive
4. Click ticket to view details
5. Status displays on right with history

## 1037. Support ticket access

Raise and track tickets at [Document360 support page](https://support.document360.com/support/login)

Response time:
- **Professional**: Standard
- **Business**: Within minutes
- **Enterprise**: Within minutes

## 1038. Raising support tickets

Submit ticket:

1. Log in to [support page](https://support.document360.com/support/login)
2. Click **Submit a ticket**
3. Fill fields:
   - Requester
   - Subject
   - Group
   - Description
4. Attach files if needed
5. Submit

Redirected to status page with Ticket ID.

## 1039. Exporting support tickets

Export tickets:

1. Log in to support system
2. Select **Tickets**
3. Configure export settings:
   - Date range
   - Format (.csv or .xls)
   - Fields to include
4. Download

## 1040. What is an HAR file?

HAR (HTTP Archive) file:

- JSON log of browser webpage interactions
- Captures requests, responses, timings, cookies, metadata
- Used for debugging and performance analysis
- Generated by web browsers and tools

## 1041. Generating HAR files

Troubleshoot Document360 issues:

1. Open browser Developer Tools (F12)
2. Go to Network tab
3. Enable recording
4. Reproduce problem
5. Stop recording
6. Save as HAR file

**Tips**:
- Clear browser cache before recording
- HAR files contain sensitive data - remove personal info before sharing

Process similar across Chrome, Firefox, Edge, Safari, Opera.
</document_content>
</document>

# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/docs/d363.py
# Language: python

import re

def refactor_markdown_headings((input_filename, output_filename)):


<document index="22">
<source>docs/d364.md</source>
<document_content>
## Document360 Overview

### Introduction

Document360 is a knowledge management platform for creating and managing public, private, or mixed-access knowledge bases. Key features include My Projects, Knowledge Base Portal, and Eddy AI for platform interaction.

### Key Components: Knowledge Base Portal

The Knowledge Base Portal lets you create, manage, and configure knowledge base sites. Core features:
- Create/manage categories, articles, templates
- Manage files, teams, readers
- Configure branding, domain, security

The portal includes:
- Dashboard (project overview, individual contributions)
- Documentation (tree-view structure, bulk actions)
- API documentation (interactive testing)
- Analytics (user engagement metrics)
- Widgets (in-app search)
- Drive (cloud storage)
- Settings (customization)
- Universal search across projects
- Site preview functionality

Unified search and interconnected functions simplify knowledge base maintenance.

### Documentation Guide: Table of Contents

Comprehensive documentation covering:
- Platform overview and project creation
- Editor tools (Markdown and WYSIWYG)
- Article management (publishing, SEO, access control)
- AI features (Eddy AI tools, machine translation, search analytics)
- Security measures (SSO, authentication, CSP)
- File management and collaboration tools
- Branding options and customizations

Release notes from 2019-2025 detail platform updates and feature enhancements.

### Project Management: My Projects

The project dashboard displays all projects you own, belong to teams, or have reader access upon login. Each project shows a visibility tag (public, private, or mixed).

### Additional Resources and Support

Document360 includes a public feedback portal, feature explorer for trial projects, and in-app support. The knowledge base supports categorized articles, templates, file management, team collaboration, and reader management.

Additional features:
- Analytics and AI assistance (Eddy AI)
- Article revision history
- Scheduled maintenance notifications

Support channels:
- In-app chat
- Email support
- Documentation and tutorials

### AI Integration: Document360 AI (Eddy AI)

Eddy AI is an AI-powered writing assistant offering:
- Article writing assistance
- SEO description generation
- Tag, title, and related article recommendations
- Assistive search functionality
- Article summarization

### Getting Started: Account Creation

Create an account by navigating to the signup page.

### Key Components: Knowledge Base Site

The knowledge base site is where end-users access articles. Three access settings:
- **Public**: Open to everyone
- **Private**: Login required
- **Mixed**: Combination of public and private access

Site preview available during setup.

### System and Browser Requirements

**Portal Requirements:**
- OS: Windows 7+, macOS Mavericks+, Linux, Android 5+, iOS 12+
- Minimum: 2-core CPU, 4GB RAM
- Browsers: Chrome 91+, Firefox 79+, Safari 13.1.2+, Edge 88+
- JavaScript, Cookies, Session/Local Storage, IndexedDB required
- HTTPS-TLS v1.2+ connection
- Internet Explorer not supported

Contact support@document360.com for technical issues.

### Troubleshooting and Support

Common login issues (reCAPTCHA, blocked access, loading) can be resolved by:
1. Switching browsers/networks, clearing browser cache
2. Checking VPN connection and system time
3. Providing HAR files/console errors to support@document360.com

Document360 is a web application. Incorrect system time may cause callback URL failures.

### Getting Started: Signing Up

Account creation process:
1. Navigate to signup page and provide basic details
2. Verify email with 6-digit code (5 failed attempts lock access)
3. Set password meeting security criteria
4. Choose primary use case and select up to two templates
5. Personalize knowledge base with URL and branding
6. Set privacy settings (Private, Public, Mixed)
7. Access portal with pre-loaded content

Free trial available with paid plans post-trial. FAQs cover language support, plans, verification, migration, and data access.

### Project Management: Navigating 'Your Projects'

The "Your projects" dashboard displays project tiles for owned, team, and reader projects. Users can:
- Create new/sandbox projects
- View project details (logo, name, access, settings)
- Access documentation/knowledge bases
- Manage profile and view release updates
- Access help resources

### Project Management: Project Dashboard

The "Your Projects" dashboard displays projects you're associated with, categorized by role (owner, team member, reader).

Access tiers:
| Professional | Business | Enterprise |
| --- | --- | --- |
| Basic project access | Enhanced team features | Unlimited project associations |

Dashboard provides streamlined interface for documentation project management.

### User Profile: Accessing Profile Options

Access profile options via your profile picture in the top-right corner:
- **My profile**: Edit personal info, image, name, email, author page, bio, portal language, role, content access
- **View Access/Permissions**: Check portal and content role permissions (admin privileges required for editing)
- **Change Password**: Enter current password, create strong new password (8+ chars, upper/lower/number/special character), confirm

Password change logs you out. Strong password recommendations provided.

### User Interface: Top-Right Menu

Quick access to essential portal features:
- Profile management
- Access level checks
- Password changes
- Release updates
- Help resources

### Updates and Releases

Access release notes via:
- Button in Knowledge Base portal
- Document360 Updates - Changelog page
- Summary notifications

### User Interface: Top-Right Menu Features

- **My profile**: View/edit personal info, profile picture, biography, roles, permissions
- **View access and permissions**: Check assigned roles and permissions
- **Change password**: Update login credentials securely
- **Release updates**: Stay informed about latest features
- **Help menu**: Access documentation, support, and contact options

### User Interface: Help Menu

Help tools include:
- Search functionality
- Documentation access (`https://docs.document360.com/docs`)
- In-app support chat
- Ticket creation
- Feature requests
- System status (`https://status.document360.com/`)

Authenticated users can access feedback portal. Portal uses user language settings over browser defaults. Contact support directly at <support@document360.com>.

### Project Management: Switching Projects

Switch projects via dropdown menu or dashboard. Project types:
- Public, private, or mixed access
- Sandbox projects for testing

Access control manages permissions. Article revisions provide version control. Contact administrator for access requests.

### Creating a New Knowledge Base Project

1. **Access Dashboard**: Log in to portal. Click Document360 icon to return to dashboard. Click **+ Project**
2. **Select Use Case**: Choose primary use case (Knowledge Base, Software Documentation, etc.)
3. **Choose Templates**: Select up to two templates based on use case
4. **Personalize**:
   - **URL**: Enter preferred website URL or use default
   - **Branding**: Customize logo, colors, language
5. **Set Privacy**: Choose access level (Private, Public, Mixed)
6. **Access Portal**: Setup complete with pre-loaded articles

### Project Management: Project Creation

Centralized documentation management including articles, categories, homepage, teams, readers, groups, and custom settings for organized, accessible knowledge bases.

### Project Management: Overview Tab

Project-level insights for Owners/Admins:
- Contribution metrics
- Performance data
- Storage details
- User statistics
- Issue tracking (broken links, search failures)

Metrics include:
- Article counts (created, published, draft)
- Team accounts and readers
- Drive capacity usage
- Broken links and failed searches
- Last backup date

Filter by workspace and language. "View all" links to relevant settings/analytics pages.

### Localization: Multilingual Knowledge Bases

Multilingual support improves user experience. Document360 supports internationalization of knowledge base sites.

### Project Dashboard

Dashboard insights include:
- Project metrics
- Team member information
- Task tracking

Two tabs:
- **My Contribution**: Personal work overview
- **Overview**: Team-related information

### User Contributions: My Contribution Tab

Track your work in Document360:
- **Article summary**: Created, published, draft counts with views, reads, likes, dislikes
- **Assigned to me**: Workflow status and due dates
- **Review reminders**: Stale articles needing updates
- **Feedback**: User feedback assigned to you
- **Broken links**: Articles with broken links by workspace and language

Filter by workspace, language, or date range.

### Project Management: Creating a Sandbox Project

Sandbox projects provide isolated testing environments for:
- Feature experimentation
- Workflow refinement
- Team training
- Risk-free development

### Frequently Asked Questions (FAQ)

- **Languages per Plan**: Professional (2), Business (3), Enterprise (5). Add-ons available
- **Knowledge Base**: Self-service platform with articles, managed through categories, branding, security

### Localization: Adding Multiple Languages

Navigate to **Settings > Knowledge base portal > Localization & workspaces**.

Two methods:
1. Edit workspace and select languages via "New language"
2. Use "Add new language" icon on overview page

Translate content manually or via Crowdin. Non-English languages display in native scripts. Manage default language, display name, and text direction.

### Security and Infrastructure: Overview

Data storage and security:
- MongoDB Atlas three-server cluster with encrypted storage and TLS traffic
- Daily/weekly/monthly backups for one month
- Azure Blob Storage backups across multiple locations
- Authenticated API tokens for data access
- Microsoft Azure Cloud hosting with DDoS mitigation
- Technical team with offshore coordination

### Security and Infrastructure

Data security through partnerships with:
- Algolia (search)
- MongoDB Atlas (database)
- Microsoft Azure Blob Storage (backup)

TLS encryption for data in transit. Security protocols align with SaaS best practices.

### Security and Infrastructure: Integrations and Partners

**Algolia (Search)**:
- SOC2/SOC3 compliant
- HTTPS/TLS encryption (Qualys A-rated)
- Customer data isolation

**MongoDB Atlas (Database)**:
- Network isolation via VPC/firewalls
- Independent security verification
- End-to-end encryption (TLS)
- Encryption at rest

**Azure Blob Storage**:
- Encryption in transit (HTTPS)
- Encryption at rest (storage and client-side)
- Advanced threat protection

### Creating a Sandbox Project

Steps:
1. **Settings**: Navigate to **Settings > Knowledge base portal > General**
2. **Create**: Click **Create Sandbox**
3. **Configure**:
   - Project Name (≤30 characters, letters/numbers/hyphens/spaces)
   - Language selection
   - KB Site 1.0 option (if needed)
4. **Visibility**: Default Private. Click **Next**
5. **Invite**: Add team members and assign roles (optional)
6. **Finalize**: Click **Create project** then **Open Sandbox**

Notes:
- Sandbox badge indicates environment
- SSO users cannot create sandboxes
- Subdomain defaults to "sandbox" (customizable via domain mapping)
- No direct migration support (manual export/import required)

### Best Practices

- Secure API keys (don't share publicly, delete compromised keys)
- Assign minimal necessary permissions to API keys
- Use predefined roles for team access
- Maintain automatic and manual backups
- Set appropriate document visibility

### Business Continuity and Disaster Recovery

High availability through:
- Geographically replicated databases
- Multiple service instances

DevOps practices:
- Code reviews
- QA testing
- Version control

Disaster recovery:
- Daily/weekly/monthly backups
- Incident management protocols
- Azure CDN for rapid service delivery

### Compliance: GDPR

Full GDPR compliance. Collects/stores only essential data with explicit consent. [Learn more](https://document360.com/gdpr-compliance/).

### Security: X-Frame Options

Controls embedding in frames/iframes on other domains. Prevents malicious sites from embedding knowledge base content. Blocks unauthorized iframe embedding.

### Support and Help

Expert support for security and infrastructure. API defined as software communication protocol. X-Frame-Options security feature explained.

### Security: Content Security Policy (CSP)

Restricts external CSS, scripts, and frames to prevent malicious content. The `Content-Security-Policy` header controls allowed domains by resource type. Implementation varies by plan tier.

### Security: Enabling CSP

Enable CSP to prevent XSS attacks:
1. Specify allowed domains for stylesheets, JavaScript, frames in portal security settings
2. Use correct URL format (`https://example.com`)
3. Separate entries with commas
4. Add nonce attributes to custom HTML scripts

### Security: Configuring X-Frame Options

Enable X-Frame options to prevent embedding on external domains:
1. Navigate to **Settings > Users & Security > Security**
2. Toggle **Enable X-Frame options** on

Protection against clickjacking attacks. Specific domains can be allowed via CSP. Unauthorized embedding exposes users to security threats.

### Security: Testing CSP Settings

CSP implemented via meta elements, not response headers. Verify by checking page source for `Content-Security-Policy`. Video playback issues often indicate inconsistent CSP settings across articles.

### Security: Understanding Bot Management

Bot filtering for online safety:
- Identifies and blocks malicious bots
- Allows legitimate bot access
- Prevents server strain and threats

Focus on blocking bad bots while enabling good bots.

### Security: CSP and Whitelisting for Widgets

Widget CSP guidelines (Enterprise plans only):

**Directives**:
- `connect-src`: Algolia, Document360 APIs, Azure Monitor
- `script-src-elem`: CDN resources with nonce
- `font-src`: Google Fonts, Document360 CDN
- `style-src-elem`: Inline styles, CDN resources, Google Fonts

**Sources**:
- US and EU-specific Document360 domains
- Widget JavaScript requires correct nonce and API key

### Security: Bot Detection Methods

Cloudflare uses heuristics and machine learning to analyze traffic and user-agent data, identifying and blocking malicious bots.

### Security: Bot Blocking Techniques

Cloudflare blocks bots through:
- Unusual user agents
- Unsupported ports
- Suspicious IP/ISP patterns

Essential security measures protecting platforms.

### Security: Bot Categorization

**Good Bots**: GoogleBot, BingBot, GPTBot (transparent, beneficial)
**Bad Bots**: DDoS attacks, web scraping, credential stuffing (malicious)

Built-in bot detection and blocking in Block mode protects data integrity.

### Fair Usage Policy: Overview

Rate limiting controls request volume, preventing bot traffic and DoS attacks while maintaining positive user experience.

### Fair Usage Policy: Rate Limiting

Cloudflare enforces:
- 1,500 requests per minute per IP
- 300 requests per 10 seconds per IP
- Bot detection via heuristics and machine learning

### Fair Usage Policy: Compliance

Policy adherence prevents:
- System overload
- Server strain
- Service abuse
- Unintended high-volume requests

Contact support for higher limits if needed.

### Fair Usage Policy: Purpose

Ensures equitable resource access, maintaining consistent performance for all users.

### Content Creation: Editor Options

Three editors available:
1. **Markdown**: Syntax/HTML customization
2. **WYSIWYG**: Rich text formatting (no custom code)
3. **Advanced WYSIWYG**: Hybrid of Markdown/WYSIWYG

Essential for article creation and management.

### Content Creation: Markdown Editor

Split-screen editor for typing and previewing. Consistent formatting for professional documentation. Supports image insertion with adjustable sizes.

### Content Creation: WYSIWYG Editor

HTML-based editor displaying formatting as you type. Extensive formatting options for code, media, and text. Recommended for content-heavy articles.

### Content Creation: Switching Editors

Article-level switching between editors:
- Advanced WYSIWYG ↔ WYSIWYG (Edit mode only)
- No switching to/from Markdown once Advanced WYSIWYG is selected
- Project administrators can modify default settings

Unsupported HTML elements flagged but preserved. Supported tags outlined for formatted content.

### Changing Default Editor

1. Navigate to **Settings > Knowledge base portal > General**
2. Select desired editor (WYSIWYG/Advanced WYSIWYG)
3. Click **Save**

Affects new articles only.

### Content Creation: Advanced WYSIWYG Editor

Lightweight editor combining Markdown syntax with visual editing. Ideal for text, code, and media content. Type '/' for commands. [Documentation reference](/help/docs/advanced-wysiwyg-editor-overview).

### Content Creation: Editor Interface

**Navigation**:
- Icon-based project identification
- Unified workspace/language dropdown
- "Create" button for new content
- Visual project type cues

**Features**:
- Easy project/workspace switching
- Content creation options (categories, articles, templates, imports)

### Content Creation: Using the Markdown Editor

Converts Markdown to HTML for text-rich documents. Supports professional, business, and enterprise use cases. Refer to "Basic Markdown syntax" documentation.

### User Interface: Left Navigation Bar

Sections:
- Dashboard, Documentation, API Documentation
- Analytics, Widgets, Drive, Settings

**Categories & Articles**:
- All articles, Workflow assignments
- Starred content, Recycle bin
- Site builder, Content tools

Site builder redirects to Customize site in Settings.

### Article Editor Header

Displays:
- Article URL/slug
- Status (New, Draft, Published, Stale)
- Contributor information and stats
- Preview functionality
- Title/slug/description editing
- AI Glossary recommendations
- Workflow status updates
- More actions menu (clone, move, hide, delete, SEO, tags, related articles)
- Comments section
- Full-screen view option

### Related Resources

Markdown converts shorthand text to HTML for lists, headers, images, videos, and links.

### Content Creation: Markdown Usage

Formatting options:
- Manual Markdown syntax or toolbar
- Correct syntax: no spaces in bold (`**Text**`), spaces in headings (`### Heading`)
- Reference: [Editor choices](/help/docs/using-the-text-editor) and [Markdown syntax guide](https://www.markdownguide.org/basic-syntax/)

### Content Creation: Markdown Toolbar Features

Toolbar sections:
- Headings (H2-H4)
- Text formatting (bold, italic, strikethrough, blockquote)
- Lists (unordered, ordered)
- Inserts (tables, images, files, links)
- Callouts (info, warning, error)
- Private notes, LaTeX, content reuse
- Code blocks, glossary, video embedding

Additional features:
- Spell checker with browser corrections
- HTML content integration

Keyboard shortcuts and real-time preview enhance editing.

### Content Creation: Markdown - Heading Levels

Use `##`, `###`, `####` (with space after `#`) for Heading 2, 3, 4. Ensure blank line before heading.

### Content Creation: Markdown - Styling Text

Text styles:
- Bold: `**text**`
- Italics: `*text*` or `_text_`
- Strikethrough: `~~text~~`
- Highlight: `==text==`
- Superscript: `text^superscript`
- Subscript: `text~subscript`

No spaces between syntax and text.

### Content Creation: Markdown - Basic Syntax

Lightweight markup language using special characters. No coding knowledge required. Supports headings, lists, links for professional content creation.

### Content Creation: Markdown - Commands

- **Headings**: `##` to `######` (H1 reserved for titles)
- **Bold**: `**text**` (Ctrl+B/Cmd+B)
- **Italics**: `*text*` or `_text_` (Ctrl+I/Cmd+I)
- **Strikethrough**: `~~text~~`
- **Numbered List**: `1.` for automatic numbering
- **Bulleted List**: `*` or `-`
- **Link**: `[text](URL)`
- **Blockquote**: `>`
- **Horizontal Line**: `***`

### Content Creation: Markdown - Horizontal Line

Create with three asterisks: `***`

### Content Creation: Markdown - Lists

**Numbered**: `1.`, `2.`, `3.` (auto-incrementing)
**Bulleted**: `*`, `-`, or `+` (e.g., `* Item`, `- Item`)

### Content Creation: Markdown - Links and Blockquotes

- **Links**: `[text](URL)` (e.g., [Document360](https://docs.document360.com))
- **Blockquotes**: `>` prefix (e.g., > This quotes the line)

### Content Creation: Markdown - Emoji Usage

Copy/paste emojis or use FontAwesome HTML codes.

### Content Creation: Markdown - Additional Elements

- **Image**: `![Alt text](URL "Title")`
- **Reference Link**: `[Link text][ref]` with `[ref]: URL`
- **Escaping**: Use `\` before special characters
- **Videos**: Embed with `<iframe>` tags

### Content Creation: Markdown - Unicode Characters

Use via copy/paste or HTML entity codes (`&#xXXXX;`). Reference online resources like unicode-table.com.

### Content Creation: Markdown - Beginner Tips

- Structure with headings (`##`, `###`)
- Highlight with **bold** or _italics_
- Organize with lists (`*` or `1.`)
- Include **links** for additional resources

### Content Creation: Using the WYSIWYG Editor

What You See Is What You Get editor displaying exact published appearance. Switching from Markdown is permanent.

### Content Creation: WYSIWYG Toolbar

Text editing and formatting options including media insertion. Organized sections starting with heading options.

### Content Creation: Example - Creating an Article

Demonstrates Markdown article structuring with headings, links, dividers. References advanced syntax resources. Emphasizes clean formatting for readability.

### Content Creation: WYSIWYG - Heading 2

Rich text editor features:
- Text formatting and media insertion
- LaTeX and callouts
- Content reuse and glossary integration
- Advanced formatting for images, videos, PDFs, Word files, tables
- Switch to advanced editor, code view, undo/redo, find/replace
- Various lists, alignments, visual elements

### Content Creation: Advanced WYSIWYG - Usage

Slash commands for quick insertion. Standard Markdown syntax for complex formatting. Eddy AI access via slash menu. Direct typing required for Markdown syntax.

### Content Creation: Advanced WYSIWYG Editor Overview

Lightweight rich-text editor with Markdown support. More visual than traditional Markdown, more flexible than standard WYSIWYG. Advanced ↔ WYSIWYG switching allowed only for Draft/New articles.

### Content Creation: Advanced WYSIWYG - Toolbar

Categorized toolbar for:
- Formatting (text styles, headings, typography, colors, lists)
- Inserting elements (images, videos, links, files, tables, code, FAQs)
- Inline comments, Word pasting, LaTeX support

### Content Creation: Choosing the WYSIWYG Editor

**Best for**: HTML editor familiar users preferring Word-like experience
**Ease**: Functions like Word or Google Docs, direct content pasting
**Advantages**: Single editing pane, handles large tables well

### Content Creation: Advanced WYSIWYG - Typography

Input syntax conversion table for typographic symbols (em dash, ellipsis, quotes, arrows, copyrights, fractions, math symbols, currency).

### Content Creation: Advanced WYSIWYG - Keyboard Shortcuts

Access via article's **More** icon → **Keyboard shortcuts**. Key shortcuts:
- **General**: Copy (Ctrl+C), Paste (Ctrl+V), Undo (Ctrl+Z), Redo (Ctrl+Shift+Z)
- **Text**: Bold (Ctrl+B), Italic (Ctrl+I), Underline (Ctrl+U)
- **Paragraph**: Headings (Ctrl+Alt+1-6), Lists (Ctrl+Shift+7-9), Alignment (Ctrl+Shift+L/E/R)
- **Selection**: Complete article (Ctrl+A)

### Content Creation: Advanced WYSIWYG - Unsupported Syntax

No support for:
- Markdown tables
- Subscript/superscript syntax
- Manual application required via Format tools

### Content Creation: Advanced WYSIWYG - Conditional Blocks

Personalized content delivery based on user characteristics (IP, country, device, reader groups, dates). Available for KB site 2.0 only. Not indexed by search engines.

### Content Creation: Advanced WYSIWYG - Movable Blocks

Drag blocks, insert new ones, delete with content shifting. Dividers and FAQ sections are fixed. FAQ treated as single block.

### Content Creation: Advanced WYSIWYG - Creating Tables

Two methods:
1. `/table` command (3x3 with header row)
2. Format menu Insert option (up to 10x10)

### Content Creation: Advanced WYSIWYG - Setting Up Conditional Blocks

1. Navigate to article in Advanced WYSIWYG editor
2. Enable via settings icon (Show/Hide)
3. Use **AND** for all conditions, **OR** for any condition
4. Select parameters (country, date, device, workspace, reader groups, IP)
5. Set conditions (equals, not equals, in, not in) and values
6. Save conditions for reuse (max 25 per article)

### Content Creation: Advanced WYSIWYG - Table Overview

Supported across all plans. Essential for data organization and presentation.

### Content Creation: Advanced WYSIWYG - Customizing Tables

Appearance options:
- Background/border color
- Border style (solid, dashed, dotted)
- Header row visibility
- Alternating row colors (banded rows)
- CSS for advanced styles

Actions:
- Copy/delete tables
- Slash commands
- Paste from Word/Excel web app (not Excel desktop)

### Content Creation: Advanced WYSIWYG - Formatting Table Content

- **Insert/delete rows/columns**: Menu options for positioning
- **Merge cells**: Select multiple, click "Merge cells"
- **Alignment**: Vertical (top/middle/bottom), Horizontal (left/center/right/justify)
- **Fit to page**: Adjust table width and content distribution

### Content Creation: Advanced WYSIWYG - Image Formatting

Formatting:
- Alignment (left, center, right, inline)
- Captions and alt text
- Hyperlinking with new tab option
- Styling (rounded, bordered, shadow)

Editing:
- Resizing, cropping, flipping, rotating
- Drawing tools (lines, shapes)
- Text and icon addition
- Filters (grayscale, blur)

Actions:
- Replace, copy, delete
- Undo/redo/reset

Access via image click and floating menu.

### Content Creation: Advanced WYSIWYG - Editing Tabs

Edit tabs via "Edit" icon:
- **Duplicate**: Click "Duplicate tab"
- **Rename**: "Change tab name" (max 50 chars)
- **Delete**: "Delete tab" (Ctrl+Z to undo)
- Cannot delete if only two tabs remain

### Content Creation: Advanced WYSIWYG - Customizing Tabs

Appearance:
- Background/border color (preset, HEX, RGB)
- Drag/drop reordering
- Visual positioning indicators

### Content Creation: Advanced WYSIWYG - Tabs Overview

Organizes content into sections within articles. Typically supported in Business and Enterprise plans.

### Content Creation: Advanced WYSIWYG - Tabs on Site

Consistent across devices, no page refresh required. Mobile-compatible. PDF export shows tab contents sequentially with headings.

Limitations:
- No nested tabs
- Tab headings excluded from TOC
- Disabled page breaks within tabs
- Cannot embed tabs in other components

### Content Creation: Advanced WYSIWYG - Creating Tabs

1. Use Insert option (adds default two-tab structure)
2. Click + button to add more tabs (max 10)
3. Enter titles
4. Each tab supports text, images, tables, links, callouts, code

### Content Organization: Categories and Subcategories

Organizational tools grouping articles into logical structures. Categories for broad topics, subcategories for specific divisions. Supports renaming, icon changes, multi-category assignment.

Best practices:
- Clear naming conventions
- Logical hierarchy (max 3 levels)
- User-centric organization

Alternative finding tools: tags, search, related articles.

### Content Organization: Creating a Category

Four creation methods:
1. Top-bar "Create"
2. "Flywheel" icon
3. "More" icon
4. Within Folder/Index

Process:
1. Fill name, nesting level, type (Folder, Index, Page, GitHub)
2. Click "Create"

Maximum 3 subcategory levels recommended.

### Content Organization: Changing Category Icons

1. Navigate to Documentation section
2. Select desired folder/index category
3. Search/browse emojis
4. Choose and confirm

Not available for "Page" type categories.

### Content Organization: Managing Categories

Supported across all plans. Key features:
- Create, rename, delete, move, clone, reorder
- Star categories
- Customize icons

Benefits: Well-organized, accessible knowledge base.

### Content Organization: Hiding and Unhiding Categories

Restrict team access to categories/subcategories. Hidden items marked visually. Four methods via navigation menus and "More" options. Hiding a category hides all content beneath it.

### Content Organization: Renaming a Category

Two methods:
1. Direct edit on category page
2. "More" menu option

Does not change URL slug.

### Content Organization: Deleting a Category

Four deletion methods:
1. **Categories & Articles**: Hover, click **More** > **Delete**
2. **Folder/Index**: Click **More** > **Delete**
3. **Multiple items**: Select checkboxes, click **Delete**
4. **Specific item**: Hover, click **More** > **Delete**

Root category deletion removes all subcategories and articles. Stored in recycle bin for 30 days.

### Content Organization: Cloning a Category

Clone via "More" > "Clone":
1. Select target workspace/category
2. Optionally update linked files
3. Security restrictions apply by destination

Three access methods: main list, folder/index, specific article.

### Content Organization: Understanding Category Types

Organizational tools grouping similar articles. Folder-like structure for related content.

### Content Organization: Starring a Category

1. Go to Documentation section
2. Select category
3. Click Star icon

Star subcategories and articles. Unstar via icon click or Starred section removal. Acts as favorites list.

### Content Organization: Moving a Category

Five methods:
1. **Drag and Drop**: Within same workspace
2. **More Icon**: Categories & Articles section
3. **More Icon**: Folder/Index context
4. **Bulk Move**: Select multiple items
5. **Specific Move**: More icon on individual item

Considerations:
- Affects all subcategories/articles
- Cannot move root into subcategories
- Link updating recommended across workspaces

### Content Organization: Drive Folder Mapping

Automatically places contributor images into Drive folders based on article category/subcategory.

### Content Organization: Types of Categories

Three types:
- **Folder**: Container for articles/subcategories (no URL)
- **Index**: Generates URL, lists articles with details
- **Page**: Functions as article with content creation

Switch anytime without data loss.

### Content Organization: Linking Drive Folders

1. Navigate to category
2. Click "More" (•••) > "Set drive folder"
3. Select folder > "Update"

Subcategory mappings override parent mappings. Only affects new images.

### Content Organization: Category-Drive Mapping

Map categories to Drive folders via metadata/labels. Use Drive API or scripts (Business/Enterprise). Enhanced automation in Enterprise versions.

### Content Export: Downloading Categories and Articles

Export categories/articles to PDF with customizable templates. Private projects/workspaces only.

Enable via **Settings > Knowledge base site > Article settings**. 500 MB daily limit with add-on capacity. Customization doesn't affect PDFs. Visibility settings may restrict export.

### Content Creation: Creating an Article

Four creation methods:
1. Top-bar "Create" button
2. "Flywheel" icon
3. "More" icon
4. "Create" button within folders/indexes

Process:
1. Navigate to Documentation section
2. Name article
3. Select category

Plan limits: Professional/Business (5,000), Enterprise (10,000).

### Content Management: Managing Articles

| Feature | Professional | Business | Enterprise |
|---|---|---|---|
| Create/Edit/Publish | ✅ | ✅ | ✅ |
| Basic Organization | ✅ | ✅ | ✅ |
| Version Control | ❌ | ✅ | ✅ |
| Multi-user Collaboration | ❌ | ✅ | ✅ |
| Advanced Access Controls | ❌ | ❌ | ✅ |
| Custom Workflows | ❌ | ❌ | ✅ |

Tiered features: basic handling (Professional), version control/collaboration (Business), advanced controls/workflows (Enterprise).

### Content Management: Locking Articles

Prevents simultaneous edits. Auto-unlocks after 15 minutes inactivity. Manual unlock via portal "Lock" icon. Navigation away auto-unlocks.

### Content Management: Creating Article Templates

Save and reuse templates for consistent content creation. Particularly useful for repetitive structures.

Three creation methods:
1. Flywheel icon
2. More option
3. Top-bar Create button

Each involves template selection, article naming, and category assignment. Automatic slug population. Access template management from overview.

### Content Management: Deleting Articles

Five methods:
1. Single article via "More" in Categories & Articles
2. Editing mode deletion
3. Bulk deletion in Folder/Index
4. Single article in Folder/Index
5. Bulk deletion in All Articles section

Process: navigate, select, confirm deletion.

### Content Management: Renaming Articles

1. Navigate to article in Documentation
2. Click name or hover > More > Rename
3. Enter new name > Update
4. Confirm if published

### Content Management: Moving Articles

Five methods:
1. Drag-and-drop categories
2. More menu
3. Folder/Index context (2 variations)
4. All Articles section

Select destination workspace/category. Choose link update option. Security restrictions apply.

### Content Management: Editing Articles

Process:
1. Select article > Edit (status changes to Draft)
2. Make changes
3. Click Publish to update live version

Markdown articles: View formatting via More > View markdown without version creation.

### Content Management: Replicating Articles

Replicate to multiple categories:
1. Navigate to article
2. Select "Replicate"
3. Choose target category
4. Click

Source article edits only. Replicated settings may have restrictions.

### Content Management: Hiding and Unhiding Articles

Hide articles for team-only access. Strikethrough indicates hidden status.

Four methods:
1. Categories & Articles section
2. Folder/Index category (bulk)
3. Specific article in Folder/Index
4. All Articles section

Effective for internal content like pricing details.

### Content Import: Importing Word Files

Import .docx files (under 15MB) directly. Two options:
- Single article: imports entire document
- Multiple articles: creates article per heading (H1, optionally H2+)

Preserves media and hyperlinks.

### Content Management: Cloning Articles

Two methods:

**Method 1**: Categories & Articles
1. Navigate to Documentation
2. Hover article > More > Clone
3. Fill details > Confirm

**Method 2**: Folder/Index context
1. Navigate to folder/category
2. Hover article > More > Clone
3. Fill details > Confirm

Considerations:
- Cross-workspace cloning supported
- Security restrictions by destination
- Auto-update links adjusts references

### Content Import: Troubleshooting Word Imports

Errors:
- `maxArticlesCountReached`
- `articleLimitExceedsPerCategory`

Indicates plan limits exceeded:
- 100 articles per category
- 5,000 per workspace (Pro/Business)
- 10,000 per workspace (Enterprise)

Solutions:
1. Check all categories affected
2. Verify plan limits
3. Reduce articles or upgrade plan
4. Contact support if unresolved

### Content Publishing: Publishing from the Editor

Process:
1. Click Publish
2. Add comment (optional)
3. Configure settings (tags, SEO, related articles, status)
4. Click "Yes"

AI assistance enhances discoverability. New/updated status indicators auto-set.

### Content Publishing: Bulk Publishing

1. Select articles
2. Click "Publish"
3. Ensure unpublished articles selected

AI features require minimum lengths:
- Tags: 50 words
- Descriptions: 200 words

Hidden/restricted articles won't appear in search. Verify publication status, restrictions, and workspace settings.

### Content Publishing: Publishing Process

Making drafted articles live. Key plan features:
- **Professional**: Basic customization and SEO
- **Business**: Audience targeting and analytics
- **Enterprise**: Custom domains and multi-language support

### Content Import: Choosing Editors for .docx Import

Editor selection via **Settings > Knowledge base portal > General > Editor**:
- Markdown (no .docx support)
- WYSIWYG
- Advanced WYSIWYG

Best practices:
- Split large documents into multiple articles
- Keep files under 15MB

Troubleshooting:
- TOC header conflicts
- Firewall blocks
- Password-protected files
- Style mismatches

Maximum articles error resolved by adjusting heading tags.

### Collaboration: Adding Inline Comments

1. Select text > comment icon
2. Type comment > Send
3. Mention collaborators via @ symbol

Enable comment notifications in settings. Published articles auto-delete unresolved comments.

### Content Enhancement: Adding Images

Improves comprehension and engagement. Available in Markdown and WYSIWYG editors.

### Collaboration: Article Review with Comments

Inline comments exclusively in Advanced WYSIWYG editor. Streamlines reviews and maintains documentation quality.

### Content Enhancement: Inserting Images - Markdown

Four methods:
1. Upload from local
2. URL insertion
3. File Picker
4. Drag & Drop

Specify dimensions {height="x" width="y"}. Upload to Drive recommended for permanence. Drag-and-drop auto-saves to Drive.

### Content Enhancement: Inserting Images - Advanced WYSIWYG

Three methods:
1. `/image` command
2. Insert menu (device, Drive, URL)
3. Copy/paste/drag-and-drop

Images saved to Drive. Local changes don't affect inserted images.

### Collaboration: Managing Comments

- **View**: Click highlighted areas or comment icon
- **Resolve**: Creator only
- **Edit/Delete**: Comment author only
- **Reply**: Team accounts
- **Filter**: All, Mentioned me, Open, Resolved

Limits: 20 replies per comment, 500 comments per article, 500 character limit per comment.

### Content Enhancement: Adding Videos

Insert via toolbar options. Enhances understanding of complex concepts and increases engagement.

### Content Enhancement: Inserting Videos - Advanced WYSIWYG

Three methods:
1. Embed URL (self-hosted or platform)
2. Embed code
3. Upload from Drive

Use `/video` command. Broken link detection via analytics. No caption searching.

### Content Enhancement: Troubleshooting Broken Images

Broken image causes:
- Incorrect URL
- Missing image

Solutions:
1. Retrieve URL from code view or element inspection
2. Check URL in browser (404 = missing image)
3. Verify image exists at correct path
4. Upload to Drive for permanence

FAQs cover alignment, insertion methods, customization, alt text, HTML icons, storage location.

### Content Enhancement: Inserting Videos - Markdown

Two methods:
1. **URL Insertion**: YouTube, Wistia, Vimeo links with alt text
2. **Drive File**: Upload video file, adjust dimensions

WYSIWYG editor supports similar additions.

### Content Enhancement: Adding Files

Upload to Drive then insert:
- Markdown: Insert file button
- Advanced WYSIWYG: `/Insert file`, drag-and-drop, or file selector

Filtering available in Drive. Download option post-insertion.

### Content Enhancement: Adding Hyperlinks

Connect text, images, or files to:
- Related content
- External resources
- Internal sections

Replicated articles cannot be internally linked.

### Content Enhancement: Adding Files to Articles

Two methods:
- Adding files (embedded)
- Attaching files (sidebar display)

Enhances content clarity and expansion.

### Content Enhancement: Managing Hyperlinks

**WYSIWYG**: Click hyperlinked text for Edit/Unlink/Open/Copy options
**Markdown**: Manual editing required

### Content Enhancement: Adding Hyperlinks - Process

1. Select text
2. Open Link panel
3. Specify link type (internal article, internal heading, external URL)
4. Optionally open in new tab

Process similar across editors with core consistency.

### Content Enhancement: Attaching Files to Articles

1. Click More icon > Attachments
2. Choose URL or upload method
3. Arrange files if needed > Save
4. Ensure Show article files enabled in settings

Files appear in sidebar above tags and TOC.

### Content Enhancement: Creating Bookmark Links

Link to H2, H3, H4 headings via Advanced WYSIWYG:
1. Select text
2. Choose heading from dropdown
3. Optionally open in new tab

H3/H4 support depends on settings.

### Localization: Machine Translation and Hyperlinks

Machine translation auto-updates internal links to translated versions. Consistent slugs across languages prevent broken links. Relative paths preferred for internal links.

FAQ covers pre-publishing links, heading linking, and hyperlink troubleshooting.

### Content Enhancement: Adding Email Links

**Markdown**: `[link_text](mailto:email_id)` (e.g., `[Email support](mailto:test@gmail.com)`)
**Advanced WYSIWYG**: Select text, Ctrl+K or `/link`, type `(mailto:email_id)`

### Content Formatting: Code Blocks

Prism.js syntax highlighting for:
- HTML, C#, Java, JavaScript, XML, JSON
- CSS, SQL, Python, Markdown, PHP, PowerShell
- Text (plain)

Refer to Prism.js documentation for complete list.

### Content Management: Heading Changes and Hyperlinks

Heading changes break hyperlinks. Solution: WYSIWYG editor HTML modification with anchor tags separating hyperlink name from visible text.

### Content Formatting: Code Blocks - Markdown

Create via:
- Triple backticks (```) before/after code
- Ctrl+Shift+P shortcut
- Insert code block icon

### Content Formatting: Code Blocks - Advanced WYSIWYG

Three methods:
1. Insert > Code Block
2. Triple backticks + Enter
3. `/code block` + Enter

Floating menu options:
- Language selection (predefined or custom)
- Copy/delete blocks

Custom languages via title input after backticks. Indentation (4+ spaces) creates blocks without highlighting. Syntax highlighting supported for numerous languages. Ctrl+Shift+V preserves formatting.

### Collaboration: Using Private Notes

Private notes for reminders, updates, team context. Excluded from KB PDF exports but included in browser-generated PDFs. Use browser print/save consistently.

### Collaboration: Adding Private Notes

Available in Markdown and Advanced WYSIWYG editors across all plans. Visible to reader groups or team members only.

### Content Formatting: Code Blocks - WYSIWYG

Process:
1. Navigate to article in WYSIWYG editor
2. Click Code block icon
3. Select language from dropdown
4. Enter code in field
5. Click Insert

Manage via Edit/Delete icons on blocks.

### Collaboration: Private Notes - WYSIWYG

Add/manage via:
1. Navigate to article
2. Click private note icon
3. Use floating menu (visibility, copy, delete)

### Content Enhancement: Embedding Stream Videos

Embed Microsoft SharePoint Stream videos via Markdown or WYSIWYG editors.

### Collaboration: Private Notes - Markdown

Syntax: `:::(Internal) (Private notes)\nOnly visible to team accounts\n:::`

Visible to team accounts only. Edit by modifying content, delete by removing syntax.

### Content Enhancement: Embedding SharePoint Videos

1. Navigate to video > Share > Embed code
2. Customize with start time, size, autoplay, responsive options
3. Manage access permissions for viewers

### Collaboration: Private Notes - Advanced WYSIWYG

Create via:
- `/Private note`
- Insert menu

Manage visibility (all team, security groups, reader groups). Actions:
- Copy, edit, delete (except in published articles)

Ideal for internal comments. Access via floating menu.

### Content Enhancement: Embedding Google Forms

Use embed HTML code blocks. Navigate to form, copy embed code (iframe src), paste into editor.

### Content Enhancement: Embedding Draw.io Diagrams

Use HTML embed link from Diagrams.net. Set diagram privacy to public in storage location (e.g., Google Drive).

### Content Management: All Articles Overview

Bulk actions for multiple articles/pages:
- Publish, preview, copy links
- Hide, move, delete
- Set reminders, check status
- Tag, translate, PDF download
- Deprecate

Streamlines large-scale operations like product launches.

### Content Management: Bulk Actions with All Articles

Efficient handling via:
- Filtering by status, date, tags
- Bulk operations (publish, schedule, preview, copy links, hide, move, delete, review, live status, tag, translate, export)

Considerations:
- Article status (draft, published)
- Category restrictions with subcategories/child articles

### Content Management: Accessing All Articles Filters

Filter by:
- Status, review reminders, stars
- Visibility, read receipts
- Contributors, categories
- Dates, tags, labels

Save/share custom filters. Process described with screenshots.

### Content Management: Exporting All Articles

Export via interface:
1. Navigate to All articles
2. Apply filters (status, category, etc.)
3. Click Export

CSV contains:
- Article title, category, status, date
- URLs

Draft articles require category export. API endpoint available for programmatic access.

### Content Management: Review Reminders

Alerts for article reviews ensuring accuracy. Facilitates review process for teams and customers.

### Content Management: Exporting Article Lists

Export article lists/statuses as CSV across all plans. Filter by contributor, date, or other fields.

### Content Management: Review Reminder FAQs

Set via **Documentation > Content tools > Article review reminders**

### Content Optimization: Article SEO

SEO titles/descriptions improve visibility and search indexing.

### Content Management: Setting Review Reminders

Create reminders for immediate or future dates:
- Now, 30 days, 3 months, Custom
- Add reason (100 characters max)
- Apply individually or to multiple articles

Red "Needs review" tag appears with reason on hover. Clear via tag click and "Mark as reviewed."

### Content Management: Bulk Review Status Updates

Two methods:

**All Articles Method**:
1. Navigate to Documentation > All articles
2. Filter by "Stale" under Review reminder
3. Select articles > Mark as Reviewed or set reminder days

**Content Tools Method**:
1. Documentation > Content tools > Article review reminders
2. Create new reminder, specify details
3. Select workspace, language, articles
4. Use filters for efficient selection

### Content Optimization: Excluding Articles from Search

Exclude articles/categories from search results maintaining confidentiality. No plan-specific details provided.

### Content Optimization: Adding SEO Metadata

Process:
1. Navigate to article
2. Click More > SEO
3. Enter meta title (5-60 characters) and description (150-160 characters)
4. Use AI generator for articles with 200+ words
5. Update titles for name changes
6. Manually update descriptions per language version

### Content Optimization: Excluding from External Search

1. Navigate to article
2. Click More (•••) > SEO settings
3. Check "Exclude from external search engine results"
4. Save changes

### Content Optimization: Excluding from Internal Search

1. Navigate to article/category
2. Click More > Article settings
3. Under Search Visibility, select:
   - Exclude from knowledge base search
   - Exclude from Eddy AI assistive search
4. Save changes

Plan-dependent availability. Excluded articles remain accessible via URL/menu. Cloned articles retain parent visibility settings.

### Content Management: Changing Article Slugs

Two methods:
1. Portal settings (SEO tab)
2. Article editor

**Essential**: Create redirect rule for new slug to prevent broken links. Special characters require proper encoding. Copy URLs from portal.

### Content Management: Changing Article URLs

System automatically generates URLs based on article titles and categories. Custom URLs require slug modification with proper redirect configuration.### Content Organization: Article Tags

Tags are keywords for searching, filtering, and sorting knowledge base articles. Team accounts use tags for bulk actions. Tags apply to articles, categories, and drive files; drive file tags are only visible in the knowledge base. Manage all project tags via the "Tags" page.

### Content Organization: Adding Tags

To add tags:
1. Navigate to portal > More > Tags
2. Create or choose tags
3. Optionally generate AI-suggested tags (requires 200+ words)
4. Save and publish

Configure article settings so readers can click tags to find related materials. Tag limits: 30 characters including spaces, with permissible symbols.

### Content Navigation: Related Articles

Related articles appear at the bottom of knowledge base articles. Links point only to published articles within the knowledge base and don't appear in widgets.

### Content Navigation: Adding Related Articles

Add related articles via:
1. Knowledge Base portal
2. Publish checklist

Methods:
- Manual selection: search and add articles
- Eddy AI suggestions: requires 50+ word article
- Auto relate: creates mutual relationships

Access restrictions determine which related articles are shown.

### Content Organization: Article Labels

Labels streamline internal content management across Professional, Business, and Enterprise plans, enabling efficient sorting and filtering (e.g., quickly locating release notes).

### Content Organization: Adding Labels

Five methods to add labels:

1. **Article Editor**: Navigate to article > More > Labels > Add
2. **All Articles**: Select articles > More > Add labels > Apply filters
3. **Workflow Assignments**: Select articles > Add labels > Apply filters
4. **Starred Section**: Select articles > Add labels, or hover > More > Add labels
5. **Folder/Category**: Navigate to category > Select articles > More or bulk selection

**Limits**:
- 10 labels per article
- 10,000 labels per project
- Internal only (not visible on site)
- Cannot be used for searches, but can filter articles

**Key Difference**: Tags are visible and aid search/navigation; labels are internal organization tools.

### Content Enhancement: Adding Featured Images

To add a featured image:
1. Click More article options > Featured image > Upload
2. Use high-quality JPEG or PNG (1200x800 - 2000x1200 pixels)

Featured images enhance SEO and improve link previews. They don't appear on the article itself. Available in Business and Enterprise plans.

### Content Enhancement: Adding Attachments

To add attachments:
1. Navigate to article > More article options > Attachments
2. Add URL or upload from Drive
3. Select and insert
4. Arrange or remove as needed

Attachments appear near Table of Contents and Tags on the knowledge base site.

### Content Enhancement: Attachment Support by Plan

| Plan | Limit |
|---|---|
| Professional | 5MB |
| Business | 10MB |
| Enterprise | 20MB |

### Content Status: Status Indicators

Knowledge base displays status indicators ("New", "Updated", "Custom") near article titles. No specific implementation details provided.

### Content Status: Manual Status Updates

To change article status:
1. Navigate to article > More article options > Article settings
2. Change status
3. Customize text via localization variables
4. Set color in Article settings
5. Specify display duration

### Content Status: Understanding Article Status

Article status feature helps identify content states (Draft, Needs review) to streamline management. Readers see update/new indicators. Improves efficiency and clarity.

### Content Status: Article Statuses

Four article statuses:
1. **New**: Draft, team-only access
2. **Draft**: Published article with draft updates, original remains live
3. **Published**: Publicly accessible
4. **Needs review**: Flagged for contributor or automated review

Applies to category pages too.

### Content Status: Automatic Status Updates

Enable automatic status updates:
1. Settings > Knowledge base site > Article settings & SEO
2. Turn on "Automatically set article status" in Category manager
3. Set display duration

### Content Status: Hidden Article Status

Hidden articles show strikethrough and are inaccessible on the site. Can be hidden in any status. Hidden categories also hide articles. Category pages display article statuses for maintenance.

### Content Structure: Managing Table of Contents

Control TOC visibility:
- Site-wide: Settings > Knowledge base site
- Per article: Article settings

Only headings (H2, H3, H4) appear in TOC.

### Content Status: Deprecated Articles

Deprecated articles are outdated content marked as obsolete. May be replaced due to subject removal, changes, or new concepts. Deprecation tagging occurs at article/category level.

### Content Status: Marking Articles as Deprecated

To mark article as deprecated:
1. Navigate to Knowledge base portal
2. Access Article settings via More icon
3. Enable Deprecated toggle
4. Optionally add formatted reason
5. Save changes

### Content Status: Bulk Deprecation

To deprecate multiple articles:
1. Select articles
2. Click "Deprecate"
3. Add reason
4. Click "Apply"

Visual tag indicates deprecation on site view.

### Content Preferences: Plan-Based Options

No preferences defined for Professional, Business, or Enterprise plans.

### Content Customization: Article Preferences

To update preferences:
1. Navigate to article
2. Click More icon (•••)
3. Select Preferences in Article settings
4. Adjust checkboxes for comments, TOC, feedback
5. Save

Article-specific process. Disqus requires additional setup.

### Content Publishing: Scheduled Publishing

Schedule publication for specific dates/times to improve content planning and consistency.

### Content Publishing: Setting Up Scheduled Publishing

To schedule publication:
1. Navigate to article/category
2. Select "Publish later"
3. Choose date, time, timezone
4. Optionally add comments
5. Click "Schedule"

### Content Management: Updating Contributors

Document360 automatically tracks contributors based on actions. Readers can view contributors' other articles. Enterprise plan allows manual contributor management.

### Content Management: Managing Contributors

To manage contributors:
1. Access via Article information icon
2. Use Manage popup to add (search) or remove (icons)
3. Assign contributor if none listed
4. Contributors persist until team account deletion

### Content Publishing: Editing Scheduled Publications

To edit scheduled publication:
1. Navigate to article
2. Click Scheduled dropdown
3. Select Edit schedule
4. Modify date/time/timezone
5. Add comments if needed
6. Click Schedule

Optionally publish immediately via "Publish now".

### Content Publishing: Bulk Scheduled Publishing

To schedule multiple articles:
1. Select articles
2. Choose date/time/timezone
3. Click Schedule

Scheduled articles show "Publish later" icon. Cannot edit scheduled articles or publish via API. Moving scheduled articles clears schedule.

### Content Publishing: Cancelling Scheduled Publishing

To cancel schedule:
1. Navigate to article
2. Click Scheduled dropdown
3. Select Cancel
4. Confirm with Yes

### Collaboration: Discussion Feed

Discussion feed enables collaboration and peer reviews across plans. Functionality details vary by tier.

### Content Management: Article Revisioning

Article edits create new unpublished versions. Old versions preserved in history until published. Team accounts can compare/revert but must manually delete. Supports collaboration and audit.

### Content Management: Creating Article Versions

Two methods:
1. **Direct edit**: Edit published article
2. **Fork**: Create version from older revision

Both require publishing the draft.

### Content Management: Comparing Article Versions

Compare versions to highlight additions, removals, and formatting changes. Swap comparison views and revert versions. Published dates are automatically generated and cannot be changed.

### Content Management: Article Revision Actions

- **Fork**: Create editable version
- **Delete**: Remove unpublished version
- **Open**: Access previous versions
- **Workflow history**: Track stages, assignees, comments, dates
- **Publish**: Make version public

Version details include number, contributor, date, visibility.

### Content Management: Read Receipts

Read receipts confirm article acknowledgment for important updates. Available only in KB site 2.0 for private and mixed projects.

### Content Management: Managing Read Receipts

Manage via:
- Bulk actions on all articles
- Individual article settings
- Category rules in settings

Settings rules have priority. Republishing forces re-acknowledgment.

### Content Management: Reader Acknowledgment

Readers see banner prompting acknowledgment. Process:
1. Scroll to bottom
2. Check box
3. Click submit

Successful acknowledgment shows confirmation message.

### Content Management: Read Receipt Management Page

Interface for managing read receipt rules:
- Create rules for categories
- Rearrange by priority
- View/edit rule details
- Modify dependencies
- Edit/delete rules
- Set visibility (Show/Hide)

### Content Management: Acknowledgment Tracking

Announcement icon on home page indicates pending acknowledgements. Click to access "Acknowledgement required" page with filters for workspace and status.

### Analytics: Article Analytics

Article Analytics provides insights (reads, views, likes, dislikes, link status) across all plans. Use data to optimize content strategy.

### Analytics: Accessing Article Analytics

Access via More (•••) icon > Analytics. Metrics:
- **Reads**: Engagement-based, updated daily
- **Views**: Unique browser clicks
- **Likes/Dislikes**: Reader feedback
- **Link Status**: Working, broken, unknown, ignored

Use link validation tool for maintenance. Analytics update in real-time. Access project-wide insights via "Go to Analytics".

### Content Optimization: Health Check Metrics

Health check metrics analyze articles for readability issues (long sentences, missing links) to improve content quality and SEO.

### Content Optimization: SEO Metrics

Optimize SEO by maintaining:
- Titles: 50-70 characters
- Descriptions: 120-160 characters
- Featured images present
- 1-3 external/internal links

Tool categorizes issues as Problems, Suggestions, or Good Work.

### Content Optimization: Readability Score

Readability score measures text understandability on 0-100 scale. Higher scores indicate easier reading.

### Content Optimization: Checking Readability

To check readability:
1. Open article
2. Click More > Health check metrics
3. Expand Readability metrics

Scores:
- Below 30: Problematic
- 30-59: Needs improvement
- Above 59: Good

Click "Check now" for immediate results.

### Content Optimization: Accessing Health Check Metrics

Access via:
1. Navigate to article
2. Click More (•••) > Health Check Metrics

Panel includes SEO and Readability metrics. Categories: Problems, Suggestions, Good Work. Click "Check now" for updated insights.

### Content Optimization: Understanding Readability Metrics

- **Readability Score**: 0-100 scale (Problem <30, Suggestion 30-59, Good >59)
- **Paragraph Length**: ≤150 words optimal
- **Sentence Length**: ≤20 words recommended
- **Sub-heading Distribution**: Presence indicates good structure

Metrics exclude LaTeX and code blocks.

### SEO: Accessing the Sitemap

Manage sitemaps via Settings > Knowledge base site > Article settings & SEO > SEO. Choose update frequency. Submit XML sitemap to Google Search Console.

### SEO: Sitemap Support by Plan

| Plan | Support |
|---|---|
| Professional | No |
| Business | Yes |
| Enterprise | Yes |

Feature available only for public projects.

### SEO: Understanding Robots.txt

Robots.txt instructs web crawlers on accessible site parts. Controls content visibility in search results.

### SEO: Managing Robots.txt

Access via Settings > Knowledge base site > Article settings & SEO > SEO tab > Edit under Robots.txt. Use to set crawl rules, block pages, or add delays.

### Collaboration: Public Article Comments

Enable public comments via Disqus plugin. Configure integration for automatic activation.

### Collaboration: Enabling Public Comments

To enable comments:
1. Ensure Disqus integration active
2. Navigate to article > More icon > More article options
3. Go to Preferences tab
4. Check Enable feedback
5. Save

Disable by deselecting checkbox. Removing Disqus disables all comments.

### Security: Article Access Control

Granular access control via team/reader accounts and groups. Access levels vary by plan.

### Security: Managing Article Access Control

To manage access:
1. Navigate to article
2. Click More > Security
3. Choose Knowledge base portal (team) or site (readers)

Portal controls content updates; site controls viewer access.

### File Management: Document360 Drive

Cloud-based file storage for teams. Features include folder/file management, recent/starred/deleted file views, and content overview.

### File Management: Adding Folders and Files

Create folders/subfolders mirroring knowledge base structure for better navigation. Plan functionalities may vary.

### File Management: Storage Limits by Plan

| Plan | Storage |
|---|---|
| Professional | 50 GB |
| Business | 100 GB |
| Enterprise | 500 GB |

### File Management: Adding New Folders

Methods:
1. '+' flywheel icon
2. 'New Folder' button

Navigate to location, enter name, click Create. Align structure with knowledge base categories.

### File Management: Understanding System Folders

System folders (Images, Settings, Documentation) marked with shield icon. Cannot delete or rename, but can add files and customize.

### File Management: Adding Files to Drive

Add files via drag-and-drop or "More" menu. Specify location, optional tags and alt text. Avoid filenames with +, %, #, =.

### File Management: Managing Folders in Drive

Organize folders logically matching documentation categories for efficient storage and retrieval.

### File Management: File Limits and Restrictions

- **File Limits**: 5000 files per folder, 150MB single file, 160MB combined multiple files
- **Type Restrictions**: Settings > Knowledge base portal > General > Drive settings
- Specify media types as `media type/extension` with lowercase extensions

### File Management: Troubleshooting Drive Issues

Folder limit is 5000 files. Resolve by using different folders, deleting unused files, or clearing cache. Alt text limited to 140 characters.

### File Management: Starring Folders

Click star icon next to folder. Starred folders appear in "Starred" section regardless of location.

### File Management: Moving Folders

Methods:
1. **More option**: Select folder > More > Move > Choose destination
2. **Drag and drop**: Drag folder to location

Excludes System folders.

### File Management: Renaming Folders

Navigate to folder > More icon > Rename > Enter new name > Confirm. System folders cannot be renamed.

### File Management: Changing Folder Colors

Hover over folder > More > Change Color. Choose from palette, hex code, or color picker. Default is gray.

### File Management: Folder Navigation

Breadcrumb trail shows hierarchy. Click levels to navigate back. Folder actions don't change file URLs.

### File Management: Performing File Actions

Navigate to Drive > Select folder > Choose List or Grid view.

Actions:
- Move: Transfer between folders
- Copy: Duplicate files
- Add Tags/Alt-text: Enhance discoverability
- View Details: Access metadata and dependencies
- Download: Export single or multiple files
- Remove: Delete to Recycle Bin
- Replace: Update without changing name/URL

### File Management: All Files View

Centralized location for all project files. Enables bulk operations across folders.

### File Management: Recent, Starred, and Deleted Files

Recent folder shows latest uploads. Starred items accessible via navigation pane. Recycle Bin stores deleted content.

### File Management: Managing All Files

"All files" page shows up to 20 files per page. Switch between grid/list views. Filter by dependencies, date, uploader, type, tags. Perform bulk operations. Check storage usage.

### File Management: Using the Recycle Bin

Restore or permanently delete items. Bulk or individual restoration. Select up to 20 items or use "Select all {N} items". Deletion is irreversible.

### File Management: Viewing Recent Uploads

"Recent" folder automatically displays latest uploads. Access via Drive icon > Recent folder.

### File Management: Starred Items and Recycle Bin

Star files/folders for quick access. Remove star by clicking again. Recycle Bin auto-deletes unused items after 30 days.

### File Management: Deleting Folders

Steps:
1. Click Drive icon
2. Use More icon or checkbox to reveal Remove
3. Click Remove > Confirm with Yes

Considerations:
- Breaks media reference links
- System folders cannot be deleted
- Restore from Recycle Bin within 30 days

### File Management: Troubleshooting File Replacement

Error occurs when swapping different file types. Verify matching types, clear cache, test browsers. Back up before replacement. Contact support with error details if needed.

### File Management: Setting Default Folders

Select folder from Drive to set as default. Overridden by category-to-folder mappings. Indicated by edit icon.

### Workflow Management: Benefits of Workflow

Facilitates collaboration, consistency, and accountability among writers, editors, illustrators, and subject matter experts.

### Workflow Management: Workflow Designer Overview

Create and manage step-by-step workflows (Draft, Review, Publish). Admins/owners customize. Access via Documentation > Content tools > Workflow designer.

### Workflow Management: Workflow Designer

Tool for managing documentation processes. Plan features:

| Plan | Features |
|---|---|
| Professional | Essential automation |
| Business | Advanced collaboration |
| Enterprise | Custom automation and analytics |

### Workflow Management: Understanding Workflow Statuses

- **System Status**: Predefined (Draft, Published), cannot delete or reorder
- **Custom Status**: User-defined, flexible, can set read-only

### Workflow Management: Adding Workflow Statuses

Process:
1. **Add**: Access designer > Set name/description > Enable/disable read-only > Save
2. **Edit**: Navigate to status > Update > Save
3. **Reorder**: Drag and drop custom statuses
4. **Delete**: Remove permanently with confirmation

### Workflow Management: Troubleshooting Workflow Issues

Article editing blocked by read-only status. Resolve via Workflow designer > Disable read-only toggle. Requires admin permissions.

### Workflow Management: Workflow Assignments

Assign document statuses to team members to improve visibility and control over article lifecycle.

### Workflow Management: Assigning Articles

To assign:
1. Navigate to article
2. Select workflow status
3. Click "Assign owner"
4. Choose team member
5. Click "Assign"

Can remove assignees or set due dates. Notification emails sent.

### Workflow Management: Workflow Status Actions

Workflow status option at top right of Documentation editor. Actions:

- View current/past statuses
- Set/clear due dates
- Assign team members
- Activate next status
- View history

Enable notifications via Settings > Notifications.

### Content Templates: Overview

Pre-designed templates for consistent articles (user guides, FAQs, release notes). Create custom templates for repeated use.

### Content Templates: Creating Templates

To create:
1. Content reuse > Templates > Create template
2. Name it > Select editor type > Add description > Save

Edit existing templates via hover > Edit. Default templates created during onboarding.

### Content Templates: Saving Articles as Templates

Create template from article:
1. Click "..." icon > Save as template > Confirm

Manage via "Manage templates" page.

### Content Templates: FAQs

Templates can be cloned within same language. Deleting templates doesn't affect existing articles. Share templates with team members. Template updates don't affect previously created articles.

### Content Reuse: Variables

Reusable elements for frequently changing text (contact info, addresses). Update once to propagate changes throughout document.

### Content Reuse: Managing Variables

Find, view, edit, delete variables. See article usage and edit propagation. Modify links and styles. Bulk delete available.

### Localization: Translating Variables

Translate variables for localization:
1. Create new variables with target languages
2. Fill content in default language first
3. Translate to other languages

Existing variables can be translated, retranslated, or removed by language. Global variables cannot be translated.### Content Reuse: Creating Variables

Create variables via **Documentation > Content tools > Content reuse > Variables**.

Click **Create variable**:
- Enter Name (30 chars max: letters, numbers, hyphens, underscores)
- Select Language (Global or specific)
- Add Content (100 chars max with formatting)
- Use Snippets for longer text/media
- Click **Create variable**

Merge code generates automatically as `{{variable.Name}}`.

### Content Reuse: Using Variables

Insert variables via:
1. **Markdown**: Type `{{variable.MergeCodeValue}}` exactly
2. **Toolbar**: Click Content reuse icon > select variable

Advanced WYSIWYG editor: Use Insert > Variables or slash command. Select from right pane with preview on hover.

Built-in variables enable single-source updates, ensure consistency, support real-time editing, and facilitate team collaboration. They're translatable except Global ones.

### Content Reuse: Snippets Overview

Snippets are reusable content blocks (text, images, etc.). Authors store them in a library and insert into articles. Readers see content seamlessly without knowing it's reused.

### Content Reuse: Creating Snippets

Access via **Documentation > Content tools > Content reuse**.

Create snippet:
- Name (30 chars max: letters, numbers, hyphens, underscores)
- Set Language (Global by default)
- Add content via WYSIWYG or Markdown editor
- Click **Create snippet**

### Content Reuse: Using Snippets

Two insertion methods:
1. Markdown editor: Use specific merge code
2. Toolbar: Search/select from pane (all editor types)

Method 2 allows preview and creates local copies (static snippets).

### Content Reuse: Managing Snippets

Manage snippets in knowledge base:
- Find, view, edit, delete
- See usage across articles
- Track language and modification date
- Bulk delete available

### Content Reuse: Snippet FAQs

- **Limit**: 200 snippets per project (additional via add-on)
- **Rename**: Not possible after creation
- **Placement**: Always starts new line for multi-line content

### Localization: Translating Snippets

Manage multilingual snippets for consistency:
- Global snippets: Not translatable
- Create new: Select language, add name/content, translate
- Existing: Select target language, translate/retranslate
- Default language marked as Main
- Completed translations show green tick

### Content Structure: Importance of Tables

Tables organize complex data into rows and columns, making information easier to understand and compare.## Site Customization: Styling Tables with CSS

To style tables in Document360, go to Settings > Custom CSS & JavaScript. Add or modify CSS to customize borders, padding, background colors, and font styles. You can also hide empty headers. Save changes to apply them. Custom CSS works alongside pre-built snippets.

## Site Customization: Table Styles and Plan Support

Document360 offers robust table customization across all plans. Here's how each plan handles custom CSS and JS:

| Professional | Business | Enterprise |
| --- | --- | --- |
| Limited CSS/JS customization | Advanced CSS/JS customization | Full CSS/JS customization with priority support |

## SEO: Editing Redirect Rules

To edit a redirect rule:
1. Go to Knowledge base > Article redirect rules
2. Filter to find the rule
3. Hover and click "Edit"
4. Update fields
5. Click "Update"

## SEO: Adding Redirect Rules

Configure URL redirects for articles. Two methods available:

1. **Ends with**: Redirects based on article slugs at the end of the URL
2. **Replace with**: Replaces segments of the URL

Specify correct paths (start and end with `/`). Consider multilanguage and multi-project contexts. Site-level redirects are also supported.

## SEO: Article Redirect Rules

Enterprise plan supports article redirect rules. Redirect any published or draft article URL to prevent broken links and maintain cross-references. Bulk import is also supported.

## SEO: Filtering Redirect Rules

Filter redirect rules by:
- Source or destination URLs
- Rule type (Ends with, Replace with, or Both)
- Modification date (preset timeframes or custom ranges)

## SEO: Importing Redirect Rules

Import redirect rules in bulk:
1. Upload a properly formatted CSV file (Source, Destination, RedirectionType)
2. File size limit: 1MB
3. Location: Settings > Knowledge base site > Article redirect rules

Review valid and invalid rules. Download invalid rules if needed. Import accepted rules.

## SEO: Exporting Redirect Rules

Export redirect rules as CSV from Settings > Article redirect rules. Manage broken links and redirects for articles.

Limits:
- Maximum 10,000 rules per project
- Import size restrictions apply

Redirects can be customized with JavaScript, replace workspace names, or send to homepage. Address errors like too many redirects by validating and correcting rules.

## SEO: Deleting Redirect Rules

To delete a redirect rule:
1. Go to Settings > Knowledge base site > Article redirect rules
2. Use Filter to find the rule
3. Hover and click Delete, or select multiple rules with checkboxes
4. Confirm by clicking Yes

**Note**: Deleted rules cannot be recovered.

## Site Settings: Article Settings

Configure Knowledge Base article settings at the site level:
- Accessibility options
- Headers, sidebars, footers
- Categories, search, FAQ
- Individual article elements (read-aloud, table of contents, comments, statuses, related articles)

Localization is supported. Search options and FAQs can be adjusted separately. Individual article settings may override global configurations.

## Site Settings: Article Header Customization

Update knowledge base article headers to include:
- Contributor lists
- Estimated read times
- Sharing options

These improvements boost user engagement.

## Site Settings: Enabling Article Header Elements

Enable these header elements in Article settings:
- Contributors
- Read time
- Follow button
- Share
- Print
- Dates
- PDF download

This change affects all articles in the project.

## Accessing the What's New Feature

View recently published articles:
1. Click the announcement icon
2. Select workspace and language
3. Filter by date range (24 hours, 7 days, or 30 days)

Enable or disable "Show What's New" in Settings > Knowledge base site > Article settings & SEO.

## Site Features: Article Header Elements

Article headers include:
- Contributors
- Read time estimate
- Follow button
- Share icon
- Print option
- Published/updated dates
- PDF export

Localization allows text customization per language.

FAQ topics:
- Hiding breadcrumbs
- Exporting drafts
- Setting default email apps
- Disabling print/PDF options

## User Engagement: Following Articles and Categories

The "Follow articles and categories" feature notifies users of new or updated articles. Available only for Private and Mixed projects in KB site 2.0 (projects created after June 10th).

## Site Features: Search Functionality

Search across articles, categories, and PDF attachments. Advanced filters and keyword operators improve efficiency for large documentation sets.

## Site Features: Search Attributes

Search prioritizes:
1. Article and category titles
2. Tags
3. Slugs (articles and categories)
4. Breadcrumbs
5. Content text

## Enabling the 'Show Follow Button'

To enable the follow button:
1. Go to Settings > Knowledge base site > Article settings & SEO
2. Toggle on "Show Follow button" in the Article header section

Enabled by default for new Private and Mixed projects.

## Site Features: Searching Attachments

Search PDF files (up to 10MB) within the knowledge base. Find content even when file names don't match search terms.

Enable via Knowledge base portal settings. Requires "Show article files" toggle. When "Show attachment tab" is off, search is limited to article content, titles, slugs, and tags.

## Site Features: Advanced Search

Filter search results by:
- Workspace (current, all, or specific)
- Language (current, all, or specific)
- Tags
- Contributor
- Date (preset or custom range)
- Category

Enable in Settings > Knowledge base portal.

## Site Features: Search Filters

Refine search results by:
- Category
- Attachments
- Workspace (current, all, or specific)
- Language (current, all, or specific)

Filters appear to the left of the search bar.

## Site Features: Search Operators

Improve search precision with operators:
- Double quotes: exact phrases
- Minus sign: exclude terms

**Note**: "-" excludes results, while "-" as part of a word is treated differently.

## Enabling 'No Search Result Feedback'

1. Click gear icon > Settings
2. Select "Knowledge base site"
3. Go to "Article settings & SEO"
4. Expand "Search settings"
5. Toggle "No search result feedback"

When enabled, users see a feedback form for empty searches. When disabled, they see a blank page.

View submissions in "Search analytics" under analytics section.

## Site Features: Advanced Search FAQs

Advanced search combines searches across all workspaces and languages with filters.

To hide homepage search, customize the header.

Exclude articles by hiding them. External search engines are handled separately.

Include API documentation by selecting "All workspaces" in search filters.

For RTL languages (Hebrew, Arabic), search bar aligns right-to-left. Search behavior depends on default language when mixing RTL/LTR.

Enable "Include all workspaces in site searches" in Article settings to search all workspaces in Document360 1.0.

## Site Features: Smart Bars

Create customizable banners to convey information, announcements, or updates. Tailor content to user location, browser, or project language. Enhance engagement and highlight critical updates.

## User Feedback: Liking/Disliking Articles

Users can like or dislike articles to provide feedback. Helps improve content quality.

Feedback can be submitted multiple times. Undo feature (30-day window) only works in KB Site 2.0 projects.

## Site Features: Creating Smart Bars

Create custom banners with:
- Content (text, formatting)
- Appearance (position, color theme)
- Visibility rules (URLs, IP, browsers, devices, language, project)

Edit or delete existing Smart bars. Supports global or language-specific display.

## User Feedback: Liking/Disliking Process

Like or dislike articles by clicking icons at the end of each article.

Liking is simple. Disliking requires a comment.

Both actions open feedback panels with:
- Comment options
- Email notification settings

Users can undo actions within 30 days (unless cache is cleared). Dislikes without comments aren't counted. Analytics only record active interactions.

Switching like/dislike retains previous comments. Process works the same in the Knowledge base widget.

## Site Features: Smart Bar Management

Manage Smart bars from the overview page:
- Language selection
- Status toggles
- Detailed previews
- Show/hide rules
- Edit/delete options
- Filters for organization
- Create new Smart bars

## Support: Ticket Deflectors

Reduce support tickets by routing users to self-service resources. Improves user satisfaction and reduces support workload.

## Support: Managing Ticket Deflectors

Manage ticket deflection forms from the overview page:
- View titles and status
- Update history
- Create/clone/edit/delete forms
- Integrate with helpdesks
- Preview before publication
- Copy forms for sharing

**Limitation**: Only usable in main workspace and its languages. Set to offline before deleting.

## Compliance: Cookie Consent

Websites store small data pieces called cookies in user browsers. Consent is required, especially under GDPR.

Document360 allows adding cookie consent bars or popups for compliance.

## Compliance: Adding Cookie Consent

Enable cookie consent in Settings > Knowledge base site > Cookie consent:
- Customize message for all or specific languages
- Format with basic tools
- Choose bar or popup banner
- Select position and theme (light, dark, or custom)
- Add CTA (text, button, or icon)
- Preview and save

## Support: Adding Ticket Deflectors to Header/Footer

Add ticket deflector forms to header and footer navigation:
- Primary/secondary navigation in header
- Basic/custom footer
- Other relevant sections

Forms must be activated. Use copied links for placement in articles or home pages.

Clone to duplicate forms. Preview changes before publishing. Delete inactive forms.

Copy link from Settings > Knowledge base site > Ticket deflectors.

## Support: Creating Ticket Deflectors

Route users to self-service resources (FAQs, guides). If no solution found, direct to tailored contact form.

Business and Enterprise plans support multiple deflectors (up to 10).

## Integrations: Helpdesk Configuration

Integrate ticket deflectors with Freshdesk and Zendesk for direct ticket creation.

Configure in Settings > Knowledge base site > Ticket deflectors:
- Select platform (Freshdesk or Zendesk)
- Enter credentials (API key, domain URL, agent email for Zendesk)
- Validate and save

## Integrations: Adding New Integrations

To integrate third-party apps:
1. Go to Settings > Knowledge base site > Integrations
2. Select desired app
3. Choose Basic or Custom configuration
4. Provide required information (Description, App ID)
5. Click "Add"

Check "Learn more" link for app-specific instructions.

## Integrations: Overview

Document360 supports over 25 third-party integrations across:
- Analytics
- Chat
- Comments
- Marketing automation

Available in Professional, Business, and Enterprise plans.

## Support: Creating Ticket Deflectors - Detailed

Create ticket deflectors in Document360:
1. Settings > Knowledge base site > Ticket deflectors > New ticket deflector
2. Configure title (max 150 chars), slug, description
3. Set up context questions to guide users
4. Add suggestions (additional questions, answers, links)
5. Customize contact form fields (Email, First Name, Description required)
6. Allow attachments (max 5 files, 2MB each)
7. Enable CAPTCHA
8. Set thank-you message (max 250 chars)
9. Configure ticket submission (email notifications, helpdesk mapping)
10. Localize text via Localization & Workspaces > Localization variables

## Integrations: Managing Integrations

Manage integrations on the Integrations page:
- Update credentials, description, status
- Edit App ID/URL
- Delete after confirmation

Troubleshoot by checking App ID/URL, internet connection, and app-specific instructions.

Best practices:
- Periodically review integrations
- Keep them up-to-date
- Add analytics scripts via Custom HTML in site settings

## Integrations: Integration Overview Page

View and manage integrations from the overview page:
- Toggle status
- View type, description, user involvement
- Categories: Analytics (9 tools), Chat (11 tools), Commenting (2 tools), Marketing automation (3 tools)

Notable options: Google Analytics, Intercom, Disqus, Zoho PageSense.

## Integrations: Code Filtering

Configure conditions to control where integrated apps run:
- IP address
- Workspace
- Language

Use AND/OR logic to combine conditions. Example: filter Google Analytics by IP, workspace, or language for targeted data collection.

## Integrations: LiveChat

Integrate Document360 with LiveChat:
1. Configure in Document360 Knowledge Base portal
2. Select LiveChat
3. Add description
4. Enter LiveChat ID
5. Use conditional code if needed

Allows LiveChat users to access Document360 knowledge base information.

## Site Customization: Custom HTML Integration

Add custom HTML snippets for third-party integrations:
1. Go to Settings > Knowledge base site > Integrations
2. Choose insertion point (Header, Begin Body, or End Body)
3. Paste code
4. Save

Snippet appears on Integrations overview page. Placement determines where widgets appear.

## Integrations: Olark

Olark integrates with Document360 for enhanced customer support. Features include:
- Visitor co-browsing
- Geolocation
- Visitor insights (browsing history)
- Chat transcripts

## Integrations: LiveChat Overview

LiveChat provides real-time communication for efficient customer support. When integrated with Document360, it offers instant support during knowledge base browsing.

## Integrations: Getting the LiveChat ID

For existing users:
- Access LiveChat dashboard
- Click "Install"
- Find ID in manual installation snippet (prefix: `window.lc.license=`)

For new users:
- Copy ID during initial setup
- Integrate with Document360
- Enable bots for common queries

## Integrations: Getting the Olark ID

1. Log into Olark
2. Go to Settings > Channels > Installation Code
3. Copy code
4. Find `olark.identify()` function
5. Copy 13-digit ID following it
6. Use ID for Document360 integration

## Integrations: Freshchat

Freshchat is a messaging platform for sales and customer engagement. Supports:
- AI-powered chatbots
- WhatsApp, Apple Business Chat, Facebook Messenger, LINE integration
- Unified messaging experience
- Consolidated inbox

## Integrations: Integrating with Olark

1. Log into Document360 Knowledge Base portal
2. Go to Settings > Knowledge Base Site > Integrations
3. Select Olark
4. Enter Olark ID
5. Add description
6. Click Add

## Integrations: Integrating with Freshchat

1. Access Document360 Settings > Knowledge base site > Integrations
2. Choose "Freshchat" integration
3. Enter description
4. Paste Freshchat token (from Freshchat dashboard: Settings > Admin settings > Configuration and Workflows > Web Chat Settings > Integration Settings)
5. Configure code inclusion/exclusion rules if needed
6. Click "Add"

Enables searchable knowledge articles within Freshchat.

## Integrations: Chatra

Chatra provides real-time chat for instant customer support during content navigation. Reduces operational costs and improves satisfaction.

## Integrations: Crisp

Integrate Crisp with Document360:
1. Go to Settings > Knowledge base site > Integrations
2. Select Crisp
3. Enter description and Crisp website ID
4. Find ID in Crisp Settings > Website Settings
5. Use code inclusion/exclusion conditions if needed
6. Click Add

Supports chatbot functionality with email campaigns and mobile apps.

## Integrating Document360 and Chatra

Integrate Document360 with Chatra live chat:
1. Get Chatra ID
2. Configure in Document360 Settings > Knowledge base site > Integrations
3. Add Chatra ID to Document360
4. Use code inclusion/exclusion conditions if needed

Get ID from Chatra dashboard or during initial setup.

## Integrations: Crisp and Plan Support

Third-party tool integration by plan:

| Professional | Business | Enterprise |
| --- | --- | --- |
| Zendesk, Slack, Trello | Salesforce, Mailchimp, HubSpot | Jira, Google Analytics, Advanced CRM |

Crisp is a centralized shared inbox platform. Features:
- Cost efficiency: Handle multiple conversations simultaneously
- Predefined answers: Automated responses for common queries
- Enhanced communication: Include visuals in messages

## Integrations: Gorgias

Gorgias is a multi-channel helpdesk solution. Integrates with Document360 for streamlined customer query management.

## Integrations: Integrating with Gorgias

1. Obtain Gorgias ID from Gorgias
2. Add as new integration in Document360 Settings
3. Configure conditional code inclusion based on IP, Workspace, or Language if needed

## Integrations: Doorbell

Doorbell collects and analyzes customer feedback. Features include screenshot attachments.

![Doorbell Integration](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/003_Screenshot_Doorbell_Integration.png)

## Integrations: Getting the Gorgias App ID

For existing users:
1. Log in to Gorgias
2. Go to Settings > Channels > Chat
3. Add new chat integration
4. Install manually

For new users:
1. Copy Gorgias ID during LiveChat setup
2. Integrate with Document360

Enables team collaboration and ticket management.

## Integrations: Sunshine Conversations

Sunshine Conversations is an API-based CRM tool on AWS. Communicate via social media and messaging. Integration with Document360 streamlines customer communication.

## Integrating Document360 and Belco

Integrate Document360 with Belco:
1. Obtain Belco Shop ID via Belco application setup
2. Configure in Document360 Knowledge base portal
3. Add description and Shop ID
4. Use code inclusion/exclusion rules if needed
5. Log into Belco to manage chats

Links chatbot interface to Document360's structured knowledge base.

## Integrations: Belco

Belco provides real-time chat for instant customer support. Allows agents to manage multiple conversations simultaneously. Improves efficiency and reduces operational costs.

## Integrations: Kommunicate

Kommunicate integrates with Document360 for real-time customer support via AI chatbots. Improves efficiency, reduces costs, and enhances satisfaction.

## Integrating Document360 and Sunshine Conversations

To integrate Sunshine Conversations with Document360:
1. Go to Knowledge base portal
2. Settings > Knowledge base site > Integrations
3. Select Sunshine Conversations
4. Add description
5. Enter App ID
6. Use code inclusion/exclusion conditions if needed
7. Click Add

## Obtaining the Sunshine Conversations ID

1. Access dashboard
2. Create new app
3. Fill in details
4. Save app
5. Go to app settings
6. Find App ID in App Details section
7. Optionally generate API keys in same menu

## Integrations: Integrating with Kommunicate

1. Go to Document360 Knowledge Base Settings > Integrations
2. Select Kommunicate
3. Add description
4. Enter Kommunicate ID (from Kommunicate app)
5. Configure code inclusion/exclusion conditions based on IP, workspace, or language if needed
6. Click "Add"

## Integrations: Google Analytics

Integrate Document360 with Google Analytics:
- Basic configuration: Standard ID
- Custom configuration: Snippet code
- Optional code inclusion/exclusion conditions based on IP, Workspace, and Language

Go to Settings > Integrations > Google Analytics to set up.

## Integrations: Getting the Google Analytics ID

1. Go to Google Analytics account
2. Find "Tracking ID" in property settings
3. Input ID into Document360 portal field

Tracks user metrics like views, location, and behavior.

## Integrations: Getting the Kommunicate App ID

Get your Kommunicate App ID:
- Existing users: Settings > Install in your account
- New users: Copy during installation process

Essential for integrating Kommunicate with Document360. Enables efficient chat management, lead qualification, and 24/7 support.

## Integrations: Google Analytics Setup

1. Create Google Analytics account
2. Set up property in Admin section
3. Retrieve Google Analytics ID from Property Settings
4. Log into Document360 with admin privileges
5. Go to Settings > Integrations
6. Paste ID into Document360 integration settings
7. Save changes
8. Verify integration in Google Analytics real-time reports
9. Update privacy policy for compliance

## Integrations: Google Analytics (GA4)

Document360 supports GA4 integration. GA4 uses Measurement ID starting with 'G-' instead of GA3's 'UA-' Tracking ID.

## Integrations: Getting the GA4 Measurement ID

To get GA4 Measurement ID (G-XXXXXX):
1. Go to Google Analytics Admin > Property Settings > Data Streams
2. Select your stream
3. Click Configure tag settings
4. Copy 'G-' ID from "Your Google Tag" section
5. Paste into Document360 portal's Google Analytics ID field

## Integrations: Google Tag Manager

Google Tag Manager updates website tags for better analytics and marketing.

## Integrations: Integrating with GA4

Integrate GA4 with Document360:
1. Get Google Analytics account and ID
2. Go to Settings > Knowledge base site > Integrations
3. Choose basic configuration (Measurement ID) or custom (custom events)
4. Set optional conditions for code inclusion based on IP, workspace, or language

Tracks user interactions, popular articles, and locations.

## Integrations: Integrating with Google Tag Manager

Integrate Google Tag Manager with Document360:
- Basic configuration: Requires Google Tag Manager ID
- Custom configuration: Allows custom snippet code and conditional inclusion (IP, Workspace, Language)

## Integrations: Heap

Heap analyzes user behavior with event feeds and analytical tools (funnels, retention).

## Integrations: Integrating with Heap

1. Go to Document360 Integrations settings
2. Select "Heap"
3. Choose basic (needs Heap App ID) or custom configuration
4. Provide description and Heap App ID for basic setup

## Integrations: Getting the Google Tag Manager ID

Get Google Tag Manager ID:
- Existing users: Find code snippet in workspace section
- New users: Copy from initial setup container creation

Essential for Google Tag Manager integration.

## Integrations: Segment

Segment simplifies third-party tool integration for efficient customer data collection and analysis.

## Integrations: Getting the Segment ID

To get Segment Account SID:
1. Go to Segment dashboard
2. Find "Develop" section
3. Copy Account SID from "Account info"

Needed for Segment integration in Document360.

## Integrations: Getting the Heap App ID

For existing Heap customers:
1. Go to Account > Install
2. Select Web
3. Copy Heap ID from snippet

For new Heap customers:
1. Get App ID during setup
2. Access Heap account post-setup to view ID

Enables advanced analytics for user behavior analysis.

## Integrations: Hotjar

Hotjar provides user behavior analytics with heatmaps, session recordings, and surveys.

## Integrations: Integrating with Segment

1. Go to Document360 Settings > Integrations
2. Choose Basic (Segment ID) or Custom setup
3. Set optional conditions for code execution
4. Complete setup and verify functionality

## Integrations: Integrating with Hotjar

1. Go to Settings > Knowledge base site > Integrations
2. Select Hotjar
3. Choose Basic (Hotjar ID) or Custom configuration
4. Enter Description and Hotjar ID, or add custom snippet code
5. Set inclusion/exclusion conditions based on IP, Workspace, or Language if needed
6. Save configuration

## Integrations: Integrating with Amplitude

Integrate Amplitude with Document360:
- Basic or Custom configuration
- Provide Amplitude API key
- Set optional code inclusion/exclusion conditions (IP, Workspace, Language)

Basic config is straightforward. Custom config allows custom events.

Enable Session Replay with Autocapture by adding specific JavaScript snippet.

## Integrations: Getting the Hotjar ID

1. Go to Hotjar setup section
2. Click "Set up Hotjar" from sidebar
3. Locate snippet with `hjid` variable
4. Copy ID

Essential for Hotjar analytics tools.

## Integrations: Amplitude

Amplitude analyzes product usage data and user behavior. Features real-time analytics and flexible user segmentation.

Integration plans:
- Professional: Basic analytics tools and SEO optimizers
- Business: Advanced analytics and customer support software
- Enterprise: Custom tools, APIs, and advanced analytics solutions

## Integrations: Amplitude FAQ

Amplitude tracks user events for product optimization. Document360 manages knowledge base content separately.

## Integrations: Getting the Amplitude API Key

Get Amplitude API key:
- New customers: Register and receive key during setup
- Existing customers: Access key in project dashboard under Projects > General

## Integrations: FullStory

FullStory provides user-experience intelligence with real-time analytics, retention tracking, and Magic Moments.

Integration tiers:
- Professional: Basic metrics
- Business: Advanced analytics
- Enterprise: Unlimited access to all features

## Integrations: FullStory FAQ

Integrate FullStory for website analytics and recording. Document360 uses FullStory ID for integration.

## Integrations: Getting the FullStory ID

For existing users:
1. Go to dashboard
2. Click workspace dropdown
3. Select Settings
4. Find ID under "Install your FullStory snippet" using `window['_fs_org']`

For new users:
1. Complete Document360 integration
2. Access FullStory account to view analytics

## Integrations: Integrating with FullStory

1. Go to Settings > Integrations
2. Select FullStory
3. Configure with basic (description + ID) or custom (snippet code)
4. Set inclusion/exclusion conditions if needed
5. Click Add

## Integrations: Mixpanel

Mixpanel tracks user activity with event-based analytics. Focuses on user journey, not general site data.

## Integrations: Integrating with Mixpanel

1. Go to Settings > Integrations in Knowledge Base
2. Select Mixpanel
3. Choose Basic or Custom configuration
4. Basic requires manual JavaScript addition later
5. Custom allows direct code input during setup
6. Both options permit conditional inclusion based on IP, workspace, or language

## Integrations: Getting the Mixpanel ID

1. Log into Mixpanel account
2. Go to Settings > Set up Mixpanel
3. Copy displayed Mixpanel ID

## Integrations: Mixpanel - Sample Code

Foundational code snippets for Mixpanel tracking in Document360:
- Page view tracking
- Button click tracking

Require customization and Mixpanel ID for implementation.

## Integrations: VWO

VWO optimizes business features with testing, user intent extraction, push notifications, and roadmap creation.

## Integrations: Integrating with VWO

1. Get VWO Account ID from VWO account
2. Go to Document360 Settings > Integrations
3. Configure with basic or custom settings
4. Add custom events if needed
5. Use code inclusion/exclusion based on conditions (IP, workspace, language)
6. Manage optimization and tests through VWO interface

## Integrations: Zoho PageSense

Zoho PageSense optimizes and personalizes websites. Tracks, analyzes, and improves conversion rates.

## Integrations: Integrating with Zoho PageSense

1. Go to Document360 Integrations settings
2. Select Zoho PageSense
3. Input Zoho PageSense ID (from Zoho PageSense Interface)
4. Apply code inclusion/exclusion conditions if needed

Provides complete CRO solutions with heatmaps, A/B testing, form analytics, and session recordings.

## Integrations: Freshmarketer

Freshmarketer automates marketing with A/B testing, heatmaps, and funnel analysis.

1. Get Freshmarketer Script Tag Src from account: Admin settings > Tracking and Integrations > CRM Code Library
2. Go to Document360 Settings > Knowledge base site > Integrations
3. Select Freshmarketer
4. Provide description and script tag
5. Set inclusion/exclusion conditions if needed
6. Save integration

Enables contact management, campaigns, and automated emails.

## Integrations: Integrating with GoSquared

1. Get GoSquared Project Token from GoSquared account
2. Add token to Document360 Knowledge base portal integrations
3. Enable behavioral data analysis and chat features

## Integrations: GoSquared

GoSquared converts visitors to loyal customers with:
- Analytics
- Live Chat
- Automation
- Customer Data Hub
- Now dashboard (real-time insights)
- Trend dashboard (historical insights)

## Integrations: Commento

Commento is a fast, bloat-free commenting system for knowledge base websites.

## Integrations: Commento FAQ

To fix "_This domain is not registered with Commento_" error:
1. Go to Settings > Knowledge base site > Integrations
2. Turn off Commento toggle

## Integrations: Disqus

Disqus provides multilingual commenting for Document360 articles with design integration and moderation features.

## Integrations: Accessing Extensions

Access extensions in Settings > Knowledge base portal > Extensions. Filter by category:
- All extensions
- Helpdesk (Freshdesk, Zendesk, Intercom, Salesforce)
- Team collaboration (Slack, Microsoft Teams, Drift, Zapier, Make)
- Code repositories (GitHub)
- Translation & browser (Chrome, Crowdin, Phrase)

Click "Connect" on desired extension tile.

## Integrations: Document360 Extensions Overview

Document360 Extensions integrate with third-party platforms for connected workflows. Available across all plans, they allow direct access, management, and sharing of content from other tools.

## Integrations: Freshdesk

Freshdesk integrates with Document360 for efficient support workflows. Agents access and create articles directly within Freshdesk.

## Integrations: Freshdesk - Features

Agents search, share, and create knowledge base articles directly in Freshdesk. Streamlines support by providing quick information access and enabling knowledge base updates from ticket responses.

## Integrations: Freshservice - Setup

1. Generate Document360 API token
2. Copy token
3. Access Freshservice
4. Find Document360 app in marketplace
5. Paste token
6. Click "Install"
7. Repeat for multiple knowledge bases

## Integrations: Zendesk

Zendesk integrates with Document360 knowledge base. Agents access and create articles directly in Zendesk, improving response times and article creation efficiency.

## Integrations: Zendesk - Setup Guide

1. Install Document360 app from Zendesk Marketplace
2. Generate API token in Document360
3. Paste token into Zendesk setup
4. Enter title and restriction settings if needed

## Integrations: Freshservice - Features

- Search and share articles from Freshservice tickets
- Auto-suggestions based on ticket titles
- +Link to add URLs, +Content to paste full articles
- Automated search using ticket title

- Create articles directly from Freshservice
- Text editor with formatting options (H2/H3, bold, italic, lists)
- Insert features (code blocks, hyperlinks, images)
- Cannot create new categories via Freshservice

## Integrations: Zendesk - Creating Articles

Create Zendesk knowledge base articles directly from Document360:
1. Click "Create Article"
2. Input title and category
3. Write content in Markdown
4. Publish

Quick launch feature allows linking/inserting articles into Zendesk chat replies.

## Integrations: Zendesk - Article Search and Sharing

Document360 app in Zendesk allows instant article search and sharing during ticket responses:
- Automatic search based on ticket title
- Manual search via search bar
- Preview articles
- Link, insert full content, or open in new tab

Improves efficiency without switching tabs.

## Integrations: Zendesk - Federated Search

Set up Zendesk Federated Search:
1. Go to Settings > Knowledge base portal > Extensions > Zendesk
2. Click Setup
3. Configure under "Zendesk federated search"
4. Provide Zendesk subdomain, admin email, and API token
5. Validate details
6. Select workspace and language for syncing
7. Save configuration

Enables searching Document360 articles within Zendesk as external sources.

## Integrations: Intercom

Intercom integrates with Document360 for real-time customer support. Agents search and share knowledge base articles within Intercom chats. Requires valid Intercom account and workspace ID.

## Integrations: Zendesk - Uninstallation

To uninstall Document360 from Zendesk:
1. Go to Apps and integrations > Zendesk Support apps
2. Locate Document360 app
3. Hover to access settings icon
4. Click Uninstall
5. Confirm in prompt

## Integrations: Zendesk - FAQ

**Can I push multiple articles from Zendesk to Document360 simultaneously?**

No, transfer articles one at a time.

## Integrations: Intercom - Article Search and Sharing

Share knowledge base articles in Intercom chat:
1. Click Document360 icon
2. Search for relevant article
3. Choose article from list
4. Send to customer

Customers can:
- Click article assistant to open in new tab
- Use Article search app assistant for self-initiated searches

## Integrations: Intercom - Article Creation

Create new articles via Document360 app assistant in Intercom:
1. Fill in title, body, and category
2. Process mirrors Document360 portal article creation

## Integrations: Salesforce

Enterprise plan add-on feature. Allows support agents to access and create knowledge base articles directly within Salesforce console.

## Integrations: Salesforce - Setup

1. Create Salesforce account via signup page
2. Verify account and choose plan
3. Install Document360 app from AppExchange
4. Select environment (Production/Sandbox) and user access level
5. Add Visualforce page in Salesforce Developer Console using provided code snippet

## Integrations: Salesforce - Authorization

1. Go to Settings > Knowledge Base Portal > Extensions > Salesforce
2. Purchase Salesforce add-on if needed
3. Choose live or sandbox environment
4. Click "Connect" and "Allow" in authorization window
5. Confirm connection status in Salesforce assistant

Salesforce is separate purchase within Document360 project.

## Integrations: Salesforce - Content Management

Use Knowledge Base tab in Salesforce:
- Search and view articles/categories
- Select workspaces and languages via dropdown
- Search by name, content, tag, or slug
- Filter results by name

Clicking articles/categories opens Reader View with:
- Copy links
- Open articles on site
- Copy specific excerpts

## Integrations: Salesforce - Cases Integration

Enterprise plan only. Integrates Document360 with Cases for direct article access, accelerating resolution.

## Integrations: Salesforce - Cases Integration Setup

1. Embed Visualforce component
2. Customize component size in Lightning App Builder
3. Create/manage knowledge base articles directly in Salesforce
4. Articles drafted initially, require admin/owner approval for publishing

## Integrations: Salesforce - Article Recommendations

Document360 automatically recommends articles based on case subject keywords:
- Displays title and snippet
- Copy options and open-in-tab links
- Customize workspace and language for filtering
- Shows up to 5 articles at a time

## Integrations: Salesforce - FAQs

- Uses REST APIs for data transfer with secure authentication
- Maps custom fields to custom objects
- Handles document versioning with change tracking
- Security includes encryption, secure API auth, role-based access, compliance
- Upgrading requires API review, staging tests, compatibility checks
- Supports SAML or OpenID for Single Sign-On

## Integrations: Slack - Commands

Document360 integrates with Slack via `/doc360` commands:
- Search articles: `/doc360 search query`
- Select version/language for results
- Open or link articles directly in Slack
- Create articles: `/doc360 create Title` (Markdown editor)
- Articles created in draft form
- Cannot create categories from Slack

## Integrations: Slack

Slack enables team collaboration. Integration allows agents to access knowledge base, search articles, create documentation, and use Markdown editor for any version or language.

## Integrations: Slack - Setup

1. Go to Knowledge base portal settings
2. Select Extensions
3. Find Slack
4. Click Connect
5. Grant workspace access
6. Confirm connection

## Integrations: Slack - Uninstallation

1. Access Slack App Directory
2. Select Manage
3. Choose Document360
4. Find "Remove application"
5. Click it

Contact support@document360.com if needed.

## Integrations: Microsoft Teams

Integrate Teams with Document360 for seamless article searching and sharing without context switching.

## Integrations: Microsoft Teams - Setup

1. Add Document360 app to Teams
2. Generate API key in Document360 knowledge base portal
3. Add API key in Teams app
4. Access knowledge base using `/Document360` command
5. Uninstall by right-clicking app

## Integrations: Microsoft Teams Overview

Microsoft Teams streamlines messaging, document sharing, and discussions. Enterprise plan supports MS Teams extensions integration with Document360.

## Integrations: Microsoft Teams - Article Search

Search and share Document360 articles in Teams:
- Use app logo or `/Document360search` command
- Select articles from results
- Customize share messages before sending

## Integrations: Drift

Drift (conversational messaging) integrates with Document360 knowledge base. Support agents share relevant articles directly in Drift chats, improving response time.

## Integrations: Microsoft Teams - FAQs

Teams doesn't have built-in Knowledge base, but integrates platforms like Document360. Share articles, links, or files directly in chats or posts. Add Teams extension for non-readers using API token.

## Integrations: Zapier - Setup

Integrate Document360 with other apps using Zapier:
1. Need Zapier account and connected account in other app
2. Zapier automates workflows (Zaps) between applications
3. Refer to Zapier's getting started guide

## Integrations: Drift - Setup

1. Get JavaScript code from Drift dashboard
2. Paste code into Document360's Custom CSS & JavaScript section
3. Connect Document360 to Drift via Extensions section
4. Authorize
5. Use /doc360 slash commands to search and share articles

## Integrations: Zapier - Use Cases

Zapier connects Document360 to various applications:
- Google Docs, Sheets, Drive
- Trello, GitHub, Confluence
- CRM platforms (Zoho, Pipedrive, Hubspot, Asana, monday.com)
- Typeform, email (Gmail, Mailchimp)

Automates document management and task execution.

## Integrations: Zapier - Google Docs (Trigger)

Automate content flow from Google Docs to Document360:
1. Connect platforms via Zapier
2. Map Google Docs fields to Document360
3. Test connection
4. Configure trigger events in Google Docs
5. Create new articles in Document360 automatically

## Integrations: Zapier - Google Sheets

Automate syncing Document360 article additions to Google Sheet:
1. Connect Document360 and Google Sheets via Zapier
2. Create Zap that triggers on new articles
3. Automatically add details to specified Google sheet
4. Requires sign-in to both accounts
5. Select trigger/action events and map columns
6. Re-selection needed if sheet names change

Business and Enterprise plans support this feature.

## Integrations: Zapier - Zap Management

To delete a Zap:
1. Go to Zapier dashboard
2. Locate desired Zap
3. Click arrow or actions icon
4. Select "Turn off and delete Zap"

## Integrations: Zapier - Google Drive

Document360 integration with Google Drive enables seamless file access, linking, management, and sharing.

## Integrations: Zapier - Google Sheets FAQ

**How is a spreadsheet different from a worksheet?**

Spreadsheet is the overall file in Google Drive. Worksheet is a specific tab within that file.

## Integrations: Zapier - Trello

Automate documentation task management:
1. Connect Trello and Document360 via Zapier
2. Sync article publishing events to Trello cards
3. Include attributes (content, contributor, publish date)
4. Configure triggers and actions via Zapier

## Integrations: Zapier - GitHub

Automate Document360 content creation from GitHub commits:
1. Connect GitHub via Zapier trigger
2. Connect Document360 via API token
3. Map fields (Title, Content, Version, Language, Category, Publish Status)
4. Test Zap
5. Activate for automatic synchronization

## Integrations: Zapier - Confluence Server

Automate content synchronization between Confluence Server and Document360:
1. Create Zap with Confluence Server as trigger ("New Page or Blog Post")
2. Set Document360 as action ("Create Article")
3. Authenticate accounts and generate Document360 API token
4. Customize by mapping workspace, language, category, publish status
5. Test integration for seamless article creation

## Integrations: Zapier - Zoho CRM

Automate knowledge base article creation when new leads/contacts added in Zoho CRM:
1. Connect Zoho CRM as trigger, Document360 as action
2. Configure API tokens
3. Map fields (version, language, article, publish status)
4. Test and publish Zap

## Integrations: Zapier - Pipedrive Plan Support

<table>
<thead>
   <tr>
      <th>Professional</th>
      <th>Business</th>
      <th>Enterprise</th>
   </tr>
</thead>
<tbody>
   <tr>
      <td></td>
      <td>✓</td>
      <td>✓</td>
   </tr>
</tbody>
</table>

Integrate Pipedrive with Document360 using Zapier extensions. Automate CRM and knowledge base processes.

## Integrations: Zapier - HubSpot

Automate support ticket resolution by creating Document360 articles from new HubSpot tickets:
1. Connect HubSpot and Document360 accounts in Zapier
2. Map fields (ticket title/description, workspace, language)
3. Test and activate Zap
4. Use Document360 API token for connection

## Integrations: Zapier - Asana

Automate adding Asana-created articles to Document360 Knowledge Base:
1. Connect Asana and Document360 accounts
2. Map article fields (title, content)
3. Configure trigger/action in Zapier
4. Test and publish
5. Obtain API tokens
6. Select Asana project/workspace
7. Choose Document360 location for article

## Integrations: Zapier - Monday.com

Automate transferring content from Monday.com to Document360:
1. Connect both platforms via API tokens
2. Map necessary fields (title, content, etc.)
3. Test automated article creation
4. Publish Zap for continuous content flow

## Integrations: Zapier - Typeform

Automate transferring Typeform responses to Document360:
1. Connect accounts
2. Map Typeform fields to Document360 article attributes
3. Generate API token
4. Test and publish Zap

Streamlines knowledge base updates.

## Integrations: Zapier - Gmail (Notification)

Automatically notify stakeholders of new Document360 articles via Gmail:
1. Connect Document360 and Gmail via Zapier
2. Configure email settings (recipients, subject, body)
3. Set up trigger (new article creation) and action (email sending)
4. Test and publish Zap

Customize email contents and attachments for each notification.

## Integrations: Zapier - Mailchimp

Integrate Document360 with Mailchimp marketing campaigns:
1. Configure trigger (Document360 updates) and action (Mailchimp campaigns)
2. Map audience, subject, and email content fields
3. Generate Document360 API token
4. Test and publish Zap

Automatically communicates new/updated content to Mailchimp subscribers.

## Integrations: Make - Setup

To integrate Make with Document360:
1. Need Make account and account in other app
2. Make creates automation workflows (Scenarios) between platforms

## Integrations: Make - Use Cases

Document360 integrates with popular tools using APIs:
- Asana, Monday.com, Typeform, Google Docs, Jira

Enables seamless document management and workflow automation across platforms. Connects document creation/management activities with tasks, projects, and workflows in integrated applications.

## TLDR

**CSS Customization**: Add custom CSS in Settings for table styling and image alignment. Enterprise plan offers full customization.

**Redirect Rules**: Manage redirects in Settings > Article redirect rules. Import/export via CSV, filter by URL or date.

**Article Settings**: Configure headers, search, and engagement features site-wide. Enable follow buttons, read time, contributors.

**Smart Bars**: Create customizable banners for announcements. Set visibility rules by URL, IP, language.

**User Feedback**: Enable article liking/disliking with 30-day undo window. Only available in KB Site 2.0.

**Integrations**: Connect third-party tools via Settings > Integrations. Use API tokens for chat, analytics, and automation platforms.

**Ticket Deflectors**: Reduce support tickets by routing users to self-service resources. Available in Business/Enterprise plans.

**Zapier Automation**: Streamline workflows between Document360 and 20+ apps. Create Zaps for content sync, notifications, and data transfer.

**Helpdesk Integration**: Connect with Freshdesk, Zendesk, Salesforce, Intercom. Search and create articles directly in support platforms.

**Compliance**: Add cookie consent banners for GDPR compliance. Customize messaging and appearance.### Integrations: Make - Asana

Connect Asana to Document360 via Make to automate project management tasks. Create Make scenarios that trigger on Asana events (like new tasks) and generate corresponding articles in Document360. Available across Professional, Business, and Enterprise plans.

### API Management: Generating API Keys

Create API keys under **Settings > Knowledge base portal > Extensions > Team collaboration**. Click **Connect** on the Make extension to generate a token. Copy and securely store this token for use in Make integrations.

### Integrations: Make - Monday.com

Link Monday.com to Document360 through Make extensions. Automate content creation workflows by connecting Monday.com boards to Document360 articles. No detailed implementation steps provided.

### Integrations: Make - Typeform

Automate article creation in Document360 from Typeform submissions. Configure a Make scenario by connecting Typeform (select form and fields) with Document360 (use API key). Map form responses to article title and content. Test and activate the scenario.

### Integrations: Make - Asana Setup

1. **Log into Make** and create a new scenario
2. **Add Asana module**: Select "Watch Tasks" and connect your Asana account
3. **Configure trigger**: Set filters (project, workspace) and task parameters
4. **Add Document360 module**: Choose "Create article" action
5. **Connect Document360**: Use API token from **Settings > Extensions > Team Collaboration**
6. **Map data**: Define how Asana fields translate to Document360 article properties
7. **Test scenario**: Verify task-to-article conversion works correctly
8. **Activate**: Enable automatic runs every 15 minutes

### Integrations: Make - Monday.com Setup

Connect Monday.com to Document360 using Make:
- Set up a scenario in Make
- Authenticate both platforms using their API tokens
- Link modules to define trigger actions
- Test the integration
- Schedule and activate for continuous operation

### Integrations: Make - Google Docs

Planned integration across all plans. Feature will allow seamless access and embedding of Google Docs within Document360. Implementation details pending.

### Integrations: Make - Jira

Integrate Jira with Document360 using Make scenarios:
- Create a new scenario in Make
- Connect both platforms via API tokens
- Map Jira task fields to Document360 article attributes
- Configure triggers for automatic article creation
- Test thoroughly and schedule for continuous operation

### Integrations: Chrome Extension - Features

Access knowledge base content directly from Chrome:
- Quick launch assistant with customizable positioning
- **Page Help** tab: Search and view articles in reader mode
- **Knowledge base** tab: Browse full article tree in reader view

### Integrations: Chrome Extension - Setup

1. **Install**: Search "Document360" in Chrome Web Store and add extension
2. **Manage**: Go to Chrome > Extensions > Manage Extensions
3. **Configure API key**:
   - Click Document360 icon in toolbar
   - Enter API key in side window
   - Get key from **Settings > Knowledge Base Portal > Extensions**
   - Copy "Internal Integration Token" and paste into extension

### Integrations: Chrome Extension - Uninstallation

Remove via Chrome Web Store page or right-click extension icon and select "Remove from Chrome."

### Integrations: Crowdin

Localization integration with plan restrictions:
- **Professional**: Not supported
- **Business**: Available as add-on
- **Enterprise**: Included
- Requires Crowdin account

### Integrations: Crowdin - Setup

1. Create Crowdin enterprise project matching your Document360 project
2. Generate Document360 API token
3. Obtain Crowdin API token
4. Configure both tokens in respective platforms
5. Sync categories/articles ensuring project names match

### Integrations: Crowdin - Pushing Updates

Push content updates directly from Document360 to Crowdin:
- Only synced articles/categories eligible
- View translation progress in Crowdin
- Collaborate on translations within Crowdin
- Timestamps track translation activities

### Integrations: Phrase

Enterprise-only translation service:
- High accuracy multilingual content
- Speed and scalability optimization
- Potential resource savings
- Improved customer engagement

### Integrations: Phrase - Setup

1. Go to **Settings > Knowledge base portal > Extensions**
2. Connect to Phrase using API token
3. Create new configuration selecting workspaces
4. Choose languages and articles for translation
5. Monitor translation status (Yet to initiate, In Progress, Translated, Failed)

### Localization: Language Configuration

Set default language and script direction:
- Navigate to workspace settings
- Choose language from supported options
- Toggle LTR/RTL script direction
- Save configuration

### Localization: Getting Started

Document360 supports localization across all plans:
- Translate content to multiple languages
- Customize text, visuals, and cultural elements
- Choose manual or machine translation (requires human review)
- Use single multilingual workspace recommended
- Track engagement metrics to measure success

### Localization: Multilingual Setup

Two approaches available:
- **Single project**: Multiple languages in one workspace
- **Multiple projects**: Separate knowledge bases per language

### Localization: Adding Languages to Version

Method 1: Edit existing workspace to add languages
Method 2: Create new workspaces for each language
- Both require manual translation effort
- Set default languages and customize display names
- Configure right-to-left script support
- Hide or delete languages (except default)

### Localization: Supported Languages

Document360 supports 48 languages including:
- Major languages: English, Spanish, French, Chinese, Japanese, Korean
- Regional variants: English (US/UK), Chinese (Simplified), Portuguese (Brazil)

### Localization: Customizing Localization Variables

Tailor interface text per language:
- Access via **Settings > Knowledge Base Portal > Localization Variables**
- Edit variables in accordion sections (Eddy AI, Accessibility, etc.)
- Updates take up to 15 minutes due to caching
- Each language requires separate manual updates

### Content Organization: Workspaces

Specialized documentation areas within projects:
- Organize by audience (internal/external) or product lines
- Plan limits apply to workspace quantity
- Improve content organization and management

### Content Organization: Workspace Benefits

- Targeted content delivery to specific audiences
- Better organization structure
- Enhanced team collaboration through peer reviews

### Content Organization: Getting Started with Workspaces

Document360 creates default workspace ("v1") automatically. Multiple workspaces help:
- Streamline documentation processes
- Target content to specific user groups
- Improve access to relevant information

### Content Organization: Workspace Use Cases

- **Product-specific docs**: Separate workspaces for different SaaS products
- **Audience segmentation**: Dedicated spaces for developers, end-users, admins
- **Internal/external separation**: Controlled access for support teams vs customers

### Content Organization: Adding New Workspaces

1. Go to **Settings > Knowledge base portal > Localization & Workspaces**
2. Click **Add workspace**
3. Choose type and enter name (30 char max, alphanumeric + hyphens)
4. Customize URL and select status (Main, beta, public, deprecated)
5. Configure languages (default, display name, RTL support, visibility)

### Content Organization: Troubleshooting Workspace Issues

404 errors typically caused by:
- Private workspace status
- No published articles
- Hidden articles
- Ensure workspace is public and contains visible content

### Billing: Purchasing Additional Workspaces

1. Navigate to **Settings > Knowledge base portal > Localization & Workspaces**
2. Click **buy more** (Owner role required)
3. Adjust workspace count in Purchase add-on window
4. Confirm payment and download invoice

### Data Management: Backup and Restore

Automatic daily backups at 00:00 UTC. Manual backups also supported:
- Restore documentation, API docs, homepage builder
- Recover custom CSS/JavaScript
- Backups retained for 90 days

### Data Management: Creating Manual Backups

1. Go to **Settings > Knowledge base portal > Backup and Restore**
2. Click **New backup**
3. Enter backup name
4. Click **Backup** to start process

### Data Management: Restoring from Backup

1. Navigate to **Settings > Knowledge base portal > Backup & Restore**
2. Select desired backup
3. Choose elements to restore (documentation, API, homepage, CSS/JS)
4. Compare CSS/JS versions before restoring
5. Click **Restore** and confirm

### Data Management: Restore Options

- Select specific components or restore everything
- Preview before finalizing restore
- Automatic backups daily, 90-day retention
- Compare and copy code snippets for CSS/JS

### Notifications: Overview

Real-time alerts for knowledge base changes across all plans:
- Email, Slack, Teams, webhook channels
- Keep project managers informed of team modifications
- Automate information sharing between applications

### Notifications: Configuring Notification Channels

Set up channels under **Settings > Knowledge base portal > Notifications**:
- Webhook, Slack, Teams, SMTP (email)
- Pre-configured SMTP cannot be deleted but is customizable
- Add, edit, or delete notification channels

### Notifications: Webhook Notifications

Send real-time updates about knowledge base changes to external applications:
- Configure with friendly name, request method, URL
- Add headers and authorization if needed
- Map specific events to trigger notifications

### Notifications: Slack Notifications

Configure Document360 to send article updates directly to Slack channels:
- Create Slack app with incoming webhooks enabled
- Copy webhook URL to Document360 settings
- Map specific notifications in Notification Mapping

### Notifications: Microsoft Teams Notifications

Receive knowledge base updates in Teams channels:
1. Create Teams channel for notifications
2. Add incoming webhook and copy URL
3. Configure in Document360 notification settings
4. Test setup by triggering sample notification

### Notifications: SMTP Notifications

Send email alerts for knowledge base changes:
- Configure SMTP channel with descriptive name
- Add recipient emails (semicolon separated)
- Map events to trigger email notifications

### Notifications: Notification Event Types

Monitor events across modules:
- **Documentation**: Article updates, visibility changes, workflow status
- **Drive**: File/folder modifications
- **Portal settings**: Workspace updates, tag changes
- **Site**: User feedback and interaction alerts
- **AI**: Credit usage notifications
- **Analytics**: Weekly metrics reports
- **Comments**: Inline comment alerts

### Notifications: Notification Mapping

Configure alerts for different user roles across all plans. Map events to notification channels to automate updates without manual checking.

### Notifications: Mapping Channels to Events

Enable notifications by:
- Toggling on specific modules/events
- Assigning notification channels to each event
- All events start disabled by default

### Notifications: Notification History

Track delivery status of all notifications:
- View channel name, delivery status, timestamps
- Review content sent to users
- Monitor and troubleshoot failed deliveries

### Notifications: Custom Email Domains

Enterprise feature requiring DNS configuration:
1. Add domain in Document360 settings
2. Obtain MX/TXT records
3. Add records to DNS provider
4. Verify configuration
5. Specify "From" email and sender name

### API Integration: Postman Setup

Import Document360 API into Postman:
- Use URL: `https://apihub.document360.io/swagger/v2/swagger.json`
- Get API token from **Settings > Knowledge Base portal > API tokens**
- Create Postman environment variable `base_URL` with API hub URL
- Re-authenticate when sessions expire

### API Integration: Swagger Documentation

API authentication requires token. Core methods:
- `GET`: Retrieve data
- `POST`: Add new items
- `PUT`: Update existing items
- `DELETE`: Remove items
- Required fields use underscores (e.g., `email_id`)

### Search: Full Portal Search

Search across all project content simultaneously:
- Articles, files, tags, users, settings
- All workspaces and languages included

### Search: Article Search

Find articles across all workspaces and languages:
- Results show title, workspace, language, status
- Use filters to refine search results
- Preview articles in search results

### Search: Article Search Filters

Refine article searches by:
- Workspace/language
- Visibility (Visible, Hidden, None)
- Status (New, Draft, Published, None)
- Contributors (username search)
- Tags (multi-select)
- Updated date (7 days to custom ranges)

### Search: Drive File Search

Search all Drive files within a project:
- Results show filename, dependencies, size, tags
- Filter by status, file type, uploader, dates
- View file details and usage dependencies

### Search: Users and Groups Search

Search team accounts and reader groups:
- Results categorized as team or reader entities
- View permissions and associated members
- Detailed information available per entry

### Search: User and Group Search Filters

Filter by:
- **Type**: Team account, Reader, Groups (default: All entity)
- **Last logged in**: 7 days to custom ranges (default: All)

### Search: Tag Search

Search and view knowledge base tags:
- Results include dependency information
- Click tags for detailed usage data
- Remove dependencies or download associated files

### Search: Settings Search

Quickly find portal settings:
- Search by keyword across all setting categories
- Results show setting names with descriptions
- Direct access to configuration pages

### Site Configuration: Custom Domain Mapping

Replace default `project-name.document360.com` with custom domain:
- Improves branding and user experience
- Configure under **Settings > Knowledge base site > Custom domain**
- New projects use project name as default

### Site Configuration: Setting Up Custom Domains

1. Add domain in Document360 settings
2. Create CNAME record at domain registrar
3. Verify configuration in Document360
4. Address "Deceptive site ahead" warnings via Google Safe Browsing

### Site Configuration: Custom Domains for Apex Domains

Use root domain with Document360:
- Requires DNS flattening support from registrar
- Use alternative DNS providers (like Cloudflare) if unsupported
- Custom SSL certificate provided, requires 90-day renewal

### Site Configuration: Subfolder Hosting

Host knowledge base at subdirectory path (e.g., `example.com/docs`):
- Navigate to **Settings > Knowledge base site > Custom domain**
- Enable subfolder hosting and set custom path
- Configure Site API path for KB Site 2.0

### Site Configuration: Load Balancer

Upgrade for better performance and security:
1. Go to **Settings > Knowledge base site > Custom domain**
2. Click **Upgrade** on load balancer option
3. Verify configuration and copy CNAME record
4. Set CNAME at domain registrar
5. Re-verify in Document360

### Site Configuration: Web Server Integration

Configure reverse proxy for subfolder hosting:
- **Nginx**: Add location blocks with proxy_pass directives
- **Apache**: Enable modules and configure VirtualHost
- **IIS**: Install ARR and URL Rewrite modules
- **ASP.NET Core**: Configure proxy routing with proper paths

### Site Configuration: Post-Configuration Steps

Avoid duplicate content issues:
- Set up redirect from original Document360 URL to custom domain
- Configure canonical URL in portal settings
- Contact support for redirect implementation

### Site Configuration: Troubleshooting

Common issues and fixes:
- **Invalid location directives**: Ensure blocks within server context
- **Certbot unavailable**: Enable EPEL repository first
- **Configuration test failures**: Check syntax and missing semicolons
- **SSL certificate problems**: Verify with OpenSSL

### User Management: Reader Self-Registration

Enable public reader account creation:
- Available for Business and Enterprise plans
- Private/Mixed site access required
- Users verify email once for cross-project access

### User Management: Configuring Reader Self-Registration

1. Enable feature in Document360 settings
2. Set default reader groups
3. Configure email domain restrictions (allow/block specific domains)
4. Domain-specific groups override default settings

### User Management: Reviewer Role

Content review without editing privileges:
- **Professional**: 5 accounts
- **Business**: 10 accounts
- **Enterprise**: 20 accounts
- View drafts, add comments, update workflow status

### User Management: Creating Reviewer Accounts

Two methods:
- **Individual**: Select "Reviewer" role during account creation
- **Bulk**: Import via CSV with proper role designation

### User Management: Reviewer Permissions

- Access Documentation module in draft/workflow states
- Add inline/general comments
- Update workflow status and due dates
- Assign and manage article workflows
- Cannot edit content directly
- One reviewer per article at a time

### User Management: Managing Reviewers

Edit/delete reviewer accounts under **Team accounts & groups**:
- Convert between reviewer and reader roles
- Purchase additional reviewer add-ons via billing
- Set content access permissions during conversion

### User Management: Password Security

Requirements:
- Minimum 8 characters
- At least one uppercase letter
- At least one lowercase letter
- At least one number
- At least one special character

Account lockout after 5 failed attempts for 30 minutes.

### User Management: Password Reset

1. Click "Forgot password?"
2. Enter email address
3. Check inbox for reset link
4. Set new password
5. Changes apply account-wide

### Access Control: Blocking Inheritance

Override inherited permissions for granular access control:
- Selective access to workspaces, languages, categories, articles
- Remove inherited permissions to isolate access
- Administrator controlled feature

### Access Control: Enabling Inheritance

1. Navigate to category/article in Documentation
2. Access Security settings via More icon
3. Toggle off **Block inherited account**
4. Confirm and close settings

### Security: IP Restriction

Control access by IP address:
- IPv4 and IPv6 support
- Allow or block specific addresses/ranges
- Applies project-wide to all workspaces

### Security: Managing IP Restrictions

1. Go to **Settings > User & Security > IP Restriction**
2. View existing IP rules
3. Add new IPs with friendly names
4. Set allow/block permissions
5. Remove duplicate entries to avoid conflicts

### Authentication: Single Sign-On (SSO)

Access Document360 with existing identity provider credentials:
- Eliminates multiple password management
- Supported via SAML 2.0 and OpenID Connect
- Available across Professional, Business, and Enterprise plans

### Authentication: SSO Process

Workflow:
1. User accesses Document360
2. Redirected to Identity Provider (IdP)
3. Authenticate with IdP credentials
4. IdP sends access token to Document360
5. Automatic login to knowledge base

### Authentication: Supported Identity Providers

Document360 supports:
- Okta
- Microsoft Entra ID
- Google Workspace
- Auth0
- ADFS
- OneLogin
- Custom SAML/OpenID providers

### Authentication: SAML Configuration

1. Navigate to **Settings > Users & Security > SAML/OpenID**
2. Click **Create SSO**
3. Select Identity Provider
4. Enter SAML details (Sign-on URL, Entity ID, certificate)
5. Configure optional settings
6. Complete setup

### Authentication: OpenID Connect Configuration

1. Go to **Settings > Users & Security > SAML/OpenID**
2. Select OpenID configuration
3. Enter IdP details from discovery document
4. Configure redirect URIs
5. Set optional features
6. Complete integration

### Authentication: IdP-Initiated Sign-In

Enable direct login from identity provider dashboard:
1. Edit SSO configuration
2. Toggle on **Allow IdP initiated sign-in**
3. Users access via dedicated IdP URL
4. Automatic authentication through existing credentials

### Authentication: SSO Idle Timeout

Enhance security by auto-logging out inactive accounts:
1. Edit SSO configuration
2. Enable **Sign out idle SSO team account**
3. Set timeout duration (hours:minutes)
4. Save settings
- Applies only to SSO team accounts

### Authentication: Troubleshooting SSO

Common fixes:
- **SAML errors**: Update expired certificates
- **Attribute mapping**: Verify email/name field alignment
- **OpenID errors**: Check issuer URL from discovery document
- Contact support with configuration screenshots when needed

### User Management: SSO Account Conversion

Convert existing accounts to SSO:
1. Select accounts for conversion
2. Click **Convert to SSO account**
3. Confirm conversion
- Previous contributions appear as "Anonymous"
- Cannot convert SSO accounts back to regular accounts### Authentication: Obtaining an Okta Account

An Okta account is required to configure Single Sign-On (SSO) with Document360. If you don't already have one, sign up at [Okta Developer Sign-Up](https://developer.okta.com/signup/).

### Authentication: Setting Up OpenID Connect SSO with Okta

To configure Single Sign-On (SSO) between Document360 and Okta using OpenID, you need administrative access to Okta. Only users with **Owner** or **Admin** as their **Project role** in Document360 can set up SSO. Open both Document360 and Okta in separate tabs or browser windows for easier configuration.

### Authentication: Creating an Auth0 Application

Log in to Auth0, navigate to Applications, create a new application, specify the name, select "Regular Web Application" type, and click create.

### Authentication: Configuring Auth0 OpenID

To configure Auth0 OpenID with Document360:
1. Navigate to Document360 settings
2. Choose "OpenID" as the protocol
3. Enter the Auth0 "Sign in redirect URI" and "Sign out redirect URI" in Document360's corresponding fields
4. Save the changes

### Authentication: Configuring Document360 for Okta OpenID

Configure Document360 SSO by entering Okta's Client ID, Client Secret, and Issuer URI in the Identity Provider settings. Enable or disable IdP-initiated sign-in based on project needs. In More Settings, customize the SSO name, login button text, auto-assign reader groups, idle sign-out, and SSO invitations. Complete by saving the configuration.

### Authentication: Setting Up OpenID Connect SSO with Auth0

To integrate Auth0 with OpenID SSO in Document360, an Auth0 account is required. Configuration is limited to users with Owner or Admin project roles. Use separate tabs for Auth0 and Document360 during setup.

### Authentication: Setting Up OpenID Connect SSO with ADFS

To configure SSO between Document360 and ADFS using OpenID, ensure you have administrative access to both systems. Document360 users with Owner or Admin project roles can configure this. Open both Document360 and ADFS in separate browser windows during setup.

### Authentication: Configuring Document360 as an OpenID SP - ADFS

Configure Document360 with ADFS for SSO using OpenID:
1. Obtain subdomain, sign-in/sign-out URIs from Document360
2. Enter these into ADFS Relying Party settings (Relying Party Identifier, Sign-On URL, Sign-Out URL)
3. Complete the ADFS setup wizard
4. Review settings and enable user access

### Authentication: Configuring ADFS Claim Rules

Configure claim rule to send LDAP attributes as claims:
1. Select "Send LDAP Attributes as Claims" template
2. Map LDAP attributes:
   - User-Principal-Name to Name ID
   - E-Mail-Addresses to Email
   - Display-Name to Name
3. Use Active Directory as the attribute store
4. Click "Finish" and "Apply" to save

### Authentication: Adding an ADFS Application for OpenID

Log in to the ADFS Management console, navigate to Relying Party Trusts, and add a new Relying Party Trust. In the wizard:
1. Select "Claims aware"
2. Choose to enter data manually
3. Provide a display name
4. Optionally configure a certificate (can skip if not needed)

### Authentication: Configuring Document360 with ADFS

To configure OpenID SSO in Document360:
1. Navigate to the **Configure the Identity Provider (IdP)** page
2. Enter the **Client ID** and **Client Secret** from ADFS
3. Ensure the **Client Identifier** matches the **Relying Party Identifier** in ADFS
4. Toggle **Allow IdP initiated sign in** based on project needs
5. Enter the **Issuer URL** from ADFS as the **Authority**
6. Configure **More settings**:
   - **SSO Name**: Enter a descriptive name
   - **Customize login button**: Provide user-friendly text
   - **Auto assign reader group**: Enable/disable based on access policies
   - **Sign out idle SSO team account**: Set according to security requirements
   - Choose to invite existing users to SSO
7. Click **Create** to complete configuration

### Authentication: OpenID Connect SSO with Other IdPs

To configure SSO with an unlisted OpenID Identity Provider in Document360, users with Owner or Admin Project roles need access to both Document360 and the chosen IdP. Keep both systems open in separate browser tabs.

### Authentication: Configuring OpenID in Your IdP

Configure OpenID in your IdP:
1. Access Document360's SSO settings
2. Select "Others" as IdP and choose "OpenID"
3. Document360 provides the Subdomain name and Redirect URIs
4. Include scopes: _openid_, _email_, and _profile_
5. Map claims: _sub_, _email_, _name_
6. Review and save your configuration

### Authentication: Configuring Document360 for OpenID SSO

Configure Document360 SSO:
1. Provide Identity Provider Client ID, Secret, and Authorization URL
2. Enter SSO name and custom login text
3. Enable/disable auto-assignment of reader groups and IdP initiated logins
4. Upload certificates/keys where needed
5. Click 'Create' to finalize

### Authentication: Adding an Application in Your IdP for OpenID

To create a new OpenID application in your Identity Provider:
1. Log in to the admin console
2. Navigate to Applications or Enterprise Applications
3. Create a new application
4. Name it (e.g., "Document360 OpenID SSO")
5. Select OpenID Connect as the sign-in method
6. Save settings

### Enterprise SSO using JWT

Document360's JWT SSO uses a customer application for user authentication:
1. User logs in to customer app
2. Customer app requests auth code via backchannel from Identity Provider (using client credentials)
3. Document360 receives auth code and requests ID/access tokens
4. Document360 creates session with automatic renewal (5-1440 minutes)
5. No separate Document360 reader account required

### Authentication: Removing an OpenID SSO Configuration

Delete an SSO configuration in Document360:
1. Access project Knowledge base
2. Navigate to Settings > Users & security > SAML/OpenID
3. Hover over SSO configuration to reveal Delete icon
4. Confirm deletion (removes associated user accounts)

### Authentication: JWT SSO Configuration

Configure JWT SSO:
1. Create JWT under Settings > Users & security > JWT
2. Copy Client ID, Callback URL, and Client secret
3. Enable/disable JWT SSO login
4. Configure login URL
5. Set up redirection using `redirectUrl` parameter
6. Note: Client secret is only available once and must be regenerated if lost

### Authentication: Setting Up JWT SSO

To set up JWT-based SSO in Document360:
1. **Understand JWT**: JSON Web Token transfers authentication data between applications (header, payload, signature)
2. **Generate JWT**: Include claims (user ID, email) and set expiration time
3. **Configure Secret Key**: Use strong key for signing, shared with Document360
4. **Set Up Redirect Flow**: Redirect users to login page, then back with token
5. **Test**: Validate authentication flow
6. **Consult Documentation**: Refer to Document360 API documentation

### Troubleshooting: Resolving 401 Unauthorized Error in JWT Testing

To resolve 401 Unauthorized error during JWT testing in Postman:
1. **Authorize**: Set authorization type to Basic Auth, enter Client ID/Secret
2. **Verify Format**: Set Body to raw JSON, include required parameters
3. **Confirm Credentials**: Double-check Client ID and Secret
4. **Check Endpoint**: Verify correct token endpoint URL
5. **Inspect Response**: Examine error details in response body
6. **Review Configuration**: Confirm credentials are registered server-side

### Authentication: JWT Reader Groups

JWT reader accounts can link to existing Document360 reader groups, inheriting restriction settings. Available across Free, Professional, Business, and Enterprise plans.

### User Management: Finding Reader Group IDs

For JWT SSO projects, find Reader group IDs in **Settings > Users and Security > Readers & groups**. Each group displays a **Group Id** with copy icon. Available only for JWT-configured projects.

### Authentication: Using JWT Reader Groups

Configure JWT reader access:
1. Provide user details (name, email)
2. Include reader group IDs in JSON format
3. Use comma-separated IDs in `readerGroupIds` array
4. Note: Changes apply after current JWT session expires
5. Minimum token validity: 5 minutes, maximum: 1 day
</document_content>
</document>

# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/docs/d364.py
# Language: python

import re
from pathlib import Path
from rich import print
from typing import NamedTuple, List
from dataclasses import dataclass

class MarkdownSection:

def split_heading((heading: str)) -> tuple[str, str]:

def process_markdown((content: str)) -> List[MarkdownSection]:

def generate_output((sections: List[MarkdownSection])) -> str:

def main(()):


<document index="23">
<source>docs/d365.json</source>
<document_content>
[
  {
    "heading": "Introduction",
    "text": "## Introduction\n\n### Introduction\n\nDocument360 is a knowledge management platform enabling creation and curation of public, private, or mixed-access knowledge bases. Key features include My Projects, Knowledge base portal/site, and Document360 AI (Eddy AI) for interacting with the platform.",
    "summary": ""

... (Data file content truncated to first 5 lines)
</document_content>
</document>

<document index="24">
<source>docs/d365.md</source>
<document_content>
# Document360 Overview

## Introduction

Document360 is a knowledge management platform for creating and managing public, private, or mixed-access knowledge bases. Key features include project management, knowledge base portals, and Eddy AI for platform interaction.

## Key Components

### Knowledge Base Portal

The portal lets you create, manage, and configure knowledge base sites. Core functions include:
- Creating and managing categories, articles, and templates
- File, team, and reader management
- Branding, domain, and security configuration

The portal provides a dashboard (project overview, contributions), documentation tools (tree-view structure, bulk actions), API documentation, analytics, in-app search widgets, cloud storage (Drive), settings, and universal search across projects.

### Knowledge Base Site

End-users access articles through the knowledge base site. Three access levels:
- **Public**: Open to everyone
- **Private**: Login required
- **Mixed**: Combination of public and private content

A preview screenshot shows the site interface.

## Getting Started

### Account Creation

Create an account by navigating to the signup page.

### Signing Up

1. Provide basic details and verify email with a 6-digit code (5 failed attempts lock access)
2. Set password meeting security criteria
3. Choose primary use case (knowledge base, software documentation, etc.)
4. Select up to two templates
5. Personalize with URL and brand guidelines
6. Set privacy (Private, Public, Mixed)
7. Complete setup to access portal with pre-loaded content

A free trial is available, with paid plans afterward. FAQs cover language support, plans, verification issues, migration, and post-trial data access.

## System Requirements

### Hardware
- **OS**: Windows 10+, macOS High Sierra+, Ubuntu 18.04+
- **Processor**: Dual-core, 2 GHz+
- **RAM**: 4 GB minimum, 8 GB recommended
- **Disk Space**: 500 MB available
- **Graphics**: Integrated graphics (dedicated GPU recommended)
- **Network**: Stable connection with TLS 1.2+, ports 80/443 open
- **Dependencies**: Java 8+, .NET 4.7.2+
- **Security**: HTTPS required, SAML for SSO

### Software
- **Browsers**: Chrome 90+, Firefox 88+, Safari 13+, Edge 90+
- **Plugins**: Adobe Acrobat for PDF viewing
- **Resolution**: 1280x720 minimum
- **JavaScript/Cookies**: Must be enabled
- **Mobile**: Responsive design for iOS/Android

### Additional Requirements
- Tested on VMs and physical hardware
- Auto-update feature available
- Screen reader compatible, keyboard navigation supported

## Project Management

### My Projects Dashboard

Shows all projects you own, belong to teams, or have reader access. Each project displays a visibility tag (public, private, mixed).

### Navigating Your Projects

The dashboard displays project tiles with:
- Logo, name, access level, settings
- Quick links to documentation/knowledge bases
- Profile management, release updates, help resources

### Project Creation

Projects centralize documentation including articles, categories, home pages, teams, readers, groups, and custom settings.

### Overview Tab

Provides project-level insights for Owners/Admins:
- Contribution metrics (created, published, draft articles)
- Team accounts, readers, storage details
- Issues tracking (broken links, failed searches)
- Last backup date
- Workspace/language filtering

### Creating New Projects

1. **Access Dashboard**: Log in or return via Document360 icon, click **+ Project**
2. **Select Use Case**: Choose from Knowledge Base, Software Documentation, SOPs, etc.
3. **Choose Templates**: Select up to two based on your use case
4. **Personalize**:
   - Enter preferred URL or use default
   - Customize branding (logo, colors, language)
5. **Set Privacy**: Choose Private, Public, or Mixed access
6. **Access Portal**: Enter with pre-loaded articles

### Sandbox Projects

Isolated testing environment for experimenting with features and training teams without affecting live content.

**Creation Steps:**
1. Navigate to **Settings > Knowledge base portal > General**
2. Click **Create Sandbox** in the Sandbox section
3. Configure project name (≤30 characters), language, KB Site 1.0 (optional)
4. Default visibility is Private, click **Next**
5. Optionally invite team members and assign roles
6. Click **Create project** then **Open Sandbox**

**Notes:**
- Sandbox badge indicates test environment
- SSO users cannot create sandboxes
- Custom subdomains possible via domain mapping
- Manual export/import required for migration

## User Interface

### Top-Right Menu

Quick access to profile management, permissions, password changes, updates, and help resources.

**Features:**
- **My profile**: Edit personal info, roles, permissions
- **View access**: Check assigned permissions
- **Change password**: Update credentials securely
- **Release updates**: Latest feature information
- **Help menu**: Documentation, support, system status

### Left Navigation Bar

Sections include Dashboard, Documentation, API Documentation, Analytics, Widgets, Drive, and Settings.

**Categories & Articles** options:
- All articles, Workflow assignments, Starred items
- Recycle bin, Site builder, Content tools
- Site builder redirects to Customize site in Settings

### Article Editor Header

- Article URL/slug reference
- Status display (New, Draft, Published, Stale)
- Contributor information and stats
- Preview functionality
- Title, slug, description editing
- AI Glossary recommendations
- Workflow status updates
- More actions menu (clone, move, hide, delete, SEO, tags, related articles)
- Comments section and full-screen view

## User Profile

### Profile Options

Access via profile picture in top-right corner:
- **My Profile**: Edit image, name, email, bio, language, role
- **View Access/Permissions**: Check portal and content permissions
- **Change Password**: Enter current, create strong new password (8+ characters, mixed case, numbers, special chars)

## Localization

### Multilingual Knowledge Bases

Support for multiple languages improves user experience. Add languages via **Settings > Knowledge base portal > Localization & workspaces**.

**Methods:**
1. Edit workspace and select languages via "New language"
2. Use "Add new language" icon on overview page

Translate content manually or via tools like Crowdin. Non-English languages display in native scripts.

## Content Creation

### Editor Options

Three available editors:
1. **Markdown**: Syntax/HTML customization
2. **WYSIWYG**: Rich text formatting (no custom code)
3. **Advanced WYSIWYG**: Hybrid Markdown/WYSIWYG

### Markdown Editor

Split-screen interface for typing and previewing. Supports consistent formatting for professional documentation.

**Basic Syntax:**
- Headings: `##`, `###`, `####` (space required after #)
- Text styling: bold (`**text**`), italics (`*text*` or `_text_`), strikethrough (`~~text~~`)
- Lists: numbered (`1.`) and bulleted (`*`, `-`, `+`)
- Links: `[text](URL)`
- Blockquotes: `>`
- Horizontal lines: `***`

**Insertion Methods:**
- Upload from local device
- URL insertion
- File picker
- Drag and drop (auto-saves to Drive)

### WYSIWYG Editor

Word-like interface showing exact published appearance. Conversion to WYSIWYG is permanent.

**Features:**
- Text formatting, media insertion
- Code view, undo/redo, find/replace
- Emoticons, alignment options
- Large table support

### Advanced WYSIWYG Editor

Lightweight editor combining Markdown syntax with visual editing. Access commands via `/` key.

**Key Features:**
- Slash commands for content insertion
- Markdown syntax support (must type directly)
- Eddy AI integration
- Content reuse (variables, snippets)
- LaTeX support
- Callouts and private notes

**Switching Editors:**
- Between Advanced WYSIWYG and WYSIWYG: Allowed in Edit mode
- From Markdown to Advanced WYSIWYG: Irreversible
- Project-level defaults set by administrators

## Content Organization

### Categories and Subcategories

Organizational tools grouping articles into logical sections. Best practices: clear naming, maximum 3 subcategory levels, user-centric structure.

**Category Types:**
- **Folder**: Container for articles/subcategories (no URL)
- **Index**: Generates URL, lists articles with details
- **Page**: Functions as article with content creation

Types can be changed anytime without data loss.

### Category Management

**Operations:**
- Create via top-bar "Create", Flywheel, More icon, or within Folder/Index
- Rename directly or via More menu (doesn't change URL slug)
- Delete via four methods (root deletion removes all subcontent)
- Clone with automatic link updating option
- Hide/unhide to restrict team access
- Star for quick access
- Move across workspaces (5 methods, 5 security considerations)

### Drive Integration

**Folder Mapping**: Images upload automatically to Drive folders based on article category/subcategory.

**Linking**: Navigate to category, click "More" > "Set drive folder", select target folder.

## Content Management

### Article Operations

**Creation**: Four methods via Create button, Flywheel, More icon, or folder navigation.

**Editing**: Click Edit (changes status to Draft), make changes, Publish to update live version.

**Renaming**: Navigate to article, click name or More > Rename, enter new name.

**Moving**: Five methods with destination/workspace selection and link updating options.

**Deleting**: Five methods across different navigation contexts. Deleted content goes to Recycle Bin for 30 days.

**Cloning**: Two methods with auto-link updating and security restrictions.

**Replicating**: Copy to multiple categories. Source edits only; replicated settings may be restricted.

### Review Reminders

Alert system for article reviews. Set immediately or future dates (30 days, 3 months, custom).

**Management:**
- Individual articles: Click More > Set reminder
- Bulk operations: Filter stale articles, select multiple, Mark as Reviewed
- Clear reminders: Click "Needs review" tag > Mark as reviewed

### All Articles Feature

Bulk management interface for large-scale operations.

**Filter Options:**
- Status, review reminders, stars, visibility
- Read receipts, contributors, categories
- Dates, tags, labels

**Bulk Actions:**
- Publish, schedule, preview, copy links
- Hide, move, delete, review status updates
- Tagging, machine translation, PDF export

## Content Enhancement

### Media Integration

**Images**: Upload to local device, Drive, or URL insertion. Drag-and-drop auto-saves to Drive.

**Videos**: 
- Embed URLs (YouTube, Vimeo, Wistia)
- Embed code insertion
- Drive video uploads
- SharePoint Stream embedding

**Files**: Upload to Drive, insert via editor tools or drag-and-drop.

### Hyperlinks

**Internal Links**: Connect to other articles or headings within content.

**External Links**: Direct to external resources.

**Email Links**: Use `[text](mailto:email)` format.

**Bookmark Links**: Link to specific headings (H2-H4) within articles.

### Embedding Features

**Google Forms**: Copy iframe embed code and paste into articles.

**Draw.io Diagrams**: 
- Use embed option with generated image tag
- Export as PNG/SVG and upload via Insert Image

## Content Formatting

### Code Blocks

Prism.js syntax highlighting supports HTML, C#, Java, JavaScript, XML, JSON, CSS, SQL, Python, Markdown, PHP, PowerShell, and Text.

**Creation Methods:**
- **Markdown**: Triple backticks or Ctrl+Shift+P
- **WYSIWYG**: Code block icon, language selection, insert
- **Advanced WYSIWYG**: Insert menu, triple backticks + Enter, or /code block

## Collaboration Tools

### Inline Comments

Available in Advanced WYSIWYG editor. Select text, click comment icon, type message. Mention collaborators with @ symbol.

**Management:**
- View by clicking highlighted areas
- Resolve (creator only)
- Edit/delete (comment author only)
- Reply (team accounts)
- Filter by All, Mentioned me, Open, Resolved

### Private Notes

Internal comments visible only to team members or specific reader groups.

**Creation:**
- **Markdown**: `:::(Internal) (Private notes)\nContent\n:::`
- **WYSIWYG**: Private note icon with visibility settings
- **Advanced WYSIWYG**: Slash command or Insert menu

## AI Integration

### Eddy AI Features

- Article writing assistance
- SEO title and description generation
- Tag recommendations
- Related article suggestions
- Article summarization
- Assistive search functionality

## Security

### Infrastructure

Data stored in MongoDB Atlas three-server cluster with encryption. Daily/weekly/monthly backups plus Azure Blob Storage redundancy.

Hosted on Microsoft Azure with DDoS protection and security protocols.

### Content Security Policy (CSP)

Restricts external CSS, scripts, and frames to prevent malicious content.

**Configuration:**
- Specify allowed domains for stylesheets, JavaScript, frames
- Add nonce attributes to custom HTML scripts
- Different implementation levels across plans

### X-Frame Options

Prevents knowledge base embedding in external frames/iframes. Navigate to **Settings > Users & Security > Security** to enable.

### Bot Management

**Detection**: Cloudflare uses heuristics and machine learning to identify traffic patterns.

**Blocking**: Unusual user agents, unsupported ports, suspicious IP/ISP traffic.

**Categories**: 
- **Good Bots**: GoogleBot, BingBot, GPTBot (beneficial purposes)
- **Bad Bots**: DDoS attacks, web scraping, credential stuffing

## Fair Usage Policy

Rate limiting prevents bot traffic and DoS attacks:
- 1,500 requests per minute per IP
- 300 requests per 10 seconds per IP
- Heuristic and machine learning detection

## Compliance

### GDPR

Fully compliant with explicit customer consent for data collection/storage.

## Best Practices

- Secure API keys (don't share, delete compromised immediately)
- Assign minimal necessary permissions
- Use predefined roles for team access
- Regular backups (automatic and manual)
- Set appropriate document visibility levels

## Business Continuity

Geographically replicated databases, multiple service instances, code reviews, QA testing, and version control ensure high availability.

## Troubleshooting

### Common Issues

**Login Problems**: 
- Switch browsers/networks, clear cache
- Check VPN connection, system time
- Provide HAR files/console errors to support

**Broken Images**: 
- Check image URLs in code view
- Ensure images exist at correct paths
- Upload to Document360 Drive for permanence

**CSP Issues**: 
- Update portal CSP settings
- Clear browser cache
- Test across environments
- Contact support with network tab details

**Word Import Errors**: 
- `maxArticlesCountReached`: Check plan limits
- TOC conflicts, firewall blocks, password protection
- Style mismatches between Word and Google Docs

## Content Export

### PDF Generation

Export categories/articles to PDFs with customizable templates. Exclusive to private projects.

Enable via **Settings > Knowledge base site > Article settings**. 500 MB daily limit with add-on capacity available.## Content Management

### Bulk Review Status Updates

Mark multiple articles for review using either method:

**All Articles Method**:
- Go to Documentation > All articles
- Filter by "Stale" under Review reminder
- Select articles, then Mark as Reviewed or set reminder days

**Content Tools Method**:
- Navigate to Documentation > Content tools > Article review reminders
- Create new reminder, specify details
- Use filters (category, contributor, etc.) to select articles

Both update article statuses efficiently.

## Content Optimization

### Excluding Articles from Search

Exclude articles or categories from search engine results to keep sensitive content private. Available across all plans.

### Adding SEO Metadata

- Open article in Knowledge Base portal
- Click More icon > SEO
- Enter meta title (5-60 characters) and description (150-160 characters)
- Use AI generator for articles with 200+ words
- Update titles when article names change
- Manually edit SEO descriptions for each language version

### Excluding from External Search

To block articles from external search engines:
- Open article
- Click More icon > SEO settings
- Check "Exclude from external search engine results"
- Save changes

### Excluding from Internal Search

To hide articles from internal search and Eddy AI:
- Navigate to article or category
- Click More > Article settings
- Under Search Visibility, select:
  - Exclude from knowledge base search
  - Exclude from Eddy AI assistive search
- Save changes

Excluded articles remain accessible via direct URL or navigation menu. Clone articles inherit parent search settings.

## Content Management

### Changing Article Slugs

Update URL slugs via:
1. Portal settings (SEO tab)
2. Article editor

**Important**: Create redirect rules for new slugs to prevent broken links. Special characters require proper encoding—copy URLs directly from the portal.

### Changing Article URLs

Article URLs automatically update when slugs change. Always create redirects to maintain link integrity.

## Content Organization

### Article Tags

Tags help search, filter, and sort knowledge base content. Apply to articles, categories, and drive files (drive tags only visible in knowledge base).

Manage all project tags via the Tags page.

### Adding Tags

- Navigate to portal
- Click More > Tags
- Create or select existing tags
- Generate AI-suggested tags (200+ word articles)
- Save and publish
- Configure article settings for reader access

Tag limits: 30 characters including spaces, specific symbols allowed.

## Content Navigation

### Related Articles

Related articles appear at the bottom of knowledge base articles. Links point only to published articles within the knowledge base—no widget display.

### Adding Related Articles

Add via Knowledge Base portal or Publish checklist:
- Manual selection: Search and add articles
- AI suggestions: 50+ word articles
- Auto relate: Creates mutual relationships

Access restrictions apply to related article visibility.

## Content Organization

### Article Labels

Labels streamline internal content management across Professional, Business, and Enterprise plans. Useful for quickly sorting articles like release notes.

### Adding Labels

Five methods available:

1. **Article Editor**: More > Labels > Add
2. **All Articles**: Select articles > More > Add labels
3. **Workflow Assignments**: Select articles > Add labels
4. **Starred Section**: Select articles > Add labels or hover > More > Add labels
5. **Folder/Category**: Navigate to category > Select articles > Add labels

**Limits**: 
- 10 labels per article
- 10,000 labels per project

**Key Difference**: Tags are public and aid search/navigation. Labels are internal-only for organization.

## Content Enhancement

### Adding Featured Images

- Click More article options > Featured image > Upload
- Use JPEG or PNG (1200x800 to 2000x1200 pixels)
- Improves SEO and link previews

Featured images don't display on articles themselves. Available in Business and Enterprise plans.

### Adding Attachments

- Navigate to article
- More article options > Attachments
- Add URL or upload from Drive
- Select and insert attachments
- Arrange or remove as needed

Attachments appear near Table of Contents and Tags on the knowledge base site.

### Attachment Support by Plan

| Plan | Support | Limit |
|------|---------|-------|
| Professional | Basic | 5MB |
| Business | Standard | 10MB |
| Enterprise | Advanced | 20MB |

## Content Status

### Status Indicators

Articles display status tags ("New", "Updated", "Custom") near titles. Visual indicators help track content changes.

### Manual Status Updates

- Navigate to article
- More article options > Article settings
- Change status
- Customize text via localization variables
- Set color in Article settings
- Specify display duration

### Understanding Article Status

Quickly identify article states (Draft, Needs review) to streamline content management. Readers see update/new indicators.

### Article Statuses

Four article statuses:
1. **New**: Draft articles, team-only access
2. **Draft**: Published articles with draft updates, original remains live
3. **Published**: Publicly accessible
4. **Needs review**: Flagged for contributor or system review

Applies to category pages too.

### Automatic Status Updates

Enable via Settings > Knowledge base site > Article settings & SEO. Turn on "Automatically set article status" in Category manager. Set display duration.

### Hidden Article Status

Hidden articles show strikethrough in portal, inaccessible on knowledge base site. Hide articles in any status. Hidden categories also hide their articles.

### Deprecated Articles

Mark outdated articles as deprecated. Tagging occurs at article/category level. Add custom messages explaining deprecation and linking to updated content.

### Marking Articles as Deprecated

- Navigate to article in Knowledge Base portal
- More icon > Article settings
- Enable Deprecated toggle
- Add formatted reason (optional)
- Save changes

### Bulk Deprecation

- Select multiple articles
- Click Deprecate
- Add reason
- Apply

Visual tags indicate deprecation on knowledge base site.

## Content Structure

### Managing Table of Contents

Control TOC visibility at site or article level. Site-wide settings affect all articles. Individual article settings override for specific articles. Only H2, H3, H4 headings appear—bold text ignored.

## Content Customization

### Article Preferences

- Navigate to article
- More icon > Preferences in Article settings
- Toggle checkboxes for comments, TOC, feedback
- Save changes

Article-specific process. Additional setup required for Disqus integration.

## Content Publishing

### Scheduled Publishing

Schedule publication dates/times for better content planning and consistency.

### Setting Up Scheduled Publishing

- Navigate to article or category
- Select Publish later
- Choose date, time, timezone
- Add comments (optional)
- Schedule

Works for articles and categories.

### Editing Scheduled Publications

- Navigate to article
- Click Scheduled dropdown > Edit schedule
- Modify date, time, timezone
- Add comments (optional)
- Schedule

Optionally publish immediately via dropdown.

### Bulk Scheduled Publishing

- Select multiple articles
- Choose date/time/timezone in Publish later panel
- Schedule

Scheduled articles show "Publish later" icon. Instant publishing available. Cannot edit scheduled articles—cancel schedule first. API publishing disabled. Moving scheduled articles to new workspace clears schedule.

### Cancelling Scheduled Publishing

- Navigate to article
- Click Scheduled dropdown > Cancel
- Confirm with Yes

## Collaboration

### Discussion Feed

Collaborate, review, and discuss articles/categories across plans. Supports peer reviews and approvals.

### Deleting from Discussion Feed

Delete your own comments by hovering and clicking delete icon. Undo available. Feed disables after publication.

### Discussion Feed FAQs

Comments enabled during draft/edit mode, disabled after publishing. Inline comments available in Advanced WYSIWYG editor. Access articles, categories, versions, languages.

## Content Management

### Article Revisioning

Editing creates new unpublished version, preserving old in history until published. Compare/revert versions available. Manual deletion required for old versions. Supports collaboration and audit trails.

### Creating Article Versions

Two methods:
1. Edit published article directly
2. Fork older revision

Both require publishing new drafts.

### Comparing Article Versions

Compare versions with additions/removals highlighted. Swap comparison views, view history, revert versions. Published articles require deletion before reverting. Publication dates auto-generated, unchangeable.

### Article Revision Actions

- **Fork**: Create new version for editing
- **Delete**: Remove unpublished version
- **Open**: Access previous versions
- **Workflow history**: Track stages, assignees, comments, dates
- **Publish**: Make version public

Version details include number, contributor, date, visibility.

### Managing Contributors

- Access contributor list via Article information icon
- Use Manage popup to add (search) or remove contributors
- Assign contributors if none listed
- Contributors persist until team account deletion

### Updating Contributors

Document360 auto-tracks contributors (create, update, publish). Readers view contributors' other articles. Enterprise plan allows manual contributor management.

## Analytics

### Article Analytics

Track article-specific metrics (reads, views, likes, dislikes, link status) across all plans. Data helps optimize content strategy.

### Accessing Article Analytics

- Click More icon in editor > Analytics
- Metrics: Reads (engagement-based, daily updates), Views (unique clicks), Likes, Dislikes, Link Status
- Link validation tool maintains reliable links
- Real-time analytics updates
- Project-wide insights via Go to Analytics

## Content Optimization

### Health Check Metrics

Analyze articles/categories (English only) for readability issues:
- Long sentences
- Missing internal links

Improves content quality and SEO.

### SEO Metrics

Optimize SEO by maintaining:
- Titles (50-70 characters)
- Descriptions (120-160 characters)
- Featured images

Ideal: 1-3 external/internal links. Excess requires review.

Tool categorizes issues as Problems, Suggestions, or Good Work.

### Readability Score

Measures text understandability on 0-100 scale. Higher scores indicate better readability.

### Checking Readability

- Open article
- Click More > Health check metrics
- Expand Readability metrics
- Scores: <30 problematic, 30-59 needs improvement, >59 good

Click Check now for immediate updates.

### Accessing Health Check Metrics

- Navigate to article
- More icon > Health Check Metrics
- Panel includes SEO and Readability metrics
- Categories: Problems (immediate action), Suggestions (improvement needed), Good Work (optimal)
- Click Check now after parameter updates

### Understanding Readability Metrics

- **Readability Score**: 0-100 scale; <30 problems, 30-59 suggestions, >59 good work
- **Paragraph Length**: ≤150 words optimal
- **Sentence Length**: ≤20 words recommended
- **Sub-heading Distribution**: Presence good, absence needs improvement

Metrics exclude LaTeX and code blocks.

## SEO

### Accessing the Sitemap

Manage sitemaps via Settings > Knowledge base site > Article settings & SEO > SEO. Choose update frequency. Submit XML sitemap to Google Search Console.

### Sitemap Support by Plan

| Plan | Support |
|------|--------|
| Professional | No |
| Business | Yes |
| Enterprise | Yes |

Feature limited to public projects.

### Understanding Robots.txt

Controls web crawler access to site content. Prevents indexing of specific files/directories. Text file with site-specific rules.

### Managing Robots.txt

- Navigate to Settings > Knowledge base site > Article settings & SEO > SEO tab
- Click Edit under Robots.txt
- Set crawl rules, block pages/folders, add crawl delays
- Best practices: Include sitemap links, avoid duplicates

## Collaboration

### Public Article Comments

Enable comments via Disqus plugin. Configure integration for automatic activation across articles.

### Enabling Public Comments

- Ensure Disqus integration active
- Navigate to article > More icon > More article options > Preferences tab
- Check Enable feedback
- Save changes

Disable by deselecting checkbox. Removing Disqus disables all comments.

## Content Management

### Read Receipts

Confirm article acknowledgment for important communications. Available in KB site 2.0 for private/mixed projects. Not supported for JWT configured projects.

### Managing Read Receipts

Three management methods:
- Bulk actions on all articles
- Individual article settings
- Category rules in settings

Settings rules take priority. Republishing forces re-acknowledgment.

### Reader Acknowledgment

- Banner prompts acknowledgment
- Scroll to bottom, check box, submit
- Confirmation message displays on success

### Read Receipt Management Page

Interface for managing receipt rules:
- Create rules for Knowledge base categories
- Rearrange by priority
- View/edit rule details
- Modify dependencies
- Edit/delete rules
- Set visibility (Show/Hide)

### Acknowledgment Tracking

Announcement icon on home page indicates pending acknowledgements. Click to access Acknowledgement required page. Filter by workspace (Current, All, Specific) and status (Required, Acknowledged).

## Content Sharing

### Private Article Links

Share articles externally via private links in KB Site 2.0. Generate unique links for any article, including unpublished. External users need no portal access. Manage by deleting/regenerating. Links expire if articles deleted.

## AI Integration

### Customizing Eddy AI

Customize response tone/length across Business/Enterprise plans. Enterprise users can rename assistant. Legacy users also have customization access.

### Eddy AI Compliance

GDPR compliant for EU data privacy. SOC 2 Type 2 certified for security, availability, confidentiality.

### Eddy AI Subprocessors

Services include MongoDB (vector database), OpenAI (AI capabilities), Azure (cloud infrastructure), Stripe (payments), Segment (analytics).

### AI Writer Suite

AI tools for content creation:
- Writing assistance
- SEO optimization
- FAQ generation
- Related content recommendations

### AI Writer - Plan Availability

- **Plan access**: Professional, Business, Enterprise (no Freemium)
- **Credit limits**: 5,000 credits/month (most features), 1,000 credits/month (SEO/Title generator)
- **Unlimited features**: Available within paid plans
- **Notifications**: Credit limit warnings

### AI Writer Features

- **AI Writer**: Outlines, length adjustment, tone changes, sentence splitting, speech conversion, clarity improvement, text-to-table conversion
- **AI FAQ Generator**: Automatic FAQ creation
- **AI Title Recommender**: SEO-friendly titles
- **AI SEO Description Generator**: Meta descriptions
- **AI Tag Recommender**: Content categorization tags
- **AI Related Articles**: Suggested related content
- **AI Chart Generator**: Visual content creation
- **AI Alt Text Generator**: Accessibility alt text

### AI Writer - Language Support

16 supported languages including English variants, French, Spanish, German, Norwegian, Dutch, Portuguese, Swedish, Italian, Korean, Finnish, Polish, Arabic, Hebrew, Danish, Brazilian Portuguese. Search suite unavailable in unsupported languages.

### AI FAQ Generator

Generate FAQs automatically from article content. Minimum 150 words required. Appears at article end. Customizable titles and settings.

### Using the AI Writer

Access via Ctrl+Space in Advanced WYSIWYG editor. Features:
- Outline creation
- Text improvement
- Tone adjustment
- Speech conversion
- Voice changes
- Length expansion/condensation
- Text-to-table conversion
- Sentence splitting

Requirements: 10+ word selection, 5000 uses/month limit. Data handled per OpenAI privacy policies.

### AI Title Recommender

Generates 3 AI-suggested titles. Requires 50+ preprocessed words. One credit per attempt regardless of saving.

### Configuring the AI FAQ Generator

Settings > Knowledge base site > Article settings & SEO > FAQ accordion:
- Expand/Collapse options
- Border styling
- Arrow positioning
- Icon selection

Supports English only, generates 5-10 questions, 5000/month limit.

### AI SEO Description Generator

Automate meta descriptions for better SEO and click-through rates. Available in Professional, Business, Enterprise plans.

### AI SEO Description - Usage

- Click More > SEO > Ask Eddy AI in Article settings
- Review and save generated description
- Manual review recommended

### Bulk SEO Description Generation

Generate meta descriptions for multiple English articles:
- Filter by date, contributor, tags
- Requires 200+ preprocessed words
- Optimizes for keywords and user intent (155-160 characters)
- Monthly limit: 1000 descriptions per plan

### AI Tag Recommender

Suggests relevant tags using AI. Requires 50+ preprocessed words. No credit consumption.

### Tagging Best Practices

Use consistent, specific tags. Regular review and updates. Group related content. AI recommendations always active but manually taggable.

### AI Related Articles

Eddy AI suggests related articles to improve navigation. Minimum 50 words required. Auto relate creates mutual relationships.

### AI Chart Generator

Create visual content from text selections:
- Pie charts
- Flow charts
- Tables

Requirements: Main article body content, supported languages.

### AI Alt Text Generator

Auto-generates alt text for images. Supports accessibility and SEO. Best with images <20MB in JPEG, JPG, PNG, WEBP formats. English only, 5000/month limit.

## Accessibility

### Read Out Loud Feature

Audio playback for articles. Available across plans except older pricing plans requiring AI add-on for Enterprise.

### Read Out Loud - FAQs

Reads: glossary, snippets, variables, headings, lists, callouts, private notes, accordions, FAQs, link text, emojis. Skips: tables, code blocks, images, videos, LaTeX, attachments.

## AI Integration

### AI Premium Suite

Automates business processes with advanced AI tools. Available in English only.

### AI Glossary Generator

Creates centralized business term definitions for consistent communication.

### Enabling AI Glossary Generator

Settings > AI Features > Eddy AI > Toggle AI Glossary generator.

### Using the AI Glossary Generator

- Documentation > Content tools > Content reuse > Glossary
- Suggestions appear for published articles
- Edit definitions (500 character limit)
- Add terms via dropdown, enable Update in articles
- Show Articles displays usage locations
- Add to glossary or ignore terms
- Use in advanced WYSIWYG editor via Insert > Glossary
- Keyboard shortcuts: ARROW navigation, ENTER add, BACKSPACE ignore

### Eddy AI Use Cases

Applications across industries:
- **LMS**: Course creation, adaptive learning, engagement tools
- **Customer Support**: Knowledge bases, troubleshooting, FAQs
- **Compliance**: Checklists, SOPs for regulated industries
- **Product Development**: API docs, release notes, user guides
- **Retail**: Product guides, comparisons, procedures

### Prompt Engineering Best Practices

Use precise, step-by-step prompts. Compare features, summarize sections, add context. Natural language with detailed context produces better results.

## File Management

### Document360 Drive

Cloud storage for teams with folder/file management, recent/starred/deleted file views, content overview.

### Adding Folders and Files

Create folders/subfolders matching knowledge base structure for better navigation. Plan-specific functionalities vary.

### Storage Limits by Plan

| Plan | Storage |
|------|---------|
| Professional | 50 GB |
| Business | 100 GB |
| Enterprise | 500 GB |

### Adding New Folders

Two methods:
1. '+' flywheel icon
2. 'New Folder' button

Navigate to location, enter name, click Create. Align with knowledge base categories.

### System Folders

Essential folders (Images, Settings, Documentation) marked with shield icon. Cannot delete or rename. Actions allowed: add files, customize colors, set defaults.

### Adding Files to Drive

Methods:
- Drag-and-drop into empty folders
- More menu upload

Specify location, add optional tags/alt text. Avoid special characters in filenames. Check supported file types.

### Managing Folders in Drive

Organize folders logically matching documentation categories. Individual and bulk management available.

### Setting Default Folders

Select folder from Drive as default upload location. Overridden by category-to-folder mappings. Edit icon indicates default status.

### File Limits and Restrictions

- **File Limits**: 5000 files per folder, 150MB single file cap, 160MB combined multiple file cap
- **File Type Restrictions**: Settings > Knowledge base portal > General > Drive settings
- Specify media types as `media type/extension` (lowercase extensions)

### Troubleshooting Drive Issues

5000-file folder limit includes direct uploads and article images. Solutions: use different folders, delete unused files, clear cache. Alt text limit: 140 characters.

### Starring Folders

Click star icon to mark folders. Appear in Starred section regardless of location. Click star again to remove.

### Moving Folders

Two methods (excluding System folders):
- More option: Select folder(s) > More > Move > Choose destination > Confirm
- Drag and drop: Drag folder to new location

### Renaming Folders

Navigate to folder in tree-view > More icon > Rename > Enter new name > Confirm. System folders non-renamable.

### Changing Folder Colors

Hover over folder > More > Change Color. Options: color palette, hex code, color picker. Default: gray.

### Folder Navigation

Breadcrumb trail shows hierarchy. Click levels to navigate back. Multiple default settings have no effect. Rename/copy/move/reorder actions don't change file URLs.

### File Actions

Available in List or Grid view:
- Move: Transfer between folders (no broken links)
- Copy: Duplicate files
- Add Tags/Alt-text: Improve discoverability
- View Details: Access metadata and dependencies
- View Dependencies: Track article links
- Download: Single files or .zip archives
- Remove: Delete to Recycle Bin
- Replace: Update with new version

### Deleting Folders

- Click Drive icon > More icon or checkbox > Remove > Confirm deletion
- Considerations: Breaks media links, CDN cache clearing (up to 1 minute)
- System folders undeletable
- Restore from Recycle bin within 30 days

### Troubleshooting File Replacement

Error occurs swapping different file types. Verify matching types, clear cache, test browsers. Back up before replacement—files permanently overwritten.

### All Files View

Centralized file overview enabling bulk operations (move, copy, delete) across folders. Streamlines management.

### Recent, Starred, and Deleted Files

Recent folder auto-displays latest uploads. Starred items accessible via navigation pane. Recycle Bin auto-deletes unused items after 30 days.

### Managing All Files

All files page displays up to 20 files per page with grid/list views. Filter by dependencies, upload date, uploader, type, tags. Bulk operations available. Pagination for >20 files.

### Using the Recycle Bin

Restore or permanently delete items. Bulk or individual restoration. Select up to 20 items or use "Select all {N} items". Deletion irreversible.

## Workflow Management

### Benefits of Workflow

Structure documentation processes for collaboration, consistency, accountability across writers, editors, illustrators, subject matter experts.

### Workflow Designer Overview

Create step-by-step workflows (Draft, Review, Publish). Admins/owners customize via Documentation > Content tools > Workflow designer.

### Workflow Designer

Plan-specific features:

| Plan | Features |
|------|---------|
| Professional | Essential automation |
| Business | Advanced collaboration |
| Enterprise | Custom automation, analytics |

### Troubleshooting Workflow Issues

Editing blocked by read-only workflow status. Solution: Access Workflow designer, locate locked status, disable read-only toggle.

### Understanding Workflow Statuses

- **System Status**: Predefined (Draft, Published), non-deletable, fixed order
- **Custom Status**: User-defined, flexible management, optional read-only setting

### Adding Workflow Statuses

Process:
1. Access workflow designer
2. Choose creation option
3. Set name/description
4. Enable/disable read-only
5. Save

### Managing Workflow Statuses

Handle via Documentation editor. Assign statuses directly to team members.

### Workflow Assignments

Assign document statuses to team members for lifecycle visibility and control.

### Assigning Articles

- Navigate to article
- Select workflow status
- Click Assign owner
- Choose team member > Assign

Remove assignees or set due dates. Notification emails sent to assigned members.

### Workflow Status Actions

Top-right Documentation editor options:
- View current/past statuses
- Set/clear due dates
- Assign team members
- Activate next status
- View history with comments

Enable workflow notifications in Settings > Notifications.

## Bulk folder actions

### TL;DR

Document360 Drive supports bulk folder operations including creation, moving, renaming, color changes, and deletion. Access via left navigation pane with star/folder icons. System folders (shield icon) have restrictions. Default folders override category mappings. 5000-file limits per folder with 150MB single file cap. Recycle Bin retains deleted items 30 days. Recent uploads auto-display. Starred items get quick access. File actions include move, copy, tag, alt-text, download, remove, replace. All files view enables cross-folder bulk operations. Workflow integration assigns statuses to team members with notification support.## Content Templates

### Overview

Document360 provides pre-built templates (Professional, Business, Enterprise) for consistent knowledge base articles. Users can also create custom templates for repeated use.

### Creating Templates

To create a template:
1. Go to **Content reuse > Templates**
2. Click **Create template**
3. Name it, select editor type, add description
4. Click **Save**

Edit existing templates by hovering and clicking **Edit**. Update name/description (max 250 characters), then save.

### Saving Articles as Templates

Create a template from an existing article in the documentation editor:
1. Click the "..." icon
2. Select **Save as template**
3. Confirm

Manage templates via the **Manage templates** page.

### Template FAQs

- Clone templates within the same language to save time
- Deleting a template doesn't affect existing articles
- Templates are shareable with team members
- Updating a template doesn't change previously created articles (uses local copy)
- Templates cannot be cloned across languages
- For different languages, manually recreate and translate

## Workflow Management

### Workflow Assignments Overview

Centralized view of articles and categories in knowledge base projects. Track workflow statuses, due dates, and assigned articles via **Documentation > Workflow assignments**. Displays article counts per workflow status. Access assigned articles from left navigation.

### Creating Articles from Templates

1. Hover over category in left navigation, click () icon
2. Select **Article from template**
3. Enter article name
4. Choose category location
5. Select template (preview available)
6. Click **Create**

Manage templates via **Manage templates** link.

## Content Reuse

### Variables

Reusable elements for frequently changing content (contact info, addresses). Update once, propagate everywhere. Maintains consistency and reduces redundant editing.

### Creating Variables

To create a variable:
1. Navigate to **Documentation > Content tools > Content reuse > Variables**
2. Click **Create variable**
3. Select language (default: Global)
4. Enter **Name** (30 characters max: letters, numbers, hyphens, underscores)
5. Merge code auto-generated as `{{variable.Name}}`
6. Choose **Language** (Global or specific)
7. Add **Content** (100 characters max, with formatting)
8. Use **Snippets** for longer text/media
9. Click **Create variable**

### Managing Variables

Find, view, edit, delete variables in knowledge base portal. See which articles use each variable and how edits propagate. Modify links and styles. Bulk delete available.

### Using Variables

Insert variables via:
1. **Markdown syntax**: `{{variable.MergeCodeValue}}` (exact merge code required)
2. **Toolbar method**: Click Content reuse icon, select variables

Toolbar method supports multiple selections in non-Advanced editors. Preview required in Advanced WYSIWYG to see rendered variables.

### Built-in Variables

Enable single-source updates, ensure consistency, update in real-time, support translations. Improve efficiency and accuracy in technical documentation.

### Snippets Overview

Reusable content blocks (text, images) stored in a library. Insert easily into articles. Readers see content seamlessly without knowing it's reused.

### Creating Snippets

1. Go to **Documentation > Content tools > Content reuse > Snippets**
2. Click **Create snippet**
3. Name snippet (30 characters max: letters, numbers, hyphens, underscores)
4. Set language (Global by default)
5. Choose editor (WYSIWYG or Markdown)
6. Add content
7. Click **Create snippet**

### Managing Snippets

Find, view, edit, delete snippets. See usage across articles, language, and modification dates. Edits automatically update all using articles. Bulk delete supported.

### Using Snippets

Two insertion methods:
1. **Merge code** in Markdown editor
2. **Toolbar selection** (search, preview, insert local copies)

### Snippet FAQs

- **Limit**: 200 snippets per project (additional via add-on)
- **Renaming**: Not possible after creation
- **Placement**: Always starts new line for multi-line support

## Localization

### Translating Variables

Translate variables for localized content:
1. Create new variable with target languages
2. Fill content in default language first
3. Translate to other languages

Existing variables can be translated, retranslated, or removed by language. Global variables cannot be translated.

### Translating Snippets

Manage multilingual snippets for consistent translations. Global snippets cannot be translated.

To create new snippet:
1. Navigate to **Snippets**
2. Select language
3. Add name/content
4. Translate to other languages
5. Save

Default language marked as Main. Completed translations show green tick.

### Translating Glossaries

Create multilingual glossaries for consistent localization:
1. Navigate to **Glossary**
2. Create new entry
3. Select language
4. Enter terms/content
5. Translate to other languages
6. Save

Default language marked as Main. Completed translations show green tick.

### Multilingual Custom Pages

Translate custom pages by selecting language from dropdown, viewing translation details, then clicking to translate.

## Content Consistency

### Glossary

Glossary terms provide quick definitions for frequently used terms. Improves readability and consistency. Reduces confusion, saves writer time, enables product education. Viewable in knowledge base and assistant.

### Glossary Management Navigation

Manage glossary terms: add/edit/delete single/multiple, import, link to header/footer/menu/homepage. Filter by language. Terms are project-wide. Access via **Content tools > Content reuse**. Check article usage before deletion. Bulk import supported.

### Managing Glossary Terms

Access via **Content tools > Content reuse > Glossary**. Features: language filtering, create/edit terms, bulk import/export (CSV), search with preview, track usage, AI generation with Eddy AI. SEO benefit: improved search relevance through keyword definitions.

### Adding Glossary Terms

Two methods:
1. **Via navigation**: Go to **Content tools > Content reuse > Glossary**
2. **Via left menu/search**: Use "Add Term" button

Select from Professional, Business, or Enterprise categories. Organize alphabetically. Clear definitions required. Proofread entries. Manage with edit/delete options. Use bulk import for efficiency.

### Creating Glossary Terms

1. Navigate to **Content tools > Content reuse > Glossary**
2. Click **Create term**
3. Fill:
   - **Name** (100 characters max)
   - **Language**
   - **Term** (100 characters max)
   - **Content** (500 characters max)
4. Click **Create**

Translate terms using Name field as reference. Global terms cannot be language-specific. CSV import available.

### Importing Glossary Terms

Prepare CSV with terms/definitions. Use downloaded template or create new. Edit with Excel/Google Docs.

1. Go to **Content tools > Content reuse > Glossary**
2. Click **Import terms**
3. Upload CSV
4. Wait for validation

Address errors (duplicates, long definitions) via error log. Import valid terms to streamline management.

### Exporting Glossary Terms

1. Navigate to **Documentation > Content tools > Content reuse > Glossary**
2. Select language
3. Click **Export CSV**
4. Wait for download

CSV includes: Glossary Name, Definition, Dependencies, Updated By, Updated On.

### Editing Glossary Terms

1. Go to **Content reuse > Glossary**
2. Hover over term, click **Edit**
3. Update term/definition
4. Translate to desired languages (**Translate** or **Translate again**)
5. Remove translations with **Remove language**
6. Click **Update**

Global glossaries can be translated.

### Using Glossary Terms in Articles

Glossary terms show definitions on hover (dotted underline).

Insertion methods by editor:
- **Markdown**: Use `{{glossary.Term_name}}` (exact case required)
- **WYSIWYG**: Click Glossary option in toolbar
- **Advanced WYSIWYG**: Access via Insert menu, preview required

### Deleting Glossary Terms

Delete individually (hover/click) or bulk (select/click). Check dependencies first. Manually remove from articles before deleting glossary entry to avoid data loss.

### Glossary Landing Page

Add glossary overview link to site header/footer/secondary navigation. URL format: `https://yourdomain/docs/glossary-overview`. Replace `<yourdomain>` with actual domain.

## User Feedback

### Feedback Manager

Track, evaluate, respond to user feedback on knowledge base articles. Improve content quality and address user concerns.

### Feedback Manager Overview

Access via **Documentation > Content tools > Feedback manager**. Two tabs:

- **Article feedback**: Reader ratings (Yes/No) and comments on specific articles
- **No search results feedback**: Queries that returned no results

### Managing Article Feedback

Handle feedback on articles. Readers rate helpfulness, comment, request updates. Respond by reviewing feedback, opening related article, assigning tasks, updating status (Open, Planned, In Progress, Complete, Closed). Enable notify toggle to automatically close feedback.

### Managing No Search Results Feedback

Review user queries with no results. Understand context, assign tasks, create/update content, add keywords. Track progress with status updates. Notify users of replies to improve search experience.

### Feedback Management Features

- **Filters, bulk actions, CSV export**: Manage efficiently with filters, bulk updates, export data (90-day limit)
- **Status clarification**: "Complete" allows reopening; "Closed" means resolved, cannot reopen

## Content Organization

### Understanding Tags

Simple labels describing content (articles, categories, files). Example: "Installation" tag for software installation article.

**Benefits**: Improved navigation, group similar content, better searches, increased visibility on external search engines.

**Best practices**: Concise tags, consistent naming, avoid overuse/irrelevant tags. AI recommendations available.

### Tag Support by Plan

- **Professional**: Basic tag support
- **Business**: Advanced tag management
- **Enterprise**: Premium features with analytics

### Managing Tags - Overview

**Manage tags** page is central hub for tag management. Assign tags to articles, categories, files. Organize tag groups. Access via **Documentation > Content tools > Tags**.

### Managing Tags - Features

Create, search, view creation info (creator, date), examine dependencies. Edit, move, merge, remove references. Export to CSV. Filter by associations, creation date, creator.

**Cannot delete tags with dependencies**. Remove dependencies first.

### Creating Tags

Team accounts use tags to organize articles, pages, files. AI recommendations suggest relevant tags for efficient classification.

### Adding Tags - Methods

Four methods:
1. **Manage Tags overview** (create new)
2. **Documentation editor**
3. **Drive file tagging**
4. **All articles page**

Each uses dropdown/search to select/create tags.

### Managing Tags - FAQs

- All tag actions via **Manage tags** page (**Content tools > Tags**)
- View associated articles/files by clicking reference numbers
- Edit/delete directly from Manage tags page
- Merge similar tags using **Merge tags**
- Remove dependencies individually or bulk (**Remove dependencies**)

### Tag Naming Guidelines

Allowed: uppercase, lowercase, numbers, spaces, special characters (_ + - @ # % ^ & ! ())

Forbidden: \ / : * ? " < > |

### Tag Limitations

- 1,000 tags per project
- Names: max 30 characters
- Descriptions: max 100 characters
- Descriptions show as tooltips on hover

### Tag Groups Overview

Organize related tags (articles, categories, Drive files). Makes large tag libraries manageable by showing relationships and dependencies.

### Using Tag Groups

Two methods:
1. Assign tag to group during creation
2. Select tags and move to group in library

### Creating Tag Groups

1. Log in to **Knowledge base portal**
2. Select **Documentation** tab
3. Navigate to **Content tools > Tags**
4. Under **Groups** tab, click **Create group**
5. Enter name/description
6. Click **Create**

### Deleting Tag Groups

Permanently removes group and all tags. Breaks links to articles, categories, files. Tags cannot be added to articles. Groups organize tags only.

### Viewing Tag Dependencies

1. Navigate to **Documentation > Content tools > Tags**
2. Click number under **Articles**, **Page category**, or **Files in drive**
3. Review usage details in **Tag dependencies** window

**Dependency info**:
- Articles: title, status, workspace, language, creator, date
- Page categories: title, status, workspace, language, creator, date
- Files: name

### Removing Tag Dependencies

1. Select items with checkboxes
2. Click **Remove dependencies**
3. For bulk removal, click **Select all** first

## Content Management

### Find and Replace

Search and replace keywords/phrases across articles and categories. Works with words, numbers, selected characters.

### Using Find and Replace

1. Go to **Content tools > Find and replace**
2. Enter search text (optional filters)
3. Enter replacement text
4. Select articles to update
5. Choose publish/draft status
6. Click **Replace**

Advanced filtering by workspace, language, status. Whole-word matching available.

### Find and Replace Within Editor

Locate and modify text within specific article. Access via editor icon. Works on current article only.

### Find and Replace FAQs

- Requires **Editor** role or custom role with **Perform Find and replace** permission
- Replace with empty field removes found text
- Only affects visible text, not Markdown/HTML syntax
- Excludes articles in **Recycle Bin**
- Max 1,000 articles per replacement

## Content Export

### Exporting a Project

1. Navigate to **Documentation > Content tools > Import & Export > Export project**
2. Click **Export**
3. Choose articles by modification date
4. Select workspaces, languages, categories
5. Include media files as needed
6. Click **Export**

ZIP includes selected content. Media files optional. Export time varies with content size.

### Downloading Project ZIP

Find latest export under **Recent files** in **Import & Export project**. Click **Download** or **Copy link**.

### Project Export API

Business/Enterprise plans only. Two exports per day. Overwrites previous downloads. Formats: Markdown (.md), WYSIWYG (.html), JSON (multilingual).

### Exporting to PDF

All plans support PDF export with customization.

**Process**:
1. Go to **Documentation > Content tools > Export to PDF**
2. Click **Create new PDF**
3. Enter name, optional password, select template/workspace/language
4. Preview template
5. Select categories/articles
6. Click **Export**

### Managing Exported PDFs

Download, regenerate, clone, edit, view details, delete. Export draft articles and SVG images supported.

**Limitation**: SVG rendering issues with SelectPDF plugin. Workaround: convert to PNG/JPG.

### PDF Templates Overview

Access via **Content tools > Export to PDF**. View system/custom templates, sortable by date. Actions: clone, edit, delete (with confirmation). Create new via dedicated button. Default templates cannot be deleted.

### Creating PDF Templates

Customizable options:
- Name, layout, margins
- Cover page (title, description, logo, image)
- Terms & conditions (existing/custom)
- Table of contents
- Watermark (text/image)
- Header/footer images/text
- Page numbers, text formatting

### Setting Default PDF Templates

Any template can be default. Click **Set as default** before saving. Default templates cannot be deleted.

### PDF Template FAQs

Customizable layouts for professional PDFs. Save time, ensure visual appeal and branding consistency. Tailor to specific needs.

## Content Import

### Importing Project ZIP Files

Supported across all plans. Migrate between projects or restore from backups.

**Requirements**:
- Editor role or custom role with Update/Publish permissions
- Max file size: 1GB
- Document360 ZIP format only

**Process**:
- Matching workspace slugs merge data
- Different slugs create new workspace
- Modify slug in ZIP to avoid conflicts
- Verify supported features and destination workspace

## Content Migration

### Migrating from Other Platforms

Support for 100+ platforms (Zendesk, Freshdesk, etc.). Available across all plans.

**Process**:
1. Submit migration request via form
2. Provide current knowledge base URL and platform
3. Document360 experts handle transfer

### Migration Process

Three steps:
1. Expert consultation and estimate
2. Automated/manual knowledge base transfer
3. Quality assurance with SEO-friendly redirects

Redirect rules prevent broken links, 404 errors, and search ranking drops.

## Analytics

### Overview

Various analytics (article, search, reader, team, feedback, links, page not found, Eddy AI, ticket deflection) by plan tier. Data specific to active workspace/language. Presented in UTC time.

### Accessing Article Analytics

Go to **Analytics > Articles**. Shows views, reads, likes, dislikes. Filter by date range, user type, JWT auth. Distinguishes views from engagement. Export available.

### Understanding Article Analytics

**Plans**: Professional (limited), Business, Enterprise (full features)

Insights include engagement, geographic distribution, top performers. Data-driven decisions improve knowledge base.

### Search Analytics

Tracks user search behavior. Optimizes content, identifies gaps. Monitors trends, successful queries, no-result searches.

### Accessing Reader Analytics

Go to **Analytics > Reader**. Filter by date, reader type, knowledge base/widget. Shows total readers, self-registered, frequent users. Export CSV available.

### Reader Analytics Overview

Insights into reader activity for Private/Mixed projects. Track engagement to optimize content strategy.

### Team Accounts Analytics

Detailed analytics on account types, content access/creation, contributions, last logins.

### Viewing Team Account Analytics

Navigate to **Analytics > Team accounts**. Use date filters. Three metric tiles plus detailed contributions. Export CSV for analysis.

### Link Status Overview

Shows internal/external links by status (working, broken, redirect, ignored). Detailed list with filtering. Export CSV available.

### Understanding Link Status Analytics

Broken link checker under **Analytics**. Validates internal, external, media links. Scheduled, manual, article-level validation options.

### Link Validation Methods

1. **Scheduled**: Automatic based on plan
2. **Manual**: On-demand (24-hour report, overwrites previous)
3. **Article-level**: Unlimited per-article checks

Manual validation requires permission. Article-level available from editor.

### Ticket Deflector Analytics - Sections

Performance analysis includes:
1. **Satisfaction Analysis**: Form submissions vs. knowledge base answers
2. **Frequently Selected Questions**: Top 5 form questions
3. **Satisfaction Summary**: Pie chart of submissions vs. answers
4. **Most Useful Articles**: Top resolving articles
5. **Keywords**: Search terms and answer success rates
6. **Search Success Rate**: Percentage of successful searches

All sections exportable as images or CSV.

### Ticket Deflector - Feedback Tab

Shows user feedback labeled by source (Form Submitted, Answered from Knowledge Base) with timestamps. Ticket deflector reduces support tickets by suggesting articles.

## API Documentation

### Generating API Docs

Create from URLs, JSON/YAML files, or CI/CD flow:
1. Select source
2. Input specification (URL or file)
3. Provide API token (CI/CD)
4. Click **Publish**

CI/CD requires Node.js and `d360` npm package. Review drafts before publishing.

### Regenerating API Docs

Automatic regeneration from updated specifications. Custom content preserved. CI/CD recommended for automated updates. Manual regeneration via web UI or command line.

### API Doc Management

All plans support API documentation. Interactive docs from specification files. Covers endpoints, methods, responses.

### d360 npm Package

Package facilitates CI/CD API documentation updates. Available via npmjs.com and GitHub.

## Widgets

### Widget Management Overview

Manage knowledge base widgets with edit, clone, delete options. Plan-specific features require official documentation reference.

### Editing Widgets

1. Navigate to widget in portal
2. Hover, click **Edit**
3. Update configurations in **Configure & connect**
4. Click **Save**

### Deleting Widgets

1. Navigate to widget
2. Hover, click **Delete**
3. Confirm action
4. Click **Yes**

### Cloning Widgets

1. Go to **Knowledge base Widget** section
2. Hover over widget, click **Clone**
3. Provide title, update configurations
4. Click **Save**

### Adding Ticket Deflectors

1. Enable **Show ticket deflector** toggle
2. Select desired deflector
3. Save changes

Requires portal login and widget configuration access.

### Domain Restriction

Restrict widget to specific domains:
1. Add domains to **Widget security** list
2. Widget accessible on any domain if list empty
3. Exclude "www" from input (e.g., document360.com)

### Adding Custom Links

Add custom links via **Widget Settings**:
1. Enter link title, display text, URL
2. Optional icon
3. Use `mailto:` for email links

Edit/delete via respective sections.

### URL Mapping

Control widget display by user location (URLs). Actions include showing articles, listing articles, displaying search results, hiding widget. Supports path, query, hash parameters. Optional regex for advanced matching.

**Content visibility options**:
- **Project**: All articles
- **Workspace**: Specific workspaces/languages
- **Category**: Specific categories

URL mapping changes may disable existing configurations if articles become inaccessible.

### Configuring URL Mapping

Four actions available:
1. Show article
2. List articles
3. Display search results
4. Hide widget

Requires widget installation. Supports advanced parameter matching.

### URL Matching with Regex

Use regex to match URL components (protocol, domain, path, query, fragment). Examples include specific paths, query parameters, wildcards. Essential for effective URL mapping.

### Advanced Customization

Customize appearance/behavior with CSS/JavaScript. Modify icons, buttons, implement callbacks, styling, localization.

### Customizing Displayed Fields

Modify widget text with JavaScript:
1. Replace "Page help", "Knowledge base", etc.
2. Use `$(document).ready` for execution timing
3. Replace text via jQuery
4. Save settings

### Auto-Opening the Widget

Add JavaScript to automatically open widget:
1. Simulate button click after 2-second delay
2. Ensure page fully loads first

## Site Customization

### Knowledge Base Site 2.0

Enhanced UI, AI-powered search, streamlined content, real-time updates, interactive elements.

### KB Site 2.0 Overview

Redesigned header with logo, workspace navigation, customizable navigation, announcements, acknowledgment requests, theme/language options, search.

Left pane offers search, navigation, article status, follow/export options. Article sections include breadcrumbs, title, links, status, date, contributors, sharing, summary, acknowledgment. Image viewers support zoom/download.

Right pane shows attachments, tags, table of contents. Footer enables feedback, navigation to related articles.

### Customizing the Site

Tailor appearance (themes, colors, layouts) to match brand. Project-level setting affects entire project. Requires KB Site 1.0 migration.

### Basic Customization

1. Navigate to **Settings > Knowledge base site > Customize site**
2. Choose theme (light, dark, or both)
3. Brand site with logo, favicon, redirect link
4. Apply WCAG-compliant colors or adjust manually
5. Customize hyperlink colors, fonts, button styles, layout
6. Save changes

### Advanced Customization

Centralized customization options:
- Branding (logo, favicon)
- Header/footer
- Homepage, login, error pages
- CSS/JavaScript

Preview feature shows interactive changes. Supports light/dark themes, favicon uploads, logo changes, custom CSS/JavaScript.

### Secondary Navigation

Add menus below logo for quick access to key pages (Pricing, Documentation, Support). Improves navigation on large knowledge bases.

### Configuring Secondary Navigation

1. Go to **Settings > Knowledge base site > Customize site**
2. Create single-level, multi-level, or ticket-deflector menus
3. Add titles, links (hyperlinks, email, phone)
4. Open in new tabs option
5. Manage/reorder items
6. Optionally display on home page
7. Publish changes

### Primary Navigation

Bar next to logo enabling easy navigation between pages. Plan-dependent functionality.

### Configuring Primary Navigation

1. Navigate to **Settings > Knowledge base site > Customize site**
2. Select **Site header & footer > Header > Primary navigation**
3. Add up to 6 items (Home, Custom URL, Call to action, RSS feed, Ticket deflector, Glossary, API documentation, Custom page)
4. Customize colors, edit, delete, reorder
5. Preview, save, publish

Use custom CSS/JavaScript for advanced features (social icons, feedback links).

### Home Page Customization

Customize via **Customize site** settings. Body blocks include rich text, images, custom code. Choose themes (Engage, Innovate, Learn, Default). Configure SEO with meta titles, descriptions, featured images.

Recommended hero image: 1920x415 pixels. Reorder sections, preview, publish changes.

### Custom Footers

Access footer settings via **Settings > Knowledge base site > Customize site**. Choose **Header & Footer > Footer**.

Options:
- **Basic footer**: Up to six custom links, social media links
- **Custom footer**: HTML input for advanced customization

Add HTML/CSS or external links. Preview before saving/publishing.

## Site Features

### RSS Feeds

XML format providing automatic updates. Keep readers informed of new/modified articles.

Integration methods:
- **Primary Navigation**: Add RSS Feed item with title
- **Secondary Navigation**: Single Level menu with title and XML URL
- **Footer**: Basic Footer link or Custom Footer HTML embed

Readers subscribe via browser extensions (Feeder.co) or apps (Feedly, Inoreader).

## Site Migration

### Migrating to KB Site 2.0

Customizable upgrade with enhanced features (following articles, private sharing). Improved configuration across all plans. Projects created after June 10th, 2024 auto-access.

## Accessibility

### WCAG Compliance

Text alternatives for images/icons. Full keyboard navigation. Readable text with sufficient contrast and clear language.

### WCAG 2.1 Principles

**Perceivable**: Text alternatives for non-text content
**Operable**: Keyboard interfaces, sufficient time, clear navigation
**Understandable**: Readable content, predictable operation
**Robust**: Compatible with various user agents including assistive technology

## Site Structure

### Main Pages

Focus on Home page customization: add links, change colors, incorporate categories. Structured plan comparison available.## Site Customization

### Login Page Customization

Modify the login page appearance (images, styles) and add elements (buttons, video loaders, search bars). Also handles homepage and documentation page customization. Requires HTML, CSS, and JavaScript for personalization.

### Hero Section

The Hero section is a customizable, visually-prominent area on the homepage. Companies can introduce their knowledge base with text, buttons, and search functionality to direct users to key resources.

### Documentation Page

Adjust the search bar position (Left panel or Secondary Header) and apply background colors to the left navigation panel. Access through **Settings > Knowledge base site > Customize site**, select Documentation, make changes, preview, save, and publish.

### Multicolumn Cards

Homepage section for showcasing features, "About," or "Contact." Columns include icons, titles, and descriptions. Useful for promoting software features with quick information access.

### Rich Text Blocks

Add headings and paragraphs with formatting options (colors, bold, italics, links) to the home page. Steps: navigate to settings, customize site, add rich text block, edit content, choose styles, reorder, and save. Supports Markdown and includes delete option.

### Configuring the Hero Section

1. Navigate to **Settings** > **Knowledge base site** > **Customize site**
2. Select **Home** page to find the **Hero section** at the top
3. Set background (image, color, gradient, or pattern) and customize elements
4. Edit or hide **Welcome text**, **Promo text**, **Buttons**, and **Search**
5. **Save**, **Preview**, and **Publish** changes

### Adding Multicolumn Cards

1. Navigate to **Settings** > **Knowledge base site** > **Customize site**
2. Select **Home** page and click **Add section** > **Multicolumn cards**
3. Edit titles, icons (Document360 or Font Awesome), and descriptions
4. Reorder, hide, and customize appearance
5. **Save**, **Preview**, and **Publish** changes

### Image with Text Blocks

Combine visuals with text to enhance homepage content. Differs from Rich text blocks by including imagery. Ideal for showcasing features or announcements.

### Adding Image and Text Blocks

1. Navigate to **Settings** > **Knowledge base site** > **Customize site**
2. Select **Home** page and click **Add section** > **Image with text**
3. Upload or update image, edit heading and paragraph text
4. Format, align, and color text as needed
5. **Save**, **Preview**, and **Publish** changes

### Adding Custom Code Sections

1. Navigate to **Settings** > **Knowledge base site** > **Customize site**
2. Select **Home** page and click **Add section** > **Custom code**
3. Edit HTML/CSS code
4. **Save**, **Preview**, and **Publish** changes
5. To delete: select section, click **Delete** > **Yes**

### Custom Code Section Overview

Embed custom HTML and CSS to enhance the Knowledge base site. Enables dynamic banners, countdown timers, and interactive elements for versatile site customization.

### Widgets Block

Embeddable blocks placed below the header on the homepage with various functionalities.

### Knowledge Base Categories Block

Display popular categories as cards on the home page to improve navigation. Helps users quickly find sections like "Getting Started" or "Troubleshooting Articles."

### Adding Category Blocks

1. Navigate to **Settings** > **Knowledge base site** > **Customize site**
2. Select **Home** page and click **Add section** > **Knowledge base categories**
3. Add categories, reorder elements, and toggle visibility
4. Select icons, add titles/descriptions, choose colors
5. **Save**, **Preview**, and **Publish** changes

### Error Pages

Provide branded error messages with clear next steps when users access broken, unauthorized, or restricted links instead of generic messages. Available across all plans.

### Deleting Widget Sections

1. Navigate to **Settings** > **Knowledge base site** > **Customize site**
2. Select **Widgets** from Home dropdown
3. Click **Delete** > **Yes**
4. For individual widgets, repeat process
5. **Save** and **Publish** changes

**Key Notes:**
- Hide widgets using the Hide icon
- Rearrange with drag-and-drop
- Recently Created and Modified articles may overlap

### Adding Widgets to Home Page

1. Navigate to **Settings** > **Knowledge base site** > **Customize site**
2. Select **Home** page
3. Click **Add section** > **Widgets**
4. Choose from: Most Viewed, Most Liked, Most Read, Recently Modified, Recently Created
5. Edit headings and preview
6. **Save** and **Publish**

**Key Notes:**
- New articles appear in both Recently Created and Recently Modified
- Content filtered by user permissions
- Use reorder and preview icons to arrange elements

### Understanding 404 Pages

A 404 page appears when users request non-existent webpages. Customize with messages, imagery, and links to guide users appropriately. Customization is irreversible.

### Configuring Error Pages

1. Navigate to **Settings** > **Knowledge base site** > **Customize site**
2. Choose error page type (404, Access denied, Unauthorized, IP restriction)
3. Select **Basic style** (change images) or **Custom style** (HTML/CSS editing)
4. Use preview toggle to check changes
5. **Save**, **Preview**, and **Publish**

**Note:** Cannot revert to default static page once configured.

### 404 Page Support

Business and Enterprise plans support custom 404 pages. Professional plan does not.

### Access Denied Page

Redirects users with insufficient permissions. Custom pages explain access denial clearly. Only Private and Mixed knowledge bases support this feature. Customization prevents reverting to default.

### Access Denied Page Support

| Professional | Business | Enterprise |
|--------------|----------|------------|
|              | ✅        | ✅          |

Business and Enterprise plans support Access Denied page customization.

### Customizing the 44 Page

1. Navigate to **Customize site** and select **404 page**
2. **Basic style**: Change image, heading, paragraph; add up to three buttons
3. **Custom style**: Use HTML/CSS with preview feature
4. Monitor with **Page Not Found analytics** and **Link status** tools
5. Best practices: consistent design, clear language, navigation options, mobile-friendly

### Unauthorized Page Support

Professional plan: No support
Business plan: ✅
Enterprise plan: ✅

### Customizing the Access Denied Page

1. Navigate to **Settings** > **Knowledge base site** > **Customize site**
2. Select **Access Denied** page
3. Choose **Basic** or **Custom** style
4. Modify images, headings, paragraphs
5. Use custom HTML/CSS for advanced changes
6. **Preview** and **Publish**

**Note:** Cannot revert to default once customized.

### Understanding the Unauthorized Page

Appears when users lack permissions for restricted content. Can customize with messages like requesting admin access. Customization is irreversible.

### Customizing the Unauthorized Page

Choose **Basic style** (modify default elements) or **Custom style** (full HTML/CSS control) for unauthorized access pages. Navigate to site settings, select appropriate style, make changes, then **Save**, **Preview**, and **Publish**.

### IP Restriction Page Support

Enterprise plan only supports IP restriction page customization.

### Customizing the IP Restriction Page

1. Navigate to **Settings** > **Knowledge base site** > **Customize site**
2. Select **IP restriction** page
3. Choose **Basic** or **Custom** style
4. Modify elements as needed
5. **Preview** and **Publish** changes

### Custom CSS & JS Support

Professional: Limited customization
Business: Advanced customization
Enterprise: Full customization with priority support

### Using JavaScript Snippets

1. Navigate to **Settings** > **Knowledge base site** > **Customize site**
2. Add code to **JavaScript** tab
3. **Save** changes

Example code reorders elements.

### Troubleshooting Custom JavaScript

Document360's SPA requires updating JavaScript that previously relied on page refresh events. Use `articleload` event instead:

```javascript
window.addEventListener('articleload', function() { ... });
```

Contact support for persistent issues. Multiple brands use separate workspaces or stylesheets within same workspace.

### Using CSS Snippets

Reusable code blocks for common CSS functionality. Example: `.shadow` snippet adds box-shadows.

1. Go to **Settings** > **Knowledge base site** > **Customize site**
2. Add custom or preloaded snippets (7 available)
3. **Save** changes

### CSS Snippets

Customize Knowledge Base using pre-loaded or custom CSS snippets.

1. Navigate to **Settings** > **Knowledge base site** > **Customize site** > **Custom CSS**
2. Select **CSS** tab
3. Add snippets (body font, headings, tables, images, hero sections, callouts, back-to-top)
4. **Save** changes

### Callout Styles by Plan

Professional: Basic callouts
Business: Enhanced styling options
Enterprise: Full customization with dark mode support

## Content Enhancement

### Understanding Callouts

Highlight important content with four types: Info, Warning, Error, Success. Each includes title and content sections. Accessible via Markdown or WYSIWYG editors.

## Site Customization

### Body Font Styling

Professional, Business, and Enterprise plans support custom CSS/JS for body font styling to improve reader experience.

### Setting Body Font Style

1. Navigate to **Knowledge base site** > **Customize site** > **Custom CSS & JavaScript**
2. Click **Custom CSS** tab > **Add code snippets**
3. Select **Change body text font** snippet
4. Modify CSS for font face and color
5. **Save** changes

### Styling Callouts

1. Go to **Settings** > **Knowledge base site** > **Customize site** > **Custom CSS & JavaScript**
2. Under CSS, click **Add code snippets** > **Change callout colors**
3. Edit code with branding colors
4. **Save** for site-wide application

For dark mode styling: refer to separate documentation.

### Image Alignment

Control image placement (left, right, center) while maintaining proportions during resizing. Default alignment is left.

### Header Font Style

Customize `<h1>`, `<h2>`, `<h3>`, `<h4>` fonts. Sans-serif fonts common for technical documentation.

### Changing Header Font Style

1. Navigate to **Custom CSS** in Knowledge Base settings
2. Add/edit **Change heading font** snippet
3. Customize CSS
4. **Save** changes

Default font is Montserrat.

### Image Resizing

Maintain proportions during zooming:

**KB 1.0:**
```css
.content_block .content_container .content_block_text img {
height: auto !important;
}
```

**KB 2.0:**
```css
article img {
height: auto !important;
}
```

Paste appropriate snippet in **Custom CSS** and **Save**.

### Centering Images

Center images using CSS:

```css
.content_block .content_container .content_block_text img {
margin: 0 auto;
display: block;
}
```

Add to **Custom CSS** in Knowledge Base settings and **Save**.

## Content Structure

### Importance of Tables

Organize complex information in rows and columns for better understanding.

### Styling Tables with CSS

1. Navigate to **Custom CSS & JavaScript** in Settings
2. Add or modify CSS snippets
3. Customize borders, padding, colors, fonts
4. **Save** changes

### Table Styles and Plan Support

| Professional | Business | Enterprise |
|--------------|----------|------------|
| Basic styling | Enhanced options | Full customization |

## SEO

### Editing Redirect Rules

1. Navigate to **Knowledge base** > **Article redirect rules**
2. Filter to find rule
3. Hover > Click **Edit**
4. Update fields
5. Click **Update**

### Adding Redirect Rules

Configure URL redirects using two methods:
1. **Ends with**: Redirect based on article slugs
2. **Replace with**: Replace URL segments

Specify correct paths (starting/ending with `/`) and consider multilanguage contexts.

### Article Redirect Rules

Enterprise plan supports redirects for published or draft articles to prevent broken links. Bulk import available.

### Filtering Redirect Rules

Filter by:
- Source/destination URLs
- Rule type (Ends with, Replace with, Both)
- Modification date (preset or custom ranges)

### Importing Redirect Rules

1. Upload properly formatted CSV (Source, Destination, RedirectionType, max 1MB)
2. Navigate to **Settings** > **Knowledge base site** > **Article redirect rules**
3. Review valid/invalid rules
4. Download invalid rules if needed
5. Import accepted rules

### Exporting Redirect Rules

Export rules as CSV from **Settings** > **Knowledge base site** > **Article redirect rules**. Maximum 10,000 rules per project.

### Deleting Redirect Rules

1. Navigate to **Settings** > **Knowledge base site** > **Article redirect rules**
2. Use **Filter** to find rule
3. Hover > Click **Delete** or select multiple rules
4. Confirm with **Yes**

**Note:** Deleted rules cannot be retrieved.

## Site Settings

### Article Settings

Configure Knowledge Base settings (accessibility, headers, sidebars, footers, categories, search, FAQ) with global impact. Customize individual elements like read-aloud, table of contents, comments, statuses, and related articles. Localization supported. Individual article settings can override global configurations.

### Article Header Customization

Enable customizable header elements: contributors, read times, sharing options to improve engagement.

### Article Settings and SEO

Customize Knowledge base sites through **Article settings & SEO** to enhance user experience with headers, footers, search options, and accessibility features.

### Enabling Article Header Elements

Enable in **Article settings** panel:
- Contributors
- Read time
- Follow button
- Share
- Print
- Dates
- PDF download

Project-wide change affecting all articles.

## Accessing the What's New Feature

### What's New Feature

View recently published articles by clicking announcement icon, selecting workspace/language, and filtering by date range (24 hours, 7 days, 30 days).

Enable/disable via **Settings** > **Knowledge base site** > **Article settings & SEO** by toggling **Show What's New**.

## Site Features

### Article Header Elements

Include: contributors, read time estimate, follow button, share icon, print option, published/updated dates, PDF export. Localization customizes text per language.

### Following Articles and Categories

Notify users of new/updated articles. Available for Private/Mixed projects in KB site 2.0 (created after June 10th).

### Search Functionality

Fast, relevant searches across articles, categories, and PDF attachments. Advanced filters and keyword operators improve efficiency.

### Search Attributes

Search includes article/category titles, tags, slugs, breadcrumbs, and content text. Prioritizes titles, then tags, slugs, breadcrumbs, and content.

### Enabling the 'Show Follow Button'

1. Go to **Settings** > **Knowledge base site** > **Article settings & SEO**
2. In **Article header** section, toggle on **Show Follow button**

Enabled by default for new Private and Mixed projects.

### Searching Attachments

Search PDF files (up to 10MB) within knowledge base. Enable via settings and requires **Show article files** toggle. Limited to article content, titles, slugs, and tags when **Show attachment tab** is off.

### Advanced Search

Filter results across multiple workspaces and languages:
- Workspace (current, all, or specific)
- Language (current, all, or specific)
- Tags, contributors, date, categories

Enable in settings under Knowledge base portal.

### Search Filters

Refine results by:
- Category
- Attachments
- Workspace (current, all, or specific)
- Language (current, all, or specific)

Located to the left of search bar.

### Search Operators

Improve precision with:
- Double quotes: exact phrases
- Minus sign: exclude terms

### Enabling 'No Search Result Feedback'

1. Click gear icon > **Settings** > **Knowledge base site**
2. Go to **Article settings & SEO**
3. Expand **Search settings**
4. Toggle **No search result feedback**
5. Review submissions in **Search analytics**

Feedback form appears on site and widget when enabled.

### Advanced Search FAQs

Combined searches across workspaces/languages with filters. Hide home page search by customizing header. Exclude articles by hiding. External search engines handled separately. Include API documentation by selecting "All workspaces." RTL languages adjust search bar alignment. Enable "Include all workspaces in site searches" for Document360 1.0.

### Smart Bars

Customizable banners conveying information, announcements, or updates tailored to user location, browser, or language.

## User Feedback

### Liking/Disliking Articles

Users provide feedback via like/dislike icons. Helps improve content quality. Undo feature available only in KB Site 2.0 projects.

### Liking/Disliking Process

Click icons at article end. Liking is straightforward; disliking requires comment. Both open feedback panels with comment options and email notifications. Undo within 30 days unless cache cleared. Dislikes without comments aren't counted. Analytics record active interactions only.

## Site Features

### Creating Smart Bars

Create custom banners with:
- Content (text, formatting)
- Appearance (position, color theme)
- Visibility rules (URLs, IP, browsers, devices, language, project)

Supports global or language-specific display. Edit/delete available.

### Smart Bar Management

Centralized interface managing Smart bars with:
- Language selection
- Status toggles
- Detailed previews
- Show/hide rules
- Editing/deletion options
- Filters for organization
- New Smart bar creation

## Support

### Ticket Deflectors

Reduce support tickets by enabling self-service resolution. Improves satisfaction and reduces workload.

### Managing Ticket Deflectors

Overview page manages deflection forms with:
- Title/status viewing
- Update history
- Create/clone/edit/delete
- Helpdesk integration
- Preview before publication
- Link copying

**Limitation:** Main workspace only. Set offline before deleting.

## Compliance

### Cookie Consent

Required for cookie usage, especially under GDPR. Add consent bar or popup for compliance.

### Adding Cookie Consent

1. Navigate to **Settings** > **Knowledge base site** > **Cookie consent**
2. Customize message for all or specific languages
3. Choose bar or popup format
4. Select position and theme (light, dark, custom)
5. Add CTA (text, button, or icon)
6. **Preview** and **Save**

## Support

### Adding Ticket Deflectors to Header/Footer

Add to header/footer navigation and other sections. Instructions cover primary/secondary navigation and footer placement. Forms must be activated. Clone to duplicate forms. Delete inactive forms only.

### Creating Ticket Deflectors

Route users to self-service resources. If no solution found, direct to contact form. Business/Enterprise plans support up to 10 deflectors.

## Integrations

### Helpdesk Configuration

Integrate with **Freshdesk** and **Zendesk** for direct ticket creation. Configuration requires API keys, domain URLs, and agent emails. Validate and save to complete.

### Adding New Integrations

1. Navigate to **Integrations** in **Settings** > **Knowledge base site**
2. Select desired app
3. Choose Basic or Custom configuration
4. Provide required information
5. Click **Add**

Check specific app instructions for details.

### Integration Overview

Over 25 third-party integrations across analytics, chat, comments, and marketing automation. Supported by Professional, Business, and Enterprise plans.

## Support

### Creating Ticket Deflectors - Detailed

1. Navigate to **Settings** > **Knowledge base site** > **Ticket deflectors** > **New ticket deflector**
2. Configure **Title, Slug, Description** (max 150 chars)
3. Set up **Context Questions** with qualifying statements
4. Add **Suggestions** (additional questions, answers, links)
5. Customize **Contact Form** (Email, First Name, Description mandatory)
6. Configure **Ticket Submission Settings** (notifications, helpdesk mapping)
7. **Localize Text** via **Localization & Workspaces** > **Localization variables**

## Integrations

### Managing Integrations

Update credentials, description, status on Integrations page via **Edit**. Delete after confirmation. Troubleshoot by checking App ID/URL, connection, and app-specific instructions. Periodically review and update integrations. Add analytics scripts via Custom HTML.

### Integration Overview Page

Manage integrations by toggling status and viewing type, description, user involvement. Categories include:

**Analytics:** Google Analytics, Hotjar, Heap (9 tools)
**Chat:** Intercom, Drift, Crisp (11 tools)
**Commenting:** Disqus, Facebook Comments (2 tools)
**Marketing:** Mailchimp, HubSpot, Zoho PageSense (3 tools)

### Code Filtering

Configure conditions (IP address, workspace, language) to control integrated app execution. Use AND/OR logic for combinations. Example: filter Google Analytics by IP, workspace, or language for targeted data collection.

### LiveChat Integration

1. Navigate to **Settings** > **Knowledge base site** > **Integrations**
2. Select **LiveChat**
3. Enter LiveChat ID and description
4. Click **Add**

Existing users: Get ID from LiveChat dashboard. New users: Copy during setup.

## Site Customization

### Custom HTML Integration

Add HTML snippets for third-party integrations:
1. Navigate to **Settings** > **Knowledge base site** > **Integrations**
2. Choose insertion point (Header, Begin Body, End Body)
3. Paste code
4. **Save**

Enables widgets like analytics or chat support based on placement.

## Integrations

### Olark Integration

Features include visitor co-browsing, geolocation, browsing history, and chat transcripts. Improves communication and troubleshooting.

### LiveChat Overview

AI-powered real-time communication enhancing user experience and reducing costs. Comparison table shows plan support:

| Professional | Business | Enterprise |
|--------------|----------|------------|
| Basic support | Enhanced features | Full functionality |

### Getting LiveChat ID

**Existing customers:** Access dashboard > Install > Find ID after `window.lc.license=`
**New customers:** Copy ID during account setup

### Getting Olark ID

1. Log into Olark
2. Go to **Settings** > **Channels** > **Installation Code**
3. Copy code
4. Find `olark.identify()` function
5. Extract 13-digit ID

### Freshchat Integration

Messaging platform supporting AI chatbots and WhatsApp integration. Features consolidated inbox and self-service chatbots.

### Integrating with Olark

1. Log into Document360 Knowledge Base portal
2. Navigate to **Settings** > **Knowledge Base Site** > **Integrations**
3. Select **Olark**
4. Enter Olark ID and description
5. Click **Add**

### Integrating with Freshchat

1. Access Document360 **Settings** > **Knowledge base site** > **Integrations**
2. Select **Freshchat**
3. Enter description
4. Paste Freshchat token (from Freshchat dashboard)
5. Configure inclusion/exclusion rules
6. Click **Add**

Enables searchable knowledge articles within Freshchat.

### Chatra Integration

Real-time chat during content navigation. Reduces costs and improves satisfaction.

### Integrating Document360 and Crisp

1. Navigate to **Settings** > **Knowledge base site** > **Integrations**
2. Select **Crisp**
3. Enter description and Crisp website ID
4. Configure conditions if needed
5. Click **Add**

Provides chatbot functionality with email and mobile support.

### Integrating Document360 and Chatra

1. Get Chatra ID from dashboard
2. Navigate to **Settings** > **Knowledge base site** > **Integrations**
3. Select **Chatra**
4. Enter ID and description
5. Configure conditions
6. Click **Add**

Enables real-time support, targeted chats, and visitor tracking.

## Integrations

### Crisp and Plan Support

| Professional | Business | Enterprise |
|--------------|----------|------------|
| Zendesk, Slack, Trello | Salesforce, Mailchimp, HubSpot | Jira, Google Analytics, Advanced CRM |

**Crisp Features:**
- Cost efficiency through simultaneous conversations
- Predefined answers for common queries
- Enhanced communication with visuals/GIFs

### Gorgias Integration

Multi-channel helpdesk with unified customer view. Integrates for streamlined query management.

### Integrating with Gorgias

1. Obtain Gorgias ID from dashboard
2. Add as new integration in Document360
3. Configure conditional inclusion if needed

### Doorbell Integration

Collect, manage, and analyze customer feedback with screenshot attachments. Enhances interactions and conversions.

### Integrating with Doorbell

1. Navigate to **Settings** > **Knowledge base site** > **Integrations**
2. Select **Doorbell**
3. Enter Doorbell ID and description
4. Configure conditions if needed
5. Click **Add**

### Getting the Gorgias App ID

**Existing users:** Log in > **Settings** > **Channels** > **Chat** > Add new integration > Install manually
**New users:** Copy ID during LiveChat setup

### Sunshine Conversations Integration

API-based CRM on AWS for customer communication. Integrates to streamline interactions.

### Integrating Document360 and Belco

1. Obtain Belco Shop ID
2. Navigate to **Settings** > **Knowledge base site** > **Integrations**
3. Select **Belco**
4. Enter Shop ID and description
5. Configure conditions
6. Click **Add**

Links chatbot interface to structured knowledge base for e-commerce.

### Belco Overview

Real-time chat reducing operational costs through efficient conversation management.

### Kommunicate Integration

AI-powered real-time support improving efficiency and satisfaction. Integrates chatbots for faster resolution.

### Integrating Document360 and Sunshine Conversations

1. Navigate to **Settings** > **Knowledge base site** > **Integrations**
2. Select **Sunshine Conversations**
3. Enter description and App ID
4. Configure conditions if needed
5. Click **Add**

### Obtaining Sunshine Conversations ID

1. Access dashboard
2. Create new app
3. Fill details and save
4. Navigate to app settings
5. Locate App ID in App Details section
6. Generate API keys if needed## Integrations

### Kommunicate Integration

1. Navigate to **Settings** > **Integrations**
2. Select **Kommunicate**
3. Enter description and Kommunicate ID
4. Configure conditions (IP, workspace, language)
5. Click **Add**

AI-powered real-time support. Faster query resolution. Improved customer satisfaction.

### Getting the Kommunicate App ID

- **Existing users**: Settings > Install
- **New users**: Get ID during installation
- Copy the App ID and paste in Document360 integration settings

Enables 24/7 chat support and lead qualification.

### Google Analytics Integration

1. Go to **Settings** > **Integrations**
2. Select **Google Analytics**
3. Choose Basic (GA ID) or Custom (snippet)
4. Configure conditions if needed
5. Click **Add**

### Getting the Google Analytics ID

1. Access Google Analytics account
2. Find "Tracking ID" in property settings
3. Copy ID to Document360 integration field

Tracks views, location, and user behavior.

### Google Analytics (GA4) Integration

1. Navigate to **Settings** > **Integrations**
2. Select **GA4**
3. Enter Measurement ID (starts with 'G-')
4. Configure conditions
5. Click **Add**

### Getting the GA4 Measurement ID

1. Go to Google Analytics Admin > Property Settings > Data Streams
2. Select your stream
3. Click Configure tag settings
4. Copy 'G-' ID from "Your Google Tag" section
5. Paste in Document360 GA4 integration field

### Google Tag Manager Integration

1. Go to **Settings** > **Integrations**
2. Select **Google Tag Manager**
3. Choose Basic (GTM ID) or Custom (snippet)
4. Configure conditions
5. Click **Add**

### Getting the Google Tag Manager ID

- **Existing users**: Workspace section in GTM account
- **New users**: Initial setup after container creation
- Copy the ID from the provided code snippet

### Segment Integration

1. Navigate to **Settings** > **Integrations**
2. Select **Segment**
3. Choose Basic (Account SID) or Custom configuration
4. Configure conditions
5. Click **Add**

### Getting the Segment ID

1. Access Segment dashboard
2. Go to Develop section
3. Copy Account SID from Account info

### Heap Integration

1. Go to **Settings** > **Integrations**
2. Select **Heap**
3. Choose Basic (App ID) or Custom configuration
4. Configure conditions
5. Click **Add**

### Getting the Heap App ID

- **Existing customers**: Account > Install > Web
- **New customers**: Provided during setup
- Copy ID from the installation snippet

### Hotjar Integration

1. Navigate to **Settings** > **Integrations**
2. Select **Hotjar**
3. Choose Basic (ID) or Custom (snippet) configuration
4. Enter description and Hotjar ID
5. Configure conditions
6. Click **Add**

### Getting the Hotjar ID

1. Click "Set up Hotjar" in sidebar
2. Locate snippet with `hjid` variable
3. Copy the ID

Enables heatmaps, session recordings, and surveys.

### Amplitude Integration

1. Go to **Settings** > **Integrations**
2. Select **Amplitude**
3. Choose Basic or Custom configuration
4. Enter API key
5. Configure conditions
6. Click **Add**

### Getting the Amplitude API Key

- **New customers**: Register and receive key during setup
- **Existing customers**: Projects > General section in dashboard

### FullStory Integration

1. Navigate to **Settings** > **Integrations**
2. Select **FullStory**
3. Configure with Basic (description + ID) or Custom (snippet)
4. Set conditions if needed
5. Click **Add**

### Getting the FullStory ID

1. Dashboard > Work name dropdown > Settings
2. Find ID in `window['_fs_org']` variable under "Install your FullStory snippet"

### Mixpanel Integration

1. Go to **Settings** > **Integrations**
2. Select **Mixpanel**
3. Choose Basic or Custom configuration
4. Configure conditions
5. Click **Add**

### Getting the Mixpanel ID

1. Log in to Mixpanel account
2. Go to Settings > Set up Mixpanel
3. Copy displayed Mixpanel ID

### Mixpanel - Sample Code

Foundational snippets for page view and button click tracking. Requires Mixpanel ID and customization for specific use cases.

### VWO Integration

1. Navigate to **Settings** > **Integrations**
2. Select **VWO**
3. Enter VWO Account ID
4. Configure conditions
5. Click **Add**

Enables A/B testing, user intent extraction, and push notifications.

### Zoho PageSense Integration

1. Go to **Settings** > **Integrations**
2. Select **Zoho PageSense**
3. Enter Zoho PageSense ID
4. Configure conditions
5. Click **Add**

Provides heatmaps, A/B testing, form analytics, and session recordings.

### Freshmarketer Integration

1. Obtain Freshmarketer Script Tag Src from Admin settings > Tracking and Integrations > CRM Code Library
2. Go to Document360 **Settings** > **Integrations**
3. Select **Freshmarketer**
4. Enter description and script tag
5. Configure conditions
6. Click **Add**

Enables A/B testing, heatmaps, and funnel analysis.

### GoSquared Integration

1. Obtain Project Token from GoSquared account
2. Navigate to Document360 **Settings** > **Integrations**
3. Select **GoSquared**
4. Enter token
5. Click **Add**

Provides analytics, live chat, automation, and customer data hub.

### Commento Integration

**Method 1: Direct Integration**
1. Go to **Settings** > **Integrations**
2. Select **Commento** under Comments
3. Enter description
4. Configure conditions
5. Click **Add**

**Method 2: Custom HTML**
1. Get Universal Snippet from Commento Staging tab
2. Modify URL to project domain
3. Go to Document360 **Settings** > **Integrations**
4. Paste code under Custom HTML
5. Select insertion at end of body
6. Click **Add**

### Disqus Integration

1. Navigate to **Settings** > **Integrations**
2. Select **Disqus**
3. Paste Disqus URL from Universal code snippet
4. Click **Add**

Enables multilingual commenting with moderation features.

### Freshdesk Integration

1. Go to **Settings** > **Extensions**
2. Find **Freshdesk** under Helpdesk
3. Click **Connect**
4. Generate API token in Document360
5. Paste token in Freshdesk marketplace app
6. Click **Install**

Support agents access articles directly within Freshdesk.

### Freshservice Integration

1. Generate Document360 API token
2. Access Freshservice marketplace
3. Find Document360 app
4. Paste API token
5. Click **Install**

Repeat for multiple knowledge bases.

### Zendesk Integration

1. Install Document360 app from Zendesk Marketplace
2. Generate API token in Document360
3. Paste token in Zendesk setup
4. Enter title and restriction settings
5. Click **Add**

Agents access articles directly within Zendesk.

### Zendesk - Creating Articles

1. Click "Create Article" in Document360 Zendesk app
2. Input title and category
3. Write content in Markdown
4. Publish article

Quick launch feature links articles to chat replies.

### Zendesk - Article Search and Sharing

1. Use Document360 app within Zendesk tickets
2. Search articles by ticket title or search bar
3. Preview and share: link, insert content, or open in new tab

### Zendesk - Federated Search

1. Go to **Settings** > **Extensions** > **Zendesk**
2. Click **Setup**
3. Configure under "Zendesk federated search"
4. Enter Zendesk subdomain, admin email, and API token
5. Validate details
6. Select workspace and language for syncing
7. Click **Save**

Search Document360 articles within Zendesk as external sources.

### Zendesk - Uninstallation

1. Navigate to **Apps and integrations** > **Zendesk Support apps**
2. Locate Document360 app
3. Hover and click settings icon
4. Select **Uninstall**
5. Confirm removal

### Intercom Integration

1. Go to **Settings** > **Extensions**
2. Find **Intercom** under Helpdesk
3. Click **Connect**
4. Sign in and authorize access
5. Click **Edit** icon
6. Select workspace and language
7. Click **Save**

Real-time support with article search and sharing.

### Intercom - Article Creation

1. Use Document360 app assistant in Intercom
2. Fill title, body, and category
3. Create articles without extra accounts

### Salesforce Integration

Enterprise plan add-on only.

1. Navigate to **Settings** > **Extensions** > **Salesforce**
2. Click **Connect**
3. Purchase add-on if needed
4. Choose environment (live/sandbox)
5. Authorize access
6. Confirm connection status

Support agents access articles directly within Salesforce console.

### Salesforce - Content Management

1. Use **Knowledge Base** tab in Salesforce
2. Search articles and categories
3. Select workspaces and languages via dropdowns
4. Filter results by name
5. Open articles in **Reader View**
6. Copy links, open on site, or copy excerpts

### Salesforce - Cases Integration

Enterprise plan feature only. Integrate Document360 into Salesforce Cases by embedding Visualforce component.

### Salesforce - Article Recommendations

Auto-recommends articles based on case subject keywords. Displays up to 5 articles with title, snippet, and sharing options.

### Slack Integration

1. Go to **Settings** > **Extensions**
2. Find **Slack** under Team collaboration
3. Click **Connect**
4. Grant workspace access
5. Confirm connection

### Slack - Commands

- Search: `/doc360 search query`
- Create: `/doc360 create Title` (Markdown editor)
- Articles created in draft form

### Microsoft Teams Integration

1. Add Document360 app to Teams
2. Generate API key in Document360
3. Enter API key in Teams app
4. Use `/Document360` command

Enterprise plan only.

### Microsoft Teams - Article Search

Search and share using app logo or `/Document360search` command. Customize share messages before sending.

### Drift Integration

1. Obtain JavaScript code from Drift Settings > App Settings > Install
2. Paste code in Document360's Custom CSS & JavaScript section
3. Connect via Extensions section
4. Use `/doc360` slash commands for search and sharing

### Zapier Integration

Connect Document360 to various apps for workflow automation.

### Zapier - Setup

1. Access Document360 project
2. Go to **Settings** > **Extensions** > **Team collaboration**
3. Click **Connect** on Zapier tile
4. Copy generated API token

### Zapier - Google Docs

Enterprise plan only. Automate content flow from Google Docs to Document360 articles.

### Zapier - Google Sheets

Business and Enterprise plans. Sync article additions to Google Sheets. Create articles when new rows added.

### Zapier - Trello

Sync article publishing events to Trello cards. Include content, contributor, and publish date.

### Zapier - GitHub

Enterprise plan only. Create articles from GitHub commits. Map fields between platforms.

### Zapier - Zoho CRM

Create articles when new leads/contacts added. Map fields and automate data synchronization.

### Zapier - HubSpot

Create articles from new support tickets. Map ticket data to article attributes.

### Zapier - Asana

Create articles from Asana tasks. Map task fields to article content.

### Zapier - Monday.com

Transfer content from Monday.com to Document360. Map task fields to article attributes.

### Zapier - Typeform

Create or update articles from form submissions. Automate feedback collection.

### Zapier - Gmail

Send email notifications about new articles. Configure recipients and content.

### Zapier - Mailchimp

Sync articles to marketing campaigns. Automate subscriber notifications.

### Make Integration

1. Navigate to **Settings** > **Extensions** > **Team collaboration**
2. Click **Connect** on Make tile
3. Copy generated Token

### Make - Asana

Automate article creation from Asana tasks:
1. Create scenario in Make
2. Connect Asana account
3. Configure task filters
4. Add Document360 module
5. Map task data to article fields
6. Test scenario
7. Activate workflow

### Make - Monday.com

Connect Monday.com with Document360:
1. Create scenario in Make
2. Authenticate both platforms
3. Link modules
4. Test integration
5. Schedule workflow

### Make - Typeform

Create articles from form submissions:
1. Configure Make scenario
2. Connect Typeform (specify form ID)
3. Connect Document360 (API key)
4. Map response fields
5. Test and schedule

### Make - Jira

Create articles from Jira tasks:
1. Create scenario in Make
2. Connect both platforms via APIs
3. Map task fields to article attributes
4. Configure triggers
5. Test thoroughly

## API Management

### Generating API Keys

1. Go to **Settings** > **Extensions** > **Team collaboration**
2. Click **Connect** on desired extension tile
3. Copy generated Token
4. Secure token for third-party integrations

## Localization

### Language Configuration

1. Navigate to workspace settings
2. Choose language
3. Set as default
4. Toggle script direction (LTR/RTL)
5. Save changes

### Crowdin Integration

1. Create Crowdin enterprise project
2. Generate Document360 API token
3. Configure Crowdin API token in Document360
4. Sync categories and articles

Push updates directly from Document360 to Crowdin projects.

### Phrase Integration

Enterprise plan only.

1. Go to **Settings** > **Extensions** > **Phrase**
2. Click **Details**
3. Select workspace and translation languages
4. Choose articles to translate
5. Click **Translate**
6. Monitor status via refresh and filtering

### Adding Languages to Versions

**Method 1**: Edit existing workspace
- Select languages
- Set defaults
- Configure display names and script direction

**Method 2**: Add new workspaces
- Create workspace per language
- Start with machine translation
- Manual translation required

Cannot delete or hide default language.

### Supported Languages

Document360 supports 48 languages including English, Spanish, French, Chinese, Japanese, Korean, and regional variants.

## Content Organization

### Workspaces

Specialized documentation areas within projects. Organize content by audience or product lines.

### Adding New Workspaces

1. Go to **Settings** > **Localization & Workspaces**
2. Click **Add workspace**
3. Choose type and enter name (max 30 characters)
4. Customize URL
5. Set status (Main, beta, public, deprecated)
6. Configure languages
7. Click **Add**

## Data Management

### Backup and Restore

Automatic daily backups at 00:00 UTC. Manual backups available. Restore documentation, API docs, homepage, CSS, and JavaScript.

### Creating Manual Backups

1. Navigate to **Settings** > **Backup and Restore**
2. Click **New backup**
3. Enter backup name
4. Click **Backup**

### Restoring from Backup

1. Go to **Settings** > **Backup and Restore**
2. Select backup
3. Choose elements to restore
4. Compare versions for Custom CSS/JS
5. Click **Restore**
6. Confirm action

## Notifications

### Configuring Notification Channels

Available channels: webhook, Slack, Microsoft Teams, SMTP.

1. Go to **Settings** > **Notifications** > **Notification channels**
2. Add, edit, or delete channels
3. Map events to channels

### Webhook Notifications

1. Go to **Settings** > **Notifications**
2. Select **Webhook**
3. Enter friendly name
4. Choose request method (POST/PUT)
5. Specify URL, format, headers
6. Configure authorization if needed
7. Click **Save**

### Slack Notifications

1. Create Slack app with incoming webhooks
2. Copy webhook URL
3. Go to Document360 **Settings** > **Notification channels**
4. Add new channel
5. Select **Slack**
6. Enter friendly name and webhook URL
7. Click **Save**

### Microsoft Teams Notifications

1. Create Teams channel
2. Get webhook URL from channel settings
3. Go to Document360 **Settings** > **Notification channels**
4. Add new channel
5. Select **Teams**
6. Enter friendly name and webhook URL
7. Click **Save**

### SMTP Notifications

1. Go to **Settings** > **Notification channels** > **New channel**
2. Select **SMTP**
3. Enter descriptive name
4. Add recipient emails (semicolon separated)
5. Click **Save**
6. Map events to trigger notifications

### Notification Event Types

- Documentation editor: article updates, visibility changes
- Drive: folder/file modifications
- Portal settings: workspace updates, tag changes
- Knowledge site: feedback alerts
- AI notifications: credit usage
- Analytics: weekly metrics
- Comments: inline notifications

### Custom Email Domains

Enterprise feature only.

1. Add domain in Document360
2. Obtain MX and TXT records
3. Configure records with DNS provider
4. Verify domain
5. Specify "From" address and sender name

## API Integration

### Postman Integration

1. Import Document360 API: `https://apihub.document360.io/swagger/v2/swagger.json`
2. Generate API token in Document360
3. Create Postman environment variable `base_URL`
4. Set value to `https://apihub.document360.io`

Access endpoints via Postman. Re-authenticate when sessions expire.## Notifications

### Managing Notification History

Access notification history via **Settings > Knowledge base portal > Notification > Notification history** tab.

History includes:
- Channel name
- Delivery status
- Submission date
- Sent date
- Event details

Use **View details** to review content sent to users.

## API Integration

### Swagger Documentation

Authenticate with API token. Use standard HTTP methods:
- `GET` to retrieve
- `POST` to add
- `PUT` to update
- `DELETE` to remove

Required fields use underscores (e.g., `email_id`). Authentication required for all requests. Sessions may expire requiring re-authentication.

## Search

### Full Portal Search

Search across all project content, files, tags, users, content tools, and settings simultaneously. Works across all workspaces and languages.

### Article Search

Search all project articles and categories across workspaces and languages.

### Accessing Articles via Search

1. Click search icon
2. Select "Articles" 
3. Type keywords

Results show:
- Article title
- Workspace
- Language
- Status

Use filters to refine. Preview results or click "Go to article" for full document.

### Article Search Filters

Filter by:
- Workspace/language
- Visibility (None, Visible, Hidden)
- Status (None, New, Draft, Published)
- Contributors (username)
- Tags (multi-select)
- Updated date (7 days, 30 days, 3 months, 1 year, or custom)

Filters can be cleared.

### Accessing Full Portal Search

1. Click search icon in top navigation bar
2. Select module: All, Article, Drive file, Users & Groups, Tags, or Settings
3. Enter keywords (max 5 results per module)
4. Click "More articles" to expand results
5. Apply filters or preview items
6. Navigate using "Go to article"
7. Press Escape to exit

### Drive File Search

Search all Drive files in a project. Table support varies by Professional, Business, and Enterprise plans.

### Accessing Drive Search

1. Click search icon
2. Select "Drive"
3. Type keywords

Results show:
- File name
- Dependencies
- Update details
- Size
- Tags

Filter by:
- Status (all, deleted, starred)
- File type (image, word, etc.)
- Uploaded by
- Tags
- Upload date
- Custom date range

Click file to view details and dependencies.

### Users and Groups Search

1. Click search icon
2. Select "Users & Groups"
3. Type keyword

Results categorized as:
- **Team accounts & groups**: view/manage permissions, see members
- **Readers & groups**: view readers, manage associated readers

### Tag Search

Search knowledge base tags and view dependency information. Access varies by user role and plan level.

### Users and Groups Search Filters

Filter by:
1. **Type**: All entity, Team account, Team account groups, Reader, Reader Groups
2. **Last logged in**: All, 7 days, 30 days, 3 months, 1 year, or Custom date

Click **Apply** or **Clear** to reset.

### Settings Search

Search knowledge base portal features and settings.

### Accessing Settings Search

1. Click Search icon
2. Select "Settings"
3. Search by keyword
4. Click setting to view/modify

Settings grouped by:
- Knowledge base portal
- Knowledge base site
- Users & Security

Results display name, icon, and description.

## Site Configuration

### Custom Domain Mapping

Replace default `project-name.document360.com` with custom domain (e.g., `help.yourcompany.com`). Improves branding and user experience.

Access: Settings > Knowledge base site > Custom domain

### Setting Up Custom Domains

1. Add domain in Document360 settings
2. Create CNAME record with domain registrar
3. Verify setup in Document360

If "Deceptive site ahead" warning appears, check Google Safe Browsing status.

### Custom Domains for Apex Domains

Use root domain with Document360:
- Ensure registrar supports DNS flattening
- Use alternative DNS provider (e.g., Cloudflare) if unsupported
- Document360 provides SSL certificate (renew within 90 days)
- Include Common Name (CN) in certificate

### Editing Default Domains

1. Go to **Custom domain** page
2. Click **Edit** icon next to default domain
3. Enter preferred domain
4. Click **Update** if available

### Load Balancer

Distributes traffic across servers for performance and reliability during high usage.

Upgrade benefits:
- Enhanced security
- Better traffic management
- No downtime

Upgrade process:
1. Navigate to **Settings > Knowledge base site > Custom domain > Custom domain mapping**
2. Click **Upgrade**
3. Verify configuration
4. Copy generated CNAME record
5. Set up CNAME with domain registrar
6. Re-verify configuration

Contact support if needed.

### Subfolder Hosting

Organize content hierarchically within folders under root domain (e.g., `example.com/docs`). Often preferred for SEO over subdomains.

### Troubleshooting Domain Issues

**Domain Verification Failed**:
- Ensure CNAME records match
- Remove duplicate DNS records
- Use tools like Digwebinterface to verify

**DNS Propagation**:
- Allow up to 24 hours
- Check TTL settings

**CAA Restrictions**:
- Verify CAA records don't restrict SSL providers
- Add required entries for Digicert, LetsEncrypt, Google

**"This site can't be reached" Error**:
- Verify DNS configuration
- Check for duplicates
- Ensure SSL provider CAA entries exist

**SSL Certificate Issues**:
- Check expiration dates
- Verify browser settings
- Confirm DNS resolver configuration

### Post-Configuration Steps

Redirect main domain to prevent duplicate content issues with search engines. Configure canonical URL in portal settings to indicate preferred URL. Contact support for redirects.

### Web Server Information

Delivers website content to clients. Common servers: Apache, Nginx, ASP.NET Core, Microsoft IIS, OpenResty, LiteSpeed, Cloudflare.

### Enabling Subfolder Hosting

1. Navigate to **Settings > Knowledge base site > Custom domain > Subfolder hosting**
2. Toggle feature on (default path: `/docs`)
3. Enter custom path if needed
4. Click **Update**

For KB Site 2.0:
- Customize Site API path (e.g., `/docs-api`)
- Define both subfolder and API paths

**Note**: Article preview unsupported with subfolder hosting.

### Accessing Tag Search

1. Click Search icon (top right)
2. Select "Tags"
3. Type keyword

Results show:
- Tag name
- Dependencies (articles, categories, files)

Click tag to view dependency details:
- Articles/categories: name, version, language, contributor, status, publish date
- Files: thumbnail, filename

Download files or remove dependencies using checkboxes.

### Nginx Subfolder Hosting

Configure using location blocks, proxy_pass, headers, and sub_filter directives. Restart after changes.

### Nginx Configuration

Location blocks direct requests based on URL patterns. Define selection algorithms for proper routing.

### Nginx Sitemap Proxy

Proxy sitemap requests to backend server:
- Replace `example.document360.io` with your domain
- Supports language-specific sitemaps (e.g., `/sitemap.xml.en`)
- Forward headers for security and tracking

### Nginx Post-Configuration

Knowledge base accessible via project URL and custom domain. Redirect from Document360 subdomain to custom domain to avoid duplicate content. Contact support for redirect setup.

### Nginx Subfolder Setup

Add location blocks for subdirectory:
- Specify proxy_pass
- Set headers
- Configure sub_filter for URL rewriting
- Add separate blocks/redirects for multiple workspaces
- Restart Nginx

### ASP.NET Core Subfolder Hosting

Host knowledge base as subfolder using ASP.NET Core server:
1. Install `Microsoft.AspNetCore.Proxy` package
2. Configure proxy to route requests
3. Define subfolder and API paths (KB Site 2.0)

Replace example domain with actual Document360 or custom domain.

### ASP.NET Core Post-Configuration

Redirect original site URL to custom subfolder to avoid duplicate content. Contact `support@document360.com` for setup.

### IIS Subfolder Hosting

Integrate knowledge base into existing website via subfolder (e.g., `/help`).

Prerequisites:
- Application Request Routing module
- URL Rewrite module

Replace example domain with actual Document360 or custom domain.

### IIS Subfolder Setup

1. **Install Required Modules**:
   - [URL Rewrite module](https://www.iis.net/downloads/microsoft/url-rewrite)
   - Application Request Routing module

2. **Configure web.config**:

```xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
   <rewrite>
      <rules>
            <rule name="ReverseProxy_HomePage" enabled="true" stopProcessing="true">
               <match url="^help$" />
               <action type="Rewrite" url="https://example.document360.io/v1" />
               <serverVariables>
                  <set name="HTTP_requested_by" value="proxy" />
                  <set name="HTTP_X_ORIGINAL_ACCEPT_ENCODING" value="{HTTP_ACCEPT_ENCODING}" />
                  <set name="HTTP_ACCEPT_ENCODING" value="" />
               </serverVariables>
            </rule>
            <rule name="ReverseProxy_DocsPage" enabled="true" stopProcessing="true">
               <match url="^help/(.*)" />
               <action type="Rewrite" url="https://example.document360.io/help/{R:1}" />
               <serverVariables>
                  <set name="HTTP_requested_by" value="proxy" />
                  <set name="HTTP_X_ORIGINAL_ACCEPT_ENCODING" value="{HTTP_ACCEPT_ENCODING}" />
                  <set name="HTTP_ACCEPT_ENCODING" value="" />
               </serverVariables>
            </rule>
      </rules>
   </rewrite>
</system.webServer>
</configuration>
```

**Important**: Backup `web.config` before changes. Define both subfolder and API paths for KB Site 2.0.

### Apache Subfolder Hosting

Host Document360 knowledge base as subfolder using Apache HTTP server.

Steps:
- Enable proxy, headers, substitute modules
- Configure VirtualHost for proxying and URL substitutions
- Set up redirects
- Restart server

Substitutions ensure links reflect subfolder structure. Redirects manage URL paths.

### IIS Post-Configuration

Redirect from original project URL to custom subfolder to avoid duplicate content. Contact `support@document360.com` for setup.

## User Management

### Reader Self-Registration

Users create reader accounts independently:
1. Visit knowledge base URL
2. Enter name and email
3. Verify email for password setup

Email verification is one-time process usable across projects.

### Plan Availability

Available for Business and Enterprise plans when site access is Private or Mixed.

### Configuring Reader Self-Registration

Enable in Document360 settings:
- Configure default reader groups
- Restrict access by email domain (allow/block specific domains)
- Newly registered readers join default groups unless domain-specific settings exist

### Domain Restrictions

Specify email domains for self-registration:
- Allow or block specific domains
- Assign reader groups to domains
- Domain-specific settings override defaults

### Creating Reviewer Accounts

Create individually or via CSV bulk import:
- Select "Reviewer" role during creation
- Specify content access permissions
- Ensure correct portal and content roles

### Reader Self-Registration FAQs

**No default reader group selected**: Readers get unrestricted access.

**Multiple group memberships**: Readers receive highest access level per content item.

**Individual vs. group access**: Highest privilege from both granted.

**Access prioritization**: Highest privilege at each content level determines access.

**Self-registration not working with SSO**: Requires Document360 login page (bypassed by SSO).

### Reviewer Role Overview

View articles, add comments, update workflow statuses without editing content. Available across Professional, Business, and Enterprise plans.

### Managing Reviewer Accounts

Manage via "Team accounts & groups" section:
- Edit/delete accounts
- Convert to/from reader accounts
- Purchase reviewer add-ons through billing

Conversion to reader requires content access permissions selection.

### Reviewer Role Capabilities

Access articles in draft/workflow states, leave comments, suggest edits, update workflow statuses. Access controlled by category/article permissions.

Plan limits:
- Professional: 5 accounts
- Business: 10 accounts
- Enterprise: 20 accounts

No direct content editing permitted.

### Account Lockout

Five failed password attempts = 30-minute lockout. User sees: "Account locked due to multiple failed attempts! Please try again after 30 minutes."

### Reviewer Permissions

Access Documentation module to:
- View articles in Draft or workflow states
- Add inline/general comments
- Update workflow statuses
- Set due dates
- Manage assignments
- Perform bulk updates

Restrictions:
- No comments in Read only mode
- One active reviewer per article

### Password Requirements

≥8 characters with:
- 1 uppercase letter
- 1 lowercase letter
- 1 number
- 1 special character

### Password Reset

1. Click "Forgot password?"
2. Enter email
3. Check inbox for reset link
4. Click link
5. Set new password
6. Confirm

Changes apply to entire account.

### Changing Passwords

Follow instructions in [Change password article](https://docs.document360.com/v3/docs/change-password).

## Access Control

### Blocking Inheritance

Override inherited content access permissions for granular control. Restrict access to specific content (workspaces, languages, categories, articles) regardless of broader team permissions.

Administrators grant access to targeted accounts per content level. Removing inherited permissions isolates access to explicitly added accounts.

### Block Inheritance FAQs

Disabling inheritance restricts access to specified team accounts/groups. Account performing action is automatically selected and cannot be removed.

### Enabling Inheritance

1. Navigate to category/article in Documentation
2. Access Security settings via More icon
3. Toggle off **Block inherited account**
4. Confirm with **Yes**
5. Close blade

Allows inherited team accounts/groups to access content.

## Security

### IP Restriction

Control knowledge base access by allowing/blocking specific IP addresses (IPv4 and IPv6). Applies to all workspaces and languages within project.

### Managing IP Restrictions

1. Navigate to **Settings > User & Security > IP Restriction**
2. View IP details: name, address, Allow/Block status
3. Add IP: enter name, IP or range, save
4. Set permissions: Allow or Block
5. Remove IPs using delete icon

### IP Restriction FAQs

**IP address**: Identifying number for internet communication.

**IPv4 format**: Four numbers (0-255) separated by dots (e.g., 49.206.113.170).

**IPv6 format**: Eight hexadecimal groups separated by colons.

**IPv6 unicast address**: Identifies single interface for direct communication.

## Authentication

### Understanding SSO

Access multiple applications with single login. Users authenticate once via central service provider.

### Benefits of SSO

- Enhanced security: fewer credential storage points
- Increased productivity: faster access, fewer passwords
- Improved UX: fewer login prompts
- Simplified IT: centralized credential management
- Compliance support: meets industry mandates
- Cost reduction: less redundant systems/support

### SSO Process

Collaboration between Service Provider (Document360) and Identity Provider (IdP):
1. User accesses Service Provider
2. Redirected to IdP for authentication
3. IdP issues Access/ID token
4. Service Provider validates token
5. User accesses applications without additional sign-ins

Supports multiple IdPs.

### Identity Providers

External entity managing user identities for SSO. Stores credentials, handles logins for applications.

Examples: Okta, Entra ID, Google, ADFS, OneLogin

### Logging In with SSO

1. Navigate to Knowledge base portal
2. Enter email or subdomain
3. Click "Continue with SSO"
4. Authenticate via IdP

### IdP-Initiated Sign-In

Login directly from IdP dashboard if configured. Find Document360 app in IdP dashboard to initiate SSO login.

### Supported SSO Standards

SAML 2.0 and OpenID Connect:
- SAML 2.0: secure cross-application authentication
- OpenID Connect: modern, user-friendly alternative
- Both support various IdPs with comprehensive setup guides

### SSO Login - Portal

Access Knowledge base portal using IdP credentials. Eliminates need for multiple passwords.

### SSO Login - Site

Knowledge base site supports SSO login with existing IdP credentials.

### SSO Login Process

1. Visit site
2. Select IdP login button
3. Log into IdP
4. Automatically logged in

Login buttons vary by configuration.

### Troubleshooting SSO Login

HTTP 500 error likely from:
- Outdated SAML certificate
- Incorrect attribute mappings

Solutions:
- Update IdP with latest Document360 metadata
- Verify SAML attributes match exactly

Contact support if issues persist.

### Adding SSO Team Accounts

Standard team account creation + additional steps:
1. Ensure user email matches SSO domain
2. Select SSO configuration
3. Optionally skip invitation email

Only Owners/Admins can add accounts.

### Enabling IdP-Initiated Sign-In

Enable during SSO setup:
1. Toggle **Allow IdP initiated Sign-In** ON
2. Find Document360 application in IdP dashboard
3. Click to initiate login
4. Access Knowledge base with SSO credentials

### Inviting SSO Users

After SAML/OpenID configuration, users authenticate via:
- Okta
- Azure AD
- Google Workspace

Add users directly or invite existing users.

### Deleting SSO Users

1. Navigate to Team accounts & groups
2. Hover over SSO account
3. Click "Delete"
4. Confirm

SSO users identified by SSO label. Deletes SSO account, not associated team account.

### SSO FAQs

Can't add user twice as SSO reader. If exists, "Create reader account" button disabled. SAML used for SSO.

### Inviting Existing Users to SSO

1. Log in to Document360
2. Navigate to **Settings > Users & Security > SAML/OpenID**
3. Edit SSO configuration
4. Select **All users** or **Selected users only**
5. Save

Users receive invitation email. Additional SSO account created alongside existing one.

### Mapping SSO Configurations

Map existing SAML/OpenID configuration to another project:
1. Log in
2. Navigate to project settings
3. Select "Create SSO"
4. Choose existing configuration from dropdown

Existing IdP and protocol must match.

### Disabling the Default Login Page

Bypass Document360 login page in specific project:
1. Enable "Disable Document360 login page" toggle
2. In project's SAML/OpenID settings

Affects SAML and OpenID SSO setups.

### Login Page FAQs

Enabling toggle forces SSO login via SAML. Eliminates email/password login.

### Auto-Assigning SSO Readers

1. Navigate to **Settings > Users & security > SAML/OpenID**
2. Enable "Auto assign reader group"
3. Select existing reader groups

Ensure reader groups pre-created.

### Converting to SSO Accounts

Convert team/reader accounts to SSO for simplified login:
1. Select accounts
2. Click "Convert to SSO account"
3. Confirm

Previous contributions appear as "Anonymous." Owner accounts become both Document360 and SSO. No reverse conversion possible.

### Auto-Assigning Reader Groups

Automate reader group assignment for SSO users. Supported across Professional, Business, and Enterprise plans.

### Account Conversion FAQs

Owners/admins and team account managers can convert accounts. JWT projects cannot convert. Accidental conversions require manual recreation.

### SSO Account Conversion Support

Typically available in Business and Enterprise plans. Professional plan availability varies by provider.

### SSO Session Timeout

Accounts timeout after 2 hours of inactivity. Configurable. SAML standard used.

### SAML SSO

SAML 2.0 enables SSO. Users login with existing IdP credentials. Supports multiple SSO endpoints.

### SSO Idle Timeout

Automatically logout inactive SSO accounts (SAML/OpenID) to prevent unauthorized access.

### Enabling SSO Idle Timeout

1. Navigate to **Settings > Users & Security > SAML/OpenID**
2. Hover over SSO configuration
3. Click **Edit**
4. Toggle **ON** "Sign out idle SSO team account"
5. Set duration (hours:minutes)
6. Click **Save**

Applies only to SSO team accounts.

### Troubleshooting SAML SSO

Common issues from incorrect/expired certificates:
1. Obtain active certificate from IdP
2. Replace in Document360 settings
3. Use SAML Tracer extension for logs
4. Contact support with screenshots

### SAML SSO with Okta

Configure SAML SSO with Okta:
- Requires Owner or Admin role
- Single authentication for Document360 access
- Switch between Okta and Document360 during setup
- Use separate browser tabs

### Configuring SAML SSO

1. Select identity provider
2. Configure SP and IdP settings
3. Enable SSO access alongside traditional login

### Supported Identity Providers

Okta, Entra ID, Google, Auth0, ADFS, OneLogin, and others.

### Configuring Okta SAML SSO

1. Gather parameters from Okta Application settings
2. Enter mappings in Document360:
   - Sign-on URL
   - Identity Provider Issuer
   - X.509 Certificate
3. Configure optional settings
4. Click "Create"

Maps Okta IdP data to Document360 SP.

### Setting Up an Okta Account

1. Visit [Okta Developer Signup](https://developer.okta.com/signup/)
2. Receive email with credentials and activation link
3. Click link to activate
4. Log in to Okta Domain
5. Access developer console

### Adding Document360 Application in Okta

1. Log in as Admin
2. Switch to admin role
3. Navigate to Applications > "Create App Integration"
4. Select SAML 2.0
5. Configure SAML settings:
   - Enter app name
   - Map parameters: Callback path, Service provider entity ID
   - Set Name ID format to EmailAddress
   - Set Application username to Email
   - Add Attribute Statements for email and name
6. Complete setup in Document360

### Configuring Azure AD for SSO

Customize Azure AD:
- Edit User Attributes & Claims
- Manage SAML signing certificates
- Configure notification emails
- Test with user credentials

### SAML SSO with Entra ID

Configure SAML SSO using Microsoft Entra as IdP:
- Requires Owner or Admin role
- Use separate browser tabs for setup

### Setting Up Custom SAML App in Google

1. Create custom SAML app
2. Download certificate
3. Note SSO URL and Entity ID
4. Enable service for all users

Details used to configure IdP in other systems.

### Adding Application in Azure AD

1. Sign in to Azure account
2. Navigate to [portal.azure.com](https://portal.azure.com)
3. Click "+ New application" > "Non-gallery application"
4. Enter name > "Add"
5. Choose "Set up single sign-on" > "SAML"
6. Configure SAML settings using Document360 parameters
7. In Document360:
   - Navigate to **Settings > Users & security > SAML/OpenID**
   - Click "Create SSO" > select "Entra ID"
   - Auto-configure SP settings
8. Map Azure AD fields to Document360
9. Complete IdP configuration in Document360
10. Finalize settings and click "Create"

### SAML SSO with Google Workspace

1. Log in to Document360 with Owner/Admin role
2. Log in to Google Workspace
3. Navigate to Admin console
4. Switch between platforms during configuration

### SAML SSO with OneLogin

Configure Document360 SSO with OneLogin using SAML:
- Requires Owner or Admin Project role
- Keep both platforms open during setup

### Configuring Identity Provider

1. Navigate to Document360 configuration page
2. Enter SAML details from Google
3. Adjust toggles for IdP-initiated sign-in
4. Complete setup with additional settings

### Configuring Service Provider - Google

1. Navigate to **Settings > Users & Security > SAML/OpenID** > "Create SSO"
2. Select **Google** as Identity Provider
3. Copy **ACS URL** and **Entity ID** from Document360
4. In Google Workspace:
   - Paste ACS URL and Entity ID
   - Set **Name ID format** to **EMAIL**
   - Select **Primary email** for **Name ID**
5. Map Google Directory attributes:
   - Add **Primary email** for `name`, `email`, `urn:oasis:names:tc:SAML:2.0:nameid`
   - Click **Add Mapping** for each
   - Click **Finish**

### Adding OneLogin Application

Add SAML Custom Connector application named "Document360 SSO" via OneLogin Admin interface.

### Configuring Document360 for SSO

1. Populate service provider fields with IdP details
2. Match `Issuer URL`, `SAML 2.0 Endpoint`, `SAML Certificate`
3. Enable/disable IdP-initiated sign-in
4. Proceed to more settings page

Establishes connection between IdP and Document360.

### Advanced SSO Settings

Configure:
- SSO name
- Custom login button text
- Auto-assign reader groups
- Idle account sign-out
- Existing account invitation

Click "Create" to finish.

### Adding ADFS Application

Create claims-aware Relying Party Trust:
- Name: "Document360 SAML SSO"
- Enable SAML 2.0 WebSSO protocol

### Configuring SAML in OneLogin

**Document360 Steps**:
1. Navigate to **Settings > Users & security > SAML/OpenID**
2. Click **Create SSO** > select OneLogin
3. Gather: Service provider entity ID, Callback path

**OneLogin Configuration**:
- Audience (EntityID): Service provider entity ID
- Recipient: Callback path
- ACS URL Validator: Callback path
- ACS URL: Callback path

**Parameters**:
- `urn:oasis:names:tc:SAML:2.0:nameid` = Email
- `email` = Email
- `name` = Email
- Ensure **Include in SAML assertion** checked

**SSO Tab**:
- Download X.509 Certificate (SHA256, PEM)
- Copy Issuer URL and SAML 2.0 Endpoint

### Configuring ADFS for Document360

1. Retrieve Subdomain, Callback, Signed-out Callback, Metadata, Service Provider Entity ID from Document360
2. Enter values in ADFS Relying Party settings:
   - Relying Party Identifier
   - Sign-On URL
   - Sign-Out URL
   - Relying Party Trust Identifier
   - Metadata URL
3. Complete ADFS wizard

### Configuring ADFS Claim Rules

Map Active Directory LDAP attributes:
- User-Principal-Name → Name ID
- E-Mail-Addresses → Email
- Display-Name → Name

### SAML SSO with ADFS

Setup requires administrative access to both platforms:
- Document360 users need Owner/Admin role
- Open both platforms in separate tabs

### SAML SSO with Other IdPs

Configure with unlisted IdPs:
- Requires Owner/Admin Project role
- Keep both platforms open during setup

### Configuring SAML in Your IdP

1. Get Callback path, Service Provider Entity ID, Single Sign-On URL from Document360
2. Configure in IdP SAML settings
3. Map attributes (email, name, user ID)
4. Consult IdP documentation
5. Save settings

### Configuring Document360 for ADFS SSO

1. Map ADFS values
2. Upload X.509 certificate
3. Enable/disable IdP-initiated sign-in
4. Customize settings (SSO name, login button text)
5. Finalize setup

### Adding Application in Your IdP

1. Log in to IdP admin console
2. Navigate to Applications/Enterprise Applications
3. Create new application:
   - Name: "Document360 SSO"
   - Type: SAML 2.0
4. Save settings

### SAML SSO FAQs

Supports Okta, Microsoft Entra, Google Workspace, OneLogin, ADFS. Enable "Allow IdP initiated sign in" for Okta access.

### Configuring Document360 for SAML SSO

1. Enter IdP details: SSO URL, Entity ID, SAML certificate
2. Upload X.509 certificate
3. Enable/disable IdP-initiated sign-in
4. Configure additional settings:
   - SSO name
   - Login button text
   - Auto-assign reader groups
   - Idle sign-out
   - User invitations
5. Complete setup

### Supported IdPs for IdP-Initiated Sign-In

SAML-based IdP-initiated sign-in supported for: Okta, Entra ID, Google Workspace, OneLogin, ADFS.

### OpenID Connect SSO

Open standard for SSO. Eliminates multiple passwords, improves security. Supports multiple SSO endpoints.

### Removing SAML SSO Configuration

1. Navigate to project Knowledge base portal
2. Go to **Settings > Users & security > SAML/OpenID**
3. Hover over configuration
4. Click Delete icon
5. Confirm with Proceed

**Important**: Deletes all associated users.

### Configuring OpenID Connect SSO

1. Navigate to settings
2. Select OpenID protocol
3. Input IdP and SP details in respective configuration screens

### Troubleshooting OpenID Connect SSO

Error IDX20803 likely from wrong IdP Authority URL:
1. Find correct "issuer" from IdP discovery document
2. Paste into Document360 SSO settings Authority field
3. Verify URL, network/firewall, certificate validity

### Adding Okta Application for OpenID

1. Log in to Okta as admin
2. Navigate to Applications
3. Click "Create App Integration"
4. Select OIDC and Web Application
5. Proceed to next step

### Configuring Document360 as OpenID SP

1. Create new OpenID connection in Document360
2. Select Okta as identity provider
3. Copy subdomain name, sign-in, sign-out redirect URIs
4. Paste into Okta web app integration setup

### Obtaining Okta Account

Required for Document360 SSO configuration. Sign up at [Okta Developer](https://developer.okta.com/signup/).

### Setting Up OpenID Connect SSO with Okta

Requires administrative access to Okta:
- Document360 users need Owner/Admin Project role
- Use separate tabs for both platforms

### Creating Auth0 Application

1. Log in to Auth0
2. Navigate to Applications
3. Create new application
4. Specify name
5. Select "Regular Web Application"
6. Click create

### Configuring Auth0 OpenID

1. Navigate to Document360 settings
2. Choose "OpenID" protocol
3. Enter Auth0 "Sign in redirect URI" and "Sign out redirect URI"
4. Save changes

### Configuring Document360 for Okta OpenID

1. Enter Okta Client ID, Client Secret, Issuer URI
2. Enable/disable IdP-initiated sign-in
3. Configure More Settings:
   - SSO name
   - Login button text
   - Auto-assign reader groups
   - Idle sign-out
   - SSO invitations
4. Save configuration

### Setting Up OpenID Connect SSO with Auth0

1. Obtain Auth0 account
2. Requires Owner/Admin Project role
3. Use separate tabs for setup
4. Configure according to Document360 specifications

### Setting Up OpenID Connect SSO with ADFS

Requires administrative access to both systems:
- Document360 users need Owner/Admin Project role
- Open both platforms in separate windows

### Configuring Document360 as OpenID SP - ADFS

1. Obtain subdomain, sign-in/sign-out URIs from Document360
2. Enter into ADFS Relying Party settings:
   - Relying Party Identifier
   - Sign-On URL
   - Sign-Out URL
3. Complete ADFS setup wizard
4. Enable user access

### Configuring ADFS Claim Rules

1. Select "Send LDAP Attributes as Claims" template
2. Map LDAP attributes:
   - User-Principal-Name → Name ID
   - E-Mail-Addresses → Email
   - Display-Name → Name
3. Use Active Directory as attribute store
4. Click "Finish" and "Apply"

### Adding ADFS Application for OpenID

1. Log in to ADFS Management console
2. Navigate to Relying Party Trusts
3. Add new Relying Party Trust
4. In wizard:
   - Select "Claims aware"
   - Choose manual data entry
   - Provide display name
   - Optionally configure certificate

### Configuring Document360 for ADFS OpenID

1. Navigate to **Configure Identity Provider** page
2. Enter Client ID, Client Secret, Authority from ADFS
3. Enable/disable IdP initiated sign-in
4. Configure More Settings:
   - SSO Name
   - Login button text
   - Auto assign reader group
   - Sign out idle SSO team account
   - SSO invitations
5. Click **Create**

### OpenID Connect SSO with Other IdPs

Configure with unlisted OpenID providers:
- Requires Owner/Admin Project role
- Keep both platforms open in separate tabs

### Configuring OpenID in Your IdP

1. Access Document360 SSO settings
2. Select "Others" as IdP > "OpenID"
3. Document360 provides Subdomain name and Redirect URIs
4. Include scopes: openid, email, profile
5. Map claims: sub, email, name
6. Review and save configuration

### Configuring Document360 for OpenID SSO

1. Provide IdP Client ID, Secret, Authorization URL
2. Enter SSO name, login text
3. Configure auto-assignment, IdP login, account sign-out
4. Upload certificates/keys
5. Click 'Create'

### Adding Application in Your IdP for OpenID

1. Log in to admin console
2. Navigate to Applications section
3. Create new application:
   - Name: "Document360 OpenID SSO"
   - Sign-in method: OpenID Connect
4. Save settings

### Configuring Document360 with ADFS

1. Navigate to **Configure Identity Provider** page
2. Enter Client ID, Client Secret from ADFS
3. Ensure Client Identifier matches ADFS Relying Party Identifier
4. Toggle **Allow IdP initiated sign in**
5. Enter ADFS Issuer URL as Authority
6. Configure More Settings:
   - SSO Name
   - Login button text
   - Auto assign reader group
   - Sign out idle SSO team account
   - SSO invitations
7. Click **Create**

### Enterprise SSO using JWT

JWT SSO uses customer application for authentication:
1. User logs into customer app
2. App requests auth code via backchannel from IdP
3. Document360 receives auth code
4. Requests ID/access token
5. Creates session (auto-renewed within 5-1440 minutes)

No separate Document360 reader account required. Exclusive to SAML/OpenID methods.

### Removing OpenID SSO Configuration

1. Access project Knowledge base
2. Navigate to **Settings > Users & security > SAML/OpenID**
3. Hover over configuration
4. Click Delete icon
5. Confirm deletion

Removes associated user accounts.

### JWT SSO Configuration

1. Create JWT via **Settings > Users & security > JWT**
2. Copy Client ID, Callback URL, Client secret
3. Enable/disable JWT SSO login
4. Configure login URL
5. Set up redirection using `redirectUrl` parameter

**Note**: Client secret only available once. Regenerate if lost.

### Setting Up JWT SSO

1. Understand JWT: header, payload, signature for secure data transfer
2. Check plan compatibility (typically Enterprise)
3. Generate JWT token with claims and expiration
4. Configure secret key for signing
5. Set up redirect flow
6. Test authentication process
7. Consult API documentation for requirements

Enhances user convenience and security.

### Resolving JWT 401 Errors in Postman

1. **Authorize Request**:
   - Set Authorization type to **Basic Auth**
   - Username: Client ID
   - Password: Client Secret

2. **Verify Request Format**:
   - Body tab: select **raw** > **JSON**
   - Include required parameters (e.g., grant_type)

3. **Confirm Credentials**:
   - Double-check Client ID and Secret

4. **Check Endpoint URL**:
   - Ensure correct token endpoint

5. **Inspect Server Response**:
   - Examine response body for details

6. **Review System Configuration**:
   - Verify credentials registered server-side

### JWT Reader Groups

Link JWT reader accounts to existing Document360 reader groups. Inherits restriction settings for knowledge base access.

### Finding Reader Group IDs

1. Navigate to **Settings > Users and Security > Readers & groups**
2. Each group displays **Group Id** below name
3. Use copy icon for easy transfer to payload

Available only for JWT-configured projects.

### Using JWT Reader Groups

Configure JWT reader access with:
- User details (name, email)
- Reader group IDs in JSON format

Changes apply after current JWT session expires. Use comma-separated IDs in `readerGroupIds` array. Token validity: 5 minutes minimum, 1 day maximum.

## Site Customization

### Customizing Search Highlight Color

1. Navigate to **Knowledge Base site > Customize site > Custom CSS & JavaScript**
2. Modify CSS snippet for KB Site 1.0 or 2.0
3. Change `background-color` and `color` properties
4. Save changes

Replaces default yellow highlight.

### Hiding Workspace Dropdown

Add CSS to custom CSS:
```css
header .header_bottom .header_bottom_nav ul li.versions-selection { display: none; }
```

Removes dropdown. Users navigate via direct URLs.

### Customizing Hyperlink Color in Dark Mode

1. Access **Custom CSS** section
2. Add CSS targeting hyperlinks in Dark mode
3. Customize color
4. Save changes

### Enlarging PDF Previews

1. Access **Knowledge Base site settings**
2. Navigate to **Custom CSS**
3. Apply CSS snippet adjusting PDF container width

Expands preview to full width.

### Customizing Code Block Language Names

Modify Custom CSS to:
1. Hide default language name
2. Display custom label (e.g., "Example")

Global change across knowledge base.

### Setting Dark Mode as Default

JavaScript method:
1. Access **Settings > Knowledge base site > Customize site > Custom CSS & JavaScript**
2. Add snippet to JavaScript tab:
```javascript
$(document).ready(function () {
  setTimeout(function () {
    document.getElementById('darkTheme').click();
  }, 100);
});
```
3. Optionally disable theme switching:
   - Navigate to **Settings > Knowledge base site > Customize site**
   - Select **Dark only** under **Site theme**
   - Save

### Centering Headings

1. Navigate to **Settings > Knowledge base site > Customize site > Custom CSS & JavaScript**
2. Paste CSS: `H2, H3, H4 { text-align: center; }`
3. Save

Globally centers specified headings.

### Changing Table Header Color

1. Navigate to customization settings
2. Add custom CSS:
   - KB Site 1.0: `table th`
   - KB Site 2.0: `.editor360-table th`
3. Modify background color
4. Save

### Changing Callout Colors in Dark Mode

1. Navigate to **Settings > Knowledge base site > Customize site > Custom CSS & JavaScript**
2. Add CSS snippet modifying:
   - `background-color`
   - `color`
   - `border-left`
3. Target `.infoBox`, `.errorBox`, `.warningBox` classes
4. Use `!important` to override defaults

## Content Formatting

### Adding Scrollbars to Code Blocks

Method 1:
- Wrap code blocks in `<div class="scroll">`
- Add custom CSS setting height and enabling scrolling

Method 2:
- Apply global CSS using `.code-toolbar` selectors

### Aligning Table Content

Add CSS to custom settings:
```css
table td, table th, table tr { vertical-align: top !important; }
```

Overrides default alignment.

### Centering Headings in Markdown

Use HTML tags: `<hN style="text-align:center;">`

Markdown lacks built-in centering.

### Centering Text in Markdown

Use HTML: `<p style="text-align:center;">Sample text</p>`

Replace "Sample text" with desired content.

### Changing Text Color in Markdown

Use HTML: `<span style="color:desiredColor;">text</span>`

Replace `desiredColor` and text content.

### Adding Extra Space in Markdown

Use HTML tags:
- `<br>` for vertical space
- `&nbsp;` for horizontal space

### Adding Accordions in Markdown

Use HTML:
```html
<details>
  <summary><strong>Accordion Title</strong></summary>
  <p>Content here...</p>
</details>
```

Supports nested content within `<p>` section.

### Aligning Images in Markdown

Default: left-aligned. No built-in alignment.

Method:
1. Use HTML `<p>` tag with inline styling:
```html
<p style="text-align: center"><img src="[Image-URL]" /></p>
```
2. Replace `[Image-URL]` with actual URL from Drive
3. Adjust `text-align` value as needed

Works with any image file type.

## Content Enhancement

### Setting Default PDF Dimensions

1. Navigate to CSS settings
2. Add CSS snippet with desired height/width in pixels

### Setting Default Featured Images

1. Navigate to **Knowledge base portal Settings > Knowledge base site > Integrations**
2. Under Custom HTML > "Add"
3. Paste meta tags:
```
<meta property="og:image" content="Image_URL" />
<meta property="og:image:secure_url" content="Image_URL" />
```
4. Replace "Image_URL" with publicly accessible image link
5. Click "Add"

Ensures consistent social media thumbnails.

### Embedding YouTube Shorts

Use iframe with modified URL:
1. Replace `/shorts/` with `/embed/`
2. Use provided iframe code
3. Adjust `src` with embed URL
4. Optimal size: 315px × 560px

### Embedding Excel Files

Embed Excel files directly into articles. Availability varies by plan level.

Process:
1. Share Excel file (File > Share > Embed)
2. Copy embed code
3. Paste into Document360 editor

## Site Customization

### Changing Feedback Button Colors

1. Navigate to **Settings > Knowledge base site > Customize Site > Custom CSS & Javascript**
2. Add CSS targeting specific classes/elements
3. Update color values
4. Save

### Hiding Footer on Mobile

Hide custom footers on mobile devices for better UX. Mobile layouts prioritize content above footer on smaller screens.## Content Enhancement

### Embedding Loom Videos

To embed a Loom video:

1. Open your video in Loom
2. Click **Share** > **Embed**
3. Copy the embed code
4. Paste into Document360 editor:
   - **Markdown**: Paste directly
   - **WYSIWYG**: Insert video > Embedded code
   - **Advanced WYSIWYG**: Insert > Video > Embed code

## Site Customization

### Changing Header Hover Color

1. Go to **Settings** > **Knowledge base site** > **Customize site** > **Custom CSS & JavaScript**
2. Add CSS targeting header hover states
3. Update color values
4. Save

Example:
```css
.header-link:hover {
  color: #ff0000; /* Replace with desired color */
}
```

### Repositioning Related Articles

Move related articles above feedback section:

1. Go to **Settings** > **Knowledge base site** > **Customize site** > **Custom CSS & JavaScript**
2. Paste JavaScript snippet in JS tab:
```javascript
window.onload = function () {
  $('.content_block_text').append('<div class="sperator"><hr></div>');
  $('.related-articles-container').appendTo('.content_block_text');
};
```
3. Click **Save**

### Hiding Footer on Mobile

1. Navigate to **Settings** > **Knowledge base site** > **Customize site** > **Custom CSS & JavaScript**
2. Select CSS based on site version:
   - **KB 1.0**: Target `.custom-footer` with `max-width: 469px`
   - **KB 2.0**: Target `site-footer-section` with `max-width: 767px`
3. Paste CSS in CSS tab
4. Click **Save**
5. Test on mobile devices

### Hiding Change Password Option

1. Go to **Settings** > **Knowledge base site** > **Customize site** > **Custom CSS & JavaScript**
2. Add CSS to hide elements:
```css
.user-dropdown-content .user-detail .portal-link a,
.nav-bar-profile button.dropdown-item {
  display: none;
}
```
3. Save changes

Note: This only hides the UI element. Direct URL access remains possible.

### Hiding Category Manager

1. Navigate to **Settings** > **Knowledge base site** > **Customize site** > **Custom CSS & JavaScript**
2. Select CSS based on site version:
   - **KB 1.0**: Hide `.left_sidebar` and `.left-sidebar-toggle`
   - **KB 2.0**: Hide `site-docs-left-panel-container`
3. Paste CSS in CSS tab
4. Save

### Hiding Left Navigation Bar

1. Go to **Settings** > **Knowledge base site** > **Customize site** > **Custom CSS & JavaScript**
2. Add CSS:
```css
site-docs-left-panel-container {
  display: none !important;
}
```
3. Click **Save**

Note: Users can still show sidebar by clicking "Show category" icon.

### Configuring Custom Fonts

1. Get font embed code from provider (e.g., Google Fonts)
2. Go to **Settings** > **Knowledge base site** > **Integrations** > **Custom HTML**
3. Paste font link in Header section
4. Add CSS rule:
```css
body {
  font-family: 'YourFont', sans-serif;
}
```
5. Save changes

## Billing

### Accessing Billing Overview

Go to **Settings** > **Knowledge base portal** > **Billing**.

Tabs:
- **My Plan**: Current plan details (change requires support)
- **Payment Information**: Manage cards and billing address
- **Invoice History**: Past invoices and payment records

Free plan discontinued. Check pricing page for current options.

### Available Plans

Five subscription tiers:
- **Professional**
- **Business** 
- **Enterprise**
- **Enterprise +**: Dedicated servers
- **Startup Program**: 6 months free, then discounted rate

Features scale with plan level: storage, translation credits, workspace count, team size, AI tools.

### Plan Comparison

**Professional to Business**: More storage, team collaboration, advanced analytics, Workflow Designer, Ticket Deflector, expanded AI features.

**Business to Enterprise**: Substantially more storage, larger teams, sandbox environments, IP restrictions, premium AI support, health checks.

### Upgrading Your Plan

1. Go to **Settings** > **Knowledge base portal** > **Billing**
2. Click **Change plan**
3. Compare features in **Compare plans and features** section
4. Select plan and click **Let's talk**
5. Sales team assists with upgrade

Only Owners or users with Billing permissions can upgrade.

### Downgrading Your Plan

1. Navigate to **Settings** > **Billing** > **Change plan**
2. Select target plan (Professional, Business, or Enterprise)
3. Compare features and limits
4. Contact sales team to process downgrade

Only Owners or users with Billing permissions can downgrade.

**Feature impact**:
- **Enterprise to Business**: Reduced storage, users, reviewers, limited AI credits
- **Business to Professional**: Lost workflow tools, analytics, integrations, reduced storage/users
- **Enterprise to Professional**: Lost all Business and Enterprise features

### Purchasing Add-ons

Available add-ons:
- Workspaces
- Languages 
- Translation credits (1M characters)
- Storage (50GB increments)
- Team accounts
- Readers (5000 per unit)
- PDF export limits

**Business**: Crowdin, Phrase extensions
**Enterprise**: Salesforce extensions, additional sandboxes

To purchase:
1. Go to **Settings** > **Billing**
2. Select **Add-ons**
3. Configure and confirm payment

Note: Saved payment method required. Legacy users contact support for offline purchases.

### Updating Payment Information

1. Log into Knowledge base portal
2. Go to **Settings** > **Billing**
3. Switch to **Payment information** tab
4. Edit payment method or billing address under Credit card tile
5. Add secondary card via **Add another card** (used if primary fails)

Only account owners can modify payment details.

## Notifications

### Managing Notification Channels

Configure custom channels to monitor events:

Go to **Settings** > **Notifications** > **Event Mapping**

Monitor changes in:
- Custom domains
- CSS/JavaScript
- Backups
- Project members
- Documentation
- Landing pages
- Articles
- Payments

### Viewing Notification History

Access **History** tab in Notifications to view all sent alerts across configured channels.

## Content Organization

### Hiding Categories

Hide categories from Knowledge base and search results to maintain privacy during development.

Affects entire category tree: subcategories and articles also hidden.

## Updates

### Category Tree Enhancements

Faster emoji library loading in category manager.

## Support

### Viewing Ticket Status

1. Log in to support.document360.com
2. Search tickets by keyword
3. Filter by status: All, Open/Pending, Resolved/Closed, Archive
4. Click ticket to view details
5. Status appears on right with ticket history

### Support Ticket Information

| Professional | Business | Enterprise |
|--------------|----------|------------|
|              | ✓        | ✓          |

Visit [support page](https://support.document360.com/support/login) to raise and track tickets. Business/Enterprise plans get responses within minutes.

### Raising Support Tickets

1. Log in to [support page](https://support.document360.com/support/login) with credentials or SSO
2. Click **Submit a ticket**
3. Fill fields: Requester, Subject, Group, Description
4. Attach files if needed
5. Submit

Redirected to status page with Ticket ID after submission.

### Exporting Support Tickets

Export as CSV or XLS:
1. Log in to support portal
2. Select **Tickets**
3. Configure export settings: date range, format, fields
4. Download

## Troubleshooting

### Understanding HAR Files

HAR (HTTP Archive) files log browser interactions with webpages. They capture requests, responses, timings, cookies, and metadata for debugging.

JSON format used by Document360 support team.

### Generating HAR Files

Capture network activity for troubleshooting:

1. Open browser developer tools (F12)
2. Go to **Network** tab
3. Start recording
4. Reproduce issue
5. Stop recording
6. Save as HAR file

**Browser steps**:
- **Chrome**: Right-click requests > "Save All As HAR"
- **Firefox**: Right-click in Network tab > "Save All As HAR"

**Tips**:
- Clear cache before recording
- Remove sensitive data before sharing
- HAR files contain personal information
</document_content>
</document>

<document index="25">
<source>docs/d366.json</source>
<document_content>
[
  {
    "heading": "Introduction",
    "text": "## Introduction\n\n### Introduction\n\nDocument360 is a knowledge management platform enabling creation and curation of public, private, or mixed-access knowledge bases. Key features include My Projects, Knowledge base portal/site, and Document360 AI (Eddy AI) for interacting with the platform.",
    "summary": "## Introduction\n\n**Document360:** Knowledge management platform for creating & curating public/private/mixed-access knowledge bases.  Features include: My Projects, knowledge base portal, and Document360 AI (Eddy AI)."

... (Data file content truncated to first 5 lines)
</document_content>
</document>

<document index="26">
<source>docs/d366.md</source>
<document_content>
<thinking>
The user wants me to make editorial changes to improve the document's readability and conciseness. I need to remove redundant language, empty praise, and artificial phrasing while keeping all factual information intact. The goal is to make every sentence and word contribute to the document's purpose using simple, precise, technically sound language. I'll review the entire document for repetitive sections, overly decorative language, and inconsistencies, then streamline the content for clarity and impact.
</thinking>

<output>
## Introduction

Document360 is a knowledge management platform for creating and curating public, private, and mixed-access knowledge bases. Key features include project management, knowledge base portals, and Eddy AI.

## Documentation Guide

Complete guide to Document360's platform covering project creation, editor tools (Markdown, WYSIWYG), article management, AI features (Eddy AI, translation, analytics), security (SSO, CSP), file management, collaboration, branding, and customizations. Includes release notes from 2019-2025.

The Knowledge Base Portal provides tools for managing categories, articles, templates, files, teams, and readers. Features include branding configuration, domain settings, security controls, dashboard overview, tree-view documentation structure, interactive API documentation, analytics, widgets, cloud storage, and universal search.

## Project Management

Document360's project dashboard displays all user-owned, team-associated, and reader-associated projects. Project visibility options are public, private, or mixed.

## Additional Resources and Support

Document360 offers public feedback, trial explorer, and in-app support. Features include categorized articles, templates, file/team/reader management, analytics, Eddy AI assistance, and revision history. Support channels: in-app chat, email, documentation, tutorials. Scheduled maintenance may affect access.

## Getting Started

Create a Document360 account by visiting the signup page.

## Key Components

Knowledge base sites support public, private, and mixed access levels for end-user articles.

## AI Integration

Eddy AI assists with article writing, SEO descriptions, tags, titles, related article recommendations, search, and summarization to improve knowledge base quality and reader experience.

## Troubleshooting and Support

Resolve login issues by switching browsers, clearing cache, checking VPN and system time, or contacting support with HAR files.

System requirements:
- OS: Windows 10+, macOS High Sierra+, Ubuntu 18.04+
- Processor: Dual-core minimum
- RAM: 4 GB minimum
- Disk space: 500 MB minimum
- Graphics: Integrated graphics
- Internet: Stable connection with TLS 1.2

Supported browsers:
- Chrome 90+
- Firefox 88+
- Safari 13+
- Edge 90+

Enable JavaScript, cookies, and ensure screen reader compatibility. Test on VMs or physical hardware, allow auto-updates, verify HTTPS/SAML support.

## User Interface

Top-right menu provides access to user profile, security, and help. "My profile" access depends on subscription plan.

## Project Management

The "Your Projects" dashboard manages projects by role (owner, team, reader) with access tiers:
- Professional: Basic access
- Business: Enhanced team features
- Enterprise: Unlimited project associations

Dashboard streamlines navigation and provides documentation project management tools.

## User Profile

Access profile options via your profile picture in the top-right corner.

My profile: Edit personal info (image, name, email, bio, portal language, role, content access).

View Access/Permissions: Displays portal and content role permissions (editable by Team accounts with admin rights).

Change Password: Requires current password, strong new password (8+ chars, mix of uppercase, lowercase, number, special character), and confirmation. Password change logs you out automatically.

## Updates and Releases

Access release notes via Knowledge base portal button, project summaries, or the dedicated Document360 Updates - Changelog page. Full details available through external link.

## Localization

Document360 supports multilingual knowledge base sites for improved user experience.

## Project Dashboard

Document360 Dashboard provides "My Contribution" and "Overview" tabs for project and team insights.

## Project Management

Document360 enables switching between projects via dropdown or dashboard. Options include public, private, mixed, or sandbox projects. Access control and article revisions ensure security and version management.

Creating a project involves selecting a use case, choosing up to two templates, customizing branding and privacy settings, and accessing a preloaded portal. The overview tab shows key metrics including contributions, performance, storage, and user data with filtering options.

## Sandbox Projects

Sandbox projects provide isolated testing environments for experimenting with features, workflows, and setups without affecting live users. Enables early issue identification and optimized feature configuration.

## My Contribution

The My Contribution tab tracks articles, tasks, and performance metrics. Features include:
- Created, published, or draft article tracking
- Performance metrics (views, reads, likes, dislikes)
- Workflow status and due date management
- Review reminders for stale articles
- User feedback access
- Broken link identification
- Filtering by workspace, language, or date range

## Content Creation

Document360 offers three editors:
- Markdown: Split-screen with preview, supports image sizing
- WYSIWYG: Real-time formatting like WordPress
- Advanced WYSIWYG: Combines Markdown and WYSIWYG features

Project-level default editor selection available. Switching between Markdown and WYSIWYG is article-level only. Advanced WYSIWYG is irreversible.

Recent UI improvements include unified workspace/language selection and accessibility enhancements.

Content creation tools allow category and article creation, template usage, and content import.

## Markdown Formatting

Markdown converts plain text to HTML. Supports lists, headers, images, and links.

## Article Creation

Create articles via four methods: top bar, Flywheel, More icon, or within folders/indexes. Navigate to Documentation, name the article, and select category.

Article limits:
- Professional/Business: 5,000 articles
- Enterprise: 10,000 articles

## User Interface Navigation

Left Navigation Bar includes:
- Dashboard
- Documentation
- API Documentation
- Analytics
- Widgets
- Drive
- Settings

Categories & Articles section contains:
- All articles
- Workflow assignments
- Starred
- Recycle bin
- Site builder (redirects to Customize site)
- Content tools

Article Editor Header displays:
- URL/slug
- Status (New, Draft, Published, Stale)
- Article information (contributors, stats, dates)
- Preview feature
- Title, slug, description editing
- AI Glossary recommendations
- Workflow status updates
- More menu actions (clone, move, hide, delete, SEO, tags, Related articles)
- Comments section
- Full-screen view

## Content Export

Export categories and articles to PDFs with customizable templates. Available only for private projects.

Enable via Settings > Knowledge base site > Article settings. Choose templates during export.

500 MB daily limit applies. Purchase additional capacity if needed.

Note: KB site customizations don't affect PDFs. Visibility settings may restrict exports.

## Content Management

Clone articles by navigating to Documentation, hovering over the article, clicking More > Clone, and filling in details. Cross-workspace cloning supported with security restrictions. Auto-update links adjust to new locations.

## Content Import

Import .docx files under 15MB for efficient content transfer.

Files import as single or multiple articles based on headings. Errors indicate exceeding article limits (100 articles/category, plan-specific workspace limits).

Reduce article count, verify plan limits, or contact support if issues persist. Media and hyperlinks preserved during import.

## Content Management Features

Tiered features by plan:
- Professional: Basic handling
- Business: Version control and collaboration
- Enterprise: Advanced access and custom workflows

Article Locking prevents simultaneous edits with 15-minute auto-unlock or manual unlock.

Templates create consistent content like troubleshooting guides. Create from Flywheel, More option, or Create button.

Deleting articles: Five methods requiring navigation and confirmation.

Renaming articles: Click article name or More menu. Confirmation required for published articles.

Moving articles: Five methods including drag-and-drop. Security restrictions apply.

Editing articles: Change content, view markdown, republish.

Replicating articles: Copy to multiple categories. Setting restrictions may apply.

Hiding/Unhiding articles: Four methods control visibility. Strikethrough indicates hidden articles.

## Collaboration

Add inline comments by selecting text, clicking comment icon, typing, and sending. Mention collaborators with @ symbol. Enable notifications for updates. Published articles automatically delete unresolved comments.

## Content Publishing

Publish from Editor with optional comments. Configure settings (tags, SEO, related articles, status indicators) using AI assistance. Status indicators auto-update.

Bulk Publishing selects multiple articles. Only unpublished articles eligible. AI features require 50-200 words minimum. Verify publication by checking hidden status, restrictions, and workspace settings.

Publishing Process:
- Professional: Basic customization and SEO
- Business: Advanced targeting and analytics
- Enterprise: Custom domains and multi-language support

## Content Import Process

Import .docx files by selecting appropriate editor in Settings > Knowledge base portal > General > Editor. Choose WYSIWYG or Advanced WYSIWYG. Markdown doesn't support .docx imports.

Files must be under 15MB. Split large documents for efficiency.

Common issues: TOC header conflicts, firewall blocks, password-protected files, style mismatches, maximum articles error. Adjust heading tags to mitigate.

Best practices: Test with small files, address formatting inconsistencies post-import.

## Content Enhancement

Images enhance reader comprehension and engagement. Insert via Markdown (upload/URL/picker/drag & drop) or Advanced WYSIWYG editor (/image command, Insert menu). Use specified dimensions. Save images to Document360 Drive for permanence. Local changes don't reflect in stored version.

## Collaboration

Inline comments facilitate article reviews and feedback. View via highlighted areas or icons. Only comment creator can resolve comments. Edit/delete and reply with character limits. Team accounts can reply. Filter options: All, Mentioned me, Open, Resolved.

## Localization

Machine translation updates internal links to translated content. Consistent article slugs required. Use relative paths for internal links to prevent broken links. FAQ addresses linking before publication, heading links, and hyperlink troubleshooting.

## Content Enhancement Features

Add videos via URLs, embed codes, or uploaded files. Broken link detection included.

Troubleshoot broken images by checking URLs in code view, ensuring correct paths, using Document360 Drive.

Add hyperlinks to text, images, or files for navigation. Editing available in WYSIWYG and Markdown editors.

File attachments upload or link files. Appear on article's right side. Arrange and ensure visibility.

Bookmark links target specific headings within articles using WYSIWYG editor.

Add email links in Markdown: `[link_text](mailto:email_id)`. In WYSIWYG: Highlight text, Ctrl + K or /link, enter `(mailto:email_id)`.

## Content Management

Changing article headings breaks hyperlinks. Use anchor tags within headings to maintain functionality.

## Content Formatting

Prism.js provides syntax highlighting for HTML, C#, Java, JavaScript, XML, JSON, CSS, SQL, Python, Markdown, PHP, PowerShell, and Text.

Create code blocks with triple backticks (Markdown) or Insert > Code Block, `\```` + Enter, or `/code block` (WYSIWYG). WYSIWYG supports custom languages, preserves pasted formatting, allows non-highlighted blocks via indentation.

## Private Notes

Team collaboration uses private notes for internal reminders visible only to specific groups. Editable in Markdown or WYSIWYG across all plans.

Excluded from Knowledge Base PDF downloads. Retained in browser-generated PDFs via print/save function.

Manage in WYSIWYG by clicking private note icon, using floating menu to adjust visibility, copy, or delete.

Markdown private notes syntax: `:::(Internal) (Private notes)\nOnly visible to team accounts\n:::`

Advanced WYSIWYG: Create via `/Private note` or Insert menu. Manage visibility with security or reader groups. Copy, edit, or delete except in published articles. Access settings via floating menu.

## Content Enhancement

Embed Microsoft SharePoint Stream videos within articles using Markdown or WYSIWYG editors.

Embed Google Forms, Draw.io diagrams, and Microsoft Stream videos using HTML embed code. Ensure diagrams are publicly accessible. Forms allow interaction/data submission. Videos use iframe embeds.

Insert Draw.io diagrams via:
1. Interactive image tag from Diagrams.net (adjustable dimensions)
2. Export as static images (PNG/SVG) and upload

Attachment limits by plan:
- Professional: 5MB
- Business: 10MB
- Enterprise: 20MB

Add featured images and attachments. Featured images (JPEG/PNG, 1200x800-2000x1200 pixels) improve SEO and link previews but don't appear in articles. Available in Business and Enterprise plans.

Attachments add via URL or file upload. Appear near Table of Contents and Tags. Support various file types.

## Content Status

Track content states: New (internal draft), Draft (updates in progress), Published (live content), Needs Review (flagged for evaluation).

Enable automatic status updates via Settings > Knowledge base site > Article settings & SEO. Configure duration.

Hidden articles show strikethrough, remain inaccessible, can be any status. Needs review flags for contributors.

Hidden categories conceal articles. Category pages display statuses for maintenance.

Update status indicators by navigating to article, clicking More > Article settings, changing status, updating localization variables, adjusting color, setting duration.

Deprecated articles mark outdated content. Two methods:
1. Bulk deprecation (select and deprecate)
2. Individual deprecation (article settings)

Both require reason and visual deprecated status indication.

## User Interface

Public knowledge base shows articles. Project members manage content and settings.

Article status indicators: new (green), updated (orange), custom.

## Content Preferences

Update article preferences by navigating to article, clicking More, selecting Preferences, adjusting checkboxes (comments, table of contents, feedback), then saving.

Article-specific process. Some features require additional setup (e.g., Disqus).

## Contributor Management

Document360 tracks contributors automatically based on actions (create, update, publish). Publicly displays contributions. Readers can view additional articles by contributors.

Enterprise plan allows manual contributor addition/removal. Professional and Business plans don't support this.

Manage contributors via Article information icon, Manage popup to add (search) or remove. Assign contributor if none listed. Assignment persists until account deletion.

## Scheduled Publishing

Schedule article or category publication by navigating to item, selecting "Publish later," setting date/time/timezone, adding optional comments, clicking "Schedule."

Document360's scheduled publishing improves content calendar planning and consistency.

Edit scheduled publications by navigating to article, selecting "Edit schedule," saving changes.

Bulk schedule multiple articles by selecting them and specifying date/time in "Publish later" panel.

Cancel scheduled publishing by selecting "Cancel" in dropdown and confirming.

Notes: Scheduled articles require cancellation before editing. Cannot publish via API. Moving between workspaces removes schedule.

## Article Revisions

Document360 creates article revisions automatically. Newly edited articles save as unpublished versions, preserving history until publication.

Compare and revert to previous versions. @-mentions in collaborations create email notifications.

Create versions via editing or forking (must publish). Revision history features vary by subscription level.

Version comparisons highlight changes. Reversion possible.

Published articles cannot change dates.

Content management enables user-defined read receipt rules. Create, modify, prioritize rules. Manage visibility and dependencies.

Readers acknowledge reading via confirmation process.

## Analytics

Article Analytics provides insights into performance including reads, views, likes, dislikes, and link status across all plans.

Access via More (•••) icon in editor > Analytics.

Key metrics: Reads (updated daily), Views, Likes, Dislikes, Link Status.

Validation tool ensures link reliability. Analytics update real-time. Reads reflect unique sessions.

Use Go to Analytics for project-wide insights.

Monitor read receipts in Analytics via Articles > View all in Top articles. Details appear in All Articles page within 15 minutes.

## Content Optimization

Optimize SEO with titles (50-70 chars), descriptions (120-160 chars), featured images. Include 1-3 internal/external links.

Automated tools categorize issues, suggestions, and good work.

Content optimization health checks analyze English articles/categories for readability (long sentences, missing internal links).

Optimize GenAI content with keyword-rich headings, short paragraphs, structured data (tables), code snippets (commented), alt text, contextual links.

Prioritize examples, FAQs, consistent glossary to reduce hallucinations and improve accuracy.

Use conversational tone and SEO best practices. Test with AI tools and review output.

## Security

Granular access control uses team/reader accounts and groups across three tiers.

Manage article access via security settings. Choose "Portal" for team access or "Site" for viewer access.

Document360's Information Security Policy Framework includes:
- Categorized data handling (Confidential, Restricted, Public)
- Encryption (AES-256, hash functions)
- Incident response plan with root cause analysis
- Secure-by-design SDLC practices
- Operations security (change management, capacity planning, data leakage prevention)
- Least privilege access control
- Policy enforcement (audits, procedures, disciplinary actions)

## Site Management

Configure sitemaps for SEO via Settings > Knowledge base site > Article settings & SEO > SEO.

Access sitemap URL, set update frequency, generate XML sitemap. Submit to Google Search Console.

Sitemap support: Business and Enterprise plans only. Public projects only.

Manage Robots.txt via same settings path. Controls web crawler access, prevents indexing, defines site rules.

Best practices: Include sitemap links, avoid duplicates. Consult FAQs for advanced needs.

## Content Sharing

KB Site 2.0 (projects created after June 10th) shares articles with external users via private links, even for unpublished content.

External users don't need portal access. Manage links (delete or regenerate). Links expire if article deleted.

## Localization Features

Machine translation uses credits via bulk or individual article methods.

Customize Eddy AI by renaming, adjusting tone, response length.

Translation status indicators guide users.

Troubleshooting: Split large articles, manually update after content changes, manage character limits (50,000).

Credits by subscription tier:
- Professional: 1M
- Business: 2M
- Enterprise: 5M

Purchase in 1M increments. Manual translation needed for new languages added after content creation.

Delete/hide actions in one language affect all language versions.

## User Engagement

Follow articles and categories notifies users of new/updated content. KB site 2.0 feature for Private/Mixed projects only.

## Site Features

Article headers include contributors, read time, follow button, share icon, print option, published/updated dates, PDF export.

Localization supports customized text per language.

RSS feeds provide real-time updates via XML. Integrate into Primary Navigation, Secondary Navigation, or Footer.

Subscribers use tools like Feeder.co or Feedly for automatic notifications.

## User Feedback

Feedback Manager tracks, evaluates, and responds to user feedback on articles to enhance content quality.

Two tabs: Article Feedback (ratings/comments) and No Search Results Feedback (content gaps).

Assign tasks, update content, track progress. Improve search functionality and user satisfaction.

Manage feedback with filters, bulk actions, CSV export (up to 90 days).

Feedback status: Complete (reopening possible) or Closed (resolved).

## Content Organization

Labels organize articles internally (not visible on site). Five methods add up to 10 labels per article (maximum 10,000 per project).

Methods: Article Editor, All Articles, Workflow Assignments, Starred section, Folders/Index Categories.

Labels aren't searchable.

Tags enable searching, filtering, sorting, bulk actions across articles, categories, and drive files.

Managed via Tags page. Add via More > Tags. AI-generated suggestions available for content over 200 words.

Tag limits: 30 characters with permissible symbols. Drive file tags visible only within knowledge base.

## Content Navigation

Related articles appear at article bottom, linking only to published content.

Add manually, via Eddy AI (50+ words), or Auto relate. Access restrictions control visibility.

## SEO Management

Manage SEO redirect rules to prevent broken links. Supports editing, adding, importing/exporting, filtering, deleting.

Methods: "Ends with" and "Replace with." Configure with URL paths. Consider multi-language contexts.

Enterprise plan required for advanced features. Permanent deletion possible.

CSV bulk management supports import/export for redirect rules.

## Site Customization

Custom pages create standalone content (policies, terms) separate from articles.

Manage via Content tools. Edit, delete, or clone pages. Clones prefixed with "Clone -."

Initial limit: 5 pages per project. Access restricted by user role. Deleted pages unrecoverable.

Knowledge Base Site 2.0 enhances user experience with improved UI, AI-powered search (Eddy AI), real-time updates, interactive elements, customizable themes/languages.

Navigation customization (primary/secondary), announcements, acknowledgment requests included.

Customize appearance (themes, colors, layouts). Migration from KB 1.0 required.

Key improvements: Streamlined content, better image viewers, table of contents.

Homepages customizable via "Customize site" settings. Options include rich text, image blocks, custom code, themes (Engage, Innovate, Learn, Default), meta data, hero image (1920x415 px).

Section reordering, preview, publishing available. Professional, Business, or Enterprise plans required.

Customize primary & secondary navigation (menu types, links, ordering).

Footers support HTML/CSS, external links, PDFs. Features vary by subscription tier.

Delete RSS feeds via available tools.

Site elements customizable:
- Login pages
- Hero sections
- Documentation pages
- Error pages (404, access denied, unauthorized, IP restricted)

Modify visuals, add/edit text, implement HTML/CSS/JavaScript. Navigate to settings, edit elements, use preview/save/publish. Plan level determines CSS/JavaScript support.

## Accessibility

WCAG 2.1 compliance ensures accessible web content through four principles: perceivable, operable, understandable, robust.

Document360 ensures compliance via:
- Text alternatives for images/icons
- Full keyboard navigation
- Readable text with sufficient contrast
- Clear language

Read-out-loud feature enhances accessibility and engagement. Available on all plans except older pricing plans (Enterprise requires AI assistive search add-on).

"Listen" button in header toggles to "Listening." Opens player with controls (play/pause/skip/close). Reads alt text. Missing alt text indicated.

Enable via Settings > Knowledge base site > Article settings > Accessibility. Disabled by default on trial plans.

Read Out Loud reads glossary, snippets, variables, headings (H2-H4), lists, callouts, private notes, accordions, FAQs, link text, emojis. Skips tables, inline code, code blocks, images, videos, LaTeX, attached files. Audio supports seeking.

## API Documentation

Generate API documentation from URLs, JSON/YAML files, or CI/CD pipelines.

CI/CD requires Node.js and `d360` npm package. Input API specification, provide token, preview drafts before publishing.

Automatically regenerates from updated specifications, preserving custom content.

CI/CD integration via `d360` npm package. Manual regeneration options available.

Features across all plans (Professional, Business, Enterprise).

## Widgets

Enterprise plan widget provides in-app support via searchable knowledge base with 10 configurations.

Features include customizable positions, URL mapping, custom links, ticket deflection, domain restrictions, default language detection.

Enhances user experience with quick access to helpful content for onboarding, troubleshooting, feature learning.

Edit, clone, or delete widgets. Customize appearance and behavior (color, icon, positioning, URL mapping).

Advanced features: CSS/JavaScript customization, JWT authentication, domain restrictions.

Add ticket deflectors, custom links, configure URL mappings. Auto-open widgets and customize themes available.

## Content Reuse

Variables manage frequently changing text (contact info). Update once, changes apply everywhere.

Create with name, content, language. Manage through portal (edit, delete, view usage, bulk deletions).

Snippets provide reusable static content blocks. 200 snippets per project included.

Create snippets via Documentation > Content tools > Content reuse. Name (30 chars max), set language, choose editor, add content, create.

Variable renaming not possible. Snippets place on new lines.

## Glossary Management

Glossary standardizes definitions for frequently used terms. Improves readability and consistency.

Boosts clarity, ensures terminology consistency, saves writer time, enables reusable education content.

Manage project-wide terms via Content tools. Add, edit, delete, import via CSV.

Check dependencies before deleting. Troubleshoot import issues.

AI glossary generation and SEO optimization included.

Link to glossary via `https://yourdomain/docs/glossary-overview` in header, footer, or secondary navigation.

Export terms (Glossary Name, Definition, Dependencies, Updated By, Updated On) via Documentation > Content tools > Content reuse > Glossary > Export CSV.

## Content Structure

Tables organize data into structured format, presenting complex information clearly in rows and columns.

Customize tables via Custom CSS/JS in Settings.

Options include border, padding, colors, fonts.

Professional plan: Limited customization
Business plan: Advanced customization
Enterprise plan: Full customization with priority support

## Callouts

Callouts highlight important content in four types: Info, Warning, Error, Success.

Each includes title and content section. Access via Markdown or WYSIWYG editors.

## What's New Feature

Access recently published articles via announcement icon, workspace/language selection, date range filtering (24 hours, 7 days, 30 days).

Feature configurable in Document360 settings.

## Article Settings

Configure globally (headers, sidebars, search, FAQs) and individually (read-aloud, comments) for consistent language and enhanced user experience.

Individual settings can override site defaults. Site settings often take precedence.

Localization supported.

## Content Migration

Migrate from 100+ knowledge base platforms (Zendesk, etc.). 3-step process:
1. Expert consultation
2. Automated/manual transfer
3. Quality assurance

Focus on SEO-friendly redirects to prevent broken links and maintain search rankings.

Import project ZIP files (max 1GB). Matching workspace slugs merge data. Differing slugs create new workspace.

Modify ZIP workspace slug to prevent conflicts. Verify supported features and destination workspace.

## Content Export Features

Export projects as ZIP files including articles, category pages, optional media.

Methods:
1. Direct download via Import & Export project
2. API access (Business/Enterprise) - limited to 2 exports/day

Formats: Markdown (.md), HTML (.html), JSON (multi-language)

Process: Documentation > Content tools > Import & Export project. Select criteria, include media, execute.

Customize PDF templates via Content tools > Import & Export > Export to PDF.

Features: Layout, margins, cover pages, watermarks, headers, footers.

Set default templates. Available across all plans.

Export published articles/category pages to PDF:
1. Documentation > Content tools > Import & Export > Export to PDF
2. Only published content eligible
3. Create PDF: name, optional password, template, workspace, language
4. Select categories/articles, click Export

## AI Integration

Eddy AI suite offers content creation, optimization, recommendations across sectors (LMS, customer support, compliance, product development, retail/e-commerce).

Automates, organizes, improves content accuracy and engagement.

Features: AI-generated outlines, FAQs, titles, descriptions, tags, related articles.

16 language support. Customizable with proper credits and subscriptions.

Use Eddy AI API by authorizing with API token in Swagger, sending prompt/version ID/language code to `/v2/ProjectVersions/ask-Eddy AI`.

AI tools automate business glossary creation, standardizing terminology across departments.

Premium Suite offers advanced functionalities. English language support only.

AI alt text generator improves accessibility and SEO for images.

Advanced search features include Ask Eddy AI (conversational) and API for custom integration.

AI article summarizer condenses lengthy content. AI chatbots provide direct support.

## AI Premium Suite

Enhances user experience through automation and AI tools. Offers tailored plans for Professional, Business, Enterprise users.

AI Glossary Generator treats singular/plural and synonymous terms separately. Manual rescan every 7 days. Updates suggestions, notifies users.

## Fair Usage Policy

Rate limiting prevents misuse, ensuring quality service.

Limits: 1,500 requests per minute (300 per 10 seconds) per IP.

Enforced by Cloudflare using bot detection heuristics and machine learning.

Prevents bot traffic and DoS attacks.

Adhere to maintain system health, prevent server overload, ensure responsive service.

Contact support for higher limits.

## Compliance

GDPR compliant. Collects and stores essential data with explicit customer consent.

[Learn more](https://document360.com/gdpr-compliance/).

Eddy AI complies with GDPR and SOC 2 Type 2. Ensures data privacy, security, availability, confidentiality.

Uses subprocessors: MongoDB, OpenAI, Azure, Stripe, Segment.

Prioritizes trust and transparency through detailed documentation.

Data encrypted at rest and in transit. OpenAI models retain data 30 days maximum.

Data Processing Agreement and privacy policies provide additional assurances.

## Troubleshooting

Website fails to load: Check URL, clear browser cache, disable VPN, verify system date/time.

504 Gateway Timeout: Review server configuration, revert Sub-folder Configuration.

Page unresponsive while editing: Clear cache, reduce article length, fix unclosed HTML tags.

Too many redirects: Correct JWT Login URL, remove domain URL from config.

Project not found: Ensure CNAME record correct and verified.

/home/error/ message: Contact support with HAR file and console errors.

Icons not rendering: Check FontAwesome settings in custom CSS.

Site without CSS: Whitelist Document360 domains.

Secure connection issues: Verify CAA records, update DNS settings.

ResourceNotFound & AuthenticationFailed errors: Ensure SaaS tokens added and not expired.

## Content Management

Find-and-replace tool searches and replaces keywords, phrases, numbers, selected characters across articles and categorized pages.

Replacements include words, numbers, specific characters.

Access via Content Tools > Documentation > Find and Replace.

Enter text to find and replace, apply filters, select articles, choose status, execute replacement.

Precise control with whole-word matching and advanced filters (workspace, language, status).

Editor role or custom role with Update and Publish access required.

Limit: Up to 1000 articles per operation. Search excludes Recycle Bin. Markdown/HTML unaffected.

Empty "Replace with" removes found text.

## Table of Contents

TOC visibility manageable at site-wide or individual article level.

Site-wide settings affect all articles. Individual settings control each article independently.

Only headings (H2, H3, H4) included. Bold text excluded.

## Content Consistency

Consistent, limited, relevant tags improve content retrieval. AI tag recommender available.

Regular review and update tags for optimization.

Permissions allow teams to create/edit tags. Manual tagging remains possible.
</output>## Support

Document360 users can track support tickets through a dedicated system. Log in to the support page, search or filter tickets, and click on any ticket to view its status and history. Business and Enterprise plans offer priority responses. Raise new tickets by submitting requests with required fields and file attachments. Export tickets as .csv or .xls files using configurable export settings.

[Document360 support page](https://support.document360.com/support/login)
</document_content>
</document>

<document index="27">
<source>docs/document360.json</source>
<document_content>
[
  {
    "heading": "What is Document360?",
    "text": "## What is Document360?\n\nHere is an overview and a navigation guide to help you get started with your Document360 experience.\n\n### What is Document360?\n\n**Document360** is a Knowledge management platform that allows you to create and curate a self-service public, private, or mixed access Knowledge base.\n\nWhen using Document360, you'll interact with several key interfaces:\n\n* #### [My Projects](/help/docs/document360-getting-started#my-projects)\n* #### [Knowledge base portal](/help/docs/document360-getting-started#knowledge-base-portal)\n* #### [Knowledge base site](/help/docs/document360-getting-started#knowledge-base-site)\n* #### [Document360 AI - Eddy AI](/help/docs/ai-features)\n* #### [Resources](/help/docs/document360-getting-started#other-resources)\n\n---",
    "summary": "## What is Document360?\n\n**Document360** is a Knowledge management platform for creating public, private, or mixed-access self-service knowledge bases. Key interfaces include **My Projects**, **Knowledge base portal**, **Knowledge base site,** ** Eddy AI**, and **Resources.**"

... (Data file content truncated to first 5 lines)
</document_content>
</document>

<document index="28">
<source>docs/document360.md</source>
<document_content>
# Combined Documentation

## Table of Contents

- [What is Document360?](#document360-getting-started)
- [Sign up to Document360](#sign-up-to-document-360)
- [System and browser requirements](#system-and-browser-requirements)
- [Project dashboard](#document360-my-projects)
- [Top-right menu overview](#top-right-menu-overview)
- [Creating a project in Document360](#creating-a-project)
- [Dashboard](#dashboard)
- [Multilingual Knowledge bases](#getting-started-with-multi-lingual-knowledge-base)
- [Creating a sandbox project](#creating-a-sandbox-project)
- [Document360 security and infrastructure](#quick-summary-of-the-security-and-infrastructure-aspects)
- [X-Frame options](#x-frame-options)
- [Content security policy](#content-security-policy)
- [CSP and Whitelisting guidelines for Document360 widget](#csp-guidelines-for-document360-widget)
- [Bot management](#bot-management)
- [Fair usage policy for bot management](#fair-usage-policy-for-bot-management)
- [Editor choices in Document360](#using-the-text-editor)
- [Elements of the editor](#elements-of-the-editor)
- [Markdown editor](#markdown-editor-overview)
- [Basic Markdown syntax](#markdown-basics)
- [WYSIWYG editor](#wysiwyg-editor)
- [Advanced WYSIWYG editor](#advanced-wysiwyg-editor)
- [Advanced WYSIWYG editor basics](#advanced-wysiwyg-editor-basics)
- [Movable blocks in Advanced WYSIWYG editor](#movable-blocks-in-advanced-wysiwyg-editor)
- [Conditional content blocks in Advanced WYSIWYG editor](#conditional-content-blocks)
- [Tables in Advanced WYSIWYG editor](#tables-in-advanced-wysiwyg-editor)
- [Image formatting in the Advanced WYSIWYG editor](#image-formatting-in-the-advanced-wysiwyg-editor)
- [Tabs in the Advanced WYSIWYG editor](#tabs-in-the-advanced-wysiwyg-editor)
- [Categories and subcategories](#categories-and-subcategories)
- [Managing categories](#managing-categories)
- [Category types](#category-types)
- [Mapping a category with a folder in Drive](#assigning-drive-folder-for-a-category)
- [Downloading category and article in KB site](#downloading-category-and-article-in-kb-site)
- [Managing articles](#managing-articles)
- [Word .docx files](#article-import-from-word-files)
- [Publishing an article](#publishing-an-article)
- [Reviewing an article using Inline comments](#reviewing-an-article-inline-comments)
- [Adding images to articles](#adding-images-to-articles)
- [Adding videos in articles](#adding-videos-in-articles)
- [Adding files to article](#adding-files-to-articles)
- [Adding hyperlinks](#linking-to-other-articles)
- [Code blocks](#code-blocks)
- [Adding private notes](#private-notes)
- [Embedding Stream videos in articles](#embedding-microsoft-streams-video-in-articles)
- [Embedding Google forms in articles](#embedding-google-forms-in-article)
- [Embedding a Draw.io diagram](#embedding-a-drawio-diagram)
- [All articles - Overview page](#all-articles-overview-page)
- [Using filters in All articles page](#filter-bulk-operations)
- [Export All articles list](#export-bulk-operations)
- [Article review reminder](#review-reminders)
- [Article SEO](#article-seo)
- [Excluding articles from search engines](#excluding-articles-from-searches)
- [Change the URL of an article](#changing-the-url-of-an-article)
- [Article tags](#article-tags)
- [Add article labels](#adding-article-labels)
- [Related articles](#related-articles)
- [Featured image](#featured-image)
- [Attachments](#attachments)
- [Status indicator](#status-indicator)
- [Article status](#article-status)
- [Preferences](#preferences)
- [Show/hide table of contents for an article](#showhide-table-of-contents-for-an-article)
- [Mark as deprecated](#marking-articles-as-deprecated)
- [Update article contributors](#updating-article-contributors)
- [Schedule publishing](#schedule-publishing)
- [Discussion feed](#article-discussion-feed)
- [Revision history](#revision-history)
- [Article analytics](#article-analytics)
- [Security - Article access control](#article-access-control-knowledge-base-site)
- [Health check metrics](#health-check-metrics)
- [Readability score](#readability-score)
- [Sitemap](#sitemap-generator)
- [Public article comments](#public-comments)
- [Robots.txt](#robotstxt)
- [Read receipt](#read-receipt)
- [Share articles via private link](#share-articles-via-private-link)
- [Eddy AI customization](#ai-customization)
- [AI machine translation](#ai-machine-translation)
- [Eddy AI trust page](#eddy-ai-trust-page)
- [AI writer suite](#ai-writer-suite)
- [AI writer](#ai-writer)
- [AI FAQ generator](#ai-faq-generator)
- [AI title recommender](#ai-title-recommender)
- [AI SEO description generator](#seo-description-generator)
- [AI tag recommender](#ai-tag-recommender)
- [AI related articles recommender](#ai-related-articles-recommender)
- [AI Chart generator](#ai-chart-generator)
- [AI alt text generator](#ai-alt-text-generator)
- [AI search suite](#ai-search-suite)
- [AI assistive search (Ask Eddy AI)](#ai-assistive-search-ask-eddy)
- [AI dynamic related articles recommendation](#ai-dynamic-related-articles-recommendation)
- [AI Chatbot](#ai-chatbot)
- [Securing Chatbot authentication using JWT](#securing-chatbot-authentication-using-jwt)
- [Styling the Chatbot](#styling-the-chatbot)
- [Adding external sources for AI Assistive search](#eddy-ai-federated-search)
- [AI article summarizer](#ai-article-summarizer)
- [Ask Eddy AI API](#ask-eddy-ai-api)
- [Enhancing accessibility with our read out loud feature](#text-to-voice-functionality)
- [AI premium suite](#ai-premium-suite)
- [AI glossary generator](#ai-glossary-generator)
- [How to write GenAI friendly content](#how-to-write-genai-friendly-content)
- [Prompt engineering tips](#prompt-engineering-tips)
- [File management](#drive)
- [Adding folders and files](#adding-folders-and-files)
- [Folder actions in Drive](#folder-actions-in-drive)
- [File actions in Drive](#file-actions-in-drive)
- [All files overview](#all-content-overview)
- [Recent, Starred, and Recycle bin files](#recycle-bin-recent-and-starred-files)
- [Workflow designer](#workflow-designer)
- [Managing workflow status](#managing-workflow-status)
- [Workflow assignment](#workflow-assignment)
- [Templates](#article-templates)
- [Variables](#variables)
- [Snippet](#snippets)
- [Glossary](#glossary)
- [Adding glossary terms](#adding-glossary-term)
- [Inserting glossary term in an article](#adding-glossary-term-in-articles)
- [Managing glossary terms](#editing-and-deleting-glossary-term)
- [Managing the glossary landing page](#glossary-overview-page)
- [Feedback manager](#feedback-manager-overview)
- [Custom pages](#custom-pages)
- [Tags](#tags)
- [Manage tags page overview](#tag-manager-overview-page)
- [Adding a new tag](#adding-a-new-tag)
- [Tag groups page overview](#tag-groups-overview)
- [Manage tag dependencies](#tag-dependency-viewer)
- [Find and replace](#find-and-replace)
- [SEO descriptions](#seo-descriptions)
- [Exporting your Document360 project as a ZIP file](#export-documentation-as-zip)
- [Importing a Document360 project ZIP file](#import-a-documentation-project)
- [Migrating documentation from other platforms](#migrating-documentation-from-another-knowledge-base-platform)
- [Designing a PDF template](#pdf-design-templates)
- [Compiling content for PDF](#compliling-content-for-pdf)
- [Analytics](#analytics)
- [Articles analytics](#articles-analytics)
- [Eddy AI search analytics](#eddy-ai-search-analytics)
- [Search analytics](#analytics-search)
- [Reader analytics](#reader-analytics)
- [Team accounts analytics](#analytics-team-accounts)
- [Feedback analytics](#feedback)
- [Links status analytics](#links-status)
- [Ticket deflector analytics](#ticket-deflector-overview)
- [Managing API documentation](#manage-api-documentation)
- [Edit, Clone, and Delete widget](#edit-clone-and-delete)
- [Managing and customizing the Knowledge base widget](#managing-and-customizing-the-knowledge-base-widget)
- [URL Mapping](#url-mapping)
- [Customizing the Knowledge base widget using Custom CSS/JavaScript](#customizing-the-kb-widget-using-custom-css-javascript)
- [FAQ - Knowledge base widget](#faq-knowledge-base-widget)
- [Knowledge base site 2.0](#knowledge-base-site-20)
- [Customize site](#customize-site)
- [KB site 2.0 migration](#kb-site-20-migration)
- [Web Content Accessibility Guidelines (WCAG)](#web-content-accessibility-guidelines-wcag)
- [Header - Primary navigation](#header-primary-navigation)
- [Header - Secondary navigation](#header-secondary-navigation)
- [Footer](#footer-navigation)
- [Custom footer](#custom-footer)
- [RSS Feeds](#rss-feeds)
- [Main pages](#main-pages)
- [Hero section](#hero-section)
- [Rich text blocks](#text-block)
- [Multicolumn card section](#text-columns-block)
- [Image with text block](#image-and-text)
- [Custom code section](#html-block)
- [Knowledge base categories block](#knowledge-base-categories)
- [Widgets block](#widgets)
- [Error pages](#error-pages)
- [404 page](#404-page)
- [Access denied page](#access-denied-page)
- [Unauthorized page](#unauthorized-page)
- [IP restriction page](#ip-restriction-page)
- [Custom CSS & JavaScript](#custom-css-javascript)
- [CSS Snippets](#css-snippets)
- [Callout styles](#callout-styles)
- [Body font style](#body-font-style)
- [Image alignment](#image-alignment)
- [Header font style](#header-font-style)
- [Table style](#table-style)
- [Article redirect rule](#article-redirect-rules)
- [Article settings & SEO](#configuring-the-article-settings)
- [Article header](#article-header)
- [Site header-What's new](#document-header)
- [Follow articles and categories](#follow-articles-and-categories)
- [Search in Knowledge base site](#search-in-knowledge-base-site)
- [Liking or disliking an article](#liking-or-disliking-an-article)
- [Smart bars](#smart-bar)
- [Cookie consent](#cookie-consent)
- [Accessing the ticket deflectors in portal](#accessing-the-ticket-deflectors)
- [Adding a new ticket deflector](#adding-a-new-ticket-deflector)
- [Integrations in Document360](#integrations-getting-started)
- [Code inclusion and exclusion conditions](#advanced-insertion-rules-in-integration)
- [LiveChat](#livechat)
- [Olark](#olark)
- [Freshchat](#freshchat)
- [Crisp](#crisp)
- [Chatra](#chatra)
- [Doorbell](#door-bell)
- [Gorgias](#gorgias)
- [Belco](#belco)
- [Sunshine Conversations](#sunshine)
- [Kommunicate](#kommunicate)
- [Google Analytics](#google-analytics-integration)
- [Google Analytics (GA4)](#google-analytics-new)
- [Google Tag Manager](#google-tag-manager)
- [Heap](#heap)
- [Segment](#segment-integration)
- [Hotjar](#hotjar)
- [Amplitude](#amplitude)
- [FullStory](#fullstory)
- [Mixpanel](#mixpanel)
- [VWO](#vwo)
- [Freshmarketer](#freshmarketer)
- [ZOHO PageSense](#zoho-page-sense)
- [GoSquared](#gosquared)
- [Commento](#commento)
- [Disqus](#disqus)
- [Document360 Extensions - Getting started](#all-extensions)
- [Freshdesk](#freshdesk)
- [Freshservice](#freshservice)
- [Zendesk](#zendesk)
- [Intercom](#intercom-integration)
- [Salesforce](#salesforce)
- [Cases page](#cases-page)
- [Slack](#slack)
- [Microsoft Teams](#microsoft-teams)
- [Drift](#drift)
- [Zapier - Setup guide](#zapier-setup-guide)
- [Integrating Google Docs with Document360](#google-docs-document360-integration)
- [Integrating Google Sheets with Document360](#document360-with-google-sheets-integration)
- [Integrating Document360 with Google Drive](#google-drive-document360)
- [Integrating Trello with Document360](#document360-with-trello-integration)
- [Integrating GitHub with Document360](#github-document360)
- [Integrating Confluence Server with Document360](#confluence-document360)
- [Integrating Zoho CRM with Document360](#zoho-crm-document360)
- [Integrating Pipedrive with Document360](#pipedrive-document360)
- [Integrating Hubspot with Document360](#hubspot-document360)
- [Integrating Asana with Document360](#asana-document360)
- [Integrating Monday.com with Document360](#mondaycom-document360)
- [Integrating Typeform with Document360](#typeform-document360)
- [Integrating Gmail with Document360](#document360-gmail)
- [Integrating Mailchimp with Document360](#document360-mailchimp)
- [Make - Setup guide](#make-setup-guide)
- [Integrating Asana with Document360](#asana-and-document360-integration)
- [Integrating Monday.com with Document360](#monday-document360-integration)
- [Integrating Typeform with Document360](#typeform-and-document360-integration)
- [Integrating Google Docs with Document360](#google-docs-and-document360-integration)
- [Integrating Jira with Document360](#jira-and-document360-integration)
- [Chrome](#chrome-extension)
- [Crowdin](#crowdin)
- [Phrase](#phrase)
- [General project settings](#general-project-settings)
- [Team auditing](#team-auditing)
- [Localization - Getting started](#localization-getting-started)
- [Setting up a Multi-lingual knowledge base](#setting-up-a-multi-lingual-knowledge-base)
- [Localization variables](#localization-variables)
- [Workspaces](#workspaces)
- [Backup and restore](#backup-restore)
- [Notifications](#notifications)
- [Webhook notification channel](#webhook-notification-channel)
- [Slack notification channel](#slack-notification-channel)
- [Microsoft Teams notification channel](#microsoft-teams-notification-channel)
- [SMTP notification channel](#smtp-email-notification-channel)
- [Notification mapping](#notification-mapping)
- [Notification history](#notification-history)
- [Email domain](#send-notifications-from-custom-email-domain)
- [How to use Postman?](#how-to-use-postman)
- [How to use Swagger?](#how-to-use-swagger)
- [Portal search](#full-portal-search)
- [Article-portal search](#article-full-portal-search)
- [Drive-portal search](#drive-full-portal-search)
- [Users & groups-portal search](#users-groups-full-portal-search)
- [Tags-portal search](#tags-full-portal-search)
- [Settings-portal search](#settings-full-portal-search)
- [Custom domain mapping](#custom-domain-mapping)
- [Hosting Document360 on a sub-directory](#document360-on-a-sub-folder)
- [Nginx server - Subfolder hosting](#nginx-server)
- [ASP.NET Core server](#aspnet-core-server)
- [Microsoft - IIS server](#microsoft-iis-server)
- [Apache HTTP server](#apache-http-server)
- [Readers self registration](#reader-self-registration)
- [Managing reviewer accounts](#managing-reviewer-accounts)
- [Account locked](#account-locked)
- [Block inheritance](#block-inheritance)
- [IP restriction](#ip-restriction)
- [Single Sign-On (SSO)](#single-sign-on-sso)
- [Login using SSO - Knowledge base portal](#login-using-sso-knowledge-base-portal)
- [Login using SSO - Knowledge base site](#login-using-sso-knowledge-base-site)
- [Inviting or Adding SSO users](#inviting-or-adding-sso-users)
- [Mapping an existing SSO configuration to other projects](#mapping-an-existing-sso-configuration-to-other-projects)
- [Disable Document360 login page](#disable-document360-login-page)
- [Auto assign reader group](#auto-assign-reader-group)
- [Convert to SSO account](#convert-to-sso-account)
- [Sign out idle SSO team account](#team-account-idle-timeout)
- [SAML](#saml)
- [SAML SSO with Okta](#saml-sso-with-okta)
- [SAML SSO with Entra](#saml-sso-with-entra)
- [SAML SSO with Google](#google-sso-saml-configuration)
- [SAML SSO with OneLogin](#saml-sso-with-onelogin)
- [SAML SSO with ADFS](#saml-sso-with-adfs)
- [SAML SSO with other configurations](#saml-sso-with-other-configurations)
- [Identity Provider (IdP) initiated sign in](#idp-initiated-login)
- [Removing a configured SAML SSO](#removing-a-configured-saml-sso)
- [OpenID](#openid)
- [Okta with OpenID SSO](#okta-with-openid-sso)
- [Auth0 with OpenID SSO](#auth0-with-openid-sso)
- [ADFS with OpenID SSO](#adfs-with-openid-sso)
- [Other configurations with OpenID SSO](#other-configurations-with-openid-sso)
- [Removing a configured OpenID SSO](#removing-a-configured-openid-sso)
- [Setting up JWT SSO](#configuring-the-jwt-sso)
- [JWT reader groups](#jwt-reader-groups)
- [How to enlarge the pdf preview in the article?](#how-to-enlarge-the-pdf-preview-in-the-article)
- [How to change the color of the hyperlinks in Dark mode?](#how-to-change-the-color-of-the-hyperlinks-in-dark-mode)
- [How to change the highlighted search result color in articles?](#how-to-change-the-highlighted-search-result-color-in-articles)
- [How to hide the project's workspace dropdown in the Knowledge base site?](#how-to-hide-the-project-versions-dropdown-in-the-knowledge-base-site)
- [How to add a vertical scrollbar to the code blocks?](#how-to-add-a-vertical-scrollbar-to-the-code-blocks)
- [How to set the default height and width of the embedded PDF?](#how-to-set-the-default-height-and-width-of-the-embedded-pdf)
- [How to make the table border bold in knowledge base?](#how-to-make-the-table-border-bold-in-knowledge-base)
- [How to vertically align table contents at the top in the Knowledge base?](#how-to-vertically-align-table-contents-at-the-top-in-the-knowledge-base)
- [How to restrict the readers from copying the content?](#how-to-restrict-the-readers-from-copying-the-content)
- [How to keep dark mode for the Knowledge base site by default?](#how-to-keep-dark-mode-for-the-knowledge-base-site-by-default)
- [How to center align the text in Markdown?](#how-to-center-align-the-text-in-markdown)
- [How to change the color of the text in Markdown?](#how-to-change-the-color-of-the-text-in-markdown)
- [How to change the language name text in code blocks?](#how-to-change-the-language-name-text-in-code-blocks)
- [How to change the callouts color in dark mode?](#how-to-change-the-callouts-color-in-dark-mode)
- [How to center align the heading in the articles?](#how-to-center-align-the-heading-in-the-articles)
- [How to change the color of the table header?](#how-to-change-the-color-of-the-table-header)
- [How to add accordion in Markdown?](#how-to-add-accordion-in-markdown)
- [How to add extra space in Markdown?](#how-to-add-extra-space-in-markdown)
- [How to align the image in Markdown?](#how-to-align-the-image-in-markdown)
- [How to add a background image for a text content?](#how-to-add-a-background-image-for-a-text-content)
- [How to change the color of the table of contents?](#how-to-change-the-color-of-the-table-of-contents)
- [How to sort the contents of a table?](#how-to-sort-the-contents-of-a-table)
- [How to customize the hyperlink size?](#how-to-customize-the-hyperlink)
- [How to make all links open in new tab?](#how-to-make-all-links-open-in-new-tab)
- [How to set a default featured image in knowledge base?](#how-to-set-a-default-featured-image-in-knowledge-base)
- [How to add shadows to an image in Markdown?](#how-to-add-shadows-to-an-image-in-markdown)
- [How to add borders to an image in Markdown?](#how-to-add-borders-to-an-image-in-markdown)
- [How to embed YouTube Shorts?](#embed-youtube-shorts)
- [How to embed a Loom video?](#how-to-embed-loom-video)
- [How to embed an Excel file?](#how-to-embed-an-excel-file)
- [How to change the color of Feedback buttons?](#how-to-change-the-color-of-feedback-buttons)
- [How to hide footer in mobile view?](#how-to-hide-footer-in-mobile-view)
- [How to change the hover color of the header options?](#how-to-change-the-hover-color-of-the-header-options)
- [How to move the related articles above the feedback section?](#how-to-move-the-related-articles-above-the-feedback-section)
- [How to hide the change password option for readers?](#how-to-hide-the-change-password-option-for-readers)
- [How to hide the category manager?](#how-to-hide-the-category-manager)
- [How to configure a custom font in the knowledge base?](#how-to-configure-a-custom-font-in-the-knowledge-base)
- [How to hide the left navigation bar in the knowledge base site?](#how-to-hide-the-left-navigation-bar-in-knowledge-base-site)
- [Plans and pricing](#plans-and-pricing)
- [Upgrading your subscription plan](#upgrading-your-plan)
- [Downgrading your subscription plan](#downgrading-your-plan)
- [Purchasing add-ons](#add-ons)
- [Upgrading from trial version](#upgrading-from-trial-version)
- [Changing payment information](#changing-payment-information)
- [February 2025 - 11.1.2](#february-2025-1112)
- [January 2025 - 11.01.1](#january-2025-1111)
- [December 2024 - 10.12.1](#december-2024-10121)
- [November 2024 - 10.11.1](#november-2024-10111)
- [October 2024 - 10.10.1](#october-2024-10101)
- [September 2024 - 10.9.1](#september-2024-1091)
- [September 2024 - 10.8.2](#september-2024-1082)
- [August 2024 - 10.8.1](#august-2024-1081)
- [July 2024 - 10.7.1](#july-2024-1071)
- [July 2024 - 10.6.2](#july-2024-1062)
- [June 2024 - 10.6.1](#june-2024-1061)
- [June 2024 - 10.5.2](#june-2024-1052)
- [May 2024 - 10.5.1](#may-2024-1051)
- [May 2024 - 10.4.2](#may-2024-1042)
- [April 2024 - 10.4.1](#1041-release-note)
- [April 2024 - Minor release](#april-2024-minor-release)
- [March 2024](#march-2024)
- [February 2024](#february-2024)
- [January 2024](#january-2024)
- [December 2023](#december-2023)
- [November 2023](#november-2023)
- [August 2023](#august-3)
- [July 2023](#july-2)
- [June 2023](#june-3)
- [May 2023](#may-1)
- [April 2023](#april-3)
- [March 2023](#march-4)
- [February 2023](#february-3)
- [January 2023](#january-2)
- [December 2022](#december-2022-release-note)
- [November 2022](#november-2022-release-note)
- [October 2022](#october-2022-release-note)
- [September 2022](#september-2022-release-note)
- [August 2022](#august-2022-release-note)
- [July 2022](#july-2022-release-note)
- [June 2022](#june-2022-release-notes)
- [May 2022](#may-2022-release-note)
- [April 2022](#april-2022-release-note)
- [March 2022](#march-2022-release-note)
- [February 2022](#february-2022-release-note)
- [January 2022](#january-2022-release-note)
- [December 2021](#december-2021-release-note)
- [November 2021](#november-2021-release-note)
- [October 2021](#october-2021-release-note)
- [September 2021](#september-2021-release-note)
- [August 2021](#august-2021-release-notes)
- [July 2021](#july-2021-release-note)
- [June 2021](#june-2021-release-note)
- [May 2021](#may-2021-release-note)
- [April 2021](#april-2021-release-note)
- [March 2021](#march-2021-release-note)
- [February 2021](#february-2021-release-note)
- [January 2021](#january-2021-release-note)
- [November 2020](#november-2020-release-note)
- [October 2020](#october-2020-release-note)
- [August 2020](#august-2020-release-note)
- [June 2020](#june-2020-release-note)
- [May 2020](#may-2020-release-note)
- [April 2020](#april-2020-release-note)
- [March 2020](#march-2020-release-note)
- [February 2020](#february-2020-release-note)
- [January 2020](#january-2020)
- [December 2019](#december)
- [November 2019](#november)
- [October 2019](#october)
- [September 2019](#september-2019)
- [August 2019](#august)
- [July 2019](#july)
- [June 2019](#june)
- [May 2019](#may-2019)
- [April 2019](#april-2019)
- [March 2019](#march)
- [February 2019](#february)
- [January 2019](#january-2019)
- [Support ticket](#support-ticket)
- [Generating a HAR file](#document360-support-generating-a-har-file)

---

<a id="document360-getting-started"></a>

## What is Document360?

Document360 is a knowledge management platform for creating self-service public, private, or mixed access knowledge bases.

When using Document360, you'll interact with several key interfaces:

* #### [My Projects](/help/docs/document360-getting-started#my-projects)
* #### [Knowledge base portal](/help/docs/document360-getting-started#knowledge-base-portal)
* #### [Knowledge base site](/help/docs/document360-getting-started#knowledge-base-site)
* #### [Document360 AI - Eddy AI](/help/docs/ai-features)
* #### [Resources](/help/docs/document360-getting-started#other-resources)

---

## My projects

The **project dashboard** is the first thing you see when logging in to [**Document360**](https://portal.document360.io). It shows all projects you own, projects associated with team accounts, and projects you're a reader for. Each project has a visibility tag indicating its type (public, private, or mixed).

![1_Screenshot-My_projects](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-My_projects.png "My-Projects.png")

---

## Knowledge base portal

The **Knowledge base portal** is where you:

* **Create** categories, articles, and templates
* **Manage** files, team accounts, and readers
* **Set up** branding, domain, security, and more for the knowledge base site

  ![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_ScreenShot-What_is_Document360.png)

Here are the elements you'll find on the knowledge base portal:

1. Dashboard
2. Documentation
3. API Documentation
4. Analytics
5. Widgets
6. Drive
7. Settings
8. Search
9. Open Site

> NOTE
>
> Anything created or configured on the Knowledge base portal affects what end-users see on the Knowledge base site.

### 1. Dashboard

This page provides an overview of your project and serves as a hub for contributors. In the **Overview** section, team accounts can access information such as created articles, published articles, drafts, and performance insights (views, reads, likes, and dislikes). Use the filter option to select the time frame. You can also view project-related information including **Recently seen**, **Team accounts**, **Readers**, **Drive capacity**, **Broken links**, **No result searches** and **Last backed up** date.

![3_Screenshot-Knowledge_base_portal_dashboard_overview](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_Screenshot-Knowledge_base_portal_dashboard_overview.png)

In the **My contribution** section, users can view their contributions to the project, article performance metrics, workflow assignments, review reminders, feedback, and broken links.

![Document360 dashboard showing article metrics summary with number of articles created, published or drafted, and an area to display assigned tasks.](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_Screenshot-Knowledge_base_portal_dashboard_my_contribution.png)

---

### 2. Documentation

The **Documentation** page is where you create and maintain the tree-view folder structure of categories that keeps your articles organized. Start a knowledge base by creating a category, then populate it with subcategories and articles.

Drag and drop categories and articles to reorder, hide, rename, and delete them using the More options menu that appears when you hover over any item in the Category manager (left navigation pane).

![Document360 user interface showing navigation menus for managing articles, workflow assignments, starred items, recycle bin, site builder, content tools, and categories/articles hierarchy.](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/5_Screenshot-Knowledge_base_portal_documentation_view.png)

#### a. All articles

The **All articles** section allows you to perform bulk operations (publish, hide, move, delete, etc.) on multiple articles at once, saving time compared to performing these actions individually.

![Document360's 'All articles' interface showing a list of articles with editing options like publish, hide, move, delete, review reminder, and live status, as well as features for reusing content through templates, variables, snippets, and a glossary.](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/6_Screenshot-Knowledge_base_portal_documentation_view_all_articles.png)

#### b. Workflow assignments

The Workflow assignments section shows what the team is currently working on and any recently published articles.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/7_Screenshot-Knowledge_base_portal_documentation_view_workflow_assignments.png)

Articles assigned to you appear on this page. You can filter articles by workflow status: **Draft**, **In review**, or **Published**. Articles with missed review due dates appear under the **Overdue** category.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/7.1_Screenshot-Knowledge_base_portal_workflow_assignments_page.png)

#### c. Starred

The Starred section contains articles you've marked as favorites for quick access.

![Document360's 'Starred' interface showing a list of articles with the respective tags and article status, along with an arrow pointing at 'Starred' on the left navigation panel](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/8_Screenshot-Knowledge_base_portal_documentation_view_starred.png)

#### d. Recycle bin

The Recycle bin section includes articles and categories deleted in the past 30 days. You can restore deleted items within this timeframe.

![Document360's 'Recycle bin' interface showing an empty recycle bin, along with an arrow pointing at 'Recycle bin' on the left navigation panel](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/9_Screenshot-Knowledge_base_portal_documentation_view_recycle_bin.png)

#### e. Site builder

Personalize the look and feel of your knowledge base site from the **Site builder** section.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/10_Screenshot-Knowledge_base_portal_documentation_view_site_builder.png)

Choose your logo and icon. Customize brand colors, fonts, and styling from this section.

#### f. Content tools

The **Content tools** contain everything needed to manage article and project content.

![5_Screenshot-Knowledge_base_portal_Content_tools](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/11_Screenshot-Knowledge_base_portal_documentation_view_content_tools.png)

Manage these features from this menu:

* **Content reuse** - Variables, snippets, templates, and glossary
* **Import and Export** - Project import/export activities, PDF export, and migration from other tools
* **Content essentials** - Project-level find and replace, review reminders, tags, and SEO descriptions
* **Feedback manager** - View and respond to article and search feedback
* **Workflow designer** - Create workflow statuses and sequences

#### g. Categories & Articles (Category manager)

Writing and publishing articles in Document360 is simple: pick your category, create an article (title and slug), add SEO details, and publish.

When you update or edit an article, Document360 creates a new revision without affecting the live workspace.

![12_Screenshot-Knowledge_base_portal_documentation_view_categories_and_articles](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/12_Screenshot-Knowledge_base_portal_documentation_view_categories_and_articles.png)

Make changes and republish when ready. Identify articles using status indicators (yellow dot). Document360 maintains all workspaces to check differences.

---

### 3. API documentation

Create and manage API references with Document360's API documentation feature. This allows you to create high-quality API documentation that helps users understand and consume your APIs.

![13_Screenshot-Knowledge_base_portal_api_documentation](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/13_Screenshot-Knowledge_base_portal_api_documentation.png)

The API module includes the **Try it!** feature, allowing users to test API endpoints within the knowledge base site. Create dedicated versions of your API documentation. Upload API references as URLs or JSON/YAML files through an intuitive interface. After uploading the OpenAPI definition, interactive API endpoint articles are created in the portal. End users can access the **Try it!** option with available endpoints, parameters, and responses.

---

### 4. Analytics

Document360 includes an **Analytics** menu to help understand end-user engagement with your knowledge base.

![12_Screenshot-Knowledge_base_portal_Analytics](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/14_Screenshot-Knowledge_base_portal_analytics.png)

Track these metrics and modules with the Analytics tool:

* **Articles**
* **Eddy AI**
* **Search**
* **Team accounts**
* **Feedback**
* **Links status**
* **Page not found**
* **Ticket deflector**

---

### 5. Widget

The Knowledge base widget (formerly *Knowledge base assistant* or *In-app assistant*) helps readers find answers without leaving your site or application.

![8_Screenshot-Knowledge_base_portal_Widget](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/15_Screenshot-Knowledge_base_portal_widgets.png)

Update these widget settings from this menu:

* **Installation & setup**
* **Custom CSS**
* **Custom JavaScript**
* **URL mapping**

---

### 6. Drive

Centralized cloud storage for Document360 projects that stores and lets team members manage all knowledge base artifacts (files). If you've used Google Drive or OneDrive, getting accustomed to Document360 Drive should be straightforward. Access your Drive by clicking the Drive icon in the left menu.

![7_Screenshot-Knowledge_base_portal_Drive](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/16_Screenshot-Knowledge_base_portal_drive.png)

---

### 7. Settings

Set and configure all aspects of the project and knowledge base in **Project settings**: invite team members, edit notification settings, configure domains, set up article redirects, and more.

![9_Screenshot-Knowledge_base_portal_Settings](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/17_Screenshot-Knowledge_base_portal_settings.png)

Features are organized under these classifications in the Settings menu:

* **Knowledge base portal**
* **Knowledge base site**
* **Users & Security**
* **AI Features**

---

### 8. Search

Search the entire project content from a dedicated space on the Knowledge base portal. Perform combined searches across all workspaces and languages simultaneously. The search bar is available at the top of all modules and pages.

![10_Screenshot-Knowledge_base_portal_Search](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/18_Screenshot-Knowledge_base_portal_search.png)

The search engine works like other portal search functions. Type keywords and narrow results using filters such as workspace, language, visibility, tags, and date range. Preview articles/categories, then navigate to the article in the Editor.

![11_Screenshot-Knowledge_base_portal_Search_results](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/19_Screenshot-Knowledge_base_portal_search_bar_dropdown.png)

Since search covers the entire project, it includes files. Switch between article and Drive search using tabs below the search bar.

---

### 9. Open site

The Open site action navigates to and views the Knowledge base site. Clicking the icon takes you to the Knowledge base site of the workspace currently open in your portal. If you're in the API documentation workspace, you'll go to the API documentation home page. If no home page exists, you'll be directed to the first article or category page.

---

## Knowledge base site

The Knowledge base site is the website end-users access to read articles and find helpful answers.

Set your knowledge base access to public, private, or mixed. **Public** means anyone on the internet can access it. **Private** restricts access through login screens. **Mixed** combines public and private elements.

![14_Screenshot-Knowledge_base_site_overview](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/20_Screenshot-Knowledge_base_site_preview.png)

---

## Document360 AI - Eddy AI

Eddy AI is an AI writing assistant integrated into Document360. It helps with **writing articles**, **generating SEO descriptions**, and **recommending article tags**, **titles**, and **related articles**. Eddy AI is also available on the knowledge base site, helping readers find information faster through **assistive search** and the **article summarizer**.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/24_Screenshot-Eddy_settings_aifeatures_eddy.png)

---

## Other Resources

### Got Feedback?

We maintain a public [**product feedback portal**](https://feedback.document360.com/) for customer feedback. It also features our roadmap.

![27_Screenshot-An_overview_of_project_feedback](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/21_Screenshot-User_feedback.png)

### Quick start (Feature explorer)

The **Quick start** is a learning wizard available on all Document360 trial projects. It helps track your progress as you learn about various features. Each time you use or explore a new part of the product, the Feature Explorer automatically updates your progress.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_ScreenShot-What_is_Document360.png)

---

### Need Help?

If you need help or have questions, contact us. Click your profile avatar to:

![21_Screenshot-My_projects_Help_module](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/23_Screenshot-Resources_need_help.png)

* Send an **in-app chat**
* Email [**support@document360.com**](mailto:support@document360.com)
* Read our [**documentation**](https://docs.document360.com/docs)
* Watch [**tutorial videos**](https://document360.com/tutorial-videos/)

---

### FAQs

#### **What is Document360?**

Document360 is a knowledge management platform that allows you to create and curate self-service public, private, or mixed access knowledge bases.

#### **What can I do in the Knowledge base portal?**

Create categories, articles, and templates. Manage files, team accounts, and readers. Set up branding, domain, and security for your Knowledge base site.

#### **What features are available in the Analytics section?**

Track metrics such as articles, user engagement, search performance, team accounts, feedback, and link status.

#### **Can I restore deleted articles in Document360?**

Yes, restore articles and categories deleted within the past 30 days from the Recycle bin section.

#### **Is there an AI feature in Document360?**

Yes, Document360 includes Eddy AI, an AI writing assistant that helps with writing articles, generating SEO descriptions, and assisting readers in finding information.

#### **What is a knowledge base?**

A centralized repository of information designed to provide answers, guidance, and support. Contains structured content like articles, FAQs, guides, and documentation. Allows users to search and access information to solve problems or learn about products, services, or topics. Commonly used in customer support, internal training, and product documentation.

#### Why does it show 'Maintenance' on the top navigation bar in the knowledge base portal?

The **Maintenance** badge indicates scheduled maintenance of the Knowledge base portal. The portal will be unavailable during scheduled times, but the Knowledge base site remains accessible.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/26_ScreenShot-What_is_Document360.png)

For assistance, contact the Document360 support team: [Contact Document360 Support](https://document360.com/support/).

Organizes related articles under a common theme in the knowledge base.

A written document on a specific topic in your knowledge base, serving as a unit of organized information.

Pre-designed article structures that team accounts can use to create consistent articles.

The platform where project members manage and create content. Allows users to create categories, articles, and templates; manage files, team accounts, and readers; and configure site settings.

The public-facing website where end-users access articles and find answers.

Organizes related articles under a common theme in the knowledge base.

A secondary category used to organize groups of related articles. Acts as folders within primary categories.

A written document on a specific topic in your knowledge base.

A tool for managing article-category relations.

Optimizing content to improve visibility in search results. SEO elements can be added for each article through settings.

Creating a new version of an article containing original content for revision.

View and manage article revision history, workflow updates, and compare versions.

Custom styling code used to modify webpage appearance.

A tool for drafting and formatting content. Document360 offers Markdown, WYSIWYG, and Advanced WYSIWYG editors.

<a id="sign-up-to-document-360"></a>

## Sign up to Document360

Create a Document360 account before using the platform. Navigate to the [**signup page**](https://document360.com/signup/).

---

## **Signing Up to Document360**

### **Navigate to the Signup page**

1. On the signup page, provide basic details:

   * First Name
   * Last Name
   * Work Email
   * Job Title
   * Implementation timeline
   * Phone Number
2. Click the **Start Free Trial** button.

![Exploring the onboarding experience while signing up the Document360](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Initial_step_of_onboarding.png)

### **Email verification**

3. You'll receive a 6-digit verification code in your email. Enter this code on the verification page.
4. Click **Verify.**

> NOTE
>
> Entering the wrong verification code five times locks your account activation. Contact Document360 support for help.

### **Set your account password**

5. After verifying your email, create a password for your Document360 account. Requirements:

   * At least 8 characters long
   * Includes at least one number
   * Includes at least one special character
   * Includes both uppercase and lowercase letters
6. Re-enter your password to confirm, then click **Get Started**.

### **Choose your use case**

7. Select your primary use case by clicking **Get started.**

|  |  |
| --- | --- |
| **Knowledge base platform** | Create a centralized hub for team knowledge and resources. Helps teams find answers quickly and enhances customer self-service. |
| **Software documentation/Technical documentation** | Organize and maintain software or technical documentation. Helps document product features, APIs, release notes, and more. |
| **SOP documentation** | Create detailed SOPs for consistent team procedures. Ensures everyone follows the same processes and reduces errors. |
| **User manual** | Develop comprehensive user manuals with step-by-step instructions and troubleshooting tips. Reduces support queries. |
| **API Documentation** | Document API endpoints, request/response formats, authentication methods, and examples. Ensures developers understand integration. |
| **Others** | Choose if your use case doesn't fit predefined categories. Customize based on specific organizational needs. |

### **Select a Template**

8. Select the type of content you'll create. Pick up to two templates.

> NOTE
>
> Selected templates are embedded within your project during creation.

**Knowledge base platform templates**

Choose any two templates from:

|  |  |
| --- | --- |
| **Getting started guides** | Help new users understand and begin using your product with clear instructions. Ensures smooth onboarding. |
| **How-to guides** | Provide detailed instructions for specific tasks. Enables users to fully utilize product features. |
| **FAQs** | Address common questions at any stage of the user journey. Helps users find quick answers. |
| **Policy & procedures** | Outline essential organizational protocols. Helps users understand company guidelines. |

**Software/Technical documentation templates**

Choose any two templates from:

|  |  |
| --- | --- |
| **Release notes** | Keep users informed about updates, new features, bug fixes, and improvements with each release. |
| **Software Design Documentation (SDD)** | Outline software architecture and design, including diagrams and specifications. |
| **Software Requirement Documentation** | Describe software purpose, functionalities, and environment. Ensures development aligns with goals. |
| **Product Requirement Documentation (PRD)** | Define product purpose, value, and functionalities. Meets user needs and business objectives. |
| **Process documentation** | Detailed steps and procedures involved in software development. Standardizes workflows. |
| **User guide** | Comprehensive instructions on using your product. Covers all features and functionalities. |

**SOP documentation templates**

Choose any two templates from:

|  |  |
| --- | --- |
| **Compliance policies and procedures** | Ensure organizational compliance with regulatory requirements. |
| **Operation SOP** | Standardize operational procedures across your organization. |

**User manual templates**

Choose any two templates from:

|  |  |
| --- | --- |
| **Installation manual** | Provides setup information including product overview, specifications, and assembly instructions. |
| **Instruction manual** | Offers step-by-step assembly and usage instructions with diagrams and safety warnings. |
| **Maintenance manual** | Provide detailed instructions for regular upkeep, troubleshooting, and repair procedures. |
| **Training manual** | Provides comprehensive guidance on installation, operation, and troubleshooting. |
| **Operations manual** | Provide detailed instructions for daily maintenance and troubleshooting. |

### **Personalize your Knowledge base**

9. Enter your preferred website URL. Skip this step to default to the domain linked to your registration email.

### **Brand guidelines**

10. Your project name, default language, branding logo, and brand colors are automatically set based on your provided URL. Edit fields if needed.

    Your browser's language settings determine the default language. English is selected if other languages don't support your browser's language.

> NOTE
>
> * Spanish or Brazilian Portuguese as default language sets the portal language accordingly. Otherwise, English is default.
> * Branding logo and colors are extracted from your website. Skipping applies Document360's default logo and colors.

11. Preview your Knowledge base on the right side of the screen.

### **Set documentation privacy**

12. Choose privacy settings for your site:

    * **Private**: Restrict access so only team accounts can view content.
    * **Public**: Make accessible to everyone, including external users.
    * **Mixed**: Combine private and public access.
13. Click **Next** to proceed.

### **Access the Document360 Knowledge base portal**

Enter the portal after setup completion. Find pre-loaded articles based on your selected use case and templates.

> NOTE
>
> Articles are tailored to your selected use case and templates.

![Exploring the onboarding experience while signing up the Document360](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_ScreenGIF-Final_onboarding_process.gif)

---

### FAQs

**Does Document360 support different languages in the onboarding flow?**

Yes, multi-lingual support includes English, Spanish, Brazilian Portuguese, German, and Swedish. Portal language support is currently limited to English, Spanish, and Brazilian Portuguese.

**Do I need to pay to create a Document360 account?**

No payment required. Get a 14-day trial account. Upgrade to continue using beyond trial.

**What plans can I upgrade to?**

Four plans: Free, Professional, Business, and Enterprise. Learn about pricing and features [**here**](https://document360.com/pricing/).

**I haven't received the verification code. How do I continue?**

Click **Resend Code** on the **Email verification** page. Check spam/junk folder. Contact Document360 support if still missing.

**I have an existing knowledge base. How should I migrate?**

Fill out the migration request form before signing up. Migration experts will contact you. If you have a trial account, navigate to **Documentation** > **Content tools** > **Import & Export** > **Migrate content**. Follow on-screen instructions.

**My Document360 trial period ended. Can I still access my data?**

No access to created content after trial ends. Upgrade to a subscription plan to regain access.

**What happens if I don't complete the password setup during signup?**

The system recognizes your previous session and redirects you to the password creation screen.

<a id="system-and-browser-requirements"></a>

## System and browser requirements

## Recommended

System and browser requirements for efficient Document360 Knowledge base portal function.

> NOTE
>
> Access the portal and site with earlier browser versions, but advanced features may perform poorly.

---

### Operating System and Hardware

Ensure your computer has one of these operating systems:

| # | **Operating system requirements** |
| --- | --- |
| 1 | **Windows 7.0** or **higher** |
| 2 | **OSX Mavericks** or **higher** |
| 3 | **Linux** |
| 4 | **Android 5.0** or **higher** |
| 5 | **iOS 12.0** or **higher** |

| # | **Hardware requirements** |
| --- | --- |
| 1 | **2 core CPU** or **higher** |
| 2 | **4 GB RAM** or **higher** |

---

### Web browser requirements

Document360 works well on latest versions of these browsers:

| # | **Supported web browsers** | **Knowledge base portal** | **Knowledge base site 1.0** | **Knowledge base site 2.0** |
| --- | --- | --- | --- | --- |
| 1 | **Google Chrome** version 91.0.4472 or higher | Yes | Yes | Yes |
| 2 | **Firefox** version 79.0 or higher | Yes | Yes | Yes |
| 3 | **Safari** version 13.1.2 or higher | Yes | Yes | Yes |
| 4 | **Microsoft Edge** version 88 or higher | Yes | Yes | Yes |
| 5 | **Internet Explorer** version 11 | No | No | No |
|  | Other web browsers |  |  |  |

#### Browser features

Ensure these browser attributes:

* **JavaScript** must be **enabled**

  > Limited access when disabled
* **Cookies** must be **enabled**
* **Session Storage** must be **enabled**
* **Local Storage** must be **enabled**
* **IndexedDB** must be **enabled**
* **HTTPS - TLS v1.2** or **higher**

---

### Support and feedback

Contact [support@document360.com](mailto:support@document360.com) for difficulties or unspecified issues.

## Troubleshooting

If you encounter issues logging into the Knowledge base portal, refer to common errors and solutions:

### reCAPTCHA Error: "Having trouble?"

**Error**: "Having trouble?" message while interacting with reCAPTCHA verification. Caused by browser restrictions, VPN interference, or network blocks.

![Login form displaying an error message from Cloudflare regarding login issues.](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Troubleshooting_srecaptcha_error.png)

**Steps to resolve**:

1. Try accessing in a different browser. If successful, disable extensions in affected browser.
2. Disconnect VPN and attempt login again.

If issue persists:

* Generate HAR file following [these steps](https://docs.document360.com/docs/document360-support-generating-a-har-file)
* Screenshot console errors
* Contact [**support@document360.com**](mailto:support@document360.com) with HAR file and screenshots

![Document360 console interface displaying support articles and troubleshooting options for users.](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-Browser_console.png)

### Access blocked: "Sorry, you have been blocked" / "You are unable to access us.document360.io"

**Error**: "Sorry, you have been blocked" or "You are unable to access us.document360.io" with **Cloudflare Ray ID**. Indicates access restriction due to network, browser, or security issues.

![Access denied message indicating a block by Cloudflare with a Ray ID.](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_Screenshot-Troubleshooting_cloudfare_error.png)

**Steps to resolve**:

1. Check accessibility using different browser, network, or computer:

   * If accessible in another browser, provide **browser name and version**
   * If accessible on different computer, provide **operating system name and version**
   * If accessible on different network, provide **network setup and IP address**
2. Generate HAR file following [these steps](https://docs.document360.com/docs/document360-support-generating-a-har-file)
3. Screenshot console errors
4. Contact [**support@document360.com**](mailto:support@document360.com) with HAR file, screenshots, and details from Step 1

![Document360 console interface displaying support articles and troubleshooting options for users.](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-Browser_console.png)

### Login issue: Knowledge base portal keeps loading

**Error**: Unable to log in because the login page keeps loading indefinitely. Caused by browser cache, extensions interfering, or incorrect system time.

**Steps to resolve**:

1. Clear browser cache and cookies. Check if affects all team accounts or specific users:

   * **Google Chrome:** Menu > Settings > Privacy and security > Clear browsing data
   * **Mozilla Firefox:** Menu > Settings > Privacy & Security > Clear Data
   * **Microsoft Edge:** Menu > Settings > Privacy, search, and services > Choose what to clear
   * **Safari (Mac):** Safari > Preferences > Privacy > Manage Website Data > Remove All
   * **Safari (iPhone/iPad):** Settings > Safari > Clear History and Website Data
   * **Opera:** Menu > Settings > Advanced > Privacy & Security > Clear browsing data
2. Try accessing portal in incognito/private browser window. Some extensions may block login.
3. Inspect page for loading time issues:

   * Right-click and select **Inspect**
   * Check console for error messages
   * Monitor loading times
4. Ensure system time zone is correct. Incorrect clock or mismatch causes login failures.
5. If issue persists, capture diagnostic data:

   * Generate HAR file following [these steps](https://docs.document360.com/docs/document360-support-generating-a-har-file)
   * Share with [**support@document360.com**](mailto:support@document360.com)

---

### FAQs

#### **Can I download the Document360 desktop application?**

Document360 is available only as a **web application** accessible through desktop browsers.

#### **Can I access the Knowledge base portal on smartphones and tablets?**

Yes, accessible via mobile browser. Best experience not recommended through web-view workarounds.

#### **How do I clear the Document360 project cache?**

Clear cache to resolve display or functionality issues:

1. Navigate to specific location in Knowledge base portal
2. Open developer tools:

   1. Windows: Press `Ctrl+Shift+I`
   2. macOS: Press `Cmd+Shift+I`
3. Right-click and hold **refresh** button
4. Select **Empty Cache and Hard Reload**

#### Why am I unable to log in to my Document360 account? The callback URL is not working.

Caused by intermittent cache issues or incorrect system time. If internal clock isn't synchronized, login failures occur including callback URL issues (`portal.document360.io/callback`).

**Steps to resolve:**

* Clear browser cache and cookies, then try logging in again
* Verify system time settings and ensure correct synchronization

![Webpage displaying a loading document360 icon and a highlighted URL in the address bar.](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/5_Screenshot-Callback_while_logging.png)

<a id="document360-my-projects"></a>

## Project dashboard

**Plans supporting access to Your projects page**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

### What is Document360 - Your projects?

"Your Projects" serves as your main dashboard upon logging into Document360. Provides a centralized view of all projects you're associated with, whether as owner, team member, or reader, along with essential navigation tools.

---

## Navigating the 'Your projects' page

Upon logging in, you see tiles representing each Document360 project you have access to. These include projects you own or are associated with as team account or reader. Here's what you can do:

### 1. **Create New or Sandbox Project**

Initiate a new [Project](/help/docs/creating-a-project) or [Sandbox project](/help/docs/creating-a-sandbox-project) using buttons at the top right corner.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/My projects.png "My projects.png")

---

### 2. Projects

Document360 projects you own and those you're associated with as team account or reader are available. Click project tiles to navigate easily.

#### Project tile elements - Team account

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/Project tile elements.png "Project tile elements.png")

1. **Logo:** Project logo for quick identification
2. **Project name:** Clearly labeled to identify each project
3. **Project site access:** Indicates Public, Private, or Mixed access
4. **Settings:** Manage project-specific settings directly from tile
5. **Documentation editor:** Access knowledge base portal to create and manage documentation
6. **View in knowledge base site:** Navigate directly to associated knowledge base site

---

### 2. Profile

Manage personal account settings and log out using the profile menu.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/Profile.png "Profile.png")

---

### 3. Release updates

Stay informed about latest Document360 product enhancements by clicking the Release updates icon. Expand release posts to read detailed updates.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/Release updates(1).png "Release updates(1).png")

---

### 4. Help

Access support resources from the Help menu:

* **Documentation:** Access detailed guides and resources
* **Issues/Clarifications:** Report issues or seek clarifications
* **Submit a Feature Request:** Suggest new features or improvements
* **System Status:** Check current platform status and performance

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/Help.png "Help.png")

This dashboard serves as a central hub for managing and accessing all Document360 projects, ensuring streamlined navigation and efficient project management.

<a id="top-right-menu-overview"></a>

## Top-right menu overview

**Plans supporting access to My profile page**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

The top-right corner provides quick access to key features: view and edit profile, check access levels, change password, stay informed about updates, and explore help resources.

## Key features in the top-right menu

* **My profile**: View and edit personal information, profile picture, and biography. Displays assigned portal and content roles/permissions.
* **View access and permissions**: Check assigned roles and permissions. Ensures appropriate access levels.
* **Change password**: Securely update login credentials. Choose strong password for account protection.
* **Release updates**: Stay informed about latest updates and feature releases.
* **Help menu**: Access helpful resources including:

  + **Documentation:** Explore user guides and feature instructions
  + **Support portal**: Raise support tickets and seek assistance
  + **Contact support**: Directly reach out for help

![Document360 interface showing user profile settings.](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Top_right_menu_overview.png)

---

## Accessing profile options

Access the first three options — **My profile**, **View access and permissions**, and **Change password** — by clicking your **profile picture** in the top-right corner.

> NOTE
>
> Icon displays your profile image or default placeholder. Shows initials until image upload.

### My profile

The **My profile** section allows you to view and edit personal information.

To access:

1. Click profile picture
2. Click **My profile** from dropdown menu. Opens **My profile** side panel.

![Document360 interface showing user profile access menu.](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-Top_right_menu_my_profile.png)

#### Features available in my profile

* **Profile image** - Update or delete profile picture
* **First and last name** - View and edit name
* **Email ID** - View email address
* **Author page URL** - View and edit author page URL
* **Author bio** - Add or update biography. Blank if none added
* **Edit button** - Update or delete profile image, name, URL slug, and biography
* **Portal language** - Change knowledge base portal language. Available: English, Spanish, Portuguese (Brazil). Applies only to portal view
* **Portal role** - View assigned role (Owner, Admin, Contributor)
* **Content role & access** - Check content roles and access levels including workspace names, languages, and categories
* **View contributions** - Click hyperlink to view contributions in Team Accounts module under Analytics

![User profile settings showing role, language, and access details in Document360.](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_Screenshot-My_profile_side_panel.png)

> NOTE
>
> Email IDs cannot be edited for SSO users.

### View access and permissions

Check assigned permissions within Document360 for Portal role and Content role. Portal roles manage administrative settings. Content roles control access and actions related to content management.

![User interface showing access permissions in Document360.](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_Screenshot-Top_right_menu_view_access_permissions.png)

To view permissions:

1. Click profile picture in top-right corner
2. Click **View access and permissions** in dropdown menu. Opens popup window

View permissions assigned for each feature under Portal role and Content role.

Edit/update permissions from Team accounts & groups page in Document360 settings. Changes require appropriate Portal role permissions (Owner or Admin).

Read the article on Roles & permissions for more information.

![Access permissions for project settings, team auditing, and event notifications overview.](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/5_Screenshot-View_access_permissions_window.png)

> NOTE
>
> Available only when accessing top-right menu from within a project.

### Change password

Securely update login credentials.

![User interface showing the option to change password in settings.](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/6_Screenshot-Top_right_menu_change_password.png)

To update password:

1. Click profile picture in top-right corner
2. Click **Change password** from dropdown menu. Opens popup window
3. Enter **current password**
4. Enter **new password** meeting security requirements

> NOTE
>
> New password should:
>
> * Be at least 8 characters long
> * Contain at least 1 UPPERCASE letter
> * Contain at least 1 lowercase letter
> * Contain at least 1 number
> * Contain at least 1 special character

5. Confirm new password by re-entering
6. Click **Save**

> NOTE
>
> Changing password logs you out immediately. Log in with updated password.

#### Best practices for updating your password

**Dos**

* Create unique password combining numbers, words, symbols, uppercase and lowercase letters

> **Example:** En37df_n4r-hufling

**Don'ts**

* Don't use easily guessed passwords like "password," "123456," or "user"
* Don't choose passwords based on easily obtainable details (birth date, phone number, family names)
* Don't use dictionary words. If necessary, add numbers and special characters
* Don't use simple adjacent keyboard combinations like "qwerty" or "123456"

---

## Release updates

Stay up-to-date with latest Document360 updates and announcements.

To read latest updates:

1. Click **Release updates** icon in top-right corner. Popup displays three latest releases
2. Click any update to read summary. Click **Read the whole post** for full details
3. Click **Document360 updates** to redirect to [**Document360 Updates - Changelog**](https://changelog.document360.com/?utm_medium=widget) page

![Document360 interface showing recent updates in a sidebar.](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/8_Screenshot-Top_right_menu_release_updates.png)

> NOTE
>
> Read latest Document360 release note [**here**](https://docs.document360.com/docs/release-note).

---

## Help menu

Several tools to assist users in resolving queries, accessing resources, and staying informed.

Click **HELP** in top-right corner to access help menu.

### Options available in the help menu

1. **Get assistance:** Opens side-panel widget to search for answers or access documentation
2. **Documentation:** Redirects to Document360 knowledge base at `https://docs.document360.com/docs`
3. **Chat with us:** Opens chat widget connecting you with customer support
4. **Issues and clarification:** Launches widget to create support tickets with details and attachments
5. **Submit a feature request:** Platform to share feedback and suggest features. Visible to other users who can vote
6. **System updates:** Redirects to `https://status.document360.com/` for operational status

![Document360 interface showing help features for users.](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/9_Screenshot-Top_right_menu_help_menu.png)

> NOTE
>
> Contact support directly via email at [support@document360.com](mailto:support@document360.com).

---

### FAQs

#### What happens if the browser does not support the selected portal language?

Document360 defaults to English.

#### What if I select Spanish as my portal language but my browser's preferred language is set to English?

All projects display in Spanish following user preference. Browser language setting doesn't override portal selection.

<a id="creating-a-project"></a>## Creating a project in Document360

#### Plans supporting project creation

| Professional | Business | Enterprise |
| --- | --- | --- |
| ✓ | ✓ | ✓ |

A project in Document360 serves as a container for all your documentation needs. It encapsulates articles, categories, subcategories, home page, team accounts, readers, groups, and custom configurations.

## How to create a knowledge base project

Projects streamline documentation management. Whether creating user manuals, internal processes, or API documentation, Document360 provides the framework. Follow these steps:

### Access dashboard

1. Log in to [**Document360 portal**](https://portal.document360.io/) to access **Dashboard**
2. If in different project's Knowledge base portal, click Document360 icon at top left to return to **Dashboard**
3. Click **+Project** button at top right

![Document360 interface showing projects dashboard.](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/My projects.png)

### Choose use case

4. Select primary use case by clicking **Get started**

| Use case | Description |
| --- | --- |
| **Knowledge base platform** | Centralized hub for team knowledge and resources. Enables quick answers and enhances customer self-service. |
| **Software documentation** | Organize technical documentation. Document product features, APIs, and release notes for developers and users. |
| **SOP documentation** | Create detailed procedures. Ensures consistent processes, reduces errors, and helps onboard new employees. |
| **User manual** | Develop comprehensive guides. Reduces support queries with step-by-step instructions and troubleshooting. |
| **API Documentation** | Document endpoints, request/response formats, authentication, and examples for developer integration. |
| **Others** | Customize knowledge base for specific organizational needs outside predefined categories. |

### Select template

5. Choose content type for your project. Select up to two templates.

> NOTE
>
> Templates embed during project creation based on selection.

**Knowledge base platform templates**

Select two templates if using Knowledge base platform:

| Template | Purpose |
| --- | --- |
| **Getting started guides** | Step-by-step instructions for new users to begin using your product. |
| **How-to guides** | Detailed instructions for specific tasks to utilize product features. |
| **FAQs** | Common questions and answers to reduce support queries. |
| **Policy & procedures** | Organizational protocols and guidelines. |

**Software/Technical documentation templates**

Select two templates if using Software/Technical documentation:

| Template | Purpose |
| --- | --- |
| **Release notes** | Updates on new features, bug fixes, and improvements with each release. |
| **Software Design Documentation** | Software architecture and design including diagrams and specifications. |
| **Software Requirement Documentation** | Software purpose, functionalities, and environment description. |
| **Product Requirement Documentation** | Product purpose, value, and functionalities definition. |
| **Process documentation** | Software development steps and procedures. |
| **User guide** | Comprehensive instructions covering all features and functionalities. |

**SOP documentation templates**

Templates available for SOP documentation:

| Template | Purpose |
| --- | --- |
| **Compliance policies** | Regulatory requirement documentation to enforce compliance. |
| **Operation SOP** | Standardized operational procedures for efficiency. |

**User manual templates**

Select two templates if using User manual:

| Template | Purpose |
| --- | --- |
| **Installation manual** | Product setup information including overview and assembly instructions. |
| **Instruction manual** | Assembly and usage instructions with diagrams and safety warnings. |
| **Maintenance manual** | Upkeep, troubleshooting, and repair procedures. |
| **Training manual** | Installation, operation, and troubleshooting guidance. |
| **Operations manual** | Daily maintenance and troubleshooting instructions. |

### Personalize knowledge base

6. Enter preferred website URL. Skip to default to domain linked to registration email.

### Brand guidelines

7. Project name, default language, branding logo, and colors auto-set based on URL. Edit fields if needed.
8. Browser language determines default language. English selected if browser language unsupported.

> NOTE
>
> * Spanish or Brazilian Portuguese portals auto-set if chosen as default language
> * Branding elements extracted from website. Skip to apply Document360 defaults
> * Preview knowledge base on right side of screen

### Set documentation privacy

9. Choose privacy settings:

   * **Private**: Internal access only
   * **Public**: Open access to all
   * **Mixed**: Combination of private and public sections
10. Click **Next**

### Access knowledge base portal

Once setup completes, enter Document360 Knowledge base portal. Pre-loaded articles based on selected use case and templates appear.

> NOTE
>
> Articles tailored to your selections provide head start on content creation.

![Onboarding process in Document360](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_ScreenGIF-Final_onboarding_process.gif)

---

## Switching between projects

Work on multiple projects or switch between them for various tasks.

Two ways to switch projects:

1. Projects dropdown
2. Projects dashboard

### Switch using dropdown

1. Click project dropdown at top-left from any Knowledge Base module
2. View project name, site access (Public, Private, Mixed), and Sandbox label
3. Click desired project

![Project switching dropdown](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/Switching%20between%20projects%20-%201.png)

### Switch from dashboard

1. Click Document360 logo at top-left

![Dashboard navigation](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/Switching%20between%20projects%20-%202.png)

Redirected to "My Projects" page showing all projects.

2. Click desired project

![Project list](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/Switching%20between%20projects%20-%203.png)

---

### FAQs

#### Does Document360 support different languages in onboarding?

Yes. Multi-lingual support includes English, Spanish, Brazilian Portuguese, German, and Swedish. Portal language support limited to English, Spanish, and Brazilian Portuguese.

#### Can I customize project appearance and structure?

Yes. Customize home page, themes, branding, and organize articles hierarchically.

#### Is access control possible within projects?

Absolutely. Assign roles and permissions to restrict or grant access based on responsibilities.

#### How does version control work?

Article revisions automatically save and track changes, allowing reverts to previous versions.

#### How do I identify current project?

Project name displays at top-left of Knowledge Base portal.

#### What if desired project doesn't appear?

Verify access permissions. Contact administrator if issue persists.

#### What is a Sandbox project?

Test environment for experimenting without affecting live projects. Labeled in project dropdown.

#### What does Site Access mean?

Indicates Public, Private, or Mixed accessibility level.

#### How to request project access?

Contact team administrator or project owner.

Application Programming Interface - Rules enabling software application communication.

<a id="dashboard"></a>

## Dashboard

**Plans supporting Dashboard**

| Professional | Business | Enterprise |
| --- | --- | --- |
| ✓ | ✓ | ✓ |

Dashboard provides insights on projects, team members, and tasks. Two tabs available: **My contribution** and **Overview**.

* **My contribution**: Your articles and contributions
* **Overview**: All team accounts associated with project

## My contribution tab

Shows your contributions to associated Document360 project including workspaces and languages.

View contributions in terms of:

* Article summary (created, published, performance metrics)
* Assigned articles
* Review reminders
* Feedback to address
* Broken links

![Dashboard interface](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_GIF-Dashboard_my_contribution_overview.gif)

> NOTE
>
> Filter data by workspace and language using dropdown. Select "All workspaces" and "All languages" for complete view.

### Article summary

Left section shows articles you've worked on:

* **Created articles**: Number of created articles
* **Published articles**: Number of published articles
* **Draft articles**: Number of updated but unpublished articles

Performance metrics include:

* Overall views
* Reads
* Likes
* Dislikes

> NOTE
>
> Use **Date** filter (top right) to view statistics for last week, month, or custom range.

### Assigned to me

Shows all articles assigned to you across workspaces and languages. Displays current workflow status and due dates.

### Review reminders

Articles marked stale after set period without updates appear here with stale date.

### Feedback

User feedback assigned to you from Feedback manager appears in this tab with status and assignment date.

### Broken links

Articles containing broken links listed here with workspace, language, and broken link count.

## Overview tab

Team members with Owner or Admin roles view key project information:

* Article contributions
* Performance metrics
* Drive capacity
* Team accounts
* Reader count
* Broken links

Metrics include:

* Article summary (created, published, performance)
* Project overview (recently seen, team accounts, readers, drive capacity, broken links, no result searches, last backup)

![Project overview dashboard](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Project_dashboard_overview_page.png)

> NOTE
>
> Filter data by workspace and language using dropdown. Select "All workspaces" and "All languages" for complete view.

### Article summary

Shows total articles created, published, and draft plus performance metrics for selected timeframe. Filter by contributor.

### Project overview

Manage project with important information:

* **Recently seen**: Contributors who recently accessed project
* **Team accounts**: Total team accounts. Click **View all** for Users & security page
* **Readers**: Total readers. Click **View all** for Readers & groups page
* **Drive capacity**: Used vs. available capacity. Click **View all** for Drive module
* **Broken links**: Total broken links. Click **View all** for Link status page
* **No result searches**: Searches returning no results. Click **View all** for Search analytics
* **Last backed up**: Most recent backup date

---

### FAQ

**How to filter My Contribution data?**

Select specific workspace and language from dropdown, or choose "All workspaces" and "All languages".

<a id="getting-started-with-multi-lingual-knowledge-base"></a>

## Multilingual Knowledge bases

**Plans supporting multilingual knowledge base**

| Professional | Business | Enterprise |
| --- | --- | --- |
| ✓ | ✓ | ✓ |

### What is a multilingual Knowledge base?

Provides content in multiple languages for integrated user experience.

> NOTE
>
> Document360 supports internationalization (i18n) of project Knowledge base sites.

---

## Adding multiple languages to workspace

Add multiple languages to single project workspace.

Navigate to Settings > **Knowledge base portal** > **Localization & workspaces**

Two methods to add new language:

#### Method 1 - Edit workspace

1. Click **Edit** (🖉) icon for workspace
2. Click **New language** at bottom
3. Search for desired language(s)
4. Select checkbox and click **Apply**
5. Click **Update**
6. Click **More** () icon for edit options:

   * **Set as default**: Make language default for workspace
   * **Edit display name**: Modify language display name
   * **Right to left**: Enable for languages written right-to-left
   * **Hide**: Hide language (indicated by strikethrough)
   * **Remove**: Delete language from workspace

![Multilingual setup](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_ScreenShot-Multilingual_Knowledge_Base.gif)

#### Method 2 - Localization icon

1. Click **Add new language** () icon
2. Search and select desired languages
3. Click **Add**

> NOTE
>
> Languages display in native script except English.

![Language selection](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_ScreenShot-Multilingual_language_base.gif)

> NOTE
>
> Categories and articles from default language available in new languages. Manual translation required using machine translation or extensions like Crowdin.

---

## FAQ

**How many languages per workspace?**

Default languages per plan:

* **Professional**: 2 languages
* **Business**: 3 languages
* **Enterprise**: 5 languages

Additional languages available as add-on.

Knowledge base - Public website where end-users access articles and find answers.

Knowledge base - Online library for product, service, department, or topic information.

Knowledge base portal - Platform where project members manage content, create categories/articles, manage files, and configure settings.

<a id="creating-a-sandbox-project"></a>

## Creating a sandbox project

**Plans supporting Sandbox project**

| Professional | Business | Enterprise |
| --- | --- | --- |
| ✓ | ✓ | ✓ |

### What is a Sandbox project?

Isolated test environment to explore features without impacting live knowledge base.

Use sandbox to:

* Test new features and settings
* Identify issues early
* Refine setup and train team

Example: Redesign Knowledge base layout, test with internal teams, adjust before live implementation.

---

## Creating a Sandbox project

1. Navigate to **Settings** > **Knowledge base portal** > **General**
2. In **Sandbox** section, click **Create Sandbox**
3. Enter project name (30 character limit, A-Z, a-z, 0-9, hyphens, spaces only)
4. Select language
5. Optional: Select **KB site 1.0** checkbox
6. **Knowledge base visibility** defaults to [**Private**](/docs/site-access#private-access)
7. Click **Next**
8. Optional: Invite team accounts (separate emails with commas)
9. Select role for each team account
10. Click **Create project**
11. Click **Open Sandbox** to access

![Sandbox creation process](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/New_UI_1_ScreenGIF-Creating_a_Sandbox_project.gif)

**Sandbox** badge appears next to **Open site** in top bar and beside workspace name.

![Sandbox badge](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-New_Sandbox_badge_in_the_top_bar.png)

> NOTE
>
> SSO users cannot create sandbox projects due to authentication requirements.

### Reasons for sandbox project

* **Reduced Risk**: Isolated testing environment
* **Increased Efficiency**: Pre-launch testing ensures smooth transitions
* **Safe Exploration**: Test Document360 features without live disruptions
* **Training Platform**: Hands-on experience without unintended impacts

---

### FAQs

#### How to configure Sandbox subdomain?

Subdomain includes `sandbox` prefix. Modify using [custom domain mapping](https://docs.document360.com/docs/custom-domain-mapping).

#### How does Sandbox improve management?

Controlled environment to assess features before live implementation, enhancing content quality.

#### Can I test configurations safely?

Yes. Evaluate templates, integrations, and scripts without impacting primary knowledge base.

#### How does Sandbox prevent customer impact?

Verify navigation menus and search algorithms before customer exposure.

#### Can I migrate sandbox to production?

No direct migration option. Export data from sandbox and import to production manually.

#### Why can't SSO users access Sandbox?

Request team member with standard account to create user account for you.

<a id="quick-summary-of-the-security-and-infrastructure-aspects"></a>## Using Markdown in your Knowledge base

Refer to [**Editor choices in Document360**](/help/docs/using-the-text-editor) for detailed comparison of editing options.

* Use Markdown syntax manually or format text using the Markdown toolbar.
  For example, make text **Bold** by typing `**word**` or clicking the **Bold** icon.
* Syntax must match required character arrangement exactly.
* See [**Markdown basic syntax**](https://www.markdownguide.org/basic-syntax/) for comprehensive reference.

> **Examples of proper syntax:**
> 
> **Bold**: `**Text**` (not `** Text **`)
> 
> **Headings**: `### Heading3` (not `###Heading3`)

---

## Markdown toolbar

The WYSIWYG toolbar provides formatting options including media insertion.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_ScreenShot-Markdown_Editor.png)

* **Headings**
* **Basic text formatting**
* **List**
* **Insert**
* **Callouts**
* **Private notes**
* **Find and replace**
* **Insert LaTeX**
* **Content reuse**
* **Code block**
* **Glossary**
* **Video**

### Headings

* **H2**: **Heading 2**
* **H3**: **Heading 3**
* **H4**: **Heading 4**

### Basic text formatting

* **Bold:** Make text bold
* **Italic:** Make text italic
* **Strikethrough:** Cross out text
* **Blockquote:** Offset quotes with a line

  > This is an example of Blockquote.
* **Line**: Insert horizontal line

### List

* **Unordered list:** Bullet-point list
* **Ordered list:** Numbered list

### Insert

* **Insert Table:** Add table
* **Insert image:** Add image from URL, local drive, or Document360 Drive
* **Insert file:** Add PDF or Word document
* **Insert a link:** Add hyperlink to URL or Knowledge base article

### Callouts

* **Info**: Blue info box
* **Warning:** Yellow warning box
* **Error:** Red error box

### Private notes

* **Private notes**: Purple internal comment box visible only to team members

> **Example**: Add internal feedback for team members

### Insert LaTeX

* **Insert LaTeX**: Add mathematical expressions

  1. Click **Insert LaTeX** - sample syntax (a² + b² = c²) appears
  2. Type desired syntax
  3. Syntax must start and end with **$**

  > **Note**: No space between $ and syntax

  + See [**LaTeX help article**](http://docs.mathjax.org/en/latest/input/tex/macros/index.html) for commands

### Find and Replace

* **Find and Replace:** Search and replace text within article

### Content reuse

* **Content reuse:** Reuse content across project
  a. **Variable**: Text only
  b. **Snippet**: Images, tables, etc.

### Codeblock

* **Insert Codeblock**: Add code block

### Glossary

* **Glossary:** Add glossary term

### Video

* **Insert Video**: Embed YouTube, Wistia, or Vimeo video

### Scroll

* **Scroll on/off:** Enable/disable synchronized scrolling between editor and preview

---

### Spell checker in Markdown

1. Right-click misspelled word
2. Browser displays correction suggestions
3. Click suggested correction to apply

   ![5_Screenshot-Markdown_Spell_checker](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/5_Screenshot-Markdown_Spell_checker.png)

---

### FAQs

#### What is a Markdown editor, and how does it differ from a regular text editor?

Markdown editor converts plain text to HTML using simple syntax. Unlike regular editors, it provides live previews. Document360 offers robust Markdown editing capabilities.

#### What are the key features of the Markdown editor in Document360?

Real-time previews, syntax highlighting, keyboard shortcuts, drag-and-drop image support, and integration with version control.

#### Is a Markdown editor suitable for beginners with no syntax-based writing experience?

Yes. Markdown's simple syntax requires no coding knowledge.

#### How do I add ASCII code to my article?

Use the **Code Block** feature.

#### Is it possible to add a code block without any heading?

Yes. Code blocks can be added without headings.

#### Can I use HTML content in the Markdown editor?

Yes, but Markdown syntax is recommended for consistency.

---

## Related blogs

#### [1. The Ins and Outs of Using Markdown for Technical Writing](https://document360.com/blog/markdown-for-technical-writing/)

#### [2. Introductory Guide to Markdown for Documentation Writers](https://document360.com/blog/introductory-guide-to-markdown-for-documentation-writers/)

A lightweight text-to-HTML conversion tool for formatting content like lists, headers, images, videos, and links. Document360 includes a powerful markdown editor as one of its two basic editors.

<a id="markdown-basics"></a>

## Basic Markdown syntax

**Plans supporting the use of Markdown editor**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

The Markdown editor creates clear, organized content in Document360. This guide covers basic commands and formatting for new and experienced users.

Markdown is a lightweight markup language for formatting text using special characters. No coding knowledge required—follow the syntax to create headings, lists, links, and more.

---

## Markdown commands

Format text using Markdown commands. **Syntax** shows how to type content. **Example** column provides reference.

Keyboard shortcuts are available for some commands (see **Notes** column).

| Feature | Syntax | Example | Output | Notes |
| --- | --- | --- | --- | --- |
| **Headings (H2, H3, H4)** | `##`, `###`, `####` before text | `## Heading 2` | Heading 2 | Create section titles with 1-6 hash symbols. Document360 reserves H1 for article titles. |
| **Bold** | `**text**` | `**bold**` | **bold** | Emphasize important text. Shortcut: Ctrl+B / Cmd+B |
| **Italics** | `*text*` or `_text_` | `*italics*` | *italics* | Highlight text subtly. Shortcut: Ctrl+I / Cmd+I |
| **Strikethrough** | `~~text~~` | `~~strikethrough~~` | ~~strikethrough~~ | Cross out text. No shortcut |
| **Numbered List** | `1.` followed by text | `1. First item` | 1. First item | Numbers auto-increment |
| **Bulleted List** | `*` or `-` followed by text | `* Bullet item` | \* Bullet item | Use asterisk `*` or hyphen `-` |
| **Link** | `[text](URL)` | `[Document360](https://docs.document360.com)` | [Document360](https://docs.document360.com) | Clickable text |
| **Blockquote** | `>` before text | `> This is a quote` | Creates callout/blockquote | For quoting or highlighting |
| **Horizontal Line** | `***` | `***` | Creates horizontal line | Separate sections |

---

## Heading levels

| Heading Level | Syntax | Example | Output |
| --- | --- | --- | --- |
| H2 | `## Heading 2` | `## This is Heading 2` | This is Heading 2 |
| H3 | `### Heading 3` | `### This is Heading 3` | This is Heading 3 |
| H4 | `#### Heading 4` | `#### This is Heading 4` | This is Heading 4 |

**TIP**: Ensure blank line above headings and space between hash symbols and text.

---

## Styling text

| Style | Syntax | Example | Output |
| --- | --- | --- | --- |
| **Bold** | `**text**` | `**bold text**` | **bold text** |
| *Italics* | `*text*` or `_text_` | `*italic text*` or `_italic text_` | *italic text* or *italic text* |
| ~~Strikethrough~~ | `~~text~~` | `~~strikethrough text~~` | ~~strikethrough text~~ |
| **Highlight** | `==text==` | `==highlighted text==` | ==highlighted text== |
| **Superscript** | `text^superscript` | `E = mc^2` | E = mc2 |
| **Subscript** | `text~subscript` | `H~2~O` | H2O |

**TIP**: Avoid spaces between syntax and text.

---

## Lists

| List Type | Syntax | Example | Output | Description |
| --- | --- | --- | --- | --- |
| **Numbered List** | `1. Item` | `1. First item` | 1. First item | Auto-incrementing numbers |
|  | `2. Item` | `2. Second item` | 2. Second item | Continue pattern for items |
|  | `3. Item` | `3. Third item` | 3. Third item |  |
| **Bulleted List** | `* Item` | `* Bullet item` | - Bullet item | Use `*`, `-`, or `+` |
|  | `- Item` | `- Another bullet item` | - Another bullet item | Any symbol creates bullet |
|  | `+ Item` | `+ Yet another bullet item` | + Yet another bullet item |  |

---

## Links and blockquotes

| Feature | Syntax | Example | Output |
| --- | --- | --- | --- |
| Link | `[text](URL)` | `[Document360](https://docs.document360.com)` | [Document360](https://docs.document360.com)` |

**Blockquote**  
Use '>' before text for quotes or highlights.  
`> This will quote the entire line of text`  
Output:

> This will quote the entire line of text

---

## Horizontal line

Use three asterisks for horizontal line.

`***`  
Output:

---

## Quick tips for beginners

1. Use Headings to structure content (sections and subsections)
   * Example: `##` for large headings, `###` for smaller ones
2. Highlight key points with **Bold** or *Italics*
3. Organize information with Lists
   * `1.` for numbered lists, `*` for bullet points
4. Direct users to resources with **Links**

---

## More elements

| Feature | Syntax | Example |
| --- | --- | --- |
| Image | `![Alt text](URL "Optional title")` | `![Logo](https://example.com/logo.png "Logo")` |
| Reference Link | `[Link text][ref]``[ref]: URL` | `[Document360][doc]``[doc]: https://docs.document360.com` |
| Escaping Characters | `\character` | `\*This is not italic\*` |
| YouTube Video | `<iframe src="https://www.youtube.com/embed/VIDEO_ID" width="560" height="315" frameborder="0" allowfullscreen></iframe>` | `<iframe src="https://www.youtube.com/embed/dQw4w9WgXcQ" width="560" height="315" frameborder="0" allowfullscreen></iframe>` |
| Vimeo Video | `<iframe src="https://player.vimeo.com/video/VIDEO_ID" width="640" height="360" frameborder="0" allowfullscreen></iframe>` | `<iframe src="https://player.vimeo.com/video/76979871" width="640" height="360" frameborder="0" allowfullscreen></iframe>` |

For HTML, copy examples and replace URLs.

---

## Emoji usage

Copy and paste emojis directly from the table below.

| **Emoji** | **Description** |
| --- | --- |
| 📝 | Memo |
| ✍️ | Writing Hand |
| 📄 | Page Facing Up |
| 📚 | Books |
| 📖 | Open Book |
| 🖋️ | Fountain Pen |
| 📑 | Bookmark Tabs |
| 🔍 | Magnifying Glass |
| 📅 | Calendar |
| 💻 | Laptop |
| 📊 | Bar Chart |
| 📈 | Chart with Upwards Trend |
| 🗂️ | Card Index Dividers |
| ✏️ | Pencil |
| 😊 | Smiling Face |
| ❤️ | Red Heart |
| 🌟 | Star |
| 🔥 | Fire |
| 🎉 | Party Popper |

Paste desired emoji into document. Insert FontAwesome icons using HTML code.

---

## Using Unicode characters in the Markdown editor

Unicode characters enhance Markdown documents with symbols, special characters, and non-Latin scripts.

### Syntax for inserting Unicode characters

1. **Direct copy-paste:** Copy character from Unicode reference and paste into Markdown

   **Example:**
   ```
   ★ Star symbol
   ```
   **Output:** ★ Star symbol

2. **HTML entity code:** Use format `&#xXXXX;` where `XXXX` is hex code

   **Example:**
   ```
   &#x1F680; Rocket symbol
   ```
   **Output:** 🚀 Rocket symbol

### Common Unicode characters

| Character | Description | Unicode (Hex) | HTML entity code |
| --- | --- | --- | --- |
| ★ | Star symbol | 2605 | `&#x2605;` |
| ✔ | Check mark | 2714 | `&#x2714;` |
| ✉ | Envelope | 2709 | `&#x2709;` |
| © | Copyright | 00A9 | `&#x00A9;` |
| € | Euro sign | 20AC | `&#x20AC;` |
| → | Right arrow | 2192 | `&#x2192;` |
| ♻ | Recycling symbol | 267B | `&#x267B;` |

#### Finding more Unicode characters

See [Unicode Character Table](https://unicode-table.com/) or [Unicode.org Code Charts](https://www.unicode.org/charts/) for extensive lists.

---

## Example: Creating a simple article

```
#### Welcome to Markdown  
Learn how to use **Markdown** in Document360 to format your articles.  

#### Why use Markdown?  
* Easy to learn  
* Clean and organized formatting  
* Saves time  

#### Useful tips  
1. Use headings to structure your content.  
2. Add links for more resources: [Learn Markdown](https://markdownguide.org)  
3. Use `***` to create a divider.  
```

### Output

#### Welcome to Markdown

Learn how to use **Markdown** in Document360 to format your articles.

#### Why use Markdown?

* Easy to learn
* Clean and organized formatting
* Saves time

#### Useful tips

1. Use headings to structure your content.
2. Add links for more resources: [Learn Markdown](https://markdownguide.org)
3. Use `***` to create a divider.

---

See official [Markdown syntax guide](https://www.markdownguide.org/basic-syntax/) for advanced commands.

Tags structure subheadings in articles. H1 applies automatically to titles. H2, H3, and H4 create subheadings with progressively smaller text.

A lightweight text-to-HTML conversion tool for formatting content like lists, headers, images, videos, and links. Document360 includes a powerful markdown editor as one of its two basic editors.

<a id="wysiwyg-editor"></a>

## WYSIWYG editor

**Plans supporting the use of WYSIWYG editor**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

The **WYSIWYG (What You See Is What You Get)** editor shows content as it will appear when published.

> **Note**: Cannot switch from WYSIWYG to Markdown. Articles converted from Markdown to WYSIWYG cannot be reverted. Switching from Markdown to WYSIWYG is supported.

---

## WYSIWYG toolbar

The WYSIWYG toolbar offers various text editing and media insertion options.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_ScreenShot-WYSIWYG_Editor(1).png)

### 1. Heading options

Available heading options:

Normal

## Heading 2

### Heading 3

#### Heading 4

### 2. Text formatting

Available text styling options:

* **Bold**: Bold text
* *Italic*: Italicize text
* Underline: Underline text
* ~~Strikethrough~~: Cross out text
* **More text**: Font size, family, color, background color, subscript, superscript, clear formatting

### 3. Paragraph formatting

Available paragraph formatting options:

* **Unordered list**: Bullet symbols: •, ○, ◘. Disc and Default are identical
* **Ordered list**: Numbered items. Supports numbers, alphabets, Roman numerals, Greek numerals. Default uses numbers
* **More paragraph**: Alignment, line height, indentations, quote text

### 4. Insert options

* **Insert link**: Add hyperlink to URL or Knowledge base article
* **Insert codeblock**: Add codeblock (e.g., JavaScript snippet)
* **Insert image**: Add image from URL, local storage, or Drive. Shortcut: Ctrl+p
* **Insert file**: Add {{glossary.File}} from Drive (Word or PDF)
* **Insert callouts**: Add info boxes (blue), warning boxes (yellow), error boxes (red)
* **Private notes**: Internal comment box visible only to team members
* **Insert LaTeX**: Add mathematical expressions using LaTeX syntax

  + Click **Insert LaTeX** - **Insert latex expression** window appears. Type LaTeX syntax and click **Insert**. See [this article](http://docs.mathjax.org/en/latest/input/tex/macros/index.html) for more information
  + Click Edit (Pencil) icon to modify expression. Make changes and click **Update**
  + Click Remove (Trashbin) icon to delete expression
* **Find & replace**: Search and replace text within article
* **Content reuse**: Reuse content with:
  + **Variable**: Text content
  + **Snippet**: Text, images, tables, code blocks, etc.
* **Glossary**: Maintain terms and definitions in Knowledge base

### **5. More rich**

* **Insert video**: Embed videos from YouTube, Wistia, Streams, or Vimeo
* **Insert table**: Add table by selecting rows and columns
* **Insert horizontal line**: Add line to article
* **Emoticons**: Insert emoticons to enhance engagement

### 6. Other options

Additional features:

* **Code view**: Switch to HTML syntax editor
* **Undo**: Undo previous action
* **Redo**: Repeat previous action

### 7. Editor switch

* Use switch editor toggle to convert article to Advanced WYSIWYG editor
* Click toggle and **Switch to New Editor** to convert
* See [Advanced WYSIWYG editor](/help/docs/advanced-wysiwyg-editor-overview) for guidance

### Additional formatting options

### 1. Image

After adding image, available options:

a. **Replace**: Replace image  
b. **Align**: Add caption to align image  
c. **Image caption**: Appears below image  
d. **Remove**: Delete image  
e. **Insert link**: Add link to image (can open, remove, edit)  
f. **Display**: Change image display (Inline or Break Text)  
g. **Style**: Border style (Rounded, Bordered, Shadow)  
h. **Alternative text**: Text shown if image fails to load  
i. **Change size**: Adjust width and height in pixels  
j. **Advanced edit**: Crop, text formatting, rotate, zoom, navigation, history, undo/redo, reset, delete functions

### 2. Video

After embedding video, available options:

a. **Replace**: Replace video  
b. **Remove**: Delete video  
c. **Display**: Change video display (Inline or Break Text)  
d. **Align**: Align video  
e. **Change size**: Adjust video size  
f. **Autoplay**: Toggle autoplay

### 3. PDF

After adding PDF, available options:

a. **Remove**: Delete PDF  
b. **Change size**: Adjust PDF size

### 4. Word file

After adding Word file, available options:

a. **Open link**: Download file  
b. **Remove**: Delete file

### 5. Table

After adding table, available options:

a. **Table header**: Toggle header row visibility  
b. **Remove table**: Delete table and content (use Undo if accidental)  
c. **Row**: Insert/delete rows  
d. **Column**: Insert/delete columns  
e. **Table style**: Dashed Borders, Alternate Rows  
f. **Cell**: Merge/split cells  
g. **Cell background**: Change background color  
h. **Vertical align**: Align content top/middle/bottom  
i. **Horizontal align**: Align content left/center/right/justified  
j. **Cell style**: Highlighted or Thick borders

---

## When, Where, and Why to Use the WYSIWYG Editor

#### Who can use the WYSIWYG editor?

Document360 users comfortable with HTML editors

#### Is the WYSIWYG editor easy to use?

Similar to word-processing applications like Microsoft Word or Google Docs.

Copy and paste content directly from Word or other sources. No special syntax required.

#### Why use the WYSIWYG editor?

* Single editing pane with live preview
* Paste large tables from third-party sites or other Knowledge bases

<a id="advanced-wysiwyg-editor"></a>

## Advanced WYSIWYG editor

**Plans supporting the use of Advanced WYSIWYG editor**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

The Advanced WYSIWYG editor combines lightweight design with rich text editing capabilities, supporting specific Markdown syntax. More visual than traditional Markdown editors but more flexible than standard WYSIWYG editors.

> **Note**: Can switch between Advanced WYSIWYG and WYSIWYG editors when article is in **Draft/New** state. Switching disabled for **Published** articles.

> **Caution**: Articles converted from Markdown to Advanced WYSIWYG cannot be reverted.

---

## Using Advanced WYSIWYG editor

Use slash commands, toolbars, and specific Markdown syntax to create and edit content.

### Slash commands

Type `/` in editor to show options. Search by typing command names. Click desired command or press Enter.

> **Note**: Type `/` at start of line or after space. Navigate with arrow keys.

Access **Eddy AI** from top of slash menu. Options categorized into three sections:

| **Format** | **Insert** | **Content Reuse** |
| --- | --- | --- |
| Heading 2 | Image | Variables |
| Heading 3 | Video | Snippets |
| Heading 4 | Link | Glossary |
| Ordered list | Table |  |
| Bullet list | Callouts |  |
| Checklist | Private notes |  |
| Inline code | Code block |  |
| Page break | Insert file |  |
|  | Accordion |  |
|  | Latex |  |
|  | Emoji |  |
|  | Divider |  |

![Updated_ScrenGIF-Slash_command_in_Adv_WYSIWYG](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/Updated_ScrenGIF-Slash_command_in_Adv_WYSIWYG.gif)

---

### Markdown syntax

Advanced WYSIWYG editor supports wide range of Markdown syntax. See [Markdown basics](/help/docs/markdown-basics) for detailed list.

> **Example**: Add Heading 2 with `## Heading of the section`. Syntax renders instantly.

> **Note**: Markdown syntax works only when typed manually, not when pasted.
>
> See [Advanced WYSIWYG editor basics](/help/docs/Advanced-WYSIWYG-editor-basics#unsupported-markdown-syntax) for unsupported syntax.

---

## Toolbar

Toolbar has three sections:

* **Format**: Change layout/appearance
* **Insert**: Add elements (images, videos, tables, etc.)
* **Find & replace**: Search and replace text

> **Note**: Use Pin option to anchor toolbar to editor interface

![1_Screenshot-General_view_of_toolbar_in advanced_WYSIWYG_editor](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-General_view_of_toolbar_in%20advanced_WYSIWYG_editor.png)

### Format

![2_Screenshot-Format_seciton_toolbar](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-Format_seciton_toolbar.png)

#### 1. Text styles

* **Undo**: Reverse last action
* **Redo**: Reapply last undone action
* **Clear**: Remove all styling
* **Lettercase**: Change text case

#### 2. Headings

* Apply H2 style
* Apply H3 style
* Apply H4 style
* **Paragraph**: Apply standard paragraph style

#### 3. Typography

* **Font family**: Select typeface
* **Font size**: Adjust text size

#### 4. Palette

* **Font color**: Change text color
* **Background color**: Set background color

#### 5. Formatting & Lists

* **Bold**: Bold selected text
* ***Italic***: Italicize selected text
* **Underline**: Underline selected text
* **~~Strikethrough~~**: Cross out selected text
* `Inline code`: Add inline code
* **Align left**: Left-align text
* **Center**: Center text
* **Align right**: Right-align text
* **Justify**: Evenly distribute text between margins
* **Bullet list**: Add bullet-point list
* **Ordered list**: Add numbered list
* **Checklist**: Add checkbox list

#### 6. Controls

* **Increase indent**: Move content away from margin
* **Decrease indent**: Move content toward margin
* **Subscript**: Lower text below baseline
* **Superscript**: Raise text above baseline
* **Line height**: Adjust spacing between lines
* **Letter space**: Change spacing between letters
* **Line break**: Move to next line
* **Page break**: Specify page breaks for PDF export

---

### Insert

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/image-1736939177920.png)

* **Image**: Insert image
* **Video**: Insert video
* **Link**: Insert hyperlink (shortcut: Ctrl + k)
* **Insert file**: Insert file
* **Table**: Insert table
* **Divider**: Insert horizontal line
* **Accordion**: Add expandable/collapsible container
* **Callout**: Insert callout (defaults to info)

  + Customize with: Callout info, warning, error, success, background color, border color, delete
* **Private notes**: Insert private notes
* **Code block**: Insert code block

  + Customize with: Language dropdown, copy, delete
* **FAQs**: Insert FAQ templates
* **Latex**: Insert mathematical equations
* **Variable**: Insert variable
* **Snippet**: Insert snippet
* **Glossary**: Insert glossary term
* **Emoji**: Insert emoji

### Creating FAQs templates:

1. Navigate to article in Advanced WYSIWYG editor
2. Click **Insert** icon and select **FAQs**

   Three FAQ accordion templates inserted
3. Available options in FAQ templates:

   1. Click **Settings** icon to customize
   2. Click **Expand/Collapse** icon to toggle accordions
   3. Click **Delete** icon to remove entire FAQ section
   4. Click **Add question** to insert custom FAQs

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_ScreenGif-Advanced_WYSIWYG_Editor.gif)

> **Note**:
> * FAQ templates differ from AI FAQ generator
> * See [AI FAQ generator](/help/docs/ai-faq-generator) for more information

#### Code view

* View/edit content in HTML format
* Add custom HTML elements, apply inline styles, make precise adjustments

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/image-1736939256244.png)

> **Note**:
> * Click Save button to save code view changes. Ctrl/Cmd + S doesn't work
> * Ordered/Unordered lists lose sequential ordering
> * Nested lists unsupported when:
>   + Content copied/pasted
>   + Certain migration scenarios

---

### Adding inline comments

1. Navigate to article in Knowledge base portal
2. Select text for comment - floating menu appears
3. Click **Comment icon** (💬)
4. Use formatting tools, @mention team members
5. Click **Send** icon

> **Note**:
> Turn off mode via Knowledge base portal > Documentation > Content tools > Workflow designer. Hover over status, click Edit icon, turn off Read only toggle

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/image-1736939279601.png)

**To view all comments**:

1. Navigate to article
2. Click **Comment icon** (💬) near publish button
3. Comments panel appears. Filter by: All comments, mentioned comments, open comments, resolved comments

Reply to comments here.

![6_Screenshot-View_all_the_comments_in_an_article](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/6_Screenshot-View_all_the_comments_in_an_article.png)

> **Note**: Only comment creator can edit, resolve, or delete

---

### Pasting from Microsoft Word

Choose to retain or clear formatting when pasting from Word.

1. Click **Paste with formatting** to retain Word formatting
2. Click **Paste as plain text** to clear formatting

![Copy and pasting content from Microsoft Word](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/Screenshot-copy_pasting_from_Microsoft_word.png)

---

### FAQs

#### Can I add a code block without heading?

Not possible in Advanced WYSIWYG editor. Hide name using Custom CSS in settings. Applies to all code blocks.

Use Markdown editor for code blocks without names.

#### How to add spaces in LaTex formulas?

Use `\;` between terms.

**Example**: `Area = length\;*\;width`

#### How to add numbering?

Three methods:

1. Type `1.` and press space
2. Shortcut: Ctrl + Shift + 7 or Ctrl + Shift + O
3. Format menu: Select content, choose Numbered list icon

Available numbering styles: Default, Lower Alpha, Lower Greek, Lower Roman, Upper Alpha, Upper Roman.

The platform where project members manage and create knowledge base content. Create categories, articles, templates; manage files, team accounts, readers; configure branding, domain, security.

<a id="advanced-wysiwyg-editor-basics"></a>

## Advanced WYSIWYG editor basics

**Plans supporting the use of Advanced WYSIWYG editor**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

## Keyboard shortcuts overview

To view shortcuts:

1. Navigate to article in Advanced WYSIWYG editor
2. Click **More** icon (•••) next to **Publish** button
3. Select **Keyboard shortcuts** from dropdown

#### Windows view

![image](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Keyboard_shortcuts_overview%281%29.png)

#### Mac view

![Updated_Portal_Screenshot-Mac_Keyboard_Screenshot](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Keyboard_shortcuts_overview_macos.png)

### General

| No. | Command | Windows | Mac |
| --- | --- | --- | --- |
| 1 | Copy | Ctrl + C | ⌘ + C |
| 2 | Cut | Ctrl + X | ⌘ + X |
| 3 | Paste | Ctrl + V | ⌘ + V |
| 4 | Paste as plain text | Ctrl + Shift + V | ⌘ + Shift + V |
| 5 | Undo | Ctrl + Z | ⌘ + Z |
| 6 | Redo | Ctrl + Shift + Z | ⌘ + Shift + Z |
| 7 | Add line break | Shift + Enter | Shift + Enter |
| 8 | Insert link | Ctrl + K | ⌘ + K |

### Text formatting

| No. | Command | Windows | Mac |
| --- | --- | --- | --- |
| 1 | Bold | Ctrl + B | ⌘ + B |
| 2 | Italicize | Ctrl + I | ⌘ + I |
| 3 | Underline | Ctrl + U | ⌘ + U |
| 4 | Strikethrough | Ctrl + Shift + X | ⌘ + Shift + X |
| 5 | Highlight | Ctrl + M | ⌘ + M |
| 6 | Code | Ctrl + E | ⌘ + E |

### Paragraph formatting

| No. | Command | Windows | Mac |
| --- | --- | --- | --- |
| 1 | Paragraph style | Ctrl + Alt + 0 | ⌘ + Alt + 0 |
| 2 | Heading 1 | Ctrl + Alt + 1 | ⌘ + Alt + 1 |
| 3 | Heading 2 | Ctrl + Alt + 2 | ⌘ + Alt + 2 |
| 4 | Heading 3 | Ctrl + Alt + 3 | ⌘ + Alt + 3 |
| 5 | Heading 4 | Ctrl + Alt + 4 | ⌘ + Alt + 4 |
| 6 | Heading 5 | Ctrl + Alt + 5 | ⌘ + Alt + 5 |
| 7 | Heading 6 | Ctrl + Alt + 6 | ⌘ + Alt + 6 |
| 8 | Numbered list | Ctrl + Shift + 7 | ⌘ + Shift + 7 |
| 9 | Bullet list | Ctrl + Shift + 8 | ⌘ + Shift + 8 |
| 10 | Check list | Ctrl + Shift + 9 | ⌘ + Shift + 9 |
| 11 | Blockquote | Ctrl + Shift + B | ⌘ + Shift + B |
| 12 | Left align | Ctrl + Shift + L | ⌘ + Shift + L |
| 13 | Center align | Ctrl + Shift + E | ⌘ + Shift + E |
| 14 | Right align | Ctrl + Shift + R | ⌘ + Shift + R |
| 15 | Justify | Ctrl + Shift + J | ⌘ + Shift + J |
| 16 | Code block | Ctrl + Alt + C | ⌘ + Alt + C |
| 17 | Subscript | Ctrl + , | ⌘ + , |
| 18 | Superscript | Ctrl + . | ⌘ + . |

### Text selection

| No. | Command | Windows | Mac |
| --- | --- | --- | --- |
| 1 | Complete article | Ctrl + A | ⌘ + A |
| 2 | One character left | Ctrl + ← | ⌘ + ← |
| 3 | One character right | Ctrl + → | ⌘ + → |
| 4 | One line up | Ctrl + ↑ | ⌘ + ↑ |
| 5 | One line down | Ctrl + ↓ | ⌘ + ↓ |
| 6 | Article beginning | Ctrl + Shift + Home | ⌘ + Shift + Home |
| 7 | Article end | Ctrl + Shift + End | ⌘ + Shift + End |

---

## Typography

Regular symbols/syntax and outcomes:

| No. | Name | Symbol/Syntax | Outcome |
| --- | --- | --- | --- |
| 1 | Em dash | -- | — |
| 2 | Ellipsis | ... | ... |
| 3 | Opening double quote | " | " |
| 4 | Closing double quote | " | " |
| 5 | Left arrow | <- | ← |
| 6 | Right arrow | -> | → |
| 7 | Copyright | (c) | © |
| 8 | Registered trademark | (r) | ® |
| 9 | Trademark | (tm) | ™ |
| 10 | Service mark | (sm) | ℠ |
| 11 | One half | 1/2 | ½ |
| 12 | One quarter | 1/4 | ¼ |
| 13 | Three quarters | 3/4 | ¾ |
| 14 | Plus minus | +/- | ± |
| 15 | Not equal | != | ≠ |
| 16 | Laquo | << | « |
| 17 | Raquo | >> | » |
| 18 | Multiplication | 2 \* 3 | 2×3 |
| 19 | Superscript two | ^2 | ² |
| 20 | Superscript three | ^3 | ³ |
| 21 | Indian rupee | (R) | ₹ |
| 22 | Dollar | (USD) | $ |
| 23 | Pound | (GBP) | £ |
| 24 | Australian dollar | (AUD) | A$ |
| 25 | Triple bar | === | ≡ |
| 26 | Approx | (approx) | ≈ |
| 27 | Greater than or equal | >= | ≥ |
| 28 | Less than or equal | <= | ≤ |
| 29 | Pi | (pi) | π |
| 30 | Euro | (e) | € |
| 31 | Equivalent | <==> | ⇔ |

---

## Unsupported markdown syntax

Advanced WYSIWYG editor doesn't support:

**1. Tables**  
Markdown tables don't render. Example:

```
| header | header |
| --- | --- |
| cell | cell |
| cell | cell |
```

**2. Subscript**  
Apply manually using Format tools.

**3. Superscript**  
Apply manually using Format tools.

<a id="movable-blocks-in-advanced-wysiwyg-editor"></a>

## Movable blocks

**Plans supporting movable blocks**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

### What are movable blocks?

Rearrange content sections for flexible organization.

> **Note**: Block = content section ending with line break. Next content = new block.

### Accessing movable blocks

Click arrow or drag-and-drop to position content.

1. Navigate to article in Advanced WYSIWYG editor
2. Hover over intended block
3. See settings () and ellipsis () icons on left
4. Click ellipsis () to manage position:

   * Move up: Click up arrow () to move above previous block
   * Move down: Click down arrow () to move below next block
   * Delete: Click delete () icon to remove block (next block moves up)
5. Click settings () to add new blocks:

   * **Insert block above** to place new block above selected
   * **Insert block below** to place new block below selected

> **Note**: Hold reorder icon () to drag block to desired location

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_ScreenGIF-Movable_blocks_all_in_one.gif)

> **Note**:
> * Dividers cannot be moved using Movable blocks
> * Entire FAQ section = single block. Individual FAQs within Eddy AI generated section cannot be moved

---

### FAQs

**How to move block to specific location?**

Hold ellipsis () icon to drag block.

**Can I add new blocks between existing sections?**

Yes. Hover over block, click settings (), choose **Insert block above**.

**What happens when I delete a block?**

Following block moves up. Use `Ctrl+Z` to undo deletion.

<a id="conditional-content-blocks"></a>

## Conditional content blocks

**Plans supporting Conditional content blocks**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

**Conditional content blocks** show/hide content based on predefined conditions (IP address, country, device type, reader groups, workspace, dates).

Tailor user experience for large, diverse audiences.

> **Examples**: Region-specific pricing, device-specific support information

> **Note**:
> * Available only for **KB site 2.0** projects
> * Condition-applied content not indexed by Eddy AI or search

---

## Set up conditional content blocks

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Navigating_to_the_conditional_content_panel.png)

1. Navigate to article in Advanced WYSIWYG editor
2. Hover over content block, click **Settings** () icon
3. Select **Conditional Content**

   **Conditional content** panel appears
4. Turn on **Enable** toggle

   In **Visibility** section, choose:

   * **Show**: Display content when condition met
   * **Hide**: Hide content when condition met

   > **Note**: **Show** = visible only to matching users. **Hide** = hidden from matching users
5. Use **AND** when all conditions required. Use **OR** when any condition triggers rule
6. Click **+ Add** to create condition
7. Select parameter from dropdown (country, date, device type, workspace, reader groups, IP address)
8. Enter relevant values:

| **Parameter** | **Conditions** | **Example 1** | **Example 2** |
| --- | --- | --- | --- |
| **Country** | Equals, Not equals, In, Not in | **Equals India** - only Indian readers see content | **Not in USA** - all except USA readers see content |
| **Date** | After, Before, Between | **Before October 1, 2024** - visible until date | **Between Sep 1 - Oct 1, 2024** - visible during period |
| **Device** | Equals, Not equals, In, Not in | **Equals Mobile** - mobile users only | **Not in Desktop** - hidden from desktop users |
| **Workspace** | Equals, Not equals, In, Not in | **Equals Marketing** - Marketing workspace users | **Not in Sales** - hidden from Sales workspace |
| **Reader groups** | Equals, Not equals, In, Not in | **Equals Admins** - Admin group users | **Not in Editors** - hidden from Editors |
| **IP address** | Equals, Not equals, Range, In, Not in | **Equals 192.168.1.1** - specific IP users | **Range 192.168.1.1-100** - IP range users |

> **Note**:
> * **Workspace** parameter appears only with multiple workspaces
> * **In**/**Not in** conditions allow multiple values selection

9. Click **Save for reuse** to save condition

   > **Note**: Useful for large knowledge bases with similar conditions across articles
10. Enter name for condition and click () icon
11. Click **Save** to apply condition
12. Click **Save as** to save condition for future use, enter name and click () icon
13. Click **Remove Condition** to delete
14. Click **Apply** when done

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_ScreenGIF-Performing_Conditional_content.gif)

---

### FAQs

**What are conditional content blocks?**

Display specific content only when certain conditions met (IP, country, device, reader groups, workspace, dates).

**Can I create multiple conditions per article?**

Yes, up to 25 conditions per article.

**Do conditions remain when moving article to different workspace?**

Yes, conditions move with article.

**Can I edit conditions after publishing?**

Fork published article version to modify conditions.

**If article translated, does conditional content apply to all languages?**

Yes, but different visibility rules require language-specific conditions.

**What if no conditions met?**

Content block follows default visibility rules. Visible to all unless explicitly set to **Hide**.

**If project changes from Private to Public, what happens to conditions?**

Parameters like **IP address** or **Reader groups** automatically disabled.

**What happens to conditional content when cloning article?**

All conditions copied. Edit as needed in duplicated article.

**Can I apply multiple "Or" conditions?**

Yes. Example: **Country equals India OR Country equals USA**.

**Can conditions be time-bound?**

Yes, using **Date** parameter. Example: **Date between Dec 1-10, 2024**.

**What if reader group in condition deleted?**

Condition no longer applied.

**Can I apply conditions based on user session status?**

Not directly supported at this time.

**If moving article with conditional content between workspaces, do conditions still apply?**

Yes, but verify relevance in new workspace.

**How do conditions affect articles with multiple versions?**

Conditional content settings are version-specific. Forked versions carry over conditions.

**Is there limit to conditions per block?**

Up to 25 conditions per article. Limit complex conditions for performance/clarity.

<a id="tables-in-advanced-wysiwyg-editor"></a>

## Tables

**Plans supporting Advanced WYSIWYG editor**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Tables organize and present data clearly. Compare features, list options, summarize information.

Advanced WYSIWYG editor offers powerful table formatting and management features.

This article explores table tools: create, format, manage tables.

## Creating a table

Two methods:

* **Slash (/) command**
* **Insert option** in **Format menu**

### Slash (/) command

Type `/table` anywhere in editor, hit Enter. Inserts 3×3 table with header row at cursor location.

> **Note**: Always inserts 3×3 table with header row. Add rows/columns as needed.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_GIF-Insert_table_using_slash_command.gif)

### Insert option in Format menu

1. Click **Insert** in Format menu (right side)
2. Click **Table** option
3. Select table size from grid

> **Note**: Maximum 10×10 from Format menu. Add rows/columns manually.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_GIF-Insert_table_using_format_menu.gif)

## Formatting table content

### Inserting or deleting rows/columns

Select entire row/column. Menu shows **Insert row above/below** or **Insert column left/right** options.

Delete by selecting entire row/column and clicking **Delete row/column**.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_Screenshot-Insert_row_in_tables.png)

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_Screenshot-Insert_column_in_tables.png)

### Merging cells

Select multiple cells. Click **Merge cells** in menu. Selected cells combine into one.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/5_Screenshot-Merge_cells_in_tables.png)

### Cell alignment

Select one or more cells. Menu shows **Vertical align** and **Horizontal align** options.

#### Vertical align

Align text **Top**, **Middle**, or **Bottom**.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/6_Screenshot-Vertical_alignment_in_tables.png)

#### Horizontal align

Options: **Left**, **Center**, **Right**, **Justify**.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/7_Screenshot-Horizontal_alignment_in_tables.png)

### Fit table to page width

Select table. Click **Fit to page width** in menu. Table spans full page width with evenly distributed content.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/16_Screenshot-Fit_table_to_page_width.png)

---

## Customizing table appearance

### Changing background

1. Select one or more cells
2. Click **Background color** in menu
3. Choose color from palette

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/8_Screenshot-Background_color_in_tables.png)

> **Pro Tip**: Check article preview in dark mode after background updates

### Changing border

#### Border color

1. Select one or more cells
2. Click **Border color** in menu
3. Choose color from palette

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/9_Screenshot-Border_color_in_tables.png)

#### Border style

1. Select entire table
2. Click **Border style** in menu
3. Choose: **Solid**, **Dashed**, or **Dotted**

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/10_Screenshot-Border_style_in_tables.png)

### Header rows

Top row defaults to header with grey background.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/11_Screenshot-Header_row_in_tables.png)

* Hide header: Select table, click **Hide table header**

  ![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/12_Screenshot-Hide_header_row_in_tables.png)
* Show hidden header: Select table, click **Show table header**

  ![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/13_Screenshot-Show_header_row_in_tables.png)

### Alternate row style

Choose banded rows. Row colors alternate between white and light gray.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/14_Screenshot-Banded_rows_in_tables.png)

1. Select entire table
2. Click **Alternate row style** in menu

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/15_Screenshot-Alternate_rows_in_tables.png)

> **Pro Tip**: Customize further with CSS code snippets. See [Table Style](https://docs.document360.com/docs/table-style) article.

---

### FAQs

#### How to copy entire table?

Select table, click **Copy** in menu.

#### How to delete entire table?

Click top-left corner to select table. Choose **Delete** from menu.

#### Can I use automatic numbers in table?

Numbered lists possible within cells. No automatic row numbering.

#### Can I add symbols/icons in table?

Yes. Add directly from **Format** menu or using **HTML** in **Code view**.

#### Will slash commands work inside table?

Yes, all slash commands work inside tables.

#### Can I paste tables from Microsoft Word or Excel?

Supports pasting from Word and Excel web application while retaining structure.

Desktop Excel paste not supported. Use web application for formatting retention.

<a id="image-formatting-in-the-advanced-wysiwyg-editor"></a>

## Image formatting

**Plans supporting image formatting**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Advanced WYSIWYG editor offers image formatting options unavailable in Markdown editor.

Click image to access formatting options.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-floating_menu_in_image.png)

Floating menu features for selected image:

1. **Align**

   Three alignment options:

   * **Align Left**: Left-align image
   * **Center**: Center image
   * **Align Right**: Right-align image
2. **Inline options**:

   * **Inline left**: Image left of text
   * **Inline block**: Image within text flow
   * **Inline right**: Image right of text
3. **Image caption**:

   Add caption below image for context/descriptions
4. **Alt text**:

   Written copy shown if image fails to load

   Enter alternative text and click () icon to save
5. **Hyperlink images**:

   Click link icon to add hyperlinks. Paste URL, select **Open in new tab**, click **Insert**

   After linking, three options appear:
   * **Open Link**: Opens link in new tab
   * **Edit Link**: Edits attached link
   * **Unlink**: Removes link from image
6. Click [**Advanced edit**](/help/docs/image-formatting-in-the-advanced-wysiwyg-editor#advanced-editing-options-for-images) icon for resize, crop, etc.
7. **Style**:

   Three styling options:

   * **Rounded**: Rounded rectangle corners
   * **Bordered**: Light gray border
   * **Shadow**: Drop shadow effect
8. **Resize**: Customize width/height
9. **Replace**: Switch current image using any insert method
10. **Copy**: Copy selected image for use elsewhere
11. **Delete**: Remove selected image

### Advanced editing options

![Editing images in the Advanced WYSIWYG editor](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-Editing_an_image(top_bottom).png)

### Top menu options

![Editing images in the Advanced WYSIWYG editor](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_Screenshot-top_menu_over_view.png)

1. **Zoom In/Zoom Out**: Adjust image size
2. **Hand**: Move image while editing
3. **History**: View edit history
4. **Undo**: Revert most recent action
5. **Redo**: Reapply previously undone action
6. **Reset**: Return image to original state
7. **Delete**: Remove selected edited element
8. **Delete All**: Remove all edited elements

---

### Bottom menu options

![Editing images in the Advanced WYSIWYG editor](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_Screenshot-bottom_menu_over_view.png)

1. **Resize**: Adjust width/height, lock aspect ratio. Click **Apply** when done
2. **Crop**: Choose cropping option (Custom, Square, etc.). Click **Apply**
3. **Flip**: Horizontal/vertical flip. Use **Reset** to revert
4. **Rotate**: Rotate 0°-360° (custom range available)
5. **Draw**: Add lines/shapes

   * **Free Draw**: Custom drawing
   * **Straight**: Straight lines
   * **Color**: Select drawing color
   * **Range Slider**: Adjust line thickness
6. **Shape**: Insert shapes (rectangles, circles, triangles)

   * **Fill Color**: Shape fill color
   * **Stroke**: Outline color and thickness
7. **Icon**: Add icons (arrows, location markers, polygons). Upload custom icons. Adjust color
8. **Text**: Add formatted text (bold, italic, underline, alignment, color, size)
9. **Filter**: Adjust parameters (grayscale, blur, brightness, sepia, contrast). Click **Save**

---

### FAQs

**What image formatting options are available?**

Alignment, inline display, captions, alt text, hyperlinking, advanced edit options, styling, resizing, replacing, copying, deleting.

**How to align image?**

Select image, choose left, center, or right alignment from floating menu.

**Can I add caption to image?**

Yes. Captions appear below images for context/descriptions.

**Can I hyperlink image?**

Yes. Click link icon, paste URL, choose new tab option.

<a id="tabs-in-the-advanced-wysiwyg-editor"></a>

## Tabs

**Plans supporting Tabs**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

**Tabs** organize related content within articles. Present lengthy/complex information clearly. Readers find content without scrolling.

---

## Creating tabs

### Adding tabs using Insert option

1. Open **Advanced WYSIWYG editor**
2. Access **Insert** from floating menu or slash command
3. Select **Tabs**
4. Default two-tab structure appears

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_GIF-Adding_new_tab_block.gif)

### Adding additional tabs

1. Hover over tab bar, click **+ button**
2. Enter title (50 characters max)
3. Repeat as needed

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_GIF-Adding_additional_tabs.gif)

> **Note**:
> * Minimum two tabs required
> * Maximum 10 tabs per structure

### Supported elements inside tabs

* **Text formatting**: Headings (H2-H4), bullet lists, numbered lists, checklists
* **Images and videos**: Insert, resize, manage
* **Tables**: Add, customize rows/columns
* **Hyperlinks**: Insert, format for navigation
* **Callouts and private notes**: Add for specific users
* **Code blocks and inline code**: Technical references
* **Variables and snippets**: Reuse content across tabs
* **Glossary terms**: Terms with definitions (hover/click)
* **Enhancements**: Emojis, dividers, accordions, LaTeX equations

---

## Editing tabs

### Duplicating tabs

1. Click **Edit** icon next to tab name
2. Select **Duplicate tab**
3. New tab appears with same title, content, color. Edit as needed

### Changing tab names

1. Click **Edit** icon next to tab name
2. Hover over **Change tab name**
3. Enter new name (50 characters max)

### Deleting tabs

1. Click **Edit** icon next to tab name
2. Click **Delete tab**

Deleted tabs can be restored using **Undo** (Ctrl + Z).

> **Note**: Cannot delete tabs when only two exist

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_GIF-Editing_tabs.gif)

---

## Customizing tabs

### Changing tab background and border color

1. Select tab content block
2. Click **Tab background color** or **Tab border color**
3. Use color picker: Preset colors, HEX values, RGB values

Click **Clear** to remove applied colors.

> **Note**: Color applies to entire tab content block. No individual tab coloring.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_GIF-Customizing_tabs.gif)

### Moving tabs

1. Find tab under **Tabs** section
2. Hover over six-dot drag icon (left of tab name)
3. Click, hold, move tab to desired position
4. Release to drop

#### Considerations when moving tabs

* **Scrolling**: Drag toward dark grey area near arrows to scroll hidden sections

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/5_GIF-Scrolling_while_moving_tabs.gif)

* **Moving right**: Drag until blue line appears in target position center

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/6_GIF-Moving_tabs_to_the_right.gif)

* **Moving left**: Drag until blue line appears in center of tab immediately to the left

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/7_GIF-Moving_tabs_to_the_left.gif)

* **First position**: Drag near first tab until blue line appears on top

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/8_GIF-Moving_tabs_to_the_first_position.gif)

> **Note**: Drag slowly for better control to avoid accidental replacements## Viewing tabs in the Knowledge base site

Tabs appear in the Knowledge base site exactly as configured in the editor:

* Switch between tabs without refreshing the page
* Colors, titles, and layouts match across site, widgets, and extensions
* Mobile-friendly navigation
* PDF exports show tab contents sequentially with titles as headings

---

### FAQ

#### Can I create tabs within another tab?

No. Nested tabs aren't supported.

#### Can I include tab headings in the table of contents?

No. Tab headings don't appear in the table of contents.

#### Can I add page breaks inside a tab?

No. Page breaks are disabled within tabs.

#### Can I use tabs inside other editor components?

No. Tabs can't be placed inside tables, accordions, or callouts.

<a id="categories-and-subcategories"></a>

## Categories and subcategories

Categories and subcategories organize articles by topic in Document360. They function as folders for related content.

**Example:** A category called *Shipping Information* might contain subcategories like *Domestic shipping*, *International shipping*, and *Shipping rates*.

![Document360 interface showing categories, articles, and their publication statuses](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Catagory_n_subcategory_in_portal.png)

---

### FAQs

#### What are categories and subcategories?

Organizational structures that group related articles by topic for easier navigation.

#### How do categories and subcategories differ?

Categories cover broad topics. Subcategories provide specific divisions within those topics.

#### Why use subcategories?

They segment information into focused groups, improving understanding and navigation.

**Example:** If "Cars" is a category, subcategories like "Sedan," "SUV," and "Convertible" help users find specific content.

#### Can I customize categories and subcategories?

Yes. Team accounts can create, edit, and delete categories/subcategories. Icon customization is available.

> **Note**: Read *Managing categories* for details.

#### How do categories improve usability?

Logical groupings simplify browsing and reduce time spent searching unrelated content.

#### Can one article belong to multiple categories?

Yes. Use the **Replicate** option to display an article in multiple locations.

#### What's the best practice for naming?

Use clear, descriptive names. Avoid jargon. Keep it user-friendly.

#### How should I organize categories?

Structure based on logical relationships and user needs. Broad categories with specific subcategories work best.

**Example:** Document360's own knowledge base follows the portal's menu structure.

#### Can I set different access permissions?

Yes. Role-based access control restricts specific categories/subcategories. Without explicit settings, permissions inherit from parent categories.

#### Can I reorder categories?

Yes. Use the drag-and-drop icon to reorder categories and subcategories.

#### Why isn't my category visible?

Categories disappear from the site when:

* All articles are hidden or unpublished
* The category contains no articles

**Troubleshooting steps:**

* Enable JavaScript in browser settings
* Clear browser cache and cookies
* Update browser to latest version
* Test on different browser or device

Organizes related articles under common themes.

Secondary organizational level that structures content within primary categories.

<a id="managing-categories"></a>

## Managing categories

**Supported plans:** Professional, Business, Enterprise

Categories and subcategories are the backbone of knowledge base organization. Document360 provides tools for creating, renaming, deleting, and moving them.

Management features include icon customization, cloning, reordering, and starring categories for quick access.

---

## Creating a category

Four methods available in the Knowledge base portal:

1. **Top bar Create button**
2. **Flywheel icon**
3. **More icon** in Categories & Articles section
4. **Create button** in Folder/Index type category

![Options for creating categories in workspace](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Creating_a_categories.png)

**Method 1: Top bar Create button**

1. Go to **Documentation**
2. Click **Create** dropdown → **Category**
3. Enter **Name**
4. Choose position in **Nest category under** dropdown
5. Click **Reset** for root level
6. Select **Type** (Folder, Index, Page, or GitHub)
7. Click **Create**

**Method 2: Flywheel icon**

1. Go to **Documentation**
2. Hover below desired category → click **Flywheel** icon
3. Click **Category**
4. Enter **Name**
5. Choose position in **Nest category under** dropdown
6. Click **Reset** for root level
7. Select **Type**
8. Click **Create**

**Method 3: More icon in Categories & Articles**

1. Go to **Documentation**
2. Hover over desired category → click **More** icon
3. Enter **Name**
4. Choose position in **Nest category under** dropdown
5. Click **Reset** for root level
6. Select **Type**
7. Click **Create**

**Method 4: Create button in Folder/Index category**

1. Go to **Documentation**
2. Click desired Folder/Index category
3. Click **Create** dropdown → **Sub category**
4. Enter **Name**
5. Choose position in **Nest category under** dropdown
6. Click **Reset** for root level
7. Select **Type**
8. Click **Create**

![Creating new category panel](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/10_Screenshot-Creating_a_category_panel.png)

### Subcategory levels

Maximum seven levels (1 root + 6 subcategories). Beyond this, **New category** is disabled.

![Subcategory level limits](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_Screenshot-Category_manager-Subcategory_levels.png)

> **Note**
>
> * Deep hierarchies make navigation difficult without search
> * Document360 provides tags, search, related articles, and internal linking for discoverability

> **Tip**: Use up to three subcategory levels. Two is ideal.

---

## Changing category icon

Default folder icon can be changed to emoji for better visual communication.

1. Go to **Documentation**
2. Click folder icon or emoji next to desired category
3. Select emoji from popup window

> **Note**
>
> * Click 🚫 icon to revert to folder icon
> * Emoji styles vary by browser
> * Only Folder and Index type categories support icon changes

![Changing category icons](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/6_ScreenGIF-Changing_the_Category_icons.gif)

---

## Deleting a category

Four deletion methods:

1. **More** icon in Categories & Articles section
2. **More** icon in Folder/Index category
3. Bulk delete in Folder/Index category
4. Delete specific article/subcategory in Folder/Index category

![Delete options interface](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-Deleting_Categories.png)

**Method 1: Categories & Articles section**

1. Go to **Documentation**
2. Hover over desired category
3. Click **More** icon → **Delete**
4. Confirm with **Yes**

**Method 2: Folder/Index category**

1. Go to **Documentation**
2. Open desired Folder/Index category
3. Click **More** icon → **Delete**
4. Confirm with **Yes**

**Method 3: Bulk delete**

1. Go to **Documentation**
2. Open desired Folder/Index category
3. Select checkboxes for articles/subcategories
4. Click **Delete**
5. Confirm with **Yes**

**Method 4: Specific item delete**

1. Go to **Documentation**
2. Open desired Folder/Index category
3. Hover over article/subcategory
4. Click **More** icon → **Delete**
5. Confirm with **Yes**

> **Note**: Deleting root category removes all subcategories and articles. Items stay in recycle bin for 30 days.

---

## Hiding and unhiding a category

Hide categories to restrict access to team accounts only. Hidden categories show strikethrough in Documentation window.

**Example**: Hide draft feature guides until ready for public release.

Four methods available:

1. **More** icon in Categories & Articles section
2. **More** icon in Folder/Index category
3. Bulk hide/unhide in Folder/Index category
4. Hide/unhide specific article/category in Folder/Index category

![Hide options interface](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_Screenshot-Hiding_Categories.png)

**Method 1: Categories & Articles section**

1. Go to **Documentation**
2. Hover over desired category
3. Click **More** icon → **Hide**
4. To unhide, click **Unhide** icon

**Method 2: Folder/Index category**

1. Go to **Documentation**
2. Open desired Folder/Index category
3. Click **More** icon → **Hide**
4. To unhide, click **Unhide** icon

**Method 3: Bulk hide/unhide**

1. Go to **Documentation**
2. Open desired Folder/Index category
3. Select checkboxes for articles/subcategories
4. Click **Hide**
5. To unhide, click **Unhide** icon

**Method 4: Specific item hide/unhide**

1. Go to **Documentation**
2. Open desired Folder/Index category
3. Hover over article/subcategory
4. Click **More** icon → **Hide**
5. To unhide, click **Unhide** icon

> **Note**: Hiding a category hides all its subcategories and articles.

---

## Renaming a category

Categories and subcategories can be renamed anytime.

1. Go to **Documentation**
2. Open desired category/subcategory
3. Click category name to edit

   Alternative: Hover over category in Categories & Articles → **More** icon → **Rename**
4. Enter new name → Click **Update**

> **Note**: Renaming doesn't affect the category slug.

![Renaming category](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/13_ScreenGIF-Renaming_a_category.gif)

---

## Moving a category

Move categories across workspaces. All subcategories and articles move with the parent category.

Five methods available:

1. **Drag and drop** icon in Categories & Articles section
2. **More** icon in Categories & Articles section
3. **More** icon in Folder/Index category
4. Bulk move in Folder/Index category
5. Move specific article/category in Folder/Index category

![Move options interface](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_Screenshot-Moving_a_category.png)

**Method 1: Drag and drop**

1. Go to **Documentation**
2. Hover over desired category
3. Drag and drop to new location

> **Note**: Can't move root category into its subcategory. Drag only works within same workspace.

**Methods 2-5: Using Move option**

1. Go to **Documentation**
2. Access category through desired method
3. Click **More** icon → **Move**
4. In **Move category** panel:
   * **Workspace**: Select destination workspace
   * **Category**: Select destination category
   * **Auto update referenced links**: Check to update internal links
5. Click **Move**

![Move category panel](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/11_Moving_a_category_panel.png)

---

## Cloning a category

Clone creates exact copies of content as new articles. Works within or across workspaces.

Three methods:

1. **More** icon in Categories & Articles section
2. **More** icon in Folder/Index category
3. Clone specific article/subcategory in Folder/Index category

![Clone options interface](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/5_Screenshot-Cloning_categories.png)

**All methods follow same process:**

1. Go to **Documentation**
2. Access category through desired method
3. Click **More** icon → **Clone**
4. In **Clone category** panel:
   * **Name**: Enter clone name
   * **Workspace**: Select destination workspace
   * **Category**: Select destination category
   * **Auto update referenced links**: Check to update internal links
5. Click **Clone**

![Clone category panel](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/12_Cloning_a_category_panel.png)

> **Note**: Security restrictions apply based on destination workspace/category.

---

## Starring a category

Frequently used categories can be starred for quick access. Functions like a favorites section.

> **Note**: Categories, subcategories, and articles can all be starred.

**To star:**

1. Go to **Documentation**
2. Select desired category
3. Click **Starred** icon next to title

   Alternative: Hover over subcategory in Folder/Index overview → click **Starred** icon
4. For page categories, click **Starred** icon near title

![Starring category](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/8_Screenshot-Starring_a_category.png)

**To unstar:**

**Method 1**: Direct removal
1. Navigate to category/subcategory
2. Click **Starred** icon to toggle off

**Method 2**: Remove from Starred section
1. Go to **Documentation** → **Starred**
2. Select categories to remove
3. Click **Remove from starred**

![Removing starred categories](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/9_ScreenGIF-removing_starred_categories.gif)

> **Note**: With category filter applied, article status only shows for page categories, not folders or index categories.

---

### FAQs

#### What category types can I create?

Folder, Index, Page, or GitHub.

#### Category limits?

1,000 categories per workspace.

#### Subcategory limits?

Seven levels total (1 root + 6 subcategories).

#### Title character limit?

150 characters including spaces.

#### Can I change category icons to emoji?

Yes, for Folder or Index types.

#### How to remove emoji?

Click 🚫 icon in emoji popup.

#### Do emoji styles vary?

Yes, by browser.

#### Purpose of hiding categories?

Restricts access to team accounts only.

#### How to identify hidden categories?

Strikethrough in Documentation section list.

#### Hide multiple subcategories?

Yes, select multiple in Folder/Index categories → click **Hide**.

#### Hide published categories?

Yes, available even after publication.

> **Note**: Hiding affects all subcategories and articles.

#### Move categories across workspaces?

Yes.

#### Does moving include subcategories/articles?

Yes, they move with the parent.

#### Move root into subcategory?

No.

#### Security restrictions when moving?

Yes, based on destination workspace/category.

#### What are cloned categories?

Exact content copies created as new articles.

#### Clone across workspaces?

Yes.

#### Create new content in cloned category?

Yes.

#### Change cloned category type?

Yes.

#### Purpose of starring?

Quick access to frequently used items.

#### Remove multiple starred items?

Yes, from Starred page.

#### Recycle bin retention?

30 days.

#### Renaming updates slug?

No, manual update required.

#### Best practices for naming?

Clear, consistent, user-focused, logical hierarchy, avoid repetition and abbreviations.

<a id="category-types"></a>

## Category types

**Supported plans:** Professional, Business, Enterprise

Categories organize related articles. Three main types available.

---

## Types of categories

**1. Folder**  
**2. Index**  
**3. Page**

> **Note**: Choose type during creation. Switch anytime as needed.

---

**Choosing category type during creation**

1. Navigate to desired category
2. Click **More** icon → **Add sub category**
3. Select category type
4. Click **Create**

![Choosing category type](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_ScrenGIF-New_Choosing_a_category_type_during_category_creation.gif)

---

### 1. Folder

Primary category type. Simple container for articles and subcategories.

* Customizable icons
* No separate URL/view
* Bulk operations supported: Hide, Unhide, Delete, Move, Star

**Knowledge base portal view**  
![Folder category portal view](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-New_Knowledge_base_portal_view_%20for_folder_category_type.png)

### 2. Index

Article index with dedicated URL.

**Portal view**: Shows articles with title, contributors, update date, status, tags.

1. **Unique slug**: Shareable URL with redirection support
2. **Bulk operations**: Hide, Unhide, Delete, Move, Star

![Index category portal view](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_Screenshot-New_Knowledge_base_portal_view_%20for_index_category_type.png)

**Site view**: Shows category title and article/subcategory count.

![Index category site view](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_Screenshot-New_Knowledge_base_site_view_%20for_index_category_type.png)

### 3. Page

Functions like regular articles. Full editor capabilities.

* Create content using Markdown, WYSIWYG, or Advanced WYSIWYG
* Publish and manage like standard articles
* Customizable title and slug

**Portal view**  
![Page category portal view](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/5_Screenshot-New_Knowledge_base_portal_view_%20for_page_category_type.png)

**Site view**  
![Page category site view](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/6_Screenshot-New_Knowledge_base_site_view_%20for_page_category_type.png)

---

### FAQ

**Available category types?**

Folder, Index, Page.

**Change category type after creation?**

Yes, anytime.

**Change type process?**

1. Navigate to category
2. Click **More** icon → **Change type**
3. Select new type → **Update**

**Purpose of Index category?**

Provides article index with shareable URL.

**Switching Page to Index erases content?**

No, content remains intact.

**Folder category URLs?**

No separate URL/view.

**Operations in Folder categories?**

Bulk Hide, Unhide, Delete, Move, Star.

**Difference between article and Page category?**

Page categories can contain additional categories/articles.

<a id="assigning-drive-folder-for-a-category"></a>

## Mapping categories to Drive folders

**Supported plans:** Professional, Business, Enterprise

---

## Drive folder mapping

Images uploaded from local storage or URL automatically save to designated Drive folder for article's category/subcategory.

---

## Associating Drive folder to category

1. Go to **Documentation**
2. Hover over desired category → click **More** icon
3. Click **Set drive folder**

   **Set drive folder** panel appears.
4. Select Drive folder/subfolder
5. Click **Update**

Folder now mapped to category/subcategory.

![Mapping category to Drive folder](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/Screenshot-Updated_mapping_category_with_drive_folder.gif)

---

### FAQ

**Map subcategories to Drive folders?**

Yes, available for all categories/subcategories.

**Difference from Editor folder?**

Mapped Drive folder takes precedence. Without mapping, images save to Editor folder.

**Article-level Drive mapping?**

No, only available for categories/subcategories.

**Change/remove Drive mapping?**

Yes, anytime. Previous images remain in original folder.

**Subcategory vs parent category mapping?**

Immediate mapping takes precedence. Subcategory mapping overrides parent.

> **Preference order:**
>
> 1. Subcategory Drive mapping
> 2. Parent category Drive mapping
> 3. Editor folder

<a id="downloading-category-and-article-in-kb-site"></a>

## Downloading categories and articles

**Supported plans:** Professional, Business, Enterprise

Generate PDF exports of entire categories/articles with customizable templates.

> **Note**: Exclusive to private projects and private workspaces in mixed projects (KB site 2.0).

---

## Enabling PDF download

1. Go to **Settings** → **Knowledge base site** → **Article settings & SEO** → **Article settings**
2. Enable **Show download as PDF button**
3. Check **Allow PDF template selection during export**

> **Note**: To manage templates, go to **Documentation** → **Content tools** → **Export to PDF** → **PDF template** section.

![Enabling PDF download button](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Settingup_Knowledge_base_portal_new.png)

---

## Downloading process

1. Navigate to category → click **More** icon in category manager
2. Click **Export PDF**
3. In **Export Articles** panel:
   * Select subcategories/articles
   * Choose template from dropdown (default if none selected)
4. Click **Export PDF**

> **Note**
>
> * Site customizations don't appear in downloaded PDF
> * Mixed projects: Private categories in public workspaces can't be exported

![Downloading PDF from KB site](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-Downloading_PDf_on_KB_site.gif)

---

## PDF download links

* Single article: Instant download
* Multiple articles: Email link sent
* Link expires: 48 hours

![PDF download notification](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/image(150).png)

---

### FAQ

**Exceed 500 MB daily limit?**

Downloads complete but further exports blocked for 24 hours. Purchase **KB PDF download quota** add-ons for more capacity.

**Increase download capacity?**

Purchase **KB PDF download quota** add-ons from billing section.

<a id="managing-articles"></a>

## Managing articles

**Supported plans:** Professional, Business, Enterprise

Articles are knowledge base building blocks. Document360 provides tools for efficient creation, editing, and organization.

---

## Creating articles

Information grouped into user-defined categories. Create from scratch, template, or import.

> **Article limits by plan:**
>
> * Professional: 5,000 articles/workspace
> * Business: 5,000 articles/workspace
> * Enterprise: 10,000 articles/workspace
>
> Contact support@document360.com for higher limits.

Four creation methods:

1. **Top bar Create button**
2. **Flywheel** icon
3. **More** icon in Categories & Articles section
4. **Create** button in Folder/Index category

![Article creation methods](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Creating_a_new_article.png)

**All methods follow similar process:**

1. Go to **Documentation**
2. Access creation method
3. Enter article **Name**
4. Select **Category**
5. Click **Create**

![New article panel](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-Creating_a_new_article_panel.png)

---

## Creating article templates

Save any article as reusable template. New articles inherit properties and formatting.

**Example**: Standard troubleshooting format saves time and ensures consistency.

Three creation methods:

1. **Flywheel** icon
2. **More** option
3. **Top bar Create** button

![Article from template methods](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_Screenshot-Article_from_template_methods.png)

**Process for all methods:**

1. Go to **Documentation**
2. Access template creation method
3. Select **Article from template**
4. Choose template from list (preview available)
5. Enter article name → select category
6. Click **Create**

   Name and slug auto-populate from template title.

![Article from template panel](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_Screenshot-Article_from_template_panel.png)

> **Note**: Manage templates via **Templates overview** page. See *Templates* article for details.

---

## Editing articles

Essential for maintaining current, accurate content.

**Publishing changes:**
1. Article appears on KB site
2. Status changes from **Draft** to **Published**

Published articles show live version, not editing pane.

**Edit process:**
1. Go to article → click **Edit** button
2. **Article status** changes to **Draft**
3. Make changes
4. Click **Publish** to update site version

![Editing article interface](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/5_Screenshot-Editing_an_Article.png)

### Markdown view

View Markdown formatting without creating new version:

1. Open published article in Markdown editor
2. Click **More** → **View markdown**
3. Click **Close markdown** when done

![Markdown view](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/6_ScreenGIF-Markdown_view_of_a_published_article.gif)

---

## Locking articles

Automatic locking prevents conflicting edits during collaboration.

**Unlocking occurs when:**
* No activity for 15 minutes
* Click **Lock** icon → **Unlock**
* Navigate away from article

![Locking article](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/14_ScreenGIF-Locking_an_Article.gif)

---

## Deleting articles

Five deletion methods:

1. **More** icon in Categories & Articles section
2. **More** icon in article
3. Bulk delete in Folder/Index category
4. Delete specific article in Folder/Index category
5. Bulk delete in **All articles** section

![Article deletion methods](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/7_ScreenGIF-Deleting_an_article_methods.gif)

**All methods require confirmation:**
1. Go to **Documentation**
2. Access deletion method
3. Click **More** icon → **Delete**
4. Confirm with **Yes**

> **Note**: See *All articles* article for details.

---

## Hiding articles

Hide articles to restrict access to team accounts.

**Example**: Sales pricing documents hidden from public view.

Four methods:

1. **More** icon in Categories & Articles section
2. Bulk hide in Folder/Index category
3. Hide specific article in Folder/Index category
4. Bulk hide in **All articles** section

![Hiding articles](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/8_ScreenGIF-Hiding_Unhiding_the_articles.gif)

**Process:**
1. Go to **Documentation**
2. Access desired method
3. Click **More** icon → **Hide**
4. To unhide, click **Unhide** or **Show** icon

> **Note**: See *All articles* article for details.

---

## Renaming articles

1. Go to **Documentation**
2. Open article → click name to edit

   Alternative: Hover over article in Categories & Articles → **More** icon → **Rename**
3. Enter new name → click **Update**
4. If published, confirm in **Article details confirmation** panel

![Renaming article](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/13_ScreenGIF-Renaming_an_Article_update.gif)

---

## Moving articles

Move articles across workspaces. Five methods available:

1. **Drag and drop** in Categories & Articles section
2. **More** icon in Categories & Articles section
3. Bulk move in Folder/Index category
4. Move specific article in Folder/Index category
5. Bulk move in **All articles** section

![Moving articles](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/10_ScreenGIF-Moving_an_Article.gif)

**Process:**
1. Go to **Documentation**
2. Access desired method
3. Click **More** icon → **Move**
4. In **Move article** panel:
   * Select **Workspace**
   * Select **Category**
   * Check **Auto update referenced links**
5. Click **Move**

> **Note**: Security restrictions apply to destination workspace/category.

---

## Replicating articles

Display single article across multiple categories.

1. Go to **Documentation**
2. Hover over article → click **More** icon
3. Select **Replicate**
4. Choose destination category → click **Replicate**

Article appears in selected location. Edit only the source article.

> **Note**
>
> * Security restrictions apply to destination category
> * Replicated articles have limited editing options

![Replicating articles](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/11_Screenshot-Replicating_an_article.png)

---

## Cloning articles

Create exact content copies as new articles. Works within or across workspaces.

Two methods:

1. **More** icon in Categories & Articles section
2. **More** icon in Folder/Index category

![Cloning articles](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/12_Screenshot-Cloning_an_Article.png)

**Process:**
1. Go to **Documentation**
2. Hover over article → click **More** icon
3. Select **Clone**
4. In **Clone article** panel:
   * Enter **Name**
   * Select **Workspace**
   * Select **Category**
   * Check **Auto update referenced links**
5. Click **Clone**

> **Note**: Security restrictions apply to destination workspace/category.## Embedding Google Forms in articles

Add Google Forms directly into your articles using HTML embed code. Works in Markdown and Advanced WYSIWYG editors.

**Process:**
1. Open your Google Form
2. Click **Send** () in the top right
3. Go to **Embed** tab
4. Copy the embed code
5. Paste into your article using one of these methods:

**Markdown editor:**
* Use indent method (4+ spaces)
* Paste embed code directly

**Advanced WYSIWYG editor:**
* Switch to **Code View** () → paste embed code
* Or use **Insert** () > **Embed** > paste code

> **Note**: Google Forms embedding requires the form to be publicly accessible or shared with specific users.

![Embedding Google Forms in articles](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot_Embedding_google_forms.png)## Embedding Google Forms in articles

1. Go to [Google Forms](https://docs.google.com/forms/u/0/) and log in with your Google account.
2. Create a new form or select an existing one.
3. Choose the form you want to embed.
4. Click **Send** in the top right corner.
5. Select the **<>** tab to get the embed code.
6. Click **Copy** to copy the iframe code.
7. Return to your article in the Knowledge base portal.
8. In the **Markdown** editor, paste the iframe code directly.
9. In the **Advanced WYSIWYG** editor, click **Code view** and paste the iframe code.
10. The form will appear in your article.

After publishing, readers can interact with the form for surveys, feedback, or data entry.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Embedded_form_in_Advanced_WYSIWYG_editor.gif)

**Knowledge base site view**

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-Embedded_form_Knowledge_base_site.png)

---

### FAQs

**How do I embed a Google Form in my Knowledge base article?**

Use the Embed HTML code block in your article.

**What steps are needed to embed a Google Form?**

Create or select a form, copy the embed code, and paste it into your article.

**Can readers interact with embedded Google Forms?**

Yes, they can fill out and submit forms for data entry, surveys, or feedback.

<a id="embedding-a-drawio-diagram"></a>

## Embedding Draw.io diagrams

**Plans supporting Draw.io diagram embedding**

| Professional | Business | Enterprise |
| --- | --- | --- |
| ✓ | ✓ | ✓ |

**Diagrams.net** (Draw.io) is a web-based open-source diagramming tool for creating flowcharts, UML diagrams, entity relationships, network diagrams, and mockups.

> NOTE: All references to Diagrams.net or Draw.io refer to the same tool.

Diagrams.net uses Google Drive for storage. You can embed Diagrams.net images in Document360 using HTML and an autogenerated link from the app.

> NOTE: Diagrams stored on Google Drive, Dropbox, etc. are private by default. Make them public before embedding.

---

## Method 1: Using the embed option

1. Go to [Diagrams.net](https://www.drawio.com/).
2. Click **File** > **Embed** > **Image**.
3. Click **Embed**.
4. Click **Copy** to copy the image tag.
5. Return to the Knowledge base portal.
6. In the **Markdown** editor, paste the code directly.
7. In the **Advanced WYSIWYG** editor, click **Code view** and paste the code.

> NOTE: Adjust the diagram's height and width as needed.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Using_the_embed_option_Draw_io.gif)

---

## Method 2: Exporting as an image

1. Go to [Diagrams.net](https://www.drawio.com/).
2. Click **File** > **Export as** and choose your image format.
3. Click **Export**.
4. Enter a file name and save to your preferred location (Google Drive, OneDrive, Dropbox, GitHub, GitLab, or device).
5. Click **Download**.
6. Return to your Document360 article.
7. Click **Insert image** and select **From Upload/URL**.
8. Choose your image and click **Insert**.

> NOTE: See [adding images to articles](/help/docs/adding-images-to-articles) for more details.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-Embedding_Draw_io_via_image_Export.png)

---

### FAQs

**Can I embed Draw.io diagrams in Document360?**

Yes, using HTML and an autogenerated link from Diagrams.net.

<a id="all-articles-overview-page"></a>

## All articles overview

**Plans supporting bulk operations**

| Professional | Business | Enterprise |
| --- | --- | --- |
| ✓ | ✓ | ✓ |

The **All articles** feature lets you perform bulk actions on multiple articles and page categories simultaneously. Available actions include publishing, previewing, copying links, hiding, moving, deleting, setting review reminders, checking live status, creating tags, machine translation, downloading as PDF, and deprecating articles.

For example, publish ten articles and two page categories simultaneously for a product launch by selecting them on the **All articles** page and clicking **Publish**.

> NOTE: The **All articles** page displays all articles and page categories.

---

## Managing multiple articles

1. Go to **Documentation** > **All articles**.
2. Use the dropdown to navigate between workspaces and languages.
3. Filter articles by status using the **All articles** dropdown.
4. Click **Export** to download the article list as CSV.
5. Use **Filter** to narrow results by Status, Date, or Tags. See [Using filter in All articles page](/help/docs/filter-bulk-operations).
6. Select articles to perform bulk operations:

   - **Publish**: Publish selected new or draft articles
   - **Publish later**: Schedule selected new or draft articles
   - **View preview/View in KB**: Preview new/draft articles or view published articles
   - **Copy link**: Copy links for selected articles
   - **Hide**: Hide selected articles from the Knowledge base site
   - **Move to**: Move selected articles to different categories or workspaces
   - **Delete**: Delete selected articles (sent to recycle bin for 30 days)
   - **Review reminder**: Set review reminders for selected articles
   - **Live article status**: Define status for selected articles
   - **Add tags**: Create and assign tags to selected articles
   - **Add labels**: Create and assign labels to selected articles
   - **Machine translate**: Automatically translate selected articles
   - **Download as PDF**: Download selected articles as combined PDF
   - **Deprecate**: Mark selected articles as deprecated

> NOTE: If a page category contains articles and subcategories, you cannot hide, move, or delete it. These options work only for categories without sub-articles.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-All_articles_Overview_page(1).png)

---

### FAQs

**Can I publish multiple articles at once?**

Yes, select articles on the **All articles** page and click **Publish**.

**Can I hide multiple articles simultaneously?**

Yes, select articles and use the **Hide** option.

**How does this feature improve efficiency?**

Bulk actions eliminate the need to perform operations individually.

**Can I reuse custom filters?**

Yes, save and reuse custom filters as needed.

**Can I change published articles to draft in bulk?**

No, but you can manually change each article's status individually.

<a id="filter-bulk-operations"></a>

## Using filters in All articles

**Plans supporting bulk operations**

| Professional | Business | Enterprise |
| --- | --- | --- |
| ✓ | ✓ | ✓ |

---

## Available filters

1. Go to **Documentation** > **All articles**.
2. Navigate workspaces and languages using the top dropdown.
3. Filter articles by status using the **All articles** dropdown.
4. Use basic or custom filters to narrow results.

Applied filters appear at the top and include:

1. Status
2. Review reminder
3. Starred
4. Visibility
5. Read receipt
6. Contributor
7. Category
8. Date
9. Tags
10. Labels

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-FIlters_in_All_Articles.png)

---

### Filter options

**Status**
- **All**: All articles regardless of status
- **Published**: Published articles
- **Scheduled**: Scheduled articles
- **Draft**: Draft articles
- **New article**: New articles
- **Broken links**: Articles with broken links (based on recent validation)
- **Deprecated**: Deprecated articles

**Review reminder**
- **All**: All articles
- **Fresh**: Articles without "Needs review" status
- **Stale**: Articles with "Needs review" status

**Starred**
- **All**: All articles
- **Starred**: Starred articles
- **Not starred**: Non-starred articles

**Visibility**
- **All**: All articles
- **Visible**: Articles visible on the Knowledge base site
- **Hidden**: Articles not visible on the site (strikethrough in portal)

**Read receipt**
- **All**: All articles
- **Enabled**: Articles with read receipt enabled
- **Disabled**: Articles with read receipt disabled

> NOTE: Read receipt is available only for Private and Mixed projects in KB site 2.0.

**Contributor**: Search and select team members.

**Category**: Filter by category or subcategory.

> NOTE: Category selection shows only articles under that category. Select subcategory articles manually.

**Date**: Filter by last updated date using presets or custom dates.

**Tags**: Search and select specific tags.

**Labels**: Search and select specific labels.

---

## Custom filters

Save custom filters for reuse.

> Example: Create a filter for team members with specific date ranges and status indicators.

Access saved filters using the arrow next to the **Filter** button.

---

### Saving custom filters

1. Go to **Documentation** > **All articles**.
2. Select filters and click **Apply**.
3. Click **Save filter**.
4. Enter a filter name (max 30 characters).
5. Enable **Share filter with team members** to make it available to others.
6. Click **Save**.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-Saving_a_Custom_filter.png)

---

### Deleting custom filters

1. Click the arrow next to **Filter**.
2. Hover over the filter and click **Delete**.
3. Confirm by clicking **Yes**.

> NOTE: Custom filters cannot be edited after saving. Deletion is permanent.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_Screenshot-Deleting_a_custom_filter(1).png)

---

## Clearing filters

Three methods to clear filters:

1. Click **Clear all** at the top
2. Use the **Filter** dropdown and click **Clear**
3. Click **X** next to individual filters

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_Screenshot-Clear_filters_in_All_articles_page.png)

---

### FAQs

**What filters are available?**

Status, Review reminder, Starred, Visibility, Read receipt, Contributor, Category, Date, Tags, and Labels.

**Can I save custom filters?**

Yes, for future reuse.

**How do I clear all filters?**

Click **Clear all** or use the Filter dropdown.

**Why isn't Read receipt available?**

It's only available for Private and Mixed projects in KB site 2.0.

<a id="export-bulk-operations"></a>

## Export article list

**Plans supporting export functionality**

| Professional | Business | Enterprise |
| --- | --- | --- |
| ✓ | ✓ | ✓ |

Export articles and their status as CSV files. Filter fields before exporting.

> Example: Export published articles from a specific contributor over the last month.

---

## Export process

1. Go to **Documentation** > **All articles**.
2. Navigate workspaces and languages using the top dropdown.
3. Filter articles by status if needed.
4. Apply additional filters (Status, Review reminder, Starred, Visibility, Contributor, Category, Date, Tags, Labels).
5. Click **Export**.

The file downloads in CSV format with:

- Article title
- Category title
- Article status
- Date
- Portal URLs
- Site URLs

> NOTE: View the CSV file in Excel, Open Office, Google Sheets, Notepad, or any CSV-compatible application.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_ScreenShot-Export_articles.png)

---

### FAQs

**How do I get article titles and URLs?**

Use the [API endpoint to get all article lists](https://apidocs.document360.com/apidocs/project-version-articles).

1. Enter required details in the API request
2. Execute the query

Find the Project Version ID using the [Get Project Versions endpoint](https://apidocs.document360.com/apidocs/get-project-versions).

**How do I export draft articles?**

You cannot export draft articles individually. Export the entire category containing them:

1. Go to **Documentation** > **All articles**
2. Filter by **Draft** status
3. Use the **Category** filter to select the category
4. Click **Export**

<a id="review-reminders"></a>

## Article review reminders

**Plans supporting review reminders**

| Professional | Business | Enterprise |
| --- | --- | --- |
| ✓ | ✓ | ✓ |

Review reminders alert team members when articles need review, keeping content accurate and up-to-date.

---

## Setting individual review reminders

1. Open the desired article.
2. Click the **More** (•••) icon > **More article options**.
3. Select the **Review reminder** tab.
4. Choose a reminder date: Now, 30 days, 3 months, or Custom date.
5. Enter a review reason (optional, max 100 characters).
6. Click **Save**.

A **Needs review** tag appears next to the article slug. Hover to see the review reason.

![Creating review reminder](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Review_reminder_in_more_options.png)

---

## Clearing review reminders

1. Open the article.
2. Click the **Needs review** tag.
3. Click **Mark as reviewed**.

The tag disappears and the article reverts to its previous status.

![Clearing review reminder](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_ScreenGIF-clearing_review_reminder.gif)

---

## Bulk review operations

### Method 1: All articles page

1. Go to **Documentation** > **All articles**.
2. Filter by **Review reminder** > **Stale**.
3. Select articles.
4. Click **Mark as Reviewed**.
5. To mark articles as **Needs review**, select them, click **Review reminder**, and choose reminder days.

![Bulk review reminders](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_ScreenGIF-Marking_multiple_articles_in_all_articles.gif)

---

### Method 2: Content tools

1. Go to **Documentation** > **Content tools** > **Documentation** > **Article review reminders**.
2. Click **Create review reminder**.
3. Enter reminder name, set frequency, and add reviewers.
4. Click **Next**.
5. Select workspace and language.
6. Choose articles and click **Set reminder**.

> NOTE: Use filters to find articles by category, contributor, tags, and date.

![Content tools review](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_ScreenGIF-Articles_review_reminder_in_content_tools.gif)

---

### FAQs

**How do I set review reminders for all articles?**

Go to **Documentation** > **Content tools** > **Documentation** > **Article review reminders**.

<a id="article-seo"></a>

## Article SEO

**Plans supporting SEO settings**

| Professional | Business | Enterprise |
| --- | --- | --- |
| ✓ | ✓ | ✓ |

SEO helps your articles gain visibility and reach target audiences effectively.

---

## Adding SEO metadata

1. Open the desired article.
2. Click **More** (•••) > **SEO**.
3. Go to the **SEO** tab.
4. Optionally select **Exclude from external search engine results**.
5. Enter the **Meta title**.

> NOTE: Keep meta titles between 5-60 characters for optimal visibility.

6. Edit the slug if needed.
7. Enter the **Description**.

Keep descriptions compelling, informative, and within 150-160 characters.

8. Use **Ask Eddy AI** to generate SEO descriptions.

![SEO settings](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Excluding_articles_from_External_search_engines.png)

> NOTE: Generate SEO descriptions for multiple articles via **Documentation** > **Content tools** > **Documentation** > **SEO description**.

---

## Editing meta titles

Meta titles define webpage titles, affect SEO rankings, and appear in search results and browser tabs.

1. Open the desired article.
2. Click **More** (•••) > **SEO**.
3. Edit the **Meta title** field.
4. Click **Save**.

The updated title appears on the Knowledge base site.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Editing_Meta_title.gif)

---

### FAQs

**Does updating SEO description in one language affect others?**

No, you must update each language manually.

**Why is AI SEO description generator disabled?**

Articles need at least 200 words.

**Why doesn't the article name update after renaming?**

Change the SEO meta title:

1. Click **More** (•••) > **SEO**
2. Update meta title and save

<a id="excluding-articles-from-searches"></a>

## Excluding articles from search engines

**Plans supporting search exclusion**

| Professional | Business | Enterprise |
| --- | --- | --- |
| ✓ | ✓ | ✓ |

Exclude articles from search engine results to maintain content confidentiality.

---

## Excluding from external search engines

1. Open the article or page category.
2. Click **More** (•••).
3. Select **SEO**.
4. Check **Exclude from external search engine results**.
5. Click **Save**.

![External search exclusion](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Excluding_articles_from_External_search_engines.png)

---

## Excluding from internal searches

> NOTE: AI search suite is available for Business and Enterprise plans (new pricing). Legacy users need Eddy AI assistive search add-on for exclusion toggle.

1. Open the article or category page.
2. Click **More** (•••) > **More article options**.
3. Go to **Search Visibility** section.
4. Select options:
   - **Exclude from knowledge base search**: Hides from site search
   - **Exclude from Eddy AI assistive search**: Hides from AI search
5. Click **Save**.

![Internal search exclusion](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-Excluding_articles_from_Eddy_AI_assistive_and_Search_engines.png)

> NOTE: Articles remain accessible via URL or navigation menu even when excluded from searches.

---

### FAQs

**What happens to cloned articles?**

Search visibility settings copy to cloned articles.

**What about hidden articles?**

Hidden articles are automatically excluded from all searches.

<a id="changing-the-url-of-an-article"></a>

## Changing article URLs

**Plans supporting URL changes**

| Professional | Business | Enterprise |
| --- | --- | --- |
| ✓ | ✓ | ✓ |

By default, articles convert titles to slugs for URLs.

Example: "This is a really good content" becomes `docs.yourcompany.com/[project version]/docs/this-is-really-good-content`.

> NOTE: Changing article titles doesn't automatically update slugs.

---

## Method 1: Article settings

1. Open the desired article.
2. Click **More** (•••) > **More article options**.
3. Go to **SEO** tab.
4. Update the slug field.
5. Click **Save**.

> NOTE: Apply redirection rules for new slugs. See [Article redirect rules](/help/docs/article-redirect-rules).

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Changing_theURL_for_an_Article.png)

---

## Method 2: Editor slug field

1. Open the article.
2. Click the slug field next to the article status badge.

![Slug editor](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/article%20slug%202.png)

3. Update the URL slug.
4. Click **Update**.
5. Confirm redirection in the prompt.
6. Deselect checkbox to skip redirect rules.

> NOTE: Redirect rules are optional but recommended to avoid broken links.

---

### FAQs

**What's the default URL format?**

Based on article titles converted to slugs.

**Does title changes update slugs?**

No, slugs must be updated manually.

**Should I apply redirect rules?**

Recommended to maintain link functionality.

**Why use special characters in URLs?**

They make URLs more intuitive, language-specific, and SEO-friendly for German and other languages with umlauts.

**Why do special character URLs break?**

Special characters require percent-encoding. Copy URLs directly from the portal, not browser address bars.

**Can I use numbers in URLs?**

Yes, update slugs to numeric values following the same process.

<a id="article-tags"></a>

## Article tags

**Plans supporting tags**

| Professional | Business | Enterprise |
| --- | --- | --- |
| ✓ | ✓ | ✓ |

Article tags are keywords users might search for in your Knowledge base. Team members can use tags to search, filter, sort, and perform bulk operations.

> NOTE: Manage all tags via the **Tags** page. Same tags apply to articles, categories, and Drive files.

---

## Adding tags

1. Open the article.
2. Click **More** (•••) > **Tags**.
3. Create new tags or select existing ones.
4. Use **Ask Eddy AI** for AI-suggested tags (requires 200+ words).

> NOTE: AI tag generation requires 200+ words.

5. Click **Save**.
6. Click **Publish** > **Configure article settings**.
7. Add or remove tags as needed.
8. Click **Yes** to publish.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_ScreenGIF-Adding_tags_in_the_articles.gif)

---

## Tag guidelines

1. Maximum 30 characters including spaces
2. Allowed characters:
   - Upper and lowercase letters (multi-language)
   - Numbers
   - Spaces
   - Special characters: **\_ + - @ # % ^ & ! ()**
3. Forbidden characters: **\ / : \* ? " < > |**

---

## Tags on Knowledge base site

Published tags appear on the site. Readers can click tags to see all associated articles and categories.

![Tags reader view](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/Tags%20readers%20POV.png)

![Tags reader view 2](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/tags%20readers%20pov%202.png)

<a id="adding-article-labels"></a>

## Article labels

**Plans supporting labels**

| Professional | Business | Enterprise |
| --- | --- | --- |
| ✓ | ✓ | ✓ |

Labels streamline internal content management. Use them to sort, filter, and categorize articles efficiently.

Example: Filter release notes for updates using label filters in **All articles**.

> NOTE: Labels are internal only and supported across all plans.

---

## Adding labels - Method 1: Article editor

1. Open the article.
2. Click **More** (•••) > **Labels**.
3. Enter label name and press **Enter**.
4. Or select existing labels from dropdown.
5. Click **Add**.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_ScreenGIF-Adding_labels_in_the_article_editor.gif)

---

## Adding labels - Method 2: All articles section

1. Go to **Documentation** > **All articles**.
2. Select articles > **More** (•••) > **Add labels**.
3. Enter label name and press **Enter**.
4. Or select existing labels.
5. Click **Add**.
6. Use **Filter** > **Labels** to sort articles.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_ScreenGIF-Adding_labels_in_the_All_articles_section.gif)

---

## Adding labels - Method 3: Workflow assignments

1. Go to **Documentation** > **Workflow assignments**.
2. Select articles and click **Add labels**.
3. Enter label name and press **Enter**.
4. Use **Labels** filter to narrow results.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_ScreenGIF-Adding_labels_in_workflow_assignment.gif)

---

## Adding labels - Method 4: Starred section

1. Go to **Documentation** > **Starred**.
2. Select articles and click **Add labels**.
3. Enter label name and press **Enter**.
4. For individual articles, hover > **More** (•••) > **Add labels**.
5. Click **Add**.
6. Use **Labels** filter to narrow results.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_ScreenGIF-Adding_labels_in_Starred_articles.gif)

---

## Adding labels - Method 5: Category pages

1. Open the desired category.
2. Hover over articles > **More** (•••) > **Add labels**.
3. Or select multiple articles > **Add labels**.
4. Enter label name and press **Enter**.
5. Click **Add**.

![Category labels](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/5_ScreenGIF_Adding_labels_from_category.gif)

---

### FAQs

**How many labels per project?**

Up to 10,000 labels.

**How many labels per article?**

Up to 10 labels.

**Can I reuse labels?**

Yes, across multiple articles.

**What's the difference between tags and labels?**

Tags appear on both portal and site for user navigation. Labels are internal only for team organization.

**Can I search articles by labels?**

No direct search, but you can filter by labels in **All articles**.

**Can I label images and videos?**

No, labels work only for articles.

**Do labels appear on the site?**

No, they're internal portal features.

<a id="related-articles"></a>

## Related articles

**Plans supporting related articles**

| Professional | Business | Enterprise |
| --- | --- | --- |
| ✓ | ✓ | ✓ |

Related articles help readers navigate between connected content. They appear at the bottom of articles on the Knowledge base site.

> NOTE:
> - Only published articles can be related
> - Related articles appear only on the site, not in widgets

---

## Adding related articles

1. Go to **Documentation** and open any article.
2. Click **More** (•••) > **Related articles**.
3. Search for articles using keywords.
4. Click **X** to clear search terms.
5. Click **+** next to articles to add them.
6. Added articles appear under **Added articles**.
7. Click **X** to remove articles.
8. Click **Save**.

You can also add related articles during publishing:

1. Click **Publish**.
2. Expand **Configure article settings**.
3. Find **Related articles** section.
4. Click **Yes** to save and publish.

---

## Eddy AI recommendations

1. Click **Ask Eddy** for AI-suggested related articles.

> NOTE: AI recommendations require 50+ words.

2. Suggestions appear under **Suggested articles from Eddy AI**.
3. Click **+** to add articles to related list.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_ScreenGif-Related_articles.gif)

> NOTE: After purchasing Eddy AI, use **Ask Eddy AI** button below search bar for [AI-powered recommendations](/help/docs/ai-related-articles-recommender).

---

## Auto relate feature

Enable **Auto relate this article to all related articles** in **Article settings** to automatically link articles.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_ScreenShot-Related_articles.png)

---

### FAQs

**What if readers can't access related articles?**

Only accessible articles appear in the related section.

<a id="featured-image"></a>

## Featured images

**Plans supporting featured images**

| Professional | Business | Enterprise |
| --- | --- | --- |
| ✓ | ✓ | ✓ |

Featured images are thumbnails used primarily for SEO and link previews when sharing articles externally.

---

## Adding featured images

1. Open any article.
2. Click **More** (•••) > **More article options**.
3. Select **Featured image** tab.
4. Click **Upload an image**.
5. Select image from Drive and click **Save**.

> NOTE: Image recommendations:
> - **Size**: 1200x800 to 2000x1200 pixels
> - **Format**: High-quality JPEG or PNG

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_ScreenGIF-Adding_Feature_Image_in_Articles.gif)

<a id="attachments"></a>

## Attachments

**Plans supporting attachments**

| Professional | Business | Enterprise |
| --- | --- | --- |
| ✓ | ✓ | ✓ |

---

## Adding attachments

1. Open any article.
2. Click **More** (•••) > **More article options**.
3. Select **Attachments** tab.
4. Add external file URLs or click **Upload an attachment** for Drive files.
5. Select files and click **Insert**.
6. Reorder using drag handles.
7. Click trash icon to remove attachments.

Attachments appear near Table of Contents and Tags on the Knowledge base site.

![Adding attachments](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_ScreenGIF-Adding_attachment_in_the_Knowledge_base_portal.gif)

**Site view**

![Attachment site view](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-Added_attachment_in_the_Knowledge_base_side.png)

<a id="status-indicator"></a>

## Status indicators

**Plans supporting status indicators**

| Professional | Business | Enterprise |
| --- | --- | --- |
| ✓ | ✓ | ✓ |

Status indicators appear near article titles on the Knowledge base site: **New**, **Updated**, and **Custom**.

---

## Automatic updates

Enable **Automatically set article status** to update indicators automatically:

1. Go to **Settings** > **Knowledge base site** > **Article settings & SEO**.
2. Enable **Automatically set article status**.
3. Set duration in **Show article status for** field.

> NOTE: See [Category manager](/help/docs/knowledge-base-category-manager) for details.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Automatic_Status_Indicator_update.png)

---

## Manual updates

1. Open the article.
2. Click **More** (•••) > **More article options**.
3. Select **Status indicator** tab.
4. Choose status from dropdown.
5. Set duration in **Show status for** field.
6. Click **Save**.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-Manually_updating_status_indicator_in_an_Article.png)

---

## Custom status settings

**Text customization:**
1. Go to **Settings** > **Knowledge base portal** > **Localization & Workspaces** > **Localization variables**.
2. Expand **Category manager**.
3. Edit **Custom** field.
4. Click **Save**.

**Color customization:**
1. Go to **Settings** > **Article settings & SEO**.
2. Select **Article settings** tab.
3. Expand **Category manager**.
4. Choose color for **Custom status indicator**.
5. Click save icon.
6. Hover over color icon to preview.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_Screenshot-Custom_Status_Indicator_color.png)

> NOTE: See [Category manager](/help/docs/knowledge-base-category-manager) for more details.

---

## Site view

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_Screenshot-Status_Indicator_KB_site_View.png)

- **New** (green dot): First-time published articles
- **Updated** (orange dot): Edited and republished articles
- **Custom**: Manually set by teams

<a id="article-status"></a>

## Article status

**Plans supporting article status**

| Professional | Business | Enterprise |
| --- | --- | --- |
| ✓ | ✓ | ✓ |

Article status helps identify article progress without checking each one individually.

Example: Content managers quickly find **Draft** articles needing editing or **Needs review** articles flagged for review.

> NOTE: Articles display status indicators (New/Updated/Custom) on the Knowledge base site. See [Status indicator](/help/docs/status-indicator).

---

## Portal status indicators

Articles show one of four statuses with color-coded icons in the left navigation:

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-All_four_article_status.png)

> NOTE: Status also applies to category pages.

**New article** (blue): Created but not yet published. Accessible only to team members.

> NOTE: Category pages show as **New category page**.

**Draft** (yellow): Published article being updated while original remains live.

**Published** (green): Public articles available to readers.

**Needs review** (pink): Articles flagged for review by contributors or automated reminders. See [Article review reminder](/help/docs/review-reminders).

---

## Hidden article status

Hidden articles show with strikethrough and aren't available on the Knowledge base site. They're accessible only through the portal.

> NOTE: Articles in hidden categories are also hidden.

---

### FAQs

**Purpose of article status?**

Identify article progress and streamline knowledge base maintenance.

**Available statuses?**

New, Draft, Published, and Needs review.

**What happens to "Needs review" articles?**

They're flagged for contributor review or automated reminders.

**Do categories show status?**

Yes, they follow the same status system.

<a id="preferences"></a>

## Article preferences

**Plans supporting preferences**

| Professional | Business | Enterprise |
| --- | --- | --- |
| ✓ | ✓ | ✓ |

---

## Updating preferences

1. Open any article.
2. Click **More** (•••).
3. Select **Preferences** tab.
4. Toggle options:
   - **Allow comments**: Enable Disqus comments
   - **Show table of contents**: Display article TOC
   - **Enable feedback**: Allow user feedback on articles
5. Click **Save**.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Preference%20tab%20overview%20page(1).png)

<a id="showhide-table-of-contents-for-an-article"></a>

## Table of contents visibility

**Plans supporting TOC control**

| Professional | Business | Enterprise |
| --- | --- | --- |
| ✓ | ✓ | ✓ |

Control TOC visibility at site level or individual article level.

---

## Site-level TOC control

1. Go to **Settings** > **Knowledge base site** > **Article Settings & SEO**.
2. Toggle **Show table of contents** in **Article right** section.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_TOC_artcilesettings.gif)

---

## Article-level TOC control

1. Open the article.
2. Click **More** (•••) > **More article options**.
3. Select **Preferences** tab.
4. Toggle **Show table of contents**.
5. Click **Save**.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Article_TOC.gif)

---

### FAQs

**Can I control TOC for entire site?**

Yes, via site-level settings.

**How to control site-level TOC?**

**Settings** > **Knowledge base site** > **Article Settings & SEO** > Toggle **Show table of contents**.

**Can I hide TOC for individual articles?**

Yes.

**How to hide individual article TOC?**

1. Open article > **More** (•••) > **More article options**
2. **Preferences** tab > Uncheck **Show table of contents**
3. Click **Save**

**Do bold headings appear in TOC?**

No, only H2, H3, and H4 headings appear.

<a id="marking-articles-as-deprecated"></a>

## Marking articles as deprecated

**Plans supporting deprecation**

| Professional | Business | Enterprise |
| --- | --- | --- |
| ✓ | ✓ | ✓ |

---

## What is a deprecated article?

A deprecated article is obsolete and may no longer be relevant. Usually replaced by updated information.

Example: Mark articles about removed product features as deprecated to redirect readers to current resources.

---

## Deprecating individual articles

1. Open the article.
2. Click **More** (•••) > **More article options**.
3. Select **Mark as deprecated** tab.
4. Enable **Deprecated** toggle.
5. Enter deprecation reason (optional).
6. Use formatting options: Bold, Italics, Underline, Hyperlinks.
7. Click **Save**.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Article_settings_deprecating_An_article.png)

---

## Bulk deprecation

1. Go to **Documentation** > **All articles**.
2. Select articles to deprecate.
3. Click **More** (•••) > **Deprecate**.
4. Enter deprecation message.
5. Click **Apply**.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-Deprecating_multiple_article_at_one_go.png)

---

## Site view

Deprecated articles show a **Deprecated** tag and highlighted message at the top.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_Screenshot-KB_Site_view_of_Deprecated_article.png)

<a id="updating-article-contributors"></a>

## Article contributors

**Plans supporting contributor management**

| Professional | Business | Enterprise |
| --- | --- | --- |
| ✓ | ✓ | ✓ |

Document360 automatically tracks team members who create, update, or publish articles.

Readers can click contributor avatars to see other articles by the same team member.

---

## Managing contributors

1. In article editor, click **Article information** icon next to status badge.

> NOTE: Default avatars show for team members without profile photos.

2. Click **Manage** to open contributor management.
3. Remove contributors using the trash icon.
4. Add contributors by searching names/emails.
5. Click **Add as contributor** icon.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_GIF-Add_delete_contributors.gif)

---

## Missing contributor error

This warning appears when no contributors are assigned to an article.

> PRO TIP:
> - Manually add contributors for collaborative articles
> - Delete team accounts to completely remove contributors. See [Managing team accounts](/help/docs/managing-team-account).

**Resolution steps:**
1. Open the article.
2. Click **Article information** icon.
3. Verify contributors in **Contributors** section.
4. Click **Manage**.
5. Search and select contributors.
6. Click **Add as contributor**.
7. Save changes.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-No_contributor_error_resolving.gif)

<a id="schedule-publishing"></a>

## Schedule publishing

**Plans supporting scheduled publishing**

| Professional | Business | Enterprise |
| --- | --- | --- |
| ✓ | ✓ | ✓ |

Schedule articles for publication at specific dates and times to plan content calendars and maintain consistency.

---

## Scheduling individual articles

1. Open the article.
2. Click dropdown next to **Publish** > **Publish later**.
3. Set **Date**, **Time**, and **Time zone**.
4. Add optional comments (max 160 characters).
5. Click **Schedule**.

> NOTE: Works for articles and page categories.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_ScreenGIF-Setting_up_schedule_publishing.gif)

---

## Editing scheduled publications

1. Open the article.
2. Click **Scheduled** dropdown.
3. Click **Edit schedule** icon.
4. Modify **Date**, **Time**, **Time zone**, or comments.
5. Click **Schedule**.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_ScreenGIF-editing_schedule_publishing.gif)

> NOTE: Click **Publish now** to publish immediately.

---

## Canceling scheduled publications

1. Open the article.
2. Click **Scheduled** dropdown.
3. Click **Cancel** icon.
4. Confirm with **Yes**.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_Screenshot-Cancel_schedule_publishing.png)

---

## Bulk scheduling

1. Go to **Documentation** > **All articles**.
2. Select articles.
3. Click **Publish later** or **Publish**.
4. Set **Date**, **Time**, and **Time zone**.
5. Click **Schedule**.

Scheduled articles show a **Publish later** icon. Hover to see scheduled date and time.

> NOTE: Publishing starts at scheduled time but may have slight delays.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_ScreenGIF-Schedule_publish_on_multiple_articles.gif)

---

### FAQs

**How to publish scheduled articles immediately?**

Click **Scheduled** dropdown > **Publish now**.

**Can I edit scheduled articles?**

No, cancel scheduling first to make edits.

**Can I publish scheduled articles via API?**

No, scheduled articles cannot be published via customer API.

**What happens when moving scheduled articles?**

Scheduling clears when articles move to different workspaces.

<a id="article-discussion-feed"></a>

## Discussion feed

**Plans supporting discussion feeds**

| Professional | Business | Enterprise |
| --- | --- | --- |
| ✓ | ✓ | ✓ |

Every article and category has a Discussion feed for team conversations, mentions, and collaboration.

---

## Using discussion feeds

1. Open the article.
2. Click **Discussion feed** icon.

> NOTE: Called **Discussion** in Markdown/WYSIWYG editors, **Comments** in Advanced WYSIWYG.

3. Type comments in the text box and click **Send**.
4. Comments appear as bubbles with timestamps and profile names.

> NOTE: No character limit for comments.

**Mentioning team members:**
5. Use @ to tag team accounts.
6. Select the intended member from suggestions.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Overview_page_of_discussion_feedback.png)

> NOTE: Tagged members receive email notifications with article details and comments.

---

## Deleting feed messages

Hover over message bubbles to reveal **Delete** icons.

> NOTE:
> - Only you can delete your messages
> - Click **Undo** to restore accidentally deleted messages
> - Discussion feeds disable after article publication

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-Deleting_the_feedback_in_feedback_discussion.png)

---

### FAQs

**How to add comments in Advanced WYSIWYG?**

Use inline comments feature. See [Reviewing articles with inline comments](/help/docs/reviewing-an-article-inline-comments).

**Why is discussion feed disabled?**

Feeds disable after publication. Click **Edit** to re-enable commenting.

<a id="revision-history"></a>

## Revision history

**Plans supporting revision history**

| Professional | Business | Enterprise |
| --- | --- | --- |
| ✓ | ✓ | ✓ |

---

## Article versioning

Versioning tracks changes, supports product versions, maintains edit history, enables collaboration, allows reverts, and ensures audit compliance.

When editing published articles, Document360 creates new unpublished versions while keeping old versions in history until new ones publish.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/image-1734605317771.png)

This system lets admins, reviewers, and contributors compare versions and revert when needed.

> NOTE: New versions don't delete existing content. Team members manually delete old versions.<a id="creating-article-version"></a>

## Creating article versions

Two methods create new article versions:

#### Method 1: From the editor

1. Open a published article in the Knowledge base portal.
2. Click **Edit** in the top-right corner.

   A new unpublished version opens in the text editor.
3. Update content as needed.
4. Click **Publish** and confirm.

   ![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_ScreenGif-Revision_history.gif)

#### Method 2: Fork from revision history

1. Navigate to the article in the Knowledge base portal.
2. Click **More** (•••) and select **Revision history**.
3. Click **Fork** on the desired version.
4. Confirm by clicking **Yes**.

   Creates a new version with selected version's content.
5. Click **Open** on the latest version to edit.
6. Update content if needed.
7. Click **Publish** and confirm.

   ![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_ScreenGif-Revision_history.gif)

---

## Article revision actions

Available options in **Article revision**:

1. **Fork**: Creates new version from existing version. Opens article in Editor for content changes.
2. **Delete**: Removes article version. Action cannot be reversed.

> NOTE: Cannot delete published versions. Only unpublished versions are deletable.

3. **Open**: Opens version in Editor. Enables restoring previous versions to published state.
4. **Workflow history**: Shows version's workflow details including stages, assignees, comments, and dates.
5. **Publish**: Makes any previous version public by opening in editor and clicking Publish.

Detailed version information includes version number, contributor, creation date, and visibility status.

![revision history](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_Screenshot-Workflow_history.png)

---

## Comparing article versions

Compare any two article versions:

1. Go to article in Documentation editor.
2. Click **More** (•••) and select **Revision history**.
3. Select checkboxes for versions to compare.
4. Click **Compare**.

![revision history](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_Screenshot-Article_Version_comparision.png)

### Content highlighting

**Added content:**
* Highlighted in green
* Images, videos, code blocks, PDFs, and self-closing tags show green 'Added' badge
* Table changes highlighted in green
* Highlights remain visible during scrolling

**Removed content:**
* Highlighted in red with strikethrough
* Media elements show red 'Removed' badge
* Table removals highlighted in red
* Removed content stays visible in comparison view

**Formatting changes:**
* Highlighted in blue
* Non-text formatting changes (tables, images) show blue 'Modified' badge

> NOTE: Content block movements and multiple formatting changes are not highlighted. Multi-formatting means applying italic, bold, and underline to same content block.

**Swap versions:**
* **Swap** button near version dropdowns
* Reverses comparison order instantly
* Shows changes from both perspectives
* Updates view real-time without page reload
* Preserves all highlights, filters, and settings
* Version labels update to reflect new order

> NOTE: All highlights maintain after swap. Previously "added" content shows as "removed" and vice versa.

**Exit comparison:**
* **Exit compare** button in top-right corner
* Returns to main document view without page reload
* Maintains exact location before comparison

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/5_ScreenGif-Revision_history.gif)

---

### FAQs

#### Why are forked article timestamps out of order?

When older versions are opened and modified, timestamps reflect recent changes accordingly.

#### Can I restore previous article revisions?

* **Published articles**: Delete forked version with recent edits to restore last published version
* **Draft/new articles**: Fork earlier revision or delete forked version with recent edits

Forking before editing preserves original version for later restoration.

#### How do I discard current changes and revert?

**Method 1:**
* If unpublished, click **Revision history**
* **Open** previous version to restore old content

**Note**: Works only if article was published at least once.

**Method 2:**
* If never published, use Backup & Restore in **Settings**
* Restores specific article content

#### Can I change published/updated dates to past dates?

No. Published and updated dates always reflect actual modification times, regardless of article version age.

---

<a id="article-analytics"></a>

## Article analytics

**Plans supporting article analytics**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  | ✓ | ✓ |

Article Analytics provides detailed insights for individual articles unlike standard Analytics that cover the entire knowledge base. Track performance across reads, views, likes, dislikes, and link status to optimize content strategy.

---

## Accessing article analytics

1. In editor, click **More** (•••) in top-right corner
2. Select **Analytics** from dropdown

   Shows detailed metrics for **Reads**, **Views**, **Likes**, **Dislikes**, and **Link Status**

---

### Understanding metrics

Each metric measures different engagement aspects:

* **Reads**: Reader engagement based on scrolling, clicking, and time spent. Counts once per day per user.

> NOTE: Time spent varies by user activity. Multiple clicks count as single read with varying time sessions.

* **Views**: Unique clicks per browser, counted once per browser per user
* **Likes**: Total likes received, indicating content relevance
* **Dislikes**: Total dislikes, showing areas for improvement

> NOTE: All metrics begin tracking from article creation.

---

### Project-wide analytics

Click **Go to Analytics** for broader project-level insights.

![Update-Screenshot-Article_Analytics](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/Update-Screenshot-Article_Analytics.png)

---

### Link validation

**Link status** shows total links with breakdown:

* **Working**: Active and accessible
* **Broken**: Unreachable or incorrect URLs
* **Unknown**: Status undetermined
* **Ignored**: Intentionally excluded from validation

Use link validation to maintain reliable article links:

1. From Article Analytics, locate **Link Status**
2. Click **Validate Now** to check status
3. Identify broken links and copy URLs
4. Update links or set redirection rules

**Example**: For broken external documentation links, copy URL and navigate to **Settings > Knowledge base site > Article redirect rules** to add new rule.

---

### FAQs

#### How often does analytics data update?

Real-time updates with daily read refresh based on unique user sessions.

#### Why do read counts differ from views?

Reads include engagement activities (scrolling, clicking) while views count unique browser clicks only.

#### Can article analytics improve content engagement?

Yes. Reads, Likes, and Dislikes metrics show which articles resonate most with your audience.## Subprocessors

Eddy AI uses these subprocessors to deliver service:

* **MongoDB**: Vector database
* **OpenAI**: AI models
* **Azure**: Cloud infrastructure
* **Stripe**: Payment processing
* **Segment**: Product analytics

---

## Data Security and Privacy

Data storage and transmission use encryption. Eddy AI ensures reliable performance under load.

* **Data at rest**: Encrypted with industry-standard protocols
* **Data in transit**: Encrypted to prevent interception

---

## Resources

### 1. Cryptography policy

**Purpose**: Ensure proper use of cryptography to protect confidentiality, authenticity, and integrity.

**Scope**: Applies to all Document360 systems storing or transmitting confidential data.

**Policy Owner**: CEO

**Effective Date**: March 1, 2024

**Risk Evaluation**: Document360 evaluates risks and implements cryptographic controls where appropriate.

**Encryption Standards**: Use strong cryptography with key management per industry standards (NIST SP 800-57).

**Key Management**: Keys and secrets are tightly controlled. Specifies key types, algorithms, and lengths for web certificates, ciphers, and endpoint storage.

**Exceptions**: Submit requests to CEO for approval.

**Violations & Enforcement**: Report violations to CEO. May result in disciplinary action, including termination.

**Version History**: Version 1.0, approved by Yasser ElSaid on February 3, 2024.

**Data at Rest**: Confidential data encrypted with AES-256 for maximum 1 year.

**Passwords**: Hashed with Bcrypt, PBKDF2, scrypt, or Argon2 using 256-bit key, 10K stretch, unique salt and pepper.

---

### 2. Incident Response Plan

**Purpose and Scope**: Manage information security incidents across the company.

**Definitions**: Security event (observable occurrence) vs. security incident (event causing data loss/damage).

**Reporting and Documentation**: Report suspected incidents immediately through designated channels. Document all incidents.

**Severity Levels**: 
* S1 (Critical)
* S2 (High) 
* S3/S4 (Medium/Low)

Clear escalation and response guidelines provided.

**Incident Response Team**: Led by IT Manager or VP of Support. Centralized "War Room" for coordination. Regular meetings update incident tickets and document indicators of compromise.

**Root Cause Analysis**: Critical incidents require analysis, documentation, and CEO review. CEO decides on post-mortem meetings.

**Response Process**: Triage, investigation, containment, eradication, recovery, hardening. Focus on lessons learned and improvements.

**Physical Security**: Address isolation and backup of affected systems.

**Breach Determination and Reporting**: Only CEO determines breach status. Promptly notify relevant parties per policies and regulations.

**External Communications**: Cooperate with customers, data controllers, authorities. Legal and executive staff determine approach.

**Roles and Responsibilities**: Document specifies responder roles and duties.

**Special Considerations**: Handle internal issues, compromised communications, root account compromises.

**Incident Status and Summary**: Template documents date, time, location, personnel, information type, indicators of compromise, root cause, actions taken.

**AWS Root Account Compromise Playbook**: Guidance for managing Root AWS account during compromise.

**Policy Owner and Effective Date**: CEO owns policy. Effective March 1, 2024.

---

### 3. Information Security Roles and Responsibilities Policy

**Objective**: Establish roles for protecting electronic systems and equipment.

**Policy Owner and Effective Date**: CEO owns policy. Effective March 1, 2024.

**Applicability**: All Document360 infrastructure, networks, systems, employees, contractors involved in security/IT.

**Audience**: All employees, contractors, partners, affiliates, temporary staff, trainees, guests, volunteers.

**Roles and Responsibilities**:

1. **Executive Leadership**:
   * Approve security program expenditures
   * Oversee risk management communication
   * Ensure compliance with GDPR, CCPA, SOC 2, ISO 27001
   * Review vendor contracts, oversee third-party risk

2. **VP of Engineering**:
   * Oversee development security
   * Implement security controls for development/IT
   * Conduct IT risk assessments, report to leadership

3. **VP of Customer Support**:
   * Manage security tools in customer environments
   * Ensure compliance with retention/deletion policies

4. **System Owners**:
   * Maintain system confidentiality, integrity, availability
   * Approve access and change requests

5. **Employees, Contractors, Temporary Workers**:
   * Protect health, safety, information resources
   * Identify risk management improvements
   * Report incidents, follow company policies

6. **Chief Human Resources Officer**:
   * Ensure qualified, competent staff
   * Oversee background checks, policy training, Code of Conduct
   * Evaluate performance, provide security training

**Policy Compliance**: Measured through reports, audits, feedback. Exceptions require CEO pre-approval. Non-compliance may lead to termination.

**Document Control**:
* **Version**: 1.0
* **Date**: February 3, 2024
* **Author**: Yasser ElSaid
* **Approved by**: Yasser ElSaid

---

### 4. Secure Development Policy

**Policy Owner and Effective Date**: CEO owns policy. Effective March 1, 2024.

**Purpose**: Design and implement information security within development lifecycle.

**Scope**: Applies to all business-critical Document360 applications and systems processing/storing/transmitting confidential data.

**Secure-by-Design Principles**:
* Minimize attack surface
* Establish secure defaults
* Apply least privilege
* Implement defense in depth
* Fail securely
* Avoid security by obscurity
* Keep security simple

**Privacy-by-Design Principles**:
* Proactive prevention
* Privacy as default
* Privacy embedded in design
* Full functionality without privacy compromise
* End-to-end security
* Full lifecycle protection

**Development Environment**: Segregate Production, Test/Staging, Development environments.

**System Acceptance Testing**: Establish testing programs and criteria. Complete Release Checklist before deployment.

**Protection of Test Data**: Carefully select, protect, control test data. Don't use confidential customer data without explicit permission.

**Change Control Procedures**: Changes require approval and oversight from multiple individuals.

**Software Version Control**: All software version controlled with role-based access restrictions.

**Policy Compliance**: Measured through reports, audits, feedback. Non-compliance may result in termination.

---

### 5. Code of Conduct Policy

**Policy Owner**: CEO

**Effective Date**: March 1, 2024

**Purpose**: Establish safe, inclusive environment for all staff.

**Scope**: Applies to all staff in all professional settings.

**Culture**: Promotes respect, collaboration, consideration.

**Expected Behavior**: Participate in respectful, collaborative workplace.

**Unacceptable Behavior**: Harassment, violence, discrimination, inappropriate conduct prohibited.

**Weapons Policy**: No weapons on company premises. Violations have strict consequences.

**Consequences**: Non-compliance results in immediate corrective actions and disciplinary measures.

**Responsibility**: CEO ensures staff adherence to policy principles.

---

### 6. Access Control Policy

**Policy Owner**: CEO

**Effective Date**: March 1, 2024

**Purpose**: Restrict access to authorized individuals per business objectives.

**Scope**: Applies to all Document360 systems handling confidential data for employees and external parties.

**Access Control Summary**:

**Identifying Users**: Access based on job roles and required competencies.

**Maintaining Authorization**: Document all privileged access allocations.

**Enforcing Security Measures**: MFA required for privileged access. No generic administrative IDs.

**Adopting Protocols**: Grant time-bound access permissions.

**Logging and Auditing**: Log and audit all privileged activities.

**User Access Reviews**: Regular reviews maintain appropriate identities.

**Access Control Policy**: Restrict access to authorized parties only.

**Password Management**: Implement secure log-on procedures.

**User Access Provisioning**: Grant access based on documented business requirements.

**Violations & Enforcement**: Report violations. Enforcement maintains compliance and security.

---

### 7. Data Management Policy

**Policy Owner**: CEO

**Effective Date**: March 1, 2024

**Purpose**: Classify, protect, retain, and dispose of information based on organizational importance.

**Scope**: Applies to all Document360 data, information, and systems.

**Data Classification**:

**Confidential**: Highest protection needed. Examples: customer data, PII, financials, strategic plans, technical reports.

**Restricted**: Thorough protection required. Default classification. Examples: internal policies, legal documents, contracts, emails.

**Public**: Intended for public consumption. Examples: marketing materials, product descriptions.

**Data Handling**:

**Confidential Data**:
* Restricted access to specific employees/departments
* Must encrypt at rest and in transit
* No storage on personal devices/removable media
* Requires secure storage and disposal

**Restricted Data**:
* Need-to-know access only
* Management approval for external transfer
* Secure storage and disposal mandatory

**Public Data**: No special protection required.

**Data Retention and Disposal**:
* Retain data per business, regulatory, contractual requirements
* Securely delete confidential/restricted data when unnecessary
* Delete or de-identify PII when no longer needed

**Annual Data Review**: Management reviews retention requirements annually.

**Legal Requirements**: Data under legal hold exempt from standard requirements. Retain per legal counsel instructions.

**Policy Compliance**: Measured through business tool reports and audits.

**Exceptions**: Require CEO approval.

**Violations & Enforcement**: Report violations to CEO. May result in termination.

---

### 8. Operations Security Policy

**Policy Owner**: CEO

**Effective Date**: March 1, 2024

**Purpose and Scope**:
* Ensure secure operation of information processing systems
* Applies to all critical Document360 systems and third-party entities with network access

**Documented Operating Procedures**: Technical and administrative procedures documented and accessible.

**Change Management**:
* Document, test, review, approve significant changes before deployment
* Emergency changes require retrospective review and authorization

**Capacity Management**:
* Monitor and adjust processing resources and storage
* Include human resource capacity in planning and risk assessments

**Data Leakage Prevention**:
* Classify information per Data Management Policy
* Train users on proper handling
* Use DLP tools based on risk assessment

**Web Filtering**:
* Implement DNS/IP blocking for risky websites
* Block malicious content/command servers unless business-necessary

**Separation of Environments**:
* Strictly segregate development, staging, production
* Don't use confidential production data in development/test without approval

**Systems and Network Configuration**:
* Follow configuration and hardening standards
* Review production access rules annually

**Protection from Malware**:
* Implement detection, prevention, recovery controls
* Use anti-malware software on all endpoints and emails

**Information Backup**: Design backup processes ensuring customer data recovery per SLAs.

**Logging and Monitoring**: Implement logging and monitoring for incident detection and response.

**Control of Operational Software**: Manage installation and use per established rules.

**Threat Intelligence**: Collect and analyze threats for actionable intelligence.

**Technical Vulnerability Management**: Identify, assess, address vulnerabilities timely.

**Restrictions on Software Installation**: Establish rules for secure software installation.

**Information Systems Audit Considerations**: Plan audits to minimize business disruptions.

**Systems Security Assessment**: Include security requirements in system acquisition/changes.

**Data Masking**: Implement data masking for PII and sensitive data based on risk assessment.

---

## Data Privacy

We maintain strict data handling practices:

* **Data Privacy Compliance**: Signed DPA with OpenAI outlining privacy commitments. [DPA details](https://ironcladapp.com/public-launch/63ffefa2bed6885f4536d0fe)
* **AI Models**: Use OpenAI's ChatGPT 3.5 and GPT-4 for Eddy AI performance
* **Privacy Adherence**: Feature follows OpenAI privacy policies through API integration
* **Data Transmission**: Send data via OpenAI APIs. OpenAI policy states: "OpenAI will not use customer API data to train models." Data retained maximum 30 days for analytics, then deleted

> **NOTE**
>
> Read complete [**OpenAI API data usage policies**](https://openai.com/enterprise-privacy/)
>
> For Document360 data policy queries, see [**Privacy policy**](https://document360.com/privacy/)

---

## AI Writer Suite

**Plans supporting AI writer suite**: Professional, Business, Enterprise

| Professional | Business | Enterprise |
| --- | --- | --- |
| ✓ | ✓ | ✓ |

Suite offers AI tools for content creation, SEO optimization, FAQ generation, and related content recommendations within the knowledge base portal.

---

## Features in the AI Writer Suite

1. [**AI writer**](/help/docs/ai-writer)
   1. **Outline creation**: Generate structured article outlines
   2. **Make longer/Make shorter**: Adjust content length
   3. **Change tone/Change voice**: Modify tone or switch active/passive voice
   4. **Split sentences**: Break complex sentences for readability
   5. **Convert speech**: Switch direct/indirect speech
   6. **Improve it**: Enhance clarity and impact
   7. **Convert into table**: Format lists/paragraphs as tables

2. [**AI FAQ generator**](/help/docs/ai-faq-generator): Create FAQs from article content

3. [**AI title recommender**](/help/docs/ai-title-recommender): Generate engaging title suggestions

4. [**AI SEO description generator**](/help/docs/seo-description-generator): Create search-friendly descriptions

5. [**AI tag recommender**](/help/docs/ai-tag-recommender): Suggest relevant content tags

6. [**AI related articles recommender**](/help/docs/ai-related-articles-recommender): Recommend connected articles

7. [**AI Chart generator**](/help/docs/ai-chart-generator): Generate pie charts, flow charts, tables

8. [**AI alt text generator**](/help/docs/ai-alt-text-generator): Create accessibility descriptions for media

---

## Multilingual Support for Eddy AI Writer Suite

Eddy AI supports 16 languages in the knowledge base:

* English variants: en, en-US, en-GB, en-AU
* French (fr)
* Spanish (es)
* German (de)
* Norwegian (no)
* Dutch (nl)
* Portuguese (pt)
* Swedish (sv)
* Italian (it)
* Korean (ko)
* Finnish (fi)
* Polish (pl)
* Arabic (ar)
* Hebrew (he)
* Danish (da)
* Brazilian Portuguese (pt-br)

Features unavailable for unsupported workspace languages like Chinese.

---

## Plan Availability and Usage Limits

Professional, Business, and Enterprise plans include full AI Writer Suite access. Freemium plan excludes these features.

Monthly credit limits apply:
* **Make longer/Make shorter/Outline creation/Change tone**: 5,000 credits
* **SEO description generator/Title recommender**: 1,000 credits
* **Other features**: Unlimited within paid plans

Platform notifies users approaching limits.

---

## AI Writer

**Plans supporting AI writer**: Professional, Business, Enterprise

| Professional | Business | Enterprise |
| --- | --- | --- |
| ✓ | ✓ | ✓ |

Eddy AI offers content enhancement tools. Launch with **Ctrl + Spacebar**.

> **NOTE**: Trial accounts enable all Eddy AI features by default.

---

## Prerequisites

Ensure project subscription supports AI writer (disabled by default):

1. Navigate to **Settings** > **AI features** > **Eddy AI**
2. Enable **AI writer** toggle

> **NOTE**:
> * [Supported languages](/help/docs/ai-writer-suite#multilingual-support-for-eddy-ai-writer-suite)
> * Browser extensions may interfere. Disable ad blockers, password managers, pop-up blockers if experiencing issues

---

## Accessing AI Writer Actions

Available actions:
* Outline creation
* Improve it
* Change tone
* Convert speech
* Change voice
* Make longer
* Make shorter
* Convert into table
* Split sentence
* [AI chart generator](/help/docs/ai-chart-generator)

> **NOTE**: Available only in Advanced WYSIWYG editor

**Usage**:
1. Select text (minimum 10 words) in Advanced WYSIWYG editor
2. Click **Eddy AI** option and choose desired action

**Outline creation**: Generate structured outlines from content or prompts. Review and modify as needed.

**Improve it**: Refine grammar, semantics, clarity, phrasing.

*Original*: "The system is highly effective because it works well in most cases."

*Improved*: "The system is very efficient as it performs effectively in the majority of situations."

**Change tone**: Modify tone for different audiences. Options: Professional, Friendly, Casual, Straightforward, Confident.

*Original*: "The team will proceed with the update as soon as possible."

*Friendly*: "The team is excited to get started on the update and will do so as soon as possible!"

*Professional*: "The team will initiate the update at the earliest opportunity."

**Convert speech**: Switch direct/indirect speech.

*Direct*: "He said, 'I will definitely complete the task by tomorrow.'"

*Indirect*: "He said that he would definitely complete the task by the following day."

**Change voice**: Switch active/passive voice.

*Active*: "The team successfully completed the project within the specified date."

*Passive*: "The project was successfully completed by the team within the specified date."

**Make longer**: Expand text with elaborated details.

*Original*: "Document360 is a knowledge base platform with several advanced features."

*Expanded*: "Document360 is a comprehensive knowledge base platform equipped with a wide array of advanced features that cater to the diverse needs of users..."

**Make shorter**: Condense text without losing essence.

*Original*: "The Document360 platform provides a robust set of features, including version control, multi-language support, analytics, and a powerful AI-assisted search, which helps streamline the knowledge management process."

*Shortened*: "The Document360 platform offers version control, multi-language support, analytics, and a powerful AI-assisted search to streamline knowledge management."

**Convert into table**: Format content as tables.

**Split sentence**: Break complex sentences for readability.

*Original*: "Document360 is an advanced platform, and it offers numerous features, including analytics, version control, and AI assistance, making it ideal for managing knowledge bases efficiently."

*Split*: "Document360 is an advanced platform. It offers numerous features, including analytics, version control, and AI assistance. These features make it ideal for managing knowledge bases efficiently."

---

## FAQs

#### What subscription plans support the AI writer suite?

Professional, Business, and Enterprise plans.

#### How can I activate the Eddy AI feature?

Navigate to Settings > AI features > Eddy AI and enable the AI writer toggle.

#### What actions can I perform using the AI writer?

Make text longer/shorter, create outlines, change tone, convert speech, improve text, convert to tables, change voice, split sentences.

#### Is the AI writer available in all editors?

No, Advanced WYSIWYG editor only.

#### Will my data be secure when using Eddy AI?

* Follows OpenAI privacy policies through API integration
* OpenAI policy: "OpenAI will not use customer API data to train models"
* Data retained maximum 30 days for analytics, then deleted

> Read [**OpenAI API data usage policies**](https://openai.com/policies/api-data-usage-policies)
> See [**Document360 Privacy policy**](https://document360.com/privacy/) for queries

#### Can I use the AI writer features multiple times in a month?

Yes, content creation features have 5,000 monthly uses limit.

#### What should I do if I encounter issues with the AI writer?

Disable interfering browser extensions.

#### Are there any best practices for using the AI writer features?

Review generated content for relevance, use features to elaborate/simplify text, ensure tone matches audience.

#### How many AI credits do my plan support?

5,000 monthly credits in Professional, Business, and Enterprise plans. Contact support to increase limits.

**API**: Rules allowing software applications to communicate.

---

## AI FAQ Generator

**Plans supporting feature**: Professional, Business, Enterprise

| Professional | Business | Enterprise |
| --- | --- | --- |
| ✓ | ✓ | ✓ |

Automatically creates FAQs with answers from article content in Advanced WYSIWYG editor.

---

## Prerequisites

* Purchase Eddy AI content suite
* Enable AI writer suite (enabled by default)

> **NOTE**: [Supported languages](/help/docs/ai-writer-suite#multilingual-support-for-eddy-ai-writer-suite)

---

## AI FAQ Generator in Advanced WYSIWYG Editor

1. Navigate to article in Advanced WYSIWYG editor
2. Click **Eddy** icon in toolbar
3. Choose **Generate FAQs**

> **NOTE**:
> * Minimum 150 words required
> * Generated FAQs placed at article end

---

## Customizing Generated FAQs

Edit FAQ section title. Click FAQ section for options:

1. **Settings**: Adjust template settings for specific article
2. **Regenerate**: Create new FAQs from current content
3. **Expand/Collapse**: Show/hide answers
4. **Delete**: Remove entire FAQ section

---

## Adding Custom FAQs

1. Hover between FAQs where adding new one
2. Click **Add question** icon
3. Fill in custom question and answer

To delete specific FAQ:
4. Click FAQ to remove
5. Select **Delete** icon above it

---

## Locking FAQs

Protect FAQs from regeneration changes:

1. Click Lock icon next to FAQ
2. Locked FAQs marked with badge
3. Manual editing still possible

To generate additional FAQs while preserving current ones:
1. Lock existing questions
2. Click **Regenerate** for new relevant FAQs

> **NOTE**: FAQ templates differ from AI FAQ generator. See [Advanced WYSIWYG editor](/help/docs/advanced-wysiwyg-editor-basics) article.

---

## Setting up FAQ Generator

Customize settings at project level:

1. Navigate to Settings > Knowledge base site > Article settings & SEO
2. Expand **FAQ** accordion

---

## Customization Options

1. **Expand/Collapse**:
   * **Expand first**: First FAQ expanded by default
   * **Expand all**: All FAQs expanded
   * **Collapse all**: All FAQs collapsed

2. **Style**:
   * **With border**: Border around all FAQ sides (default)
   * **Without border**: Bottom border only (except last accordion)

3. **Expand arrow position**: Right or left (default: right)

4. **Expand/Collapse icons**: Arrow up/down or plus/minus options

---

## FAQs

#### What languages does the AI FAQ generator support?

English only.

#### How do I add a custom FAQ between generated FAQs?

Hover between FAQs, click icon, select from dropdown.

#### What is the minimum number of questions generated?

Typically 5-10 questions depending on content depth.

#### Can I edit AI-generated FAQs?

Yes, select and modify as needed.

#### Is there a usage limit?

5,000 monthly uses. Contact support to increase limit.

---

## AI Title Recommender

**Plans supporting feature**: Professional, Business, Enterprise

| Professional | Business | Enterprise |
| --- | --- | --- |
| ✓ | ✓ | ✓ |

Generates optimized titles using NLP to analyze content and suggest options capturing key information while maintaining context.

---

## Prerequisites

* Article content must exceed 50 words after preprocessing
* Sufficient Document360 credits (1 credit per recommendation)

> **NOTE**: [Supported languages](/help/docs/ai-writer-suite#multilingual-support-for-eddy-ai-writer-suite)

---

## Using Article Title Recommender

**Suggest Title** available in article title section for new articles.

For published/draft articles:
1. Click article title to display **suggest title** feature
2. Click **Ask Eddy AI** button

Three AI-generated suggestions appear. Click **Generate more suggestions** for additional options.

Choose preferred title and click **Choose**, or **Cancel** to close.

**Key options**:
* **Suggested titles**: Three options per click. Select with radio button
* **Share feedback**: Upvote/downvote suggestions to improve feature
* **Save/Cancel**: Save selected title or cancel. 1 credit consumed per **Suggest title** click regardless of saving

---

## Credit Usage and Limits

* 1 credit per **Suggest title** click, even without saving
* Monthly limits per subscription plan

> **NOTE**: 1,000 monthly credits for title recommender across Professional, Business, Enterprise plans. Contact support for additional credits.

* Credits don't automatically renew monthly

---

## What are Preprocessed Words?

**Preprocessing** excludes elements from word count:

* HTML tags
* Images
* URLs/links
* Code blocks

Example: 220-word article may drop below 50 preprocessed words. Ensure content exceeds 50 preprocessed words for Title recommender.

---

## Data Privacy

Prioritize knowledge base data privacy. Title Recommender uses OpenAI integration, adheres to OpenAI privacy policies.

Policy extract: "OpenAI will not use customer API data to train models or improve services."

* [Full OpenAI API policy](https://openai.com/privacy)
* See Document360 Privacy Policy for company data practices

**API**: Rules allowing software applications to communicate.

---

## AI SEO Description Generator

**Plans supporting feature**: Professional, Business, Enterprise

| Professional | Business | Enterprise |
| --- | --- | --- |
| ✓ | ✓ | ✓ |

Streamlines meta description creation for articles and category pages. Generates concise, relevant descriptions optimizing search engine visibility and click-through rates.

---

## Prerequisites

1. **Sufficient credits**: Required per description generated
2. **Preprocessed content**: Exceed 200 words after excluding HTML tags, images, URLs, code blocks
3. **Access permissions**: **Ask Eddy AI** button available to authorized team members only

> **NOTE**: [Supported languages](/help/docs/ai-writer-suite#multilingual-support-for-eddy-ai-writer-suite)

---

## Using SEO Description Generator

For individual articles/category pages:

1. Navigate to article/category in Knowledge base portal
2. Click **More** icon at top-right, select **SEO**
3. Expand **SEO** section, click **Ask Eddy AI**
4. Review generated description, click **Save**

> **PRO TIP**: Double-check generated descriptions for accuracy and audience alignment.

---

## Generating SEO Descriptions for Multiple Articles/Category Pages

1. Navigate to Documentation > Content tools > Documentation > SEO description
2. Select workspace from project dropdown
3. Ensure selected language is English
4. View all articles/category pages in workspace/language

> **NOTE**: Preprocessed word count shown next to names. Generate descriptions only for content exceeding 200 preprocessed words.

5. Filter articles by SEO availability, category, contributor, tags, last updated
6. Select eligible articles, click **Ask Eddy AI**
7. Review descriptions, click **Yes** to save

> **PRO TIP**: Prioritize high-traffic cornerstone content for maximum SEO impact.

---

## Best Practices for SEO Meta Descriptions & Titles

**Meta Descriptions**:
1. **Concise (155-160 characters)**: Brief yet informative
2. **Include relevant keywords**: Primary and secondary naturally
3. **Align with user intent**: Answer audience queries
4. **Make actionable**: Use calls like "Learn more," "Discover"
5. **Unique per page**: Avoid duplicate content issues
6. **Avoid keyword stuffing**: Maintain natural flow

> **PRO TIP**: Focus on clarity and relevance. Meta descriptions don't directly impact rankings but significantly improve click-through rates.

**SEO Titles**:
1. **Optimal length (50-60 characters)**: Prevent truncation
2. **Include primary keywords**: Preferably at beginning
3. **Reflect content accurately**: Avoid misleading users
4. **Make engaging**: Use compelling language
5. **Avoid redundancy**: Keep clear and straightforward
6. **Brand inclusion (optional)**: Add brand name if space allows

---

## FAQs

#### Why is SEO description generator essential?

Effortlessly generate optimized meta descriptions for articles and category pages based on content.

#### What is a meta/SEO description?

Summarizes article/category page content appearing in search results. Improves SEO, discoverability, organic traffic.

#### How are credits associated with SEO description generator?

1 credit per generated description. 50 articles require 50 credits.

#### Does Document360 offer free credits?

Yes, 10 free credits for paid projects. Trial plan excluded.

#### Why does article word count vary from preprocessed count?

Preprocessed count excludes HTML tags, images, URLs, code blocks. Editor count includes all elements.

#### What happens generating SEO description for article with existing description?

1 credit consumed. Generated description replaces current one.

#### Can I generate different meta descriptions with same content?

No, identical content produces same description. 1 credit consumed per generation.

#### Can I manually update SEO title and description?

Yes, through SEO description overview page or individual article settings.

#### Can I generate SEO descriptions for non-English articles?

Currently English-only. Manual additions possible for other languages.

#### Do search engines crawl SEO descriptions of private articles?

No, private articles remain uncrawled.

#### What is credit validity?

Credits valid for project lifetime.

#### Do credits affected by subscription plan changes?

No.

#### Does Document360 refund unused credits?

No.

#### Can I generate SEO titles with SEO description generator?

No, generates meta descriptions only. Use AI title recommender for SEO titles.

#### Can I switch languages in SEO description module?

Yes, but generator works English-only.

#### How many SEO descriptions can I generate?

**Soft limits**:
* Professional: 1,000 descriptions/month
* Business: 1,000 descriptions/month
* Enterprise: 1,000 descriptions/month

#### Is data security maintained?

Yes, follows OpenAI privacy policies. OpenAI doesn't use customer API data for training.

> Read [**OpenAI API data usage policies**](https://openai.com/policies/api-data-usage-policies)
> See [**Document360 Privacy policy**](https://document360.com/privacy/) for queries

**API**: Rules allowing software applications to communicate.

---

## AI Tag Recommender

**Plans supporting feature**: Professional, Business, Enterprise

| Professional | Business | Enterprise |
| --- | --- | --- |
| ✓ | ✓ | ✓ |

Suggests relevant tags using AI to analyze content and identify keywords/topics. Helps categorize content for easier discovery by team members and readers.

---

## Prerequisites

* **Preprocessed article content**: Must exceed 50 words
* **Access permissions**: Required for tag generation

> **NOTE**: [Supported languages](/help/docs/ai-writer-suite#multilingual-support-for-eddy-ai-writer-suite)

---

## Accessing Recommended Tags for Articles

1. Navigate to article in Knowledge base portal
2. Click **More** at top right next to Publish button
3. Select **Tags** to open Article settings page
4. Click **Ask Eddy AI** button

AI-suggested tags appear in **Eddy AI recommends** section.

> **NOTE**: Minimum 200 words required for AI tag generation

5. Select suitable tags, click **Save**
6. Reopen article settings to regenerate tags

> **NOTE**: Tag recommendations also appear in Publish confirmation prompt. Expand **Configure article settings**, click **Ask Eddy AI** in Tags section before publishing.

---

## What Does Preprocessing Mean?

Preprocessing excludes specific elements when generating tags:

* HTML tags
* Images
* URLs/links
* Code blocks

Example: 80-word article may reduce below 50 preprocessed words. Ensure content exceeds 50 preprocessed words for tag generation.

---

## Why Tagging Matters

Essential for content management in large knowledge bases. Tags categorize articles by themes/topics, improving search precision and discoverability. Groups related content benefiting internal teams and external users.

---

## Best Practices for Content Management

1. **Create consistent tagging structure**: Establish guidelines for uniform tag usage across articles
2. **Use specific, relevant tags**: Avoid broad terms like "Update." Specify "Security Update" or "Feature Update"
3. **Limit tag count**: Use 3-5 key tags per article for focused searches
4. **Review and update tags regularly**: Modify outdated tags for efficient retrieval
5. **Group content using tags**: Cluster related articles (e.g., "Onboarding," "Troubleshooting," "Product Features")
6. **Leverage AI tag recommender**: Maintain consistent, relevant tagging across team-managed content

---

## FAQs

#### Who can generate tags?

Team accounts with combinations:
* Update article settings + Manage Tags
* Publish article + Manage Tags
* Update article settings + Publish article + Manage Tags

#### Can I generate tags for multiple articles simultaneously?

No, one article at a time currently.

#### Does AI tag recommender consume credits?

No, unlimited usage without credit limitations.

#### Can I add tags manually?

Yes.

#### Can I disable tag recommendations?

No.

---

## AI Related Articles Recommender

**Plans supporting feature**: Professional, Business, Enterprise

| Professional | Business | Enterprise |
| --- | --- | --- |
| ✓ | ✓ | ✓ |

Automatically associates relevant articles based on current content. Enhances user experience through quick access to connected information.

---

## Prerequisites

* Preprocessed content must exceed 200 words
* Required access permissions and credits

> **NOTE**: [Supported languages](/help/docs/ai-writer-suite#multilingual-support-for-eddy-ai-writer-suite)

---

## Accessing AI Related Article Recommender

1. Navigate to Documentation in Knowledge base portal
2. Select published/unpublished article
3. Click **More** option, select **Related articles**

If existing related articles, view list below search bar.

4. Click **Ask Eddy AI** for recommendations

> **NOTE**: Minimum 50 words required

5. Click **Add** icon for desired articles
6. Enable **Auto relate this article to all related articles** toggle if needed

> **NOTE**: When enabled, bidirectional relationships created. Saves time adding related articles.

7. Click **Save** after changes

> **NOTE**: For bulk knowledge base additions, see [Dynamic related article recommendation](/help/docs/ai-dynamic-related-articles-recommendation)

---

## Accessing AI Related Article Recommender in Publish Checklist

1. Click **Publish** on desired article
2. Expand **Configure article settings** section
3. Scroll to **Related articles** section
4. Click **Ask Eddy AI** for recommendations
5. Click **Add** icon for desired articles
6. Click **Yes** when done

---

## Viewing Related Articles in Knowledge Base Site

Eddy AI-generated related articles appear in **Related articles** section at article bottom. Readers click to navigate directly to connected resources.

---

## FAQs

#### How many related articles can Eddy AI generate?

Maximum 3 related articles at once.

#### Can I manually add related articles alongside AI recommendations?

Yes, manual additions complement AI suggestions.

#### Will previously added related articles be overwritten?

No, AI suggests additional articles without affecting existing ones.

**Knowledge base portal**: Platform where project members manage and create content. Allows category/article/template creation, file/team/reader management, site configuration (branding, domain, security).

---

## AI Chart Generator

**Plans supporting feature**: Professional, Business, Enterprise

| Professional | Business | Enterprise |
| --- | --- | --- |
| ✓ | ✓ | ✓ |

Converts text into visual formats (pie charts, flow charts). Streamlines chart creation, eliminates third-party tools, saves time generating visual aids directly in articles.

---

## Prerequisites

* Active Eddy AI content suite subscription
* Enabled AI writer suite in Document360 account
* Text/table must be within article main body (not comments or captions)

> **NOTE**: [Supported languages](/help/docs/ai-writer-suite#multilingual-support-for-eddy-ai-writer-suite)

---

## Creating Charts from Text

1. In Advanced WYSIWYG editor, highlight content for chart conversion
2. Click Eddy AI option in floating bubble menu, select **Generate**
3. Choose chart type: Pie chart, Flow chart, Table
4. System creates chart from highlighted text. Regenerate up to 10 times if unsatisfactory
5. Replace selected text or insert chart below as image

> **NOTE**: Error message "No results found. Please revise content or add more context" appears if generation fails. Dismiss by clicking elsewhere or close button.

---

## Creating Charts from Tables

1. Highlight table for conversion
2. Click Eddy AI option in floating bubble menu, select **Generate**
3. Choose chart type: Pie chart, Flow chart, Table
4. System creates chart. Regenerate up to 10 times if needed
5. Replace table or insert chart below as image

---

## Customizing Charts

Edit appearance using Document360 image editing options:

* **Alignment and positioning**: Adjust via bubble menu
* **Edit chart**: Crop, resize, annotate through editor options

> **NOTE**: Charts cannot be directly edited once inserted. Undo action, update content, regenerate different result, or try different chart type.

* **Undo option**: Use Ctrl+Z to restore original content if replacing with unsatisfactory chart

---

## Supported Chart Types

* **Pie charts**
  * **Use case**: Show distribution of parts within whole. Visualize proportions, categories, percentages
  * **Example**: Display task completion percentages by team members

* **Flow charts**
  * **Use case**: Map processes, workflows, decision sequences. Illustrate step-by-step procedures
  * **Example**: Outline document approval process or user onboarding workflow

* **Tables**
  * **Use case**: Present structured data for comparison. Display datasets, comparisons, metrics
  * **Example**: Compare product features or user feedback across categories

---

## File Naming Convention

Generated charts follow standardized naming: AI-generated context plus chart type. Example: **sales_data_pie_chart.png**

---

## FAQs

#### Can I edit a generated chart?

No direct editing. Regenerate with updated content or different chart type.

#### What causes chart generation failure and how to fix?

Failures from:
1. Insufficient/incomplete data
2. Unsupported content (comments, captions)
3. Formatting issues or data limits

Fix by providing structured lists, numeric data, or logical groupings (region, product type). Revise content and retry.

#### Where are generated charts saved?

Final charts saved in Document360 Drive for reuse. Located in **Images** > **Documentation**

#### How many regeneration attempts allowed?

Up to 10 times including chart type switching.

#### Are all chart versions saved?

No, only final inserted chart saved in Drive. Regeneration versions discarded unless inserted.

#### Is undo available after replacing content with chart?

Yes, use Ctrl+Z to restore original content.

#### Does AI Chart generator consume Eddy AI credits?

Yes, each generation/regeneration deducts 1 credit from monthly allowance.

---

## AI Alt Text Generator

**Plans supporting feature**: Professional, Business, Enterprise

| Professional | Business | Enterprise |
| --- | --- | --- |
| ✓ | ✓ | ✓ |

> **NOTE**: Legacy plan users require Eddy AI content suite add-on purchase.

---

## Alt Text Importance

Writing alt text improves accessibility and discoverability:

* Appears when images fail to load
* Assists visually impaired users with screen readers
* 20% of Google searches are image-based
* Optimized alt text enhances user experience, accessibility, search rankings

Document360's Eddy AI alt text generation suggests concise, accessible descriptions automatically. Example: **Document360's settings dashboard with configuration options**.

Combines accessibility with search optimization for impactful visual content delivery.

> **NOTE**:
> * Enabled by default if AI writer enabled
> * 5,000 alt texts monthly limit
> * Supports images <20MB in JPEG, JPG, PNG, WEBP formats
> * English language only
> * Accuracy limitations with panorama, fisheye, monochrome images
> * [Supported languages](/help/docs/ai-writer-suite#multilingual-support-for-eddy-ai-writer-suite)

---

## Generating AI Alt Text in Advanced WYSIWYG Editor

1. Navigate to article in Advanced WYSIWYG editor
2. Use `/image` slash command or **Insert > Image**

Methods:
* **Upload from device**: Eddy AI generates alt text automatically
* **Choose from Drive**: 
  * Existing Drive alt text persists
  * Update/regenerate by clicking image, selecting Alt text icon
* **Drag and drop**: Eddy AI generates alt text automatically
* **External URL**: Enter URL. Eddy AI generates alt text automatically

3. To regenerate: Remove existing text, click **Generate**
4. For multiple images: Eddy AI generates for all. Regenerate individually
5. Review/edit generated alt text
6. Click **Insert** to add image to article

> **NOTE**: See [Inserting images in Advanced WYSIWYG editor](https://docs.document360.com/docs/adding-images-to-articles#inserting-an-image-advanced-wysiwyg-editor)

---

## Generating AI Alt Text While Copy-Pasting Images

1. Drag/drop or paste image into Advanced WYSIWYG editor
2. Click pasted image for floating menu
3. Select **Alt text** icon
4. In **Image alt text** field:
   * Enter manually
   * Click **Generate** for Eddy AI suggestion
5. Click save icon

---

## Generating AI Alt Text While Uploading to Drive

1. During image upload:
   * Enter alt text manually
   * Click **Generate** for Eddy AI suggestion

2. For multiple images:
   * Click **Generate** next to each image individually
   * Click **Generate for all images** for bulk processing

---

## Generating AI Alt Text for Uploaded Drive Images

1. Navigate to **Drive** in Knowledge base portal
2. Click desired image for **File details** panel
3. In **Alt text** section:
   * Click **Generate** for Eddy AI alt text
   * To regenerate: Remove existing text, click **Generate** again
4. Click **Update** to save changes## Try This Feature

Explore this feature with an interactive demo below and see how it works in real time.

---

## Frequently Asked Questions

### How many AI alt texts can I generate per month?

You can generate up to 5,000 alt texts per month per project.

### Is the AI alt text generation feature enabled by default?

Yes, this feature is enabled by default if the AI writer is enabled.

### Can I review and edit the generated AI alt text?

Yes, you can review and edit the generated alt text before accepting it.

### How do I generate AI alt text when uploading an image to Drive?

When uploading an image to Drive, click the **Generate** button next to the alt text field to create AI-generated alt text.

### How do I regenerate AI alt text for an image?

To regenerate alt text, delete the existing alt text. The **Generate** button will reappear for Eddy AI regeneration.

### What happens if the Generate button is disabled?

If the **Generate** button is disabled, your monthly AI credit balance has been exhausted. Contact your admin or Document360 support.

### What happens if I try to upload multiple images but don't have enough credits?

If your available credit balance is insufficient for all images in a single upload, the **Generate all** button will be disabled.

For example, if you upload 10 images but only have 5 credits, the **Generate all** option will not be available. However, you can manually select up to 5 images (or as many as your credits allow) and click **Generate** to create alt text for the selected images.

### Can AI generate alt text for all image formats?

AI can only generate alt text for images smaller than 20 MB in JPEG, JPG, PNG, and WEBP formats.

### What if I copy-paste an image in an article? How can I add alt text?

If the article is in Advanced WYSIWYG editor, you can generate AI alt text for the image. Click the pasted image in the article to open a floating menu. Click the **Alt Text** icon, then **Generate** to create alt text. Click the save icon to confirm.

### Are KB customization images included in the alt text generation count in Drive?

No, only images from published articles with dependencies, as well as those from templates, snippets, and glossary, are counted.

---

## AI Search Suite

### Plans Supporting AI Search Suite

| Professional | Business | Enterprise |
|--------------|----------|-----------|
|              |          |           |

The AI search suite enhances user experience by integrating AI-powered tools that streamline search and content discovery. The suite includes three key features: Ask Eddy AI assistive search, Ask Eddy AI API, and an AI article summarizer, all designed to improve knowledge base navigation and content summarization.

---

## Features in the AI Search Suite

1. [**Ask Eddy AI assistive search**](/help/docs/ai-assistive-search-ask-eddy)

   This feature provides intelligent search, allowing users to ask questions directly and receive relevant, AI-curated answers. Machine learning enhances accuracy and speed of content retrieval, making knowledge base navigation more efficient.

2. [**Ask Eddy AI API**](/help/docs/ask-eddy-ai-api)

   This API provides a flexible, customizable solution, allowing seamless integration of GenAI search directly into your product's UI. Integration enables users to access Ask Eddy without navigating through product documentation, providing a streamlined experience.

3. [**AI article summarizer**](/help/docs/ai-article-summarizer)

   The AI article summarizer is integrated into the Knowledge base site to help users quickly get the gist of lengthy documents. This tool scans articles and condenses them into shorter summaries, providing key takeaways without reading the entire content.

4. [**Text to voice functionality**](/help/docs/text-to-voice-functionality)

   The text-to-voice feature allows users to listen to articles instead of reading them, saving time. This functionality is beneficial for multitasking, allowing users to absorb information while performing other activities.

---

## Multilingual Support for Eddy AI Search Suite

The Eddy AI search suite integrates with the Knowledge base site, offering support for multiple languages.

In addition to English (en, en-US, en-GB, en-AU), Eddy AI search suite supports 15 other languages: French (fr), Spanish (es), German (de), Norwegian (no), Dutch (nl), Portuguese (pt), Swedish (sv), Italian (it), Korean (ko), Finnish (fi), Polish (pl), Arabic (ar), Hebrew (he), Danish (da), and Brazilian Portuguese (pt-br).

If a workspace is configured with a language not supported by Eddy AI, such as Chinese, the search suite features will not be available for that workspace.

---

## Plan Availability and Usage Limits

1. **Ask Eddy search**: Included with 2,000 credits per month for the **Business** plan and 5,000 credits per month for the **Enterprise** plan. Each search query consumes 1 credit. Tailored for businesses with high AI-driven search needs. Contact support to purchase additional credits.

2. **Ask Eddy AI API**: Included with 2,000 credits per month for the **Business** plan and 5,000 credits per month for the **Enterprise** plan. Each API call consumes 1 credit. Enables enterprises to scale AI-powered search functionality seamlessly.

3. **AI article summarizer**: Included with 1,000 credits per month for **Business** and **Enterprise** plans. Each summarization task consumes 1 credit. Enhances content summarization efficiency for improved workflow management.

The AI search suite's flexible credit system ensures businesses can tailor usage to specific needs, providing scalable solutions for growing AI-enhanced search and content management demands. For more pricing information, click [here](https://document360.com/pricing/).

---

## AI Assistive Search (Ask Eddy AI)

### Plans Supporting AI Assistive Search

| Professional | Business | Enterprise |
|--------------|----------|-----------|
|              |          |           |

Ask Eddy AI is available on your home page and Knowledge base site's search bar. This AI assistant provides contextual answers to reader queries and prompts, helping users avoid searching through multiple articles.

> **NOTE**
> 
> * By default, Eddy AI assistive search retrieves answers from the main workspace. To access information from different workspaces, switch using the filter on your knowledge base site.
> * After updating published articles, Eddy AI assistive search takes approximately 15 minutes to fetch updated information.
> * For supported languages, [click here](/help/docs/ai-search-suite#multilingual-support-for-eddy-ai-search-suite).

Ask Eddy AI extracts all information from your knowledge base, including textual content, code blocks, tables, content reuse elements, and LaTeX.

---

## Enable Ask Eddy AI for Your Knowledge Base Site

1. Navigate to **Settings** > **AI features** > **Eddy AI** in the Knowledge base portal.
2. Turn on the **AI assistive search** toggle.

Eddy AI begins indexing your Knowledge base content. Once complete, the Ask Eddy AI button appears on your Knowledge base site search bar and home page.

* The **KB site** checkbox enables Eddy AI for searches on the Knowledge base site (default selection).
* The **KB widgets & extensions** checkbox enables Eddy AI for widgets and third-party tool integrations.
* The **Public API** checkbox activates Eddy AI for all API endpoints using a single API token.

---

## Accessing Ask Eddy AI

> **For your information**
> 
> Conversational Eddy AI is available exclusively in **KB site 2.0**. To explore KB site 2.0 without impacting your existing Knowledge base, go to **Settings** > **Customize site**. For details, read the [KB site 2.0 migration](/help/docs/kb-site-20-migration) article.

1. Click the **Search bar** or press `Ctrl + K` on the Knowledge base site.
2. Start typing keywords. General search results appear.

> **NOTE**
> 
> If Ask Eddy AI is not enabled, only the standard search bar is available.

3. Press Enter. Ask Eddy AI generates results with source articles.
4. Click the **Copy** icon to copy generated content.
5. Provide feedback using the **Like** or **Dislike** icons.
6. Click **Source articles** to reference articles used by Eddy AI.

Source URLs are listed and numbered in the **Source articles** section. Numbers correspond to AI response citations for identification.

7. Hover over numbers to see additional information. For external sources, view webpage title and article description. Click the number or **Open in new tab** icon to view the source article.
8. Click desired source articles to open them in new tabs.

Eddy AI provides answers in the language of the question.

9. Choose workspace or all workspaces from filter dropdown to fetch results.

> **NOTE**
> 
> * Filtering workspaces during conversation resets generated results.
> * Eddy's response is contextual, based on the last five queries.

10. After first query and answer, click **Continue conversation with Eddy AI** text field to enter next query. Press Enter or click **Send** icon.

---

## Customize Eddy AI Localization Variables

1. Navigate to **Settings** > **Localization & Workspaces** in the Knowledge base portal.
2. Go to the **Localization variables** tab.
3. In the **Eddy AI** accordion, update variable values according to your desired language.

---

## Integrating Eddy AI in KB Widget with Multilingual Support

Access Eddy AI within your knowledge base as a widget in various languages: English (en-US, en-GB), French (fr), Spanish (es), German (de), Norwegian (no), Dutch (nl), Portuguese (pt), Swedish (sv), Italian (it), Korean (ko), Finnish (fi), Polish (pl), Arabic (ar), Hebrew (he), Danish (da). This ensures seamless user experience.

> For more information, read [Integrating Eddy AI in KB widget](/help/docs/knowledge-base-widget-getting-started).

---

## Enabling Eddy AI Credits Notification

Configure notifications for Ask Eddy AI credit balance:

1. Navigate to **Settings** > **Knowledge base portal** > **Notifications**.
2. Go to the **Notification mapping** tab.
3. In **Eddy AI notifications** accordion, turn on the **Credit usage alert** toggle.

Once enabled, Document360 sends reminders when credit balance drops to 20%, 10% of total allotted balance, and when balance expires.

---

## Data Privacy and Security

Document360's "Ask Eddy AI" utilizes OpenAI APIs in backend operations. Data transmits to OpenAI through their APIs. OpenAI's privacy policy prohibits using customer-submitted data via our API for training OpenAI models or enhancing OpenAI's service offerings. Both Document360 and OpenAI comply with GDPR regulations. Document360 is SOC 2 compliant.

OpenAI policy states: "OpenAI will not use data submitted by customers via our API to train OpenAI models or improve OpenAI's service offerings."

> Read complete [OpenAI API data usage policies](https://openai.com/policies/api-data-usage-policies).  
> For Document360 data policy queries, read our [Privacy policy](https://document360.com/privacy/).

---

## Frequently Asked Questions

### What data does Ask Eddy AI collect?

Ask Eddy AI does not collect Personal Identifiable Information (PII). We collect prompts (questions), Eddy AI's responses, citation articles, and feedback. This data is available in Eddy AI Search Analytics.

### What technology does Ask Eddy AI use?

Ask Eddy AI uses OpenAI APIs for functionality. Data sent via their APIs will not be used to train GPT models.

### Does Ask Eddy AI use external sources?

No, Ask Eddy AI relies solely on your knowledge base content. If insufficient information exists, Eddy AI responds with "I do not know."

### How do readers use AI-powered assistive search?

Knowledge base site users click the Ask Eddy AI button. A prompt input popup opens. They type queries to get tailored answers.

### How does Ask Eddy AI protect data?

We use industry-standard security practices, reputable subprocessors with SOC 2 compliance, and provide controls for organizations to meet data protection requirements.

### What does credit mean for Ask Eddy AI?

One credit equals one question (prompt). Standard offering includes 1,000 questions per month. Contact support or your customer success manager for additional credits.

### How does Ask Eddy AI work on private knowledge base?

Ask Eddy AI uses your access controls to generate appropriate responses based on user permissions. If users lack access to specific articles, Eddy AI responds with "I do not know."

### How quickly does Eddy AI reflect new content?

After updating articles, it takes around 15 minutes for Eddy AI responses to align with changes. Similarly, deleted articles take about 15 minutes to stop appearing in responses.

### Does Ask Eddy AI search within attachments?

Currently, Ask Eddy AI does not search within attachments. Content within PDF and Word documents is not indexed. This functionality will be supported in future releases.

### Does Eddy AI read Excel file data?

No, Eddy AI does not fetch or read information from files uploaded in articles.

### What happens if workspace language is French but questions are in English?

Eddy AI responds in English, matching the query language regardless of workspace language.

> **NOTE**
> 
> Eddy AI responds in the same language as the query.

### How do I check Eddy AI credit balance?

Admins/owners view remaining credits from **Settings** > **AI features** > **Eddy AI**.

Document360 sends reminders when credit balance drops to 20%, 10% of total allotted balance, and when balance expires.

### How do I purchase additional credits?

Navigate to **Settings** > **AI features** > **Eddy AI** and use the "Buy more" option. Trial version users cannot purchase add-ons.

### How do I configure email domain for Eddy AI notifications?

To receive Eddy AI credit notifications via email, configure your email domain: **Settings** > **Knowledge base portal** > **Notifications** > **Email domain**. Default sender is [support@document360.com](mailto:support@document360.com) if not configured.

### What notification channels support Eddy AI credits?

Receive Eddy AI credits notifications in English from webhook, Microsoft Teams, Slack, and email (if configured). For configuration details, read [Notifications](/help/docs/notifications).

### How do I configure email address for Eddy AI notifications?

After enabling Eddy AI credits notification toggle:

1. In **Notification channels** tab, click **New channel** and select SMTP.
2. Click **Next**.
3. Enter channel name and desired email address.
4. Add CC and BCC if required.

For more information, read [SMTP notification channel](/help/docs/smtp-email-notification-channel).

### Why is Eddy AI not available in API documentation?

Eddy AI is available only on Knowledge base site, not implemented for API documentation.

### Can Eddy AI answer questions requiring user login or involving restricted articles?

No, Eddy AI answers based on user's access control and permissions. If logged-in users lack access to specific articles, Eddy AI responds with *No results found*.

### Why is Ask Eddy AI button greyed out?

The Ask Eddy AI button becomes disabled when Eddy AI credit limit is reached. Renew credits to continue using this feature.

---

## AI Dynamic Related Articles Recommendation

### Plans Supporting AI Dynamic Related Articles Recommendation

| Professional | Business | Enterprise |
|--------------|----------|-----------|
|              |          |           |

This feature automatically links relevant articles across all content, ensuring readers find additional information related to their queries. Improves navigation and overall user experience. Apply related articles to your entire knowledge base in one instance.

> **NOTE**
> 
> For supported languages, [click here](/help/docs/ai-search-suite#multilingual-support-for-eddy-ai-search-suite).

---

## Dynamic Related Articles Recommendation

> **For Your Information**
> 
> Available exclusively in **KB site 2.0**. To explore KB site 2.0 without impacting existing Knowledge base, go to **Settings** > **Customize site**. For details, read [KB site 2.0 migration](/help/docs/kb-site-20-migration).

Add related articles to all Knowledge base site articles:

1. Navigate to **Settings** > **AI features** > **Eddy AI**.
2. Turn on **Dynamic related article recommendation** toggle.

Eddy AI automatically adds related articles to all knowledge base site articles.

Additionally, manually add related articles:

1. Navigate to **Documentation** and select target article.
2. Click **More** option and select **Related articles**.
3. Click Ask Eddy AI. Eddy AI recommends related articles.
4. Click **Add** icon to include desired articles.
5. Turn on **Auto relate this article to all related articles** toggle if needed.
6. Click **Save**.

> **NOTE**
> 
> When **Auto relate this article to all related articles** is enabled, if Article-A is added as related to Article-B, then Article-B appears as related in Article-A. Save time using this toggle.

> **NOTE**
> 
> If **Dynamic related article recommendation** is not enabled:
> 
> * Users with permission see banner with **Enable recommendations** option, redirecting to Eddy AI settings.
> * Users without permission see **I'm Interested** button, emailing team account owner about feature interest.

---

## Knowledge Base Site View

After enabling Dynamic related article recommendation, all Eddy AI recommended articles display relevant related articles marked with an icon next to article names.

> **NOTE**
> 
> Eddy AI recommends up to three articles. If manually curated articles match Eddy's recommendations, number may vary.

---

## Frequently Asked Questions

### What is the Dynamic related articles recommendation feature?

Automatically links relevant articles across all knowledge base content, enhancing navigation and user experience.

### How do I enable Dynamic related articles recommendation?

Navigate to **Settings** > **AI features** > **Eddy AI** and turn on Dynamic related article recommendation toggle.

### Why are related articles not appearing for certain articles?

Feature uses algorithm to assess article relevance. Only articles meeting specific relevance threshold appear as related. If no similar articles found, recommendations cannot generate.

### How do I identify Eddy AI recommended articles?

Eddy AI recommended articles are marked with an icon next to article names. Manually added or Ask Eddy AI related articles do not show this icon.

---

## AI Chatbot

### Plans Supporting AI Chatbot

| Professional | Business | Enterprise |
|--------------|----------|-----------|
|              |          |           |

> **NOTE**
> 
> Legacy plan users need AI assistive search add-on for this feature.

Interact with Eddy AI Chatbot to get answers without searching Knowledge base articles. Helps find relevant information faster and easier.

> **NOTE**
> 
> * Available exclusively for KB site 2.0 projects.
> * For supported languages, [click here](/help/docs/ai-search-suite#multilingual-support-for-eddy-ai-search-suite).

---

## Configuring Eddy AI Chatbot

Enable Eddy AI in Knowledge base widget:

1. Navigate to **Settings** > **AI features** > **Eddy AI**.
2. Turn on **AI assistive search** toggle.
3. Select **KB widgets & extensions** checkbox.

Configure Eddy AI Chatbot:

1. Navigate to **Widget** in Knowledge base portal.
2. Click **Add widget**.
3. Enter desired name (up to 30 characters) in **Widget name** field.

### Connection

4. In **Widget JavaScript** accordion, find **Widget key** and JavaScript code.
5. Click **Regenerate** icon to regenerate Widget key.
6. In **Connect domains** accordion, find domains where widget displays.
7. In **JWT** accordion, implement authentication configuration using JWT for secure private and mixed projects.

> **NOTE**
> 
> For more information, read [Securing Chatbot authentication using JWT](/help/docs/securing-chatbot-authentication-using-jwt).

### Customize Experience

8. Select **Chatbot** as widget type.

> **NOTE**
> 
> Widget type cannot be changed after selection and save.

9. In **Style widget** accordion, customize chatbot styles and themes.

> **NOTE**
> 
> For more information, read [Styling the Eddy AI Chatbot](/help/docs/styling-the-chatbot).

10. In **Content access** accordion, select content level access: **Project**, **Workspace**, or **Category**.

### Set Controls

11. In **Widget security** accordion, enter desired domain for exclusive widget display.

> **NOTE**
> 
> * Any project member installing chatbot on different domain must add domain to Widget security list.
> * Without domains in list, chatbot integrates into any SaaS application or public website.
> * www. not considered part of domain. Add only what follows www. in URL.
> 
> Example: [document360.com](http://document360.com)

12. Preview chatbot on right side of page.
13. Click **Save**.

Display created chatbot on Knowledge base site:

1. From widget page, hover over desired widget and click **Copy script** icon.
2. Go to **Settings** > **Knowledge base site** > **Integrations**.
3. Scroll to **Custom HTML** blade and click **Add**.

4. Enter desired description.
5. Select intended option in **Insert code** field.
6. Paste copied script and click **Add**.

Chatbot now appears on Knowledge base site.

> **NOTE**
> 
> To integrate into custom site, paste copied script into appropriate HTML file.

---

## Accessing Eddy AI Chatbot in Site

To access and interact:

1. Click chatbot icon to open.
2. Type question and click **Send** icon or press **Enter**.

Eddy AI retrieves information from Knowledge base to answer queries.

3. Hover over answers to **Copy**, **Like**, or **Dislike** responses.
4. Click **Clear** icon to clear conversation.

---

## Frequently Asked Questions

### How do I view Eddy AI Chatbot feedback?

To view feedback:

1. Navigate to **Analytics** > **Eddy AI**.
2. Filter desired chatbot using **Application** filter.

In **Feedback** section, see number of likes and dislikes received.

### What's the difference between Widget and Eddy AI Chatbot?

**Widget** allows manual navigation through articles or search functions. **Eddy AI Chatbot** engages users in conversation, offering immediate direct answers without manual navigation.

---

## Securing Chatbot Authentication Using JWT

### Plans Supporting AI Chatbot

| Professional | Business | Enterprise |
|--------------|----------|-----------|
|              |          |           |

JSON Web Token (JWT) is an open standard for securely transmitting information between parties as JSON objects. Enables authentication and information exchange with verified, trusted data. Implementing JWT for Eddy AI Chatbot creates secure environment for private and mixed projects, protecting sensitive information from unauthorized access.

> **NOTE**
> 
> For supported languages, [click here](/help/docs/ai-search-suite#multilingual-support-for-eddy-ai-search-suite).

Implement authentication configuration using JWT for secure private and mixed projects:

1. Navigate to Knowledge base widget.
2. Click **Add widget** to create new widget.

Alternatively, hover over desired widget and click **Edit** icon to modify existing widget.

3. Select widget type as **Chatbot** to configure JWT.
4. In **Configure & connect** tab, go to **JWT** accordion and **enable** JWT toggle.

5. **Client ID:** Project's ID.
6. **Widget ID:** Unique ID for multiple widgets.
7. **Token endpoint:** HTTP endpoint for obtaining access token using authorization code.
8. **Client secret:** Click **Regenerate** to generate. Save for future use as applies to all future JWT-enabled widgets.

> **NOTE**
> 
> **Client Secret** required for all future JWT-enabled widgets. Not stored within Document360. Keep securely.

9. **Authorize URL:** Paste authorized URL from knowledge base widget webpage.

10. Click **Save**.

Embed authorized URL within code and paste into **Script section** of webpage to implement secure, authenticated Chatbot. Prevents unauthorized third-party access. Test thoroughly after configuration.

> **NOTE**
> 
> For more information on implementing auth endpoint, read [Managing the Knowledge base widget](/help/docs/managing-the-knowledge-base-widget).

---

## Frequently Asked Questions

### What should I check for authentication issues?

Ensure:
* Client secret and token endpoint correctly configured
* User authenticated before requesting endpoint

### What are common JWT pitfalls?

* **Failing to save client secret** after regeneration leads to authentication failures
* **Misconfiguring token endpoint** prevents successful token retrieval

### What if I lose my client secret?

Regenerate new client secret and update configuration accordingly.

### How do I verify JWT authentication works?

Test authentication flow by attempting to access Eddy AI Chatbot and checking for correct access token response.

---

## Styling the Chatbot

### Plans Supporting AI Chatbot

| Professional | Business | Enterprise |
|--------------|----------|-----------|
|              |          |           |

Customizing Eddy AI chatbot colors and icons to match brand creates seamless experience, making it easier for users to engage and get timely information.

> **NOTE**
> 
> For supported languages, [click here](/help/docs/ai-search-suite#multilingual-support-for-eddy-ai-search-suite).

---

## Styling Eddy AI Chatbot

To style the chatbot:

1. Navigate to Knowledge base widget.
2. Hover over desired widget and click **Edit** icon.
3. In **Configure & connect** tab, expand **Style widget** accordion.

### Widget Color

4. Click **Change icon** to replace with image or select from available icons.

Choose any icon from **Icon set** tab.  
**OR**  
Click **Insert image** tab:
* Paste/type image URL and click **Insert**
* Upload image from Drive and select file

> **NOTE**
> 
> Click **Default** to revert to default icon and color.

5. Click **Change color** to update chatbot background color.

Select color using picker or enter hex, RGB, or HSL code for specific values.

### Widget Position

6. Select **Left** or **Right** to position widget icon.
7. Enter pixel values in **Side spacing** and **Bottom spacing** fields to adjust placement.

### Hide Widget

8. Turn on **Hide widget** toggle to hide on site.
9. Click **Save** after changes.

> **NOTE**
> 
> **Autosave** enabled when navigating between widget tabs, automatically saving changes.

---

## Adding External Sources for AI Assistive Search

### Plans Supporting External Sources in AI Assistive Search

| Professional | Business | Enterprise |
|--------------|----------|-----------|
|              |          |           |

> **NOTE**
> 
> Legacy plan users need AI assistive search add-on.

Configure AI assistive search to retrieve information from multiple external sources, simplifying process and delivering comprehensive answers.

Imagine a support agent for software company using Document360 to resolve customer issues. Previously, they could only search internal Knowledge base articles. With this feature, agent pulls information from external resources like company's public documentation site, blogs, and product release notes. Helps deliver accurate comprehensive answers quickly without leaving platform, improving response time and customer satisfaction.

> **NOTE**
> 
> For supported languages, [click here](/help/docs/ai-search-suite#multilingual-support-for-eddy-ai-search-suite).

---

## Adding External Sources

To access and manage external sources:

1. Navigate to **Settings** > **AI features** > **Manage sources**.
2. Click **Add new** to add external source.

3. Choose source type: **Webpage** or **Sitemap**.

> **NOTE**
> 
> Add up to 50 **Webpages** and 1 **Sitemap**.

4. Enter source name.
5. Enter valid URL.

> **NOTE**
> 
> Webpages must be HTML5 format with `<article>` or `<main>` tags.

6. Click **Add source**.

---

## Manage Source Overview Page

**Manage source** page lists all indexed external sources.

Options available:

1. **Content access:** Restrict Eddy AI access to specific workspace and language. Options: **All** and **Allow selected**.
2. **Filter:** Filter sources by type: **All**, **Sitemap**, **Webpage**, or **Failed Sources**. Failed sources display sources with errors.
3. **Sync:** Sources sync every 24 hours. Click **Sync** to manually sync up to four times per day.
4. **Add new:** Click to add new source for indexing.
5. **Search:** Use search bar to locate sources by name.
6. **Type:** Displays source type: **Webpage** or **Sitemap**.
7. **Last sync:** Shows last sync date. Hover to view exact time.
8. **Status:** Toggle to enable/disable source. If disabled, Eddy AI stops fetching from that source.
9. **Error:** Denotes external source URLs with encountered errors.
10. **Delete:** Click **Delete** icon to remove source.
11. **Edit:** Click **Edit** to modify source name or URL.

---

## Enabling Eddy AI for Specific Workspaces, Languages, and Categories

Configure Eddy AI to selectively enable or restrict support for specific workspaces, languages, and categories.

1. Click **All** dropdown with two selections:
   * **All** - lists all workspaces
   * **Allow selected** - select workspace, languages, and categories

If **Allow selected**, **Manage workspace & category popup** appears.

2. Select workspace, languages, and categories for assistive search data access.

Manage button appears with Allow selected dropdown selection.

3. Click **Manage** to select/manage sources and click **Save**. Save button enabled only when changes made.

Modification confirmation popup shows 'AI search sources updated'.

4. Click **Cancel** or hit Esc to close popup.

> **NOTE**
> 
> Switching from **Allow selected** to **All** and back retains previous selections.

Feature applies across all AI Assistive Search enabled areas.

---

## Handling Errors in External Sources

If errors occur (unsupported HTML formats, languages, HTTPS issues), Eddy AI stops fetching from that page until resolved. For sitemap errors, Eddy AI continues fetching from remaining valid URLs.

1. Click **Error** icon next to status toggle.

Edit panel displays URLs and their errors.

2. Hover over URL and click **Open site** icon to view external source.
3. Click **Remove** to delete specific sitemap URL.
4. Click **Remove all** to delete all URLs with errors.

> **NOTE**
> 
> * If webpage has bot detection enabled, Eddy AI cannot crawl content. Source not added, forbidden error occurs.
> * Eddy AI supports only Server-Side Rendered (SSR) webpages. Client-side rendered pages may not index properly, leading to empty results. Use server-rendered content for accurate embedding.

---

## Knowledge Base Site View

When Eddy AI fetches from external sources:

1. Source URLs list and number in **Source articles** section. Same numbers used in AI response for identification.
2. Hover over numbers to find additional information. For external sources, view webpage title and article description. Click number or **Open in new tab** icon to view source article.
3. Click desired source articles to open in new tabs.

---

## Troubleshooting

### Unsupported Format While Adding Sitemap

**Error:** Unsupported format

Occurs when sitemap contains nested sitemaps with `<sitemapindex>` tag, exceeds 1 MB file size limit, or is unsupported format.

**Steps to resolve:**
* Use direct sitemap URL without `<sitemapindex>` tag (nested sitemaps not supported)
* Ensure sitemap file size is less than 1 MB
* Verify sitemap is supported format (XML)

### Forbidden Error While Adding Webpage

**Error:** Forbidden

Occurs when webpage source has bot detection or security mechanisms preventing Eddy AI crawling.

**Steps to resolve:**
* Check if source link has bot detection mechanisms. Contact website administrator for crawler access if needed
* Use different source without crawling restrictions

### Only HTML5 Documents with `<article>` or `<main>` Tags Supported

**Error:** Only HTML5 documents with `<article>` or `<main>` tags

Occurs when webpage doesn't meet HTML5 format or lacks required `<article>` or `<main>` tags.

**Steps to resolve:**
* **Verify HTML5 format:** Check doctype declaration. HTML5 pages should have `<!DOCTYPE html>`
* **Check required tags:** View page source and ensure contains `<article>` or `<main>` tags
* **Update webpage:** If not HTML5 format or lacks tags, update page to meet requirements

---

## Frequently Asked Questions

### How do I perform manual sync for external sources?

1. Navigate to **Settings** > **AI features** > **Manage sources**.
2. Click **Sync** at top of **Manage source** page.
3. Manually sync external sources up to four times per day.

> **NOTE**
> 
> System automatically syncs every 24 hours.

### How do I delete external sources?

1. Navigate to **Settings** > **AI features** > **Manage sources**.
2. Hover over desired source and click **Delete** icon.
3. To delete multiple, select checkboxes and click **Delete** at top.

### How do I view analytics for external sources?

1. Navigate to **Analytics** > **Eddy AI**.
2. In **Most referenced articles** section, external sources list alongside Knowledge base articles.

### Can I temporarily disable external sources?

Yes, turn off **Status** toggle next to external sources. Eddy AI stops fetching until re-enabled.

---

## AI Article Summarizer

### Plans Supporting AI Article Summarizer

| Professional | Business | Enterprise |
|--------------|----------|-----------|
|              |          |           |

**Article summarizer** is one of Document360's AI-powered features. Useful when readers want to save time by not reading lengthy articles. Instead, read condensed article information as **summary**.

Document360 uses natural language processing (NLP) to locate vital information in article content while maintaining original context for optimal summary.

> **NOTE**
> 
> For supported languages, [click here](/help/docs/ai-search-suite#multilingual-support-for-eddy-ai-search-suite).

### Prerequisites

* **Preprocessed article content** must exceed **250 words**
* AI feature supported in subscription plan

> **NOTE**
> 
> Article summary available (depending on subscription plan) in new/existing articles published on or after May 27, 2023.

---

## Enabling Article Summarizer

1. Navigate to **Settings** > **AI Features** > **Eddy AI**.
2. Turn on **Article summarizer** toggle.

When enabled, **Summary** appears at article top in Knowledge base site. Click 'Summary' to expand and read.

---

## Frequently Asked Questions

### What is 'Preprocess' or 'Preprocessed words'?

**Preprocess** refers to filtering specific article/category elements. Elements not counted for meta description generation:

* HTML tags
* Images
* URLs/links
* Code blocks

If article word count shows 220 words at Document360 editor bottom, this includes HTML tags, links, code blocks. Preprocessed count is less. Ensure preprocessed content exceeds 250 words for AI summarizer.

### Data Privacy

Customer Knowledge base data is sensitive. As feature uses OpenAI integration, we adhere to OpenAI privacy policies. Policy states: "OpenAI will not use data submitted by customers via our API to train models or improve service offerings."

> Read complete [OpenAI API data usage policies](https://openai.com/policies/api-data-usage-policies)  
> For Document360 data policy queries, read our [Privacy policy](https://document360.com/privacy/)

---

## Ask Eddy AI API

### Plans Supporting Ask Eddy AI API

| Professional | Business | Enterprise |
|--------------|----------|-----------|
|              |          |           |

Eddy AI Public API enhances Eddy AI search functionality and flexibility. Particularly useful for businesses deeply integrating AI-driven search into their platforms. Embedding Eddy AI into products provides users powerful search without visiting documentation site.

API offers greater UI customization flexibility, allowing tailoring of color, naming, and placement to align with brand and user experience. With seamless integration, Eddy AI becomes natural product extension, enhancing user interactions and improving search efficiency. Exposing API endpoints incorporates them into platforms, effortlessly extracting answers and building customized search experience.

> **NOTE**
> 
> For supported languages, [click here](/help/docs/ai-search-suite#multilingual-support-for-eddy-ai-search-suite).

---

## Using the Public API

1. Navigate to Settings > **AI Features** > **Eddy AI**.
2. In **AI assistive search**, select **Public API** checkbox.

> **NOTE**
> 
> 1. Ensure at least one checkbox selected. Otherwise, AI assistive search toggle automatically disables.
> 2. Without Public API enabled, receive '500 response code error' or '400 API access disabled error' using Ask Eddy AI API.
> 3. Each API call reduces total credit count by one.

3. Create authorization API token.

> **NOTE**
> 
> 1. Navigate to Settings > **Knowledge Base Portal** > **API Tokens**.
> 2. Click **Create API Token**, enter token name, specify POST method.
> 3. Click **Create** and **copy** generated API token.

4. Find API structure at [API hub](https://apihub.document360.io/index.html).

---

## Try Eddy AI Public API in API Docs

1. Navigate to Document360 [API documentation](https://apidocs.document360.com/apidocs/perform-ai-assistive-search-ask-eddy-within-project-version).
2. On page right side, click **Try it** section.
3. In **Token** field, enter API token generated from Document360 project.
4. Enter desired values in **Body** section. Default request box:

   * **Prompt**: Enter question or query
   * **Version ID**: Obtain current version ID
   * **Language Code**: Specify desired language code

5. Click **Try it & see response** for generated response.

---

## Try Eddy AI Public API in Swagger

1. Navigate to Swagger [API hub](https://apihub.document360.io/index.html). Find Ask Eddy AI API under project versions.
2. In Swagger API hub top right, click **Authorize**.
3. **Available authorizations** panel appears, prompting API token entry.
4. Paste API token into **Available Authorizations** window and click **Authorize**.
5. Navigate to **Project versions** > `/v2/ProjectVersions/ask-Eddy AI` and click **Try it out**.
6. Default request box:

* **Prompt**: Enter question or query
* **Version ID**: Obtain current version ID from `/v2/ProjectVersions` endpoint
* **Language Code**: Specify desired language code

7. Click **Execute** for successful response with required information.

> **NOTE**
> 
> If receiving service unavailable message, ensure Public API enabled in settings.

---

## Frequently Asked Questions

### Why discrepancy in source articles between Ask Eddy public API and Eddy AI search?

Discrepancy occurs retrieving details using `articleID` for "Pagecategory" articles. Fields like `article_id`, `article_title`, and `article_slug` return null.

For "Pagecategory" articles, fetch details using `categoryID` instead of `articleID`. Example API response:

```
{
  "category_id": "_categoryid",
  "category_title": "Title",
  "category_slug": "slug",
  "version_name": "v1",
  "version_slug": "v1",
  "article_id": null,
  "article_title": null,
  "article_slug": null,
  "version_display_name": null
}
```

To resolve, use `categoryID` for "Pagecategory" articles when using Eddy API.

---

## Enhancing Accessibility with Read Out Loud Feature

### Plans Supporting Read Out Loud Feature

| Professional | Business | Enterprise |
|--------------|----------|-----------|
|              |          |           |

Read out loud feature allows users to listen to articles instead of reading, saving time. Beneficial for multitasking, absorbing information while performing other activities. Particularly useful for auditory learning preference or multitasking users.

Available exclusively on Knowledge Base site 2.0, enhancing engagement with flexible reading alternative.

> **NOTE**
> 
> Legacy plan customers need Enterprise plan with AI assistive search add-on.

---

## Using Read Out Loud Feature

Key highlights:
* Begins reading from article heading, continues with body content
* Does not cover article summary
* Reads alt text of images and videos. Without alt text, audio indicates presence in respective language
* **Listen** button in article header below heading. Playback updates button label to **Listening** and opens Player window

> **NOTE**
> 
> For supported languages, [click here](/help/docs/ai-search-suite#multilingual-support-for-eddy-ai-search-suite).

### Player Options

Player controls at screen bottom right:
* Play icon - start listening to content
* Pause icon - stop audio play
* Forward icon - skip ahead by ten seconds
* Backward icon - rewind by ten seconds
* Close (x) icon - close player window

### Enable or Disable Player

Enable/disable at project level:
1. Navigate to Settings > **Knowledge base site** > **Article settings**.
2. Under **Accessibility** section, turn on **Enable read out loud** toggle.

> **NOTE**
> 
> **Enable read out loud** disabled by default for trial plan customers.

---

## Frequently Asked Questions

### What content does read out loud feature cover?

Reads:
* Textual content
* Glossary
* Snippets
* Variables
* Headings (H2, H3, H4)
* Numbered lists
* Checklists
* Bullet lists
* Callouts
* Private notes
* Accordions
* FAQ
* Link text
* Emojis

Indicates presence without reading:
* Tables
* Inline code
* Code blocks
* Images
* Videos
* LaTeX
* Files attached using insert menu

### Can I choose to read article from middle?

Yes, navigate audio player using seek option.

---

## AI Premium Suite

### Plans Supporting AI Premium Suite

| Professional | Business | Enterprise |
|--------------|----------|-----------|
|              |          |           |

**AI premium suite** elevates user experience by automating key business processes and improving workflow efficiency through advanced AI-powered tools.

---

## Features in AI Premium Suite

1. [**AI-automated business glossary generation**](/help/docs/ai-glossary-generator)

Streamlines creation and management of industry-specific glossaries. Maintains consistent terminology across teams, enhances communication, ensures documentation accuracy.

> **NOTE**
> 
> Eddy AI premium suite available in English (en) only.

---

## AI Glossary Generator

### Plans Supporting AI Premium Suite

| Professional | Business | Enterprise |
|--------------|----------|-----------|
|              |          |           |

Different departments may use similar business terms with differing definitions and assumptions. This knowledge remains department-specific. Defining business terms is crucial for shared understanding, consistent data collection, and correct business logic application for reliable metrics.

Document360's AI Glossary generator helps organizations communicate and collaborate by clearing terminology ambiguity. Creates complete collection of business terms, providing clarity and shared understanding. Aids data collection, team collaboration, communication, and database design.

---

## Enabling AI Glossary Generator

1. Navigate to **Settings** > **AI Features** > **Eddy AI**.
2. Scroll to find **AI Glossary generator** option.
3. Toggle switch to enable feature.

---

## Accessing AI Glossary Generator

1. Navigate to **Documentation** > **Content tools** > **Content reuse** and select **Glossary**.
2. Click **Take action** on Eddy AI banner.

Default view shows **Open suggestion** section under **Eddy AI glossary suggestions**.

> **NOTE**
> 
> AI Glossary Generator shows suggestions only for published articles. Otherwise shows 0 suggestions.

3. Left navigation bar:
   * List of Eddy AI recommended glossary terms
   * Use **Search bar** for multiple terms
   * Use **Sort** option to organize terms

4. Top center shows term repetition count.

Example: Backup used 1 time(s) in 1 article(s).

5. **Definition** text box shows Eddy AI suggested definition. Edit using formatting tools.

> **NOTE**
> 
> Glossary definition up to 500 characters.

6. **Add to** dropdown defaults to **English**.
7. Enable **Update in articles (n)** checkbox to update glossary in articles.

> **NOTE**
> 
> Create glossary without implementing in articles by unchecking **Update in articles**.

8. Click **Show Articles** to view articles using glossary terms.

> **NOTE**
> 
> Only accessible articles display here.

9. Click **+ Add to glossary** after changes.
10. Added terms move to glossary list.
11. Click **Ignore term** to move to **Ignored suggestions** section.
12. From **Ignored suggestions**, click **Move to open list** anytime.
13. Click **Continue later** to close blade.

AI Glossary generator scan every 7 days.

---

## Using AI Glossary Generator in Advanced WYSIWYG Editor

1. Navigate to Advanced WYSIWYG editor and click **Insert**.
2. Select **Glossary**. Eddy AI provides glossary suggestions based on specific article.

> **NOTE**
> 
> In Editor, **AI Glossary generator** scan occurs every time opened. One instance scans up to first 50 terms.

3. Click **Take action** to open **Eddy AI glossary suggestions** window with Open suggestions section as default view.

---

## Shortcuts for AI Glossary Generator

Use shortcuts in **Edit glossary suggestions** window:
* ARROW keys to navigate suggestions
* ENTER to add current glossary term
* BACKSPACE to ignore current glossary term

---

## Frequently Asked Questions

### Does AI Glossary generator recognize singular and plural terms as one?

No, Document360's AI Glossary generator considers identical singular and plural terms as individual specific terms.

Example: **Team Accounts** and **Team Account** evaluated as distinguished terms.

### Does AI Glossary generator recognize synonymous terms as one?

Synonymous terms considered as individual separate terms.

Example: Routine and Daily are synonymous but considered different terms.

### How often can I rescan and why?

System recommends 7-day interval between scans, notified in UI. Quantifiable documentation content necessary for new suggestions.

### Is rescan manual or automated?

Rescan is manual process, not automated.

### What happens after rescan?

New suggestions update **open suggestions** list. Users receive email notification.

---

## How to Write GenAI Friendly Content

Structure information for improved clarity, readability, and searchability:

### 1. Use Clear and Concise Headings

* **Headings (H1, H2, H3)**: Organize content with clear descriptive headings. Helps AI understand hierarchy and structure.
* **Keyword-rich headings**: Reflect section content. Instead of "Introduction," use "Introduction to Cloud Storage Solutions."

### 2. Write Short and Focused Paragraphs

* **Keep sentences short**: Aim for 15-20 words. Avoid complex sentences confusing AI processing.
* **One idea per paragraph**: Each paragraph covers one idea for easy AI extraction.

### 3. Include Tables for Structured Data

* **Well-labeled tables**: Present structured data for easier AI scanning and interpretation. Clearly label rows and columns.
* **Consistent formatting**: Format consistently for better AI recognition (avoid merged cells or irregular formatting).

### 4. Incorporate Code Snippets Carefully

* **Clean, well-commented code**: Use standard formatting and comment key sections. AI uses comments for context understanding.
* **Appropriate syntax highlighting**: Helps AI differentiate code from regular text.

### 5. Use Bullet Points and Numbered Lists

* **Break up information**: Help organize content for easier AI breakdown and extraction.
* **Limit list length**: Keep concise (under 5-7 points) to avoid overwhelming AI and readers.

### 6. Include Descriptive Alt Text for Images

**Alt text and captions**: Always include descriptive alt text and captions for AI context processing.

### 7. Provide Clear, Contextual Links

* **Internal links**: Link to relevant internal articles using clear anchor text. Avoid "click here."
* **Anchor text**: Use descriptive anchor text informing AI of linked content ("Read more about cloud storage security best practices").

### 8. Ensure SEO Best Practices

* **Keyword optimization**: Use naturally within headings, subheadings, and content. Avoid keyword stuffing.
* **Meta descriptions**: Write clear, relevant meta descriptions with keywords for effective AI ranking.

### 9. Use Business Glossary Terms Consistently

* **Consistent terminology**: Use business glossary terms consistently throughout articles. Helps AI identify and relate key terms.
* **Define key terms**: Include brief definitions or link to business glossary for unfamiliar terms.
* **Standardize abbreviations**: Always use standardized abbreviations or acronyms from business glossary. Ensures correct AI identification.

### 10. Write for Humans First

* **Conversational tone**: AI performs better with human-friendly tone for engagement and contextual understanding.
* **Natural language**: Use natural everyday language. Avoid jargon or complex terms unless necessary. Provide definitions for technical terms.

### 11. Monitor AI-Generated Content

**Review and revise**: Always review AI tool output for quality standards and natural reading.

---

## Recommendations for Optimizing Experience as Contributor with Eddy AI

Create easily understood documentation by incorporating clear language, structured formatting, and adherence to specific guidelines:

1. **Use clear and focused language**

Express ideas straightforwardly, avoiding unnecessary complexity.

Break down complex concepts into simpler parts.

Define technical terms or provide links to detailed explanations.

2. **Structured formatting**

Use clear headings and subheadings to organize information.

Employ bullet points and numbered lists for step-by-step instructions.

Highlight key points using bold or italics for better bot parsing.

3. **Consistent terminology**

Maintain consistent terminology for understanding.

Use Document360 Glossary feature.

Avoid ambiguity with specific standardized terms.

4. **Avoid jargon overload**

Minimize industry-specific jargon unless essential.

If technical terms necessary, provide brief explanations or context.

5. **Elaborative text content**

Elaborate content and clearly specify intent.

With multimedia content, provide text explanation of conveyed message.

Break information into shorter paragraphs for better readability.

Provide explicit answers to questions in FAQ form to minimize inaccurate Eddy AI answers. AI bots hallucinate with insufficient or unclear content.

6. **Provide context and example**

Offer real-world examples illustrating technical concepts.

Provide context for reader understanding of purpose and application.

7. **Use descriptive headings**

Craft descriptive headings accurately representing content.

Headings should guide, summarizing content beneath.

Avoid repetitive heading text in same article.

8. **Test with Eddy AI**

Utilize Eddy AI to analyze content for clarity and coherence.

Make adjustments based on tool feedback.

Implementing these recommendations creates documentation comprehensible to humans and easily processed by AI and NLP bots like Eddy AI.

---

## Prompt Engineering Tips

Document360's Eddy AI provides various AI-driven functionalities streamlining content creation and enhancing knowledge base experience. Leveraging prompt engineering with Eddy AI improves accuracy, efficiency, and relevance in generating tailored content. This guide helps maximize Eddy AI capabilities when interacting with knowledge base.

---

## Best Practices for Prompt Engineering with Eddy AI

### 1. Be Clear and Specific in Prompts

More precise instructions yield better results. Instead of "brief summary," specify "Generate 100-word summary about Document360 knowledge base benefits."

For complex technical details, break into smaller manageable requests for focused relevant outputs.

### 2. Ask for Step-by-Step Instructions

Eddy AI is effective for procedural content with clear task specification. Instead of "Explain how to publish article," use "List steps to publish article in Document360, including where to click and how to configure settings."

### 3. Structure Prompts for Comparisons

Structure accordingly for content comparing features or options. "Compare key differences between Document360's private and public knowledge base setups" guides Eddy AI to generate detailed comparison.

### 4. Focus on Article Summaries

When summarizing longer articles, ask Eddy AI to create summaries based on specific sections or categories. "Summarize benefits and limitations section of article on Document360's multi-language support" generates more concise useful summaries.

### 5. Include Context for Recommendations

Context critical for generating recommendations or suggestions. Instead of "Recommend improvements," use "Recommend improvements to onboarding process in knowledge base article for new users."

---

## Recommendations for Optimizing Experience as Reader with Eddy AI

1. **Converse naturally**

Speak to Eddy AI as to human.

Example: Instead of "Search for articles on templates," try "Eddy AI, find me articles explaining Document360 templates."

2. **Provide detailed context**

Enhance understanding by setting stage and providing context.

Example: Instead of "Errors in documentation," try "Eddy AI, help me identify and resolve errors in Document360 user guide."

3. **Customize persona**

Instruct Eddy AI to adopt specific identity for personalized responses.

Example: Instead of "Search for software updates," try "Eddy AI, imagine you're our IT expert and update me on latest software changes."

4. **Embrace creativity**

Encourage experimentation and creativity in queries.

Example: Instead of standard search "Knowledge base structure," try "Eddy AI, let's play! Imagine you're content strategist and suggest ideal knowledge base structure."

Following these recommendations harnesses Eddy AI capabilities for more engaging tailored interactions. Experiment, instruct creatively, and watch queries yield more insightful personalized results.

---

## Tips for Enhancing Knowledge Base Articles with Eddy AI

### 1. Use Eddy AI for Content Categorization

When organizing content, ask Eddy AI to help categorize or label articles. "Suggest categories for article discussing API integration and customization in Document360" streamlines knowledge base structure.

### 2. Generate Error Message Documentation

For troubleshooting or technical content, ask Eddy AI to document common error messages. "Generate explanations for common error messages users encounter integrating third-party tools in Document360" ensures comprehensive error documentation.

### 3. Request Best Practices

Eddy AI assists in compiling best practices. "List best practices for writing comprehensive how-to articles for knowledge base aimed at developers" generates useful guidelines.

### 4. Create Troubleshooting Guides

For knowledge base troubleshooting sections, instruct Eddy AI to generate content like "Create troubleshooting guide for resolving common login issues in Document360" ensuring focus on step-by-step solutions.## Use Cases

Eddy AI streamlines content creation across industries—LMS platforms, customer support knowledge bases, compliance documentation, product development guides, and e-commerce systems. Tailor prompts to specific needs for better efficiency, accuracy, and engagement.

### 1. Building a Learning Management System (LMS)

**Course Creation and Structuring**

* **Outline generation:** Ask Eddy AI to create course outlines by specifying learning objectives. Example: "Create outline for beginner's cloud computing course."
* **Content segmentation:** Divide long-form content into digestible modules. Example: "Split cybersecurity fundamentals article into 5 lessons with titles and summaries."
* **Quiz and FAQ generation:** Generate interactive content. Examples: "Create quiz questions for each module in cloud computing course" or "Generate FAQs for cloud security module."

**Enhancing User Engagement**

* **Adaptive learning paths:** Recommend follow-up content based on learner performance. Example: "Suggest advanced articles for learners who completed beginner's cloud computing course."
* **Knowledge retention aids:** Create summaries and revision guides. Example: "Generate revision guide summarizing key points of data privacy module."

---

### 2. Streamlining Customer Support Knowledge Bases

**Creating Troubleshooting Guides**

* Generate step-by-step guides for specific support cases. Example: "Create troubleshooting guide for common login issues in e-commerce platform."
* Document error message explanations. Example: "Create documentation explaining causes and fixes for error code 403 in web hosting."

**Organizing FAQs for Support Agents**

* Generate FAQs based on customer interactions. Example: "Create list of FAQs for common billing issues on our platform."
* Update existing FAQs by analyzing new data. Example: "Update current FAQ section with recent questions about product integration."

---

### 3. Accelerating Compliance Documentation

For healthcare, finance, or manufacturing sectors requiring up-to-date compliance documentation.

**Generating Compliance Checklists**

* Create checklists based on industry standards. Example: "Generate checklist of mandatory compliance requirements for HIPAA."
* Update compliance content. Example: "Update checklist with latest GDPR regulation changes."

**Creating Standard Operating Procedures (SOPs)**

* Draft clear, detailed SOPs for regulated environments. Example: "Draft SOP for handling customer data in compliance with GDPR."

---

### 4. Supporting Product Development Documentation

**API Documentation**

* Generate API usage examples. Example: "Create step-by-step guide for integrating our API with third-party services."
* Update documentation. Example: "Update API documentation to reflect changes in latest version."

**Release Notes and Feature Documentation**

* Create concise release notes. Example: "Generate release notes for version 4.2 highlighting new features and bug fixes."
* Generate user guides for new features. Example: "Create user guide for new reporting dashboard feature in SaaS platform."

---

### 5. Automating Retail and E-commerce Content

**Product Documentation**

* Generate product guides automatically. Example: "Create product guide for smart home security system covering setup, troubleshooting, and usage tips."
* Generate comparison content. Example: "Compare features of three smart home security systems on our platform."

**Order and Return Procedures**

* Simplify customer processes. Example: "Generate step-by-step guide for returning product purchased on e-commerce site."

---

### FAQs

**How can I ensure Eddy AI gives specific content?**

Be detailed in prompts. Specify length, tone, and focus. Example: "Provide formal, 200-word explanation of creating custom categories in Document360."

**What if the output is too broad?**

Rephrase prompts to narrow focus. Break requests into smaller steps. Example: "Generate summary of Document360's version control feature" followed by "List key benefits of version control in knowledge base system."

**Can Eddy AI assist with writing FAQs?**

Yes. Request FAQs based on specific sections. Example: "Generate FAQs related to article categorization and tagging in Document360."

**How can I use Eddy AI for technical content?**

Include relevant technical details in prompts. Example: "Generate step-by-step guide for integrating Google Analytics with Document360's knowledge base."## Variables

**Plans supporting content reuse**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Variables help maintain consistency when using the same text across multiple documentation sections. Update information in one place, and it automatically reflects everywhere the variable is used.

For example, use a variable for contact information. When details change, update the variable once instead of editing every instance.

---

## Creating a variable

To create a variable:

1. Navigate to Documentation > **Content tools** > **Content reuse** > **Variables**.
2. Click **Create variable**.
3. Enter the **Name** for your variable.

> NOTE
>
> Variable names can include letters, numbers, hyphens, and underscores. Maximum length: 30 characters.

4. The **Merge code value** appears automatically. This is how the variable will be referenced in articles.

> Example: Variable name "Disclaimer" becomes merge code `{{variable.Disclaimer}}`

5. Select **Language**:
   * **Global** - Available across all languages
   * Specific language - For language-specific content

6. Enter the variable **Content**.

> NOTE
>
> Character limit: 100 characters including spaces. For longer content, use **Snippets**.

#### Formatting options

Style your variable content with these formatting tools:

• **Bold**
• **Italic**
• **Strikethrough**
• **Underline**
• **Font size** (8 to 36)

Additional formatting:
• **Font Family**
• **Text color** (HEX code or picker)
• **Background color** (HEX code or picker)
• **Subscript**
• **Superscript**
• **Clear Formatting**

**Insert Link**:
1. Click **Insert link** icon
2. Enter URL and link text
3. Optionally select **Open in new tab**
4. Click **Insert**

7. Click **Create variable**.

The new variable appears in the Variables list, ready for editing or deletion.

---

## Using variables in articles

Add variables to articles using two methods:

#### Method 1: Markdown syntax

Type the merge code between double curly brackets:

`{{variable.Disclaimer}}`

> NOTE
>
> Exact spelling required. Even one character difference breaks the variable.

#### Method 2: Editor toolbar

1. Click **Content reuse** icon in Markdown/WYSIWYG editors
   *Or* in Advanced WYSIWYG: **Insert > Variables** or use "/" command

2. Select variable from list or use **Search variables**

> In Advanced WYSIWYG, hover over variable names to preview content

3. Click to insert variable

> NOTE
>
> Markdown/WYSIWYG editors allow multiple variable selection

---

## Variables overview page

Manage variables from the overview page:

1. Navigate to Documentation > **Content tools** > **Content reuse** > **Variables**

Key features:
1. **Languages** - Filter by Global or specific language
2. **Search variable** - Find variables by name
3. **Used in** - View articles using each variable. Click **View** for details
4. **Language** - See each variable's language setting
5. **Last modified** - Track update timestamps
6. **Preview** - Click variable name to see content
7. **Progress** - View translation status across languages
8. **Edit** - Modify variable content
9. **Delete** - Remove variables

---

## View article dependencies

Find where variables are used:

1. In the **Used in** column, click **View**
2. **View references** panel shows all articles containing the variable
3. Click article names to expand details:
   * Article version
   * Workspace and language
   * Contributor information
   * Article status (Published, Draft, New)
   * Insert timestamp

---

## Editing variables

1. Navigate to Documentation > **Content tools** > **Content reuse** > **Variables**
2. Hover over variable and click **Edit**

> NOTE
>
> Variable names and merge codes cannot be changed after creation

**Editing links in variables**:
Click the link to access options:
• **Open link** - Test the URL
• **Style** - Choose green text or thick formatting
• **Edit** - Modify URL, text, or target settings
• **Unlink** - Remove hyperlink formatting

3. Click **Update** after editing

> NOTE
>
> Changes appear immediately in all articles using the variable

---

## Deleting variables

1. Navigate to Documentation > **Content tools** > **Content reuse** > **Variables**
2. Hover over variable and click **Delete**
3. Confirm deletion

#### Bulk deletion

Select multiple variables and click **Delete** at top of list

> NOTE
>
> Variables with dependencies cannot be deleted. Remove from articles first.

---

## Translating variables

Create multilingual variables for consistent localized content.

#### New variables

1. Navigate to Documentation > **Content tools** > **Content reuse** > **Variables**
2. Click **Create Variable**
3. Select specific language (not Global)
4. Enter variable name and content in default language
5. Click **Translate to other languages**
6. Select target languages and click **Translate**

> NOTE
>
> Default language marked as **Main**
> Translated languages show green checkmarks

7. Click **Create Variable**

#### Existing variables

1. Open variable for editing
2. Click **Translate to other languages**
3. Select target language and click **Translate**
4. Use **Translate again** to overwrite existing translations
5. Use **Remove language** to delete specific translations

> NOTE
>
> Global variables cannot be translated

---

## FAQ

**How do variables work?**

Define content once, use everywhere. Changes update automatically across all articles.

**What's the benefit?**

Maintain consistency while reducing manual updates. Saves time and prevents errors.

**Can I create custom variables?**

Yes, create variables for any reusable text, numbers, or links.

**How do I use variables in articles?**

Insert via editor toolbar or merge code syntax.

**Do variables update multiple articles?**

Yes, one edit updates all instances.

**What content types work with variables?**

Text, numbers, and links. Ideal for product names, versions, URLs, and contact info.

**How do variables help collaboration?**

Everyone uses the same accurate information. Updates propagate instantly.

**Should I use variables in technical docs?**

Absolutely. Essential for dynamic information requiring frequent updates.

**Can I translate variables?**

Yes, into any project language.

**Are variables searchable?**

Yes, both site search and Google index variable content.## Eddy AI Search Analytics

**Plans supporting Eddy AI analytics**

| Professional | Business | Enterprise |
| --- | --- | --- |
| ✓ | ✓ | ✓ |

Eddy AI assistive search analytics helps you understand and optimize AI search performance in your knowledge base. The analytics page shows overall Eddy AI performance and search metrics, including unanswered searches. Visualize search data through charts and graphs.

> NOTE
>
> See [Eddy AI multilingual support](/help/docs/ai-search-suite#multilingual-support-for-eddy-ai-search-suite) for supported languages.
>
> Conversational Eddy AI metrics are only available in KB site 2.0 projects.

### Accessing Eddy AI analytics

Navigate to **Analytics** > **Eddy AI - Assistive Search** in the knowledge base portal.

### Key metrics

| Metric | Description |
| --- | --- |
| **Total searches** | Number of searches performed during the selected period |
| **Answered searches** | Searches where Eddy AI provided relevant results |
| **Unanswered searches** | Searches where Eddy AI couldn't find relevant content |
| **Click-through rate** | Percentage of users who clicked on AI-suggested articles |
| **Feedback rating** | Average user rating of AI search results (1-5 stars) |

### Filter options

Customize data display using filters:

1. **Date range**: Select predefined periods or custom dates
2. **Search type**: Filter by search intent (Informational, Navigation, Transactional)
3. **Language**: View analytics for specific knowledge base languages
4. **User type**: Filter by team accounts or readers

> NOTE
>
> Analytics data may take up to 15 minutes to appear in the portal.

### Search performance visualization

View search data through interactive charts:

* **Search volume trend**: Track searches over time
* **Answer rate distribution**: See answered vs unanswered searches
* **Top search queries**: Identify most common user searches
* **Zero-result searches**: Find queries that returned no results

Click chart legends to toggle data series visibility. Export charts as PNG images using the **Export image** icon.

### Improving search performance

Use analytics to optimize your knowledge base:

1. **Add content for unanswered searches**: Create articles addressing common zero-result queries
2. **Refine existing articles**: Improve articles with low click-through rates
3. **Monitor trending topics**: Stay ahead of emerging user interests
4. **Track multilingual performance**: Ensure consistent search quality across languages

### FAQ

**How often is Eddy AI search data updated?**

Data updates every 15 minutes. Real-time metrics aren't available.

**Can I export Eddy AI analytics data?**

Yes, export search metrics and query data as CSV files from the analytics page.

**What causes unanswered searches?**

Unanswered searches typically result from:
* Content gaps in your knowledge base
* Poorly phrased user queries
* Insufficient article tagging or categorization
* Low-quality article content that doesn't match search intent### Accessing Eddy AI search analytics

1. Navigate to **Analytics** > **Eddy AI** in the Knowledge base portal
2. The **Eddy AI - Assistive Search** page appears
3. View article performance metrics for the past week by default
4. Use filters to select different date ranges

### Using filters to customize data

Adjust the default **last week** date range using filters:

1. Click the **Date** filter dropdown
2. Select a predefined range (**This month**, **Last month**) or **Custom** for specific dates

---

### Eddy AI search analytics page overview

You can view the following article performance metrics as tiles:

| Field | Description |
| --- | --- |
| **Total conversations** | Total number of conversations in Eddy AI. Available only for KB site 2.0 projects where Eddy AI is conversational. A single message counts as a conversation. |
| **Total queries** | Total number of queries performed in Eddy AI. Queries are individual questions within conversations. |
| **Answered queries** | Total number of queries that returned a result |
| **Unanswered queries** | Total number of queries that produced no results |

> NOTE
> 
> If multiple chatbots or knowledge base widgets are deployed, data from all instances is merged in the results.

---

### Query analysis

Interact with the graph to analyze query data:

1. **Date-wise metrics**: Hover over the graph to see metrics for specific dates
2. **Date filter**: Click **This month** dropdown to view different months
3. **All**: Shows answered queries, unanswered queries, and conversations together
4. **Answered** (green line): Click to view only answered query data
5. **Unanswered** (red line): Click to view only unanswered query data
6. **Conversations** (violet line): Click to view conversation data. Available only for KB site 2.0 projects
7. **Export image**: Save Query analysis as PNG using the export icon

> NOTE
> 
> Keep unanswered searches low compared to answered searches. Unanswered searches typically occur when documentation lacks relevant information. Regular updates help minimize these.

---

### Conversation depth metrics

Shows conversation length distribution. Available only for KB site 2.0 projects.

1. Hover over bars to see exact conversation counts
2. Tracks conversations from 1 to 5 queries
3. Conversations with more than 5 queries grouped under 6+
4. Click **Export image** to save as PNG

---

### Feedback chart

Displays Like/Dislike data with percentages. Total feedback percentage shown inside the color chart.

Click **Export image** to save the Feedback chart as PNG.

---

### Popular queries

Shows top five search themes with frequency counts for the selected month. Queries grouped by keywords to highlight most popular topics.

> NOTE
> 
> Popular queries require at least one month of data.

---

### Unanswered queries

Shows top five unresolved search themes with frequency counts. Each keyword represents a topic with unanswered searches.

> NOTE
> 
> Monthly post-processing analyzes 30 days of data. OpenAI identifies common keywords and groups them into 10 primary topics. Remaining data grouped under "Others." Applied to all answered and unanswered queries.

---

### Most referenced articles

Lists five most-referenced articles for the selected month, showing how often each appeared in Eddy AI search results.

---

### Conversations

Detailed view of user interactions in tabular format showing queries, response status, and feedback.

1. **Search field**: Search for specific conversations or queries
2. **Conversations**: Displayed with first question visible by default. Other questions collapsed. Click queries to view full conversation in popup

   > NOTE
   > 
   > Conversations spanning multiple months appear in the analytics of their starting month
3. **Query topic**: Derived from popular queries list. Requires 30 days of data
4. **Response**: Shows answered or unanswered status
5. **Feedback**: Displays likes or dislikes
6. **Filter**: Filter by query topic, response status, feedback type, or application

   * **Response Status**: All, Answered, or Unanswered
   * **Feedback**: All, None, Liked, or Disliked
   * **Query type**: Filters previous month queries. Unavailable for current month
7. **Export**: Save filtered data as CSV

---

### FAQs

**Why can't I filter data weekly?**

Popular queries and unanswered search keywords require sufficient data for algorithmic grouping based on response frequency.

**How do I resolve unanswered queries?**

Identify relevant articles based on keywords from unanswered searches and update content accordingly.

**How does Eddy AI handle multilingual conversations?**

Each language in a conversation updates separately in the conversation table. Metrics like searches, answered queries, unanswered queries, and feedback update only for the language where they occurred.

**How does Eddy AI handle multi-workspace conversations?**

Each workspace in a conversation updates separately in the conversation table. Metrics update only for the languages used within respective workspaces.

**How are queries different from conversations?**

Queries are individual questions. One or more queries make up a conversation.## Adding custom links

Need to add a download link to an eBook or Google Sheets?  
You can direct users by adding custom links to the Knowledge base Widget.

![2_addingcusotmlinks.png](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_addingcusotmlinks.png)

Links are added as a "section" to your Widget. They appear in the order added, underneath the **Top search articles** section.

To add a custom link:

1. Navigate to **Knowledge base Widget** in the Knowledge base portal
2. Hover on the desired Knowledge base Widget and click **Edit**
3. In the **Installation & Setup** tab, expand the **Add custom links** section
4. In the **Add Custom Links** section:

   * Type the title for your section
   * Type the display text for the link

     > **For example:** **Contact Us**
   * Type the URL link

     > **For example:** https://support.document360.com
5. Click the adjacent icon and choose the desired icon from available options
6. Click **Add** > **Save**

![1_addlinks.gif](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_addlinks.gif)

**NOTE**

You can use a `mailto:` in the link field. For example: `mailto:<youremail@somedomain.com>`

### Edit a custom link

1. Navigate to **Knowledge base Widget** in the Knowledge base portal
2. Hover on the desired Knowledge base Widget and click **Edit**
3. In the **Configuration & connect** tab, expand the **Add links** section
4. In the **Add Links** section, locate the custom link you wish to edit
5. Click **Edit** and update desired fields
6. Click **Save**

### Deleting a custom link

1. Navigate to **Knowledge base Widget** in the Knowledge base portal
2. Hover on the desired Knowledge base Widget and click **Edit**
3. In the **Configuration & connect** tab, expand the **Add links** section
4. In the **Add Links** section, locate the custom link you wish to delete
5. Click **Delete**
6. Click **Save**

---

## Securing Knowledge base widget authentication using JWT

Implement authentication configuration for the widget using JWT to ensure secure access for private and mixed projects.

1. Navigate to Knowledge base widget in the Knowledge base portal

   The list of widgets will appear
2. Hover on the desired Knowledge base Widget and click **Edit**
3. In the **Configure & connect** tab, navigate to the **JWT** section and **enable** the JWT toggle

1. **Client ID:** Your project's ID
2. **Widget ID:** Unique identifier for each widget
3. **Token endpoint:** HTTP endpoint to obtain access token given authorization code
4. **Client secret:** Click **Regenerate** to generate. Save this for future use - same secret applies to all widgets

> NOTE
>
> Client secret required for JWT widgets. This information will not be stored in Document360

5. **Authorize URL:** Paste the authorized URL from your knowledge base widget webpage
6. Click **Save**

![Securing the Knowledge base widget](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Securing_Knowledge_base_widget_authentication_using_JWT.png)

Embed the authorized URL within your code and paste it into the **script section** on your webpage. This creates a secure, authenticated widget that prevents unauthorized third-party access.

---

### Implementing the auth endpoint

```
[HttpGet]
[Route("authenticate")]
public async Task<IActionResult> WidgetAuthentication(string id)
{
    if (HttpContext.User.Identity.IsAuthenticated)
    {
        var clientData = new ClientDetails()
        {
            ClientId = "{Client ID}",
            Secret = "{Client secret}",
            TokenEndpoint = "{Token endpoint}",
            WidgetId = "{Widget ID}",
            SecurityGroupIds = "{Comma separated reader group IDs}", // mandatory for KB widget configuration
            TokenValidity = 15, // token validity in minutes
        };

        if (clientData == null)
            return NotFound();

        List<string> readerGroupids = null;
        if (!string.IsNullOrEmpty(clientData.SecurityGroupIds))
            readerGroupids = clientData.SecurityGroupIds.Split(',').Select(c => c.Trim()).ToList();

        var payload = new
        {
            username = "{Username}",
            firstName = "{First name}",
            lastName = "{Last name}",
            emailId = "{Email address}",
            readerGroupIds = readerGroupids,
            tokenValidity = clientData.TokenValidity,
            widgetId = clientData.WidgetId,
            projectId = clientData.ClientId
        };

        var payloadString = JsonConvert.SerializeObject(payload);

        var result = await client.RequestTokenAsync(new TokenRequest
        {
            Address = clientData.TokenEndpoint,
            ClientId = clientData.ClientId,
            ClientSecret = clientData.Secret,
            GrantType = "Widget",
            Parameters =
            {
                {
                    "payload",  payloadString
                },
                {
                    "id", clientData.ClientId
                },
            }
        });

        return Ok(new
        {
            accessToken = result.AccessToken,
            expiresIn = result.ExpiresIn
        });
    }
    else
    {
        return Unauthorized(new { success = false });
    }
}
```

C#

Copy

> NOTE
>
> Include comma-separated reader group IDs as security group IDs to configure and render the KB widget

---

### FAQs

#### Why are certain categories appearing on the Knowledge base site but not in the widget?

This occurs when category-level access isn't properly configured for the widget. To ensure categories are visible:

1. Verify team accounts or readers have permission to view specific categories/articles in the widget
2. Check if category-level access is configured. If so, manually add desired categories in the content access section during widget configuration

**To add categories to the widget:**

1. Navigate to **Knowledge base widget** in the Knowledge base portal
2. Hover over the desired widget and click **Edit**
3. In the **Configuration & connect** tab, expand the **Content access** section
4. Select **Category** and choose desired categories
5. Click **Save**

#### The Knowledge base widget is not loading on the Knowledge base site. How can I fix this?

Most likely caused by an outdated API key. Update the API key to restore widget functionality.

---

## URL Mapping

The **URL Mapping** feature allows you to control which articles and categories appear based on the pages your users visit. This improves user experience by directing them to relevant content and lets you hide the widget on certain URLs or customize search placeholders.

---

## Using URL mapping

Configure URL mapping by performing specific actions within the knowledge base widget for designated URLs.

### Actions

Four actions available with URL mapping:

1. **Show article:** Displays a single article on specified URL
2. **Show list of articles:** Lists selected articles under **Recommended** section on specified URL
3. **Show search results:** Sets specific search term to query knowledge base, returning relevant results on specified URL
4. **Hide widget:** Prevents Knowledge Base widget icon from appearing on specified URL

Find these actions under the **URL Mapping** tab or when editing existing mappings.

> NOTE
>
> Knowledge base widget must be installed on your site or app for URL Mapping to work. See [Installing the Knowledge base widget](/help/docs/installing-the-knowledge-base-widget)

### URL Parameters

Three types of parameters when configuring Knowledge Base widget URL:

1. **Include Path**: `/thisis/a/path`
2. **Include Query**: `?animal=bear`
3. **Include Hash**: `#inbox`

Enable **Is Regex** toggle to incorporate regular expressions into URL configurations.

---

## Adding URL Mapping to your Widget

To integrate desired widget into knowledge base site:

1. Navigate to **URL Mapping** tab in **Widget** in Knowledge base portal
2. Click **New URL mapping** and specify:

   * **Name** - Only shown on URL mapping record within Document360
   * **URL structure** - Select URL parameter type (**Include path**/**Include query**/**Include hash**). Enable at least one parameter
   * Type URL where you want article/category to show or action to occur

     > NOTE
     >
     > Domain name not included in URL path. For `https://document360.com/ebook/rapid-guide-to-launch-your-knowledge-base/`, URL Path is `/ebook/rapid-guide-to-launch-your-knowledge-base/`
   * **Action** - Select desired action
   * **Select workspace** - Choose version (if multiple versions exist)
   * **Language to** - Select language (if multiple languages exist)
   * **Article to show** - In search bar, select articles/categories to show from knowledge base documentation

   NOTE

   Folder categories not available for selection. Only **page** and **index** category types available.

3. Click **Create**

![1_URLmapping.gif](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_URLmapping.gif)

When users access specified URL path and open Knowledge Base widget, they see mapped article/category. This remains consistent as they navigate between widget tabs within same version and language.

---

## Editing URL mapping

To modify existing URL mapping:

1. Navigate to **Widget** in Knowledge base portal
2. Hover on desired Knowledge base widget and click **Edit**

   In **URL mapping** tab, find list of available URL mappings
3. Hover over desired URL mapping and click **Edit**

   **Update URL mapping** blade appears
4. Update information and click **Update**

![2_urlmapping_edit.gif](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_urlmapping_edit.gif)

---

## Deleting URL mapping

To delete URL mapping:

![3_urlmapping_delete.png](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_urlmapping_delete.png)

1. Navigate to **Widget** in Knowledge base portal
2. Hover on desired Knowledge base widget and click **Edit**
3. In **URL mapping** tab, find list of available URL mappings
4. Hover over desired URL mapping and click **Delete**
5. Click **Yes** in **Delete confirmation** prompt

---

## URL mapping settings

Define Knowledge base widget behavior for URLs without configured mapping to improve user experience.

![4_urlmapping_settings.png](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_urlmapping_settings.png)

1. Navigate to **Widget** in Knowledge base portal > **Configure & connect**
2. Under **Set controls** section, expand **URL mapping settings** section
3. Select desired option:

   * **Navigate to the page help/knowledge base**: Display article/category in Page help or Knowledge base tab
   * **Do not make any changes to the existing setup**: Display last opened article/category
4. Click **Save**

---

## Basic URL matching

Understanding URL matching is crucial for effective URL mapping. General-purpose regex for typical URLs:

```
^https?://?[a-zA-Z0-9.-]+/[a-zA-Z0-9/._-]*??[a-zA-Z0-9=&._-]*?#[a-zA-Z0-9_-]*?$
```

Regex

Copy

**Component explanation:**

* `^https?://?`: Matches protocol (`http://` or `https://`). The `?` makes protocol optional

  > NOTE
  >
  > Add backward slash (\) before every forward slash (/) when testing on https://regex101.com
* `[a-zA-Z0-9.-]+`: Matches domain name including letters, numbers, dots (`.`), and hyphens (`-`)
* `/[a-zA-Z0-9/._-]*?`: Matches path after domain, allowing slashes, alphanumeric characters, dots, underscores, and hyphens
* `?[a-zA-Z0-9=&._-]*?`: Matches optional query parameters (`?key=value`)
* `#[a-zA-Z0-9_-]*?`: Matches fragment (`#section`)

---

### Examples of URL mapping using Regex

#### **Mapping URLs with specific paths**

For URL pattern like `/users/{id}`:

```
^/users/[0-9]+$
```

Plain text

Copy

Captures user ID dynamically.

**Example Matches:**

* `/users/123`
* `/users/456`

#### **Mapping URLs with query parameters**

For URLs like `/search?q={query}`:

```
^/search?q=[a-zA-Z0-9]+$
```

Regex

Copy

**Example Matches:**

* `/search?q=apple`
* `/search?q=123abc`

#### **Mapping URLs with optional parameters**

For URL pattern like `/products/{category}/{id}` where category is optional:

```
^/products/[a-zA-Z]+?/[0-9]+$
```

Regex

Copy

**Example Matches:**

* `/products/123`
* `/products/electronics/123`

#### **Mapping URLs with wildcard or multiple paths**

For `/blog/*`:

```
^/blog/.*?$
```

Regex

Copy

**Example Matches:**

* `/blog`
* `/blog/how-to-code`
* `/blog/2021/10`

**Mapping URLs with subdomains**

For subdomain URLs:

```
^https?://?[a-zA-Z0-9-]+.example.com$
```

Regex

Copy

**Example Matches:**

* `http://blog.example.com`
* `https://shop.example.com`

#### Combining multiple components

Comprehensive regex matching URL with optional protocol, domain, path, query parameters, and fragment:

```
^https?://?[a-zA-Z0-9.-]+/[a-zA-Z0-9/._-]*??[a-zA-Z0-9=&._-]*?#[a-zA-Z0-9_-]*?$
```

Regex

Copy

---

## FAQs

**How can I remove the Page help and Search bar from the widget when URL mapping for a single article is configured?**

To hide Page help tab and Search bar:

1. Navigate to **Widget** in Knowledge base portal
2. Hover over desired widget and click **Edit**
3. Paste provided code in **Custom CSS** tab:

   ```
   li#page-help-tab {
       display: none;
   }

   .article-header .article-back-icon {
       display: none;
   }

   .search-container {
       display: none !Important;
   }
   ```

   CSS

   Copy
4. Paste provided code in **Custom JavaScript** tab:

   ```
   setTimeout(function() { $('.search-container').hide();}, 2000);
   setTimeout(function() { $("#knowledge-base-tab").click();}, 2000);
   ```

   JavaScript

   Copy
5. Click **Save**

**How can I see the updates immediately in the KB Widget after adding or updating a URL Map?**

Updates cached on server for performance and refresh automatically every 15 minutes. Clear application cache for immediate changes.

---

## Customizing the Knowledge base widget using Custom CSS/JavaScript

Customizing the Knowledge Base (KB) widget allows personalization of appearance and behavior to match branding or specific functionality needs. This includes customizing the widget icon, setting up buttons for interaction, managing callbacks for show/hide functionality, and applying styling and localization adjustments.

---

## How to change the default widget icon?

Replace default Knowledge Base widget icon with custom one that fits brand design.

### **Creating a custom button**

To add custom button interacting with Knowledge Base widget:

1. Add new HTML element, button for example, anywhere on page:

   ```
    <button id="doc360_help_btn" class="btn hide"><span>Help!</span></button>
   ```

   XML

   Copy
2. Assign element CSS class including `display: none`:

   ```
   .hide
   {
       display:none;
   }
   ```

   CSS

   Copy

### **Setting up callback functions**

Control visibility of custom button based on Knowledge Base widget state using JavaScript callback functions.

Add following [callback functions](https://developer.mozilla.org/en-US/docs/Glossary/Callback_function) to JavaScript files or inside `<script>` tag.

**Show button when widget loads:**

```
function doc360_callback()
{	
    document.getElementById('doc360_help_btn').classList.remove('hide');
}
```

JavaScript

Copy

**Show button after being hidden by URL mapping:**

`doc360_callback` removes `display: none` from button. Executed when Knowledge Base widget completes loading.

```
function doc360_show_callback()
{
    document.getElementById('doc360_help_btn').classList.remove('hide');
}
```

JavaScript

Copy

**Hide button based on URL mapping:**

`doc360_show_callback()` removes `display: none` from button. Executed if button was previously hidden by URL mapping.

```
function doc360_hide_callback()
{
    document.getElementById('doc360_help_btn').classList.add('hide');
}
```

JavaScript

Copy

`doc360_hide_callback()` adds `display: none` to button. Executed by [URL mapping](/help/docs/url-mapping) if valid map found to hide Knowledge Base widget.

> NOTE
>
> Show and hide callbacks only necessary if hiding widget on specific pages using URL mapping

### Integrating the callback functions

Make widget recognize custom callbacks by modifying Knowledge Base widget's JavaScript snippet:

```
<!-- Document360 Knowledge Base assistant Start -->
<script>
    (function (w,d,s,o,f,js,fjs) {
        w['JS-assistant']=o;w[o] = w[o] || function () { (w[o].q = w[o].q || []).push(arguments) };
        js = d.createElement(s), fjs = d.getElementsByTagName(s)[0];
        js.id = o; js.src = f; js.async = 1; fjs.parentNode.insertBefore(js, fjs);
    }(window, document, 'script', 'mw', 'https://cdn.document360.io/static/js/assistant.js'));
    mw('init', { apiKey: 'YOUR KEY', 
                   callback:  doc360_callback, 
                   show_callback: doc360_show_callback,  
                   hide_callback: doc360_hide_callback });
</script>
<!-- Document360 Knowledge Base assistant End -->
```

JavaScript

Copy

### **Making the button open the widget**

Make button open Knowledge Base widget when clicked using pure JavaScript or jQuery.

**Using Pure JavaScript:**

```
document.getElementById('doc360_help_btn').addEventListener('click', function () { 
    document.getElementById('document360-assistant-iframe').contentDocument.getElementById('doc360-button').click();
});
```

JavaScript

Copy

**Using jQuery:**

```
$('#doc360_help_btn').click(function() {
    $('#document360-assistant-iframe').contents().find('#doc360-button').click();
}); 
```

JavaScript

Copy

### **Customizing the button's appearance**

Apply custom CSS to button to match website branding. Change colors, font styles, or add effects.

---

## How to change dark theme in Knowledge base widget?

Use Custom JavaScript for this customization.

1. Navigate to **Knowledge base Widget** in Knowledge base portal and click **Edit**

![kbwidget_darktheme.png](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/image-1730066025105.png)

2. Open **Custom CSS** tab, paste snippet below, and click **Save**

```
.doc360-widget-modal {
    background-color: black;
    color: white;
}
 
.doc360-widget-modal div,
.doc360-widget-modal li,
.doc360-widget-modal p,
.doc360-widget-modal ul,
.doc360-widget-modal span,
.doc360-widget-modal input,
.doc360-widget-modal textarea {
color: white !important;
  background-color: black !important;
}
 
.doc360-widget-modal button {
  color: white !important;
}

.eddy-feedback-btn:hover {
    color: black !important;
    background-color: #e4e4e7 !important;
}

.eddy-feedback-btn {
    background-color: black !important;
}
```

CSS

Copy

---

## How to change the fields displayed in the Knowledge base Widget?

Use Custom JavaScript for this customization.

1. Navigate to **Knowledge base Widget** in Knowledge base portal and click **Edit**

![kbwidget_changefields.png](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/image-1730066068782.png)

2. Open Custom JavaScript tab to paste snippet below

```
$(document).ready(function() {
    if ($('.tab-link.current').length > 0) {
        $('.tab-link.current').html($('.tab-link.current').html().replace("Page help", "Destek"));
        $('.tabs li:last-child').html($('.tabs li:last-child').html().replace("Knowledge base", "DokÃ¼matasyon"));
    }

    setTimeout(function() {
        $('#top-search-title').html($('#top-search-title').html().replace("Top search articles", "En Ã‡ok Aranan DokÃ¼manlar"));
    }, 3000);
});
$(document).ready(function() {
    $('#search-input').each(function(ev) {
        if (!$(this).val()) {
            $(this).attr("placeholder", "Arama");
        }
    });
    $('#category-filter').each(function(ev) {
        if (!$(this).val()) {
            $(this).attr("placeholder", "Filtrele");
        }
    });
});
```

JavaScript

Copy

3. Replace text as needed
4. Click **Save**

---

## How to set the Knowledge base Widget to open automatically in the knowledge base site?

Use Custom JavaScript for this customization.

1. Navigate to **Knowledge base Widget** in Knowledge base portal and click **Edit**

![kbwidget_autoopen.png](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/image-1730066097873.png)

2. Open Custom JavaScript tab, paste snippet below, and click **Save**

```
$(function() {
setTimeout(function(){
let iframe = $('#document360-widget-iframe');
let button = iframe.contents().find('#doc360-button');
button.trigger("click");}, 2000);
});
```

JavaScript

Copy

---

## FAQ - Knowledge base widget

#### 1. What is a Knowledge base widget?

Knowledge base widget helps users find answers without leaving your site or application. Assists users in finding solutions to common questions, troubleshooting issues, and learning about new features - all within the application.

---

#### 2. How is the Knowledge base widget useful for the users?

Here are some scenarios where Knowledge base widget proves helpful:

* **User onboarding**: New app users access widget to learn basics - account setup, UI navigation, common tasks - without leaving application
* **Technical support**: When users encounter problems or error messages, they search Knowledge base for solutions instead of contacting customer support or searching externally
* **Learning about new features**: As apps update with new features, users access widget to learn changes, usage, and benefits - improving overall experience and adoption

---

#### 3. Is it possible to configure multiple Knowledge base widgets?

Yes, configure up to 10 Knowledge base widgets per project.

---

#### 4. How to change the position of the Knowledge base widget icon on your website?

1. Go to **Installation & Setup** tab of desired Knowledge base widget (**Knowledge base widget** > **Edit**)
2. In **Style your widget** section, find **widget position**
3. Select **Left** or **Right** button to change icon position
4. Enter desired spacing values in **Side spacing** and **Bottom spacing** fields
5. Click **Save**

---

#### 6. How to turn off the top search in the Knowledge base widget?

1. Go to **Installation & Setup** tab of desired Knowledge base widget (**Knowledge base widget** > **Edit**)
2. In **Style your widget** section, enable **Hide top search** toggle
3. Click **Save**

---

#### 7. Why does a configured URL mapping appear broken?

URL mapping breaks due to changes in 'Filter widget content' configuration in 'Installation & setup' tab. Check URL mapping and update configuration.

---

#### 8. How do I set my desired logo as a widget icon?

1. Go to **Installation & Setup** tab of desired Knowledge base widget (**Knowledge base widget** > **Edit**)
2. In **Style your widget** section, find **widget icon**
3. Click **Change icon** button
4. Choose/upload desired icon
5. Click **Save**

---

#### 9. How to hide the Knowledge base widget?

1. Go to **Installation & Setup** tab of desired Knowledge base widget (**Knowledge base widget** > **Edit**)
2. In **Style your widget** section, enable **Hide widget** toggle
3. Click **Save**

---

#### 10. Can I add custom links in the Knowledge base widget?

Yes.

---

#### 11. What is URL mapping?

URL mapping makes specific articles/categories appear in knowledge base widget based on user's current page. Also hide widget on specific URLs or provide search bar with custom placeholders.

---

#### 12. How to enable Ticket deflector in the Knowledge base widget?

1. Go to **Installation & Setup** tab of desired Knowledge base widget (**Knowledge base widget** > **Edit**)
2. Enable **Show ticket deflector** toggle
3. Click **Save**

---

#### 13. Can I add regular expressions (regex) in URL mapping?

Enable **Is Regex** toggle to include regular expressions.

---

#### 14. What is regex?

Regex ("regular expression") defines search pattern to match and manipulate text strings.

> For example, configure single URL mapping for 20 articles with similar URLs:
>
> * `https://example.com/drive-General`
> * `https://example.com/drive-settings`
> * `https://example.com/drive-functionA`
>
> Without regex, add individual URL mappings for each. With regex, single mapping suffices: Select "Include path" and add `docs/drive` in URL field.

---

#### 15. Can I add URL mapping for categories?

Yes. Applies only to page and index categories.

---

#### 16. How to remove the Knowledge base widget icon from an article?

1. Go to **URL mapping** tab of desired Knowledge base widget (**Knowledge base widget** > **Edit**)
2. Create new URL mapping with **Hide** action for desired article

---

#### 17. What is the default language behavior of the Knowledge base widget?

Widget opens in default browser language. If unavailable, default Knowledge base language appears.

#### 18. How do I restrict the Knowledge base widget to a specific domain?

1. Go to **Installation & Setup** tab of desired Knowledge base widget (**Knowledge base widget** > **Edit**)
2. In **Style your widget** section, find **Keep your widget secure**
3. Enter domains where Knowledge base widget should display
4. Click **Add** > **Save**

---

## Knowledge base site 2.0

Knowledge Base Site 2.0 improves article access and information browsing. Enhanced UI, better AI-powered search, and streamlined content organization help users find relevant articles and troubleshoot efficiently. Real-time updates and interactive elements simplify navigation and engagement.

> For migration from KB site 1.0 to KB site 2.0, see [**KB site 2.0 migration**](/help/docs/kb-site-20-migration)

---

## Overview of Knowledge base site 2.0

![Image showing sections of Knowledge base site 2.0](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_ScreenShot-Knowledge_base_site_2.0.png)

### 1. Header section

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-New_Header_section_of_Knowledge_base_site_2.0(1).png)

1. **Logo image:** Organization branding/logo. Click navigates to documentation home page
2. **Workspace:** Dropdown to navigate different Knowledge base workspaces. Click API documentation workspace to go to API home page
3. **Primary navigation:** Customize to navigate different pages from home or Knowledge base site
4. **Announcement icon:** "What's New" page shows recently published articles (new and forked) in selected workspace
5. **Acknowledgment required:** Page displays acknowledgment required/acknowledged articles
6. **Theme:** Switch between System theme, light, and dark themes. Light theme set as system theme by default
7. **Language:** Select desired language to read articles
8. **Secondary navigations:** Customize to navigate different pages from home or Knowledge base site

---

### 2. Left navigation pane

![Overview of the Knowledge base site 2.0](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/Screenshot-left_side%20pane_KBsite2.0.png)

1. **Search bar:** Access search function or use shortcut Ctrl + K (Command + K on Mac). Search Knowledge base articles or use Eddy AI search. See [Search](/help/docs/document360-search)
2. **Hide navigation menu:** Click to hide left pane for wider article view
3. **Tree view:** View category/article hierarchy in clear tree structure
4. **Article status:** Color badge represents article status (new, updated, custom). See [Article status](/help/docs/article-status)
5. **Context menu:** Private/mixed project users hover for options:

   * **Follow category/article:** Click to receive notifications for new/updated articles. Available only in private/mixed projects. See [Follow articles and categories](/help/docs/follow-articles-and-categories)
   * **Export PDF:** Export article/category as PDF

---

### 3. Article section

![Knowledge base site 2.0](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_Screenshot-New_Article_section_of_Knowledgemnt_base_Site_2.0.png)

1. **Breadcrumbs:** Navigate back to article category/sub-category
2. **Article title:** Displays article title
3. **Copy link:** Click to copy article URL to clipboard
4. **Status badge:** Displays article status (new, updated, custom)
5. **Article date:** View published/updated date
6. **Read time:** View estimated reading time based on word count
7. **Contributors:** View list of article contributors
8. **Share icon:** Share article via Twitter, LinkedIn, Facebook, or Email
9. **More sharing options:** Download article as PDF or print
10. **Follow:** Click to follow articles. Available for reader accounts
11. **Article summary:** Click to view Eddy AI-generated article summary
12. **Acknowledgement required:** Scroll to article end and acknowledge

---

### 4. Image

When clicking images on Knowledge base site, they open in image viewer.

* **Title text:** Displays image caption, if any
* **Open link:** Open image URL, if available
* **Zoom out:** Minimize image
* **Zoom in:** Enlarge image
* **Download:** Download image to local storage
* **Close:** Close image
* **Next:** Move to next image
* **Previous:** Move to previous image

Hold and drag image to move anywhere on screen. Click anywhere outside image to close.

![Knowledge base site view of an image](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/8_ScreenShot-Knowledge_base_site_2.0.png)

---

### 5. Right side pane

![Overview of the Knowledge base site 2.0](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/Screenshot-Right%20side%20pane_KBsite2.0.png)

1. **Hide navigation menu:** Click to hide right pane for wider article view
2. **Files:** View article attachments
3. **Tags:** View article tags
4. **In this article:** View article headings (formerly "Table of Contents")

---

### 6. Article footer

![Article footer of the Knowledge base site 2.0](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/6_Screenshot-Footer_section_of_Knowledge_base_site_2_0.png)

1. **Article feedback:** Click **Yes** or **No** and enter feedback
2. **Previous and Next Article:** Navigate to previous/next articles in category
3. **Related articles:** View list of related articles

---

## Troubleshooting

Step-by-step guidance for common Knowledge base site management/access challenges.

### Website fails to load after entering the URL

Possible causes: incorrect URL entry, browser cache issues, VPN interference, network problems, server downtime, outdated browsers, or incorrect system date/time settings.

**Steps to resolve:**

1. Ensure website URL entered correctly
2. Reload page
3. Clear browser cache:

   * Right-click page and select **Inspect** to open developer tools
   * Right-click browser reload button and choose **Hard reload** or **Empty cache and Hard reload**
4. Check if VPN active on device. Disable and attempt site access again
5. Ensure system date, time, and time zone set correctly

Contact support if issue persists.

### 504 gateway timeout while accessing the site

**Error:** 504 gateway timeout

Possible cause: sub-folder configuration issues.

**Steps to resolve:**

1. Check recent web server configuration changes:

   * Review location blocks/configuration files for recent changes
   * If changes identified, revert to previous state
2. Verify sub-folder configuration:

   * Change in sub-folder slug within Sub-folder Configuration may cause issue
   * Revert recent sub-folder configuration changes

See [Hosting Document360 on a sub-directory](https://docs.document360.com/docs/document360-on-a-sub-folder)

### Page unresponsive while editing an article

**Error:** Page isn't working. example.com redirected too many times. ERR_TOO_MANY_REDIRECTS.

Possible causes: outdated browser cache, overly large articles, missing/improperly closed HTML tags, or excessive redirects from incorrect configurations.

**Steps to resolve:**

1. **Clear browser cache:** Outdated/corrupted cache interferes with page functionality. Clear, reload, and check if issue persists
2. **Reduce article length:** Large articles cause performance issues. Split into smaller sections under relevant categories
3. **Check for missing closed tags:** Ensure all HTML tags have closing tags, especially in Markdown. Elements like `<table>`, `<div>`, and `<p>` must be properly closed

### Page isn't working due to too many redirects

**Error:** Page redirected too many times

Possible causes: incorrect JWT Login URL configuration, domain URL as Login URL causing redirect loops, or outdated JWT settings.

**Steps to resolve:**

1. **Check recent changes:** Review JWT Login URL updates in configuration
2. **Correct Login URL:** Ensure domain URL not set as Login URL to prevent multiple redirects
3. **Update JWT configuration:** Remove incorrect Login URL and replace with correct one

See [JWT article](https://docs.document360.com/docs/configuring-the-jwt-sso)

### Sorry! Project not found during custom domain configuration

**Error:** Sorry! This project does not exist.

Possible causes: incorrect/missing CNAME record configuration, expired CNAME records, or incomplete domain verification.

**Steps to resolve:**

1. **Verify CNAME Record:** Ensure CNAME record added correctly. Click 'Verify' button on custom domain page. Custom domain activates immediately after verification
2. **Check for CNAME expiry:** If CNAME updated in DNS after delay, it may have expired, preventing verification
3. **Reconfigure domain:** Reconfigure custom domain, update CNAME record, and verify in Document360

See [custom domain mapping article](https://docs.document360.com/docs/custom-domain-mapping)

### Encountering "/home/error/" message while accessing the site

**Error:** /home/error/

Possible causes: incorrect site configuration, server-side issues, or unresolved backend errors.

**Steps to resolve:**

1. **Contact support:** Email [**support@document360.com**](mailto:support@document360.com) with:

   * Screen share video demonstrating issue
   * Steps to reproduce error, if possible
2. **Provide HAR file:** Follow steps in [guide](https://docs.document360.com/docs/document360-support-generating-a-har-file) to download HAR file
3. **Share console errors:**

   * After downloading HAR file, click 'console' tab in browser developer tools
   * Screenshot console errors and include in email

### Icons not rendering correctly on user site

Broken icons typically result from unintended modification of Document360's FontAwesome family. Changes to other classes/HTML tags may alter icon font settings.

To avoid this issue:

* Ensure site styling/class definitions don't impact FontAwesome classes or font family settings
* When targeting specific elements, double-check icon-related styles remain intact

**Steps to resolve:**

1. **Inspect broken icon:**

   * Use browser developer tools to inspect user site
   * Click broken icon with selector tool to identify issue
2. **Check custom CSS:**

   * Navigate to **Settings** > **Knowledge base site** > **Customize site** > **Custom CSS & JavaScript**
   * Review font rules applied to various classes. Font changes may unintentionally apply to broader classes, affecting icons
   * Apply font changes only to specific classes requiring them

Contact [Document360 support](https://document360.com/support/) if issue persists.

### Knowledge base site loading without CSS styling

Typically occurs when site accessed from network blocking/whitelisting Document360 domains.

**Steps to resolve:**

1. Verify site works correctly from different network. If so, issue relates to network restrictions
2. Whitelist following domains in network settings for proper access

![Image showing domains to whitelist](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_ScreenShot-troubleshooting.png)

### Secure connection issues on knowledge base site

**Error:**

* Site can't provide secure connection
* Connection isn't private
* Connection not secure

**Steps to resolve:**

1. **Check CAA Record in DNS:**

   * Verify CAA (Certification Authority Authorization) record added for Knowledge base site
   * If no CAA record found, inspect SSL certificate. Refer to steps in provided video
2. **Update CAA Record:**

   * Based on SSL certificate provider, add corresponding CAA record to DNS
   * For Let's Encrypt, add specified CAA record. Ensure correct record for certificate type
3. **Reference for CAA Records:**

   Learn more about CAA records: [CAA Record and Why It Is Needed](https://www.namecheap.com/support/knowledgebase/article.aspx/9991/38/caa-record-and-why-it-is-needed-ssl-related/#caa_how)
4. **Contact DNS Provider:**

   If issue persists during custom domain setup, contact DNS provider to confirm additional issues

Contact [Document360 support](https://document360.com/support/) if issue persists.

### Encountering "ResourceNotFound" error accessing images/files/attachments

**Error:** ResourceNotFound

Occurs when SaaS token not appended to file URL in **private** and **mixed projects**. Document360 appends SaaS token to ensure authorized access.

**Steps to resolve:**

* Ensure SaaS token appended to file URL before accessing/sharing
* Try downloading file again directly from Document360

![Error message indicating resource not found](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/image-1739344746842.png)

### Encountering "AuthenticationFailed" error accessing images/files/attachments

**Error:** AuthenticationFailed

Occurs when **SaaS token** expired in **private** and **mixed projects**. SaaS token valid for **15 minutes** before automatic update. If shared with expired token, users can't access file.

**Steps to resolve:**

* **Refresh source webpage** and generate new file link
* Share file within valid token period (15 minutes for standard files, 1 hour for video files)

![Error message indicating authentication failure](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/Screenshot-Troubleshooting-Authentication%20failed.png)

---

## Customize site

In Document360 projects, manage Knowledge base site design/customization from unified **Customize site** feature. Tailor site to align with brand identity and user preferences - select themes, adjust colors, personalize layouts.

> Available in KB Site 2.0. See [KB site 2.0 migration](/help/docs/kb-site-20-migration)

> **Customize site** is project-level setting. Changes reflect across entire project.

---

## Basic site customization

To perform basic customization:

1. Navigate to **Settings** > **Knowledge base site** > **Customize site** in Knowledge base portal

   Page holds all basic site design configurations
2. Choose theme from **Site theme** field:

   * Both Light & Dark
   * Light only
   * Dark only
3. In **Branding** section, choose **Logo** and **Favicon**. Set custom redirection link for logo - users redirect to specified link when clicking logo

   > Customers with existing customized logo/favicon unaffected until navigating to **Customize site** settings and saving changes
4. In **Colors** section, select **Auto set color contrast to meet** [**WCAG**](https://www.w3.org/TR/WCAG21/) **standards** checkbox to automatically apply brand colors

   > See [Web Content Accessibility Guidelines (WCAG)](/help/docs/web-content-accessibility-guidelines-wcag)

   * In **Brand color** section, choose primary color for CTAs, selection states, etc.
   * In **Hyperlink color** section, customize hyperlink color to enhance user experience:

     + **Use industry standard:** Applies commonly used hyperlink color
     + **Use brand color:** Applies chosen brand color
     + **Use a different color:** Select default, hover, and visited colors for hyperlinks
5. In **Fonts** section, change Knowledge base content fonts anytime:

   * **Article font pairing:** Applied to all article titles and contents. Click **Have a specific font combination in mind?** for more options
   * **Site font:** Select font from dropdown. Applied throughout Knowledge base site - left navigation pane, header/footer navigations, controls
6. In **Styling** section, choose button/form element style:

   * Rounded
   * Sharp
   * Bubble
7. In **Site layout** section, choose:

   * **Full width:** Content extends to browser window edges
   * **Center:** Content fits more centrally in browser window
8. Click **Save**

![Configuring basic customization](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_ScreenGIF-Basic_site_customization.gif)

---

## Advanced site customization

Personalize website by incorporating branding elements, header/footer sections, homepage, login page, and error pages in one central location.

1. Navigate to **Settings** > **Knowledge base site** > **Customize site** in Knowledge base portal

   Page holds all basic site design configurations
2. Click **Customize site**
3. Configure site elements:

   * [Site header & footer](/help/docs/site-header-and-footer): Customize [Header](/help/docs/header-primary-navigation), [footer](/help/docs/footer-navigation), etc.
   * [Main pages](/help/docs/main-pages): Customize Home, Documentation, and Login pages
   * [Error pages](/help/docs/error-pages): Customize [404 page](/help/docs/404-page), [Access denied](/help/docs/access-denied-page), [Unauthorized](/help/docs/unauthorized-page), and [IP restrictions](/help/docs/ip-restriction-page) pages
   * [Custom CSS / JavaScript](/help/docs/custom-css-javascript): Add advanced styling or interactivity

   Changes applied on left section previewed on right window. Click desired item in Preview window to edit specific element
4. Use dropdown to choose different pages

   New Home page builder interface provides easier navigation and customization
5. Click **Save** to save changes
6. Click **Preview** to see site appearance
7. Click **Publish** to commit changes

![Configuring advanced customization](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_ScreenGIF-Advanced_site_customization.gif)

---

### FAQs

#### How do I change the site theme?

1. Navigate to **Settings** > **Knowledge base site** > **Customize site** in Knowledge base portal
2. In **Site theme** section, choose from:

   * Both Light & Dark
   * Light only
   * Dark only

#### How do I change the Favicons?

Favicon (16x16 pixels) identifies website in browser tabs, bookmarks, and history.

1. Navigate to **Settings** > **Knowledge base site** > **Customize site** in Knowledge base portal
2. In **Branding** section, hover over default favicon and click **Click to change**
3. Add Favicon via:

   * **Using a URL:** Paste image URL and click **Insert**
   * **Upload an image:** Choose file from Drive or upload from local storage and click **Insert**
4. Click **Save**

> **PRO TIP**
>
> * Use minimalistic, square images
> * Ensure favicon sized at 48 x 48 pixels for optimal rendering

#### Why is the favicon added not rendering on the Knowledge base site?

Favicon doesn't meet specified criteria (size/format). Make necessary changes or re-upload.

#### How do I change the site logo?

Replace default **Logo** by uploading desired logo.

1. Navigate to **Settings** > **Knowledge base site** > **Customize site** in Knowledge base portal
2. In **Branding** section, hover over default **Logo** and click **Click to change**
3. Add Logo via:

   * **Using a URL:** Paste image URL and click **Insert**
   * **Upload an image:** Choose file from Drive or upload from local storage and click **Insert**
4. Click **Save**

#### How do I add text as the logo?

Replace default logo with text.

1. Navigate to **Settings** > **Knowledge base site** > **Customize site** in Knowledge base portal
2. In **Branding** section, click **Don't have a logo? Use name instead**
3. Enter desired text (company name/tagline)

   > Up to 30 characters allowed
   > Maximum logo size: Height - 40 px, Width - 270 px
   > Larger logos scaled down to fit maximum size
4. Click **Save**

#### How do I add custom logo URL?

Add clickthrough URL to logo. Users redirect to provided link when clicking logo.

1. Navigate to **Settings** > **Knowledge base site** > **Customize site** in Knowledge base portal
2. Add desired URL in Logo URL field
3. Click **Save**

> If no logo URL added, clicking logo redirects to Knowledge base home page
> Custom logo URL optional field

#### How do I set a different logo for different themes?

KB site 2.0 projects can add custom code for different logos per theme.

1. Navigate to **Settings** > **Knowledge base site** > **Customize site** > **Custom CSS & JavaScript** in Knowledge base portal
2. From left navigation pane, click **CSS** tab and paste CSS snippet:

```
.brand-logo img {
    content: url('Paste the Light mode logo URL here');
}

/* Override logo image when theme is set to "dark" */
html[data-bs-theme="dark"] .brand-logo img {
    content: url('Paste the Dark mode logo URL here');
}
```

CSS

Copy

#### How to choose the brand color?

1. Navigate to **Settings** > **Knowledge base site** > **Customize site** in Knowledge base portal
2. Under **Colors**, choose **Brand** color for CTAs, selection states, etc.

> If **Auto set color contrast to meet WCAG standards** chosen, light/dark theme colors set automatically. Otherwise, manually set colors for each theme

3. Click **Save**

#### How do I choose font family in customize site?

1. Navigate to **Settings** > **Knowledge base site** > **Customize site** in Knowledge base portal
2. Under **Fonts** section:

* **Article font pairing:** Applied to article Titles and Contents

> Click **Have a specific font combination in mind?** for more options

* **Site font:** Select from dropdown. Applied throughout Knowledge base site - left navigation pane, header/footer navigations, controls

3. Select desired font and click **Save**

> See [How to configure a custom font](/help/docs/how-to-configure-a-custom-font-in-the-knowledge-base)

#### How do I change the default paragraph style?

No direct option exists. Change default article font in Document360 editor.

To set default font for articles:

1. Navigate to **Settings** > **Knowledge base site** > **Customize site** in Knowledge base portal
2. In **Fonts** section, choose desired font pair in **Article font pairing** tile

   > For instance, if drafting in `Verdana` but selecting `Ubuntu + Open Sans` for **Article font pairing**, Knowledge base site shows article title in `Ubuntu` and content in `Open Sans`

> Can select custom fonts. See [How to configure a custom font](/help/docs/how-to-configure-a-custom-font-in-the-knowledge-base)

To change paragraph style for individual articles:

1. Open desired article in **Advanced WYSIWYG editor** and select text
2. Click **Format**, then choose font style in **Typography** section

#### How do I change the button styles?

1. Navigate to **Settings** > **Knowledge base site** > **Customize site** in Knowledge base portal
2. In **Styling** section, select button style:

   * Rounded
   * Sharp
   * Bubble

#### How do I change the site layout in customize site?

1. Navigate to **Settings** > **Knowledge base site** > **Customize site** in Knowledge base portal
2. Under Layout, find:

* **Full width:** Content extends to browser window edges
* **Center:** Content fits more centrally in browser window

3. Click **Save**

#### How do I set the default font for my articles on the Knowledge base site?

1. Navigate to **Settings** > **Knowledge base site** > **Customize site** in Knowledge base portal
2. In **Fonts** section, choose desired font pair in **Article font pairing** tile

   > If drafting in `Verdana` but selecting `Ubuntu + Open Sans`, Knowledge base site shows article title in `Ubuntu` and content in `Open Sans`

> Can select custom fonts. See [How to configure a custom font](/help/docs/how-to-configure-a-custom-font-in-the-knowledge-base)

---

## KB site 2.0 migration

Document360 introduces Knowledge Base Site 2.0 with advanced customization capabilities and new functionalities like following articles/categories, sharing via private links, enhancing user experience and engagement.

> KB Site 2.0 accessible by default for projects created after June 10th, 2024

---

## Customizing your knowledge base site 2.0

1. Navigate to **Settings** > **Knowledge base site** > **Customize site** in Knowledge base portal

   **Customize site** page appears
2. New banner displays to upgrade to Knowledge base site 2.0

> Banner displayed exclusively for Document360 1.0 Standard plan projects

3. Click **Experience 2.0** in banner to explore KB site 2.0 preview
4. Two tabs appear: Site 1.0 (Active) and Site 2.0 (Preview). Site 2.0 tab selected by default
5. In **Site 2.0** tab, view **Knowledge Base Site 2.0 preview** banner with options:

   * Go live with Site 2.0
   * Customize site
   * Preview site 2.0
   * How to configure

![1_Screenshot-Customize_site_page_Kb Site 2.0](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Customize_site_page_Kb%20Site%202.0.png)

### **a. Go live with Site 2.0**

1. Click **Go live with Site 2.0** to publish KB Site 2.0 with same functionalities as KB Site 1.0, without customization

   **Publish confirmation** panel appears

> Cannot deselect configurations first time editing

2. Click **Continue**

   **Switch from Knowledge base site 1.0 to 2.0** panel appears
3. Enter project subdomain and click **Switch to 2.0**

   Migrated to KB site 2.0

> From KB Site 1.0, logo, favicon, primary color, link colors, title & body font, and site layout retained

4. Within 30 days, can revert to KB Site 1.0 by clicking **Rollback to Site 1.0**. Team reviews request and reverts site to version 1.0

> After rollback, system stores last saved KB site preview

![2_ScreenGIF-Go_Live_Site_2_0_Migration](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_ScreenGIF-Go_Live_Site_2_0_Migration.gif)

### **b. Customize site**

1. Click **Customize site**

   Overview of customize site page appears
2. Customize various pages: Site header & footer, Main pages, Error pages, Custom CSS & JavaScript
3. Click **Save** to save changes as draft
4. Click **Preview** to view changes in Knowledge base site
5. Click **Go live with Site 2.0** to publish changes
6. Select desired configurations and click **Continue**

   **Switch from Knowledge base site 1.0 to 2.0** panel appears
7. Enter project subdomain and click **Switch to 2.0**

![3_ScreenGIF-Customize_site_2.0_option_Migration_2_0](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_ScreenGIF-Customize_site_2.0_option_Migration_2_0.gif)

### **c. Preview site 2.0**

Click **Preview site 2.0** to view KB site 2.0 with default branding elements retained from KB site 1.0

### **d. How to configure**

Click **How to Configure** for instructional video

---

### FAQ

**Will I lose any integrations or extensions when switching from KB site 1.0 to KB site 2.0?**

No. All integrations and extensions configured in KB site 2.0 continue working seamlessly.

---

## Web Content Accessibility Guidelines (WCAG)

In digital age, accessibility is necessity, not feature. Ensuring all users can access and use products is cornerstone of inclusive design. Document360 complies with WCAG 2.1 A and AA standards.

> WCAG available exclusively in KB Site 2.0 for projects created after June 10th, 2024

---

## Implementing WCAG 2.1 A and AA in Document360

Document360 aligned with WCAG 2.1 A and AA guidelines:

1. **Text alternatives:** Provide text alternatives for non-text content like images/icons for screen readers
2. **Keyboard navigation:** Full keyboard navigation enables access without mouse
3. **Readable text:** Clear fonts, appropriate contrast ratios, simple language enhance readability

![WCAG 2.1](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_ScreenGIF-WCAG.gif)

---

## Key Principles of WCAG 2.1

WCAG 2.1 organized around four core principles:

1. **Perceivable:** Information/interface components presented in perceivable ways. Includes text alternatives for non-text content
2. **Operable:** Interface components/navigation easy to use. All functionality available from keyboard, sufficient time to read/use content, easy navigation/find content
3. **Understandable:** Information/interface operation understandable. Text readable/comprehensible, web pages operate predictably
4. **Robust:** Content robust enough for reliable interpretation by wide range of user agents, including assistive technologies. Ensures compatibility with current/future technologies

> See [**WCAG 2.0 Guidelines**](https://www.w3.org/TR/WCAG21/)

---

## Header - Primary navigation

Primary navigation header is bar next to logo at top of site. Add menus helping readers navigate different pages from Home page or Knowledge base site.## 404 Page

A 404 page appears when readers try to access nonexistent pages in the Knowledge base site. For example, attempting to access a deleted URL triggers the 404 page.

Customize this error page by adding a custom message and illustration. This improves user experience by guiding readers to relevant content instead of leaving them on a generic error page. Add links, titles, descriptions, and images that reflect your brand. Choose between basic or custom styling options.

> Once configured, you cannot revert to the default 404 page. Custom pages are recommended for better reader experience.

---

### Accessing the 404 page design settings

To access the 404 page:

1. Navigate to **Settings** () > **Knowledge base site** > **Customize site** in the Knowledge base portal.
2. Click **Customize site**.
3. From the left dropdown menu, select **404** under **Error pages**.
4. Choose from two options:
   * **Basic style**: Customize the default image only
   * **Custom style**: Add custom HTML and CSS. Use the **Preview** toggle to switch between code view and rendered view
5. Click **Save** to save changes.
6. Click **Preview** to see changes on the site.
7. Click **Publish** to activate changes on the Knowledge base site.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Accessing_404_pages_Design_settings.png)

---

### Customizing the 404 page

#### Basic style

1. Navigate to **Settings** () > **Knowledge base site** > **Customize site** in the Knowledge base portal.
2. Click **Customize site**.
3. From the left dropdown menu, select **404** under **Error pages**.
4. Select **Basic style**.
5. Click **Choose image** to select an image from Drive.
6. Click **Save** and then **Publish**.

#### Custom style

1. Navigate to **Settings** () > **Knowledge base site** > **Customize site** in the Knowledge base portal.
2. Click **Customize site**.
3. From the left dropdown menu, select **404** under **Error pages**.
4. Select **Custom style**.
5. Choose one of three options:
   * **Theme A**: Predefined theme with editable code
   * **Theme B**: Predefined theme with editable code  
   * **Blank**: Add custom HTML
6. Click **Preview** to view output without saving.
7. Click **Save** to apply changes.
8. Click **Publish** to activate changes on your Knowledge base site.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_ScreenGIF-Customizing_the_404_page.gif)

---

### FAQ

#### Can I upload images from local storage for 404 page design?

Yes, you can import images from Drive or local storage.

#### Is it possible to switch back to the default static 404 page after configuring a custom one?

No. Once you configure a custom 404 page, you cannot revert to the default static page.## Customizing the 404 page

To customize the 404 page:

1. Navigate to **Settings** > **Knowledge base site** > **Customize site** in the Knowledge base portal.
2. Click **Customize site**.
3. From the left dropdown menu, select **404 page**.
4. Choose one of two customization options:
   * **Basic style**: Modify the default image, heading, paragraph, and buttons
   * **Custom style**: Add custom HTML and CSS
5. Click **Preview** to test changes.
6. Click **Save** to save changes.
7. Click **Publish** to activate changes on your Knowledge base site.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Accessing_custom_pages_Design_settings.gif)

---

### Basic style

#### Image

1. Click **Image**.
2. Click **Change** and choose:
   * **Default images**: Select from predefined images
   * **Image**: Provide URL or upload from drive
3. Set image alignment (left, center, or right).

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-Upload_Image_Basic_style.png)

#### Heading

1. Click **Heading**.
2. Enter heading text.
3. Select text color.

Default: "404"

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_Screenshot-Header_Basic_style_.png)

#### Paragraph

1. Click **Paragraph**.
2. Enter description.
3. Select text color.

Default: "Oops! Page not found"

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_Screenshot-Paragraph_Basic_style_.png)

#### Buttons

Add up to three navigation buttons:

1. Click **Buttons**.
2. Click **Add button**.
3. Enter button text and destination URL.
4. Use **Delete** () to remove buttons or **Hide** () to temporarily hide them.
5. Click **Delete** at bottom to remove all buttons.
6. Click **Save** when finished.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/5_Screenshot-Buttons_Basic_style_.png)

Suggested links:
* Home page
* Contact page/form
* Knowledge base sitemap
* Popular blog pages
* Key product/category pages

---

### Custom style

1. Select **Custom style**.
2. Switch between **HTML** and **CSS** sections.
3. Update code as needed.
4. Toggle **Preview** to view changes.
5. Click **Save** and **Publish**.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/6_Screenshot-Custom_style_preview.png)

> **Page not found** analytics show URLs generating 404 errors. Use redirect rules to fix broken links and improve user experience. See [Page not found analytics](/help/docs/page-not-found-analytics).

> **Links status** checks for broken links across your Knowledge base site. See [Link status](/help/docs/links-status).

---

### FAQ

#### What causes 404 errors?

* **Deleted URL**: Article removed without redirect
* **Changed URL**: URL modified without redirect rule
* **Subfolder path**: Changing subfolder from default "docs" causes errors (applies only when subfolder host is disabled)
* **Misconfigured redirect**: Redirect rule points incorrectly or causes loop
* **Incorrect URL**: Mistyped or improperly formatted URL (slugs must be lowercase)
* **Server issues**: Infrastructure problems preventing page load

#### Best practices for 404 pages

1. **Maintain design consistency**: Match site branding, colors, and fonts
2. **Use clear language**: Avoid technical jargon; acknowledge error humanely
3. **Provide navigation**: Include links to homepage, search, popular pages
4. **Add search bar**: Help users find what they're looking for
5. **Explain the issue**: Briefly mention broken links or moved content
6. **Include CTAs**: Link to support or broken link reporting
7. **Add personality**: Use humor or visuals to reduce frustration
8. **Ensure functionality**: Test all buttons and links
9. **Enable feedback**: Provide way to report issues
10. **Consider SEO**: Include proper meta tags and internal links
11. **Use engaging visuals**: Custom illustrations or animations
12. **Test mobile**: Ensure responsive design works on all devices

<a id="access-denied-page"></a>

## Access denied page

**Plans supporting error page**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Appears when users with limited permissions try to access restricted content. For example, readers accessing content outside their authorized categories in mixed knowledge bases.

Customize with clear messaging like: "You don't have permission to access this page. Contact your admin to request access."

> Only available for Private and Mixed projects. Cannot revert to default once customized.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-Example_Access_denied_custom_page.png)

---

## Customizing the Access denied page

1. Navigate to **Settings** > **Knowledge base site** > **Customize site**.
2. Click **Customize site**.
3. Select **Access denied** page from left dropdown.
4. Choose customization option:
   * **Basic style**: Modify default image, heading, paragraph
   * **Custom style**: Add custom HTML and CSS
5. Click **Save** to save changes.
6. Click **Preview** to test changes.
7. Click **Publish** to activate.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_ScreenGIF-Customizing_the_Access_Denied_page.gif)

---

### Basic style

#### Image

1. Click **Image**.
2. Click **Change** and choose:
   * **Default images**: Select from predefined options
   * **Image**: Provide URL or upload from drive
3. Set alignment (left, center, right).

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-Image_basic_style_access_denied_page.png)

#### Heading

1. Click **Heading**.
2. Enter text.
3. Select color.

Default: "Sorry!"

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_Screenshot-heading_basic_style_access_denied_page.png)

#### Paragraph

1. Click **Paragraph**.
2. Enter description.
3. Select color.

Default: "You are not authorized to access this article or page."

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_Screenshot-Paragraph_basic_style_access_denied_page.png)

---

### Custom style

1. Select **Custom style**.
2. Switch between **HTML** and **CSS** sections.
3. Update code.
4. Toggle **Preview** to view changes.
5. Click **Save** and **Publish**.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/5_Screenshot-Custom_style_access_denied_page.png)

---

### FAQ

**Is the Access denied page available for all project types?**

No. Only for Private and Mixed projects.

**Can I revert to default Access denied page?**

No. Once customized, default cannot be restored.

**How do I hide heading and paragraph elements?**

1. Navigate to **Settings** > **Knowledge base site** > **Customize site**.
2. Click **Customize site**.
3. Select **Access denied** page.
4. Hover over element and click **Hide** ().
5. Click **Unhide** () to restore.

> Image element cannot be hidden or deleted.

**Can I upload custom images?**

Yes. Use default images or upload your own.

**Best practices for Access denied pages**

* Use clear, instructive language: "Contact admin for access"
* Link to help resources or support
* Test responsive design on all devices

<a id="unauthorized-page"></a>

## Unauthorized page

**Plans supporting error page**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Appears when users without proper permissions access restricted content.

Customize with descriptive message explaining access restrictions and solution.

> Cannot revert to default once configured. Recommended for better user experience.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-Example_Unauthorized_denied_custom_page.png)

---

## Customizing the Unauthorized page

1. Navigate to **Settings** > **Knowledge base site** > **Customize site**.
2. Click **Customize site**.
3. Select **Unauthorized** page from dropdown.
4. Choose option:
   * **Basic style**: Modify default elements
   * **Custom style**: Add custom HTML/CSS
5. Click **Save**.
6. Click **Preview**.
7. Click **Publish**.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_ScreenGIF_Accessing_Unauthorized_page.gif)

---

### Basic style

#### Image

1. Click **Image**.
2. Click **Change** and choose:
   * **Default images**: Predefined options
   * **Image**: URL or file upload
3. Set alignment.

#### Heading

1. Click **Heading**.
2. Enter text.
3. Select color.

Default: "Sorry!"

#### Paragraph

1. Click **Paragraph**.
2. Enter description.
3. Select color.

Default: "You are not authorized to access this article or page."

---

### Custom style

1. Select **Custom style**.
2. Switch between **HTML** and **CSS** sections.
3. Update code.
4. Toggle **Preview**.
5. Click **Save** and **Publish**.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-Custom_Style_in_Unauthorized.png)

<a id="ip-restriction-page"></a>

## IP restriction page

**Plans supporting error page**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Appears when users access the Knowledge base from restricted IP addresses.

Customize with clear instructions like: "Your IP address is not authorized. Contact admin for access."

> Only available for Enterprise plan projects. Cannot revert to default once customized.

---

## Customizing the IP restriction page

1. Navigate to **Settings** > **Knowledge base site** > **Customize site**.
2. Click **Customize site**.
3. Select **IP restriction** page from dropdown.
4. Choose option:
   * **Basic style**: Modify default elements
   * **Custom style**: Add custom HTML/CSS
5. Click **Save**.
6. Click **Preview**.
7. Click **Publish**.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_ScreenGIF-Accessing_IP_restriction_page_in_the_Knowledge_base_portal.gif)

---

### Basic style

#### Image

1. Click **Image**.
2. Click **Change** and choose:
   * **Default images**: Predefined options
   * **Image**: URL or file upload
3. Set alignment.

#### Heading

1. Click **Heading**.
2. Enter text.
3. Select color.

Default: "Sorry!"

#### Paragraph

1. Click **Paragraph**.
2. Enter description.
3. Select color.

Default: "Your IP address {{template:IPAddress}} is restricted from accessing this article or page."

---

### Custom style

1. Select **Custom style**.
2. Switch between **HTML** and **CSS** sections.
3. Update code.
4. Toggle **Preview**.
5. Click **Save** and **Publish**.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_Screenshot-Adding_Custom_CSS&JS_in_the_IP_restriction_page.png)## Follow articles and categories

**Plans supporting readers to follow articles and categories**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

The **Follow articles and categories** feature in Document360 allows users to receive notifications about new content and updates. Followers get email alerts when articles are published or modified.

> **NOTE**
>
> This feature works only for **Private** and **Mixed** projects in **KB site 2.0** (projects created after June 10th).

---

## Enabling the 'Show Follow button' in KB Portal

1. Go to **Settings** () > **Knowledge base site** > **Article settings & SEO**.
2. In the **Article header** section, toggle **Show Follow button** on.

![Reader notification](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-Enabling_Reader_Notification.png)

> **NOTE**
>
> The **Show Follow button** toggle is enabled by default for new Private and Mixed projects.

---

## Using Follow articles and categories in KB Site

1. Go to the desired category and click **More (•••)**.
2. Click **Follow category**.

   A "Notification turned on" message appears.
3. To follow an article, navigate to it and click **Follow**.

![Reader notification](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-follow_and_Follow_category.png)

You'll receive email notifications when:

* A new version of an article or page category is published
* Any newly published article, page category, or replicated article is published
* An article or page category is republished
* A published article is unhidden or recovered from the recycle bin
* The next version of an article is published via Zapier and Crowdin integration
* The next version of an article is published via API endpoint

> **NOTE**
>
> * When following a category, you'll get email notifications within **30 minutes** for updates to that category, including all sub-categories (up to level six) and associated articles.
* In mixed projects, clicking **Follow category** redirects you to the login page if you're not logged in.

Email notifications are NOT sent when:

* Articles or categories are deleted
* Articles or categories are hidden
* The next version of an article is hidden
* An article is reordered or moved to another category
* The reader doesn't have view access to the article/category

> **NOTE**
>
> Readers are redirected to the respective article or login page from email notifications.

---

### FAQs

#### How do readers configure their email domain for notifications?

Notifications come from the domain set in **Settings** () > **Knowledge base portal** > **Notifications** > **Email domain**. If not configured, emails default to **support@document360.com**.

#### How do I customize the 'Follow' button?

Change the **Follow** variable name in **Settings** () > **Localization & Workspace** > **Localization variables** > **Article Header**. Enter the desired name in the **Follow** field and click **Save**.

#### How do I unfollow a category?

1. Go to the desired category and click **More (•••)**.
2. Click **Unfollow**. A **Notification turned off** message appears.

#### How do I unsubscribe from Follow notifications?

Click **Unsubscribe** in the email. If not logged in, you'll be redirected to the login page. The article or category will be automatically unfollowed.

#### Is the 'Follow Article' feature available for JWT users?

No. The "Follow Article" feature doesn't work with JWT authentication.

<a id="search-in-knowledge-base-site"></a>

## Search in Knowledge base site

**Plans supporting Search in Knowledge base site**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Your Document360 knowledge base includes a fast search bar above articles. Results are filtered by relevance and show article/category names, content previews, and breadcrumbs. **Advanced search** lets you filter results. You can search across all workspaces and languages simultaneously. **Search attachments** finds content inside PDF files.

---

## Search attributes

Search results are based on:

* Article and category titles
* Tags
* Article and category slugs
* Breadcrumbs
* Article content

> **NOTE**
>
> **Search priority:** Article title > Tags > Slugs > Breadcrumbs > Content

---

## Advanced search

Advanced search filters results with options for combined searches across workspaces and languages.

**Example:** Searching for `login` across multiple workspaces:

1. Enter `login` in the search bar.
2. Click **More article filters**.
3. Apply filters: Workspace, Language, Tags, Contributors, Date, Categories.

### Enabling advanced search

1. Go to **Settings** () > **Knowledge base site** > **Article settings & SEO**.
2. In the Search settings section, toggle **Enable advanced search** on.
3. Select **Include all workspaces in site searches** to make "All workspaces" the default search filter.

> **NOTE**
>
> If **Enable advanced search** is off, filter options won't appear.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/8_New_Screenshot-Enabling_Advanced_Search_in_the_knowledge_base_portal.png)

### Accessing advanced search

1. Enter a keyword in the search bar.
2. Click **More article filters**.
3. Use available filters:

| Filter | Description |
| --- | --- |
| **Workspace** | * **Current workspace**: Search within current workspace * **All workspaces**: Search across all workspaces * **Specific**: Limit search to selected workspaces |
| **Language** | * **Current language**: Search in active language * **All languages**: Search across all languages * **Specific**: Focus search on selected languages |
| **Tags** | Narrow results to articles with selected tags |
| **Contributor** | Filter by contributors from dropdown |
| **Date** | Filter by date range: Last 7/30/90 days or Custom range |
| **Categories** | Refine results to articles in selected categories |

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-Accessing_advanced_search_in_KB_site.gif)

---

## Search attachments

Search attachments finds content within PDF files. When searching, four filter tabs appear:

* **Categories**: Results within categories
* **Articles**: Results within articles
* **API Docs**: Results within API documentation
* **Files**: Results within PDF attachments

**Example**: If "SharePoint" yields no article results, switch to the Files tab to find relevant PDF content.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/9_new_Screenshot-Search_attacment_.png)

### Enabling attachment tab in search

1. Go to **Settings** () > **Knowledge base site** > **Article settings & SEO** > **Article settings**.
2. Expand **Search settings** and toggle **Show attachments tab in search** on.

> **NOTE**
>
> * If **Show article files** is off, **Show attachments tab in search** becomes inaccessible. Enable **Show article files** first.
* When disabled, search only covers article/page elements: title, slug, tags, content.

---

## No search result feedback

When a search returns no results, either a blank page appears or a feedback form shows up if enabled. This form lets readers describe what they were looking for. Feedback can be reviewed in [Search analytics](/help/docs/analytics-search) to improve content.

### Enabling no search result feedback

1. Go to **Settings** () > **Knowledge base site** > **Article settings & SEO** > **Article settings**.
2. Expand **Search settings** and toggle **No search result feedback** on.

> **NOTE**
>
> The feedback form appears on both the Knowledge base site and widget.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_Screenshot-Enabling_no_search_result_feedback.png)

**Knowledge base site view**

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/5_Screenshot-No_search_feedback_KB_site.png)

---

## Search filters

The **Filter** option left of the search bar narrows results:

* **Search category titles**: Shows categories and articles containing the keyword
* **Search attachments**: Shows files containing the keyword
* **Workspace**: 
  + Current Workspace: Searches active workspace
  + All Workspaces: Includes all workspaces and API documentation
  + Specific: Select particular workspaces
* **Language**:
  + Current Language: Searches active language
  + All Languages: Includes all supported languages
  + Specific: Select particular languages

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/6_Screenshot-Search.png)

---

## Search operator support

Search operators improve query precision:

* **Double Quotes (`""`)**: Search exact phrases. Words inside quotes must appear in that order.
* **Minus Sign (`-`)**: Exclude words. Place minus directly before word (no space) to exclude it.

Examples:

* `search -recipe` finds records with `search` but not `recipe`
* `search-recipe` finds records with both words (no exclusion)
* `-recipe pasta` finds records with `pasta` but not `recipe`
* `"-recipe"` finds records literally containing `"-recipe"`

---

## FAQs

#### What is Advanced search?

Advanced search lets you search across all workspaces and languages simultaneously using filters.

#### How do I hide the search bar on the Home page?

1. Go to **Settings** () > **Knowledge base site** > **Customize site**
2. Select **Customize site**
3. Choose **Header & Footer** > **Home**
4. Click **Hero section** > **Search**
5. Click the eye icon to hide the search bar

#### How do I exclude an article from search?

Read [Excluding articles from search engines](https://docs.document360.com/docs/excluding-articles-from-searches).

Hidden articles don't appear in the knowledge base site but can be found in the Knowledge base portal.

> **NOTE**
>
> Categories and page categories can also be hidden.

#### Will search include API documentation?

By default, search uses **Current workspace** filter. Select **All workspaces** to include API documentation.

For Document360 1.0:
1. Go to **Settings** () > **Knowledge base site** > **Article settings & SEO** > **Article settings**
2. Expand **Search settings**
3. Select **Include all workspaces in site searches**

#### How does search bar behave with RTL languages?

When RTL language (Hebrew, Arabic) is selected:
* Text aligns right
* Input direction is right-to-left

Multiple languages:
* **All RTL**: Maintains right-to-left input and alignment
* **Mixed RTL/LTR**: Behavior depends on default language

<a id="liking-or-disliking-an-article"></a>

## Liking or disliking an article

**Plans supporting article like or dislike feature**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Users can like or dislike articles in the Document360 Knowledge base site. This feedback helps improve content quality. Users can change their feedback by clicking the opposite button.

> **NOTE**
>
> Undo feature works only in KB Site 2.0 projects. Read about [KB site 2.0 Migration](/help/docs/kb-site-20-migration).

---

## Liking or Disliking an article

To like an article:
1. Navigate to the article
2. Click the **like** icon at the end
3. Optionally enter feedback
4. Select **Notify me about updates** and enter email if desired
5. Click **Submit**

To dislike an article:
1. Click the **dislike** icon
2. Select feedback option or click **Others** for custom feedback
3. Select **Notify me about updates** and enter email if desired
4. Click **Submit**

To undo:
1. Click the **like** or **dislike** icon again

> **NOTE**
>
> * Dislike feedback requires a comment
* Works in both Knowledge base site and widget
* In Public sites, undo works within 30 days unless browser cache is cleared

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_ScreenGIF-liking_and_disliking_an_Article.gif)

---

### FAQs

**What happens when I undo a dislike after submitting feedback?**

In Feedback manager:
* Open feedback gets deleted
* Assigned feedback gets marked as **Removed**

**Will undoing a dislike appear in Analytics?**

No. Undo cancels the action entirely.

**What happens if I select "Notify me about updates"?**

Team members can respond to your feedback in the portal, and you'll receive email notifications.

**Can I provide multiple likes or dislikes?**

No, but you can change your feedback by clicking the opposite button. Previous comments remain associated with the new feedback type.

<a id="smart-bar"></a>

## Smart bars

**Plans supporting Smart bars in knowledge base site**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Smart bars display customizable banners across your Knowledge base site. They can show information, announcements, or messages based on conditions like user location, browser type, or language settings.

---

## Smart bar overview

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_New_Screenshot-Overview_of_Smart_bars.png)

1. **Select language**: Shows global language and project languages with Smart bar counts
2. **Status**: Indicates if Smart bar is active
3. **Details**: Shows name, position, and preview option
4. **Show rules**: Lists conditions for display
5. **Hide rules**: Lists conditions for hiding
6. **Edit**: Modify Smart bar
7. **Delete**: Remove Smart bar
8. **Filters**: Sort by name, location, rules
9. **New smart bar**: Create new Smart bar

---

## Creating a new Smart bar

1. Go to **Settings** () > **Knowledge base site** > **Smart bars**
2. Click **New smart bar**
3. Enter name
4. Set status (on by default)

#### Configuring content

5. Expand **Content** section
6. Use **Global** toggle for all languages or specific ones
   * **Global On**: Appears across all pages and languages
   * **Global Off**: Select specific languages
7. Add content using formatting tools

#### Customizing Design and location

8. Expand **Design and location**
9. Select position:
   * **Site top**
   * **Site bottom**
   * **Article top**
   * **Article bottom**

10. Choose color theme:
    * **Light theme**: Grey background, black text
    * **Dark theme**: Black background, white text
    * **Custom theme**: Set custom colors

**Advanced display conditions**

11. Configure visibility rules:

| **Condition** | **Description** | **Example** |
| --- | --- | --- |
| **URL** | Specific URLs to include/exclude | Promotional banner on product pages |
| **Query strings** | Use parameters with operators | Discount code when campaign string present |
| **IP address** | Target specific IPs or ranges | Internal updates for office network |
| **Browser** | Based on user's browser | Compatibility warnings for old browsers |
| **Device** | Desktop, mobile, or tablet | Mobile app download banner |
| **Project** | Specific projects, categories, tags | New feature announcements |
| **Language** | Only if Global is on | Localized welcome messages |

12. Select **AND**/**OR** logic for multiple rules
13. Click **Add**

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_ScreenGIF-Adding_Smart_bar.gif)

---

### FAQs

#### How do I edit a Smart bar?

1. Go to **Settings** () > **Knowledge base site** > **Smart bars**
2. Hover over Smart bar and click **Edit**
3. Modify content
4. Click **Update**

#### How do I delete a Smart bar?

1. Go to **Settings** () > **Knowledge base site** > **Smart bars**
2. Hover over Smart bar and click **Delete**

<a id="cookie-consent"></a>

## Cookie consent

**Plans supporting cookie consent in knowledge base site**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Document360 lets you add cookie consent bars or popups for readers.

---

## Adding cookie consent

1. Go to **Settings** () > **Knowledge base site** > **Cookie consent**

> **NOTE**
>
> Toggle **Enable cookie consent** on and click **Save**

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Cookie_consent_Overview_page.png)

### Select language

2. Set message for **All languages** or specific language

> **NOTE**
>
> * Message can be localized and styled
* **All languages** shows across all languages
* Unspecified languages show the **All languages** message

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot_Selecting_languages_for_Cookie_Consent.png)

### Content

3. Add custom message using formatting tools
4. Click **Restore default message** to reset

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_Screnshot-Content_part_in_the_cookie_consent.png)

### Theme and position

5. Select **Bar** or **Popup**
6. Set position:
   * **Bar**: Top or Bottom
   * **Popup**: Various positions
7. Choose CTA type: Text, Button, or Icon
8. Enter CTA text
9. Select color theme:
   * **Light**: White background, black text
   * **Dark**: Black background, white text
   * **Custom**: Set custom colors
10. Click **Preview**
11. Toggle **Enable cookie consent** on
12. Click **Save**

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_Screenshot-Them_and_position.png)

---

### FAQs

**What is cookie consent?**

Users agreeing to website cookie usage for analytics, personalization, or advertising.

**Can I customize the message?**

Yes, using text formatting and hyperlinks.

**Can I set multiple languages?**

Yes, specific languages or all languages.

**How do I control cookie settings?**

Document360 cookies are essential and cannot be disabled. For optional cookies, use a dedicated cookie management platform.

<a id="accessing-the-ticket-deflectors"></a>

## Accessing ticket deflectors in portal

**Plans supporting ticket deflector**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Ticket deflectors reduce support tickets by helping users resolve queries independently.

---

## Ticket deflectors overview

Go to **Settings** () > **Knowledge base site** > **Ticket deflectors**

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Overview_of_ticket_deflector.png)

1. **Title**: Ticket deflector title
2. **Status**: Online/offline toggle
3. **Last updated by**: Team member who last modified
4. **Last updated**: Modification date
5. **New ticket deflector**: Create new deflector
6. **Integrate your Helpdesk**: Configure Freshdesk/Zendesk

Hover options:
7. **Copy**: Generate link (active deflectors only)
8. **Clone**: Duplicate deflector
9. **Preview**: View in knowledge base
10. **Edit**: Modify settings
11. **Delete**: Remove deflector

> **NOTE**
>
> * Set to offline before deleting
* Only configurable for main workspace and its languages

---

## Helpdesk configuration

Integrate with **Freshdesk** or **Zendesk** for direct ticket creation.

1. Go to **Settings** () > **Knowledge base site** > **Ticket deflectors**
2. Click **Integrate your Helpdesk**
3. Choose platform

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-Helpdesk_configuration_panel.png)

**Freshdesk Integration**
1. Enter API key and domain URL
2. Click **Validate & save**

> **NOTE**
>
> See [Freshdesk help article](https://support.freshdesk.com/en/support/solutions/articles/215517-how-to-find-your-api-key) for API key details

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_Screenshot-Freshdesk_configuration_panel.png)

**Zendesk Integration**
1. Enter API key, domain URL, and agent email
2. Click **Validate & save**

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_Screenshot-Zendesk_configuration_panel.png)

---

## Adding Ticket deflectors to Header/Footer

#### Header navigation

1. Go to **Settings** () > **Knowledge base site** > **Customize site**
2. Click **Customize site**
3. Select **Site header & footer**
4. Expand **Header** > **Header navigation**
5. Click **Add new item**
6. Select **Ticket deflector** type
7. Enter title and select deflector
8. Check **Open link in new tab**
9. Click **Add**

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/5_Adding_Ticket_deflector_in_Header_navigation.gif)

#### Header secondary navigation

1. Go to **Settings** () > **Knowledge base site** > **Customize site**
2. Click **Customize site**
3. Select **Site header & footer**
4. Expand **Header** > **Secondary navigation**
5. Click **Add new item**
6. Select **Ticket deflector** type
7. Enter title
8. Paste deflector link
9. Check **Open link in new tab**
10. Click **Add**

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/6_Adding_Ticket_deflector_in_Header_secondary_navigation.gif)

#### Footer navigation

1. Go to **Settings** () > **Knowledge base site** > **Customize site**
2. Click **Customize site**
3. Select **Site header & footer**
4. Click **Footer**
5. Choose design: **Basic footer** or **Custom footer**

**Basic footer**
1. Click **Add new link**
2. Enter title and paste deflector link
3. Check **Open link in new tab**
4. Click **Add**

**Custom footer**
1. Paste deflector link in code
2. Click **Save** > **Preview**
3. Click **Publish**

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/7_Adding_Ticket_deflector_in_footer_navigation.gif)

### Using form link

Add ticket deflectors to:
* Articles or category pages
* Deprecation messages
* Smart bars
* Cookie consent notifications
* Snippets and variables
* Knowledge base home page
* Knowledge base assistant

---

### FAQs

#### How do I copy the ticket deflector link?

1. Go to **Settings** () > **Knowledge base site** > **Ticket deflectors**
2. Click **Copy** next to deflector

#### What does Clone do?

Duplicates existing deflector with all settings and content.

#### Can I preview before publishing?

Click **Preview in Knowledge base**.

#### How do I delete a ticket deflector?

1. Go to **Settings** () > **Knowledge base site** > **Ticket deflectors**
2. Set status to offline
3. Click **Delete**

<a id="adding-a-new-ticket-deflector"></a>

## Adding a new ticket deflector

**Plans supporting ticket deflector**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Ticket deflectors help users resolve queries independently before contacting support.

> **NOTE**
>
> Business and Enterprise plans support up to 10 ticket deflectors.

---

## Creating a new Ticket deflector

1. Go to **Settings** () > **Knowledge base site** > **Ticket deflectors**
2. Click **New ticket deflector**

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Creating_a_new_ticket_deflector.png)

### Step 1: Title, Slug, and Description

Default title: "**How can we help you?**"

1. Edit title (150 character limit)
2. Edit slug (150 character limit, auto-generated)

> **NOTE**
>
> Changing URL breaks existing references

3. Add description
4. Toggle **Online** for visibility

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-Adding_Ticket_deflector_step1.png)

### Step 2: Context questions

Context questions understand user issues and guide resolution.

> **NOTE**
>
> No character limit for context questions

1. Click **Questions** (two default questions)
2. For each question:
   a. Enter text
   b. Toggle **Enable search** to require knowledge base search
   c. Check **Make search optional** to allow skipping
   d. Choose next action from dropdown
   e. Delete unwanted questions
   f. Click **Add questions**
   g. Reorder questions

> **NOTE**
>
> * At least one qualifying question required
* No limit on question count

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_Screenshot-Context_question_step2.png)

### Step 3: Suggestions

Suggestions provide navigation based on user responses.

> **NOTE**
>
> Suggestions are optional

#### Creating block steps

1. In **Suggestions**, click **Add**
2. Choose type:
   * **Additional question**
   * **Answer**
   * **Answer from your knowledge base**

**a. Additional question**
1. Enter title
2. Enter question
3. Choose next action
4. Delete unwanted questions
5. Add more questions
6. Reorder questions

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_Screenshot-Creating_block_steps_Additional_question.png)

**b. Answer**
Enter title and provide text answer with formatting options.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/5_Screenshot-Creating_block_steps_Answer.png)

**c. Answer from your knowledge base**
1. Enter title
2. Select workspace
3. Search and add article

> **NOTE**
>
> Only one article can be linked per step

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/6_ScreenGIF-Answer_from_your_Knowledge_base.gif)

---

### Step 4: Help request

**Contact form**

Configure form fields:
* **Email**: Mandatory
* **First Name**: Mandatory
* **Last Name**: Optional mandatory
* **Telephone**: Optional mandatory
* **Description**: Mandatory
* **Form submission text**: Customizable
* **Allow attachments**: Up to 5 files, 2 MB each
* **Enable captcha**: Protects against spam
* **After submission message**: Mandatory, 250 character limit

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/7_Screenshot-Help_Request_Contact_form.png)

### Step 5: Ticket submission settings

**Ticket submission email notification**

1. **Email subject**: Up to 100 characters
2. **Send notification email to**: Select team accounts
3. **These emails**: Add additional recipients (no limit)

> **NOTE**
>
> Map forms to specific emails:
* Sales form → sales@yourcompany.com
* Operations form → tech@yourcompany.com

**Connect a helpdesk**

1. Expand **Create helpdesk ticket**
2. Toggle **Create helpdesk ticket on form submission** on
3. Click **Connect a helpdesk**
4. Select platform (Freshdesk/Zendesk)
5. Enter credentials
6. Click **Validate & save**

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/9_Screenshot-connecting_a_helpdesk.png)

---

### Localizing ticket deflector text

1. Go to **Settings** () > **Localization & Workspaces** > **Localization variables**
2. Select language
3. Expand **Ticket deflector** section
4. Update text
5. Click **Save**

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/10_Screenshot-Localizing_the_ticket_deflector.png)

<a id="integrations-getting-started"></a>

## Integrations in Document360

**Plans supporting third party tool integrations**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Document360 supports over 25 third-party integrations in categories:
* **Analytics**
* **Chat**
* **Comments**
* **Marketing automation**

## Adding a new integration

1. Go to **Settings** () > **Knowledge base site** > **Integrations**
2. View existing integrations in **Installed integrations**
3. Scroll to see more apps
4. Find desired app and click **Add**
5. Choose **Basic** or **Custom configuration**
6. Enter required information
7. Click **Add**

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/Integrations%20-%20Overview%20page.png)

> **NOTE**
>
> Required information varies by integration

Click **Learn more** for detailed setup instructions.

---

## Integration controls

Manage integrations from **Settings** () > **Knowledge base site** > **Integrations**:

* **Status** – Green (active) or Gray (inactive)
* **Type** – Integration name and icon
* **Description** – User-defined description
* **Updated on** – Last modification date
* **Users** – Team members who modified integration

### Available integrations

| Analytics | Chat | Commenting | Marketing automation |
| --- | --- | --- | --- |
| * [Amplitude](/help/docs/amplitude) * [FullStory](/help/docs/fullstory) * [GoSquared](/help/docs/gosquared) * [Google Analytics](/help/docs/google-analytics-integration) * [Google Tag Manager](/help/docs/google-tag-manager) * [Heap](/help/docs/heap) * [Hotjar](/help/docs/hotjar) * [Mixpanel](/help/docs/mixpanel) * [Segment](/help/docs/segment-integration) | * [Belco](/help/docs/belco) * [Chatra](/help/docs/chatra) * [Crisp](/help/docs/crisp) * [Doorbell](/help/docs/door-bell) * [Freshchat](/help/docs/freshchat) * [Gorgias](/help/docs/gorgias) * Intercom * [Kommunicate](/help/docs/kommunicate) * [LiveChat](/help/docs/livechat) * [Olark](/help/docs/olark) * [Sunshine Conversations](/help/docs/sunshine) | * [Comment](/help/docs/commento) * [Disqus](/help/docs/disqus) | * [Freshmarketer](/help/docs/freshmarketer) * [VWO](/help/docs/vwo) * [Zoho PageSense](/help/docs/zoho-page-sense) |

---

## Custom HTML

Embed third-party widgets using Custom HTML integration.

### Adding Custom HTML code

1. Go to **Settings** () > **Knowledge base site** > **Integrations**
2. Under **Custom HTML**, click **Add**
3. Choose insertion point:
   * **Header**
   * **Begin Body**
   * **End Body**
4. Paste code snippet
5. Click **Add**

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/Custom%20HTML%20-%20Integrations.png)

---

## Editing or deleting an integration

#### Editing:

1. Hover over integration and click **Edit**
2. Update Status, Description, or App ID/URL
3. Click **Update**

#### Deleting:

1. Hover over integration and click **Delete**
2. Confirm deletion

---

### FAQs

#### What if my integration isn't working?

Verify App ID and URL. Check internet connection. Click **Learn more** for app-specific instructions.

#### Best practices for managing integrations?

Review active integrations periodically. Keep integrations updated.

#### Best practice for analytics scripts?

Use **Custom HTML** option in Integrations section. Add script and save changes.

<a id="advanced-insertion-rules-in-integration"></a>

## Code inclusion and exclusion conditions

**Plans supporting third party tool integrations**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Configure **Code inclusion/exclusion conditions** to control where integrated code runs.

For Google Analytics, set conditions based on:
* **IP Address** – Specific IPs or ranges
* **Workspace** – Selected workspaces
* **Language** – Specific languages

Use **AND/OR** logic for multiple conditions.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/Code%20inclusion%20in%20Integrations%20-%201.png)

### IP address condition

1. In **Upgrade Integration**, select **IP Address**
2. Choose **Show** or **Hide**
3. Select **Exact** or **Range**
4. Specify IP address(es)

### Workspace condition

1. Select **Workspace** condition type
2. Choose **Show** or **Hide**
3. Specify workspaces

### Language condition

1. Select **Language** condition type
2. Choose **Show** or **Hide**
3. Specify language(s)

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/Code%20inclusion%20in%20Integrations%20-%202.png)

<a id="livechat"></a>

## LiveChat

**Plans supporting third party tool integrations**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

LiveChat provides instant customer service using AI. It enables real-time communication and handles multiple chats simultaneously.

---

## Integrating Document360 and LiveChat

1. Go to **Settings** () > **Knowledge base site** > **Integrations**
2. Select **LiveChat** and click **Add**
3. Add Description and enter LiveChat ID

> **NOTE**
>
> LiveChat ID comes from LiveChat application

4. Use **Code inclusion/exclusion conditions** if needed
5. Click **Add**

![2_ScreenGIF-Document360_and_Livechat](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_ScreenGIF-Document360_and_Livechat.gif)

---

## Obtaining the LiveChat ID

#### For existing LiveChat customers

1. Access LiveChat dashboard and click **Install**
2. In **Install chat widget manually**, find ID after "*window.lc.license=*"

![3_Screenshot-getting_Live_chat_ID_Existing_customers](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_Screenshot-getting_Live_chat_ID_Existing_customers.png)

#### For new LiveChat users

1. Copy LiveChat ID during account setup
2. Complete integration in Document360
3. Open LiveChat interface to view chats

> **NOTE**
>
> Deploy bots to handle regular queries in chat box

<a id="olark"></a>

## Olark

**Plans supporting third party tool integrations**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Olark combines live chat with customer data collection.

**Key Features:**
* **Visitor Cobrowsing**: Navigate user screens in real-time
* **Visitor Geolocation**: Location insights
* **Visitor Insights**: Browsing behavior and history
* **Transcripts**: Complete chat records

---

## Integrating Document360 and Olark

1. Go to **Settings** () > **Knowledge base site** > **Integrations**
2. Select **Olark** and click **Add**
3. Add Description and enter Olark ID

> **NOTE**
>
> Olark ID comes from Olark application

4. Use **Code inclusion/exclusion conditions** if needed
5. Click **Add**

![2_ScreenGIF-Integrating_Document360_Olark](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_ScreenGIF-Integrating_Document360_Olark.gif)

---

## Obtaining the Olark ID

1. Sign in to Olark account
2. Go to **Settings** > **Channels**
3. In **Installation Code**, click **Copy to Clipboard**
4. Find `olark.identify()` function
5. Copy thirteen-digit ID (including dashes)

![3_Screenshot-Getting_Olark_ID](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_Screenshot-Getting_Olark_ID.png)

> **NOTE**
>
> Use Olark for lightweight, customizable chat with automation rules

<a id="freshchat"></a>

## Freshchat

**Plans supporting third party tool integrations**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Freshchat is messaging software for sales and customer engagement teams. It supports AI-powered chatbots and integrates with WhatsApp, Apple Business Chat, Facebook Messenger, and LINE.

**Key Features:**
* **One inbox**: Consolidate messages from different platforms
* **Self-Service with AI Bots**: Reduce response times

![002_Screenshot_Freshchat_Integration](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/002_Screenshot_Freshchat_Integration.png)

---

## Integrating Document360 and Freshchat

1. Go to **Settings** () > **Knowledge base site** > **Integrations**
2. Select **Freshchat** and click **Add**
3. Add Description and enter Freshchat Token

> **NOTE**
>
> Freshchat Token comes from Freshchat application

4. Use **Code inclusion/exclusion conditions** if needed
5. Click **Add**

![1_ScreenGIF-Integrating_Document360_and_Freshchat](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_ScreenGIF-Integrating_Document360_and_Freshchat.gif)

---

### Obtaining the Freshchat Token

1. Log in to Freshchat dashboard
2. Go to **Settings** > **Admin settings**
3. Select **Configuration and Workflows**
4. Scroll to **Workflows** > **Web Chat Settings** > **Integration Settings**
5. Under **Web messenger**, copy token

![2_ScreenGIF-Getting_token_from_freshdesk_for_Document360](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_ScreenGIF-Getting_token_from_freshdesk_for_Document360.gif)

<a id="crisp"></a>

## Crisp

**Plans supporting third party tool integrations**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Crisp centralizes customer conversations for instant online communication.

**Key features:**
* **Cost Efficiency**: One agent handles multiple conversations
* **Predefined Answers**: Automated responses to common queries
* **Enhanced Communication Tools**: Images, buttons, GIFs in messages

---

## Integrating Document360 and Crisp

1. Go to **Settings** () > **Knowledge base site** > **Integrations**
2. Select **Crisp** and click **Add**
3. Add Description and enter Crisp website ID

> **NOTE**
>
> Crisp website ID comes from Crisp application

4. Use **Code inclusion/exclusion conditions** if needed
5. Click **Add**

![2_ScreenGIF-Integrate_Document360_and_crisp](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_ScreenGIF-Integrate_Document360_and_crisp.gif)

---

### Getting the Crisp Website ID

#### For existing Crisp customers:

1. Open Crisp dashboard
2. Go to **Settings** > **Website Settings**
3. Copy Website ID from **Setup Instructions**

![02_Screenshot_Crisp_Integration](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/02_Screenshot_Crisp_Integration.png)

#### For new Crisp customers:

1. Get Website ID during account installation
2. Complete integration in Document360
3. Open Crisp interface to respond to chats

> **NOTE**
>
> Use Crisp for chatbots with email campaigns and mobile apps

<a id="chatra"></a>

## Chatra

**Plans supporting third party tool integrations**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Chatra enables real-time interaction between customers and representatives. One agent handles multiple conversations simultaneously.

![2_Screenshot_Chatra_Integrations](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot_Chatra_Integrations.png)

---

## Integrating Document360 and Chatra

1. Go to **Settings** () > **Knowledge base site** > **Integrations**
2. Select **Chatra** and click **Add**
3. Add Description and enter Chatra ID

> **NOTE**
>
> Chatra ID comes from Chatra application

4. Use **Code inclusion/exclusion conditions** if needed
5. Click **Add**

![2_Screenshot-integrating_Document360_and_Chatra](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-integrating_Document360_and_Chatra.gif)

---

### Getting the Chatra ID

#### For existing Chatra customers:

1. Log in to Chatra account
2. Go to **Settings** > **Chat widget**
3. Find `w.Chatra.ID` in Chat Widget window

![3_Screenshot-Chatra_ID_chat_widget_existing_user](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_Screenshot-Chatra_ID_chat_widget_existing_user.png)

#### For new Chatra users:

1. Sign up and verify email
2. Receive Chatra ID in confirmation email

![4_Screenshot-Chatra_ID_chat_widget_new_user_customer](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_Screenshot-Chatra_ID_chat_widget_new_user_customer.png)

> **NOTE**
>
> Chatra enables real-time conversations, targeted chats, and visitor tracking. See [Chatra help](https://chatra.com/help/) for more features.

<a id="door-bell"></a>

## Doorbell

**Plans supporting third party tool integrations**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Doorbell collects, manages, and analyzes customer feedback. Users can attach screenshots for context.

![003_Screenshot_Doorbell_Integration](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/003_Screenshot_Doorbell_Integration.png)

---## Document360 Extensions - Getting started

**Plans supporting Extensions**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Document360 extensions integrate your knowledge base with third-party platforms for more efficient workflows. These extensions allow you to access, manage, and share knowledge base content directly from other platforms.

## Accessing the Extensions page

1. Navigate to **Settings** () > **Knowledge base portal** > **Extensions**.
2. Filter extensions by category:
   * All extensions
   * Helpdesk
   * Team collaboration
   * Code repositories
   * Translation & browser
3. Click **Connect** on the intended extension tile.

**Available extensions:**

**Helpdesk**
* [Freshdesk](/help/docs/freshdesk)
* [Zendesk](/help/docs/zendesk-1)
* [Intercom](/help/docs/intercom-integration)
* [Salesforce](https://docs.document360.com/docs/salesforce-integration)

**Team collaboration**
* [Slack](/help/docs/slack)
* [Microsoft Teams](/help/docs/microsoft-teams)
* [Drift](/help/docs/drift)
* [Zapier](https://docs.document360.com/docs/zapier-integration)
* [Make](/help/docs/make-1)

**Code repositories**
* [GitHub](https://portal.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/document/help/view/7678f7e8-9fd8-48a1-ba64-c0d7ed5ffb45)

**Translation and browser**
* [Chrome](/help/docs/chrome-extension)
* [Crowdin](/help/docs/crowdin)
* [Phrase](/help/docs/phrase)

<a id="freshdesk"></a>

## Freshdesk

**Plans supporting Freshdesk extensions**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Integrate Document360 knowledge base with Freshdesk. Support agents can access knowledge base articles and create new articles directly from Freshdesk without switching tabs.

---

## Setup

1. In Document360, go to **Settings** () > **Knowledge base portal** > **Extensions**.
2. Click **Connect** on the Freshdesk extension.
3. Copy the generated API token.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-Freshdesk_api_token.png)

4. In Freshdesk, go to **Admin** > **Support Operations** > **Apps**.
5. Search for Document360 in the App Marketplace.
6. Paste the API token and click **Install**.

You can add multiple API keys for different Document360 knowledge bases.

---

### Multi-product support

For companies with multiple products and separate knowledge bases, Freshdesk offers Multi-Product Support to handle all products from one portal.

Refer to [Freshdesk's Multi-product setup guide](https://support.freshdesk.com/support/solutions/articles/37638-supporting-multiple-products-with-freshdesk) for integrating multiple Document360 knowledge bases.

---

## Features

### Search and share articles

Once connected, access Document360 articles directly from Freshdesk:

1. Click the Document360 icon in the ticket response window
2. Select workspace and language
3. Search for articles
4. Use **+Link** to insert article hyperlinks or **+Content** to insert full article content

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_Screenshot-Freshdesk_link_connect_buttons.png)

**Automated article search:** Freshdesk automatically searches knowledge base articles using ticket titles and displays matches under "Recommended articles."

### Create articles from Freshdesk

Create new knowledge base articles without leaving Freshdesk:

1. Click the Document360 icon
2. Select workspace and language
3. Click **+Create New Article**
4. Use the Markdown editor to write content
5. Add title and select existing category
6. Click **Create**

> NOTE: You cannot create new categories from Freshdesk. Only existing categories are available.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/5_Screenshot-Freshdesk_create_new_article.png)

<a id="freshservice"></a>

## Freshservice

**Plans supporting Freshservice extensions**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Integrate Document360 knowledge base with Freshservice for better IT service management. Support agents can access and share articles during ticket resolution, plus create new articles directly from Freshservice.

---

## Setup

1. In Document360, navigate to **Settings** () > **Knowledge base portal** > **Extensions**.
2. Click **Connect** on the Freshservice extension.
3. Copy the generated API token.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Freshservice_api_token_details.png)

4. In Freshservice, go to **Admin** > **Automated & Productivity** > **Apps**.
5. Search for Document360 in the Apps marketplace.
6. Paste the API token and click **Install**.

You can integrate multiple Document360 knowledge bases by repeating this process with different API keys.## Integrating Confluence Server with Document360

**Plans supporting integration of Zapier extensions with Document360**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Using Document360 as your knowledge base platform, you can connect it with Confluence Server to synchronize content between the two platforms. This eliminates the need to manually transfer articles from Confluence to Document360.

By connecting Document360 and Confluence Server via Zapier, you can automate content flow. To set up the connection, follow these steps:

1. Log into your [Zapier account](https://zapier.com/app/dashboard).
2. From the left navigation menu, click **Create** > **Zaps**.
3. A new Zap will be created with **Trigger** and **Action** fields.

### Connecting Confluence Server and Document360 in Zapier

#### Step 1: Set up the trigger – Confluence Server

1. In the **Trigger** field, select **Confluence Server**.
2. Choose the required **Trigger event** (e.g., New Page, Updated Page).
3. Click the **Account** field. A sign-in window will appear.
4. Enter your Confluence Server credentials and click **Continue**.
5. Select the space, page, or blog you want to monitor.
6. Click **Continue**.

Zapier will test the trigger to confirm it's configured correctly.

#### Step 2: Set up the action – Document360

1. In the **Action** field, select **Document360**.
2. Choose the desired event (e.g., Create Article).
3. Click the **Account** field. A sign-in window will appear.
4. Enter your Document360 credentials and click **Allow**.

To generate an API token in Document360:

5. Navigate to **Settings** () > **Knowledge base portal** > **Extensions** > **Team collaboration**.
6. Click **Connect** on the Zapier extension tile.
7. Click the **Copy** () icon to copy the token.

8. Return to Zapier and paste the API token.
9. Click **Yes, Continue to Document360**.
10. Select the Document360 project you want to connect.
11. Click **Continue**.

#### Step 3: Customize the Zap

Map fields from Confluence Server to Document360:

* **Title** – Choose from available Confluence fields (e.g., Page Title).
* **Content** – Usually mapped to Page Content, but can be adjusted.
* **Version** – Select the workspace in your Document360 project.
* **Language** – Choose the article language.
* **Category** – Select the category for the new article.
* **Publish** – Set to **True** to publish immediately, **False** to save as draft.

Click **Continue** once all fields are mapped.

#### Step 4: Test and publish the Zap

1. Click **Test step**.
2. If successful, you’ll see the message: *Test Article sent! Check your Document360 account to view it.*
3. Click **Publish**.
4. You’ll get a confirmation: **Your Zap is on**. Click **Manage your Zap** to view it in the Zap overview page.

---

## Zap overview

### Create Document360 articles from new or updated Confluence pages

You can view and edit Zap information from the Zap overview page.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_ScreenShot-Confluence.png)

### Deleting a Zap

To delete a Zap:

1. Go to the **Zapier dashboard**. The overview page lists all existing Zaps.
2. Click the arrow (**>**) next to the Zap you want to delete.
3. Click **Turn off and delete Zap**.

The selected Zap will be deleted.## Integrating Jira with Document360

Using Document360 as your knowledge base platform and Jira for issue tracking, you may need to automatically create knowledge base articles from new Jira issues. This ensures that relevant information about issues is documented and easily accessible.

To establish a connection between Jira and Document360:

1. Ensure that you have logged into your [Make account](https://www.make.com/).
2. Click **Sign in** at the top to access the Make dashboard.

![1_Screenshot-Make_signin_page](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/image-1733464343369.png)

### Step 1: Create a new scenario

1. Click **Create a new scenario** at the top right.
2. Click the add (**+**) icon to view available applications.
3. In the Search field, type **Jira**.
4. Select **Jira** and choose the desired trigger event.

   For example, select **Watch Issues** to monitor new issues.
5. Click **Create a connection** and enter a connection name.
6. Click **Save**.
7. Allow Jira to access your Make account by clicking **Allow**.
8. Click **OK**.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_ScreenGif-Jira_Make.gif)

### Step 2: Configure Jira trigger

Set up your Jira account connection for the new scenario:

![2_Screenshot-Jira_issue_details](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/image-1733466870362.png)

1. Select an existing Jira connection or create a new one.
2. From the **Project Key** dropdown, select the project to monitor.
3. Configure optional filters:
   * **Issue Type**: Filter by specific issue types
   * **Status**: Filter by issue status
   * **Priority**: Filter by priority level
4. In the **Limit** field, specify maximum issues returned per execution cycle.
5. Click **OK**.
6. In the **Choose where to start** popup, select when to begin monitoring issues.
7. Click **OK**.

Your Jira account is now connected to Make.

### Step 3: Connect Document360

After connecting Jira, link your Document360 account:

![3_Screenshot-Jira_add_new_module](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/image-1733468868456.png)

1. On the integration page, click **Add another module** (+).
2. In the Search field, enter **Document360**.
3. Select **Document360** and choose the action to perform.

   For example, select **Create an article** to generate draft articles.
4. Select an existing Document360 connection or create a new one:
   1. Click **Create a connection** and enter a connection name.
   2. Enter your API key and click **Save**.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_ScreenGif-Jira_Make.gif)

To generate the API token from Document360:
1. Navigate to **Settings** () > **Knowledge base portal** > **Extensions** > **Team collaboration**.
2. On the Make extension tile, click **Connect**.
3. Click the **Copy** () icon to copy the token.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_ScreenGif-Jira_Make.gif)

Back in the Make window:
1. Paste the API token.
2. Click the **Article Title** field and select parameters for your article title.

   For example, select the Issue Summary parameter.
3. Click the **Article Content** field and select parameters for article content.

   For example, select Description, Reporter, and Assignee parameters.
4. From the **Project Category ID** dropdown, select where to create new articles.
5. Click **OK**.

![4_Screenshot-Document360_jira_module](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/image-1733472905161.png)

### Step 4: Test the scenario

Before activating, test your scenario:

1. Click **Run once** at the bottom left.
   
   Test details appear at the bottom of the page.
2. Create a new issue in your Jira project.
3. Verify that a new article was created in your Document360 category.

   Check test details or navigate to your Document360 project to confirm.

### Step 5: Schedule the scenario

1. Enable the toggle at the bottom left to schedule executions.

   This runs the scenario every 15 minutes.
2. Click **OK** to save.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_ScreenShot-Jira_Make.png)

### Step 6: Activate the scenario

1. Click the **Exit editing** () icon at the top.

   The integration dashboard appears.
2. Turn on the **ON/OFF** toggle near the **Edit** option to activate the scenario.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/5_ScreenShot-Jira_Make.png)

Once activated, your scenario runs according to the set schedule.

---

Application Programming Interface - A set of rules that allows one software application to communicate with another.## Integrating Jira with Document360

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Jira service desk delivers service experiences for employees and customers. It provides functionalities for service desk management, analytics, request queues, and integration with team collaboration platforms.

---

To integrate Jira with Document360:

1. Log into your [Make account](https://www.make.com/).
2. Click **Sign in** at the top.

   The Make dashboard appears.

![1_Screenshot-Make_signin_page](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/image-1733814317319.png)

### Step 1: Create a new scenario

1. Click **Create a new scenario** at the top right.
2. Click the add (**+**) icon. A list of applications appears.
3. In the Search field, type "Jira Cloud Platform".
4. Select **Jira Cloud Platform** and choose your task.

   For example, select **Watch Issues** to trigger on new responses.

   ![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_ScreenGif-Jira_Make.gif)

### Step 2: Connecting Jira

Connect your Jira account to the scenario:

1. Click **Create a webhook** and enter a **Webhook name**.
2. Click **Create a connection** and enter a **Connection name**.
3. Enter the **Service URL**.
4. Enter the **Username** and **API Token**.
5. Click **Save**.
6. From the **Watch Issues** dropdown, select what you want to track.
7. From the **Select a Method** dropdown, choose how to search issues.
8. If needed, select filters in **Filter**, **Expand**, and **Fields**.
9. In the **Limit** field, enter the maximum number of tasks Make returns per execution.
10. Click **OK**.
11. In the **Choose where to start** popup, select when to start watching issues.
12. Click **OK**.

    ![2_Screenshot-Jira_make_popup_window](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/image-1733815745423.png)

    Your Jira project is now connected to Make.

### Step 3: Connecting Document360

After connecting Jira, link your Document360 account:

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_ScreenShot-Jira_Make.png)

1. On the Integration Jira page, click **Add another module** (+).
2. In the Search field, enter **Document360**.
3. Select **Document360** and choose your action.

   For example, select **Create an article** to create drafts.
4. In the Document360 window, select your existing connection.

   To create a new connection:
   
   1. Click **Create a connection** and enter a **Connection name**.
   2. Enter your API key and click **Save**.

   ![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_ScreenGif-Jira_Make.gif)

5. Navigate to **Settings** > **Knowledge base portal** > **Extensions** > **Team collaboration**.
6. On the Make extension tile, click **Connect**.
7. Click the **Copy** icon to copy the token.

   ![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_ScreenGif-Asana_Make.gif)
8. Return to Make and paste the API token.
9. Click the **Article Title** field and select parameters for your article title.

   For example, select the Task name parameter.
10. Click the **Article Content** field and select parameters for article content.

    For example, select Assignee Name, Resource Type, and Due On.
11. From the **Project Category ID** dropdown, select where to create the article.
12. Click **OK**.

### Step 4: Test the scenario

Before activating, test your scenario:

1. Click **Run once** at the bottom left.

   Test details appear at the bottom.
2. Create a new task in your Jira project.
3. A new article will appear in your Document360 category.

   Verify with test details or check your Document360 project directly.

### Step 5: Schedule the scenario

1. Enable the toggle at the bottom left to schedule scenarios.

   This runs the scenario immediately when data arrives.
2. Click **OK** to save.

   ![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_ScreenShot-Jira_Make.png)

### Step 6: Activate the scenario

1. Click **Exit editing** at the top.

   The integration dashboard appears.
2. Turn on the **ON/OFF** toggle near the **Edit** option to activate the scenario.

   ![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/5_ScreenShot-Jira_Make.png)

Once activated, your scenario runs according to schedule.

---

Application Programming Interface - A set of rules that allows one software application to communicate with another.

<a id="chrome-extension"></a>

## Chrome

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Chrome is a widely used, free cross-platform web browser. The Chrome Web Store offers various extensions.

> Extensions are small software programs that customize browser functionality.

The [Document360 extension](https://chromewebstore.google.com/detail/document360/lifhmbmenhhiolpbbahnjicckcnnophl) is available in the Chrome Web Store.

With the Document360 Chrome Extension and API key, you can access articles and categories from your knowledge base within Chrome anytime.

## Chrome extension: setup

### Adding the Document360 extension in Chrome

1. Open Chrome and navigate to the [Chrome Web Store](https://chromewebstore.google.com/).
2. Search for Document360 extension and click on it.
3. Click **Add to Chrome**.
4. In the popup, click **Add extension**.

![1_Screenvideo-Chrome_Extension_Adding.gif](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenvideo-Chrome_Extension_Adding.gif)

Manage your extension settings:

5. Click More > **Extensions** > **Manage Extensions** to see all extensions.

> NOTE
>
> * You need a Google account to add/remove Chrome extensions.
> * Guest users cannot add Chrome extensions.
> * To use extensions in Incognito, go to **Manage extensions** and enable **Allow in Incognito**.

### API key configuration

1. Click the Document360 icon in the toolbar. A side window appears for the API key.

![5_Screenshot-API_Key.png](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/5_Screenshot-API_Key.png)

2. Navigate to your Document360 portal.
3. Go to Settings > **Knowledge base portal** > **Extensions**.
4. In **Chrome extension**, click **Details**.
5. The Chrome details popup shows the **Internal integration token**.
6. Copy the key using the clipboard icon.
7. Paste the key into the Document360 launcher in Chrome and click **Save**.

   Your knowledge base is now integrated and available in Chrome.

## Feature highlights

**Easy launch and customization**

* After integrating with the API key, launch the Document360 assistant in Chrome.
* Click the Document360 icon in the extension toolbar to launch.
* Toggle the assistant to the left or right side. Default is right.

![2_ScreenVideo-Document360_Extension.gif](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_ScreenVideo-Document360_Extension%282%29.gif)

**Quick launch label**

* When you close the assistant, find the quick launch label on the right side.
* Click the label to launch the assistant on the same tab.
* Drag the label vertically to position it.
* Remove the label by hovering and clicking the **X** button.

**Page Help**

* This is the default tab when launching the extension.
* See top-searched articles based on previous searches.
* Search articles using keywords. Results update as you type.
* Select an article to view it in reader mode.

Reader view options:

1. **Copy**: Copy entire article content to clipboard.
2. **Open in new tab**: Open article in a new browser tab.
3. **Expand**: Expand reader view (not full screen).

![3_Screenshot-PageHelp.png](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_Screenshot-PageHelp.png)

**Knowledge base view**

* Click the Document360 launcher and select the **Knowledge base** tab.
* Browse the entire knowledge base structure within the assistant.
* This mirrors your knowledge base's tree-view structure.
* Click articles to view content in reader mode.

## Removing the Document360 extension in Chrome

To remove the extension:

* Visit the Document360 page in Chrome Web Store, click **Remove from Chrome**, then confirm.
* Or right-click the launcher icon, select **Remove from Chrome**, then confirm.

![4_Scrrenvideo-Removing_Doc360.gif](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_Scrrenvideo-Removing_Doc360.gif)

---

## FAQ

**What can be accessed through the Document360 Chrome extension?**

Access articles and categories from your Document360 knowledge base directly in Chrome. The extension provides search functionality and quick navigation through your knowledge base structure.

Application Programming Interface - A set of rules that allows one software application to communicate with another.## Restoring from a backup

To restore from a backup:

1. Go to **Settings** > **Knowledge base portal** > **Backup and Restore**.
2. Click the **Restore options** dropdown on the desired backup and select elements to restore:
   * For **Documentation**, **API documentation**, and **Homepage builder**: select checkboxes, then click **Restore**.
   * For **Custom CSS** and **Custom JavaScript**: compare versions, then click **Restore** to use the backup version.
3. Confirm by clicking **Yes**.

The restore runs in the background. A "Backup restored" message appears when complete.

![2_Screenshot-Restoring_a_Backup.png](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-Restoring_a_Backup.png)

---

## Restore options

### 1. Documentation

Restores project documentation to the backup's state.

1. Select specific workspaces, languages, categories, or articles.
2. Enable **Select all** to restore everything.
3. Hover over any item in the **Restore documentation** panel and click **View** to preview content before restoring.

**Example:** To recover a deleted language:

1. Go to **Settings** > **Knowledge base portal** > **Backup and Restore**.
2. Click **Restore** and select **Documentation**.
3. Choose workspace and language, then click **Restore**.

> NOTE
> 
> * Restoring existing items updates them with backup content.
> * Restoring deleted items recreates them.

![3_ScreenGIF-Restore_Documentation.gif](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_ScreenGIF-Restore_Documentation.gif)

---

### 2. API documentation

Restores API documentation to the backup's state.

1. Select specific workspaces, languages, categories, or articles.
2. Enable **Select all** to restore everything.
3. Hover over items in the **Restore API documentation** panel and click **View** to preview content.
4. Click **Restore**.

![4_Screenshot-Restore_API_Documentation.png](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_Screenshot-Restore_API_Documentation.png)

---

### 3. Homepage builder

Restores all Homepage builder features:
* **Navigations**: Header & Footer
* **Main Pages**: Home, Documentation, Login
* **Error Pages**: 404, Access denied, Unauthorized, IP restrictions

1. Select desired workspaces and languages.
2. Enable **Select all** to restore everything.

**Example:** To recover a deleted language's Home page:

1. Go to **Settings** > **Knowledge base portal** > **Backup and Restore**.
2. Click **Restore** and select **Homepage builder**.
3. Choose workspace and language, then click **Restore**.

![5_Screenshot-Restore_Homepage_Builder.png](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/5_Screenshot-Restore_Homepage_Builder.png)

---

### 4. Custom CSS

Restores custom CSS to the backup's state.

* Compare backup and current versions (changes highlighted).
* Click **Copy code snippet** next to either version to copy the CSS.

**Example:** To recover overwritten CSS:

1. Go to **Settings** > **Knowledge base portal** > **Backup and Restore**.
2. Click **Restore** and select **Custom CSS**.
3. Compare versions.
4. Click **Restore** to recover the backup version.

![6_Screenshot-Restore_Custom_CSS.png](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/6_Screenshot-Restore_Custom_CSS.png)

---

### 5. Custom JavaScript

Restores custom JavaScript to the backup's state.

* Compare backup and current versions (changes highlighted).
* Click **Copy code snippet** next to either version to copy the JavaScript.

**Example:** To recover overwritten JavaScript:

1. Go to **Settings** > **Knowledge base portal** > **Backup and Restore**.
2. Click **Restore** and select **Custom JavaScript**.
3. Compare versions.
4. Click **Restore** to recover the backup version.

![7_Screenshot-Custom JavaScript.png](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/7_Screenshot-Custom%20JavaScript.png)

---

## FAQ

**Are backups created after every project update, or do I need to trigger them manually?**

Backups run automatically daily at 00:00 UTC, not after each update. Create manual backups for important changes.

**Can I perform manual backups at any time?**

Yes.

**How long are backups stored, and can I delete older backups?**

Backups last 90 days before automatic deletion. Manual deletion isn't possible.

**What elements can be restored from a backup?**

Documentation, API documentation, Homepage builder, Custom CSS, and Custom JavaScript.

**Can I restore specific elements from a backup?**

Yes, you can select specific elements to restore.

<a id="notifications"></a>

## Notifications

**Plans supporting notification settings**

| Professional | Business | Enterprise |
| --- | --- | --- |

Document360 sends project change notifications via email (SMTP), Slack, Microsoft Teams, and webhooks. These are **Notification channels**.

Example: A project manager configures Slack notifications to track team content updates in real-time.

---

## Accessing notification channels

To configure notification channels, go to **Settings** > **Knowledge base portal** > **Notifications** > **Notification channels**.

View active channels, edit or delete as needed. Click **New channel** to add one.

> NOTE
> 
> An email channel (SMTP) is automatically configured and can't be deleted, but you can customize it.

![1_Screenshot-Notification_channel_overview_page.png](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Notification_channel_overview_page.png)

### Adding notification channels

Supported channels:
* [Webhook notification channel](/help/docs/webhook-notification-channel)
* [Slack notification channel](/help/docs/slack-notification-channel)
* [Microsoft Teams notification channel](/help/docs/microsoft-teams-notification-channel)
* [SMTP notification channel](/help/docs/smtp-email-notification-channel)

<a id="webhook-notification-channel"></a>

## Webhook notification channel

**Plans supporting notification settings**

| Professional | Business | Enterprise |
| --- | --- | --- |

Webhooks send real-time data from Document360 to other applications when specific events occur.

Example: Notify your Slack workspace instantly when articles update.

---

## Setting up Webhook notification channel

1. Go to **Settings** > **Knowledge base portal** > **Notifications**.
2. Click **New channel**.
3. Select **Webhook** and click **Next**.
4. Enter a **Friendly name**.
5. Select **POST** or **PUT** request method.
6. Enter the destination **Webhook URL**.
7. Choose message format from **Request content**.
8. Add headers if needed under **Default headers**.
9. Enter **Authorization key** if required.
10. Click **Save**.

> NOTE
> 
> Read about [Request headers](https://developer.mozilla.org/en-US/docs/Glossary/Request_header).

![1_ScrenGIF-Setting_up_the_Webhook_notification_Channel.gif](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_ScrenGIF-Setting_up_the_Webhook_notification_Channel.gif)

After saving, go to [**Notification mapping**](/help/docs/notification-mapping) to configure which events trigger notifications.

<a id="slack-notification-channel"></a>

## Slack notification channel

**Plans supporting notification settings**

| Professional | Business | Enterprise |
| --- | --- | --- |

Slack integrates with Document360 to send notifications about portal, site, and widget changes to designated channels.

Example: Customer support teams receive real-time alerts for new knowledge base articles.

---

## Setting up Slack notification channel

### Step 1: Create a new app in Slack

1. [Create a Slack account](https://slack.com/intl/en-in/) and workspace if needed.
2. Log in and navigate to your apps.

### Step 2: Get the webhook URL

1. Open [Slack API](https://api.slack.com/apps) and select **Create New App**.
2. Choose your app.
3. Go to **Features** > **Incoming Webhooks** and toggle **ON**.
4. Copy the webhook URL from **Webhook URLs for Your Workspace**.

![4_Screenshot-Slack_webhook_Link.png](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_Screenshot-Slack_webhook_Link.png)

#### Generate new webhook

If no webhooks exist:
1. Click **Add New Webhook to Workspace**.
2. Choose destination channel and click **Allow**.
3. Copy the new webhook URL.

### Step 3: Configure in Document360

1. Go to **Settings** > **Knowledge base portal** > **Notification channels**.
2. Click **New channel**.
3. Select **Slack** and click **Next**.
4. Enter **Friendly name**.
5. Paste the **Webhook URL**.
6. Click **Save**.

![1_ScreenGIF-Slack_notification_channel.gif](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_ScreenGIF-Slack_notification_channel.gif)

Go to [**Notification mapping**](/help/docs/notification-mapping) to assign specific events to this channel.

<a id="microsoft-teams-notification-channel"></a>

## Microsoft Teams notification channel

**Plans supporting notification settings**

| Professional | Business | Enterprise |
| --- | --- | --- |

Microsoft Teams receives Document360 notifications directly in channels, keeping teams updated on portal, site, and widget changes.

Example: Teams users get alerts when knowledge base articles publish or update.

---

## Setting up Microsoft Teams notification channel

Required steps:
* [Create Teams channel](/help/docs/microsoft-teams-notification-channel#creating-a-channel-in-microsoft-teams)
* [Get webhook URL](/help/docs/microsoft-teams-notification-channel#get-the-webhook-url)
* [Configure Document360](/help/docs/microsoft-teams-notification-channel#setup-the-configuration-in-document360)

### Step 1: Create Teams channel

1. Open Microsoft Teams.
2. Go to **Teams**, click **More** (⋯) next to your team.
3. Click **Add channel**.
4. Enter name and click **Add**.

![1_Screenshot-Creating_a_channel_in_Microsoft_teams.png](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Creating_a_channel_in_Microsoft_teams.png)

### Step 2: Get webhook URL

1. In your channel, click **More** (⋯) and select **Manage channel**.
2. Click **Edit** in **Settings**.
3. Search for **Incoming webhook** and click **Add**.
4. Name your webhook connection.
5. Upload image if needed.
6. Click **Create**.
7. Copy the webhook URL.
8. Click **Done**.

![2_ScreenGIF-Getting_the_Webhook_URL.gif](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_ScreenGIF-Getting_the_Webhook_URL.gif)

*Image source: Microsoft Teams*

### Step 3: Configure Document360

1. Go to **Settings** > **Knowledge base portal** > **Notification channels**.
2. Click **New channel**.
3. Select **Microsoft Teams** and click **Next**.
4. Enter **Friendly name**.
5. Paste the webhook URL.
6. Click **Save**.

![3_ScreenGIF-Settings_up_the_configuration_in_Document360.gif](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_ScreenGIF-Settings_up_the_configuration_in_Document360.gif)

Go to [**Notification mapping**](/help/docs/notification-mapping) to assign events.

---

## FAQ

**How do I confirm Teams notifications work?**

Test by mapping a sample notification or updating a test article. Check your Teams channel. If problems persist, verify webhook URL and Teams permissions.

**Can I customize Teams notification types?**

Yes, use **Notification mapping** to select specific events like "new article published" or "article updated."

**What if I get authorization errors in Teams?**

Generate a new webhook URL in Teams and update it in Document360. Check channel permissions.

**How do I disable specific Teams notifications?**

In **Notification mapping**, unselect unwanted notification types.

**Can I use different Teams channels for different notifications?**

Yes, create separate Teams channels and configure individual webhooks in Document360. Assign different events through **Notification mapping**.

<a id="smtp-email-notification-channel"></a>

## SMTP notification channel

**Plans supporting notification settings**

| Professional | Business | Enterprise |
| --- | --- | --- |

SMTP sends email notifications about critical updates to designated addresses.

Example: Team members receive email alerts when important knowledge base articles update.

---

## Setting up SMTP notification channel

1. Go to **Settings** > **Knowledge base portal** > **Notifications**.
2. Click **New channel**.
3. Select **SMTP** and click **Next**.
4. Enter **Friendly name**.
5. Enter recipient emails in **Email to** field.

> NOTE
> 
> * Separate multiple addresses with semicolons (;) and no spaces.
> * Don't add semicolon after last address.
> 
> Example: xyz@gmail.com;abc@gmail.com;mno@gmail.com

6. Click **Save**.

![1_ScreenGIF-setting_up_the_SMTP_notification_Channel.gif](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_ScreenGIF-setting_up_the_SMTP_notification_Channel.gif)

Go to [**Notification mapping**](/help/docs/notification-mapping) to assign events.

<a id="notification-mapping"></a>

## Notification mapping

**Plans supporting notification settings**

| Professional | Business | Enterprise |
| --- | --- | --- |

Map notifications to channels for specific events across documentation, security, analytics, and other modules.

---

## Mapping channels to events

1. Go to **Settings** > **Knowledge base portal** > **Notifications**.
2. Select **Notification mapping** tab.

> NOTE
> 
> All events are disabled by default.

3. Toggle **All events** to enable everything.
4. Toggle specific modules to enable their notifications.
5. Expand modules to enable individual events.

Example: Enable **Documentation editor** for all editor notifications, or just **Article published** for publish-only alerts.

6. Click **Map to channel** to assign channels to events.
7. Click the icon next to each event to map channels.

> NOTE
> 
> Enabled events require at least one assigned channel.

![1_Screenshot-Notification_mapping_in_the_Knowledge_base_portal.png](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Notification_mapping_in_the_Knowledge_base_portal.png)

### Analytics weekly report

Project owners can enable weekly analytics reports:

1. Go to **Settings** > **Knowledge base portal** > **Notifications**.
2. Select **Notification mapping** tab.
3. Expand **Analytics** and toggle **Analytics weekly mail**.

![2_Screenshot-Analytics_toggle_in_the_Notification_mapping.png](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-Analytics_toggle_in_the_Notification_mapping.png)

---

## Notification events

### Documentation editor

| Event | Function |
| --- | --- |
| Article visibility changed | Visibility settings altered |
| Article settings updated | Settings modified |
| Article slug updated | URL name changed |
| Article title updated | Title changed |
| Article published | Article published |
| Article created | New article created |
| Article renamed | Article renamed |
| Article deleted | Article deleted |
| Article forked | Article copied to new version |
| Article version deleted | Specific version removed |
| Bulk delete article versions | Multiple versions deleted |
| Updated translation status | Translation status changed |
| Articles reordered | Article order changed |
| Article contributors updated | Contributors modified |
| Article workflow status updated | Workflow status changed |
| Article workflow due date updated | Workflow deadline changed |
| Article workflow assignee updated | Workflow assignee changed |
| Category created | New category created |
| Category type updated | Category type changed |
| Category settings updated | Category settings modified |
| Category slug changed | Category URL name changed |
| Category contributors updated | Category contributors changed |
| Category deleted | Category deleted |
| Category renamed | Category renamed |
| Categories reordered | Category order changed |
| Category published | Category published |
| Category forked | Category copied to new version |
| Category version deleted | Specific category version removed |
| Bulk delete category versions | Multiple category versions deleted |
| Category workflow status updated | Category workflow status changed |
| Category workflow due date updated | Category workflow deadline changed |
| Category workflow assignee updated | Category workflow assignee changed |
| Category visibility changed | Category visibility altered |
| Article review reminder status updated | Review reminder status changed |
| Article pushed to Crowdin | Article sent for translation |
| Categories/Articles restored | Deleted items restored |
| Categories/Articles permanently deleted | Items permanently removed |
| Recycle bin emptied | All deleted items permanently removed |
| Shared article created | Collaboration article created |
| Clone article created | Article duplicated |
| Removed reference article | Linked article removed |
| Multiple shared articles created | Multiple collaboration articles created |
| Article publish later canceled | Scheduled publish canceled |
| Article scheduled for publish | Article scheduled for future publish |
| Share link deleted | Private share link removed |
| Share link generated | New private share link created |

### Drive

| Event | Function |
| --- | --- |
| Folder added | New folder created |
| Folder renamed | Folder name changed |
| Folder deleted | Folder deleted |
| File(s) added | New files added |
| File(s) updated | Files modified |
| File(s) deleted | Files removed |

### Knowledge base portal settings

| Event | Function |
| --- | --- |
| Workspace updated | Workspace settings changed |
| Workspace deleted | Workspace removed |
| Workspace created | New workspace created |
| Workspace display order changed | Workspace order modified |
| Plan tier changed | Subscription plan changed |
| Payment details updated | Billing information updated |
| Project general settings updated | Project settings changed |
| Backup created | Backup generated |
| Backup restored | Backup applied |
| Notification channel deleted | Notification channel removed |
| Notification channel created | New notification channel created |
| Notification channel updated | Notification channel modified |
| Addons purchased | Additional features purchased |
| Subscription created | New subscription created |
| API token added | New API token created |
| API token deleted | API token removed |
| Extension token generated | Extension token created |
| Extension token deleted | Extension token removed |
| Crowdin token added | Crowdin translation token created |
| Crowdin token deleted | Crowdin translation token removed |
| Display workspaces as menu | Workspace menu format enabled |

### Knowledge base site settings

| Event | Function |
| --- | --- |
| Site design settings updated | Site appearance changed |
| Custom JavaScript updated | JavaScript code modified |
| Custom CSS updated | CSS styles modified |
| Article settings updated | Article display settings changed |
| Project sub-domain updated | Sub-domain changed |
| Integration created | New service integration established |
| Integration deleted | Service integration removed |
| Integration updated | Service integration modified |
| Home page builder restored | Homepage builder reverted |
| Home page builder settings updated | Homepage builder settings changed |
| Robots.txt updated | Search engine crawling rules changed |
| Site domain updated | Main domain changed |
| Cookie consent enabled | Cookie consent activated |
| Cookie consent disabled | Cookie consent deactivated |
| Cookie consent updated | Cookie consent settings modified |
| Smart bar added | Quick access bar added |
| Smart bar updated | Quick access bar modified |
| Smart bar enabled | Quick access bar activated |
| Smart bar disabled | Quick access bar deactivated |
| Smart bar deleted | Quick access bar removed |
| Ticket deflector deleted | Support request management removed |
| Ticket deflector added | Support request management added |
| Ticket deflector updated | Support request management modified |
| Ticket deflector helpdesk added | Helpdesk added to support requests |
| Ticket deflector helpdesk updated | Helpdesk settings modified |
| Ticket deflector helpdesk deleted | Helpdesk removed from support requests |
| Article redirection rule added | New redirect rule created |
| Article redirect rule updated | Redirect rule modified |
| Article redirection rule(s) deleted | Redirect rules removed |
| Redirect rule(s) exported to CSV | Redirect rules exported |
| Redirect rules import requested | Redirect rules import initiated |
| Meta description generated | SEO description created |
| Meta details updated | SEO settings modified |
| Knowledge base builder updated | Content creation tools modified |
| Knowledge base builder published | Content creation tools published |
| Read receipt rule created | Article view tracking rule created |
| Read receipt rule updated | Article view tracking rule modified |
| Read receipt rule deleted | Article view tracking rule removed |

### Knowledge base widget settings

| Event | Function |
| --- | --- |
| Knowledge base widget settings updated | Widget behavior changed |
| URL mapping created | New URL mapping created |
| URL mapping updated | URL mapping modified |
| URL mapping deleted | URL mapping removed |
| Knowledge base widget settings deleted | Widget functionality removed |
| Knowledge base widget settings created | Widget functionality enabled |

### Users & Security settings

| Event | Function |
| --- | --- |
| Site visibility changed | Site access settings changed |
| Role added | New user role created |
| Role updated | User role permissions modified |
| Role deleted | User role removed |
| Security group added | New security group created |
| Security group updated | Security group settings changed |
| Security group deleted | Security group removed |
| Content access added | Content permissions granted |
| Site access added | Site access granted |
| Content access updated | Content permissions modified |
| Site access updated | Site permissions modified |
| Content access removed | Content permissions revoked |
| Site access removed | Site permissions revoked |
| Team account added | New team account created |
| Team account updated | Team account modified |
| Team account deleted | Team account removed |
| IP restrictions updated | IP access rules changed |
| IP restriction added | New IP restriction created |
| IP restriction deleted | IP restriction removed |
| Self sign-up settings updated | Registration settings changed |
| Import readers requested | Reader import initiated |
| Import team account requested | Team account import initiated |
| Export team account(s) to CSV | Team account data exported |
| Export reader(s) to CSV | Reader data exported |
| SSO configuration added | New SSO authentication created |
| SSO configuration updated | SSO settings modified |
| SSO configuration deleted | SSO authentication removed |
| SSO users invited | SSO access invitations sent |
| JWT created | New authentication token created |
| JWT regenerated | Authentication token refreshed |
| JWT saved | Authentication token stored |
| JWT updated | Authentication token modified |
| JWT deleted | Authentication token removed |
| Inheritance settings updated | Permission inheritance changed |
| Convert to reader | User account changed to reader |
| Convert to SSO team account | User converted to SSO team account |
| Convert to SSO reader | User converted to SSO reader |
| Convert to team account | User converted to team account |

### Tools settings

| Event | Function |
| --- | --- |
| Project exported | Project backup completed |
| Project imported | External content integrated |
| External project import requested | External project import initiated |
| Export PDF requested | PDF export initiated |
| Export PDF content template added | New PDF format template created |
| Export PDF content template updated | PDF format template modified |
| Export PDF content template deleted | PDF format template removed |
| Export PDF design template added | New PDF design template created |
| Export PDF design template deleted | PDF design template removed |
| Export PDF design template updated | PDF design template modified |
| Article review reminder created | Article evaluation reminder set |
| Article review reminder updated | Review reminder modified |
| Article review reminder deleted | Review reminder removed |
| Content reuse variable added | New content management variable created |
| Content reuse variable updated | Content variable modified |
| Content reuse variable deleted | Content variable removed |
| Content reuse snippet added | New content snippet created |
| Content reuse snippet updated | Content snippet modified |
| Content reuse snippet deleted | Content snippet removed |
| Article template added | New article format template created |
| Article template updated | Article template modified |
| Article template deleted | Article template removed |
| Tag added | New content tag created |
| Tag updated | Content tag modified |
| Tag deleted | Content tag removed |
| Article imported | New article added |
| Workflow status added | New content workflow status created |
| Workflow status updated | Workflow status modified |
| Workflow status deleted | Workflow status removed |
| Workflow status reordered | Workflow status sequence changed |
| Update feedback assignee | Feedback reassigned |
| Update feedback status | Feedback status changed |
| Find and replace | Content search and replace executed |
| Content reuse glossary suggested | Content management suggestion made |
| Export PDF password removed | PDF security removed |

### Knowledge site

| Event | Function |
| --- | --- |
| Feedback received | User feedback submitted |
| Reader email updated | Reader email changed |
| Reader self-registration | New reader registered |
| Like received | Article received positive feedback |
| Dislike received | Article received negative feedback |

### AI notifications

| Event | Function |
| --- | --- |
| Credit usage alert | AI credits running low |

### Analytics

| Event | Function |
| --- | --- |
| Analytics weekly metrics | Weekly performance reports available |

### All comments notification

| Event | Function |
| --- | --- |
| All comments notifications | Contributors notified of inline comments |

---

## FAQ

**How do I get Slack notifications for article publishing?**

1. Go to **Settings** > **Knowledge base portal** > **Notifications** > **Notification mapping**.
2. Expand **Documentation editor** and enable **Article published**.
3. Ensure Slack channel is configured. If not, click the icon next to the toggle and enable Slack.

> NOTE
> 
> See [Slack notification channel](/help/docs/slack-notification-channel).

**How do I get Teams notifications when projects export?**

1. Go to **Settings** > **Knowledge base portal** > **Notifications** > **Notification mapping**.
2. Expand **Tools settings** and enable **Project exported**.
3. Ensure Microsoft Teams channel is configured. If not, click the icon and enable Teams.

> NOTE
> 
> See [Microsoft Teams notification channel](/help/docs/microsoft-teams-notification-channel).

**How do I get email notifications for new team accounts?**

1. Go to **Settings** > **Knowledge base portal** > **Notifications** > **Notification mapping**.
2. Expand **Users & Security settings** and enable **Team account added**.
3. Ensure SMTP channel is configured. If not, click the icon and enable SMTP.

> NOTE
> 
> See [SMTP notification channel](/help/docs/smtp-email-notification-channel).

**How do I get alerts for Eddy AI credit usage?**

1. Go to **Settings** > **Knowledge base portal** > **Notifications** > **Notification mapping**.
2. Expand **Eddy AI notifications** and enable **Credit usage alert**.

Document360 notifies configured channels when credits fall to 20%, 10%, or expire.

**How do contributors get inline comment notifications?**

1. Go to **Settings** > **Knowledge base portal** > **Notifications** > **Notification mapping**.
2. Enable **All comments notification**.

Contributors receive email alerts for inline comments on their articles.

**Why aren't I receiving email notifications for article creation?**

Enable **Article created** notification:

1. Go to **Settings** > **Knowledge base portal** > **Notifications** > **Notification mapping**.
2. Expand **Documentation editor**.
3. Toggle **Article created** ON.

> NOTE
> 
> Article creation via [Word import](/help/docs/importing-articles-from-a-docx-file) doesn't trigger this notification.

If issues persist, contact [Document360 support](https://document360.com/support/).

<a id="notification-history"></a>

## Notification history

**Plans supporting notification settings**

| Professional | Business | Enterprise |
| --- | --- | --- |

Track notification delivery to troubleshoot failures.

Example: Verify critical Slack alerts delivered successfully. Identify and resolve delivery failures quickly.

---

## Managing notification history

1. Go to **Settings** > **Knowledge base portal** > **Notifications**.
2. Select **Notification history** tab.

![1_Screenshot-Notification_history_overview_page.png](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Notification_history_overview_page.png)

### Understanding notification history

Each notification shows:

1. **Channel name:** Slack, Webhook, SMTP, or Teams
2. **Status:** Success or Failure
3. **Submitted on:** Trigger date
4. **Sent on:** Delivery date
5. **History:** Click **View details** for message content

<a id="send-notifications-from-custom-email-domain"></a>

## Email domain

**Plans supporting email domain settings**

| Professional | Business | Enterprise |
| --- | --- | --- |

Send notifications from branded email addresses like `support@yourcompany.com` instead of `support@document360.com`.

---

## Prerequisites

* Access to DNS provider (GoDaddy, Hostinger, Namecheap, etc.)
* Available only on **Enterprise plan**

---

## Configuring custom email domain

1. Go to **Settings** > **Knowledge base portal** > **Notifications**.
2. Select **Email Domain** tab.
3. Enter domain name (e.g., `yourcompany.com`).
4. Click **Add Domain** to generate DNS records.

### Adding DNS records

5. Open your DNS provider's website.
6. Copy configuration details from Document360 and paste into DNS settings.

> NOTE
> 
> Adding these records won't override existing MX records.

7. Return to Document360 **Email domain** page.
8. Check **I've added the records** and click **Verify & Save**.

After verification, enter sender information:
* **Email field:** From address (e.g., `support@yourcompany.com`)
* **Name field:** Sender name (e.g., `Your Company Support`)

![1_Screenshot-Email_domain.png](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Email_domain.png)

---

## Troubleshooting

If configuration remains inactive after 24 hours:
1. Verify MX and TXT records saved on domain host
2. Confirm records match Document360's provided values
3. Delete and re-add records if needed

Contact `support@document360.com` for assistance.

---

## FAQ

**What are MX records and how do they work?**

MX records route emails to correct mail servers. Lower numbers indicate higher priority.

Example:
* `10 mail1.example.com` (primary)
* `20 mail2.example.com` (backup)

**How do TXT records work for email authentication?**

TXT records store text information for domain verification and email security policies like SPF, DKIM, and DMARC.

SPF example: `v=spf1 include:_spf.google.com ~all`

This specifies authorized mail servers, preventing spoofing.

<a id="how-to-use-postman"></a>

## How to use Postman?

**Plans supporting API token settings**

| Professional | Business | Enterprise |
| --- | --- | --- |

Postman builds and tests APIs. Link your Document360 project in minutes using desktop or web versions.

---

## Linking Document360 project in Postman

1. Open Postman.
2. In **My Workspace**, click **Import**.
3. Enter URL: `https://apihub.document360.io/swagger/v2/swagger.json`.
4. Select import option (Postman Collection or OpenAPI 3.0).
5. Click **Import**.

Creates sample requests for each endpoint.

![10_ScreenGif-Postman.gif](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/10_ScreenGif-Postman.gif)

### Authentication in Postman

1. Expand **Document360 Customer API** in tree view.
2. Set **Auth Type** to API Key.
3. Enter variable name in **Key** field.
4. Enter API token in **Value** field. Generate tokens at **Settings** > **Knowledge Base portal** > **API tokens**.

![11_ScreenShot-Postman.png](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/11_ScreenShot-Postman.png)

### Environment setup

1. Go to **Environments** in left navigation.
2. Click **Create Environment**.
3. Add variable 'base_URL' with type 'default'.
4. Enter `https://apihub.document360.io` in **INITIAL VALUE** and **CURRENT VALUE**.
5. Click **Save**.

Authentication complete. Access endpoints freely.

![9_ScreenShot-Postman.png](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/9_ScreenShot-Postman.png)

### Use cases

* [Create and publish articles](https://apidocs.document360.com/v2/docs/how-to-create-and-publish-an-article)
* [Update published articles](https://apidocs.document360.com/v2/docs/how-to-update-a-published-article)
* [Update SEO details](https://apidocs.document360.com/v2/docs/how-to-update-seo-details)

---

## FAQ

**What if my Postman session ends after refresh?**

Re-authenticate following the setup steps above.

<a id="how-to-use-swagger"></a>

## How to use Swagger?

**Plans supporting API token settings**

| Professional | Business | Enterprise |
| --- | --- | --- |

Swagger creates interactive, machine-readable API documentation for RESTful APIs.

---

## Swagger documentation site

1. Open [Swagger documentation](https://apihub.document360.io/).
2. Click **Authorize**.
3. Enter API token in **Value** field.

> NOTE
> 
> Generate new tokens at **Settings** > **API tokens**:
> * Name your token
> * Select HTTP methods (GET, PUT, POST, DELETE)
> * Copy the generated token

4. Click **Authorize**.
5. Click **Close**.

![17_ScreenShot-Swagger.png](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/17_ScreenShot-Swagger.png)

> NOTE
> 
> To change tokens: Click **Authorize** > **Logout** > enter new token > **Authorize** > **Close**.

### GET

Retrieve information. Example: Get team account records.

![12_ScreenShot-Swagger_Get.png](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/12_ScreenShot-Swagger_Get.png)

1. Fill required fields.
2. Click **Execute**.
3. View results in **Responses**.

![13_ScreenShot-Swagger_Get.png](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/13_ScreenShot-Swagger_Get.png)

### POST

Add items. Example: Add team account.

![14_ScreenShot-Swagger_Post.png](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/14_ScreenShot-Swagger_Post.png)

1. Enter account details (email_id, first_name, last_name).
2. Click **Execute**.
3. Success if status is 200 and success is true.

### PUT

Update items. Example: Update user role.

![15_ScreenShot-Swagger_Put.png](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/15_ScreenShot-Swagger_Put.png)

1. Enter userId.
2. Update role (1=Administrator, 2=Editor, 3=Draft Writer, 4=Reader, 7=Owner).
3. Click **Execute**.
4. Success if status is 200 and success is true.

### DELETE

Delete items. Example: Delete userId.

1. Enter userId.
2. Click **Execute**.
3. Success if status is 200 and success is true.

![16_ScreenShot-Swagger_Delete.png](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/16_ScreenShot-Swagger_Delete.png)

> NOTE
> 
> Required fields marked with asterisks must be filled.

---

## FAQ

**What if refreshing ends my session?**

Re-authenticate following the steps above.

**How should I format fields requiring specific characters?**

Use underscores. Example: "email_id" not "email id". Spaces cause errors.

<a id="full-portal-search"></a>

## Portal search

**Plans supporting portal search**

| Professional | Business | Enterprise |
| --- | --- | --- |

Search all project content, files, tags, users, tools, and settings across workspaces and languages.

---

## Accessing full portal search

1. Click **Search** icon in top navigation bar.
2. Enter keyword and use **All** dropdown to narrow results.

Six search modules available:
* [All](/help/docs/full-portal-search)
* [Article](/docs/article-full-portal-search)
* [Drive file](/docs/drive-full-portal-search)
* [Users & Groups](/docs/users-groups-full-portal-search)
* [Tags](/docs/tags-full-portal-search)
* [Settings](/docs/settings-full-portal-search)

> NOTE
> 
> Press **Escape** to close search screen.
> Only five results per module displayed initially.

3. Click **More articles** for additional results.
4. Apply **Filter** if needed.
5. Click search item to preview.
6. Click **Go to article** to navigate.

![1_ScreenGif-Full_portal_search.gif](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_ScreenGif-Full_portal_search.gif)

---

## FAQ

**What can I search and are keywords highlighted?**

Search articles/categories, Drive files, Users & Groups, Tags, Content tools, and Settings. Keywords highlighted in results.

**Why isn't analytics information appearing in search results?**

Analytics data excluded from search. Settings module shows Analytics-related information.

<a id="article-full-portal-search"></a>

## Article portal search

**Plans supporting portal search**

| Professional | Business | Enterprise |
| --- | --- | --- |

Search all project articles and category pages across workspaces and languages.

---

## Accessing articles through portal search

1. Click **Search** icon in top navigation bar.

> NOTE
> 
> Press **Escape** to close search screen.

2. Select **Articles** from **All** dropdown.
3. Type keyword to search.
4. Results display automatically with:

* Article title
* Breadcrumb
* Workspace
* Language
* Status

5. Apply filters using **Filter** option.
6. Click result to preview.
7. Click fullscreen icon to expand preview. Use navigation buttons to move between results.
8. Click **Go to article** in preview to navigate.

![2_ScreenGif-Article_full_portal_search.gif](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_ScreenGif-Article_full_portal_search.gif)

---

## Filters

### a. Workspace/Language

Select Workspaces and Languages. Language options appear when Workspace dropdown expands. Select **Workspace** checkbox or apply no filter to search all.

### b. Visibility

Filter by article visibility: **None** (default, no filter), **Visible**, or **Hidden**.

### c. Status

Filter by article status: **None** (default, no filter), **New article**, **Draft**, or **Published**.

### d. Contributors

Filter by contributors. Use dropdown and search by username.

### e. Tags

Filter by specific tags. Search and select multiple tags.

### f. Updated on

Filter by update date range: **7 days**, **30 days**, **3 months**, **1 year**, or **custom date**.

Select filters and click **Apply**. Click **Clear** to reset.

<a id="drive-full-portal-search"></a>

## Drive portal search

**Plans supporting portal search**

| Professional | Business | Enterprise |
| --- | --- | --- |

Search all Drive files in your project.

---

## Accessing Drive portal search

1. Click **Search** icon in top navigation bar.

> NOTE
> 
> Press **Escape** to close search screen.

2. Select **Drive** from **All** dropdown.
3. Type search keyword.

Results display in **List view**.

> NOTE
> 
> Switch to **Grid view** using icon next to **Filter** option.

Search results show:
* **Name**
* **Dependencies**
* **Updated on**
* **Updated by**
* **Size**
* **Tags**

4. Click file name or eye icon to open **File details** pane.

Shows file location, size, type, upload date, uploader, and tags.

5. Click **View dependencies** to see where files are used.

Clicking dependent articles/categories redirects to Editor.

![3_ScreenGif-Drive_full_portal_search.gif](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_ScreenGif-Drive_full_portal_search.gif)

---

## Filters

### a. Status

Filter files: **All files** (default), **Deleted files**, or **Starred files**.

### b. Type

Filter by file type: **Images**, **Word**, **Excel**, **PPT**, **PDF**, **ZIP**, **Video**, **Audio**, or **Others**. Select multiple types.

### c. Uploaded by

Filter by uploader account.

### d. Tags

Filter by specific tags. Search and select multiple tags.

### e. Uploaded

Filter by upload date range: **7 days**, **30 days**, **3 months**, **1 year**, or **custom date**.

Click **Apply** after selecting filters. Click **Clear** to reset.

<a id="users-groups-full-portal-search"></a>

## Users & groups portal search

**Plans supporting portal search**

| Professional | Business | Enterprise |
| --- | --- | --- |

Search team accounts, team account groups, readers, and reader groups in your knowledge base project.## Users & groups portal search

**Plans supporting portal search**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Search team accounts, team account groups, readers, and reader groups in your knowledge base project.

### Accessing Users & Groups search

1. Click the **Search** icon in the top navigation bar
2. Select **Users & Groups** from the dropdown next to the search bar
3. Enter your search keyword

Results display in two tabs: **Team accounts & groups** and **Readers & groups**.

**Team accounts & groups tab** shows:
* Name
* Portal role  
* Login activity

**Readers & groups tab** shows:
* Name
* Login activity

### Team accounts

Click any team account to open the **View access permissions** panel. Click **Manage permissions** to go to the Team account page.

### Team account groups

Click any team account group to open the **View access permissions** panel. Click **View associated team members** to go to the Team account group page.

![Search team accounts and groups](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_ScreenGif-Users&Groups_Search.gif)

### Readers

Click any reader to navigate to the **Readers** page.

### Reader groups

Click **View associated readers** to see readers in that group and their content access.

![Search readers and groups](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/5_ScreenGif-Readers&Groups_Search.gif)

---

## Filters

![Users and groups filter option](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/6_Screenshot-users-and-groups-filter.png)

### 1. Type

Filter by entity type: **All entity**, **Team account**, **Team account groups**, **Reader**, **Reader Groups**

Default: **All entity**

### 2. Last logged in

Filter by login date: **All**, **7 days**, **30 days**, **3 months**, **1 year**, **Custom date**

Default: **All**

Click **Apply** after selecting filters. Click **Clear** to reset.

---

## Tags portal search

**Plans supporting portal search**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Search and view tags in your knowledge base project. See dependency information for each tag.

---

### Accessing Tags search

1. Click the **Search** icon in the top navigation bar
2. Select **Tags** from the dropdown next to the search bar  
3. Enter your search keyword

Results show:
* Tag name
* Dependency in articles
* Dependency in category pages
* Dependency in drive files

### Viewing tag dependencies

Click any tag to open the **Tag Dependency** panel.

**Article/category dependencies show:**
* Name
* Version
* Language
* Contributor
* Status indicator
* Publish date

Click any article/category to open the documentation editor.

**File dependencies show:**
* Thumbnail (images only)
* Filename and format

Click **Download** to save files locally.

### Removing dependencies

1. Select checkboxes next to dependencies in the panel
2. Click **Remove dependencies**
3. Click **Cancel** to close panel

![Search tags in articles, categories, and files](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/7_ScreenGif-Tags_Full_portal_search.gif)

---

## Settings portal search

**Plans supporting portal search**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Search through knowledge base portal features and settings.

---

### Accessing Settings search

1. Click the **Search** icon in the top navigation bar
2. Select **Settings** from the dropdown next to the search bar
3. Enter your search keyword

Settings grouped under:
* Knowledge base portal
* Knowledge base site  
* Users & Security

Results display in **Grid view** showing:
* Setting/feature name
* Feature icon
* Description

Click any setting to navigate to its page.

![Search settings in portal](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/8_ScreenGif-Settings_search.gif)

---

## Custom domain mapping

**Plans supporting custom domain mapping**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Document360 automatically generates a default domain like `project-name.document360.com`. You can create a custom domain like `help.yourcompany.com` for better branding and user experience.

Navigate to **Settings** > **Knowledge base site** > **Custom domain**.

> NOTE: New projects use the project name as the default domain. A project named "Project Greenfield" gets `project-greenfield.document360.com`.

---

### Editing default domain

1. Go to **Custom domain** page
2. Click **Edit** next to the default domain
3. Enter your preferred domain

* If unavailable, **Update** button is disabled
* If available, **Update** button is enabled

4. Click **Update**

![Edit default domain](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/image-1729603511681.png)

---

### Creating custom domain

1. [Add custom domain in Document360](/docs/custom-domain-mapping#add-domain-in-document360)
2. [Configure CNAME at domain registrar](/docs/custom-domain-mapping#setting-up-your-cname)  
3. [Verify custom domain](/docs/custom-domain-mapping#verify)

---

#### Adding custom domain in Document360

![Add custom domain](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/image-1729689317870.png)

1. Go to **Settings** > **Knowledge base site** > **Custom domain** > **Custom domain mapping**
2. Enter custom domain in **Domain configuration** field
3. Click **Add domain**

![Domain configuration](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/image-1729689397597.png)

Once setup completes, DNS records generate and you'll see a notification.

---

#### Configuring CNAME record

After adding your domain in Document360, configure a CNAME record at your domain registrar to point to Document360's servers.

1. Log into your domain registrar (GoDaddy, Namecheap, etc.)
2. Go to DNS settings
3. Add new CNAME record:
   * Enter your custom domain in Name/Host field
   * Enter Document360's CNAME value in Points to/Value field
4. Save the record

---

##### Example: Hostinger

1. Go to Hostinger domain management
2. Select your domain
3. Click **DNS/Nameservers** > **DNS records** tab
4. Choose CNAME from record type dropdown
5. Paste Document360's value in **Points to** field
6. Add TTL and click **Add record**

![Hostinger DNS configuration](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/image-1729715957848.png)

---

##### Common registrars

* **NameCheap** - [Support article](https://www.namecheap.com/support/knowledgebase/article.aspx/434/2237/how-do-i-set-up-host-records-for-a-domain/)
* **Domain.com** - [Support article](https://www.domain.com/help/article/dns-management-how-to-update-dns-records)
* **Google Domains** - [Support article](https://support.google.com/a/answer/47283)
* **Dreamhost** - [Support article](https://help.dreamhost.com/hc/en-us/articles/360035516812-Adding-custom-DNS-records)
* **Hover** - [Support article](https://help.hover.com/hc/en-us/articles/217282457-Managing-DNS-records-)
* **GoDaddy** - [Support article](https://in.godaddy.com/help/add-a-cname-record-19236)
* **Cloudflare** - [Support article](https://community.cloudflare.com/t/how-do-i-add-a-cname-record/59)
* **Bluehost** - [Support article](https://www.bluehost.com/hosting/help/cname)

---

#### Verifying custom domain

1. Return to Document360 **Custom domain** settings
2. Check "**I've added the records**" box
3. Click **Verify**
4. Success message appears if verification works

> NOTE: Contact [support](mailto:support@document360.com) if issues occur.

Click **Go to your knowledge base site** icon to see the new URL.

---

### Post-mapping issues

**"'Deceptive site ahead' message after successful mapping**

Google flagged your custom domain as unsafe.

* Check status at [Google Safe Browsing](https://transparencyreport.google.com/safe-browsing/search)
* Enter your domain to see issues
* Fix detected problems (phishing, malware, guideline violations)
* Submit review request through Google Search Console

[Google support article](https://support.google.com/chrome/answer/99020?hl=en&co=GENIE.Platform%3DDesktop)

![Site status troubleshooting](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/image-1730023063313.png)

---

## Load balancer

A load balancer distributes traffic across multiple servers to keep your knowledge base fast and reliable during high traffic. It prevents server overload and improves performance and security.

Upgrading provides better security features and traffic management.

---

### Upgrading load balancer

1. Go to **Settings** > **Knowledge base site** > **Custom domain** > **Custom domain mapping**
2. Click **Upgrade**
3. Verify custom domain configuration
4. Copy generated CNAME record
5. Set up CNAME at domain registrar
6. Verify configuration again

> NOTE:
> * No downtime occurs, but upgrade during off-hours
> * Upgrade is free
> * Contact [support](mailto:support@document360.com) for help

---

## Configuring custom domain for Apex domains

Use your root domain (like `abc.com`) without subdomains. While subdomains are straightforward, Apex domains require extra DNS steps.

**DNS flattening** lets you use CNAME records at the root domain level. Not all registrars support this.

---

### Configuring Apex domains

If your registrar doesn't support DNS flattening (like GoDaddy), use a DNS provider that does, such as Cloudflare. Cloudflare offers free DNS flattening.

For example, switch from GoDaddy to Cloudflare to add CNAME records for Apex domains.

> NOTE: Read Cloudflare's [CNAME flattening article](CNAME flattening) for details.

---

### Custom SSL certificates

Use Document360's automatic SSL certificate for seamless renewal. If you prefer your own certificate, provide:

* **Common Name (CN)**: Fully qualified domain name
* **Organization (O)**: Legal organization name  
* **Organizational Unit (OU)**: Department/division

> NOTE: Certificates valid for 90 days. Renew on time and provide updated certificate.

---

## Troubleshooting

---

### Domain verification failed

Ensure CNAME matches domain host. Other records (like AAAA) in CNAME's place cause errors.

**Solution**: Use DNS lookup tools like [Digwebinterface](https://www.digwebinterface.com/) or [Google DNS lookup](https://toolbox.googleapps.com/apps/dig/) to check records.

![Troubleshooting invalid records](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/image-1729966781926.png)

> NOTE: Some registrars (like Cloudflare) mask DNS records for security. Contact registrar for details.

Correct CNAME may take up to 24 hours to propagate.

---

### Wait time after DNS record updates

If CNAME matches but verification fails, TTL might be the issue.

DNS record changes take time to reflect globally. TTL of 3600 means up to 1 hour for global propagation.

---

### CAA restrictions

Some registrars restrict SSL certificates to specific Certificate Authorities (CAs).

Example: CAA record "0 issue letsencrypt.org" allows only Let's Encrypt certificates. Other CAs (like DigiCert) will be denied.

Check DNS configuration for CAA records.

---

### "This site can't be reached" error

1. Verify record configuration timing
2. Confirm DNS propagation (24-hour rule)
3. Use Google Dig tool to check records for duplicates
4. Check CAA records at [dnschecker.org](https://dnschecker.org/)
5. Ensure CAA entries exist for Document360's SSL providers:
   * Lets Encrypt
   * DigiCert  
   * Google

Add these CAA records:
```
@ IN CAA 0 issue digicert.com
@ IN CAA 0 issue letsencrypt.org
@ IN CAA 0 issue pki.goog
```

---

### "Connection not private/secure" errors

---

#### A. SSL certificate expired

1. Check certificate expiration
2. Visit site and click **View site information** in URL bar
3. Click **Connection is secure** to see certificate details

---

#### B. Other troubleshooting steps

1. Try different browser
2. Disable browser extensions
3. Check if all users affected
4. Clear browser cache or try another browser

---

#### C. VPN issues

1. Disable VPN and test
2. If fixed, VPN caused problem
3. Contact IT team

---

#### D. DNS record issues

1. Use DNS checker (like [DNS Checker](https://dnschecker.org/)) to verify records
2. Confirm all records updated
3. If not synced, contact DNS provider or registrar

Contact [Document360 support](https://document360.com/support/) if problems persist.

---

## FAQs

---

### Do I need an SSL certificate for custom domains?

Document360 provides automatic SSL certificates. No purchase needed. For custom certificates, contact [support@document360.com](mailto:support@document360.com).

---

### Will custom domains appear in reader invitation emails?

Yes, emails sent after successful mapping use custom domain links.

---

### What if CNAME doesn't verify after DNS updates?

Reconfigure custom domain:

1. Remove current configuration
2. Re-add custom domain
3. Update CNAME records
4. Verify setup

---

### Can I configure two custom domains for one KB site?

No. One custom domain per KB site. Set up redirects between domains instead.

---

### Can I set multiple domains for one project?

Currently, Document360 supports one custom domain per project.

---

### What is a Naked Domain?

Domain without "www" prefix. `example.com` is naked, `www.example.com` is not.

Most domains default to "www" subdomain. Naked domains like `yourcompany.com` exclude this.

---

### What is a domain registrar?

Company where you purchase and manage domain names (GoDaddy, Namecheap, Google Domains). Update settings here to connect domains to Document360.

---

### What is a CNAME record?

DNS setting that connects your custom domain (like `help.yourcompany.com`) to another address. Ensures users reach your knowledge base when typing custom domain.

---

### Why upgrade to new load balancer?

* SSL offloading reduces server load and improves security
* Web Application Firewall (WAF) protects against common attacks
* Dynamic traffic management for optimal distribution

Recommended for improved security and reliability.

---

### Can I create separate domains for each project version?

No. Versions share the same domain. Customize path within existing domain only.

---

## Hosting Document360 on subdirectory

**Plans supporting subdirectory hosting**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

---

### What is subdirectory hosting?

Organize website content using folders under root domain. Subdirectory comes after domain name.

Example: Document360's root domain is `document360.com`. Subdirectory URL: `document360.com/docs/`

Most companies use subdirectories like `/docs` or `/support`.

SEO benefit: subdirectories (`example.com/docs`) rank better than subdomains (`docs.example.com`).

> NOTE: Works with Document360 domains and custom domains.

---

### Enabling subdirectory hosting

1. Go to **Settings** > **Knowledge base site** > **Custom domain** > **Subfolder hosting** tab
2. Default path is `/docs`
3. Turn on toggle for "This documentation is hosted on a sub folder"

![Subfolder hosting settings](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Subfolder_hosting_tab_in_settings.png)

---

### Custom subdirectory paths

Use paths other than `/docs` like `/help` or `/support`.

1. Go to **Settings** > **Knowledge base site** > **Custom domain** > **Subfolder hosting** tab
2. Clear **Subfolder path** field
3. Enter custom path (e.g., `/help`)
4. Click **Update**

> NOTE: For projects with custom domains and subfolder hosting, **Article preview** not supported.

![Custom subfolder path](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-Custom_domain_subfolder_path.png)

---

### Custom Site API paths

Available only for KB site 2.0 projects. Default path is `/api`.

1. Go to **Settings** > **Knowledge base site** > **Custom domain** > **Subfolder hosting** tab
2. Clear **Site API path** field
3. Enter custom path (e.g., `/docs-api`)
4. Click **Update**

> CAUTION: KB site 2.0 requires both **Subfolder path** and **Site API path** defined.

> NOTE: This is not for **API Documentation**.

![Custom API path](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_Screenshot-Custom_domain_site_api_path.png)

---

## Web servers

Common web servers:
* Apache HTTP server
* Nginx server  
* ASP.NET Core server
* Microsoft IIS server
* OpenResty server
* LiteSpeed server
* Cloudflare server

> NOTE: Web server stores and delivers website content to clients (usually browsers).

---

## What happens next?

Knowledge base goes live on custom subdirectory. Original URL still works.

Example: `example.document360.io` and `example.com/docs` both point to same site.

Causes duplicate content in search engines. Enable redirect to prevent this.

> NOTE: Contact [support@document360.com](mailto:support@document360.com) to enable redirect.

---

## FAQs

---

### What is a Canonical URL?

Official URL that tells search engines which version to index when multiple URLs show same content. Prevents duplicate content issues.

Example URLs for same page:
* `https://example.com/page`
* `https://www.example.com/page`  
* `https://example.com/page?utm=123`

Set one (e.g., `https://www.example.com/page`) as canonical.

---

### How to configure canonical URL in Document360?

Use Canonical domain setting to globally replace project subdomain with specified domain in all articles.

1. Go to **Settings** > **Knowledge base site** > **Custom domain** > **Subfolder hosting** tab
2. Find **Canonical domain** option
3. Enter desired domain (e.g., `https://www.yourdomain.com`)
4. Click **Save**

---

## Nginx server - Subfolder hosting

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Nginx is open-source web server. [Documentation](https://nginx.org/en/docs/)

---

### Setting up subdirectory

Example configuration:

> NOTE: Replace example domains with your Document360 domain or custom domain.
> * Example: `example.document360.io`
> * Subdirectory: `/docs`

1. Add location blocks to Nginx config (`/etc/nginx/default`):

```
location /docs {
    proxy_pass https://example.document360.io/docs;
    proxy_set_header Host example.document360.io;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header "requested-by" "proxy";
    proxy_ssl_server_name   on;
}
```

2. Restart Nginx:
`$ sudo systemctl restart nginx`

> NOTE: KB Site 2.0 requires both Subfolder path and Site API path defined.

---

### Setup for non-`/docs` paths

Use paths like `/help` or `/support`.

When setting custom paths, add languages for each workspace.

```
location /help {
    proxy_pass https://example.document360.io/docs;
    proxy_set_header Host example.document360.io;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header "requested-by" "proxy";
    proxy_ssl_server_name   on;

    sub_filter "v1/docs/" "v1/help/";
    sub_filter "docs/he/" "/help/he";
    sub_filter "/docs/" "/help/";
    sub_filter_once off;
}
```

1. Restart Nginx
2. `$ sudo systemctl restart nginx`

---

### Enable workspace dropdown

Add code blocks for each workspace in your project.

Example with two workspaces (**v1** and **v2**):

```
location /v2/help {
    proxy_pass https://example.document360.io/v2/docs;
    proxy_set_header Host example.document360.io;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header "requested-by" "proxy";
    proxy_ssl_server_name   on;

    sub_filter "v2/docs/" "v2/help/";
    sub_filter "docs/he/" "/help/he";
    sub_filter "/docs/" "/help/";
    sub_filter_once off;
}
-----------------------------------------------------
location /v1/help {
    proxy_pass https://example.document360.io/v1/docs;
    proxy_set_header Host example.document360.io;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header "requested-by" "proxy";
    proxy_ssl_server_name   on;

    sub_filter "v1/docs/" "v1/help/";
    sub_filter "docs/he/" "/help/he";
    sub_filter "/docs/" "/help/";
    sub_filter_once off;
}
-----------------------------------------------------
location = /v2/docs {
    return 301 /v2/help;
}
-----------------------------------------------------
location = /v1/docs {
    return 301 /v1/help;
}
```

> NOTE: Add location blocks for all public workspaces to enable dropdown navigation.

1. Restart Nginx
2. `$ sudo systemctl restart nginx`

---

## Helpful links

* [NGINX Docs: Configuring NGINX as Web Server](https://docs.nginx.com/nginx/admin-guide/web-server/web-server/)
* [DigitalOcean: Understanding Nginx Location Blocks](https://www.digitalocean.com/community/tutorials/understanding-nginx-server-and-location-block-selection-algorithms)

---

## Sitemap generation

Example configuration:

> NOTE: Replace example domain with your Document360 or custom domain.
> * Example: `example.document360.io`
> * Sitemap: `example.document360.io/sitemap.xml.en`

```
location /sitemap.xml.en {
proxy_pass https://example.document360.io/sitemap.xml.en;
proxy_set_header Host example.document360.io;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header "requested-by" "proxy";
proxy_ssl_server_name   on;
```

---

## Homepage on subdirectory

Add code blocks for each workspace homepage.

Example with two workspaces (**V1** and **V2**):

```
location =/v1 {
proxy_pass https://example.document360.io/;
proxy_set_header Host example.document360.io;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header "requested-by" "proxy";
proxy_ssl_server_name   on;
}
location =/v2 {
proxy_pass https://example.document360.io/;
proxy_set_header Host example.document360.io;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header "requested-by" "proxy";
proxy_ssl_server_name   on;
}
location /v1/en {
  return 301 /v1;
}
location /v2/en {
  return 301 /v2;
}
```

> PRO TIP: Equal sign matches exact URI. When matched, search stops. [Details](https://docs.nginx.com/nginx/admin-guide/web-server/web-server/#locations)

1. Restart Nginx
2. `$ sudo systemctl restart nginx`

**Knowledge base homepage**

Default appears at root (e.g., `example.document360.io`). Workspace/language-specific: `example.document360.io/v2/he`

---

## What happens next?

Knowledge base goes live on custom subdirectory. Original URL still works.

Example: `example.document360.io` and `example.com/docs` both point to same site.

Causes duplicate content in search engines. Enable redirect to prevent this.

> NOTE: Contact [support@document360.com](mailto:support@document360.com) for redirect setup.

---

## Troubleshooting

---

### Invalid location directive

**Error:** nginx: [emerg] "location" directive not allowed here

Occurs when location blocks are outside server context.

**Fix:**
1. Place location blocks within server block:

```
server {
    listen 80;
    server_name example.com;
    location /docs {
        proxy_pass https://example.document360.io/docs;
        proxy_set_header Host example.document360.io;
    }
}
```

2. Don't place location directives in global `http` context

Contact [support](https://document360.com/support/) if issues persist.

---

### Certbot package unavailable

**Error:** No package Certbot available

EPEL repository not enabled on RHEL-based systems.

**Fix:**
1. Enable EPEL:
`sudo yum install epel-release`

2. Install Certbot:
`sudo yum install certbot`

3. Verify internet access and repository files in `/etc/yum.repos.d/`

Contact [support](https://document360.com/support/) if problems persist.

---

### Nginx configuration test failed

**Error:** NGINX configuration test failed

Syntax error in configuration file.

**Fix:**
1. Test configuration:
`sudo nginx -t`

2. Review error message and line number:

```
nginx: [emerg] invalid parameter "proxy_pas" in /etc/nginx/sites-enabled/example:22
nginx: configuration file /etc/nginx/nginx.conf test failed
```

3. Fix configuration (example):

```
# Incorrect
proxy_pas https://example.com;

# Correct  
proxy_pass https://example.com;
```

4. Restart Nginx:
`sudo systemctl restart nginx`

Contact [support](https://document360.com/support/) if issues persist.

---

### SSL certificate not working

Certificate details don't match configuration or installation failed.

**Fix:**
1. Verify certificate:
`openssl x509 -in /etc/letsencrypt/live/yourdomain.com/fullchain.pem -text -noout`

2. Confirm configuration matches certificate details

3. Correct SSL configuration example:

```
server {
    listen 443 ssl;
    server_name yourdomain.com;
    
    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
}
```

4. Restart Nginx:
`sudo systemctl restart nginx`

Contact [support](https://document360.com/support/) if problems persist.

---

### FAQ

**Why is homepage not available?**

Ensure homepage is published in site builder and accessible to intended audience.

---

## ASP.NET Core server

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Integrate documentation into existing website using subfolders like `/help` to access knowledge base at `example.document360.io/help`.

Replace example domains with your Document360 or custom domain.

---

### Setting up subfolder path

1. Install [ASP.Net Core package](https://www.nuget.org/packages/Microsoft.AspNetCore.Proxy/)
2. Configure `Standard.cs`:

```
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            /// ...
            app.MapWhen(ctx => ctx.Request.Path.StartsWithSegments("/docs"),
                builder => builder.RunProxy(new ProxyOptions() {
                    Scheme = "https",
                    Host="example.document360.io"
            }));
            
           /// ...
```

> NOTE: KB Site 2.0 requires both Subfolder path and Site API path defined.

---

## What happens next?

Knowledge base goes live on custom subfolder. Original URL still works.

Example: `example.document360.io` and `example.com/docs` both point to same site.

Causes duplicate content in search engines. Enable redirect to prevent this.

> NOTE: Contact [support@document360.com](mailto:support@document360.com) for redirect setup.

---

## Microsoft IIS server

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Integrate documentation into existing website using subfolders like `/help` to access knowledge base at `example.document360.io/help`.

Replace example domains with your Document360 or custom domain.

---

### Prerequisites

* [Application Request Routing module](https://www.iis.net/downloads/microsoft/application-request-routing)  
* [URL Rewrite Module](https://iis-umbraco.azurewebsites.net/downloads/microsoft/url-rewrite)

---

### Setting up subfolder path

1. Install [URL Rewrite module](https://www.iis.net/downloads/microsoft/url-rewrite)
2. Install and enable Application Request Routing module
3. Add rewrite rules to `web.config` for `/help` path:

```
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="ReverseProxy_HomePage" enabled="true" stopProcessing="true">
                    <match url="^help$" />
                    <action type="Rewrite" url="https://example.document360.io/v1" />
                    <serverVariables>
                        <set name="HTTP_requested_by" value="proxy" />
                        <set name="HTTP_X_ORIGINAL_ACCEPT_ENCODING" value="{HTTP_ACCEPT_ENCODING}" />
                        <set name="HTTP_ACCEPT_ENCODING" value="" />
                    </serverVariables>
                </rule>
        <rule name="ReverseProxy_DocsPage" enabled="true" stopProcessing="true">
                    <match url="^help/(.*)" />
                    <action type="Rewrite" url="https://example.document360.io/help/{R:1}" />
                    <serverVariables>
                        <set name="HTTP_requested_by" value="proxy" />
                        <set name="HTTP_X_ORIGINAL_ACCEPT_ENCODING" value="{HTTP_ACCEPT_ENCODING}" />
                        <set name="HTTP_ACCEPT_ENCODING" value="" />
                    </serverVariables>
                </rule>
            </rules>
            <outboundRules>
                <rule name="RestoreAcceptEncoding" preCondition="NeedsRestoringAcceptEncoding">
                    <match serverVariable="HTTP_ACCEPT_ENCODING" pattern="^(.*)" />
                    <action type="Rewrite" value="{HTTP_X_ORIGINAL_ACCEPT_ENCODING}" />
                </rule>
        <rule name="RewriteLinksToSourceDomain1" preCondition="ResponseIsHtml">
                    <match filterByTags="None" pattern="^https://example.document360.io/(.*)" />
                    <action type="Rewrite" value="https://example.com/{R:1}" />
                </rule>
        <rule name="RewriteLinksToSourceDomain2" preCondition="ResponseIsHtml">
                    <match filterByTags="None" pattern="&quot;/help&quot;" />
                    <action type="Rewrite" value="&quot;/help&quot;" />
                </rule>
        <rule name="RewriteLinksToSourceDomain3" preCondition="ResponseIsHtml" patternSyntax="ECMAScript">
                    <match filterByTags="A" pattern="(.*)/docs/(.*)" />
                    <action type="Rewrite" value="/help/{R:2}" />
                </rule>
                <preConditions>
        <preCondition name="ResponseIsHtml">
                        <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
                    </preCondition>
                    <preCondition name="NeedsRestoringAcceptEncoding">
                        <add input="{HTTP_X_ORIGINAL_ACCEPT_ENCODING}" pattern=" .+" />
                    </preCondition>
                </preConditions>
            </outboundRules>
        </rewrite>
    </system.webServer>  
</configuration>
```

Backup `web.config` before changes.

> NOTE: KB Site 2.0 requires both Subfolder path and Site API path defined.

---

## What happens next?

Knowledge base goes live on custom subfolder.

Original URL still works.

Example: `example.document360.io` and `example.com/help` both point to same site.

Causes duplicate content in search engines. Enable redirect to prevent this.

> NOTE: Contact [support@document360.com](mailto:support@document360.com) for redirect setup.

---

### FAQs

**What is Internet Information Services (IIS)?**

Microsoft's flexible, secure web server for hosting websites and applications on Windows. Supports HTTP, HTTPS, FTP protocols.

**What is Application Request Routing (ARR) module?**

IIS extension enabling load balancing and request routing based on rules.

**What is URL Rewrite module in IIS?**

Module for modifying URLs and redirecting users seamlessly.

**Purpose of `web.config` file in IIS?**

Stores configuration settings like rewrite rules, security settings, and server behavior.

---

## Apache HTTP server

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Apache HTTP server is free, open-source, and highly customizable.

> NOTE: Replace example domains with your Document360 or custom domain.
> * Example domain: `example.document360.io`
> * Subdirectory: `example.document360.io/v1`
> * Homepage path: `example.document360.io/help`

---

### Setting up subfolder path

Enable these Apache modules:
* proxy
* proxy_http  
* headers
* substitute
* proxy_html

Enable with bash command:
`sudo a2enmod proxy proxy_http headers substitute proxy_html`

---

#### Homepage

Configure Virtual Host location blocks:

**Location Block** - Proxy requests where path starts with "/help":

```
<Location /help>
   ProxyPreserveHost off
   RequestHeader set Host example.document360.io
   RequestHeader set requested-by proxy
   RequestHeader unset Accept-Encoding
   ProxyPass https://example.document360.io/v1
   ProxyPassReverse https://example.document360.io/v1

   AddOutputFilterByType SUBSTITUTE text/html
   substitute 's|href="/docs|href="/help|ni'
   substitute 's|href="/v1/docs|href="/help|ni'
   substitute 's|href="https://example.document360.io/docs|href="https://docs.example.com/help|ni'
</Location>
```

**Redirect block for article preview links:**

Article preview links contain workspace/language slug.

Example:
* Article URL: `docs.example.com/getting-started`
* Preview: `docs.example.com/v1/en/getting-started`

Set redirect from `/v1/en` to `/`:

```
RewriteEngine on
RewriteRule ^v1/en$ / [R=301,L,NC]
```

Install rewrite module:
`sudo a2enmod rewrite`

---

#### Article/Category pages

**Location Block** - Proxy requests where path starts with "/help/":

```
<Location /help/>
   ProxyPreserveHost off
   RequestHeader set Host example.document360.io
   RequestHeader set requested-by proxy
   ProxyPass https://example.document360.io/docs/
   ProxyPassReverse https://example.document360.io/docs/

   AddOutputFilterByType SUBSTITUTE text/html
   substitute 's|href="/docs|href="/help|ni'
   substitute 's|href="/v1/docs|href="/help|ni'
   substitute 's|href="https://example.document360.io/docs|href="https://docs.example.com/help|ni'
</Location>
```

4. Restart Apache server:
`$ sudo systemctl restart apache2`

> NOTE: KB Site 2.0 requires both Subfolder path and Site API path defined.

---

## Sitemap generation

> NOTE: Replace example domain with your Document360 or custom domain.
> * Example: `example.document360.io`
> * Sitemap: `example.document360.io/sitemap.xml.en`

```
<Location /sitemap.xml.en>
    RequestHeader set Host example.document360.io;
    RequestHeader set requested-by proxy;
    ProxyPass https://example.document360.io/sitemap.xml.en;
    ProxyPassReverse https://example.document360.io/sitemap.xml.en;
</Location>
```

---

## What happens next?

Knowledge base goes live on custom subfolder.

Original URL still works.

Example: `example.document360.io` and `example.com/docs` both point to same site.

Causes duplicate content in search engines. Enable redirect to prevent this.

> NOTE: Contact [support@document360.com](mailto:support@document360.com) for redirect setup.

---

## Readers self-registration

**Plans supporting Readers self-registration**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

> NOTE: Self-registration only available when Knowledge base access is **Private** or **Mixed**.

---

### Reader self-registration

Users create reader accounts without invitations. Share knowledge base URL for independent signup.

Registered readers appear in **Readers** list. Project members with **User & Security** access can edit/remove readers.

---

### Self-register on Knowledge base site

1. Go to Knowledge base site
2. Click **Sign up** at login screen bottom

![Signup step](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/new%20account(1).png)

3. Enter **First name**, **Last name**, **Email**
4. Click **Sign up**

![Self signup page](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/Self sign up.png)

Confirmation: "Account created successfully"

![Account created](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/New account created.png)

Receive invitation email. Verify, set password, and login.

> NOTE: Email verification required only once. Works across multiple projects.

---

### Accessing Reader self-registration option

1. Go to Settings > **Users & Security** > **Readers & groups**
2. Select **Reader self-registration** tab

![Self registration tab](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/image-1731477666955.png)

3. If **Enable Self-Registration** toggle is off, page is empty
4. If toggle is on, options appear:

**Add to default reader group** (optional)

New readers automatically join selected default groups. Email domain mapping takes precedence.

To assign default reader group:
1. Click **Default Reader Group** field
2. Select one or more reader groups
3. Groups appear in field
4. Click 'X' to remove groups
5. Click **Save**

**Restrict registration by domain** (optional)

Allow or block self-registrations based on email domain.

* **Allow Specific Domains:** Restrict to organization employees. Example: `@examplecorp.com` with **Allow** status
* **Block Specific Domains:** Prevent unauthorized users. Example: `@genericmail.com` with **Block** status

---

### Adding domain restrictions

1. Go to Settings > **Users & Security** > **Readers & groups** > **Reader self-registration** tab
2. Scroll to **Domain Restriction** section
3. Enter domain in **Domain Name** field (e.g., `@genericmail.com`)
4. Select option:
   * **Allow (Whitelist)**: Permit specified domains, block others
   * **Block (Blacklist)**: Prevent specified domains, allow others

5. Assign reader groups to each domain:
   * Select groups from dropdown
   * Click 'X' to remove groups
   * Click **Save** to confirm
   * Click clear icon to clear line entries
   * Click **Remove** to delete line completely

6. Click **Add domain** for additional restrictions

> NOTE: Domain-specific settings override default reader groups.

---

### FAQs

**What happens if no default reader group selected?**

Self-registered readers get unrestricted access to entire knowledge base.

**What access do readers with multiple group memberships get?**

Highest level of access for each content item.

Example: Reader in Group A (all V1 languages) and Group B (V1 English only) gets access to all V1 languages.

**Does individual content access override group access?**

No. Reader gets highest privilege from both individual and group settings.

Example: Individual English-only V2 access plus group all-languages V2 access = all V2 languages.

**How is reader access prioritized?**

Highest privilege at each content level. Readers only access granted content.

**Why isn't self-registration working?**

SSO bypasses Document360 login page where self-registration occurs. Domain configuration only works on Document360 login page.

---

## Managing reviewer accounts

**Plans supporting reviewer role settings**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Reviewer role allows content review without editing. Access Documentation module to view articles/categories, add comments, update workflow status.

---

### Creating Reviewer account

1. Go to **Settings** > **Users & security** > **Team accounts & groups**
2. Click **Create** > **Team account**
3. Enter user email address
4. Select **Reviewer** from **Portal role** dropdown. Content role auto-sets to **Reviewer**
5. Or select other portal role and manually assign **Reviewer** content role
6. Assign content access permissions
7. Click **New team account**

![Create reviewer account](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Create_new_revieiwer_account.png)

---

### Bulk importing reviewers

1. Go to **Settings** > **Users & security** > **Team accounts & groups**
2. Select **Add** > **Import Team Accounts**
3. Select **Reviewer** account type
4. Check **SSO account** for SSO reviewers
5. Click **Download template**
6. Prepare CSV with user email addresses
7. Upload CSV file
8. Assign portal and content roles
9. Click **Import**

![Import reviewers](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/6_ScreenGIF-Importing_reviewer_roles.gif)

---

## Reviewer permissions and access

Documentation module access only. Permissions limited to reviewed content.

> NOTE: Reviewers can review one article at a time. Banner shows "Reviewer [Name] is currently reviewing the article."

Can:
* View articles in Draft mode or workflow state
* Add comments (inline included)
* Update workflow status
* Set due dates and manage assignments
* Bulk update workflow statuses from Workflow assignments page

> NOTE: Read-only workflow status blocks comments for all team accounts.

---

### Managing reviewer accounts

Update through **Team accounts & groups** section. Convert between Reviewer and Reader roles.

---

#### Edit or delete reviewer

1. Go to **Settings** > **Users & security** > **Team accounts & groups**
2. Find user, hover cursor, select **Edit** or **Delete**

---

#### Convert reviewer to reader

1. Go to **Settings** > **Users & security** > **Team accounts & groups**
2. Check user box
3. Click **Convert to reader**
4. Assign content access from **Content access** dropdown
5. Map to reader groups (optional)
6. Click **Confirm**

---

#### Purchasing reviewer accounts as add-ons

1. Go to **Settings** > **Knowledge base portal** > **Billing**
2. Click **Purchase add-on** in **My plan** tab
3. Add number of **Reviewer accounts** needed
4. Click **Confirm payment**

![Add reviewer accounts](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/5_Screenshot-Adding_Reviewer_role_As_Add-ons_.png)

---

### Reviewer role functionality

Streamline content review without allowing edits. Access Draft articles for comments, suggestions, workflow updates.

---

#### Reviewing an article

1. Navigate to article from **Category & article** pane
2. Click **Start Review** at top right

To add comment:
1. Highlight text, click floating Comment icon
2. Enter comment, click **Post** or press **Ctrl+Enter**

When complete, click **Mark as Reviewed** at top right.

![Review article](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_GIF-Reviewing_an_article.gif)

To update workflow status:
1. Click Workflow status dropdown
2. Select status
3. Click **Set due date** icon, choose date
4. Click **Assign** icon, search team account
5. Click **Set status**

---

### FAQs

**How many reviewers included in each plan?**

* Professional: 5 Reviewers
* Business: 10 Reviewers
* Enterprise: 20 Reviewers

**Can reviewers edit articles?**

No. Comments and workflow updates only.

**Can reviewers access all articles?**

No. Only articles they have permission to review.

---

## Account locked

**Plans allowing password changes**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Account locked after 5 consecutive failed login attempts for 30 minutes.

Message: **Account locked due to multiple failed attempts! Please try again after 30 minutes.**

---

### Resetting password

1. Click **Forgot password?** on login page
2. Enter email address, click **Send**
3. Check inbox for reset email
4. Click **Reset Password** link
5. Enter new password, confirm it
6. Click **Reset**

> NOTE: Password changes apply to entire account, not specific projects.

![Account locked, forgot password](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Account_locked_forgot_password.png)

---

### New password requirements

* Minimum 8 characters
* At least 1 uppercase letter
* At least 1 lowercase letter  
* At least 1 number
* At least 1 special character

---

### Changing current password

Visit [Change password article](https://docs.document360.com/v3/docs/change-password) for instructions.

---

## Block inheritance

**Plans supporting block inheritance**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Restrict content access even with inherited permissions. Prevent users/teams from accessing content regardless of inherited rights.

---

### Content access at workspace level

Example: 6 inherited team accounts in workspace V1, want access for only 1 account plus yourself.

1. Go to **Settings** > **Users & Security** > **Content access**
2. Click workspace
3. Turn on **Block inherited account** toggle

Only accounts with direct content access display. Inherited accounts hidden.

![Block inheritance at workspace level](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_ScreenGif-Block_inheritance.gif)

---

### Disable inheritance for category or article

1. Go to Documentation, hover over category/article
2. Click **More** (•••) icon
3. Click **Security** > **Knowledge base portal** Access control
4. **Assign control access** panel appears
5. Turn on **Block inherited account** toggle
6. Only non-inherited accounts display
7. Click **Assign article access** for specific accounts
8. Select accounts, click **Apply**
9. Click **Close**

![Block inheritance at content level](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_ScreenGif-Block_inheritence.gif)

---

#### What happens after blocking inheritance?

Only listed accounts can access content level. Later add desired accounts to access list.

---

### Allow inheritance

Turn off **Block inherited account** toggle for inherited access.

---

#### Enable inheritance for category or article

1. Go to Documentation, hover over category/article
2. Click **More** (•••) icon
3. Click **Security** > **Knowledge base portal Access control**
4. **Assign control access** panel appears
5. Turn off **Block inherited account** toggle
6. Click **Yes** in **Allow inheritance** prompt
7. Click **Close**

![Enable inheritance](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_ScreenGif-Block_inheritance.gif)

---

### FAQs

**What happens when inheritance disabled?**

Only listed accounts can access that category or article.

**Is performing account automatically selected when blocking inheritance?**

Yes, and cannot be removed.## IP restriction

**Plans supporting IP restriction settings**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

**IP restriction** adds security by limiting access to specified IP addresses.

> NOTE
> 
> This setting applies to all workspaces and languages in the project.

Document360 supports **IPv4** and **IPv6** unicast addresses.

---

## IP restriction page

1. Navigate to Settings > **User & Security** > **IP restriction**
2. The IP restriction overview page appears

**Fields:**

* **Friendly name** - Identifier for the restriction (no character limit)
* **IP address** - Individual address or range (**IPv4** or **IPv6**)
* **Allow/Block** - Set restriction type
* **Remove** - Delete restriction using icon
* **Save** - Save restriction using icon

![IP restriction overview](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/54_ScreenShot-IP_restriction.png)

---

## Add IP restriction

1. Click **Add IP address**
2. Enter **Friendly name** (required)
3. Enter IP address or range

   Example: 79.15.135.189 - 79.15.135.229
4. Click **Save** icon
5. Click **Reset** icon to clear entries

![Add IP restriction](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/image-1725352385689.png)

New restrictions appear in the overview list.

**Alternative:** Click **Add my current IP address** to auto-fill your IP.

---

## Supported IPv6 formats

* 2001:0db8:85a3:0000:0000:8a2e:0370:7334  ✅
* 2001:0db8:85a3::8a2e:0370:7334  ❌
* 2001:db8:85a3:0:0:8a2e:370:7334  ✅

---

## Allow/Block IP addresses

* Select **Allow** for permitted IP addresses
* Select **Block** for restricted IP addresses

> NOTE
> 
> Duplicate IP entries trigger warning: '*A restriction with this IP address already exists*'

---

## Delete IP restriction

Click **Delete** icon next to the IP address.

Popup confirms: **IP restriction deleted**

> NOTE
> 
> Deleted restrictions cannot be recovered.

---

## FAQ

**What is an IP address?**

Numeric identifier for computers on a network. Enables internet communication.

**What is IPv4 format?**

Four numbers (0-255) separated by dots.

Example: 49.206.113.170

**What is IPv6 format?**

128-bit addresses in eight groups of hexadecimal digits separated by colons.

Example: FE38:DCE3:124C:C1A2:BA03:6745:EF1C:683D

* **Starting address**: 0000:0000:0000:0000:0000:0000:0000:0000
* **Ending address**: ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff

**What is IPv6 unicast address?**

Identifies single network interface. Ensures point-to-point communication.

<a id="single-sign-on-sso"></a>

## Single Sign-On (SSO)

**Plans supporting SSO**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

## What is SSO?

**Single Sign-On** authenticates users across multiple applications with one login.

Users access linked applications without re-entering credentials.

---

## Benefits of SSO

1. **Improved security** - Reduces credential storage locations
2. **Increased productivity** - Eliminates multiple login steps
3. **Better user experience** - Fewer password prompts
4. **Simplified IT management** - Centralized access control
5. **Compliance** - Meets regulatory requirements
6. **Reduced IT costs** - Minimizes authentication infrastructure

---

## How SSO works

Document360 (Service Provider) relies on external Identity Provider (IdP) for authentication:

1. User visits Document360 sign-in page
2. Redirected to IdP login page
3. User authenticates with IdP
4. IdP sends **Access token** or **ID token** to Document360
5. Document360 validates token
6. Trust relationship established

Successful authentication grants access to all SSO-enabled applications.

Document360 supports multiple IdP configurations simultaneously.

---

## What is an IdP?

Identity Provider stores user credentials and manages authentication for applications.

Each stored entity is a '**principal**'.

**Supported IdPs:**

* **Okta**
* **Entra ID**
* **Google**
* **ADFS**
* **OneLogin**

---

## SSO Standards

Document360 supports two protocols:

![SSO standards](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/sso_in_knowledge_base_Document360-1200x683.jpg)

### **SAML 2.0**

* [**Enabling SAML SSO**](https://docs.document360.com/docs/enabling-saml-sso)
* [**Removing SAML SSO**](https://docs.document360.com/docs/removing-a-configured-saml-sso)
* **Okta:** [**SAML with Okta**](https://docs.document360.com/docs/saml-sso-with-okta)
* **Entra ID:** [**SAML with Entra ID**](https://docs.document360.com/docs/saml-sso-with-entra)
* **Google:** [**SAML with Google**](https://docs.document360.com/docs/google-sso-saml-configuration)
* **OneLogin:** [**SAML with OneLogin**](https://docs.document360.com/docs/saml-sso-with-onelogin)
* **ADFS:** [**SAML with ADFS**](https://docs.document360.com/docs/saml-sso-with-adfs)
* **Other IdPs:** [**SAML with Other IdPs**](https://docs.document360.com/docs/saml-sso-with-other-configurations)

---

### **OpenId Connect**

* [**Enabling OpenID SSO**](https://docs.document360.com/docs/enabling-openid-sso)
* [**Removing OpenID SSO**](https://docs.document360.com/docs/removing-a-configured-openid-sso)
* **Okta:** [**OpenID with Okta**](https://docs.document360.com/docs/okta-with-openid-sso)
* **Auth0:** [**OpenID with Auth0**](https://docs.document360.com/docs/auth0-with-openid-sso)
* **ADFS:** [**OpenID with ADFS**](https://docs.document360.com/docs/adfs-with-openid-sso)
* **Other IdPs:** [**OpenID with Other IdPs**](https://docs.document360.com/docs/other-configurations-with-openid-sso)

Security Assertion Markup Language (SAML) enables secure authentication across multiple applications with single credentials.

<a id="login-using-sso-knowledge-base-portal"></a>

## Login using SSO - Knowledge base portal

**Plans supporting SSO**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Access Document360 portal with existing IdP credentials. Eliminates separate password management.

---

## Logging in via SSO

1. Open browser and enter Document360 **Knowledge base portal** URL
2. Enter email address or domain name in **Email or Subdomain** field
3. Click **Continue with SSO**
4. Redirected to IdP login page
5. Authenticate with IdP credentials

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-KBportal_login_using_SSO.png)

Successful authentication logs you into Document360 portal.

---

## IdP initiated sign-in

When **Allow IdP initiated sign-in** is enabled during SSO setup:

1. Navigate to IdP dashboard
2. Locate Document360 application
3. Click application to initiate login

No need to visit Document360 portal first.

---

## Troubleshooting

### User access not assigned in IdP

**Error:** "Sorry, but we're having trouble signing you in. Your administrator has configured the application Document360 to block users unless specifically granted access."

User not assigned in IdP.

![Access error](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_Screenshot-Troubleshooting_user_access_not_assigned_idp.png)

**Solution:**

1. Log in to IdP portal
2. Navigate to **Applications**
3. Select Document360 application
4. Add required users or groups

---

### No projects associated with email

**Error:** "No projects associated with this email address. Contact Project administrator."

Account exists in IdP but not linked to Document360 project.

![No project error](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/5_Screenshot-Troubleshooting_no_project_associated.png)

**Solution:**

1. Log in to **Knowledge base portal** as administrator
2. Select project
3. Navigate to **Settings** > **Users & security** > **Team accounts & groups**
4. Check user account status:

   * If account exists but isn't SSO-enabled: Select checkbox > Click **Convert to SSO account**
   * If user not listed: Click **Add** > **Team account** > Check **SSO user** checkbox

---

### Missing email in SAML/ODIC response

**Error:** "Email address missing in SAML/ODIC response. Check SSO configuration or contact support."

Email/name attributes misconfigured in IdP. Case-sensitive fields.

![Missing email error](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/6_Screenshot-Troubleshooting_email_address_missing_in_saml_odic.png)

**Solution:**

**Check IdP attribute mapping**

1. Log in to IdP as administrator
2. Verify email/name attribute mapping
3. Confirm exact match with Document360 requirements:

   * Correct: "**email**" and "**name**"
   * Incorrect: "**Email**", "**EMAIL**", "**Name**", or "**NAME**"

**Update Document360 SSO configuration**

1. Log in to **Knowledge base portal** as administrator
2. Select project
3. Navigate to **Settings** > **Users & security** > **SAML/OpenID**
4. Click **Edit** for existing configuration
5. In **IdP configurations** section, verify mapped attributes match IdP settings
6. Save updated configuration

Test login to confirm fix.

---

### SSO not enabled for email

**Error:** "Single sign-on isn't enabled for this email"

Email not properly configured in IdP or Document360.

**Solution:**

1. Log in to IdP portal
2. Navigate to **Applications**
3. Select Document360 application
4. Verify team accounts/readers added with proper permissions

Check Document360 SSO configuration using [**SAML**](/help/docs/saml) and [**OpenID**](/help/docs/openid) guides.

Contact [Document360 support](mailto:support@document360.com) with IdP and Document360 configuration screenshots if issue persists.

---

### Unable to login via SSO

**Error:** "Single Sign-on not enabled for this subdomain"

Incorrect subdomain or portal link used.

![Subdomain error](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/8_Screenshot-Troubleshooting_sso_not_enabled.png)

**Solution:**

**Verify subdomain and portal URL**

* US domain: [**https://portal.us.document360.io/**](https://portal.us.document360.io/)
* EU domain: [**https://portal.document360.io/**](https://portal.document360.io/)

**Check subdomain**

* Navigate to **Settings** > **Knowledge base portal** > **Custom domain**
* Project link shows subdomain (e.g., `https://test1.document360.io` = subdomain "**test1**")
* Also found on **Configure the Service Provider (SP)** page in SSO configuration

---

### SSO login failure

**Error:** "This page isn't working - identity.us.document360.io unable to handle request. HTTP ERROR 500."

Identity certificate changed. Signing certificates rotate every three months.

![HTTP 500 error](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/7_Screenshot-Troubleshooting_sso_http_error_500.png)

**Solution:**

1. Configure **metadata URL** correctly in IdP
2. Metadata URL available on Document360 **SSO page** - shows latest certificate information
3. Contact [**support@document360.com**](mailto:support@document360.com) if issue persists

---

## FAQ

#### Why can't I access project despite granted access?

You may be SSO user for some projects, non-SSO for others. Use correct login method.

Contact [support team](https://support.kovai.co/a/tickets/support@document360.com) if issue persists.

#### Why 500 error during SSO authentication?

Likely outdated SAML certificate. Check if site is public - SSO typically for secure access. Update SAML certificate.

<a id="login-using-sso-knowledge-base-site"></a>

## Login using SSO - Knowledge base site

**Plans supporting SSO**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Access Document360 knowledge base site with existing IdP credentials.

---

## Logging in via SSO

1. Open browser and enter Document360 **Knowledge base site** URL
2. Select available SSO login button (e.g., "Login using Google")
3. Redirected to IdP login page
4. Authenticate with credentials

> NOTE
> 
> Available buttons depend on configured SSO providers.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-KBsite_login_using_SSO.png)

Successful authentication logs you into knowledge base site.

---

## IdP initiated sign-in

When **Allow IdP initiated sign-in** enabled during SSO setup:

1. Navigate to IdP dashboard
2. Locate Document360 application
3. Click application to initiate login

No need to visit Document360 site first.

<a id="inviting-or-adding-sso-users"></a>

## Inviting or Adding SSO users

**Plans supporting SSO**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Once SSO configured (SAML or OpenID), users access projects with existing IdP credentials.

Benefits:
* Eliminates separate password management
* Simplifies login process

Options:
* **Add new team accounts as SSO users**
* **Invite existing users to SSO**

---

## Add new team account as SSO user

Process mirrors [adding regular team account](/help/docs/managing-team-account) with extra step.

1. Navigate to **Settings** > **Users & security** > **Team accounts & groups**
2. Click **Create** > **Team account**
3. In **Create team account** window > **Basic details**:
   * Add user email in **Email** field
   * Email must match domain in SSO configuration
4. Check **SSO user** checkbox
5. Select SSO configuration from **Select SSO** dropdown
6. Check **Skip invitation email** if preferred

Complete remaining steps per [adding team account](/help/docs/managing-team-account) guide.

> NOTE
> 
> Only **Owner** and **Admin** roles can add team accounts.

---

## Invite existing users

1. Log in to Document360
2. Navigate to project
3. Go to **Settings** > **Users & security** > **SAML/OpenID**
4. Click **Edit** icon for target SSO configuration
5. Navigate to **More settings** tab
6. In **Convert existing team and reader accounts to SSO** section:
   * **All users** - Invites all project users
   * **Selected users only** - Choose specific users from list
7. Click **Save**

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Invite_users_to_SSO.png)

Team members receive invitation email with login details.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-Invitation_email_sample.png)

> NOTE
> 
> Inviting existing user creates additional SSO account. Original team account remains.

---

## Delete SSO user

1. Log in to Document360
2. Navigate to project
3. Go to **Settings** > **Users & security** > **Team accounts & groups**
4. Click **Delete** icon for target account
   * SSO accounts identified by SSO label next to email
5. Confirm deletion in popup

> NOTE
> 
> Deleting SSO account doesn't remove associated team account.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_Screenshot-Delete_SSO_user.png)

---

## FAQ

**Why can't I create SSO reader account?**

If user already exists as SSO reader, **Create reader account** button disables automatically when SSO checkbox checked.

<a id="mapping-an-existing-sso-configuration-to-other-projects"></a>

## Map existing SSO configuration to other projects

**Plans supporting SSO**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Apply existing SSO configuration (SAML or OpenID) to other Document360 projects.

1. Log in to Document360
2. Navigate to target project
3. Go to **Settings** > **Users & security** > **SAML/OpenID**
4. Click **Create SSO**
5. Select appropriate identity provider
   * Must match existing SSO configuration IdP
6. Select SAML or OpenID
   * Must match existing SSO protocol
7. Select existing configuration from **Configure existing connection** dropdown
8. Complete setup in **More settings** page
9. Click **Create**

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Select_existing_SSO_dropdown.png)

New configuration created based on selected existing setup.

<a id="disable-document360-login-page"></a>

## Disable Document360 login page

**Plans supporting SSO**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Redirect users directly to SSO login when only SSO users exist.

> CAUTION
> 
> Don't disable if both SSO and regular team accounts exist. Regular accounts lose login access.

---

## Disable login page

1. Log in to Document360
2. Navigate to project
3. Go to **Settings** > **Users & security** > **SAML/OpenID**
4. Click **Settings** button (next to **Create SSO**)

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-SSO_settings_page_settings_button.png)

5. Toggle **ON** **Disable Document360 login page**

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-Disable_D360_login_page_toggle.png)

6. Click **Save**

Available for both SAML and OpenID configurations.

---

## FAQ

**Effect of disabling login page?**

Users see only SSO options. Email/password login unavailable.

<a id="auto-assign-reader-group"></a>

## Auto assign reader group

**Plans supporting SSO**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Automatically grant access to readers who sign in via IdP. No manual invitations required.

---

## Auto assign SSO readers

1. Log in to Document360
2. Navigate to project
3. Go to **Settings** > **Users & security** > **SAML/OpenID**
4. Click **Edit** icon for target SSO configuration
5. Navigate to **More settings** tab
6. Toggle **ON** **Auto assign reader group**

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Auto_assign_reader_groups_toggle.png)

7. Select reader groups for auto-assignment
8. Click **Save**

> NOTE
> 
> Requires existing reader groups. Create via **Settings** > **Users & security** > **Reader & groups** > **Reader groups**

<a id="convert-to-sso-account"></a>

## Convert to SSO account

**Plans supporting SSO**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

## Convert Document360 account to SSO

Single Sign-On authenticates users across multiple applications with one login.

Convert existing accounts to SSO without changing roles/access.

> NOTE
> 
> Only available for SAML and OpenID configured projects.

---

## Convert team accounts to SSO

1. Navigate to **Settings** > **Users & Security** > **Team accounts & groups** > **Team account**
2. Select target account checkboxes
3. Click **Convert to SSO account**

![Convert team accounts](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/39_ScreenShot-SSO_conversion.png)

4. **Account convert** popup appears
5. Check box and click **Yes**

![Confirm conversion](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/40_ScreenShot-SSO_conversion.png)

> NOTE
> 
> * User contributions retained but previous activity shows as **Anonymous**
> * Cannot convert own account
> * Converting owner account creates duplicate - both regular and SSO accounts remain

---

## Convert readers to SSO

1. Navigate to **Settings** > **Users & Security** > **Readers & groups** > **Readers**
2. Select target reader checkboxes
3. Click **Convert to SSO account**

![Convert readers](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/41_ScreenShot-SSO_conversion.png)

4. **Account convert** popup appears
5. Check box and click **Proceed**

![Confirm reader conversion](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/42_ScreenShot-SSO_conversion.png)

> NOTE
> 
> SSO accounts cannot convert back to regular Document360 accounts.

---

## FAQ

**Who can convert accounts?**

**Owner**, **Admin**, or team accounts with **Manage team accounts** permission.

**Can convert in JWT projects?**

No. Only SAML and OpenID configured projects.

**Mistakenly converted accounts?**

No direct reversal. Delete SSO account and manually recreate regular account. Replicate roles/access.

<a id="team-account-idle-timeout"></a>

## Sign out idle SSO team account

**Plans supporting SSO**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Automatically log out inactive SSO team accounts for enhanced security.

Account considered idle after predefined inactivity period.

Applies only to SAML and OpenID configurations.

---

## Enable idle sign out

1. Navigate to **Settings** > **Users & Security** > **SAML/OpenID**
2. Click **Edit** icon for existing SSO configuration
3. Go to **More settings** tab
4. Toggle **ON** **Sign out idle SSO team account**

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Sign_out_idle_SSO_team_account(1).png)

5. Enter timeout duration in **hours:minutes** format
6. Click **Save**

> NOTE
> 
> Only affects SSO team accounts. Regular Document360 accounts unaffected.

---

## FAQ

**What happens after idle logout?**

User must re-authenticate to access Knowledge Base portal.

**Default timeout duration?**

2 hours. Configurable per project requirements.

<a id="saml"></a>

## SAML

**Plans supporting SSO**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

**SAML 2.0** enables single credentials access to multiple web applications.

Secure, convenient Document360 access via existing IdP credentials.

Supports multiple SSO endpoints for team accounts and readers.

---

## Supported IdPs

* **Okta**
* **Entra ID**
* **Google**
* **Auth0**
* **ADFS**
* **OneLogin**
* **Others**

---

## Configure SAML SSO

1. Log in to Document360
2. Navigate to project
3. Go to **Settings** > **Users & security** > **SAML/OpenID**
4. Click **Create SSO**
5. Select identity provider

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-Create_SSO_Choose_idp_page.png)

6. Select **SAML** protocol
7. Use **Configure the Service Provider (SP)** details to set up application in IdP

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-SSO_configuration_configure_sp.png)

8. Use IdP details to complete Document360 configuration

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_Screenshot-SSO_configuration_configure_idp.png)

9. Click **Create**

Users can now login via SSO or email/password.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_Screenshot-SSO_configuration_document360_login_page.png)

---

## Troubleshooting

### Invalid SAML request (Untrusted key)

**Error:** "Invalid SAML Request - SAML signature valid but uses untrusted key"

Inactive SAML certificate uploaded to Document360.

![Untrusted key error](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Troubleshooting_issue_untrusted_key.png)

**Solution:**

**Download active certificate**

1. Access IdP
2. Download current active SAML certificate

**Re-upload in Document360**

1. Navigate to **Settings** > **Users & security** > **SAML/OpenID**
2. Click **Edit** for relevant SSO configuration
3. Locate **SAML Certificate** field under **Configure the Identity Provider (IdP)**
4. Click **Browse** to upload new active certificate

---

### SAML message signature invalid

**Error:**

* "SignatureInvalid: SAML message signature invalid"
* "AssertionSignatureInvalid: SAML Assertion signature invalid"
* "Invalid SAML Request: SAML signature valid but uses untrusted key"

Incorrect or expired SAML certificate in Document360.

**Solution:**

**Verify certificate validity**

1. Check uploaded certificate is active and unexpired
2. Generate new certificate in IdP if needed

**Re-upload correct certificate**

1. Navigate to **Settings** > **Users & security** > **SAML/OpenID**
2. Click **Edit** for relevant SSO configuration
3. Locate **SAML Certificate** field under **Configure the Identity Provider (IdP)**
4. Click **Browse** to upload new active certificate

**Capture logs if issue persists**

1. Install [**SAML Tracer**](https://addons.mozilla.org/en-US/firefox/addon/saml-tracer/) browser extension
2. Open SAML Tracer before SSO login
3. Trigger SSO process
4. Right-click in SAML Tracer window
5. Select **Export** or save logs

Contact [**Document360 support**](mailto:support@document360.io) with:
* IdP configuration screenshots
* Uploaded SAML certificate details
* SAML Tracer logs

<a id="saml-sso-with-okta"></a>

## SAML SSO with Okta

**Plans supporting SSO**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

**Okta** simplifies access management with single credentials for multiple applications.

This guide configures SSO between Okta and Document360.

> PRO TIP
> 
> Open Document360 and Okta in separate tabs for easier configuration switching.

---

## Okta setup

### Sign up

1. Navigate to <https://developer.okta.com/signup/>
2. Complete registration
3. Check email for credentials and activation link
4. Click activation link
5. Log in to Okta Domain
6. Redirected to Okta developer console

---

## Add Okta application

1. Log in to Okta with admin credentials
2. Click **Admin** (top right)
3. Expand **Applications** > Click **Applications**
4. Click **Create App Integration**
5. Select **SAML 2.0** as sign-in method
6. Click **Next**

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_GIF-Okta_create_app_integration.gif)

---

## Create SAML integration

### General settings

1. Enter application name in **App name** field
2. Upload logo if required
3. Set app visibility
4. Click **Next**

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-Okta_general_settings.png)

### Configure SAML

Get Document360 parameters:

1. Navigate to **Settings** > **Users & security** > **SAML/OpenID** in Document360
2. Click **Create SSO**
3. Select **Okta** as Identity Provider

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_Screenshot-Choose_idp_okta.png)

4. **Configure the Service Provider (SP)** page shows required parameters

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_Screenshot-Okta_document360_parameters.png)

**Mapping:**

| Document360 | Okta |
| --- | --- |
| Callback path | Single sign-on URL |
| Service provider entity id | Audience URI (SP Entity ID) |

5. Enter Document360 parameters in Okta fields
6. Select **EmailAddress** from **Name ID format** dropdown
7. Select **Email** from **Application username** dropdown
8. Configure **Attribute Statements**:

| **Name** | **Name format** | **Value** |
| --- | --- | --- |
| urn:oasis:names:tc:SAML:2.0:nameid | URI Reference | user.email |
| name | Unspecified | user.email |
| email | Unspecified | user.email |

> NOTE
> 
> Email and name parameters are case-sensitive

9. Click **Next**

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_Screenshot-Okta_configure_saml.png)

### Feedback

1. Select **This is an internal app that we have created**
2. Click **Finish**

---

## Okta to Document360 configuration

### Get Okta parameters

1. In Okta dashboard > **Applications** > **Applications**
2. Select active application
3. Click **Sign On** tab
4. Click **View SAML setup instructions**

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/6_GIF-Okta_app_signon_setup_instructions.gif)

Parameters appear in new window:

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/7_Screenshot-Okta_setup_instructions_page.png)

### Configure Document360

1. Return to Document360 **Configure the Service Provider (SP)** page
2. Click **Next** to **Configure the Identity Provider (IdP)** page
3. Enter Okta parameters:

| Document360 | Okta |
| --- | --- |
| Sign on URL | Identity Provider Single Sign-On URL |
| Entity ID | Identity Provider Issuer |
| SAML certificate | X.509 Certificate |

4. Download **X.509 Certificate** from Okta
5. Upload **okta.cert** file to Document360 **SAML certificate** field
6. Toggle **Allow IdP initiated sign in** per project requirements

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/8_Screenshot-Okta_document360_configuration.png)

7. Click **Next** to **More settings** page
8. Enter **SSO name**
9. Enter **Customize login button** text
10. Configure **Auto assign reader group** and **Sign out idle SSO team account** toggles
11. Invite users via **Convert existing team and reader accounts to SSO**
12. Click **Create**

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/9_Screenshot-Okta_document360_configuration_save.png)

SSO configuration complete.

<a id="saml-sso-with-entra"></a>

## SAML SSO with Entra

**Plans supporting SSO**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Configure Document360 **SAML Single Sign-On** with **Microsoft Entra**.

> PRO TIP
> 
> Open Document360 and Entra in separate tabs for easier configuration switching.

---

## Add Azure application

### Access Azure AD portal

1. Log in to Microsoft Azure account
2. Click **Portal** (top-right)
3. Redirected to Azure portal (<https://portal.azure.com/#home>)

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/Image_2-ScreenGIF-Azure_Active_Directory_Portal_access.gif)

### Add application

1. Click **+ New application**
2. Select **Non-gallery application**
3. Enter application name
4. Click **Add**
5. In **Getting started** section > Select **Set up single on**
6. Choose **SAML** option
7. Refer to [**Azure AD configuration guide**](https://docs.microsoft.com/en-us/azure/active-directory/manage-apps/add-application-portal-setup-sso) for detailed walkthrough

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/Image_3-ScreenGIF-Azure_Active_Directory_adding_new_application.gif)

---

## Configure SAML in Entra

1. Open Document360 in separate tab
2. Navigate to **Settings** > **Users & security** > **SAML/OpenID**
3. Click **Create SSO**

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/5_Screenshot-Settings_create_sso(2).png)

4. Select **Entra ID** as Identity Provider

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/8_Screenshot-Choose_idp_entra.png)

5. **Configure the Service Provider (SP)** page shows required parameters

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_Screenshot-Configure_sp_saml_generic.png)

**Mapping:**

| Azure AD fields | Document360 portal |
| --- | --- |
| Identifier (Entity ID) | Service provider entity id |
| Reply URL (Assertion Consumer Service URL) | Callback path |
| Sign on URL | https://identity.document360.io |
| Logout URL | Signed out callback path |

6. Copy parameters from Document360
7. In Azure AD **Set up Sign-On with SAML** page > Click **Edit** icon
8. Paste data in corresponding fields
9. Click **Save**

![Azure AD SAML configurations](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/Image_4-Screenshot-Azure_AD_SAML_configurations.jpg)

---

## Document360 configuration

1. Return to Document360 **Configure the Service Provider (SP)** page
2. Click **Next** to **Configure the Identity Provider (IdP)** page
3. Enter Azure AD parameters:

| Document360 portal fields | Azure AD portal values |
| --- | --- |
| Sign On URL | Login URL |
| Entity ID | Azure AD identifier |
| Sign Out URL | Logout URL |
| SAML Certificate | Download Certificate (Base64) from Azure AD and upload |

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_Screenshot-Configure_idp_saml_generic.png)

4. Toggle **Allow IdP initiated sign in** per requirements
5. Click **Next** to **More settings** page

---

## More settings

Configure:

* **SSO name** - Configuration identifier
* **Customize login button** - User-facing button text
* **Auto assign reader group** - Toggle as needed
* **Sign out idle SSO team account** - Toggle per requirements
* **Convert existing team and reader accounts to SSO** - Choose invite method

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/10_Screenshot-Create_SSO_more_settings_generic(2).png)

6. Click **Create**

---

## Additional Azure AD settings

1. Edit **User Attributes & Claims** section
2. **Add new claim** or **Add group claim**
3. In **SAML signing certificate** section:
   * Add **New certificates**
   * **Import certificates**
4. Add multiple notification email addresses
5. Click **Test** option
6. Log in to Document360 with registered user credentials

<a id="google-sso-saml-configuration"></a>

## SAML SSO with Google

**Plans supporting SSO**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Configure **Google SAML Single Sign-On** with **Google Workspace**.

> PRO TIP
> 
> Open Document360 and Google Workspace in separate tabs for easier configuration switching.

---

## Add Google SAML app

1. In admin console > Click **Apps** > Select **SAML apps**
2. Click **Add app** > Select **Add custom SAML app**
3. Enter app name in **App details**
4. Click **Continue**
5. Note **SSO URL**, **Entity ID**, and **Certificate** details
6. In Certificate section > Click Download icon to save certificate (.pem format)
7. Upload this certificate later in Document360 **Configure the Identity Provider (IdP)** page

![Google certificate](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/41_Screenshot-Google-user-access-service-status.jpg)

8. In **User access** > Change **Service status** from **OFF for everyone** to **ON for everyone**

![Google service status](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/42_Screenshot-Google-user-access-changing-service-status.jpg)

---

## Service Provider configuration

Get Document360 SP details:

1. Navigate to **Settings** > **Users & Security** > **SAML/OpenID**
2. Click **Create SSO**

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/5_Screenshot-Settings_create_sso(2).png)

3. Select **Google** as Identity Provider

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/9_Screenshot-Choose_idp_google.png)

4. From **Configure the Service Provider (SP)** page > Copy parameters:

| Google custom SAML app | Document360 SSO SAML settings |
| --- | --- |
| ACS URL | Callback path |
| Entity ID | Service provider entity Id |
| Start URL (optional) |  |

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_Screenshot-Configure_sp_saml_generic.png)

5. Switch to Google Workspace tab > Paste parameters
6. In **Name ID format** > Select **EMAIL**
7. In **Name ID** > Select **Basic Information > Primary email**
8. Click **Continue**

---

## Attributes mapping

Map Google Directory attributes to app attributes:

| Google Directory attributes | App attributes |
| --- | --- |
| Primary email | name |
| Primary email | email |
| Primary email | urn:oasis:names:tc:SAML:2.0:nameid |

Click **Add Mapping** for each attribute > Click **Finish**

---

## Identity Provider configuration

1. Return to Document360 **Configure the Service Provider (SP)** page
2. Click **Next** to **Configure the Identity Provider (IdP)** page
3. Enter Google parameters:

| Document360 SSO settings | Info from Google custom SAML app |
| --- | --- |
| Sign on URL | SSO URL |
| Entity id | Entity ID |
| Sign Out URL (Optional) | NA |
| SAML Certificate | Upload recent .pem file downloaded from Google |

4. Toggle **Allow IdP initiated sign in** per requirements

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/8_Screenshot-Okta_document360_configuration.png)

5. Click **Next** to **More settings** page
6. Enter **SSO name**
7. Enter **Customize login button** text
8. Configure **Auto assign reader group** and **Sign out idle SSO team account** toggles
9. Invite users via **Convert existing team and reader accounts to SSO**
10. Click **Create**

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Create_SSO_more_settings_generic.png)

SSO configuration complete.

<a id="saml-sso-with-onelogin"></a>

## SAML SSO with OneLogin

**Plans supporting SSO**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Configure Document360 SSO using OneLogin as Identity Provider.

> PRO TIP
> 
> Open Document360 and OneLogin in separate tabs for easier configuration switching.

---

## Add OneLogin application

1. Log in to OneLogin Admin Portal
2. Select **Applications** (top menu)
3. Click **Add App**
4. Search "SAML" > Select **SAML Custom Connector (Advanced)**
5. Name application (e.g., "Document360 SSO")
6. Click **Save**

---

## Configure SAML in OneLogin

1. Open Document360 in separate tab
2. Navigate to **Settings** > **Users & security** > **SAML/OpenID**
3. Click **Create SSO**

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/5_Screenshot-Settings_create_sso(2).png)

4. Select **OneLogin** as Identity Provider

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/7_Screenshot-Choose_idp_onelogin.png)

5. **Configure the Service Provider (SP)** page shows required parameters

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_Screenshot-Configure_sp_saml_generic.png)

6. Switch to OneLogin tab > Navigate to **Configuration** tab
7. Enter Document360 parameters:

| OneLogin | Document360 |
| --- | --- |
| Audience (EntityID) | Service provider entity id |
| Recipient | Callback path |
| ACS (Consumer) URL Validator | Callback path |
| ACS (Consumer) URL | Callback path |

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Configuration_tab.png)

8. Click **Save**
9. Navigate to **Parameters** tab > Click + icon
10. Configure parameters:

| Field Name | Value |
| --- | --- |
| urn:oasis:names:tc:SAML:2.0:nameid | Email |
| email | Email |
| name | Email |

> NOTE
> 
> Check **Include in SAML assertion** for each parameter

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-Parameters_tab.png)

11. Click **Save**
12. Navigate to **SSO** tab > Click **View Details**
13. Download **X.509 Certificate**
14. Copy **Issuer URL** and **SAML 2.0 Endpoint (HTTP)**

> NOTE
> 
> Select **SHA256** from **SHA fingerprint** dropdown
> Select download format as **X.509.PEM**

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_Screenshot-SSO_tab.png)

---

## Document360 configuration

1. Return to Document360 **Configure the Service Provider (SP)** page
2. Click **Next** to **Configure the Identity Provider (IdP)** page
3. Enter parameters:

| **Identity Provider** | **Document360** |
| --- | --- |
| Issuer URL | Entity id |
| SAML 2.0 Endpoint (HTTP) | Sign on URL |
| Downloaded SAML Certificate (X.509) | SAML Certificate |

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_Screenshot-Configure_idp_saml_generic.png)

4. Toggle **Allow IdP initiated sign in** per requirements
5. Click **Next** to **More settings** page

---

## More settings

Configure:

* **SSO name** - Configuration identifier
* **Customize login button** - User-facing button text
* **Auto assign reader group** - Toggle as needed
* **Sign out idle SSO team account** - Toggle per requirements
* **Convert existing team and reader accounts to SSO** - Choose invite method

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/10_Screenshot-Create_SSO_more_settings_generic(2).png)

6. Click **Create**

<a id="saml-sso-with-adfs"></a>

## SAML SSO with ADFS

**Plans supporting SSO**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Configure Document360 SSO with ADFS using SAML protocol.

> PRO TIP
> 
> Open Document360 and ADFS in separate tabs for easier configuration switching.

---

## Add ADFS application

1. Log in to ADFS Management console
2. Navigate to **Relying Party Trusts**
3. Right-click > Select **Add Relying Party Trust**
4. Choose **Claims aware** > Click **Start**
5. Select **Enter data about the relying party manually** > Click **Next**
6. Provide display name (e.g., "Document360 SAML SSO") > Click **Next**
7. **Configure Certificate** step > Click **Next** (skip if not using certificate)
8. Under **Configure URL** > Select **Enable support for the SAML 2.0 WebSSO protocol**

---

## Document360 Service Provider configuration

1. Open Document360 in separate tab
2. Navigate to **Settings** > **Users & security** > **SAML/OpenID**
3. Click **Create SSO**

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/5_Screenshot-Settings_create_sso(2).png)

4. Select **ADFS** as Identity Provider

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/9_Screenshot-Choose_idp_adfs(1).png)

5. Choose **SAML** protocol on **Configure the Service Provider (SP)** page
6. Note parameters:

* **Subdomain name** - Unique Document360 instance identifier
* **Callback path** - Post-sign-in redirect URI
* **Signed out callback path** - Post-sign-out redirect URI
* **Metadata path** - SAML metadata URL
* **Service provider entity ID** - Document360 service provider identifier

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_Screenshot-Configure_sp_saml_generic.png)

7. Enter parameters in ADFS:

* **Relying Party Identifier** - Use Document360 **Service provider entity ID**
* **Sign-On URL** - Enter Document360 **Callback path**
* **Sign-Out URL** - Enter Document360 **Signed out callback path**
* **Relying Party Trust Identifier** - Use Document360 **Subdomain name**
* **Metadata URL** - Enter Document360 **Metadata path**

8. Click **Next** > Complete wizard steps
9. Review settings > Click **Next** to add relying party trust
10. Check **Open the Edit Claim Rules dialog** > Click **Close**

---

## Configure Claim Rules

1. In **Edit Claim Rules** dialog > Click **Add Rule**
2. Select **Send LDAP Attributes as Claims** > Click **Next**
3. Name claim rule (e.g., "Send LDAP Attributes")
4. Configure:

* **Attribute Store** - Select **Active Directory**
* **Mapping**:
  + **LDAP Attribute**: User-Principal-Name | **Outgoing Claim Type**: Name ID
  + **LDAP Attribute**: E-Mail-Addresses | **Outgoing Claim Type**: Email
  + **LDAP Attribute**: Display-Name | **Outgoing Claim Type**: Name

5. Click **Finish** > **Apply** > Close dialog

---

## Document360 SAML configuration

1. Return to Document360 **Configure the Service Provider (SP)** page
2. Click **Next** to **Configure the Identity Provider (IdP)** page
3. Enter ADFS parameters:

| **ADFS** | **Document360** |
| --- | --- |
| SAML Sign-On URL | Identity Provider Single Sign-On URL |
| Identifier (Entity ID) | Identity Provider Issuer |
| X.509 Certificate | SAML Certificate |

4. Download X.509 Certificate from ADFS
5. Upload to Document360 **SAML Certificate** field
6. Toggle **Allow IdP initiated sign in** per requirements

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_Screenshot-Configure_idp_saml_generic.png)

7. Click **Next** to **More settings** page

---

## More settings

Configure:

* **SSO name** - Configuration identifier
* **Customize login button** - User-facing button text
* **Auto assign reader group** - Toggle as needed
* **Sign out idle SSO team account** - Toggle per requirements

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/10_Screenshot-Create_SSO_more_settings_generic(2).png)

8. Click **Create**

<a id="saml-sso-with-other-configurations"></a>

## SAML SSO with other configurations

**Plans supporting SSO**

| Professional | Business | Enterprise |
| --- | --- | --- |
|  |  |  |

Configure Document360 SSO with any unsupported Identity Provider.

> PRO TIP
> 
> Open Document360 and IdP in separate tabs for easier configuration switching.

---

## Add IdP application

1. Log in to IdP admin console
2. Locate application management section (typically **Applications** or **Enterprise Applications**)
3. Select option to create new application
4. Configure basic settings:

* **Application Name** - e.g., "Document360 SSO"
* **Application Type** - Select **SAML 2.0** sign-in method

5. Save application settings

Continue with standard SAML configuration process using Document360 parameters.## Configure IdP SAML settings

Next, configure SAML in your Identity Provider using Document360 parameters:

1. Open Document360 in a separate tab
2. Navigate to **Settings > Users & security > SAML/OpenID**
3. Click **Create SSO**

![Create SSO button](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/5_Screenshot-Settings_create_sso(2).png)

4. Select **Others** as your Identity Provider to automatically navigate to the **Configure the Service Provider (SP)** page

![Choose Others IdP](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/6_Screenshot-Choose_idp_others(1).png)

5. On the **Configure the Service Provider (SP)** page, find the parameters needed for your IdP SAML configuration:

In your Identity Provider's SAML configuration, enter:

* **Single Sign-On URL** - Use the **Callback path** from Document360
* **Entity ID** - Use the **Service provider entity ID** from Document360  
* **Audience URI** - Typically the **Service provider entity ID** or **Single Sign-On URL** from Document360

![SP configuration parameters](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_Screenshot-Configure_sp_saml_generic.png)

### Attribute mapping

Configure attribute statements in your IdP:

| Attribute Name | Value |
| --- | --- |
| NameID | user.email or user ID |
| email | user.email |
| name | user.name |

Case sensitivity may matter depending on your IdP.

### Additional IdP requirements

Some Identity Providers require extra configuration details. Review and save your SAML settings in the IdP before proceeding.

## Document360 SSO setup

Complete the SSO configuration in Document360:

1. Return to Document360 and click **Next** on the **Configure the Service Provider (SP)** page
2. Enter values from your Identity Provider on the **Configure the Identity Provider (IdP)** page:

| Document360 Field | Identity Provider Value |
| --- | --- |
| Single Sign-On URL | Identity Provider Single Sign-On URL |
| Entity ID | Identity Provider Issuer |
| SAML Certificate (X.509) | SAML Certificate |

3. Download the X.509 Certificate from your IdP and upload it to Document360
4. Toggle **Allow IdP initiated sign in** based on project requirements

![IdP configuration](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_Screenshot-Configure_idp_saml_generic.png)

5. Click **Next** to proceed to **More settings**

### More settings configuration

Configure these final options:

* **SSO name** - Name for this SSO configuration
* **Customize login button** - Text displayed on login button
* **Auto assign reader group** - Toggle as needed
* **Sign out idle SSO team account** - Toggle based on requirements
* Choose whether to invite existing team and reader accounts to SSO

![More settings page](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/10_Screenshot-Create_SSO_more_settings_generic(2).png)

6. Click **Create** to complete SSO setup

Your SSO configuration is now active using your selected Identity Provider.## Add-ons

Document360 offers various add-ons to extend your plan's capabilities. These can be purchased at any time to enhance specific features or increase limits.

### Available add-ons

| Add-on | Description | Available in plans |
| --- | --- | --- |
| **Additional projects** | Create more knowledge base projects beyond your plan's default limit | Professional, Business, Enterprise |
| **Additional workspaces** | Add extra workspaces to organize content better | Professional, Business, Enterprise |
| **Additional languages** | Increase the number of languages supported | Professional, Business, Enterprise |
| **Translation credits** | Purchase additional machine translation characters (1 million per credit) | Professional, Business, Enterprise |
| **Additional storage** | Extend your Drive storage capacity | Professional, Business, Enterprise |
| **Additional team accounts** | Add more team members beyond your plan's default limit | Professional, Business, Enterprise |
| **Additional reader accounts** | Increase the number of reader accounts | Professional, Business, Enterprise |

### Purchasing add-ons

1. Navigate to **Settings** () > **Knowledge base portal** > **Billing**
2. In the **My plan** tab, click **Purchase add-on**
3. Select the desired add-on from the list
4. Choose the quantity you need
5. Click **Add to cart** and complete the checkout process

> NOTE
>
> Add-ons are billed separately from your main subscription and may have different billing cycles. Check your invoice for details.

### Managing add-ons

From the **Billing** page, you can view your current add-ons under the **My plan** tab. Add-ons can be modified or removed at any time:

* To **modify** an add-on: Click the **•••** menu next to the add-on and select **Edit**
* To **remove** an add-on: Click the **•••** menu next to the add-on and select **Remove**

> WARNING
>
> Removing add-ons may affect your knowledge base functionality if you're using features that exceed your base plan limits.## Purchasing add-ons

### Available add-ons by plan

Document360 scales with your projects through add-ons that enhance documentation capabilities. The **Professional**, **Business**, and **Enterprise** plans support:

* **Workspaces**
* **Languages**
* **Translation credits (1 million characters)**
* **Storage (1 unit = 50 GB)**
* **Team accounts**
* **Readers (1 unit = 5000 readers)**
* **PDF export limit (1 unit = 2GB)**

**Business** plan users can also purchase:

* **Crowdin extension**
* **Phrase extension**

**Enterprise** plan users gain access to:

* **Salesforce extension**
* **Additional sandbox environment**

These add-ons provide flexibility in knowledge base configuration.

> NOTE
>
> To purchase add-ons, save a card in your Document360 account. Add a card via **Settings ()** > **Knowledge base portal** > **Billing** > **Payment information** tab.

---

### Purchasing add-ons

To purchase add-ons:

1. From the knowledge base portal, go to **Settings ()** > **Knowledge base portal** > **Billing**

![Billing page](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/6_Screenshot-Billing_page_purchase_addon_button.png)

2. In the **My plan** tab, click **Purchase add-on**

![Purchase add-ons](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/7_Screenshot-Billing_page_purchase_addon_details.png)

3. Select required add-ons using + and - buttons
4. Click **Confirm payment**

> NOTE
>
> Legacy plan customers can only purchase: Projects, Workspaces, Languages, Translation Credits, Storage, Team Accounts, and Readers. Online customers access this feature directly; offline customers contact support.

<a id="upgrading-from-trial-version"></a>

## Upgrading from trial version

Document360 provides a 14-day trial period with full access to all plan features. Switch between plans during trial to evaluate capabilities. Upgrade anytime during or after trial.

> NOTE
>
> Only project **Owner(s)** can access **Billing** features.

---

## Changing your plan during the trial period

Switch plans during the 14-day trial to explore different tiers. Start with **Enterprise** to test advanced features, then switch to lower-tier plans to understand cost-effective options. All changes are free during trial.

From the Knowledge base portal, navigate to **Settings ()** > **Knowledge base portal** > **Billing**. View current plan, remaining trial time, and feature summaries.

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/2_Screenshot-Trial_plan_billing_screen.png)

To change plans during trial:

1. Click the dropdown on the **TRIAL ENDS IN N DAYS** button
2. Select **Try other plans** to open the **Change plan** page
3. Click **Try now** under the desired plan

> NOTE
>
> Selecting a lower-tier plan shows features you'll lose access to.

4. If moving to:
   * **Lower tier**: Check the box to proceed with downgrading and deleting unavailable configurations, then click **Change plan**
   * **Higher tier**: Receive success message after upgrade

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_GIF-Trial_plan_try_other_plans.gif)

> NOTE
>
> From the dropdown, you can also:
> * Click **Buy now** to subscribe
> * Click **Book a demo** to schedule demonstration
> * Click **Chat with us** to contact support

---

## Subscribing to a Document360 plan

To subscribe during or after trial:

1. From the Knowledge base portal, go to **Settings ()** > **Knowledge base portal** > **Billing**
   
   View plan features and remaining trial days.

2. Click **Buy now** to access the **Upgrade** page. See available plans and costs. Scroll to **Compare plans & features** for detailed feature lists.

3. Select preferred plan and click **Let's talk**

![](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_GIF-Trial_plan_buy_plans.gif)

Document360 sales will contact you to complete the subscription.

## FAQs

**What features are available during the trial period?**

Full access to all Document360 features and plans.

**Will I lose my data if I downgrade during the trial?**

No data loss, but features and limits (workspaces, readers, storage) adjust to the lower plan.

**Can I extend my trial period?**

Possibly. Contact support to discuss extension options.

**What happens when my trial ends?**

Subscribe to continue using features. Without subscription, projects pause then delete automatically. You'll receive warnings before deletion.

**Are there limitations during trial compared to paid plans?**

No. Trial provides identical access to paid plans.

**What if I need help during trial?**

Use chat, book a demo, or contact support directly.

**Will I be charged automatically after trial?**

No. Manual subscription required before trial expires.

**Does pricing vary by currency?**

Yes. Select currency to view local pricing.

**Does pricing change with exchange rates?**

Pricing remains fixed. Changes occur only during scheduled updates, with advance notification via email.

<a id="changing-payment-information"></a>

## Changing payment information

## How to change payment information

![1_Screenshot-changing_the_payment_information](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/Payment information - new.png)

NOTE

Only team accounts with owner access can modify billing settings.

1. From the Knowledge base portal, go to **Settings** > **Billing**
2. Navigate to **Payment information** tab (My plan opens by default)
3. Below **Credit card** tile, change payment method and billing address
   
   View primary card details.

4. Click **Add another card** to include secondary payment method

NOTE

Primary card handles billing. If primary card fails, secondary card processes renewal.

---

## FAQs

**How can I delete my primary payment card?**

Cannot delete primary card. Can edit card details. Secondary cards can be edited or deleted.

**How can I delete my secondary card?**

1. Go to **Settings** > **Billing** > **Payment information**
2. Hover over secondary card
3. Click **Delete** icon, then confirm in popup

**How can I set secondary card as primary?**

1. Go to **Settings** > **Billing** > **Payment information**
2. Hover over secondary card
3. Select **Set as primary** radio button
4. Click **Make Primary** in confirmation popup

**How do I edit my primary card?**

1. Go to **Settings** > **Billing** > **Payment information**
2. Hover over primary card
3. Click **Edit** icon to update details
4. Click **Update** to save changes

The knowledge base portal where project members manage and create content. Users create categories, articles, and templates; manage files, team accounts, and readers; configure branding, domain, and security settings.

<a id="february-2025-1112"></a>## March 2022

---

## Enhancements

### 1. Image formatting in Advanced WYSIWYG editor

In the Advanced WYSIWYG editor, you can now specify image dimensions using percentages for both width and height.

![7_Screenshot-UpdatedImage_percentage](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/7_Screenshot-%28Updated%29Image_percentage.png)

---

## Improvements

Minor security updates, bug fixes, and performance improvements were implemented in both the Knowledge base portal and Knowledge base site.

Application Programming Interface - A set of rules that allows one software application to communicate with another.

<a id="february-2024"></a>

## February 2024

Document360 released another monthly update in February 2024. Here are the enhancements and improvements made to the Document360 knowledge base.## New features

### 1. Shared articles

This feature was added to Document360 based on popular customer requests. The **Shared article** feature lets you display one article in multiple categories. Shared articles are termed as **References**.

* Use the ••• **More option** next to the article, select **Also display in**, choose the category/subcategory, and click **Share**. You can choose multiple categories when sharing an article.  
  ![1_Screenshot-Accessing_also_display_in_method_1](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-Accessing_also_display_in_method_1.png)
* The shared article feature can also be accessed when creating a new article. Select **Link existing** in the **Add article** module. Select an article from the **Select article** search bar, and click **Create**.

![8_Screenshot-Add_article_module_Link_existing](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/8_Screenshot-Add_article_module_Link_existing.png)

The article appears as a reference in the selected category/subcategory and is identified by a shared icon.

#### Original article & Referenced article

* The original article serves as the primary copy. All content and setting changes reflect across all shared copies (references).
* Click the **View references** icon on the right in the editor to see linked instances.
* You can navigate to the shared article or remove the reference (stop sharing) in the selected category
* Referenced articles cannot be edited. Except for the article slug, all other elements link to the original article.

![6_Screenshot-Shared_article_POV](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/6_Screenshot-Shared_article_POV.png)

[**Read more →**](/v3/docs/shared-articles)

### 2. Cloning articles

Create a **clone article** from an existing article in your project's version and language.

Select **Copy existing** in the **Add article** module. Select an article from the **Select article** search bar, edit the title, and click **Create**.

![7_Screenshot-Add_article_module_Copy_existing](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/7_Screenshot-Add_article_module_Copy_existing.png)

Your clone article appears in the respective category/subcategory with a new article indicator (light-blue dot) showing it hasn't been published.

[**Read more →**](/v3/docs/creating-an-article)

---

## Enhancements

### 1. Intercom extension

Two notable enhancements to the Intercom extension:

* When sharing an article link in chat, customers can open and read Document360 articles within their messenger window. Previously, articles opened in the knowledge base site
* Create articles from Intercom. They appear as drafts in the selected category

[**Read more →**](/v3/docs/intercom-integration)

### 2. Internal links in new versions

When creating a new version using an existing version as base, you can choose how internal article links behave:

![14_Screenshot-Internal_links_in_new_version](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/14_Screenshot-Internal_links_in_new_version.png)

* **New** (default): Internal links point to the new version's articles

  > **Example**: */****v2****/docs/Installation* becomes */****v3****/docs/Installation*

* **Existing**: Internal links continue pointing to the base version's articles

[**Read more →**](/v3/docs/getting-started-with-project-version)

### 3. Knowledge base assistant

You can now add category pages and category indexes in **Single** and **List** actions for URL mapping in the Knowledge base assistant. Previously, only articles could be added. This allows categories to appear in your knowledge base assistant.

[**Read more →**](/v3/docs/url-mapping)

### 4. Analytics

* Category page and index analytics now appear under **Leading categories** in **Performance** analytics. Identify them with the **View in knowledge base** icon
* Category page link validation was introduced in this release
* Category pages now appear in **Team accounts** analytics under **Most viewed articles** and **Articles created** sections. Identify them with the folder icon
* A new **Feedback status** column was added to the **Feedback** page. Shows a percentage bar comparing **likes** (green) to **dislikes** (red)

[**Read more →**](/v3/docs/analytics)

### 5. Users & Security

* Bulk selection is now available when adding team accounts or readers to groups. Previously, accounts had to be added individually
* For new or invited SSO team accounts and readers (including regular Document360 users), you can now view who invited them and when. Check the **Team accounts** or **Readers** page in **Users & Security**

[**Read more →**](/v3/docs/users-and-security)

---

## Improvements

### UI/UX improvements

* The **Add article** module was redesigned to support clone and shared article features
* Two new fields were added to the **mobile sign up** page: subdomain and project access type (Public/Private/Mixed)
* Category pages now support likes, dislikes, and feedback options, matching article functionality

### Other improvements

* Project version name limit increased from 20 to **30 characters**
* **Previous** and **Next** buttons at article bottom can now be localized in selected languages *(Settings → Localization & versions → Localization variables → Article bottom)*
* In the **Home page builder** header section, you can now add article slugs in Custom URL selection
* Minor performance, bug fixes, and security improvements were made to the knowledge base portal and site

<a id="march-2022-release-note"></a>

## March 2022

Document360 released its monthly update in March 2022. Here are the enhancements and improvements made to the Document360 knowledge base.## April 2021

Document360 released its monthly update in April 2021 with several new features and enhancements. Key additions include article templates, updated category management, and a new Salesforce extension. Other improvements cover team account imports, automatic article status indicators, Enterprise SSO binding types, and performance optimizations.

---

## New features

### Article templates

Create articles from predefined templates for consistent formatting across your knowledge base. Templates can be used for user guides, FAQs, release notes, or any custom format you define.

Access templates through the **Templates** option at the bottom of the category manager.

[**Read more →**](https://docs.document360.com/docs/article-templates)

### Category types

Categories now support three distinct types beyond the basic folder structure:

1. **Folder**: Simple container for articles and sub-categories
2. **Index**: Displays all articles within the folder with preview excerpts
3. **Page**: Functions like a standard article

Select category types during creation or modify existing categories. The category manager UI has also been updated with a new Templates option in the left navigation pane.

[**Read more →**](https://docs.document360.com/docs/category-types)

---

## New Extensions

### Salesforce

Integrate Document360 directly with Salesforce to enhance support agent productivity. Search, share, and create knowledge base articles without leaving the Salesforce platform.

[**Read more →**](https://docs.document360.com/docs/salesforce)

---

## New Integrations

Four new integrations were added:

|  | Integration | Type | Description |
| --- | --- | --- | --- |
| 1 | **Belco** | Chat | Live chat and messaging for website visitors |
| 2 | **Gorgios** | Chat | Multi-channel customer communication platform |
| 3 | **FullStory** | Analytics | Customer experience optimization and problem solving |
| 4 | **Sunshine Conversations** | Chat | Cross-platform messaging for businesses |

[**Read more →**](https://docs.document360.com/docs/integrations-getting-started)

---

## Enhancements

### Import team accounts

Import team accounts from local CSV files, similar to reader account imports. Use the standard template available in the portal.

### Article attachments from external sources

Add article attachments via external URLs instead of being limited to Document360 Drive files.

### Automatic article status indication

Set automatic status indicators (New/Updated) for initial or forked article publishes. Configure this feature at *(Settings → Knowledge base site → Article settings & SEO → Category manager)*.

Default period is 30 days, adjustable between 1-90 days.

### Table of contents in PDF exports

PDF exports now include a table of contents with navigation links based on your category structure.

---

## Improvements

* Overall performance improved with reduced load times
* Link status feature enhanced with hidden article filtering
* Added HttpPost and HttpRedirect binding types for Enterprise SSO SAML configuration
* 'What's new' feature now supported on sub-folder hosted projects with security fixes
* Latest changes option moved from profile section to top right of portal

<a id="march-2021-release-note"></a>

## March 2021

Document360 March 2021 updates focused on knowledge base design improvements and security enhancements. Key changes include external URL support for logos and favicons, SSO login updates, and fixes for the recently released 'What's new' feature.

---

## Enhancements

### Knowledge base site design

Add logos and favicons from external URLs. Choose indent levels (small/medium) in fluid layout. Combined with February's font selection options, these updates make knowledge base design more flexible.

### 'What's new' security update

Fixed a security issue where readers could access the 'What's new' page through bookmarked URLs even when the feature was disabled. Now access is properly restricted based on portal settings *(Settings → Knowledge base site → Article Settings & SEO → Document header)*.

---

## Improvements

* Project creation performance optimized
* File replace functionality now supports Draw.io format files

<a id="february-2021-release-note"></a>

## February 2021

February 2021 brought the File replace feature to Document360 Drive, allowing easier file updates in documentation. Additional improvements covered UI/UX refinements and knowledge base font customization options.

---

## New Features

### File replace

Replace existing files in Drive with the same extension and filename. Useful for updating article assets without breaking links.

Access through the **more options** menu (•••) next to any file, or by selecting the file and clicking **File replace** in the right panel.

[**Read more →**](https://docs.document360.com/docs/file-replace)

---

## Improvements

* SSO user handling improved in public [**API Documentation**](https://apidocs.document360.com/docs/get-users) under Teams
* Reorder project versions for reader display through drag-and-drop *(Settings → Project Admin → Localization & versions)*
* Customize **Body** and **heading fonts** in Knowledge base design settings *(Settings → Knowledge base site → Design)*
* Control individual social media sharing options for articles
* Analytics **Overview** renamed to **Geography**<a id="document360-support-generating-a-har-file"></a>

## Generating a HAR file

### What is an HAR file?

An **HAR** (HTTP Archive) file is a JSON-formatted log of a web browser's interaction with a web page. It records requests and responses, cookies, timings, and other metadata related to page loading and rendering.

> Document360 uses HAR files for debugging and performance analysis—they provide a detailed record of browser interactions with your project.

### How to generate a HAR file?

Most modern browsers can generate HAR files through their developer tools.

---

## Generate HAR files in web browsers

Follow these steps to generate a HAR file for troubleshooting Document360 issues:

1. Google Chrome
2. Mozilla Firefox
3. Microsoft Edge
4. Safari
5. Opera

The steps are generally similar across browsers, with minor UI differences.

### Google Chrome

1. Open Chrome and go to [**portal.document360.io**](https://portal.document360.io/)
2. Select your Document360 project
3. Click **Chrome menu** (three dots) > **More Tools** > **Developer Tools**
4. Click the **Network** tab
5. Check **Preserve log** to prevent clearing network activity during navigation
6. Ensure recording is active (look for a red dot; click Record icon if needed)
7. Reproduce the issue
8. Stop recording with **Ctrl+E** or by clicking the red dot again
9. Right-click in the network table and select **Save all as HAR with content**
10. Save the file to your local storage

### Mozilla Firefox

1. Open Firefox and go to [**portal.document360.io**](https://portal.document360.io/)
2. Select your Document360 project
3. Click **Firefox menu** (three lines) > **Web Developer** > **Network**
4. Click **Persist Logs** to keep network data during navigation
5. Select the **All** tab to capture all network activity
6. Verify recording is active (red dot; click Record icon if needed)
7. Reproduce the issue
8. Stop recording with **Ctrl+E** or by clicking the red dot
9. Right-click network requests and select **Save All As HAR**
10. Save the file to your local storage

### Microsoft Edge

1. Open Edge and go to [**portal.document360.io**](https://portal.document360.io/)
2. Select your Document360 project
3. Click **Edge menu** (three dots) > **More Tools** > **Developer Tools**
4. Click the **Network** tab
5. Check **Preserve log** to maintain network data during navigation
6. Confirm recording is active (red dot; click Record icon if needed)
7. Reproduce the issue
8. Stop recording by clicking the red dot
9. Right-click network requests and select **Save all as HAR with content**
10. Save the file to your local storage

### Safari

1. Open Safari and go to [**portal.document360.io**](https://portal.document360.io/)
2. Select your Document360 project
3. Enable **Develop** menu: **Safari** > **Preferences** > **Advanced** > **Show Develop menu in menu bar**
4. From **Develop** menu, select **Show Web Inspector**
5. Click the **Network** tab
6. Check **Preserve log** to prevent clearing network activity
7. Verify recording is active (red dot; click Record icon if needed)
8. Reproduce the issue
9. Stop recording by clicking the red dot
10. Right-click network requests and select **Export HAR**
11. Save the file to your local storage

### Opera

1. Open Opera and go to [**portal.document360.io**](https://portal.document360.io/)
2. Select your Document360 project
3. Click **Opera menu** (three lines) > **Developer** > **Developer Tools**
4. Click the **Network** tab
5. Check **Preserve log** to maintain network data during navigation
6. Confirm recording is active (red dot; click Record icon if needed)
7. Reproduce the issue
8. Stop recording by clicking the red dot
9. Right-click network requests and select **Save as HAR with Content**
10. Save the file to your local storage

Share the generated HAR file with Document360 support for faster issue resolution.
</document_content>
</document>

<document index="29">
<source>docs/document360_core.json</source>
<document_content>
{"openapi":"3.0.1","info":{"title":"Document360 Customer API","description":"Document360 RESTful APIs will allow you to integrate your documentation with your software, allowing you to easily onboard new users, manage your articles and more. \n\nYou can find detailed API documentation here : [API Documentation](https://apidocs.document360.io/docs)","contact":{"name":"Document360 Support","url":"https://document360.io/contact-us/","email":"support@document360.com"},"version":"2.0"},"servers":[{"url":"https://apihub.document360.io","description":"Document 360 API Hub"},{"url":"https://apihub.us.document360.io","description":"Document360 API Hub - US data center"},{"url":"https://apihub.{private_hosting}.document360.io","description":"Private hosting - Please provide the subdomain name.","variables":{"private_hosting":{"default":"domain","description":"Sub domain for private hosting"}}}],"paths":{"/v2/Articles/{articleId}":{"delete":{"tags":["Articles"],"summary":"Deletes an article with an ID","parameters":[{"name":"articleId","in":"path","description":"The ID of the article","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Article Deleted Successfully":{"summary":"Article has been successfully deleted. This file cannot be retrived or undo.","value":{"extension_data":null,"success":true,"errors":null,"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Article not found":{"summary":"Kindly verify your articleId and perform the task again. Also verify the langCode (language code) is mismatching.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Article not found","error_code":null,"custom_data":null}],"warnings":[],"information":[]}}}}}}}}},"/v2/Articles/{articleId}/version/{versionNumber}":{"delete":{"tags":["Articles"],"summary":"Deletes an article version","parameters":[{"name":"articleId","in":"path","description":"The ID of the article","required":true,"schema":{"type":"string"}},{"name":"versionNumber","in":"path","description":"Version number of the article","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Article Deleted Successfully":{"summary":"Article has been successfully deleted. This file cannot be retrived or undo.","value":{"extension_data":null,"success":true,"errors":null,"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Article not found":{"summary":"Kindly verify your articleId and perform the task again. Also verify the langCode (language code) is mismatching.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Article not found","error_code":null,"custom_data":null}],"warnings":[],"information":[]}},"Article Version not found":{"summary":"Kindly verify your versionNumber and perform the task again. Also verify the langCode (language code) is mismatching.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Article not found","error_code":null,"custom_data":null}],"warnings":[],"information":[]}}}}}}},"deprecated":true}},"/v2/Articles/{articleId}/{langCode}/version/{versionNumber}":{"delete":{"tags":["Articles"],"summary":"Deletes an article version","parameters":[{"name":"articleId","in":"path","description":"The ID of the article","required":true,"schema":{"type":"string"}},{"name":"versionNumber","in":"path","description":"Version number of the article","required":true,"schema":{"type":"integer","format":"int32"}},{"name":"langCode","in":"path","description":"Language code of the article","required":true,"schema":{"type":"string","default":"en"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Article Deleted Successfully":{"summary":"Article has been successfully deleted. This file cannot be retrived or undo.","value":{"extension_data":null,"success":true,"errors":null,"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Article not found":{"summary":"Kindly verify your articleId and perform the task again. Also verify the langCode (language code) is mismatching.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Article not found","error_code":null,"custom_data":null}],"warnings":[],"information":[]}},"Article Version not found":{"summary":"Kindly verify your versionNumber and perform the task again. Also verify the langCode (language code) is mismatching.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Article not found","error_code":null,"custom_data":null}],"warnings":[],"information":[]}}}}}}}}},"/v2/Articles/bulkdelete-article-versions":{"delete":{"tags":["Articles"],"summary":"Delete multiple article versions","parameters":[{"name":"articleId","in":"query","description":"The ID of the article","required":true,"schema":{"type":"string"}},{"name":"langCode","in":"query","description":"Language code of the article","required":true,"schema":{"type":"string"}},{"name":"articleVersionNumbers","in":"query","description":"Array of article version numbers","required":true,"schema":{"type":"array","items":{"type":"integer","format":"int32"}}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkDeleteArticleVersionResonse"},"examples":{"Articles Deleted Successfully":{"summary":"Article has been successfully deleted. This file cannot be retrived or undo.","value":{"article_id":"00966e87-2f6c-4844-b586-ccc81ddab056","data":"Deleted article version(s) are 1,2,3","extension_data":null,"success":true,"errors":null,"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Article not found":{"summary":"Kindly verify your articleId and perform the task again. Also verify the langCode (language code) is mismatching.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Article not found","error_code":null,"custom_data":null}],"warnings":[],"information":[]}},"Article Version not found":{"summary":"Kindly verify your articleVersion and perform the task again. Also verify the langCode (language code) is mismatching.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Invalid Article Version","error_code":null,"custom_data":null}],"warnings":[],"information":[]}}}}}}}}},"/v2/Articles/bulkdelete":{"delete":{"tags":["Articles"],"summary":"Deletes multiple articles","parameters":[{"name":"articleIds","in":"query","description":"Array of article IDs","required":true,"schema":{"type":"array","items":{"type":"string"}}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkDeleteArticleResponse"},"examples":{"Successfully deleted bulk article":{"summary":"This states that the bulk article has been deleted successfully.","value":{"data":[{"article_id":null,"success":true,"details":"Successfully deleted article with an id 4b10a0b0-7300-4f0d-b2cd-47c619af4047"}],"extension_data":null,"success":true,"errors":[],"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Article Id not found":{"summary":"Kindly verify the article Id and perform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Failed to delete article with an id 4b10a0b0-7300-4f0d-b2cd-47c619af4047\r\nError: Article not found","error_code":null,"custom_data":null}],"warnings":[],"information":[]}}}}}}}}},"/v2/Articles/{articleId}/{langCode}":{"get":{"tags":["Articles"],"summary":"Gets an article","parameters":[{"name":"articleId","in":"path","description":"The ID of the article","required":true,"schema":{"type":"string"}},{"name":"langCode","in":"path","description":"Language code of the article","required":true,"schema":{"type":"string","default":"en"}},{"name":"isForDisplay","in":"query","description":"Set this to true, if you are displaying the article to the end-user. If true, the content of snippets or variables appears in the article. Note: If the value is true, ensure that the article content is not passed for update article endpoints.","schema":{"type":"boolean","default":false}},{"name":"isPublished","in":"query","description":"**true** : You will get the latest published version of the article. (If there are no published versions, then it will return the latest version)            \r\n**false** : To get the the latest version of the article","schema":{"type":"boolean","default":false}},{"name":"appendSASToken","in":"query","description":"Set this to false to exclude appending SAS token for images/files","schema":{"type":"boolean","default":true}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetArticleResponseCustomer"},"examples":{"Sample response":{"summary":"This is the sample response for get-article, You can verify the information regarding the individual article.","value":{"data":{"id":"a1096061-e842-41fd-9085-494095e401b9","title":"Knowledge bases are much easier to design and edit","content":"Have you ever edited a Wikipedia page? You have to break the flow of text to add tags, and when you want to connect two articles together you have to just hope that nobody changes the other article\u2019s name, lest you end up with a rusty red \u201cdead link.\u201dTo be fair,Wikipedia has actually made good strides in making their Wiki software easy to use for anybody, but opening up the editor is still a bit of a shock since you don\u2019t see the familiar webpage you just clicked on. With a knowledge base, what you see is what you get.You don\u2019t have to train anybody on how to add or edit pages because the whole thing is extremely intuitive. Anybody can learn to navigate an edit page in seconds flat.","html_content":null,"category_id":"de104b39-db97-4509-8d4c-deeac74d448b","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","version_number":1,"public_version":1,"latest_version":2,"enable_rtl":false,"hidden":false,"status":0,"order":0,"created_by":"f11efc6f-e968-4e95-82eb-85ad61559de8","authors":[{"id":"f11efc6f-e968-4e95-82eb-85ad61559de8","first_name":"peter","last_name":"jone","user_description":null,"unique_user_name":"peter-jone","email_id":"peterjone@mail.com","profile_logo_url":"https://www.gravatar.com/avatar/FE29D578CBEC3945FC88BF4F10906A3E?sv=2022-11-02&st=2024-06-18T07%3A12%3A34Z&se=2024-06-18T07%3A32%3A34Z&sr=b&sp=r&sig=LEA2ccLr1hMTZkAE48jsdaTYgRr6jNScPQ4x4E3vTss%3D","profile_logo_cdn_url":"https://www.gravatar.com/avatar/FE29D578CBEC3945FC88BF4F10906A3E?sv=2022-11-02&st=2024-06-18T07%3A12%3A34Z&se=2024-06-18T07%3A32%3A34Z&sr=b&sp=r&sig=LEA2ccLr1hMTZkAE48jsdaTYgRr6jNScPQ4x4E3vTss%3D","is_enterprise_user":false}],"created_at":"2024-06-13T14:30:00","modified_at":"2024-06-13T14:30:00","slug":"Knowledge-bases-are-much-easier-to-design-and edit","is_fall_back_content":false,"description":null,"category_type":0,"content_type":null,"is_shared_article":false,"translation_option":0,"url":"https://example.com/v1/docs/en/getting-started"},"extension_data":null,"success":true,"errors":[],"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Article not found":{"summary":"Kindly verify your articleId and perform the task again. Also verify the langCode (language code) is mismatching.","value":{"extension_data":null,"success":true,"errors":[{"extension_data":null,"stack_trace":null,"description":"Article not found","error_code":null,"custom_data":null}],"warnings":[],"information":[]}}}}}}}},"put":{"tags":["Articles"],"summary":"Updates an article with the ID","parameters":[{"name":"articleId","in":"path","description":"The ID of the article","required":true,"schema":{"type":"string"}},{"name":"langCode","in":"path","description":"Language code of the article","required":true,"schema":{"type":"string","default":"en"}}],"requestBody":{"description":"","content":{"application/json-patch+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/UpdateArticleRequest"}]},"examples":{"Update article wth article Id for default language":{"summary":"Update the article with needed information such as title, content, html_content, category_id, hidden, version_number, translation_option for default language,source and order.","value":{"title":"updated article title","content":"Hi this is an API article Sample. This is updated.","html_content":"<p>Hi this is an API article Sample. This is updated.</p>","category_id":"5b291e6b-fa40-4ab9-941e-f8fffc23b376","hidden":true,"version_number":1,"translation_option":"0","source":"uat","order":0}},"Update article wth article Id for article in the state of need translation":{"summary":"Update the article with needed information such as title, content, html_content, category_id, hidden, version_number, translation_option as need translation, source and order.","value":{"title":"updated article title","content":"Hi this is an API article Sample. This is updated.","html_content":"<p>Hi this is an API article Sample. This is updated.</p>","category_id":"5b291e6b-fa40-4ab9-941e-f8fffc23b376","hidden":true,"version_number":1,"translation_option":"1","source":"uat","order":0}},"Update article wth article Id with translation you had made":{"summary":"Update the article with needed information such as title, content, html_content, category_id, hidden, version_number, translation_option as translated, source and order.","value":{"title":"updated article title","content":"Hi this is an API article Sample. This is updated.","html_content":"<p>Hi this is an API article Sample. This is updated.</p>","category_id":"5b291e6b-fa40-4ab9-941e-f8fffc23b376","hidden":true,"version_number":1,"translation_option":"2","source":"uat","order":0}}}},"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/UpdateArticleRequest"}]},"examples":{"Update article wth article Id for default language":{"summary":"Update the article with needed information such as title, content, html_content, category_id, hidden, version_number, translation_option for default language,source and order.","value":{"title":"updated article title","content":"Hi this is an API article Sample. This is updated.","html_content":"<p>Hi this is an API article Sample. This is updated.</p>","category_id":"5b291e6b-fa40-4ab9-941e-f8fffc23b376","hidden":true,"version_number":1,"translation_option":"0","source":"uat","order":0}},"Update article wth article Id for article in the state of need translation":{"summary":"Update the article with needed information such as title, content, html_content, category_id, hidden, version_number, translation_option as need translation, source and order.","value":{"title":"updated article title","content":"Hi this is an API article Sample. This is updated.","html_content":"<p>Hi this is an API article Sample. This is updated.</p>","category_id":"5b291e6b-fa40-4ab9-941e-f8fffc23b376","hidden":true,"version_number":1,"translation_option":"1","source":"uat","order":0}},"Update article wth article Id with translation you had made":{"summary":"Update the article with needed information such as title, content, html_content, category_id, hidden, version_number, translation_option as translated, source and order.","value":{"title":"updated article title","content":"Hi this is an API article Sample. This is updated.","html_content":"<p>Hi this is an API article Sample. This is updated.</p>","category_id":"5b291e6b-fa40-4ab9-941e-f8fffc23b376","hidden":true,"version_number":1,"translation_option":"2","source":"uat","order":0}}}},"text/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/UpdateArticleRequest"}]},"examples":{"Update article wth article Id for default language":{"summary":"Update the article with needed information such as title, content, html_content, category_id, hidden, version_number, translation_option for default language,source and order.","value":{"title":"updated article title","content":"Hi this is an API article Sample. This is updated.","html_content":"<p>Hi this is an API article Sample. This is updated.</p>","category_id":"5b291e6b-fa40-4ab9-941e-f8fffc23b376","hidden":true,"version_number":1,"translation_option":"0","source":"uat","order":0}},"Update article wth article Id for article in the state of need translation":{"summary":"Update the article with needed information such as title, content, html_content, category_id, hidden, version_number, translation_option as need translation, source and order.","value":{"title":"updated article title","content":"Hi this is an API article Sample. This is updated.","html_content":"<p>Hi this is an API article Sample. This is updated.</p>","category_id":"5b291e6b-fa40-4ab9-941e-f8fffc23b376","hidden":true,"version_number":1,"translation_option":"1","source":"uat","order":0}},"Update article wth article Id with translation you had made":{"summary":"Update the article with needed information such as title, content, html_content, category_id, hidden, version_number, translation_option as translated, source and order.","value":{"title":"updated article title","content":"Hi this is an API article Sample. This is updated.","html_content":"<p>Hi this is an API article Sample. This is updated.</p>","category_id":"5b291e6b-fa40-4ab9-941e-f8fffc23b376","hidden":true,"version_number":1,"translation_option":"2","source":"uat","order":0}}}},"application/*+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/UpdateArticleRequest"}]},"examples":{"Update article wth article Id for default language":{"summary":"Update the article with needed information such as title, content, html_content, category_id, hidden, version_number, translation_option for default language,source and order.","value":{"title":"updated article title","content":"Hi this is an API article Sample. This is updated.","html_content":"<p>Hi this is an API article Sample. This is updated.</p>","category_id":"5b291e6b-fa40-4ab9-941e-f8fffc23b376","hidden":true,"version_number":1,"translation_option":"0","source":"uat","order":0}},"Update article wth article Id for article in the state of need translation":{"summary":"Update the article with needed information such as title, content, html_content, category_id, hidden, version_number, translation_option as need translation, source and order.","value":{"title":"updated article title","content":"Hi this is an API article Sample. This is updated.","html_content":"<p>Hi this is an API article Sample. This is updated.</p>","category_id":"5b291e6b-fa40-4ab9-941e-f8fffc23b376","hidden":true,"version_number":1,"translation_option":"1","source":"uat","order":0}},"Update article wth article Id with translation you had made":{"summary":"Update the article with needed information such as title, content, html_content, category_id, hidden, version_number, translation_option as translated, source and order.","value":{"title":"updated article title","content":"Hi this is an API article Sample. This is updated.","html_content":"<p>Hi this is an API article Sample. This is updated.</p>","category_id":"5b291e6b-fa40-4ab9-941e-f8fffc23b376","hidden":true,"version_number":1,"translation_option":"2","source":"uat","order":0}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateArticleResponse"},"examples":{"Article Created Successfully":{"summary":"The article has been created under the following category. you can use the article Id to view the article in the portal.","value":{"data":{"id":"a1096061-e842-41fd-9085-494095e401b9","title":"Knowledge bases are much easier to design and edit","content":"Have you ever edited a Wikipedia page? You have to break the flow of text to add tags, and when you want to connect two articles together you have to just hope that nobody changes the other article\u2019s name, lest you end up with a rusty red \u201cdead link.\u201dTo be fair,Wikipedia has actually made good strides in making their Wiki software easy to use for anybody, but opening up the editor is still a bit of a shock since you don\u2019t see the familiar webpage you just clicked on. With a knowledge base, what you see is what you get.You don\u2019t have to train anybody on how to add or edit pages because the whole thing is extremely intuitive. Anybody can learn to navigate an edit page in seconds flat.","html_content":null,"category_id":"de104b39-db97-4509-8d4c-deeac74d448b","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","version_number":1,"public_version":1,"latest_version":2,"enable_rtl":false,"hidden":false,"status":0,"order":0,"created_by":"f11efc6f-e968-4e95-82eb-85ad61559de8","authors":[{"id":"f11efc6f-e968-4e95-82eb-85ad61559de8","first_name":"peter","last_name":"jone","user_description":null,"unique_user_name":"peter-jone","email_id":"peterjone@mail.com","profile_logo_url":"https://www.gravatar.com/avatar/FE29D578CBEC3945FC88BF4F10906A3E?sv=2022-11-02&st=2024-06-18T07%3A12%3A34Z&se=2024-06-18T07%3A32%3A34Z&sr=b&sp=r&sig=LEA2ccLr1hMTZkAE48jsdaTYgRr6jNScPQ4x4E3vTss%3D","profile_logo_cdn_url":"https://www.gravatar.com/avatar/FE29D578CBEC3945FC88BF4F10906A3E?sv=2022-11-02&st=2024-06-18T07%3A12%3A34Z&se=2024-06-18T07%3A32%3A34Z&sr=b&sp=r&sig=LEA2ccLr1hMTZkAE48jsdaTYgRr6jNScPQ4x4E3vTss%3D","is_enterprise_user":false}],"created_at":"2024-06-13T14:30:00","modified_at":"2024-06-13T14:30:00","slug":"Knowledge-bases-are-much-easier-to-design-and edit","is_fall_back_content":false,"description":null,"category_type":0,"content_type":null,"is_shared_article":false,"translation_option":0,"url":"https://example.com/v1/docs/en/getting-started"},"extension_data":null,"success":true,"errors":[],"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Article Not Found":{"summary":"Kindly verify the article Id and Langauage code, and peroform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Article not found","error_code":"400","custom_data":null}],"warnings":[],"information":[]}}}}}}}}},"/v2/Articles/{articleId}/versions":{"get":{"tags":["Articles"],"summary":"Gets all article versions","parameters":[{"name":"articleId","in":"path","description":"The ID of the article","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetArticleVersionsResponse"},"examples":{"Success Status Response":{"summary":"You can verify all the type of versions in a project.","value":{"data":[{"version_number":1,"created_by":"peter jone","created_at":"2024-06-13T14:30:00","modified_at":"2024-06-13T14:30:00","base_version":0,"status":0,"profile_url":"https://www.gravatar.com/avatar/FE29D578CBEC3945FC88BF4F10906A3E"}],"extension_data":null,"success":true,"errors":null,"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Article not found":{"summary":"Kindly verify your articleId and perform the task again. Also verify the langCode (language code) is mismatching.","value":{"extension_data":null,"success":true,"errors":[{"extension_data":null,"stack_trace":null,"description":"Article not found","error_code":null,"custom_data":null}],"warnings":[],"information":[]}}}}}}},"deprecated":true}},"/v2/Articles/{articleId}/{langCode}/versions":{"get":{"tags":["Articles"],"summary":"Gets all article versions","parameters":[{"name":"articleId","in":"path","description":"The ID of the article","required":true,"schema":{"type":"string"}},{"name":"langCode","in":"path","required":true,"schema":{"type":"string","default":"en"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetArticleVersionsResponse"},"examples":{"Success Status Response":{"summary":"You can verify all the type of versions in a project.","value":{"data":[{"version_number":1,"created_by":"peter jone","created_at":"2024-06-13T14:30:00","modified_at":"2024-06-13T14:30:00","base_version":0,"status":0,"profile_url":"https://www.gravatar.com/avatar/FE29D578CBEC3945FC88BF4F10906A3E"}],"extension_data":null,"success":true,"errors":null,"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Article not found":{"summary":"Kindly verify your articleId and perform the task again. Also verify the langCode (language code) is mismatching.","value":{"extension_data":null,"success":true,"errors":[{"extension_data":null,"stack_trace":null,"description":"Article not found","error_code":null,"custom_data":null}],"warnings":[],"information":[]}}}}}}}}},"/v2/Articles/{articleId}/versions/{versionNumber}":{"get":{"tags":["Articles"],"summary":"Gets article by a version number","parameters":[{"name":"articleId","in":"path","description":"The ID of the article","required":true,"schema":{"type":"string"}},{"name":"versionNumber","in":"path","description":"Version number of the article","required":true,"schema":{"type":"integer","format":"int32"}},{"name":"isForDisplay","in":"query","description":"Set this to true, if you are displaying the article to the end-user. If true, the content of snippets or variables appears in the article. Note: If the value is true, ensure that the article content is not passed for update article endpoints.","schema":{"type":"boolean","default":false}},{"name":"appendSASToken","in":"query","description":"Set this to false to exclude appending SAS token for images/files","schema":{"type":"boolean","default":true}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetArticleVersionResponse"},"examples":{"Success status Response":{"summary":"This is the sample response for get-article, You can verify the information regarding the individual article.","value":{"data":{"id":"a1096061-e842-41fd-9085-494095e401b9","title":"Knowledge bases are much easier to design and edit","content":"Have you ever edited a Wikipedia page? You have to break the flow of text to add tags, and when you want to connect two articles together you have to just hope that nobody changes the other article\u2019s name, lest you end up with a rusty red \u201cdead link.\u201dTo be fair,Wikipedia has actually made good strides in making their Wiki software easy to use for anybody, but opening up the editor is still a bit of a shock since you don\u2019t see the familiar webpage you just clicked on. With a knowledge base, what you see is what you get.You don\u2019t have to train anybody on how to add or edit pages because the whole thing is extremely intuitive. Anybody can learn to navigate an edit page in seconds flat.","html_content":null,"category_id":"de104b39-db97-4509-8d4c-deeac74d448b","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","version_number":1,"public_version":1,"latest_version":2,"enable_rtl":false,"hidden":false,"status":0,"order":0,"created_by":"f11efc6f-e968-4e95-82eb-85ad61559de8","authors":[{"id":"f11efc6f-e968-4e95-82eb-85ad61559de8","first_name":"peter","last_name":"jone","user_description":null,"unique_user_name":"peter-jone","email_id":"peterjone@mail.com","profile_logo_url":"https://www.gravatar.com/avatar/FE29D578CBEC3945FC88BF4F10906A3E?sv=2022-11-02&st=2024-06-18T07%3A12%3A34Z&se=2024-06-18T07%3A32%3A34Z&sr=b&sp=r&sig=LEA2ccLr1hMTZkAE48jsdaTYgRr6jNScPQ4x4E3vTss%3D","profile_logo_cdn_url":"https://www.gravatar.com/avatar/FE29D578CBEC3945FC88BF4F10906A3E?sv=2022-11-02&st=2024-06-18T07%3A12%3A34Z&se=2024-06-18T07%3A32%3A34Z&sr=b&sp=r&sig=LEA2ccLr1hMTZkAE48jsdaTYgRr6jNScPQ4x4E3vTss%3D","is_enterprise_user":false}],"created_at":"2024-06-13T14:30:00","modified_at":"2024-06-13T14:30:00","slug":"Knowledge-bases-are-much-easier-to-design-and edit","is_fall_back_content":false,"description":null,"category_type":0,"content_type":null,"is_shared_article":false,"translation_option":0,"version_created_at":"0001-01-01T00:00:00"},"extension_data":null,"success":true,"errors":[],"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Article not found":{"summary":"Kindly verify your articleId and perform the task again. Also verify the langCode (language code) is mismatching.","value":{"extension_data":null,"success":true,"errors":[{"extension_data":null,"stack_trace":null,"description":"Article not found","error_code":null,"custom_data":null}],"warnings":[],"information":[]}}}}}}},"deprecated":true}},"/v2/Articles/{articleId}/{langCode}/versions/{versionNumber}":{"get":{"tags":["Articles"],"summary":"Gets article by a version number","parameters":[{"name":"articleId","in":"path","description":"The ID of the article","required":true,"schema":{"type":"string"}},{"name":"versionNumber","in":"path","description":"Version number of the article","required":true,"schema":{"type":"integer","format":"int32"}},{"name":"langCode","in":"path","description":"Language code of the article","required":true,"schema":{"type":"string","default":"en"}},{"name":"isForDisplay","in":"query","description":"Set this to true, if you are displaying the article to the end-user. If true, the content of snippets or variables appears in the article. Note: If the value is true, ensure that the article content is not passed for update article endpoints.","schema":{"type":"boolean","default":false}},{"name":"appendSASToken","in":"query","description":"Set this to false to exclude appending SAS token for images/files","schema":{"type":"boolean","default":true}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetArticleVersionResponse"},"examples":{"Success status Response":{"summary":"This is the sample response for get-article, You can verify the information regarding the individual article.","value":{"data":{"id":"a1096061-e842-41fd-9085-494095e401b9","title":"Knowledge bases are much easier to design and edit","content":"Have you ever edited a Wikipedia page? You have to break the flow of text to add tags, and when you want to connect two articles together you have to just hope that nobody changes the other article\u2019s name, lest you end up with a rusty red \u201cdead link.\u201dTo be fair,Wikipedia has actually made good strides in making their Wiki software easy to use for anybody, but opening up the editor is still a bit of a shock since you don\u2019t see the familiar webpage you just clicked on. With a knowledge base, what you see is what you get.You don\u2019t have to train anybody on how to add or edit pages because the whole thing is extremely intuitive. Anybody can learn to navigate an edit page in seconds flat.","html_content":null,"category_id":"de104b39-db97-4509-8d4c-deeac74d448b","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","version_number":1,"public_version":1,"latest_version":2,"enable_rtl":false,"hidden":false,"status":0,"order":0,"created_by":"f11efc6f-e968-4e95-82eb-85ad61559de8","authors":[{"id":"f11efc6f-e968-4e95-82eb-85ad61559de8","first_name":"peter","last_name":"jone","user_description":null,"unique_user_name":"peter-jone","email_id":"peterjone@mail.com","profile_logo_url":"https://www.gravatar.com/avatar/FE29D578CBEC3945FC88BF4F10906A3E?sv=2022-11-02&st=2024-06-18T07%3A12%3A34Z&se=2024-06-18T07%3A32%3A34Z&sr=b&sp=r&sig=LEA2ccLr1hMTZkAE48jsdaTYgRr6jNScPQ4x4E3vTss%3D","profile_logo_cdn_url":"https://www.gravatar.com/avatar/FE29D578CBEC3945FC88BF4F10906A3E?sv=2022-11-02&st=2024-06-18T07%3A12%3A34Z&se=2024-06-18T07%3A32%3A34Z&sr=b&sp=r&sig=LEA2ccLr1hMTZkAE48jsdaTYgRr6jNScPQ4x4E3vTss%3D","is_enterprise_user":false}],"created_at":"2024-06-13T14:30:00","modified_at":"2024-06-13T14:30:00","slug":"Knowledge-bases-are-much-easier-to-design-and edit","is_fall_back_content":false,"description":null,"category_type":0,"content_type":null,"is_shared_article":false,"translation_option":0,"version_created_at":"0001-01-01T00:00:00"},"extension_data":null,"success":true,"errors":[],"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Article not found":{"summary":"Kindly verify your articleId and perform the task again. Also verify the langCode (language code) is mismatching.","value":{"extension_data":null,"success":true,"errors":[{"extension_data":null,"stack_trace":null,"description":"Article not found","error_code":null,"custom_data":null}],"warnings":[],"information":[]}}}}}}}}},"/v2/Articles/{articleId}/settings":{"get":{"tags":["Articles"],"summary":"Gets settings for the article","parameters":[{"name":"articleId","in":"path","description":"The ID of the article","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetArticleSettingsResponse"},"examples":{"Success status Response":{"summary":"This is the sample response for Get-Article-Settings, You can verify the Slug, Tags, and relatedArticles.","value":{"data":{"slug":"5-basic-things-to-get-started","seo_title":null,"description":null,"allow_comments":true,"show_table_of_contents":true,"featured_image_url":null,"tags":["Getting started"],"status_indicator":1,"status_indicator_expiry_date":"2024-06-13T14:30:00","exclude_from_search":false,"exclude_from_ai_search":false,"related_articles":[],"is_acknowledgement_enabled":false},"extension_data":null,"success":true,"errors":null,"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Article not found":{"summary":"Kindly verify your articleId and perform the task again. Also verify the langCode (language code) is mismatching.","value":{"extension_data":null,"success":true,"errors":[{"extension_data":null,"stack_trace":null,"description":"Article not found","error_code":null,"custom_data":null}],"warnings":[],"information":[]}}}}}}},"deprecated":true},"put":{"tags":["Articles"],"summary":"Updates settings for the article","parameters":[{"name":"articleId","in":"path","description":"The ID of the article","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"","content":{"application/json-patch+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/UpdateArticleSettingsRequest"}]},"examples":{"Article settings update request.":{"summary":"This request is used to update the article settings. Kindly make sure the changes for updating your parameters has done successfully.","value":{"slug":"updatearticlesettings","seo_title":"update","description":"This is the description for updating article settings.","allow_comments":true,"show_table_of_contents":true,"tags":[],"status_indicator":2,"status_indicator_expiry_date":"2024-06-13T14:30:00","exclude_from_search":true,"exclude_from_ai_search":false,"related_articles":[],"content_type":0,"is_acknowledgement_enabled":false}}}},"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/UpdateArticleSettingsRequest"}]},"examples":{"Article settings update request.":{"summary":"This request is used to update the article settings. Kindly make sure the changes for updating your parameters has done successfully.","value":{"slug":"updatearticlesettings","seo_title":"update","description":"This is the description for updating article settings.","allow_comments":true,"show_table_of_contents":true,"tags":[],"status_indicator":2,"status_indicator_expiry_date":"2024-06-13T14:30:00","exclude_from_search":true,"exclude_from_ai_search":false,"related_articles":[],"content_type":0,"is_acknowledgement_enabled":false}}}},"text/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/UpdateArticleSettingsRequest"}]},"examples":{"Article settings update request.":{"summary":"This request is used to update the article settings. Kindly make sure the changes for updating your parameters has done successfully.","value":{"slug":"updatearticlesettings","seo_title":"update","description":"This is the description for updating article settings.","allow_comments":true,"show_table_of_contents":true,"tags":[],"status_indicator":2,"status_indicator_expiry_date":"2024-06-13T14:30:00","exclude_from_search":true,"exclude_from_ai_search":false,"related_articles":[],"content_type":0,"is_acknowledgement_enabled":false}}}},"application/*+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/UpdateArticleSettingsRequest"}]},"examples":{"Article settings update request.":{"summary":"This request is used to update the article settings. Kindly make sure the changes for updating your parameters has done successfully.","value":{"slug":"updatearticlesettings","seo_title":"update","description":"This is the description for updating article settings.","allow_comments":true,"show_table_of_contents":true,"tags":[],"status_indicator":2,"status_indicator_expiry_date":"2024-06-13T14:30:00","exclude_from_search":true,"exclude_from_ai_search":false,"related_articles":[],"content_type":0,"is_acknowledgement_enabled":false}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateArticleSettingsResponseCustomer"},"examples":{"Successfully updated the article setings.":{"summary":"This response indicate a article settings has been successfully updated.","value":{"data":{"url":"https://example.com/v1/docs/en/getting-started","slug":"updatearticlesettings","seo_title":"update","description":"This is the description for updating article settings.","allow_comments":true,"show_table_of_contents":true,"featured_image_url":"","tags":[],"status_indicator":2,"status_indicator_expiry_date":"2024-06-13T14:30:00","exclude_from_search":true,"exclude_from_ai_search":false,"related_articles":[],"is_acknowledgement_enabled":false},"extension_data":null,"success":true,"errors":[],"warnings":[],"information":[{"extension_data":null,"description":"Article settings updated successfully"}]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Non-Empty body is required.":{"summary":"This response is due to an empty request body. \\n Kindly make some body parameters to get success response.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"A non-empty request body is required.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}}}}}}},"deprecated":true}},"/v2/Articles/{articleId}/{langCode}/settings":{"get":{"tags":["Articles"],"summary":"Gets settings for the article","parameters":[{"name":"articleId","in":"path","description":"The ID of the article","required":true,"schema":{"type":"string"}},{"name":"langCode","in":"path","description":"Language code of the article","required":true,"schema":{"type":"string","default":"en"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetArticleSettingsResponse"},"examples":{"Success status Response":{"summary":"This is the sample response for Get-Article-Settings, You can verify the Slug, Tags, and relatedArticles.","value":{"data":{"slug":"5-basic-things-to-get-started","seo_title":null,"description":null,"allow_comments":true,"show_table_of_contents":true,"featured_image_url":null,"tags":["Getting started"],"status_indicator":1,"status_indicator_expiry_date":"2024-06-13T14:30:00","exclude_from_search":false,"exclude_from_ai_search":false,"related_articles":[],"is_acknowledgement_enabled":false},"extension_data":null,"success":true,"errors":null,"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Article not found":{"summary":"Kindly verify your articleId and perform the task again. Also verify the langCode (language code) is mismatching.","value":{"extension_data":null,"success":true,"errors":[{"extension_data":null,"stack_trace":null,"description":"Article not found","error_code":null,"custom_data":null}],"warnings":[],"information":[]}}}}}}}},"put":{"tags":["Articles"],"summary":"Updates settings for the article","parameters":[{"name":"articleId","in":"path","description":"The ID of the article","required":true,"schema":{"type":"string"}},{"name":"langCode","in":"path","description":"Language code of the article","required":true,"schema":{"type":"string","default":"en"}}],"requestBody":{"description":"","content":{"application/json-patch+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/UpdateArticleSettingsRequest"}]},"examples":{"Article settings update request.":{"summary":"This request is used to update the article settings. Kindly make sure the changes for updating your parameters has done successfully.","value":{"slug":"updatearticlesettings","seo_title":"update","description":"This is the description for updating article settings.","allow_comments":true,"show_table_of_contents":true,"tags":[],"status_indicator":2,"status_indicator_expiry_date":"2024-06-13T14:30:00","exclude_from_search":true,"exclude_from_ai_search":false,"related_articles":[],"content_type":0,"is_acknowledgement_enabled":false}}}},"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/UpdateArticleSettingsRequest"}]},"examples":{"Article settings update request.":{"summary":"This request is used to update the article settings. Kindly make sure the changes for updating your parameters has done successfully.","value":{"slug":"updatearticlesettings","seo_title":"update","description":"This is the description for updating article settings.","allow_comments":true,"show_table_of_contents":true,"tags":[],"status_indicator":2,"status_indicator_expiry_date":"2024-06-13T14:30:00","exclude_from_search":true,"exclude_from_ai_search":false,"related_articles":[],"content_type":0,"is_acknowledgement_enabled":false}}}},"text/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/UpdateArticleSettingsRequest"}]},"examples":{"Article settings update request.":{"summary":"This request is used to update the article settings. Kindly make sure the changes for updating your parameters has done successfully.","value":{"slug":"updatearticlesettings","seo_title":"update","description":"This is the description for updating article settings.","allow_comments":true,"show_table_of_contents":true,"tags":[],"status_indicator":2,"status_indicator_expiry_date":"2024-06-13T14:30:00","exclude_from_search":true,"exclude_from_ai_search":false,"related_articles":[],"content_type":0,"is_acknowledgement_enabled":false}}}},"application/*+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/UpdateArticleSettingsRequest"}]},"examples":{"Article settings update request.":{"summary":"This request is used to update the article settings. Kindly make sure the changes for updating your parameters has done successfully.","value":{"slug":"updatearticlesettings","seo_title":"update","description":"This is the description for updating article settings.","allow_comments":true,"show_table_of_contents":true,"tags":[],"status_indicator":2,"status_indicator_expiry_date":"2024-06-13T14:30:00","exclude_from_search":true,"exclude_from_ai_search":false,"related_articles":[],"content_type":0,"is_acknowledgement_enabled":false}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateArticleSettingsResponseCustomer"},"examples":{"Successfully updated the article setings.":{"summary":"This response indicate a article settings has been successfully updated.","value":{"data":{"url":"https://example.com/v1/docs/en/getting-started","slug":"updatearticlesettings","seo_title":"update","description":"This is the description for updating article settings.","allow_comments":true,"show_table_of_contents":true,"featured_image_url":"","tags":[],"status_indicator":2,"status_indicator_expiry_date":"2024-06-13T14:30:00","exclude_from_search":true,"exclude_from_ai_search":false,"related_articles":[],"is_acknowledgement_enabled":false},"extension_data":null,"success":true,"errors":[],"warnings":[],"information":[{"extension_data":null,"description":"Article settings updated successfully"}]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Non-Empty body is required.":{"summary":"This response is due to an empty request body. \\n Kindly make some body parameters to get success response.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"A non-empty request body is required.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}}}}}}}}},"/v2/Articles":{"post":{"tags":["Articles"],"summary":"Adds an article to an existing category","requestBody":{"description":"","content":{"application/json-patch+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/CreateArticleRequest"}]},"examples":{"Create article Request Example":{"summary":"Create an article with the title, categoryId, projevtVersionId, and userId.","value":{"title":"New Article","content":"This is my new article Content.","category_id":"5b291e6b-fa40-4ab9-941e-f8fffc23b376","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null}}}},"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/CreateArticleRequest"}]},"examples":{"Create article Request Example":{"summary":"Create an article with the title, categoryId, projevtVersionId, and userId.","value":{"title":"New Article","content":"This is my new article Content.","category_id":"5b291e6b-fa40-4ab9-941e-f8fffc23b376","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null}}}},"text/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/CreateArticleRequest"}]},"examples":{"Create article Request Example":{"summary":"Create an article with the title, categoryId, projevtVersionId, and userId.","value":{"title":"New Article","content":"This is my new article Content.","category_id":"5b291e6b-fa40-4ab9-941e-f8fffc23b376","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null}}}},"application/*+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/CreateArticleRequest"}]},"examples":{"Create article Request Example":{"summary":"Create an article with the title, categoryId, projevtVersionId, and userId.","value":{"title":"New Article","content":"This is my new article Content.","category_id":"5b291e6b-fa40-4ab9-941e-f8fffc23b376","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateArticleResponse"},"examples":{"Article Created Successfully":{"summary":"The article has been created under the following category. you can use the article Id to view the article in the portal.","value":{"data":{"id":"925b69b9-f241-4d89-9e3e-208a98dfc8eb","title":"Sample Article","public_version":0,"latest_version":1,"language_code":null,"hidden":false,"status":0,"order":3,"slug":"sample-article","content_type":null,"translation_option":0,"is_shared_article":false,"modified_at":null},"extension_data":null,"success":true,"errors":[],"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"userId not found":{"summary":"Kindly check your user Id and perform the task again. Find your user Id at /v2/Teams.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"The user with id 'f11efc6f-e968-4e95-82eb-85ad61559de81' does not exist in your project.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}},"category_id not found":{"summary":"Kindly check the category_id from /v2/ProjectVersions/{projectVersionId}/categories and perform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Unable to find specified parent category with an id 5b291e6b-fa40-4ab9-941e-f8fffc23b3761.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}},"project_version_id not found":{"summary":"Kindly check the project_version_id from /v2/ProjectVersions and perform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"The supplied project version id 46f48bc7-760f-4b07-b2d2-fce4aa8ba2349 does not exist in your project.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}},"title not found":{"summary":"Kindly check the title is empty or null, and perform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"The Title field is required.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}}}}}}}}},"/v2/Articles/bulkcreate":{"post":{"tags":["Articles"],"summary":"Adds multiple articles","requestBody":{"description":"","content":{"application/json-patch+json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CreateArticleRequest"}},"examples":{"Create Bulk Article Request Example":{"summary":"Create Bulk artilce by adding a list of data in title, category_id, project_version_id, and user_id. use content property to add some data in to your article.","value":[{"title":"New Article 1","content":"This is my first article Content.","category_id":"5b291e6b-fa40-4ab9-941e-f8fffc23b376","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null},{"title":"New Article 2","content":"This is my second article Content.","category_id":"5b291e6b-fa40-4ab9-941e-f8fffc23b376","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null}]}}},"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CreateArticleRequest"}},"examples":{"Create Bulk Article Request Example":{"summary":"Create Bulk artilce by adding a list of data in title, category_id, project_version_id, and user_id. use content property to add some data in to your article.","value":[{"title":"New Article 1","content":"This is my first article Content.","category_id":"5b291e6b-fa40-4ab9-941e-f8fffc23b376","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null},{"title":"New Article 2","content":"This is my second article Content.","category_id":"5b291e6b-fa40-4ab9-941e-f8fffc23b376","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null}]}}},"text/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CreateArticleRequest"}},"examples":{"Create Bulk Article Request Example":{"summary":"Create Bulk artilce by adding a list of data in title, category_id, project_version_id, and user_id. use content property to add some data in to your article.","value":[{"title":"New Article 1","content":"This is my first article Content.","category_id":"5b291e6b-fa40-4ab9-941e-f8fffc23b376","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null},{"title":"New Article 2","content":"This is my second article Content.","category_id":"5b291e6b-fa40-4ab9-941e-f8fffc23b376","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null}]}}},"application/*+json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CreateArticleRequest"}},"examples":{"Create Bulk Article Request Example":{"summary":"Create Bulk artilce by adding a list of data in title, category_id, project_version_id, and user_id. use content property to add some data in to your article.","value":[{"title":"New Article 1","content":"This is my first article Content.","category_id":"5b291e6b-fa40-4ab9-941e-f8fffc23b376","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null},{"title":"New Article 2","content":"This is my second article Content.","category_id":"5b291e6b-fa40-4ab9-941e-f8fffc23b376","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null}]}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkCreateArticleResponseCustomer"},"examples":{"Article Created Successfully":{"summary":"The article has been created under the following category. you can use the article Id to view the article in the portal.","value":{"data":[{"article_id":"d83f3388-7493-489f-ab51-249d4e6a25ce","success":true,"details":"Successfully created article c1"},{"article_id":"5cabbba1-fc2a-4f82-9dee-01759509b109","success":true,"details":"Successfully created article c2"}],"extension_data":null,"success":true,"errors":[],"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"userId not found":{"summary":"Kindly check your user Id and perform the task again. Find your user Id at /v2/Teams.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Failed to create article c2\r\nError: The user with id 'f11efc6f-e968-4e95-82eb-85ad61559de81' does not exist in your project.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}},"project_version_id not foundd":{"summary":"Kindly check the project_version_id from /v2/ProjectVersions and perform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Failed to create article c1\r\nError: The supplied workspace id 46f48bc7-760f-4b07-b2d2-fce4aa8ba2341 does not exist in your project..","error_code":"400","custom_data":null}],"warnings":[],"information":[]}},"category_id not found":{"summary":"Kindly check the category_id from /v2/ProjectVersions/{projectVersionId}/categories and perform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Failed to create article c1\r\nError: Unable to find specified parent category with an id 5b291e6b-fa40-4ab9-941e-f8fffc23b3761.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}},"title not found":{"summary":"Kindly check the title is empty or null, and perform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"The Title field is required.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}}}}}}}}},"/v2/Articles/{articleId}/publish":{"post":{"tags":["Articles"],"summary":"Publishes an article with an id","parameters":[{"name":"articleId","in":"path","description":"The ID of the article","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"","content":{"application/json-patch+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/PublishArticleRequest"}]},"examples":{"Publish Article Request Example":{"summary":"Publishing an article with ArticleId, langCode, user_id, version_number, and publish_message.","value":{"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","version_number":1,"publish_message":"Publishing my article with new changes."}}}},"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/PublishArticleRequest"}]},"examples":{"Publish Article Request Example":{"summary":"Publishing an article with ArticleId, langCode, user_id, version_number, and publish_message.","value":{"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","version_number":1,"publish_message":"Publishing my article with new changes."}}}},"text/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/PublishArticleRequest"}]},"examples":{"Publish Article Request Example":{"summary":"Publishing an article with ArticleId, langCode, user_id, version_number, and publish_message.","value":{"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","version_number":1,"publish_message":"Publishing my article with new changes."}}}},"application/*+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/PublishArticleRequest"}]},"examples":{"Publish Article Request Example":{"summary":"Publishing an article with ArticleId, langCode, user_id, version_number, and publish_message.","value":{"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","version_number":1,"publish_message":"Publishing my article with new changes."}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateArticleResponse"},"examples":{"Publish Article Request Example":{"summary":"Publishing an article with ArticleId, langCode, user_id, version_number, and publish_message.","value":{"url":"https://example.com/v1/docs/en/getting-started","extension_data":null,"success":true,"errors":[],"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"ALready published Article":{"summary":"This is repeated task that, this article has already published ","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Article has already been published.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}},"version_number Not Found":{"summary":"version_number is missing or null, kindly verify the version number and perform the task again. ","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"The field VersionNumber must be between 1 and 32767.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}},"article_id Not Found":{"summary":"Kindly verify the article_id and perform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"One or more errors occurred. (Article not found).","error_code":"400","custom_data":null}],"warnings":[],"information":[]}},"article Not Found":{"summary":"Kindly verify the articleId or langCode and perform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Article not found.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}}}}}}},"deprecated":true}},"/v2/Articles/{articleId}/{langCode}/publish":{"post":{"tags":["Articles"],"summary":"Publishes an article with an id","parameters":[{"name":"articleId","in":"path","description":"The ID of the article","required":true,"schema":{"type":"string"}},{"name":"langCode","in":"path","description":"Language code of the article","required":true,"schema":{"type":"string","default":"en"}}],"requestBody":{"description":"","content":{"application/json-patch+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/PublishArticleRequest"}]},"examples":{"Publish Article Request Example":{"summary":"Publishing an article with ArticleId, langCode, user_id, version_number, and publish_message.","value":{"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","version_number":1,"publish_message":"Publishing my article with new changes."}}}},"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/PublishArticleRequest"}]},"examples":{"Publish Article Request Example":{"summary":"Publishing an article with ArticleId, langCode, user_id, version_number, and publish_message.","value":{"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","version_number":1,"publish_message":"Publishing my article with new changes."}}}},"text/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/PublishArticleRequest"}]},"examples":{"Publish Article Request Example":{"summary":"Publishing an article with ArticleId, langCode, user_id, version_number, and publish_message.","value":{"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","version_number":1,"publish_message":"Publishing my article with new changes."}}}},"application/*+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/PublishArticleRequest"}]},"examples":{"Publish Article Request Example":{"summary":"Publishing an article with ArticleId, langCode, user_id, version_number, and publish_message.","value":{"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","version_number":1,"publish_message":"Publishing my article with new changes."}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateArticleResponse"},"examples":{"Publish Article Request Example":{"summary":"Publishing an article with ArticleId, langCode, user_id, version_number, and publish_message.","value":{"url":"https://example.com/v1/docs/en/getting-started","extension_data":null,"success":true,"errors":[],"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"ALready published Article":{"summary":"This is repeated task that, this article has already published ","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Article has already been published.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}},"version_number Not Found":{"summary":"version_number is missing or null, kindly verify the version number and perform the task again. ","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"The field VersionNumber must be between 1 and 32767.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}},"article_id Not Found":{"summary":"Kindly verify the article_id and perform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"One or more errors occurred. (Article not found).","error_code":"400","custom_data":null}],"warnings":[],"information":[]}},"article Not Found":{"summary":"Kindly verify the articleId or langCode and perform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Article not found.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}}}}}}}}},"/v2/Articles/bulkpublish/{langCode}":{"post":{"tags":["Articles"],"summary":"Publishes multiple articles","parameters":[{"name":"langCode","in":"path","description":"Language code of the article","required":true,"schema":{"type":"string","default":"en"}}],"requestBody":{"description":"","content":{"application/json-patch+json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BulkPublishArticle"}},"examples":{"Publish Article Request Example":{"summary":"Publishing an article with ArticleId, langCode, user_id, version_number, and publish_message.","value":[{"article_id":"8bcd4bf9-eb93-40d9-a8df-c3b518660ceb","user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","version_number":1,"publish_message":"multiple article published"},{"article_id":"2ce2607f-6cfa-4bc9-9e47-1dc3843198629","user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","version_number":1,"publish_message":"multiple article published"}]}}},"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BulkPublishArticle"}},"examples":{"Publish Article Request Example":{"summary":"Publishing an article with ArticleId, langCode, user_id, version_number, and publish_message.","value":[{"article_id":"8bcd4bf9-eb93-40d9-a8df-c3b518660ceb","user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","version_number":1,"publish_message":"multiple article published"},{"article_id":"2ce2607f-6cfa-4bc9-9e47-1dc3843198629","user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","version_number":1,"publish_message":"multiple article published"}]}}},"text/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BulkPublishArticle"}},"examples":{"Publish Article Request Example":{"summary":"Publishing an article with ArticleId, langCode, user_id, version_number, and publish_message.","value":[{"article_id":"8bcd4bf9-eb93-40d9-a8df-c3b518660ceb","user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","version_number":1,"publish_message":"multiple article published"},{"article_id":"2ce2607f-6cfa-4bc9-9e47-1dc3843198629","user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","version_number":1,"publish_message":"multiple article published"}]}}},"application/*+json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BulkPublishArticle"}},"examples":{"Publish Article Request Example":{"summary":"Publishing an article with ArticleId, langCode, user_id, version_number, and publish_message.","value":[{"article_id":"8bcd4bf9-eb93-40d9-a8df-c3b518660ceb","user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","version_number":1,"publish_message":"multiple article published"},{"article_id":"2ce2607f-6cfa-4bc9-9e47-1dc3843198629","user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","version_number":1,"publish_message":"multiple article published"}]}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateArticleResponse"},"examples":{"Publish Article Request Example":{"summary":"Publishing an article with ArticleId, langCode, user_id, version_number, and publish_message.","value":{"data":[{"article_id":"8bcd4bf9-eb93-40d9-a8df-c3b518660ceb","success":true,"details":"Successfully published article with an id 8bcd4bf9-eb93-40d9-a8df-c3b518660ceb"},{"article_id":"99575fe3-f7b0-4e0a-bc46-38aed8c621f9","success":true,"details":"Successfully published article with an id 99575fe3-f7b0-4e0a-bc46-38aed8c621f9"}],"extension_data":null,"success":true,"errors":[],"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"already published article":{"summary":"This article has been already published.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Failed to publish article with an id 99575fe3-f7b0-4e0a-bc46-38aed8c621f9\r\nError: Article has already been published.","error_code":null,"custom_data":null}],"warnings":[],"information":[]}},"user_id not found":{"summary":"Kindly verfy the user_id is not null or empty, and perform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Failed to publish article with an id 99575fe3-f7b0-4e0a-bc46-38aed8c621f9\r\nError: The user with id 'f11efc6f-e968-4e95-82eb-85ad61559de81' does not exist in your project.","error_code":null,"custom_data":null}],"warnings":[],"information":[]}},"article_id not found":{"summary":"Invalid article_id or null reference, verify the article Id and perform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"The ArticleId field is required.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}},"version_number not found":{"summary":"Invalid datatype for version_number, Kindly use integer value perform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"The field VersionNumber must be between 1 and 32767.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}}}}}}}}},"/v2/Articles/{articleId}/fork":{"put":{"tags":["Articles"],"summary":"Forks an article with an id","parameters":[{"name":"articleId","in":"path","description":"The ID of the article","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"","content":{"application/json-patch+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ForkArticleVersionRequest"}]},"examples":{"Non-Empty body is required.":{"summary":"This response is due to an empty request body. \\n Kindly make some body parameters to get success response.","value":{"version_number":2,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","lang_code":"en"}}}},"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ForkArticleVersionRequest"}]},"examples":{"Non-Empty body is required.":{"summary":"This response is due to an empty request body. \\n Kindly make some body parameters to get success response.","value":{"version_number":2,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","lang_code":"en"}}}},"text/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ForkArticleVersionRequest"}]},"examples":{"Non-Empty body is required.":{"summary":"This response is due to an empty request body. \\n Kindly make some body parameters to get success response.","value":{"version_number":2,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","lang_code":"en"}}}},"application/*+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ForkArticleVersionRequest"}]},"examples":{"Non-Empty body is required.":{"summary":"This response is due to an empty request body. \\n Kindly make some body parameters to get success response.","value":{"version_number":2,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","lang_code":"en"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForkArticleVersionResponse"},"examples":{"Non-Empty body is required.":{"summary":"This response is due to an empty request body. \\n Kindly make some body parameters to get success response.","value":{"data":{"version_number":4,"created_by":"peter jone","created_at":"2024-06-13T14:30:00","modified_at":"2024-06-13T14:30:00","base_version":3,"status":0,"profile_url":"https://www.gravatar.com/avatar/FE29D578CBEC3945FC88BF4F10906A3E"},"extension_data":null,"success":true,"errors":[],"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"user_id not found.":{"summary":"Kindly verify the user_id and perform the task again.","value":{"extension_data":null,"success":true,"errors":[{"extension_data":null,"stack_trace":null,"description":"The UserId field is required.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}},"lang_code not found.":{"summary":"Kindly verify the lang_code and perform the task again.","value":{"extension_data":null,"success":true,"errors":[{"extension_data":null,"stack_trace":null,"description":"The LangCode field is required.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}},"version_number not found.":{"summary":"Kindly verify the version_number and perform the task again.","value":{"extension_data":null,"success":true,"errors":[{"extension_data":null,"stack_trace":null,"description":"Cannot fork version number 0, it does not exist in your project.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}},"Article Id not found.":{"summary":"Kindly verify the Article Id and perform the task again.","value":{"extension_data":null,"success":true,"errors":[{"extension_data":null,"stack_trace":null,"description":"One or more errors occurred. (Article not found).","error_code":"400","custom_data":null}],"warnings":[],"information":[]}}}}}}}}},"/v2/Articles/bulkupdate":{"put":{"tags":["Articles"],"summary":"Updates multiple articles","requestBody":{"description":"","content":{"application/json-patch+json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BulkUpdateArticle"}},"examples":{"Non-Empty body is required.":{"summary":"This response is due to an empty request body. \\n Kindly make some body parameters to get success response.","value":[{"article_id":"0e9a3cf2-b5ce-46d4-a637-604cb8407b93","lang_code":"en","title":"Updated Title","content":"updating content","html_content":"<p>updating content</p>","category_id":"68212cec-7a9b-4323-9bb8-33865444a508","hidden":false,"version_number":1,"translation_option":"","source":"","order":0}]}}},"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BulkUpdateArticle"}},"examples":{"Non-Empty body is required.":{"summary":"This response is due to an empty request body. \\n Kindly make some body parameters to get success response.","value":[{"article_id":"0e9a3cf2-b5ce-46d4-a637-604cb8407b93","lang_code":"en","title":"Updated Title","content":"updating content","html_content":"<p>updating content</p>","category_id":"68212cec-7a9b-4323-9bb8-33865444a508","hidden":false,"version_number":1,"translation_option":"","source":"","order":0}]}}},"text/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BulkUpdateArticle"}},"examples":{"Non-Empty body is required.":{"summary":"This response is due to an empty request body. \\n Kindly make some body parameters to get success response.","value":[{"article_id":"0e9a3cf2-b5ce-46d4-a637-604cb8407b93","lang_code":"en","title":"Updated Title","content":"updating content","html_content":"<p>updating content</p>","category_id":"68212cec-7a9b-4323-9bb8-33865444a508","hidden":false,"version_number":1,"translation_option":"","source":"","order":0}]}}},"application/*+json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BulkUpdateArticle"}},"examples":{"Non-Empty body is required.":{"summary":"This response is due to an empty request body. \\n Kindly make some body parameters to get success response.","value":[{"article_id":"0e9a3cf2-b5ce-46d4-a637-604cb8407b93","lang_code":"en","title":"Updated Title","content":"updating content","html_content":"<p>updating content</p>","category_id":"68212cec-7a9b-4323-9bb8-33865444a508","hidden":false,"version_number":1,"translation_option":"","source":"","order":0}]}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkUpdateArticleResponse"},"examples":{"Success response for bulk article update.":{"summary":"This is an response that indicate the bulk articles has updated successfully.","value":{"data":[{"article_id":"0e9a3cf2-b5ce-46d4-a637-604cb8407b93","success":true,"details":"Successfully updated article with an id 0e9a3cf2-b5ce-46d4-a637-604cb8407b93"}],"extension_data":null,"success":true,"errors":[],"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Non-Empty body is required.":{"summary":"This response is due to an empty request body. \\n Kindly make some body parameters to get success response.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"A non-empty request body is required.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}}}}}}}}},"/v2/Articles/{articleId}/updateDescription":{"put":{"tags":["Articles"],"summary":"Update the Article Description","parameters":[{"name":"articleId","in":"path","description":"The ID of the article","required":true,"schema":{"type":"string"}},{"name":"description","in":"query","description":"The description of the article","schema":{"maxLength":250,"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Article settings update request.":{"summary":"This request is used to update the article settings. Kindly make sure the changes for updating your parameters has done successfully.","value":{"extension_data":null,"success":true,"errors":[],"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Kindly verify the language code.":{"summary":"Verify the language code and perform the task again.","value":{"extension_data":null,"success":false,"errors":[],"warnings":[],"information":[]}},"Kindly verify the  article Id.":{"summary":"Verify the article Id and perform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Article not found","error_code":"400","custom_data":null}],"warnings":[],"information":[]}}}}}}},"deprecated":true}},"/v2/Articles/{articleId}/{langCode}/updateDescription":{"put":{"tags":["Articles"],"summary":"Update the Article Description","parameters":[{"name":"articleId","in":"path","description":"The ID of the article","required":true,"schema":{"type":"string"}},{"name":"description","in":"query","description":"The description of the article","schema":{"maxLength":250,"type":"string"}},{"name":"langCode","in":"path","description":"Language code of the article","required":true,"schema":{"type":"string","default":"en"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Article settings update request.":{"summary":"This request is used to update the article settings. Kindly make sure the changes for updating your parameters has done successfully.","value":{"extension_data":null,"success":true,"errors":[],"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Kindly verify the language code.":{"summary":"Verify the language code and perform the task again.","value":{"extension_data":null,"success":false,"errors":[],"warnings":[],"information":[]}},"Kindly verify the  article Id.":{"summary":"Verify the article Id and perform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Article not found","error_code":"400","custom_data":null}],"warnings":[],"information":[]}}}}}}}}},"/v2/Categories/{categoryId}":{"delete":{"tags":["Categories"],"summary":"Deletes an category with an ID","parameters":[{"name":"categoryId","in":"path","description":"The ID of the category","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Successfully Deleted":{"summary":"The category has been successfully deleted.","value":{"extension_data":null,"success":true,"errors":null,"warnings":[],"information":null}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Category not found":{"summary":"Kindly verify the Categotry Id and Langauage code, then peroform the task again.","value":{"extension_data":null,"success":true,"errors":[{"extension_data":null,"stack_trace":null,"description":"Category not found","error_code":"400","custom_data":null}],"warnings":[],"information":[]}}}}}}}},"get":{"tags":["Categories"],"summary":"Get category with an ID","parameters":[{"name":"categoryId","in":"path","description":"The ID of the category","required":true,"schema":{"type":"string"}},{"name":"langCode","in":"query","description":"If the language code is empty, the default language of the category will be taken into account.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetCategoryResponse"},"examples":{"Success Response":{"summary":"This is an example for get category succes response. \\n Here you can view diffrent data included with multiple article associated with a category.","value":{"data":{"id":"5b291e6b-fa40-4ab9-941e-f8fffc23b376","name":"Category name","description":null,"project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":11,"parent_category_id":null,"hidden":false,"articles":[{"id":"cf8f67da-77c7-48b1-b207-70875caa2f55","title":"New article 1","public_version":1,"latest_version":1,"language_code":"en","hidden":false,"status":0,"order":2,"slug":"new-article-1","content_type":null,"translation_option":0,"is_shared_article":false,"modified_at":"2024-06-13T14:30:00"},{"id":"925b69b9-f241-4d89-9e3e-208a98dfc8eb","title":"New article 2","public_version":1,"latest_version":1,"language_code":"en","hidden":false,"status":0,"order":2,"slug":"new-article-2","content_type":null,"translation_option":0,"is_shared_article":false,"modified_at":"2024-06-13T14:30:00"}],"child_categories":[{"id":"5b291e6b-fa40-4ab9-941e-f8fffc23b376","name":"Child category name","description":null,"project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":11,"parent_category_id":null,"hidden":false,"articles":[{"id":"cf8f67da-77c7-48b1-b207-70875caa2f55","title":"New article 3","public_version":1,"latest_version":1,"language_code":"en","hidden":false,"status":0,"order":2,"slug":"new-article-3","content_type":null,"translation_option":0,"is_shared_article":false,"modified_at":"2024-06-13T14:30:00"},{"id":"925b69b9-f241-4d89-9e3e-208a98dfc8eb","title":"New article 4","public_version":1,"latest_version":1,"language_code":"en","hidden":false,"status":0,"order":2,"slug":"new-article-4","content_type":null,"translation_option":0,"is_shared_article":false,"modified_at":"2024-06-13T14:30:00"}],"child_categories":[],"icon":null,"slug":"category-name","language_code":null,"category_type":2,"created_at":"2024-06-13T14:30:00","modified_at":"2024-06-13T14:30:00","status":null,"content_type":null}],"icon":null,"slug":"category-name","language_code":null,"category_type":2,"created_at":"2024-06-13T14:30:00","modified_at":"2024-06-13T14:30:00","status":null,"content_type":null},"extension_data":null,"success":true,"errors":[],"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Category Not Found":{"summary":"Kindly verify the Categotry Id, and peroform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Cannot find category with id 5b291e6b-fa40-4ab9-941e-f8fffc23b3761","error_code":null,"custom_data":null}],"warnings":[],"information":[]}},"Language Not Found":{"summary":"Kindly verify the langCode, and peroform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Language code not found","error_code":null,"custom_data":null}],"warnings":[],"information":[]}}}}}}}},"put":{"tags":["Categories"],"summary":"Update a category with the ID","parameters":[{"name":"categoryId","in":"path","description":"The ID of the category","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"","content":{"application/json-patch+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/UpdateCategoryRequest"}]},"examples":{"Updating Category":{"summary":"Request for Updating Category Name.\\n  if you are not using parent_category_id then remove the field.","value":{"name":"UpdatedName","order":0,"parent_category_id":"814bd3cc-4cd1-4f97-adde-d4d644e9fe78","hidden":false,"icon":"","language":"en"}}}},"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/UpdateCategoryRequest"}]},"examples":{"Updating Category":{"summary":"Request for Updating Category Name.\\n  if you are not using parent_category_id then remove the field.","value":{"name":"UpdatedName","order":0,"parent_category_id":"814bd3cc-4cd1-4f97-adde-d4d644e9fe78","hidden":false,"icon":"","language":"en"}}}},"text/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/UpdateCategoryRequest"}]},"examples":{"Updating Category":{"summary":"Request for Updating Category Name.\\n  if you are not using parent_category_id then remove the field.","value":{"name":"UpdatedName","order":0,"parent_category_id":"814bd3cc-4cd1-4f97-adde-d4d644e9fe78","hidden":false,"icon":"","language":"en"}}}},"application/*+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/UpdateCategoryRequest"}]},"examples":{"Updating Category":{"summary":"Request for Updating Category Name.\\n  if you are not using parent_category_id then remove the field.","value":{"name":"UpdatedName","order":0,"parent_category_id":"814bd3cc-4cd1-4f97-adde-d4d644e9fe78","hidden":false,"icon":"","language":"en"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCategoryResponse"},"examples":{"Successfully Updated Category":{"summary":"Updated Catgory information is shown in this response.","value":{"data":{"id":"68212cec-7a9b-4323-9bb8-33865444a508","name":"UpdatedName","order":0,"icon":""},"extension_data":null,"success":true,"errors":[],"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Non-Empty body is required.":{"summary":"This response is due to an empty request body. \\n Kindly make some body parameters to get success response.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"A non-empty request body is required.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}},"parent_category_id should be removed if its null or empty..":{"summary":"Kindly remove the parent_category_id, it should not be null or empty. \\n if there you need an parent_category_id with another category please add it.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Object reference not set to an instance of an object.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}}}}}}}}},"/v2/Categories/{categoryId}/version/{versionNumber}":{"delete":{"tags":["Categories"],"summary":"Delete category Version","parameters":[{"name":"categoryId","in":"path","description":"The ID of the category","required":true,"schema":{"type":"string"}},{"name":"versionNumber","in":"path","description":"Version number of the category to be deleted","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Successfully Deleted":{"summary":"The category version has been successfully deleted.","value":{"extension_data":null,"success":true,"errors":null,"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Category not found":{"summary":"Kindly verify the Categotry Id and Langauage code, then peroform the task again.","value":{"extension_data":null,"success":true,"errors":[{"extension_data":null,"stack_trace":null,"description":"Invalid CategoryId","error_code":"400","custom_data":null}],"warnings":[],"information":[]}},"Version not found":{"summary":"Kindly verify the version and Langauage code, then peroform the task again.","value":{"extension_data":null,"success":true,"errors":[{"extension_data":null,"stack_trace":null,"description":"Last Version cannot be deleted","error_code":"400","custom_data":null}],"warnings":[],"information":[]}},"Version number invalid":{"summary":"Kindly verify the version number and Langauage code, then peroform the task again.","value":{"extension_data":null,"success":true,"errors":[{"extension_data":null,"stack_trace":null,"description":"Invalid Category Version","error_code":"400","custom_data":null}],"warnings":[],"information":[]}}}}}}},"deprecated":true}},"/v2/Categories/{categoryId}/{langCode}/version/{versionNumber}":{"delete":{"tags":["Categories"],"summary":"Delete category Version","parameters":[{"name":"categoryId","in":"path","description":"The ID of the category","required":true,"schema":{"type":"string"}},{"name":"versionNumber","in":"path","description":"Version number of the category to be deleted","required":true,"schema":{"type":"integer","format":"int32"}},{"name":"langCode","in":"path","description":"Language code of the category","required":true,"schema":{"type":"string","default":"en"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Successfully Deleted":{"summary":"The category version has been successfully deleted.","value":{"extension_data":null,"success":true,"errors":null,"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Category not found":{"summary":"Kindly verify the Categotry Id and Langauage code, then peroform the task again.","value":{"extension_data":null,"success":true,"errors":[{"extension_data":null,"stack_trace":null,"description":"Invalid CategoryId","error_code":"400","custom_data":null}],"warnings":[],"information":[]}},"Version not found":{"summary":"Kindly verify the version and Langauage code, then peroform the task again.","value":{"extension_data":null,"success":true,"errors":[{"extension_data":null,"stack_trace":null,"description":"Last Version cannot be deleted","error_code":"400","custom_data":null}],"warnings":[],"information":[]}},"Version number invalid":{"summary":"Kindly verify the version number and Langauage code, then peroform the task again.","value":{"extension_data":null,"success":true,"errors":[{"extension_data":null,"stack_trace":null,"description":"Invalid Category Version","error_code":"400","custom_data":null}],"warnings":[],"information":[]}}}}}}}}},"/v2/Categories/bulkdelete-category-versions":{"delete":{"tags":["Categories"],"summary":"Delete multiple category versions","parameters":[{"name":"categoryId","in":"query","description":"The ID of the Category","required":true,"schema":{"type":"string"}},{"name":"langCode","in":"query","description":"Language code of the category","required":true,"schema":{"type":"string"}},{"name":"categoryVersionNumbers","in":"query","description":"Array of category version numbers to be deleted","required":true,"schema":{"type":"array","items":{"type":"integer","format":"int32"}}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkDeleteCategoryVersionResponse"}}}}}}},"/v2/Categories/{categoryId}/content/{langCode}":{"get":{"tags":["Categories"],"summary":"Get category page with an ID","parameters":[{"name":"categoryId","in":"path","description":"The ID of the category","required":true,"schema":{"type":"string"}},{"name":"langCode","in":"path","description":"Language code of the category","required":true,"schema":{"type":"string","default":"en"}},{"name":"isForDisplay","in":"query","description":"Set this to true, if you are displaying the category to the end-user. If **true**, the content of snippets or variables appears in the category. Note: If the value is true, ensure that the article content is not passed for *update* category endpoints.","schema":{"type":"boolean","default":false}},{"name":"isPublished","in":"query","description":"To get latest published article, **set isPublished as true.**","schema":{"type":"boolean","default":false}},{"name":"appendSASToken","in":"query","description":"Set this to false to exclude appending SAS token for images/files","schema":{"type":"boolean","default":true}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetCategoryContentResponse"},"examples":{"Success Response":{"summary":"This is an example for get category page succes response. \\n Here you can view diffrent data included with multiple Authors associated with a category page.","value":{"category":{"id":"5b291e6b-fa40-4ab9-941e-f8fffc23b376","title":"IndexPage","content":"Content is the information contained within communication media. This includes internet, cinema, television, radio, audio CDs, books, magazines, physical art, and live event content. It\u2019s directed at an end-user or audience in the sectors of publishing, art, and communication","html_content":"<p>Content is the information contained within communication media. This includes internet, cinema, television, radio, audio CDs, books, magazines, physical art, and live event content. It\u2019s directed at an end-user or audience in the sectors of publishing, art, and communication</p>\n","block_content":null,"parent_category_id":null,"project_document_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","version_number":1,"public_version":1,"latest_version":1,"enable_rtl":true,"hidden":false,"status":0,"created_by":"f11efc6f-e968-4e95-82eb-85ad61559de8","authors":[{"id":"f11efc6f-e968-4e95-82eb-85ad61559de8","first_name":"peter","last_name":"jone","email_id":"peterjone@mail.com","profile_logo_url":"https://www.gravatar.com/avatar/FE29D578CBEC3945FC88BF4F10906A3E?sv=2022-11-02&st=2024-06-18T07%3A12%3A34Z&se=2024-06-18T07%3A32%3A34Z&sr=b&sp=r&sig=LEA2ccLr1hMTZkAE48jsdaTYgRr6jNScPQ4x4E3vTss%3D","user_role":7,"last_login_at":"2024-06-13T14:30:00","unique_user_name":"peter-jone","sso_user_type":0,"is_sso_user":false}],"created_at":"2024-06-13T14:30:00","modified_at":"2024-06-13T14:30:00","slug":"indexpage","is_fall_back_content":true,"stale_status":{"article_stale_status":0,"stale_reason":"","expired_at":"2024-06-13T14:30:00"},"content_type":"Markdown","is_block_editor":false},"extension_data":null,"success":true,"errors":[],"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Category not found":{"summary":"Kindly verify the Categotry Id, version Number and Langauage code, and peroform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Category not found","error_code":"400","custom_data":null}],"warnings":[],"information":[]}},"Version not found":{"summary":"Kindly verify the version Number and language code, and peroform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Category with Id ad6ef117-1e8f-4817-800b-6ed8e2304bf2 with the language code en does not contain version 2","error_code":"400","custom_data":null}],"warnings":[],"information":[]}}}}}}}},"put":{"tags":["Categories"],"summary":"Update a category page content with the ID","parameters":[{"name":"categoryId","in":"path","description":"The ID of the category","required":true,"schema":{"type":"string"}},{"name":"langCode","in":"path","description":"Language code of the category","required":true,"schema":{"type":"string","default":"en"}}],"requestBody":{"description":"","content":{"application/json-patch+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/UpdateCategoryContentCustomerRequest"}]},"examples":{"Successfully Updated Category":{"summary":"Updated Catgory information is shown in this response.","value":{"title":"UpdateTitleForCategoryPage","content":"This is my updated content.","html_content":"<p>This is my updated content,</p>","block_content":"<p>This is my updated content,</p>","version_number":1,"translation_option":"","source":"","updated_by":"f11efc6f-e968-4e95-82eb-85ad61559de8"}}}},"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/UpdateCategoryContentCustomerRequest"}]},"examples":{"Successfully Updated Category":{"summary":"Updated Catgory information is shown in this response.","value":{"title":"UpdateTitleForCategoryPage","content":"This is my updated content.","html_content":"<p>This is my updated content,</p>","block_content":"<p>This is my updated content,</p>","version_number":1,"translation_option":"","source":"","updated_by":"f11efc6f-e968-4e95-82eb-85ad61559de8"}}}},"text/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/UpdateCategoryContentCustomerRequest"}]},"examples":{"Successfully Updated Category":{"summary":"Updated Catgory information is shown in this response.","value":{"title":"UpdateTitleForCategoryPage","content":"This is my updated content.","html_content":"<p>This is my updated content,</p>","block_content":"<p>This is my updated content,</p>","version_number":1,"translation_option":"","source":"","updated_by":"f11efc6f-e968-4e95-82eb-85ad61559de8"}}}},"application/*+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/UpdateCategoryContentCustomerRequest"}]},"examples":{"Successfully Updated Category":{"summary":"Updated Catgory information is shown in this response.","value":{"title":"UpdateTitleForCategoryPage","content":"This is my updated content.","html_content":"<p>This is my updated content,</p>","block_content":"<p>This is my updated content,</p>","version_number":1,"translation_option":"","source":"","updated_by":"f11efc6f-e968-4e95-82eb-85ad61559de8"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCategoryContentCustomerResponse"},"examples":{"Successfully Updated Category":{"summary":"Updated Catgory information is shown in this response.","value":{"data":{"id":"d6f49c75-1eea-4101-bfd4-fd314f57815d","title":"UpdateTitleForCategoryPage","content":"This is my updated content.","html_content":"<p>This is my updated content.</p>\n","block_content":null,"category_id":"d6f49c75-1eea-4101-bfd4-fd314f57815d","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","version_number":2,"public_version":1,"latest_version":2,"enable_rtl":false,"hidden":false,"status":0,"order":0,"created_by":"f11efc6f-e968-4e95-82eb-85ad61559de8","authors":[],"created_at":"2024-06-13T14:30:00","modified_at":"2024-06-13T14:30:00","slug":"updatetitleforcategorypage","is_fall_back_content":false},"extension_data":null,"success":true,"errors":[],"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Non-Empty body is required.":{"summary":"This response is due to an empty request body. \\n Kindly make some body parameters to get success response.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"A non-empty request body is required.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}}}}}}}}},"/v2/Categories/{categoryId}/versions/{versionNumber}":{"get":{"tags":["Categories"],"summary":"Get category page content with an ID","parameters":[{"name":"categoryId","in":"path","description":"The ID of the category","required":true,"schema":{"type":"string"}},{"name":"versionNumber","in":"path","description":"Version number of the category","required":true,"schema":{"type":"integer","format":"int32"}},{"name":"isForDisplay","in":"query","description":"Set this to true, if you are displaying the category to the end-user. If true, the content of snippets or variables appears in the category. Note: If the value is true, ensure that the category content is not passed for update category endpoints.","schema":{"type":"boolean","default":false}},{"name":"appendSASToken","in":"query","description":"Set this to false to exclude appending SAS token for images/files","schema":{"type":"boolean","default":true}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetCategoryContentResponse"},"examples":{"Success Response":{"summary":"This is an sample category data by category version.","value":{"category":{"id":"5b291e6b-fa40-4ab9-941e-f8fffc23b376","title":"IndexPage","content":"Content is the information contained within communication media. This includes internet, cinema, television, radio, audio CDs, books, magazines, physical art, and live event content. It\u2019s directed at an end-user or audience in the sectors of publishing, art, and communication","html_content":"<p>Content is the information contained within communication media. This includes internet, cinema, television, radio, audio CDs, books, magazines, physical art, and live event content. It\u2019s directed at an end-user or audience in the sectors of publishing, art, and communication</p>\n","block_content":null,"parent_category_id":null,"project_document_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","version_number":1,"public_version":1,"latest_version":1,"enable_rtl":true,"hidden":false,"status":0,"created_by":"f11efc6f-e968-4e95-82eb-85ad61559de8","authors":[{"id":"f11efc6f-e968-4e95-82eb-85ad61559de8","first_name":"peter","last_name":"jone","email_id":"peterjone@mail.com","profile_logo_url":"https://www.gravatar.com/avatar/FE29D578CBEC3945FC88BF4F10906A3E?sv=2022-11-02&st=2024-06-18T07%3A12%3A34Z&se=2024-06-18T07%3A32%3A34Z&sr=b&sp=r&sig=LEA2ccLr1hMTZkAE48jsdaTYgRr6jNScPQ4x4E3vTss%3D","user_role":7,"last_login_at":"2024-06-13T14:30:00","unique_user_name":"peter-jone","sso_user_type":0,"is_sso_user":false}],"created_at":"2024-06-13T14:30:00","modified_at":"2024-06-13T14:30:00","slug":"indexpage","is_fall_back_content":true,"stale_status":{"article_stale_status":0,"stale_reason":"","expired_at":"2024-06-13T14:30:00"},"content_type":"Markdown","is_block_editor":false},"extension_data":null,"success":false,"errors":null,"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Category not found":{"summary":"Kindly verify the Categotry Id and Langauage code, and peroform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Category not found","error_code":"400","custom_data":null}],"warnings":[],"information":[]}},"Version not found":{"summary":"Kindly verify the version Id and Langauage code, and peroform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Category with Id ad6ef117-1e8f-4817-800b-6ed8e2304bf2 with the language code en does not contain version 2","error_code":"400","custom_data":null}],"warnings":[],"information":[]}}}}}}},"deprecated":true}},"/v2/Categories/{categoryId}/versions/{langCode}/{versionNumber}":{"get":{"tags":["Categories"],"summary":"Get category page content with an ID","parameters":[{"name":"categoryId","in":"path","description":"The ID of the category","required":true,"schema":{"type":"string"}},{"name":"versionNumber","in":"path","description":"Version number of the category","required":true,"schema":{"type":"integer","format":"int32"}},{"name":"langCode","in":"path","description":"Language code of the category","required":true,"schema":{"type":"string","default":"en"}},{"name":"isForDisplay","in":"query","description":"Set this to true, if you are displaying the category to the end-user. If true, the content of snippets or variables appears in the category. Note: If the value is true, ensure that the category content is not passed for update category endpoints.","schema":{"type":"boolean","default":false}},{"name":"appendSASToken","in":"query","description":"Set this to false to exclude appending SAS token for images/files","schema":{"type":"boolean","default":true}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetCategoryContentResponse"},"examples":{"Success Response":{"summary":"This is an sample category data by category version.","value":{"category":{"id":"5b291e6b-fa40-4ab9-941e-f8fffc23b376","title":"IndexPage","content":"Content is the information contained within communication media. This includes internet, cinema, television, radio, audio CDs, books, magazines, physical art, and live event content. It\u2019s directed at an end-user or audience in the sectors of publishing, art, and communication","html_content":"<p>Content is the information contained within communication media. This includes internet, cinema, television, radio, audio CDs, books, magazines, physical art, and live event content. It\u2019s directed at an end-user or audience in the sectors of publishing, art, and communication</p>\n","block_content":null,"parent_category_id":null,"project_document_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","version_number":1,"public_version":1,"latest_version":1,"enable_rtl":true,"hidden":false,"status":0,"created_by":"f11efc6f-e968-4e95-82eb-85ad61559de8","authors":[{"id":"f11efc6f-e968-4e95-82eb-85ad61559de8","first_name":"peter","last_name":"jone","email_id":"peterjone@mail.com","profile_logo_url":"https://www.gravatar.com/avatar/FE29D578CBEC3945FC88BF4F10906A3E?sv=2022-11-02&st=2024-06-18T07%3A12%3A34Z&se=2024-06-18T07%3A32%3A34Z&sr=b&sp=r&sig=LEA2ccLr1hMTZkAE48jsdaTYgRr6jNScPQ4x4E3vTss%3D","user_role":7,"last_login_at":"2024-06-13T14:30:00","unique_user_name":"peter-jone","sso_user_type":0,"is_sso_user":false}],"created_at":"2024-06-13T14:30:00","modified_at":"2024-06-13T14:30:00","slug":"indexpage","is_fall_back_content":true,"stale_status":{"article_stale_status":0,"stale_reason":"","expired_at":"2024-06-13T14:30:00"},"content_type":"Markdown","is_block_editor":false},"extension_data":null,"success":false,"errors":null,"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Category not found":{"summary":"Kindly verify the Categotry Id and Langauage code, and peroform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Category not found","error_code":"400","custom_data":null}],"warnings":[],"information":[]}},"Version not found":{"summary":"Kindly verify the version Id and Langauage code, and peroform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Category with Id ad6ef117-1e8f-4817-800b-6ed8e2304bf2 with the language code en does not contain version 2","error_code":"400","custom_data":null}],"warnings":[],"information":[]}}}}}}}}},"/v2/Categories/{categoryId}/versions":{"get":{"tags":["Categories"],"summary":"Get category page versions","parameters":[{"name":"categoryId","in":"path","description":"The ID of the category","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetCategoryVersionsResponse"},"examples":{"Success response":{"summary":"Success response for getting category page with version.","value":{"versions":[{"version_number":1,"created_by":null,"created_at":"2024-06-13T14:30:00","modified_at":"2024-06-13T14:30:00","base_version":0,"status":0,"profile_url":"https://www.gravatar.com/avatar/FE29D578CBEC3945FC88BF4F10906A3E"}],"extension_data":null,"success":true,"errors":null,"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Category not found":{"summary":"Kindly verify the Categotry Id and Langauage code, and peroform the task again.","value":{"extension_data":null,"success":true,"errors":[{"extension_data":null,"stack_trace":null,"description":"Category not found","error_code":"400","custom_data":null}],"warnings":[],"information":[]}}}}}}},"deprecated":true}},"/v2/Categories/{categoryId}/{langCode}versions":{"get":{"tags":["Categories"],"summary":"Get category page versions","parameters":[{"name":"categoryId","in":"path","description":"The ID of the category","required":true,"schema":{"type":"string"}},{"name":"langCode","in":"path","description":"Language code of the category","required":true,"schema":{"type":"string","default":"en"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetCategoryVersionsResponse"},"examples":{"Success response":{"summary":"Success response for getting category page with version.","value":{"versions":[{"version_number":1,"created_by":null,"created_at":"2024-06-13T14:30:00","modified_at":"2024-06-13T14:30:00","base_version":0,"status":0,"profile_url":"https://www.gravatar.com/avatar/FE29D578CBEC3945FC88BF4F10906A3E"}],"extension_data":null,"success":true,"errors":null,"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Category not found":{"summary":"Kindly verify the Categotry Id and Langauage code, and peroform the task again.","value":{"extension_data":null,"success":true,"errors":[{"extension_data":null,"stack_trace":null,"description":"Category not found","error_code":"400","custom_data":null}],"warnings":[],"information":[]}}}}}}}}},"/v2/Categories/{categoryId}/settings":{"get":{"tags":["Categories"],"summary":"Get settings for the Category","parameters":[{"name":"categoryId","in":"path","description":"The ID of the category","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetCategorySettingsResponse"},"examples":{"Success Response":{"summary":"Getting settings status for category.","value":{"data":{"slug":"indexpage","seo_title":"IndexPage","description":null,"allow_comments":true,"show_table_of_contents":true,"featured_image_url":null,"tags":[],"status_indicator":0,"status_indicator_expiry_date":null,"exclude_from_search":false,"exclude_from_ai_search":false,"related_articles":[],"content_type":0,"is_acknowledgement_enabled":false},"extension_data":null,"success":true,"errors":[],"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Category not found":{"summary":"Kindly verify the Categotry Id and Langauage code, and peroform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Category not found","error_code":"400","custom_data":null}],"warnings":[],"information":[]}}}}}}},"deprecated":true},"put":{"tags":["Categories"],"summary":"Update settings for the category","parameters":[{"name":"categoryId","in":"path","description":"The ID of the category","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"","content":{"application/json-patch+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/UpdateArticleSettingsRequest"}]},"examples":{"Non-Empty body is required.":{"summary":"This response is due to an empty request body. \\n Kindly make some body parameters to get success response.","value":{"slug":"updatedslug","seo_title":"updatedSeoTitle","description":"This is the description in updating category settings.","allow_comments":true,"show_table_of_contents":true,"tags":[],"status_indicator":1,"status_indicator_expiry_date":"2024-06-13T14:30:00","exclude_from_search":true,"exclude_from_ai_search":false,"related_articles":[],"content_type":0,"is_acknowledgement_enabled":false}}}},"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/UpdateArticleSettingsRequest"}]},"examples":{"Non-Empty body is required.":{"summary":"This response is due to an empty request body. \\n Kindly make some body parameters to get success response.","value":{"slug":"updatedslug","seo_title":"updatedSeoTitle","description":"This is the description in updating category settings.","allow_comments":true,"show_table_of_contents":true,"tags":[],"status_indicator":1,"status_indicator_expiry_date":"2024-06-13T14:30:00","exclude_from_search":true,"exclude_from_ai_search":false,"related_articles":[],"content_type":0,"is_acknowledgement_enabled":false}}}},"text/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/UpdateArticleSettingsRequest"}]},"examples":{"Non-Empty body is required.":{"summary":"This response is due to an empty request body. \\n Kindly make some body parameters to get success response.","value":{"slug":"updatedslug","seo_title":"updatedSeoTitle","description":"This is the description in updating category settings.","allow_comments":true,"show_table_of_contents":true,"tags":[],"status_indicator":1,"status_indicator_expiry_date":"2024-06-13T14:30:00","exclude_from_search":true,"exclude_from_ai_search":false,"related_articles":[],"content_type":0,"is_acknowledgement_enabled":false}}}},"application/*+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/UpdateArticleSettingsRequest"}]},"examples":{"Non-Empty body is required.":{"summary":"This response is due to an empty request body. \\n Kindly make some body parameters to get success response.","value":{"slug":"updatedslug","seo_title":"updatedSeoTitle","description":"This is the description in updating category settings.","allow_comments":true,"show_table_of_contents":true,"tags":[],"status_indicator":1,"status_indicator_expiry_date":"2024-06-13T14:30:00","exclude_from_search":true,"exclude_from_ai_search":false,"related_articles":[],"content_type":0,"is_acknowledgement_enabled":false}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetCategorySettingsResponse"},"examples":{"Successfully updated the setings.":{"summary":"This response indicate a category settings has been successfully updated.","value":{"data":null,"extension_data":null,"success":false,"errors":[],"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Category Not Found.":{"summary":"Kindly verifty the category Id or the langCode, and perform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":".Category not found","error_code":"400","custom_data":null}],"warnings":[],"information":[]}},"Non-Empty body is required.":{"summary":"This response is due to an empty request body. \\n Kindly make some body parameters to get success response.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"A non-empty request body is required.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}}}}}}}}},"/v2/Categories/{categoryId}/{langCode}/settings":{"get":{"tags":["Categories"],"summary":"Get settings for the Category","parameters":[{"name":"categoryId","in":"path","description":"The ID of the category","required":true,"schema":{"type":"string"}},{"name":"langCode","in":"path","description":"Language code of the category","required":true,"schema":{"type":"string","default":"en"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetCategorySettingsResponse"},"examples":{"Success Response":{"summary":"Getting settings status for category.","value":{"data":{"slug":"indexpage","seo_title":"IndexPage","description":null,"allow_comments":true,"show_table_of_contents":true,"featured_image_url":null,"tags":[],"status_indicator":0,"status_indicator_expiry_date":null,"exclude_from_search":false,"exclude_from_ai_search":false,"related_articles":[],"content_type":0,"is_acknowledgement_enabled":false},"extension_data":null,"success":true,"errors":[],"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Category not found":{"summary":"Kindly verify the Categotry Id and Langauage code, and peroform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Category not found","error_code":"400","custom_data":null}],"warnings":[],"information":[]}}}}}}}},"put":{"tags":["Categories"],"summary":"Update settings for the category","parameters":[{"name":"categoryId","in":"path","description":"The ID of the category","required":true,"schema":{"type":"string"}},{"name":"langCode","in":"path","description":"Language code of the category","required":true,"schema":{"type":"string","default":"en"}}],"requestBody":{"description":"","content":{"application/json-patch+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/UpdateArticleSettingsRequest"}]},"examples":{"Non-Empty body is required.":{"summary":"This response is due to an empty request body. \\n Kindly make some body parameters to get success response.","value":{"slug":"updatedslug","seo_title":"updatedSeoTitle","description":"This is the description in updating category settings.","allow_comments":true,"show_table_of_contents":true,"tags":[],"status_indicator":1,"status_indicator_expiry_date":"2024-06-13T14:30:00","exclude_from_search":true,"exclude_from_ai_search":false,"related_articles":[],"content_type":0,"is_acknowledgement_enabled":false}}}},"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/UpdateArticleSettingsRequest"}]},"examples":{"Non-Empty body is required.":{"summary":"This response is due to an empty request body. \\n Kindly make some body parameters to get success response.","value":{"slug":"updatedslug","seo_title":"updatedSeoTitle","description":"This is the description in updating category settings.","allow_comments":true,"show_table_of_contents":true,"tags":[],"status_indicator":1,"status_indicator_expiry_date":"2024-06-13T14:30:00","exclude_from_search":true,"exclude_from_ai_search":false,"related_articles":[],"content_type":0,"is_acknowledgement_enabled":false}}}},"text/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/UpdateArticleSettingsRequest"}]},"examples":{"Non-Empty body is required.":{"summary":"This response is due to an empty request body. \\n Kindly make some body parameters to get success response.","value":{"slug":"updatedslug","seo_title":"updatedSeoTitle","description":"This is the description in updating category settings.","allow_comments":true,"show_table_of_contents":true,"tags":[],"status_indicator":1,"status_indicator_expiry_date":"2024-06-13T14:30:00","exclude_from_search":true,"exclude_from_ai_search":false,"related_articles":[],"content_type":0,"is_acknowledgement_enabled":false}}}},"application/*+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/UpdateArticleSettingsRequest"}]},"examples":{"Non-Empty body is required.":{"summary":"This response is due to an empty request body. \\n Kindly make some body parameters to get success response.","value":{"slug":"updatedslug","seo_title":"updatedSeoTitle","description":"This is the description in updating category settings.","allow_comments":true,"show_table_of_contents":true,"tags":[],"status_indicator":1,"status_indicator_expiry_date":"2024-06-13T14:30:00","exclude_from_search":true,"exclude_from_ai_search":false,"related_articles":[],"content_type":0,"is_acknowledgement_enabled":false}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetCategorySettingsResponse"},"examples":{"Successfully updated the setings.":{"summary":"This response indicate a category settings has been successfully updated.","value":{"data":null,"extension_data":null,"success":false,"errors":[],"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Category Not Found.":{"summary":"Kindly verifty the category Id or the langCode, and perform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":".Category not found","error_code":"400","custom_data":null}],"warnings":[],"information":[]}},"Non-Empty body is required.":{"summary":"This response is due to an empty request body. \\n Kindly make some body parameters to get success response.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"A non-empty request body is required.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}}}}}}}}},"/v2/Categories":{"post":{"tags":["Categories"],"summary":"Adds a new category","requestBody":{"description":"","content":{"application/json-patch+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/AddCategoryRequest"}]},"examples":{"Create a new Category as Folder.":{"summary":"Add Name, Project_Version_Id, order, category_type, and user_id to create a new category. This is an example for category_type as Folder.","value":{"name":"New Category","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"parent_category_id":null,"content":null,"category_type":0,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null}},"Create a new Category as Page .":{"summary":"Add Name, Project_Version_Id, order, category_type, and user_id to create a new category. This is an example for category_type as Page.","value":{"name":"New Category","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"parent_category_id":null,"content":null,"category_type":1,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null}},"Create a new Category as Index.":{"summary":"Add Name, Project_Version_Id, order, category_type, and user_id to create a new category. This is an example for category_type as  Index.","value":{"name":"New Category","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"parent_category_id":null,"content":null,"category_type":2,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null}}}},"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/AddCategoryRequest"}]},"examples":{"Create a new Category as Folder.":{"summary":"Add Name, Project_Version_Id, order, category_type, and user_id to create a new category. This is an example for category_type as Folder.","value":{"name":"New Category","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"parent_category_id":null,"content":null,"category_type":0,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null}},"Create a new Category as Page .":{"summary":"Add Name, Project_Version_Id, order, category_type, and user_id to create a new category. This is an example for category_type as Page.","value":{"name":"New Category","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"parent_category_id":null,"content":null,"category_type":1,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null}},"Create a new Category as Index.":{"summary":"Add Name, Project_Version_Id, order, category_type, and user_id to create a new category. This is an example for category_type as  Index.","value":{"name":"New Category","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"parent_category_id":null,"content":null,"category_type":2,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null}}}},"text/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/AddCategoryRequest"}]},"examples":{"Create a new Category as Folder.":{"summary":"Add Name, Project_Version_Id, order, category_type, and user_id to create a new category. This is an example for category_type as Folder.","value":{"name":"New Category","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"parent_category_id":null,"content":null,"category_type":0,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null}},"Create a new Category as Page .":{"summary":"Add Name, Project_Version_Id, order, category_type, and user_id to create a new category. This is an example for category_type as Page.","value":{"name":"New Category","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"parent_category_id":null,"content":null,"category_type":1,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null}},"Create a new Category as Index.":{"summary":"Add Name, Project_Version_Id, order, category_type, and user_id to create a new category. This is an example for category_type as  Index.","value":{"name":"New Category","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"parent_category_id":null,"content":null,"category_type":2,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null}}}},"application/*+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/AddCategoryRequest"}]},"examples":{"Create a new Category as Folder.":{"summary":"Add Name, Project_Version_Id, order, category_type, and user_id to create a new category. This is an example for category_type as Folder.","value":{"name":"New Category","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"parent_category_id":null,"content":null,"category_type":0,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null}},"Create a new Category as Page .":{"summary":"Add Name, Project_Version_Id, order, category_type, and user_id to create a new category. This is an example for category_type as Page.","value":{"name":"New Category","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"parent_category_id":null,"content":null,"category_type":1,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null}},"Create a new Category as Index.":{"summary":"Add Name, Project_Version_Id, order, category_type, and user_id to create a new category. This is an example for category_type as  Index.","value":{"name":"New Category","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"parent_category_id":null,"content":null,"category_type":2,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddCategoryResponse"},"examples":{"Successfully Created the Category":{"summary":"Here you can find the Category Id and category name to navigate.","value":{"data":{"id":"df574e5a-8015-428f-ac33-cad428d1230c","name":"New Category","order":0,"icon":null},"extension_data":null,"success":true,"errors":null,"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Invalid Category project_version_id Parameters":{"summary":"Kindly verify the project_version_id, and peroform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"The supplied project version id 46fvf48bc7-760f-4b07-b2d2-fce4aa8ba234 does not exist in your project","error_code":"400","custom_data":null}],"warnings":[],"information":[]}},"Empty project_version_id Parameters":{"summary":"Kindly verify the project_version_id is not empty, and peroform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"The ProjectVersionId field is required.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}},"Invalid Category Name Parameter":{"summary":"Kindly verify the Name, and peroform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"The Name field is required.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}}}}}}}}},"/v2/Categories/bulkcreate":{"post":{"tags":["Categories"],"summary":"Adds multiple Categories","requestBody":{"description":"","content":{"application/json-patch+json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AddCategoryRequest"}},"examples":{"Create a new Category as Folder.":{"summary":"Add Name, Project_Version_Id, order, category_type, and user_id to create a new category. This is an example for category_type as Folder.","value":[{"name":"New Category 1","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"parent_category_id":null,"content":null,"category_type":0,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null},{"name":"New Category 2","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"parent_category_id":null,"content":null,"category_type":0,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null}]},"Create a new Category as Page.":{"summary":"Add Name, Project_Version_Id, order, category_type, and user_id to create a new category. This is an example for category_type as Page.","value":[{"name":"New Category 1","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"parent_category_id":null,"content":null,"category_type":1,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null},{"name":"New Category 2","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"parent_category_id":null,"content":null,"category_type":1,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null}]},"Create a new Category as Index.":{"summary":"Add Name, Project_Version_Id, order, category_type, and user_id to create a new category. This is an example for category_type as Index.","value":[{"name":"New Category 1","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"parent_category_id":null,"content":null,"category_type":2,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null},{"name":"New Category 2","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"parent_category_id":null,"content":null,"category_type":2,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null}]}}},"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AddCategoryRequest"}},"examples":{"Create a new Category as Folder.":{"summary":"Add Name, Project_Version_Id, order, category_type, and user_id to create a new category. This is an example for category_type as Folder.","value":[{"name":"New Category 1","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"parent_category_id":null,"content":null,"category_type":0,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null},{"name":"New Category 2","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"parent_category_id":null,"content":null,"category_type":0,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null}]},"Create a new Category as Page.":{"summary":"Add Name, Project_Version_Id, order, category_type, and user_id to create a new category. This is an example for category_type as Page.","value":[{"name":"New Category 1","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"parent_category_id":null,"content":null,"category_type":1,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null},{"name":"New Category 2","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"parent_category_id":null,"content":null,"category_type":1,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null}]},"Create a new Category as Index.":{"summary":"Add Name, Project_Version_Id, order, category_type, and user_id to create a new category. This is an example for category_type as Index.","value":[{"name":"New Category 1","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"parent_category_id":null,"content":null,"category_type":2,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null},{"name":"New Category 2","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"parent_category_id":null,"content":null,"category_type":2,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null}]}}},"text/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AddCategoryRequest"}},"examples":{"Create a new Category as Folder.":{"summary":"Add Name, Project_Version_Id, order, category_type, and user_id to create a new category. This is an example for category_type as Folder.","value":[{"name":"New Category 1","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"parent_category_id":null,"content":null,"category_type":0,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null},{"name":"New Category 2","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"parent_category_id":null,"content":null,"category_type":0,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null}]},"Create a new Category as Page.":{"summary":"Add Name, Project_Version_Id, order, category_type, and user_id to create a new category. This is an example for category_type as Page.","value":[{"name":"New Category 1","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"parent_category_id":null,"content":null,"category_type":1,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null},{"name":"New Category 2","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"parent_category_id":null,"content":null,"category_type":1,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null}]},"Create a new Category as Index.":{"summary":"Add Name, Project_Version_Id, order, category_type, and user_id to create a new category. This is an example for category_type as Index.","value":[{"name":"New Category 1","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"parent_category_id":null,"content":null,"category_type":2,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null},{"name":"New Category 2","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"parent_category_id":null,"content":null,"category_type":2,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null}]}}},"application/*+json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AddCategoryRequest"}},"examples":{"Create a new Category as Folder.":{"summary":"Add Name, Project_Version_Id, order, category_type, and user_id to create a new category. This is an example for category_type as Folder.","value":[{"name":"New Category 1","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"parent_category_id":null,"content":null,"category_type":0,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null},{"name":"New Category 2","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"parent_category_id":null,"content":null,"category_type":0,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null}]},"Create a new Category as Page.":{"summary":"Add Name, Project_Version_Id, order, category_type, and user_id to create a new category. This is an example for category_type as Page.","value":[{"name":"New Category 1","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"parent_category_id":null,"content":null,"category_type":1,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null},{"name":"New Category 2","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"parent_category_id":null,"content":null,"category_type":1,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null}]},"Create a new Category as Index.":{"summary":"Add Name, Project_Version_Id, order, category_type, and user_id to create a new category. This is an example for category_type as Index.","value":[{"name":"New Category 1","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"parent_category_id":null,"content":null,"category_type":2,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null},{"name":"New Category 2","project_version_id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","order":0,"parent_category_id":null,"content":null,"category_type":2,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","content_type":null}]}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkCreateCategoryResponse"},"examples":{"Update article wth article Id":{"summary":"Update the article with needed information such as title, content, html_content, category_id, hidden, version_number, translation_option, and source.","value":{"data":[{"category_id":"b1a857d9-ecbc-4ab3-a0cb-ed22267ec999","success":true,"details":"Successfully created category New Category 1"},{"category_id":"975a72df-a8b6-4a4e-8081-be9baddd0467","success":true,"details":"Successfully created category New Category 2"}],"extension_data":null,"success":true,"errors":[],"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"No Category created":{"summary":"Kindly add some data to create category.","value":{"extension_data":null,"success":true,"errors":[],"warnings":[],"information":[]}},"Empty project_version_id Parameters":{"summary":"Kindly verify the project_version_id is not empty, and peroform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"The ProjectVersionId field is required.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}},"Invalid Category Name Parameter":{"summary":"Kindly verify the Name, and peroform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"The Name field is required.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}}}}}}}}},"/v2/Categories/{categoryId}/publish":{"post":{"tags":["Categories"],"summary":"Publishes an category with an id","parameters":[{"name":"categoryId","in":"path","description":"The ID of the category","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"","content":{"application/json-patch+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/PublishCategoryRequest"}]},"examples":{"Publish Category Request Example":{"summary":"This is an basic example for publish category. UserId and VersionNumber are mandatory.","value":{"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","version_number":1,"publish_message":"Successfully Published"}}}},"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/PublishCategoryRequest"}]},"examples":{"Publish Category Request Example":{"summary":"This is an basic example for publish category. UserId and VersionNumber are mandatory.","value":{"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","version_number":1,"publish_message":"Successfully Published"}}}},"text/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/PublishCategoryRequest"}]},"examples":{"Publish Category Request Example":{"summary":"This is an basic example for publish category. UserId and VersionNumber are mandatory.","value":{"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","version_number":1,"publish_message":"Successfully Published"}}}},"application/*+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/PublishCategoryRequest"}]},"examples":{"Publish Category Request Example":{"summary":"This is an basic example for publish category. UserId and VersionNumber are mandatory.","value":{"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","version_number":1,"publish_message":"Successfully Published"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkCreateCategoryResponse"},"examples":{"Successfully Published Category":{"summary":"Category page\t\t","value":{"extension_data":null,"success":true,"errors":[],"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"CategoryId not found":{"summary":"kindly verify the CategoryId and perform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Category not found.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}},"version_number not found":{"summary":"kindly verify the version_number and perform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"The field VersionNumber must be between 1 and 32767.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}},"user_id not found":{"summary":"Kindly verify the user_id nad perform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"The UserId field is required.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}}}}}}},"deprecated":true}},"/v2/Categories/{categoryId}/{langCode}/publish":{"post":{"tags":["Categories"],"summary":"Publishes an category with an id","parameters":[{"name":"categoryId","in":"path","description":"The ID of the category","required":true,"schema":{"type":"string"}},{"name":"langCode","in":"path","description":"Language code of the category","required":true,"schema":{"type":"string","default":"en"}}],"requestBody":{"description":"","content":{"application/json-patch+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/PublishCategoryRequest"}]},"examples":{"Publish Category Request Example":{"summary":"This is an basic example for publish category. UserId and VersionNumber are mandatory.","value":{"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","version_number":1,"publish_message":"Successfully Published"}}}},"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/PublishCategoryRequest"}]},"examples":{"Publish Category Request Example":{"summary":"This is an basic example for publish category. UserId and VersionNumber are mandatory.","value":{"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","version_number":1,"publish_message":"Successfully Published"}}}},"text/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/PublishCategoryRequest"}]},"examples":{"Publish Category Request Example":{"summary":"This is an basic example for publish category. UserId and VersionNumber are mandatory.","value":{"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","version_number":1,"publish_message":"Successfully Published"}}}},"application/*+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/PublishCategoryRequest"}]},"examples":{"Publish Category Request Example":{"summary":"This is an basic example for publish category. UserId and VersionNumber are mandatory.","value":{"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","version_number":1,"publish_message":"Successfully Published"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkCreateCategoryResponse"},"examples":{"Successfully Published Category":{"summary":"Category page\t\t","value":{"extension_data":null,"success":true,"errors":[],"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"CategoryId not found":{"summary":"kindly verify the CategoryId and perform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Category not found.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}},"version_number not found":{"summary":"kindly verify the version_number and perform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"The field VersionNumber must be between 1 and 32767.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}},"user_id not found":{"summary":"Kindly verify the user_id nad perform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"The UserId field is required.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}}}}}}}}},"/v2/Categories/bulkpublish/{langCode}":{"post":{"tags":["Categories"],"summary":"Publishes multiple categories","parameters":[{"name":"langCode","in":"path","description":"Language code of the category","required":true,"schema":{"type":"string","default":"en"}}],"requestBody":{"description":"","content":{"application/json-patch+json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BulkPublishCategory"}},"examples":{"Published Category Request":{"summary":"Category page has published successfully. the category_id, user_id, and version_number are mandatory.","value":[{"category_id":"152e9239-1a5a-4044-b5de-1030f49976b6s","user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","version_number":1,"publish_message":"Publish Success"},{"category_id":"gr32e9239-1a5a-4044-b5de-1030f499fe6sr","user_id":"edr1efc6f-e968-4e95-82eb-ccad61559deef3","version_number":1,"publish_message":"Publish Success"}]}}},"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BulkPublishCategory"}},"examples":{"Published Category Request":{"summary":"Category page has published successfully. the category_id, user_id, and version_number are mandatory.","value":[{"category_id":"152e9239-1a5a-4044-b5de-1030f49976b6s","user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","version_number":1,"publish_message":"Publish Success"},{"category_id":"gr32e9239-1a5a-4044-b5de-1030f499fe6sr","user_id":"edr1efc6f-e968-4e95-82eb-ccad61559deef3","version_number":1,"publish_message":"Publish Success"}]}}},"text/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BulkPublishCategory"}},"examples":{"Published Category Request":{"summary":"Category page has published successfully. the category_id, user_id, and version_number are mandatory.","value":[{"category_id":"152e9239-1a5a-4044-b5de-1030f49976b6s","user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","version_number":1,"publish_message":"Publish Success"},{"category_id":"gr32e9239-1a5a-4044-b5de-1030f499fe6sr","user_id":"edr1efc6f-e968-4e95-82eb-ccad61559deef3","version_number":1,"publish_message":"Publish Success"}]}}},"application/*+json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BulkPublishCategory"}},"examples":{"Published Category Request":{"summary":"Category page has published successfully. the category_id, user_id, and version_number are mandatory.","value":[{"category_id":"152e9239-1a5a-4044-b5de-1030f49976b6s","user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","version_number":1,"publish_message":"Publish Success"},{"category_id":"gr32e9239-1a5a-4044-b5de-1030f499fe6sr","user_id":"edr1efc6f-e968-4e95-82eb-ccad61559deef3","version_number":1,"publish_message":"Publish Success"}]}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkPublishCategoryResponse"},"examples":{"Successfully Published Category":{"summary":"Category page\t\t","value":{"data":[{"category_id":"152e9239-1a5a-4044-b5de-1030f49976b6s","success":true,"details":"Bulk Publish Success"},{"category_id":"gr32e9239-1a5a-4044-b5de-1030f499fe6sr","success":true,"details":"Bulk Publish Success"}],"extension_data":null,"success":true,"errors":[],"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"category_id not found":{"summary":"Kindly verify the category_id and perform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"The CategoryId field is required.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}},"user_id not found":{"summary":"Kindly verify the user_id and perform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"The UserId field is required.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}},"version_number not found":{"summary":"Kindly verify the version_number and perform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"The field VersionNumber must be between 1 and 32767.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}}}}}}}}},"/v2/Categories/bulkupdateContent":{"put":{"tags":["Categories"],"summary":"Update multiple page categories","requestBody":{"description":"","content":{"application/json-patch+json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UpdateCategoryContentRequest"}},"examples":{"Update multiple page category ":{"summary":"Update multiple page category. Kindly for the needed page category for the bulk updation. you can find the updated_by (user id) from /V2/Teams Get Method.","value":[{"category_id":"152e9239-1a5a-4044-b5de-1030f49976b6","lang_code":"en","title":"New Name","content":"No new content","html_content":"<p>No new content</p>","block_content":"<p>No new content</p>","version_number":2,"translation_option":null,"source":null,"updated_by":"f11efc6f-e968-4e95-82eb-85ad61559de8"}]}}},"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UpdateCategoryContentRequest"}},"examples":{"Update multiple page category ":{"summary":"Update multiple page category. Kindly for the needed page category for the bulk updation. you can find the updated_by (user id) from /V2/Teams Get Method.","value":[{"category_id":"152e9239-1a5a-4044-b5de-1030f49976b6","lang_code":"en","title":"New Name","content":"No new content","html_content":"<p>No new content</p>","block_content":"<p>No new content</p>","version_number":2,"translation_option":null,"source":null,"updated_by":"f11efc6f-e968-4e95-82eb-85ad61559de8"}]}}},"text/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UpdateCategoryContentRequest"}},"examples":{"Update multiple page category ":{"summary":"Update multiple page category. Kindly for the needed page category for the bulk updation. you can find the updated_by (user id) from /V2/Teams Get Method.","value":[{"category_id":"152e9239-1a5a-4044-b5de-1030f49976b6","lang_code":"en","title":"New Name","content":"No new content","html_content":"<p>No new content</p>","block_content":"<p>No new content</p>","version_number":2,"translation_option":null,"source":null,"updated_by":"f11efc6f-e968-4e95-82eb-85ad61559de8"}]}}},"application/*+json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UpdateCategoryContentRequest"}},"examples":{"Update multiple page category ":{"summary":"Update multiple page category. Kindly for the needed page category for the bulk updation. you can find the updated_by (user id) from /V2/Teams Get Method.","value":[{"category_id":"152e9239-1a5a-4044-b5de-1030f49976b6","lang_code":"en","title":"New Name","content":"No new content","html_content":"<p>No new content</p>","block_content":"<p>No new content</p>","version_number":2,"translation_option":null,"source":null,"updated_by":"f11efc6f-e968-4e95-82eb-85ad61559de8"}]}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkUpdateCategoryContentResponse"},"examples":{"Bulk Update Successful":{"summary":"You can find all the updated Category page details below.","value":{"data":[{"category_id":"152e9239-1a5a-4044-b5de-1030f49976b6","success":true,"details":"Successfully updated category with an id 152e9239-1a5a-4044-b5de-1030f49976b6"}],"extension_data":null,"success":true,"errors":[],"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Category not Found":{"summary":"The enhtered categoryId is not valid. Kindly verify the categoryId and perform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Failed to update category with an id 152e9239-1a5a-044-b5de-103f49976b6\r\nError: Category not found' does not exist in your project.","error_code":"400","custom_data":null}],"warnings":[],"information":[]}},"UserId not Found":{"summary":"The user_id is not found. kindly verify the updated_by (user id) from /V2/Teams Get Method","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Failed to update category with an id 152e9239-1a5a-4044-b5de-1030f49976b6\r\nError: The user with id '6f-e968-4e95-82eb-85ad61559de8' does not exist in your project.","error_code":null,"custom_data":null}],"warnings":[],"information":[]}}}}}}}}},"/v2/Categories/{categoryId}/fork":{"put":{"tags":["Categories"],"summary":"Fork category page with an id","parameters":[{"name":"categoryId","in":"path","description":"ID of the category","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"","content":{"application/json-patch+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ForkCategoryVersionRequest"}]},"examples":{"Fork category page with Id":{"summary":"Fork category page with current version_number, user_id and lang_code.","value":{"version_number":1,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","lang_code":"en"}}}},"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ForkCategoryVersionRequest"}]},"examples":{"Fork category page with Id":{"summary":"Fork category page with current version_number, user_id and lang_code.","value":{"version_number":1,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","lang_code":"en"}}}},"text/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ForkCategoryVersionRequest"}]},"examples":{"Fork category page with Id":{"summary":"Fork category page with current version_number, user_id and lang_code.","value":{"version_number":1,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","lang_code":"en"}}}},"application/*+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ForkCategoryVersionRequest"}]},"examples":{"Fork category page with Id":{"summary":"Fork category page with current version_number, user_id and lang_code.","value":{"version_number":1,"user_id":"f11efc6f-e968-4e95-82eb-85ad61559de8","lang_code":"en"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForkCategoryVersionResponse"},"examples":{"Fork category page with Id":{"summary":"Fork category page with current version_number, user_id and lang_code.","value":{"data":{"version_number":2,"created_by":"peter jone","created_at":"2024-06-13T14:30:00","modified_at":"2024-06-13T14:30:00","base_version":1,"status":0,"profile_url":"https://www.gravatar.com/avatar/FE29D578CBEC3945FC88BF4F10906A3E"},"extension_data":null,"success":true,"errors":[],"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Category not found":{"summary":"Category page not found in the context. Kindly verify the categoryId and perform the task again.","value":{"extension_data":null,"success":true,"errors":[{"extension_data":null,"stack_trace":null,"description":"Category not found","error_code":"","custom_data":null}],"warnings":[],"information":[]}},"UserId not found":{"summary":"UserId not found in the context. Kindly verify the categoryId and perform the task again.","value":{"extension_data":null,"success":true,"errors":[{"extension_data":null,"stack_trace":null,"description":"The user with id 'f11efc6f-e968-4e95-82eb-85ad61559de' does not exist in your project.","error_code":"","custom_data":null}],"warnings":[],"information":[]}},"Version Number not found":{"summary":"Version Number not found in the context. Kindly verify the categoryId and perform the task again.","value":{"extension_data":null,"success":true,"errors":[{"extension_data":null,"stack_trace":null,"description":"Cannot fork version number 5, it does not exist in your project","error_code":"","custom_data":null}],"warnings":[],"information":[]}},"LangCode not found":{"summary":"LangCode is missing in the Request Body. Kindly verify the categoryId and perform the task again.","value":{"extension_data":null,"success":true,"errors":[{"extension_data":null,"stack_trace":null,"description":"The LangCode field is required.","error_code":"","custom_data":null}],"warnings":[],"information":[]}}}}}}}}},"/v2/Categories/{categoryId}/updateCategoryType":{"put":{"tags":["Categories"],"summary":"Update the Category Type","parameters":[{"name":"categoryId","in":"path","description":"The ID of the category","required":true,"schema":{"type":"string"}},{"name":"categoryType","in":"query","description":"Category type (0-Folder, 1-Page, 2-Index)","required":true,"schema":{"allOf":[{"$ref":"#/components/schemas/CategoryType"}],"description":"0 - Folder, 1 - Page, 2 - Index"}},{"name":"userId","in":"query","description":"The ID of the team account","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Category type Updated Successfully":{"summary":"Updated the category type. Status updated successfully.","value":{"extension_data":null,"success":true,"errors":[],"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"CategoryId not found":{"summary":"Kindly update the category Id and perform the task again.","value":{"extension_data":null,"success":false,"errors":[],"warnings":[],"information":[]}},"userId not found":{"summary":"Kindly update the user Id and perform the task again.","value":{"extension_data":null,"success":false,"errors":[],"warnings":[],"information":[]}}}}}}}}},"/v2/Categories/{categoryId}/updateDescription":{"put":{"tags":["Categories"],"summary":"Update the category description","parameters":[{"name":"categoryId","in":"path","description":"The ID of the category","required":true,"schema":{"type":"string"}},{"name":"description","in":"query","description":"The description of the category","schema":{"maxLength":250,"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Category description updated success":{"summary":"Kindly update the category Id and perform the task again.","value":{"extension_data":null,"success":true,"errors":[],"warnings":[],"information":[]}},"Description not found":{"summary":"Kindly update the description and perform the task again.","value":{"extension_data":null,"success":false,"errors":[],"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Category Id not found":{"summary":"Kindly update the Category Id and perform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Category not found","error_code":"","custom_data":null}],"warnings":[],"information":[]}},"LangCode not found":{"summary":"Kindly update the Language code and perform the task again.","value":{"extension_data":null,"success":false,"errors":[],"warnings":[],"information":[]}}}}}}},"deprecated":true}},"/v2/Categories/{categoryId}/{langCode}/updateDescription":{"put":{"tags":["Categories"],"summary":"Update the category description","parameters":[{"name":"categoryId","in":"path","description":"The ID of the category","required":true,"schema":{"type":"string"}},{"name":"description","in":"query","description":"The description of the category","schema":{"maxLength":250,"type":"string"}},{"name":"langCode","in":"path","description":"Language code of the category","required":true,"schema":{"type":"string","default":"en"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Category description updated success":{"summary":"Kindly update the category Id and perform the task again.","value":{"extension_data":null,"success":true,"errors":[],"warnings":[],"information":[]}},"Description not found":{"summary":"Kindly update the description and perform the task again.","value":{"extension_data":null,"success":false,"errors":[],"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Category Id not found":{"summary":"Kindly update the Category Id and perform the task again.","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Category not found","error_code":"","custom_data":null}],"warnings":[],"information":[]}},"LangCode not found":{"summary":"Kindly update the Language code and perform the task again.","value":{"extension_data":null,"success":false,"errors":[],"warnings":[],"information":[]}}}}}}}}},"/v2/Language/{projectVersionId}":{"get":{"tags":["Language"],"summary":"Gets all version languages in the project","parameters":[{"name":"projectVersionId","in":"path","description":"The ID of the project version","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetLanguageFromProjectVersion"},"examples":{"Language versions in a project":{"summary":"This is the enabled language versions for the following project.","value":{"data":[{"language_id":"850668e5-cbf6-4522-850668e5-cbf6-4522","language_code":"en","language_name":"English","is_set_as_default":true,"country_flag_code":null},{"language_id":"850634e-a748-4522-850668e5-cbf6-4522","language_code":"zh","language_name":"Chinese","is_set_as_default":false,"country_flag_code":null},{"language_id":"850668e5-cbf6-4522-8534e-a748-4522","language_code":"nl","language_name":"Dutch","is_set_as_default":false,"country_flag_code":null}],"extension_data":null,"success":true,"errors":null,"warnings":null,"information":null}}}}}}}}},"/v2/ProjectVersions":{"get":{"tags":["ProjectVersions"],"summary":"Gets list of project versions","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetProjectVersionsResponse"},"examples":{"200 Status response":{"summary":"The below example shows the status response 200.","value":{"data":[{"id":"46f48bc7-760f-4b07-b2d2-fce4aa8ba234","version_number":1.0,"base_version_number":0.0,"version_code_name":"v1","is_main_version":true,"is_beta":false,"is_public":true,"is_deprecated":false,"created_at":"2024-06-13T14:30:00","modified_at":"2024-06-13T14:30:00","language_versions":[{"id":"","name":null,"code":"SS","set_as_default":false,"hidden":false,"enable_rtl":true,"site_protection_level":2,"is_inheritance_disabled":false,"has_inheritance_disabled_categories_or_articles":false,"country_flag_code":null,"is_home_page_enabled":false,"version_display_name":null}],"slug":"","order":0,"version_type":0}],"extension_data":null,"success":true,"errors":[],"warnings":[],"information":[]}}}}}}}}},"/v2/ProjectVersions/{projectVersionId}/{langCode}":{"get":{"tags":["ProjectVersions"],"summary":"Searches for a phrase inside project version","parameters":[{"name":"projectVersionId","in":"path","description":"The ID of the project version","required":true,"schema":{"type":"string"}},{"name":"searchQuery","in":"query","description":"The phrase to search across all articles in the project version","schema":{"type":"string"}},{"name":"langCode","in":"path","description":"The language code of the article","required":true,"schema":{"type":"string","default":"en"}},{"name":"page","in":"query","description":"Specify the page to retrieve. Page numbers are zero-based. Therefore, to retrieve the 10th page, you need to set page=9","schema":{"type":"integer","format":"int32","default":0}},{"name":"hitsPerPage","in":"query","description":"Number of results per page","schema":{"type":"integer","format":"int32","default":10}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchProjectVersionResponseCustomerApi"},"examples":{"Example for 200 response":{"summary":"200 response in searches for a phrase inside project version","value":{"data":{"hits":[{"title":"Understanding Home page builder","content":"The home page is the first page an end-user will see when they visit your knowledge base. The Home Page Builder lets you customize your home page by adding links, changing colors, including categories from your knowledge base, and more. \n The home page builder comes with an intuitive interface to design a professional looking front-page to your knowledge base. You do not need any developer support to create a good looking home page. \n If you do not want a home page and would like to direct the user directly to the real content, you can easily turn off the home page for your knowledge base. \n \n                \n                This is a sample article, you can safely delete it. \n  \n","is_hidden":false,"tags":[],"slug":"understanding-home-page-builder","version":1,"article_id":"6116080f-5b38-4037-b878-82d318543dsw","category_id":"6116080f-5b38-4037-b878-82d318543af","is_category_hidden":null,"order":5,"is_draft":false,"exclude":false,"breadcrumb":null,"is_category":null,"attachment_ids":null,"is_deleted":null,"is_folder_type_category":null,"updated_on_timestamp":null,"is_private":false,"language_id":null,"project_id":null,"is_latest_version":null,"contributors":null,"is_shared_article":null,"lang_code":null,"category_unique_id":null,"unique_id":null,"deleted_by":null,"deleted_at":null,"is_git_hub_entity":false,"original_article_id":null,"object_id":"","_snippet_result":{"content":{"value":" The home page is the first page an end-user will see when they visit your knowledge base. The Home Page Builder lets you customize your home page by adding links, changing colors, including categories from your knowledge base, and more. \n The home page builder comes with an intuitive","match_level":""}},"_highlight_result":{"title":null}}],"nb_hits":null,"page":null,"nb_pages":null,"hits_per_page":null,"processing_time_ms":null,"query":null},"extension_data":null,"success":true,"errors":[],"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Example for 400 response due to project version Id ":{"summary":"400 bad response due to invalid Project version Id ","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"The supplied project version id does not exist in your project","error_code":"400","custom_data":null}],"warnings":[],"information":[]}},"Example for 400 response due to Lanuage Code ":{"summary":"400 bad response due to invalid Language Code ","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Invalid Language code","error_code":"400","custom_data":null}],"warnings":[],"information":[]}}}}}}}}},"/v2/ProjectVersions/{projectVersionId}/categories":{"get":{"tags":["ProjectVersions"],"summary":"Gets list of categories within project version","parameters":[{"name":"projectVersionId","in":"path","description":"The ID of the project version","required":true,"schema":{"type":"string"}},{"name":"excludeArticles","in":"query","description":"`True` - Articles will be excluded; `False` - Articles will be included","schema":{"type":"boolean"}},{"name":"langCode","in":"query","description":"Get article in the project version that corresponds to the given language code. If the language code is empty, the default language of the project version will be taken into account","schema":{"type":"string"}},{"name":"includeCategoryDescription","in":"query","description":"`True` - Include category description; `False` - Exclude category description","schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetCategoriesResponse"},"examples":{"Example for 200 response":{"summary":"200 response in get list of categories within project version","value":{"data":[{"id":"f587e278-4205-4a07-a6b7-28dc9caf6f48","name":"Getting started","description":"This is the description of the getting started category.","project_version_id":"ad76e483-6ef7-4e43-b53f-4fe5e52sefw","order":1,"parent_category_id":null,"hidden":false,"articles":[{"id":"c31b0a18-5416-4cef-b165-83d9b52ada43","title":"Why did we build Document360?","public_version":1,"latest_version":1,"language_code":null,"hidden":false,"status":0,"order":1,"slug":"why-did-we-build-document360","content_type":null,"translation_option":0,"is_shared_article":false,"modified_at":null}],"child_categories":[],"icon":null,"slug":"getting-started","language_code":null,"category_type":0,"created_at":"2024-06-13T14:30:00","modified_at":"2024-06-13T14:30:00","status":null,"content_type":null}],"extension_data":null,"success":true,"errors":[],"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Example for 400 response":{"summary":"400 response in get list of categories within project version","value":{"extension_data":null,"success":true,"errors":[],"warnings":[],"information":[]}}}}}}}}},"/v2/ProjectVersions/{projectVersionId}/articles":{"get":{"tags":["ProjectVersions"],"summary":"Gets list of articles within project version","parameters":[{"name":"projectVersionId","in":"path","description":"The ID of the project version","required":true,"schema":{"type":"string"}},{"name":"langCode","in":"query","description":"Get article in the project version that corresponds to the given language code. If the language code is empty, the default language of the project version will be taken into account","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetArticlesResponseCustomer"},"examples":{"Example for 200 response due to invalid project version Id ":{"summary":"200 response in get list of articles within project version","value":{"data":[{"url":"https://example.com/v1/docs/en/getting-started","id":"7db99386-2816-40f0-991f-174dgdscf","title":"Why did we build Document360?","public_version":1,"latest_version":1,"language_code":null,"hidden":false,"status":0,"order":1,"slug":"why did we build document360","content_type":null,"translation_option":0,"is_shared_article":false,"modified_at":null}],"extension_data":null,"success":false,"errors":[],"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Example for 400 response due to invalid Project version Id":{"summary":"400 bad response due to invalid Project version Id ","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"The supplied project version id does not exist in your project","error_code":"400","custom_data":null}],"warnings":[],"information":[]}}}}}}}}},"/v2/ProjectVersions/{projectVersionId}/apireferences":{"get":{"tags":["ProjectVersions"],"summary":"Gets list of api reference within project version","parameters":[{"name":"projectVersionId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetApiReferenceDataResponseCustomer"},"examples":{"Success status Response":{"summary":"This is the sample response for this endpoint.","value":{"data":[{"id":"d8a7dfb6-0539-4583-9af2-1bd40863f866","name":"1412706f-d63e-4070-9af7-3af2b77616bb","upload_type":"23c9f6c4-0b90-49e4-abb4-0ac11da3af50"}],"extension_data":null,"success":true,"errors":[],"warnings":[],"information":[]}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Invalid project version ID":{"summary":"Kindly ensure the project version ID is valid and perform the task again.","value":{"extension_data":null,"success":false,"errors":[],"warnings":[],"information":[]}}}}}}}}},"/v2/ProjectVersions/ask-eddy":{"post":{"tags":["ProjectVersions"],"summary":"Perform AI assistive search within project version","requestBody":{"content":{"application/json-patch+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/AIAssistiveSearchRequest"}]}},"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/AIAssistiveSearchRequest"}]}},"text/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/AIAssistiveSearchRequest"}]}},"application/*+json":{"schema":{"allOf":[{"$ref":"#/components/schemas/AIAssistiveSearchRequest"}]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIAssistiveSearch"},"examples":{"Success status response":{"summary":"This is sample response for this endpoint.","value":{"prompt":"How to configure single sign-on in Document360?","result":"<p>To configure Single Sign On in Document360, follow these steps:</p><br><ol><br>    <li>Access the Azure AD portal and log in to your Microsoft Azure account.</li><br>    <li>Add your application by logging in to your Azure account, visiting the Azure portal page, and selecting the New application option.</li><br>    <li>Navigate to Document360 portal, select Settings \u2192 Users Security \u2192 SAML/OpenID \u2192 SAML, and set up your application by copying the parameters from Document360 to the Azure AD portal.</li><br>    <li>Configure SAML based SSO settings by copying and pasting values between Document360 and Azure AD portal.</li><br>    <li>Test the configuration by logging into Document360 using the credentials added to the registered application.</li><br></ol>\",\r\n","reference_articles":[{"category_id":"807cafd4-5d9b-4be6-becd-906f1509b0db","category_title":"SAML","category_slug":"saml","version_name":"Document360 2.0","version_slug":"help","article_id":"fb0444b1-6ff6-41dc-b68b-93e86c0470cc","article_title":"SAML SSO with Azure AD","article_slug":"saml-sso-with-azure-ad","version_display_name":null,"language_code":null},{"category_id":"807cafd4-5d9b-4be6-becd-906f1509b0db","category_title":"SAML","category_slug":"saml","version_name":"Document360 2.0","version_slug":"help","article_id":"4a88b443-fbdb-4dc7-882a-e802bb9de6e9","article_title":"Identity Provider (IdP) initiated login","article_slug":"idp-initiated-login","version_display_name":null,"language_code":null},{"category_id":"807cafd4-5d9b-4be6-becd-906f1509b0db","category_title":"SAML","category_slug":"saml","version_name":"Document360 2.0","version_slug":"help","article_id":"642719c7-5689-4f80-9bf3-79b53edacfcc","article_title":"Setting up OpenID as your SSO standard","article_slug":"enabling-openid-sso","version_display_name":null,"language_code":null}],"limit_exceeded":false,"analytics_id":"8ac6020b-d329-4968-b562-5497c88e65a6","remaining_credits":10,"extension_data":null,"context":null,"success":true,"errors":[],"warnings":[],"information":[],"feature_explorer_status":null,"custom_page_element":null}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerApiBaseResponse"},"examples":{"Invalid prompt":{"summary":"Kindly ensure the prompt is not empty and perform the task again. ","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Prompt should not be empty","error_code":null,"custom_data":null}],"warnings":[],"information":[]}},"Invalid project version ID":{"summary":"Kindly ensure the project version ID is not empty and perform the task again. ","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Project version ID should not be empty","error_code":null,"custom_data":null}],"warnings":[],"information":[]}},"Invalid language code":{"summary":"Kindly ensure the language code is not empty and perform the task again. ","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"Language Code should not be empty","error_code":null,"custom_data":null}],"warnings":[],"information":[]}},"Public API access is disabled":{"summary":"Kindly ensure the public API is enabled and perform the task again. ","value":{"extension_data":null,"success":false,"errors":[{"extension_data":null,"stack_trace":null,"description":"API access is disabled. Please contact your project administrator.","error_code":null,"custom_data":null}],"warnings":[],"information":[]}}}}}}}}}},"components":{"schemas":{"AIAssistiveSearch":{"type":"object","properties":{"prompt":{"type":"string","nullable":true},"result":{"type":"string","nullable":true},"reference_articles":{"type":"array","items":{"$ref":"#/components/schemas/VectorSearchReferenceArticles"},"nullable":true},"limit_exceeded":{"type":"boolean"},"analytics_id":{"type":"string","nullable":true},"remaining_credits":{"type":"integer","format":"int32"},"extension_data":{"allOf":[{"$ref":"#/components/schemas/ExtensionDataObject"}],"nullable":true},"context":{"allOf":[{"$ref":"#/components/schemas/BaseResponseContext"}],"nullable":true},"success":{"type":"boolean"},"errors":{"type":"array","items":{"$ref":"#/components/schemas/BaseError"},"nullable":true},"warnings":{"type":"array","items":{"$ref":"#/components/schemas/BaseWarning"},"nullable":true},"information":{"type":"array","items":{"$ref":"#/components/schemas/BaseInformation"},"nullable":true},"feature_explorer_status":{"allOf":[{"$ref":"#/components/schemas/FeatureExplorerStatus"}],"nullable":true},"custom_page_element":{"allOf":[{"$ref":"#/components/schemas/UIElement"}],"nullable":true}},"additionalProperties":false},"AIAssistiveSearchRequest":{"type":"object","properties":{"prompt":{"type":"string","nullable":true},"version_id":{"type":"string","nullable":true},"language_code":{"type":"string","nullable":true}},"additionalProperties":false},"AddCategoryRequest":{"required":["name","project_version_id"],"type":"object","properties":{"name":{"minLength":1,"type":"string","description":"The name of the category"},"project_version_id":{"minLength":1,"type":"string","description":"The ID of the project version where category has to be added"},"order":{"type":"integer","description":"The position inside the parent category","format":"int32"},"parent_category_id":{"type":"string","description":"The ID of the parent category. If empty, it will be added as top level category)","nullable":true},"content":{"type":"string","description":"The content of the article, for any Editor type, use this property","nullable":true},"category_type":{"allOf":[{"$ref":"#/components/schemas/CategoryType"}],"description":"0 - Folder, 1 - Page, 2 - Index"},"user_id":{"type":"string","description":"The ID of the team account","nullable":true},"content_type":{"allOf":[{"$ref":"#/components/schemas/ArticleContentType"}],"description":"0 - Markdown; 1 - WYSIWYG(HTML); 2 - Advanced WYSIWYG","default":null,"nullable":true}},"additionalProperties":false},"AddCategoryResponse":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/CategorySimpleData"}],"description":"added category response data","nullable":true},"extension_data":{"allOf":[{"$ref":"#/components/schemas/ExtensionDataObject"}],"description":"Extention data for customer API response","nullable":true},"success":{"type":"boolean","description":"Status indication for customer API response"},"errors":{"type":"array","items":{"$ref":"#/components/schemas/BaseError"},"description":"Errors in the customer API response","nullable":true},"warnings":{"type":"array","items":{"$ref":"#/components/schemas/BaseWarning"},"description":"Warnings in the customer API response","nullable":true},"information":{"type":"array","items":{"$ref":"#/components/schemas/BaseInformation"},"description":"Information passed by the customer API response","nullable":true}},"additionalProperties":false},"ApiDefinitionInforamtionCustomer":{"type":"object","properties":{"id":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"upload_type":{"type":"string","nullable":true}},"additionalProperties":false},"ArticleContentType":{"enum":[0,1,2],"type":"integer","description":"0 - Markdown; 1 - WYSIWYG(HTML); 2 - Advanced WYSIWYG","format":"int32"},"ArticleMatchedData":{"type":"object","properties":{"hits":{"type":"array","items":{"$ref":"#/components/schemas/Hit"},"description":"The list of articles that matched the search query.","nullable":true},"nb_hits":{"type":"integer","description":"The number of hits (articles) matched by the query.","format":"int32","nullable":true},"page":{"type":"integer","description":"The position of the current page (zero-based).","format":"int32","nullable":true},"nb_pages":{"type":"integer","description":"The number of returned pages. Calculation is based on the total number of hits (nbHits) divided by the number of hits per page (hitsPerPage), rounded up to the nearest integer.","format":"int32","nullable":true},"hits_per_page":{"type":"integer","description":"Maximum number of hits (articles) per page.","format":"int32","nullable":true},"processing_time_ms":{"type":"integer","description":"The time the server took to process the request, in milliseconds. This doesn\u2019t include network time.","format":"int32","nullable":true},"query":{"type":"string","description":"The query used to search the articles.","nullable":true}},"additionalProperties":false},"ArticleSettingCustomer":{"type":"object","properties":{"slug":{"type":"string","description":"The slug of the article","nullable":true},"seo_title":{"type":"string","description":"The SEO title of the article","nullable":true},"description":{"type":"string","description":"The SEO description of the article","nullable":true},"allow_comments":{"type":"boolean","description":"`True` indicates that comments are allowed in the article"},"show_table_of_contents":{"type":"boolean","description":"`True` indicates that Table of Contents are shown in the article"},"featured_image_url":{"type":"string","description":"URL of the featured image","nullable":true},"tags":{"type":"array","items":{"type":"string"},"description":"List of tags associated to the article","nullable":true},"status_indicator":{"allOf":[{"$ref":"#/components/schemas/ArticleStatusIndicator"}],"description":"The status of the article: 0 - None, 1 - New, 2 - Updated, 3 - Custom"},"status_indicator_expiry_date":{"type":"string","description":"The number of days after which the article status will be removed","format":"date-time","nullable":true},"exclude_from_search":{"type":"boolean","description":"`True` indicates that the article will not appear in the Knowledge base search results"},"exclude_from_ai_search":{"type":"boolean"},"related_articles":{"type":"array","items":{"$ref":"#/components/schemas/RelatedArticleData"},"description":"List of related articles associated to the article","nullable":true},"is_acknowledgement_enabled":{"type":"boolean"}},"additionalProperties":false},"ArticleSettingCustomerResponse":{"type":"object","properties":{"url":{"type":"string","description":"Url of the article","nullable":true},"slug":{"type":"string","description":"The slug of the article","nullable":true},"seo_title":{"type":"string","description":"The SEO title of the article","nullable":true},"description":{"type":"string","description":"The SEO description of the article","nullable":true},"allow_comments":{"type":"boolean","description":"`True` indicates that comments are allowed in the article"},"show_table_of_contents":{"type":"boolean","description":"`True` indicates that Table of Contents are shown in the article"},"featured_image_url":{"type":"string","description":"URL of the featured image","nullable":true},"tags":{"type":"array","items":{"type":"string"},"description":"List of tags associated to the article","nullable":true},"status_indicator":{"allOf":[{"$ref":"#/components/schemas/ArticleStatusIndicator"}],"description":"The status of the article: 0 - None, 1 - New, 2 - Updated, 3 - Custom"},"status_indicator_expiry_date":{"type":"string","description":"The number of days after which the article status will be removed","format":"date-time","nullable":true},"exclude_from_search":{"type":"boolean","description":"`True` indicates that the article will not appear in the Knowledge base search results"},"exclude_from_ai_search":{"type":"boolean"},"related_articles":{"type":"array","items":{"$ref":"#/components/schemas/RelatedArticleData"},"description":"List of related articles associated to the article","nullable":true},"is_acknowledgement_enabled":{"type":"boolean"}},"additionalProperties":false},"ArticleSimpleDataCustomer":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the article","nullable":true},"title":{"type":"string","description":"The article title","nullable":true},"public_version":{"type":"integer","description":"The article version number(revision) that is currently published","format":"int32"},"latest_version":{"type":"integer","description":"The latest version number of this article","format":"int32"},"language_code":{"type":"string","description":"The default language code","nullable":true,"deprecated":true},"hidden":{"type":"boolean","description":"Indicates if the article is visible on the site"},"status":{"allOf":[{"$ref":"#/components/schemas/ArticleStatusCustomer"}],"description":"The status of the article: 0 - Draft, 3 - Published"},"order":{"type":"integer","description":"The position of the article inside the parent category","format":"int32"},"slug":{"type":"string","description":"The slug of the article","nullable":true},"content_type":{"allOf":[{"$ref":"#/components/schemas/ArticleContentType"}],"description":"The content type of the article: Markdown = 0, Wysiwyg = 1, Block = 2","nullable":true},"translation_option":{"allOf":[{"$ref":"#/components/schemas/LanguageTranslationOption"}],"description":"The Translation status of the article"},"is_shared_article":{"type":"boolean","description":"`True` indicates that the article is shared"},"modified_at":{"type":"string","description":"Article modified date time","format":"date-time","nullable":true}},"additionalProperties":false},"ArticleSimpleDataCustomerResponse":{"type":"object","properties":{"url":{"type":"string","description":"Url of the article","nullable":true},"id":{"type":"string","description":"The ID of the article","nullable":true},"title":{"type":"string","description":"The article title","nullable":true},"public_version":{"type":"integer","description":"The article version number(revision) that is currently published","format":"int32"},"latest_version":{"type":"integer","description":"The latest version number of this article","format":"int32"},"language_code":{"type":"string","description":"The default language code","nullable":true,"deprecated":true},"hidden":{"type":"boolean","description":"Indicates if the article is visible on the site"},"status":{"allOf":[{"$ref":"#/components/schemas/ArticleStatusCustomer"}],"description":"The status of the article: 0 - Draft, 3 - Published"},"order":{"type":"integer","description":"The position of the article inside the parent category","format":"int32"},"slug":{"type":"string","description":"The slug of the article","nullable":true},"content_type":{"allOf":[{"$ref":"#/components/schemas/ArticleContentType"}],"description":"The content type of the article: Markdown = 0, Wysiwyg = 1, Block = 2","nullable":true},"translation_option":{"allOf":[{"$ref":"#/components/schemas/LanguageTranslationOption"}],"description":"The Translation status of the article"},"is_shared_article":{"type":"boolean","description":"`True` indicates that the article is shared"},"modified_at":{"type":"string","description":"Article modified date time","format":"date-time","nullable":true}},"additionalProperties":false},"ArticleSimpleVersionCustomer":{"type":"object","properties":{"version_number":{"type":"integer","description":"The version number of the article","format":"int32"},"created_by":{"type":"string","description":"Author name","nullable":true},"created_at":{"type":"string","description":"The date the article version was created","format":"date-time"},"modified_at":{"type":"string","description":"The last time the article version was modified","format":"date-time"},"base_version":{"type":"integer","description":"The version number from which this article version is derived","format":"int32"},"status":{"allOf":[{"$ref":"#/components/schemas/ArticleStatusCustomer"}],"description":"The status of the article: 0 - Draft, 3 - Published"},"profile_url":{"type":"string","description":"Author profile image","nullable":true}},"additionalProperties":false},"ArticleStaleStatus":{"enum":[0,1],"type":"integer","description":"The status of the article: 0 - None, 1 - New, 2 - Updated, 3 - Custom","format":"int32"},"ArticleStatusCustomer":{"enum":[0,3],"type":"integer","description":"The status of the article: 0 - Draft, 3 - Published","format":"int32"},"ArticleStatusIndicator":{"enum":[0,1,2,3],"type":"integer","description":"Article status in the knowledge base. 0 - None; 1 - New; 2 - Updated; 3 - Custom","format":"int32"},"ArticleVersionDataCustomerResponse":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the article","nullable":true},"title":{"type":"string","description":"The title of the article","nullable":true},"content":{"type":"string","description":"If the article editor is **Markdown**, then the article content will be present in this property","nullable":true},"html_content":{"type":"string","description":" If the article editor is **WYSIWYG (HTML)**, then the content will be present in this property. \r\n**Note**: Markdown editor will also have HTML content (read-only).","nullable":true},"category_id":{"type":"string","description":"The ID of the article's parent category","nullable":true},"project_version_id":{"type":"string","description":"The ID of the project version where the article is located","nullable":true},"version_number":{"type":"integer","description":"The currently fetched version number of the article","format":"int32"},"public_version":{"type":"integer","description":"The currently published version number of the article","format":"int32"},"latest_version":{"type":"integer","description":"The latest version number of the article","format":"int32"},"enable_rtl":{"type":"boolean","description":"`True` indicates that **Right to Left** alignment is enabled for the article language"},"hidden":{"type":"boolean","description":"`False` indicates that the article is visible on the site"},"status":{"allOf":[{"$ref":"#/components/schemas/ArticleStatusCustomer"}],"description":"The status of the article: 0 - Draft, 3 - Published"},"order":{"type":"integer","description":"The position inside the parent category","format":"int32"},"created_by":{"type":"string","description":"The ID of the team account who created the article","nullable":true},"authors":{"type":"array","items":{"$ref":"#/components/schemas/UserDetailsCustomer"},"description":"The list of contributors in the article","nullable":true},"created_at":{"type":"string","description":"The date on which the article was created","format":"date-time"},"modified_at":{"type":"string","description":"The date on which the article was last modified","format":"date-time"},"slug":{"type":"string","description":"The slug of the article","nullable":true},"is_fall_back_content":{"type":"boolean","description":"`True` indicates that the article content is a fallback of the default language content"},"description":{"type":"string","description":"The description of the article","nullable":true},"category_type":{"allOf":[{"$ref":"#/components/schemas/CategoryType"}],"description":"0 - Folder, 1 - Page, 2 - Index","nullable":true},"content_type":{"allOf":[{"$ref":"#/components/schemas/ArticleContentType"}],"description":"0 - Markdown; 1 - WYSIWYG(HTML); 2 - Advanced WYSIWYG","nullable":true},"is_shared_article":{"type":"boolean","description":"`True` indicates that the article is shared"},"translation_option":{"allOf":[{"$ref":"#/components/schemas/LanguageTranslationOption"}],"description":"The Translation status of the article"},"url":{"type":"string","description":"Url of the article","nullable":true}},"additionalProperties":false},"ArticleVersionInfoCustomerResponse":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the article","nullable":true},"title":{"type":"string","description":"The title of the article","nullable":true},"content":{"type":"string","description":"If the article editor is **Markdown**, then the article content will be present in this property","nullable":true},"html_content":{"type":"string","description":" If the article editor is **WYSIWYG (HTML)**, then the content will be present in this property. \r\n**Note**: Markdown editor will also have HTML content (read-only).","nullable":true},"category_id":{"type":"string","description":"The ID of the article's parent category","nullable":true},"project_version_id":{"type":"string","description":"The ID of the project version where the article is located","nullable":true},"version_number":{"type":"integer","description":"The currently fetched version number of the article","format":"int32"},"public_version":{"type":"integer","description":"The currently published version number of the article","format":"int32"},"latest_version":{"type":"integer","description":"The latest version number of the article","format":"int32"},"enable_rtl":{"type":"boolean","description":"`True` indicates that **Right to Left** alignment is enabled for the article language"},"hidden":{"type":"boolean","description":"`False` indicates that the article is visible on the site"},"status":{"allOf":[{"$ref":"#/components/schemas/ArticleStatusCustomer"}],"description":"The status of the article: 0 - Draft, 3 - Published"},"order":{"type":"integer","description":"The position inside the parent category","format":"int32"},"created_by":{"type":"string","description":"The ID of the team account who created the article","nullable":true},"authors":{"type":"array","items":{"$ref":"#/components/schemas/UserDetailsCustomer"},"description":"The list of contributors in the article","nullable":true},"created_at":{"type":"string","description":"The date on which the article was created","format":"date-time"},"modified_at":{"type":"string","description":"The date on which the article was last modified","format":"date-time"},"slug":{"type":"string","description":"The slug of the article","nullable":true},"is_fall_back_content":{"type":"boolean","description":"`True` indicates that the article content is a fallback of the default language content"},"description":{"type":"string","description":"The description of the article","nullable":true},"category_type":{"allOf":[{"$ref":"#/components/schemas/CategoryType"}],"description":"0 - Folder, 1 - Page, 2 - Index","nullable":true},"content_type":{"allOf":[{"$ref":"#/components/schemas/ArticleContentType"}],"description":"0 - Markdown; 1 - WYSIWYG(HTML); 2 - Advanced WYSIWYG","nullable":true},"is_shared_article":{"type":"boolean","description":"`True` indicates that the article is shared"},"translation_option":{"allOf":[{"$ref":"#/components/schemas/LanguageTranslationOption"}],"description":"The Translation status of the article"},"version_created_at":{"type":"string","description":"Latest version created date","format":"date-time"}},"additionalProperties":false},"BaseError":{"type":"object","properties":{"extension_data":{"allOf":[{"$ref":"#/components/schemas/ExtensionDataObject"}],"description":"Thids is the Extention data object","nullable":true},"stack_trace":{"type":"string","description":"Stack trace for error response message","nullable":true},"description":{"type":"string","description":"Description for error cause","nullable":true},"error_code":{"type":"string","description":"Error code for Api response","nullable":true},"custom_data":{"type":"object","additionalProperties":{},"nullable":true}},"additionalProperties":false},"BaseInformation":{"type":"object","properties":{"extension_data":{"allOf":[{"$ref":"#/components/schemas/ExtensionDataObject"}],"description":"Extention data for customer Api response information","nullable":true},"description":{"type":"string","description":"status description for customer Api response information","nullable":true}},"additionalProperties":false},"BaseResponseContext":{"type":"object","properties":{"extension_data":{"allOf":[{"$ref":"#/components/schemas/ExtensionDataObject"}],"nullable":true},"caller_reference":{"type":"string","nullable":true}},"additionalProperties":false},"BaseWarning":{"type":"object","properties":{"extension_data":{"allOf":[{"$ref":"#/components/schemas/ExtensionDataObject"}],"description":"Extention Data for customer Api warning","nullable":true},"description":{"type":"string","description":"Warning description","nullable":true},"warning_code":{"type":"string","description":"warning code for customer Api base response","nullable":true}},"additionalProperties":false},"BulkArticleResultCustomer":{"type":"object","properties":{"article_id":{"type":"string","description":"Article ID that has updated","nullable":true},"success":{"type":"boolean","description":"Indicates if articles creation was successful"},"details":{"type":"string","description":"Additional information about articles creation status","nullable":true}},"additionalProperties":false},"BulkCategoryResult":{"type":"object","properties":{"category_id":{"type":"string","description":"The ID of the category","nullable":true},"success":{"type":"boolean","description":"`True` - Category is published\r\n`False` - Category is not published"},"details":{"type":"string","description":"Description of the action performed","nullable":true}},"additionalProperties":false},"BulkCreateArticleResponseCustomer":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/BulkArticleResultCustomer"},"description":"Bulk article create response","nullable":true},"extension_data":{"allOf":[{"$ref":"#/components/schemas/ExtensionDataObject"}],"description":"Extention data for customer API response","nullable":true},"success":{"type":"boolean","description":"Status indication for customer API response"},"errors":{"type":"array","items":{"$ref":"#/components/schemas/BaseError"},"description":"Errors in the customer API response","nullable":true},"warnings":{"type":"array","items":{"$ref":"#/components/schemas/BaseWarning"},"description":"Warnings in the customer API response","nullable":true},"information":{"type":"array","items":{"$ref":"#/components/schemas/BaseInformation"},"description":"Information passed by the customer API response","nullable":true}},"additionalProperties":false},"BulkCreateCategoryResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/BulkCategoryResult"},"description":"bulk category response data","nullable":true},"extension_data":{"allOf":[{"$ref":"#/components/schemas/ExtensionDataObject"}],"description":"Extention data for customer API response","nullable":true},"success":{"type":"boolean","description":"Status indication for customer API response"},"errors":{"type":"array","items":{"$ref":"#/components/schemas/BaseError"},"description":"Errors in the customer API response","nullable":true},"warnings":{"type":"array","items":{"$ref":"#/components/schemas/BaseWarning"},"description":"Warnings in the customer API response","nullable":true},"information":{"type":"array","items":{"$ref":"#/components/schemas/BaseInformation"},"description":"Information passed by the customer API response","nullable":true}},"additionalProperties":false},"BulkDeleteArticleResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/BulkArticleResultCustomer"},"description":"Bulk delete article response","nullable":true},"extension_data":{"allOf":[{"$ref":"#/components/schemas/ExtensionDataObject"}],"description":"Extention data for customer API response","nullable":true},"success":{"type":"boolean","description":"Status indication for customer API response"},"errors":{"type":"array","items":{"$ref":"#/components/schemas/BaseError"},"description":"Errors in the customer API response","nullable":true},"warnings":{"type":"array","items":{"$ref":"#/components/schemas/BaseWarning"},"description":"Warnings in the customer API response","nullable":true},"information":{"type":"array","items":{"$ref":"#/components/schemas/BaseInformation"},"description":"Information passed by the customer API response","nullable":true}},"additionalProperties":false},"BulkDeleteArticleVersionResonse":{"type":"object","properties":{"article_id":{"type":"string","description":"IDs of the articles","nullable":true},"data":{"type":"string","description":"Response article data","nullable":true},"extension_data":{"allOf":[{"$ref":"#/components/schemas/ExtensionDataObject"}],"description":"Extention data for customer API response","nullable":true},"success":{"type":"boolean","description":"Status indication for customer API response"},"errors":{"type":"array","items":{"$ref":"#/components/schemas/BaseError"},"description":"Errors in the customer API response","nullable":true},"warnings":{"type":"array","items":{"$ref":"#/components/schemas/BaseWarning"},"description":"Warnings in the customer API response","nullable":true},"information":{"type":"array","items":{"$ref":"#/components/schemas/BaseInformation"},"description":"Information passed by the customer API response","nullable":true}},"additionalProperties":false},"BulkDeleteCategoryVersionResponse":{"type":"object","properties":{"category_id":{"type":"string","description":"The ID of the category","nullable":true},"data":{"type":"string","description":"The list of deleted category versions","nullable":true},"extension_data":{"allOf":[{"$ref":"#/components/schemas/ExtensionDataObject"}],"description":"Extention data for customer API response","nullable":true},"success":{"type":"boolean","description":"Status indication for customer API response"},"errors":{"type":"array","items":{"$ref":"#/components/schemas/BaseError"},"description":"Errors in the customer API response","nullable":true},"warnings":{"type":"array","items":{"$ref":"#/components/schemas/BaseWarning"},"description":"Warnings in the customer API response","nullable":true},"information":{"type":"array","items":{"$ref":"#/components/schemas/BaseInformation"},"description":"Information passed by the customer API response","nullable":true}},"additionalProperties":false},"BulkPublishArticle":{"required":["article_id","user_id","version_number"],"type":"object","properties":{"article_id":{"minLength":1,"type":"string","description":"The ID of the article"},"user_id":{"minLength":1,"type":"string","description":"The ID of the team account that will be marked as the contributor of this publish"},"version_number":{"maximum":32767,"minimum":1,"type":"integer","description":"The version number of the article to be published","format":"int32"},"publish_message":{"type":"string","description":"The publish message of the article","nullable":true}},"additionalProperties":false},"BulkPublishCategory":{"required":["category_id","user_id","version_number"],"type":"object","properties":{"category_id":{"minLength":1,"type":"string","description":"The ID of the category"},"user_id":{"minLength":1,"type":"string","description":"The ID of the team account responsible for the publish"},"version_number":{"maximum":32767,"minimum":1,"type":"integer","description":"Version number of the category page","format":"int32"},"publish_message":{"type":"string","description":"Publish message for the category","nullable":true}},"additionalProperties":false},"BulkPublishCategoryResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/BulkCategoryResult"},"nullable":true},"extension_data":{"allOf":[{"$ref":"#/components/schemas/ExtensionDataObject"}],"description":"Extention data for customer API response","nullable":true},"success":{"type":"boolean","description":"Status indication for customer API response"},"errors":{"type":"array","items":{"$ref":"#/components/schemas/BaseError"},"description":"Errors in the customer API response","nullable":true},"warnings":{"type":"array","items":{"$ref":"#/components/schemas/BaseWarning"},"description":"Warnings in the customer API response","nullable":true},"information":{"type":"array","items":{"$ref":"#/components/schemas/BaseInformation"},"description":"Information passed by the customer API response","nullable":true}},"additionalProperties":false},"BulkUpdateArticle":{"type":"object","properties":{"article_id":{"type":"string","description":"The ID of the article","nullable":true},"lang_code":{"type":"string","description":"Language code of the article","nullable":true},"title":{"type":"string","description":"The title of the article","nullable":true},"content":{"type":"string","description":"The content of the article, for any Editor type, use this property.","nullable":true},"html_content":{"type":"string","description":"The HTML content of the article. If the editor type is WYSIWYG (HTML), use this property - (This property is deprecated and will be removed in a future version of the API.  Kindly use **content** property instead of this.)","nullable":true,"deprecated":true},"category_id":{"type":"string","description":"The ID of the category. If the article has to be moved to another category, enter the desired category ID","nullable":true},"hidden":{"type":"boolean","description":"Visibility status of the article. **true** - Article will be hidden; **false** - Article will be shown"},"version_number":{"type":"integer","description":"The version number of the article to be updated. The latest version is updated by default.","format":"int32","nullable":true},"translation_option":{"type":"string","description":"Translation status of the article. 0 - None, 1 - Needs translation, 2 Translated","nullable":true},"source":{"type":"string","description":"Free text used for future reference","nullable":true},"order":{"type":"integer","description":"To update the position of the article in the category tree. (Default value is 0, and the order starts from 1 when explicitly set or updated).","format":"int32"}},"additionalProperties":false},"BulkUpdateArticleResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/BulkArticleResultCustomer"},"description":"Bulk updated article data","nullable":true},"extension_data":{"allOf":[{"$ref":"#/components/schemas/ExtensionDataObject"}],"description":"Extention data for customer API response","nullable":true},"success":{"type":"boolean","description":"Status indication for customer API response"},"errors":{"type":"array","items":{"$ref":"#/components/schemas/BaseError"},"description":"Errors in the customer API response","nullable":true},"warnings":{"type":"array","items":{"$ref":"#/components/schemas/BaseWarning"},"description":"Warnings in the customer API response","nullable":true},"information":{"type":"array","items":{"$ref":"#/components/schemas/BaseInformation"},"description":"Information passed by the customer API response","nullable":true}},"additionalProperties":false},"BulkUpdateCategoryContentResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/BulkCategoryResult"},"nullable":true},"extension_data":{"allOf":[{"$ref":"#/components/schemas/ExtensionDataObject"}],"description":"Extention data for customer API response","nullable":true},"success":{"type":"boolean","description":"Status indication for customer API response"},"errors":{"type":"array","items":{"$ref":"#/components/schemas/BaseError"},"description":"Errors in the customer API response","nullable":true},"warnings":{"type":"array","items":{"$ref":"#/components/schemas/BaseWarning"},"description":"Warnings in the customer API response","nullable":true},"information":{"type":"array","items":{"$ref":"#/components/schemas/BaseInformation"},"description":"Information passed by the customer API response","nullable":true}},"additionalProperties":false,"description":"Bulk Updating of category content"},"CategoryDataCustomer":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the category","nullable":true},"name":{"type":"string","description":"Name of the category","nullable":true},"description":{"type":"string","description":"Description of the category","nullable":true},"project_version_id":{"type":"string","description":"The ID of the project version where this category is located","nullable":true},"order":{"type":"integer","description":"The position the category inside the parent category","format":"int32"},"parent_category_id":{"type":"string","description":"The ID of the parent category ( null if top-level )","nullable":true},"hidden":{"type":"boolean","description":"Indicates if the category is visible on the site ( If \"false,\" all the child categories and articles will be hidden as well )"},"articles":{"type":"array","items":{"$ref":"#/components/schemas/ArticleSimpleDataCustomer"},"description":"The list of articles attached to this category","nullable":true},"child_categories":{"type":"array","items":{"$ref":"#/components/schemas/CategoryDataCustomer"},"description":"The list of categories attached to this category","nullable":true},"icon":{"type":"string","description":"Unicode representation of the icon or image URL","nullable":true},"slug":{"type":"string","description":"The slug of the category","nullable":true},"language_code":{"type":"string","description":"Language code of the category","nullable":true},"category_type":{"allOf":[{"$ref":"#/components/schemas/CategoryType"}],"description":"0 - Folder, 1 - Page, 2 - Index"},"created_at":{"type":"string","description":"Category created date time","format":"date-time","nullable":true},"modified_at":{"type":"string","description":"Category modified date time","format":"date-time","nullable":true},"status":{"allOf":[{"$ref":"#/components/schemas/ArticleStatusCustomer"}],"description":"The status of the page type category: 0 - Draft, 3 - Published","nullable":true},"content_type":{"allOf":[{"$ref":"#/components/schemas/ArticleContentType"}],"description":"The content type of the page type category: Markdown = 0, Wysiwyg = 1, Block = 2","nullable":true}},"additionalProperties":false},"CategorySettingsCustomer":{"type":"object","properties":{"slug":{"type":"string","description":"The slug of the category","nullable":true},"seo_title":{"type":"string","description":"SEO title of the category","nullable":true},"description":{"type":"string","description":"SEO description of the category","nullable":true},"allow_comments":{"type":"boolean","description":"Allow comments for category"},"show_table_of_contents":{"type":"boolean","description":"`True` - Table of Contents will be enabled \r\n`False` - Table of Contents will be disabled"},"featured_image_url":{"type":"string","description":"URL of the featured image","nullable":true},"tags":{"type":"array","items":{"type":"string"},"description":"List of Tags associated to the category","nullable":true},"status_indicator":{"allOf":[{"$ref":"#/components/schemas/ArticleStatusIndicator"}],"description":"Category status in the knowledge base. 0 - None; 1 - New; 2 - Updated; 3 - Custom"},"status_indicator_expiry_date":{"type":"string","description":"The number of days after which the article status will be removed","format":"date-time","nullable":true},"exclude_from_search":{"type":"boolean","description":"**true** - The caetgory will not appear in search results in the knowledge base\r\n**false** - The category will appear in search results in the knowledge base"},"exclude_from_ai_search":{"type":"boolean","description":"**true** - The AI search assistant will not fetch information from this page category; \r\n**false** - The AI search assistant will not exclude this page category while fetching information"},"related_articles":{"type":"array","items":{"$ref":"#/components/schemas/RelatedArticleData"},"description":"The list of related article IDs to show in the knowledge base","nullable":true},"content_type":{"allOf":[{"$ref":"#/components/schemas/ArticleContentType"}],"description":"0 - Markdown content; 1 - HTML content"},"is_acknowledgement_enabled":{"type":"boolean"}},"additionalProperties":false},"CategorySimpleData":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the category","nullable":true},"name":{"type":"string","description":"Name of the category","nullable":true},"order":{"type":"integer","description":"The position inside the parent category","format":"int32"},"icon":{"type":"string","description":"Unicode representation of the icon","nullable":true}},"additionalProperties":false},"CategorySimpleVersionCustomer":{"type":"object","properties":{"version_number":{"type":"integer","description":"The currently fetched version number of this category page","format":"int32"},"created_by":{"type":"string","description":"The ID of the user that created the category page","nullable":true},"created_at":{"type":"string","description":"The date the category page was created","format":"date-time"},"modified_at":{"type":"string","description":"The date the category page was last modified","format":"date-time"},"base_version":{"type":"integer","description":"The base version of the currently fetched category page","format":"int32"},"status":{"allOf":[{"$ref":"#/components/schemas/ArticleStatusCustomer"}],"description":"The status of the article: 0 - Draft, 3 - Published"},"profile_url":{"type":"string","description":"The URL of team account's profile image","nullable":true}},"additionalProperties":false},"CategoryType":{"enum":[0,1,2],"type":"integer","description":"0 - Folder, 1 - Page, 2 - Index","format":"int32"},"CategoryVersionData":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the category","nullable":true},"title":{"type":"string","description":"Category title","nullable":true},"content":{"type":"string","description":"Category page Markdown content","nullable":true},"html_content":{"type":"string","description":"Category page WYSIWYG(HTML) content","nullable":true},"block_content":{"type":"string","description":"Category page Advanced WYSIWYG content","nullable":true},"parent_category_id":{"type":"string","description":"Parent category ID","nullable":true},"project_document_version_id":{"type":"string","description":"Project document version ID","nullable":true},"version_number":{"type":"integer","description":"The currently fetched version number of this category page","format":"int32"},"public_version":{"type":"integer","description":"The version number that is currently published","format":"int32"},"latest_version":{"type":"integer","description":"The latest version number(revision) of this  category page.","format":"int32"},"enable_rtl":{"type":"boolean","description":"Indicates if Right to Left alignment is enabled for the category page language"},"hidden":{"type":"boolean","description":"Indicates if the category page is visible on the site"},"status":{"allOf":[{"$ref":"#/components/schemas/ArticleStatusCustomer"}],"description":"The status of the article: 0 - Draft, 3 - Published"},"created_by":{"type":"string","description":"The ID of the user that created the category page","nullable":true},"authors":{"type":"array","items":{"$ref":"#/components/schemas/UserProfileCustomer"},"description":"The list of authors that contributed to this category page","nullable":true},"created_at":{"type":"string","description":"The date the category page was created","format":"date-time"},"modified_at":{"type":"string","description":"The date the category page was last modified","format":"date-time"},"slug":{"type":"string","description":"The slug of the category page","nullable":true},"is_fall_back_content":{"type":"boolean","description":"Indicates whether the category page content is a fallback of the default language content or not"},"stale_status":{"allOf":[{"$ref":"#/components/schemas/StaleStatus"}],"description":"Fresh - Category page is up-to-date\r\nStale -  Category page requires review","nullable":true},"content_type":{"type":"string","description":"0 - Markdown\r\n1 - WYSIWYG(HTML)\r\n2 - Advanced WYSIWYG","nullable":true},"is_block_editor":{"type":"boolean","readOnly":true}},"additionalProperties":false},"CategoryVersionDataCustomer":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the category","nullable":true},"title":{"type":"string","description":"The title of the category","nullable":true},"content":{"type":"string","description":"The content of the category","nullable":true},"html_content":{"type":"string","description":"The HTML content of the category","nullable":true},"block_content":{"type":"string","description":"The HTML content of the category (Block editor)","nullable":true},"category_id":{"type":"string","description":"Existing category ID","nullable":true},"project_version_id":{"type":"string","description":"Existing project version ID","nullable":true},"version_number":{"type":"integer","description":"Category Version Number","format":"int32"},"public_version":{"type":"integer","description":"The ID of the project version where this category is located","format":"int32"},"latest_version":{"type":"integer","description":"The latest version number of this category","format":"int32"},"enable_rtl":{"type":"boolean","description":"Indicates if Right to Left alignment is enabled for the category language"},"hidden":{"type":"boolean","description":"Indicates if the category is visible on the site"},"status":{"allOf":[{"$ref":"#/components/schemas/ArticleStatusCustomer"}],"description":"The status of the category: 0 - Draft,  3 - Published"},"order":{"type":"integer","description":"The position inside the parent category","format":"int32"},"created_by":{"type":"string","description":"The ID of the user that created the category","nullable":true},"authors":{"type":"array","items":{"$ref":"#/components/schemas/UserProfileCustomer"},"description":"The list of authors that contributed to this category","nullable":true},"created_at":{"type":"string","description":"The date the category was created","format":"date-time"},"modified_at":{"type":"string","description":"The date the category was last modified","format":"date-time"},"slug":{"type":"string","description":"The slug of the category","nullable":true},"is_fall_back_content":{"type":"boolean","description":"Indicates whether the category content is a fallback of the default language content or not"}},"additionalProperties":false},"Content":{"type":"object","properties":{"value":{"type":"string","description":"Markup text with occurrences highlighted.","nullable":true},"match_level":{"type":"string","description":"Indicates how well the attribute matched the search query. Can be: none, partial, full","nullable":true}},"additionalProperties":false},"CreateArticleRequest":{"required":["category_id","project_version_id","title","user_id"],"type":"object","properties":{"title":{"minLength":1,"type":"string","description":"The title of the article"},"content":{"type":"string","description":"The content of the article, for any Editor type, use this property","nullable":true},"category_id":{"minLength":1,"type":"string","description":"The ID of the category where the article will be created"},"project_version_id":{"minLength":1,"type":"string","description":"The project version ID in which the article will be created"},"order":{"type":"integer","description":"The position of the article in the category tree (By default, it will be placed at the bottom of the category)","format":"int32"},"user_id":{"minLength":1,"type":"string","description":"The ID of the team account that will be marked as a contributor of the article"},"content_type":{"allOf":[{"$ref":"#/components/schemas/ArticleContentType"}],"description":"0 - Markdown; 1 - WYSIWYG(HTML); 2 - Advanced WYSIWYG","default":null,"nullable":true}},"additionalProperties":false},"CreateArticleResponse":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/ArticleSimpleDataCustomer"}],"description":"Create article response data","nullable":true},"extension_data":{"allOf":[{"$ref":"#/components/schemas/ExtensionDataObject"}],"description":"Extention data for customer API response","nullable":true},"success":{"type":"boolean","description":"Status indication for customer API response"},"errors":{"type":"array","items":{"$ref":"#/components/schemas/BaseError"},"description":"Errors in the customer API response","nullable":true},"warnings":{"type":"array","items":{"$ref":"#/components/schemas/BaseWarning"},"description":"Warnings in the customer API response","nullable":true},"information":{"type":"array","items":{"$ref":"#/components/schemas/BaseInformation"},"description":"Information passed by the customer API response","nullable":true}},"additionalProperties":false},"CustomerApiBaseResponse":{"type":"object","properties":{"extension_data":{"allOf":[{"$ref":"#/components/schemas/ExtensionDataObject"}],"description":"Extention data for customer API response","nullable":true},"success":{"type":"boolean","description":"Status indication for customer API response"},"errors":{"type":"array","items":{"$ref":"#/components/schemas/BaseError"},"description":"Errors in the customer API response","nullable":true},"warnings":{"type":"array","items":{"$ref":"#/components/schemas/BaseWarning"},"description":"Warnings in the customer API response","nullable":true},"information":{"type":"array","items":{"$ref":"#/components/schemas/BaseInformation"},"description":"Information passed by the customer API response","nullable":true}},"additionalProperties":false},"EditableElementTypes":{"enum":[0,1,2,3,4,5,6,7,8],"type":"integer","format":"int32"},"ExtensionDataObject":{"type":"object","additionalProperties":false},"FeatureAnalytics":{"type":"object","properties":{"section":{"allOf":[{"$ref":"#/components/schemas/SectionTypeEnum"}]},"feature_name":{"allOf":[{"$ref":"#/components/schemas/FeatureListEnum"}]},"is_feature_explored":{"type":"boolean"},"time_stamp":{"type":"string","format":"date-time"}},"additionalProperties":false},"FeatureExplorerStatus":{"type":"object","properties":{"feature_usage_score":{"type":"number","format":"double"},"section":{"allOf":[{"$ref":"#/components/schemas/SectionTypeEnum"}]},"feature_id":{"type":"string","nullable":true},"feature_name":{"allOf":[{"$ref":"#/components/schemas/FeatureListEnum"}]},"advanced_feature_user_role":{"allOf":[{"$ref":"#/components/schemas/FeatureExplorerUserRoleEnum"}]},"feature_explorer_user_analytics":{"allOf":[{"$ref":"#/components/schemas/FeatureExplorerUserAnalyticsEntity"}],"nullable":true}},"additionalProperties":false},"FeatureExplorerUserAnalyticsEntity":{"type":"object","properties":{"id":{"type":"string","nullable":true},"project_id":{"type":"string","nullable":true},"user_id":{"type":"string","nullable":true},"trophy_status":{"allOf":[{"$ref":"#/components/schemas/TrophyStatus"}],"nullable":true},"show_default":{"type":"boolean"},"show_advanced_section_popup":{"type":"boolean"},"hide_popup":{"type":"boolean"},"hide_popup_date":{"type":"string","format":"date-time"},"is_advanced_section_unlocked":{"type":"boolean"},"usage_score":{"type":"number","format":"double"},"features":{"type":"array","items":{"$ref":"#/components/schemas/FeatureAnalytics"},"nullable":true},"is_closed_content_reuse_info":{"type":"boolean"}},"additionalProperties":false},"FeatureExplorerUserRoleEnum":{"enum":[0,1,2],"type":"integer","format":"int32"},"FeatureListEnum":{"enum":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26],"type":"integer","format":"int32"},"ForkArticleVersionRequest":{"required":["lang_code","user_id","version_number"],"type":"object","properties":{"version_number":{"type":"integer","description":"The version number of the article to be forked","format":"int32"},"user_id":{"minLength":1,"type":"string","description":"The ID of the team account that will be marked as the contributor of this fork"},"lang_code":{"minLength":1,"type":"string","description":"Language code of the article"}},"additionalProperties":false},"ForkArticleVersionResponse":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/ArticleSimpleVersionCustomer"}],"description":"forked article data","nullable":true},"extension_data":{"allOf":[{"$ref":"#/components/schemas/ExtensionDataObject"}],"description":"Extention data for customer API response","nullable":true},"success":{"type":"boolean","description":"Status indication for customer API response"},"errors":{"type":"array","items":{"$ref":"#/components/schemas/BaseError"},"description":"Errors in the customer API response","nullable":true},"warnings":{"type":"array","items":{"$ref":"#/components/schemas/BaseWarning"},"description":"Warnings in the customer API response","nullable":true},"information":{"type":"array","items":{"$ref":"#/components/schemas/BaseInformation"},"description":"Information passed by the customer API response","nullable":true}},"additionalProperties":false},"ForkCategoryVersionRequest":{"required":["lang_code","user_id","version_number"],"type":"object","properties":{"version_number":{"type":"integer","description":"The version number of the category page","format":"int32"},"user_id":{"minLength":1,"type":"string","description":"The ID of the team account"},"lang_code":{"minLength":1,"type":"string","description":"Language code of the category"}},"additionalProperties":false},"ForkCategoryVersionResponse":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/CategorySimpleVersionCustomer"}],"description":"category response forked data","nullable":true},"extension_data":{"allOf":[{"$ref":"#/components/schemas/ExtensionDataObject"}],"description":"Extention data for customer API response","nullable":true},"success":{"type":"boolean","description":"Status indication for customer API response"},"errors":{"type":"array","items":{"$ref":"#/components/schemas/BaseError"},"description":"Errors in the customer API response","nullable":true},"warnings":{"type":"array","items":{"$ref":"#/components/schemas/BaseWarning"},"description":"Warnings in the customer API response","nullable":true},"information":{"type":"array","items":{"$ref":"#/components/schemas/BaseInformation"},"description":"Information passed by the customer API response","nullable":true}},"additionalProperties":false},"FormEditableProperties":{"type":"object","properties":{"element_name":{"type":"string","nullable":true},"element_type":{"allOf":[{"$ref":"#/components/schemas/EditableElementTypes"}],"nullable":true},"label":{"type":"string","nullable":true},"value":{"type":"string","nullable":true},"view_form_control":{"allOf":[{"$ref":"#/components/schemas/ViewFormControl"}],"nullable":true},"editable_properties":{"allOf":[{"$ref":"#/components/schemas/FormEditableProperties"}],"nullable":true},"element_guid":{"type":"string","nullable":true},"children":{"type":"array","items":{"$ref":"#/components/schemas/FormEditableProperties"},"nullable":true},"edit_component_style_properties":{"type":"object","additionalProperties":{},"nullable":true},"edit_component_properties":{"type":"object","additionalProperties":{},"nullable":true}},"additionalProperties":false},"GetApiReferenceDataResponseCustomer":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ApiDefinitionInforamtionCustomer"},"nullable":true},"extension_data":{"allOf":[{"$ref":"#/components/schemas/ExtensionDataObject"}],"description":"Extention data for customer API response","nullable":true},"success":{"type":"boolean","description":"Status indication for customer API response"},"errors":{"type":"array","items":{"$ref":"#/components/schemas/BaseError"},"description":"Errors in the customer API response","nullable":true},"warnings":{"type":"array","items":{"$ref":"#/components/schemas/BaseWarning"},"description":"Warnings in the customer API response","nullable":true},"information":{"type":"array","items":{"$ref":"#/components/schemas/BaseInformation"},"description":"Information passed by the customer API response","nullable":true}},"additionalProperties":false},"GetArticleResponseCustomer":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/ArticleVersionDataCustomerResponse"}],"description":"Article data","nullable":true},"extension_data":{"allOf":[{"$ref":"#/components/schemas/ExtensionDataObject"}],"description":"Extention data for customer API response","nullable":true},"success":{"type":"boolean","description":"Status indication for customer API response"},"errors":{"type":"array","items":{"$ref":"#/components/schemas/BaseError"},"description":"Errors in the customer API response","nullable":true},"warnings":{"type":"array","items":{"$ref":"#/components/schemas/BaseWarning"},"description":"Warnings in the customer API response","nullable":true},"information":{"type":"array","items":{"$ref":"#/components/schemas/BaseInformation"},"description":"Information passed by the customer API response","nullable":true}},"additionalProperties":false},"GetArticleSettingsResponse":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/ArticleSettingCustomer"}],"description":"Get article settings","nullable":true},"extension_data":{"allOf":[{"$ref":"#/components/schemas/ExtensionDataObject"}],"description":"Extention data for customer API response","nullable":true},"success":{"type":"boolean","description":"Status indication for customer API response"},"errors":{"type":"array","items":{"$ref":"#/components/schemas/BaseError"},"description":"Errors in the customer API response","nullable":true},"warnings":{"type":"array","items":{"$ref":"#/components/schemas/BaseWarning"},"description":"Warnings in the customer API response","nullable":true},"information":{"type":"array","items":{"$ref":"#/components/schemas/BaseInformation"},"description":"Information passed by the customer API response","nullable":true}},"additionalProperties":false},"GetArticleVersionResponse":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/ArticleVersionInfoCustomerResponse"}],"description":"Get article data","nullable":true},"extension_data":{"allOf":[{"$ref":"#/components/schemas/ExtensionDataObject"}],"description":"Extention data for customer API response","nullable":true},"success":{"type":"boolean","description":"Status indication for customer API response"},"errors":{"type":"array","items":{"$ref":"#/components/schemas/BaseError"},"description":"Errors in the customer API response","nullable":true},"warnings":{"type":"array","items":{"$ref":"#/components/schemas/BaseWarning"},"description":"Warnings in the customer API response","nullable":true},"information":{"type":"array","items":{"$ref":"#/components/schemas/BaseInformation"},"description":"Information passed by the customer API response","nullable":true}},"additionalProperties":false},"GetArticleVersionsResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ArticleSimpleVersionCustomer"},"description":"Article version response data","nullable":true},"extension_data":{"allOf":[{"$ref":"#/components/schemas/ExtensionDataObject"}],"description":"Extention data for customer API response","nullable":true},"success":{"type":"boolean","description":"Status indication for customer API response"},"errors":{"type":"array","items":{"$ref":"#/components/schemas/BaseError"},"description":"Errors in the customer API response","nullable":true},"warnings":{"type":"array","items":{"$ref":"#/components/schemas/BaseWarning"},"description":"Warnings in the customer API response","nullable":true},"information":{"type":"array","items":{"$ref":"#/components/schemas/BaseInformation"},"description":"Information passed by the customer API response","nullable":true}},"additionalProperties":false},"GetArticlesResponseCustomer":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ArticleSimpleDataCustomerResponse"},"nullable":true},"extension_data":{"allOf":[{"$ref":"#/components/schemas/ExtensionDataObject"}],"description":"Extention data for customer API response","nullable":true},"success":{"type":"boolean","description":"Status indication for customer API response"},"errors":{"type":"array","items":{"$ref":"#/components/schemas/BaseError"},"description":"Errors in the customer API response","nullable":true},"warnings":{"type":"array","items":{"$ref":"#/components/schemas/BaseWarning"},"description":"Warnings in the customer API response","nullable":true},"information":{"type":"array","items":{"$ref":"#/components/schemas/BaseInformation"},"description":"Information passed by the customer API response","nullable":true}},"additionalProperties":false},"GetCategoriesResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/CategoryDataCustomer"},"nullable":true},"extension_data":{"allOf":[{"$ref":"#/components/schemas/ExtensionDataObject"}],"description":"Extention data for customer API response","nullable":true},"success":{"type":"boolean","description":"Status indication for customer API response"},"errors":{"type":"array","items":{"$ref":"#/components/schemas/BaseError"},"description":"Errors in the customer API response","nullable":true},"warnings":{"type":"array","items":{"$ref":"#/components/schemas/BaseWarning"},"description":"Warnings in the customer API response","nullable":true},"information":{"type":"array","items":{"$ref":"#/components/schemas/BaseInformation"},"description":"Information passed by the customer API response","nullable":true}},"additionalProperties":false},"GetCategoryContentResponse":{"type":"object","properties":{"category":{"allOf":[{"$ref":"#/components/schemas/CategoryVersionData"}],"description":"Get category version data","nullable":true},"extension_data":{"allOf":[{"$ref":"#/components/schemas/ExtensionDataObject"}],"description":"Extention data for customer API response","nullable":true},"success":{"type":"boolean","description":"Status indication for customer API response"},"errors":{"type":"array","items":{"$ref":"#/components/schemas/BaseError"},"description":"Errors in the customer API response","nullable":true},"warnings":{"type":"array","items":{"$ref":"#/components/schemas/BaseWarning"},"description":"Warnings in the customer API response","nullable":true},"information":{"type":"array","items":{"$ref":"#/components/schemas/BaseInformation"},"description":"Information passed by the customer API response","nullable":true}},"additionalProperties":false},"GetCategoryResponse":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/CategoryDataCustomer"}],"nullable":true},"extension_data":{"allOf":[{"$ref":"#/components/schemas/ExtensionDataObject"}],"description":"Extention data for customer API response","nullable":true},"success":{"type":"boolean","description":"Status indication for customer API response"},"errors":{"type":"array","items":{"$ref":"#/components/schemas/BaseError"},"description":"Errors in the customer API response","nullable":true},"warnings":{"type":"array","items":{"$ref":"#/components/schemas/BaseWarning"},"description":"Warnings in the customer API response","nullable":true},"information":{"type":"array","items":{"$ref":"#/components/schemas/BaseInformation"},"description":"Information passed by the customer API response","nullable":true}},"additionalProperties":false},"GetCategorySettingsResponse":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/CategorySettingsCustomer"}],"description":"This is to get category settings data","nullable":true},"extension_data":{"allOf":[{"$ref":"#/components/schemas/ExtensionDataObject"}],"description":"Extention data for customer API response","nullable":true},"success":{"type":"boolean","description":"Status indication for customer API response"},"errors":{"type":"array","items":{"$ref":"#/components/schemas/BaseError"},"description":"Errors in the customer API response","nullable":true},"warnings":{"type":"array","items":{"$ref":"#/components/schemas/BaseWarning"},"description":"Warnings in the customer API response","nullable":true},"information":{"type":"array","items":{"$ref":"#/components/schemas/BaseInformation"},"description":"Information passed by the customer API response","nullable":true}},"additionalProperties":false},"GetCategoryVersionsResponse":{"type":"object","properties":{"versions":{"type":"array","items":{"$ref":"#/components/schemas/CategorySimpleVersionCustomer"},"description":"get category data by version","nullable":true},"extension_data":{"allOf":[{"$ref":"#/components/schemas/ExtensionDataObject"}],"description":"Extention data for customer API response","nullable":true},"success":{"type":"boolean","description":"Status indication for customer API response"},"errors":{"type":"array","items":{"$ref":"#/components/schemas/BaseError"},"description":"Errors in the customer API response","nullable":true},"warnings":{"type":"array","items":{"$ref":"#/components/schemas/BaseWarning"},"description":"Warnings in the customer API response","nullable":true},"information":{"type":"array","items":{"$ref":"#/components/schemas/BaseInformation"},"description":"Information passed by the customer API response","nullable":true}},"additionalProperties":false},"GetLanguageFromProjectVersion":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ProjectLanguage"},"description":"All Language data in a poject","nullable":true},"extension_data":{"allOf":[{"$ref":"#/components/schemas/ExtensionDataObject"}],"description":"Extention data for customer API response","nullable":true},"success":{"type":"boolean","description":"Status indication for customer API response"},"errors":{"type":"array","items":{"$ref":"#/components/schemas/BaseError"},"description":"Errors in the customer API response","nullable":true},"warnings":{"type":"array","items":{"$ref":"#/components/schemas/BaseWarning"},"description":"Warnings in the customer API response","nullable":true},"information":{"type":"array","items":{"$ref":"#/components/schemas/BaseInformation"},"description":"Information passed by the customer API response","nullable":true}},"additionalProperties":false},"GetProjectVersionsResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ProjectVersionCustomer"},"nullable":true},"extension_data":{"allOf":[{"$ref":"#/components/schemas/ExtensionDataObject"}],"description":"Extention data for customer API response","nullable":true},"success":{"type":"boolean","description":"Status indication for customer API response"},"errors":{"type":"array","items":{"$ref":"#/components/schemas/BaseError"},"description":"Errors in the customer API response","nullable":true},"warnings":{"type":"array","items":{"$ref":"#/components/schemas/BaseWarning"},"description":"Warnings in the customer API response","nullable":true},"information":{"type":"array","items":{"$ref":"#/components/schemas/BaseInformation"},"description":"Information passed by the customer API response","nullable":true}},"additionalProperties":false},"Hit":{"type":"object","properties":{"title":{"type":"string","description":"Article title","nullable":true},"content":{"type":"string","description":"Article HTML content","nullable":true},"is_hidden":{"type":"boolean","description":"Indicates if the article is visible on the site","nullable":true},"tags":{"type":"array","items":{"type":"string"},"description":"Custom article tags","nullable":true},"slug":{"type":"string","description":"The slug of the article","nullable":true},"version":{"type":"integer","description":"The version number that is currently published","format":"int32","nullable":true},"article_id":{"type":"string","description":"The ID of the article","nullable":true},"category_id":{"type":"string","description":"The ID of the category","nullable":true},"is_category_hidden":{"type":"boolean","description":"Indicates if category is visible on the site","nullable":true},"order":{"type":"integer","description":"The position inside the parent category","format":"int32"},"is_draft":{"type":"boolean","description":"Indicates if the article is marked as a draft","nullable":true},"exclude":{"type":"boolean","description":"Indicates if the article is excluded from search results on user website","nullable":true},"breadcrumb":{"type":"string","description":"The breadcrumb of the article","nullable":true},"is_category":{"type":"boolean","description":"If the value is True, then the object has to considered as a category, otherwise it is an article","nullable":true},"attachment_ids":{"type":"array","items":{},"description":"The IDs of the files attached to the article","nullable":true},"is_deleted":{"type":"boolean","description":"If the value is True, then it indicates that the article has been deleted","nullable":true},"is_folder_type_category":{"type":"boolean","description":"If the value is True, then it indicates that the category is a folder type category","nullable":true},"updated_on_timestamp":{"type":"number","description":"The last updated timestamp of the article","format":"double","nullable":true},"is_private":{"type":"boolean","description":"If the value is True, then the article can only be accessed by logged in users in the knowledge base site"},"language_id":{"type":"string","description":"The ID of the language","nullable":true},"project_id":{"type":"string","description":"The ID of the project","nullable":true},"is_latest_version":{"type":"boolean","description":"If the value is True, then the article is the latest version","nullable":true},"contributors":{"type":"array","items":{"type":"string"},"description":"The IDs of users who have contributed to the article","nullable":true},"is_shared_article":{"type":"integer","description":"If the value is True, then it indicates that it is a shared article","format":"int32","nullable":true},"lang_code":{"type":"string","description":"The language code of the article or category","nullable":true},"category_unique_id":{"type":"string","description":"A unique identifier for the category which is a combination of category ID and the language code","nullable":true},"unique_id":{"type":"string","description":"A unique identifier for the article which is a combination of article ID and the language code","nullable":true},"deleted_by":{"type":"string","description":"The ID of the user who deleted the article","nullable":true},"deleted_at":{"type":"string","description":"The timestamp when the article was deleted","nullable":true},"is_git_hub_entity":{"type":"boolean","description":"If the value is True, then it indicates that the article is synced from GitHub"},"original_article_id":{"type":"string","description":"The original article ID. Applicable only for shared articles.","nullable":true},"object_id":{"type":"string","description":"algolia search object ID","nullable":true},"_snippet_result":{"allOf":[{"$ref":"#/components/schemas/_Snippetresult"}],"description":"Markup text with occurrences highlighted.","nullable":true},"_highlight_result":{"allOf":[{"$ref":"#/components/schemas/_Highlightresult"}],"description":"Highlighted attributes","nullable":true}},"additionalProperties":false},"Language":{"type":"object","properties":{"id":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"code":{"type":"string","nullable":true},"set_as_default":{"type":"boolean"},"hidden":{"type":"boolean"},"enable_rtl":{"type":"boolean"},"site_protection_level":{"allOf":[{"$ref":"#/components/schemas/ProjectProtection"}]},"is_inheritance_disabled":{"type":"boolean"},"has_inheritance_disabled_categories_or_articles":{"type":"boolean"},"country_flag_code":{"type":"string","nullable":true},"is_home_page_enabled":{"type":"boolean"},"version_display_name":{"type":"string","nullable":true}},"additionalProperties":false},"LanguageTranslationOption":{"enum":[0,1,2,3],"type":"integer","description":"0 - None, 1 - Needs transation, 2 - Translated, 3 - In progress","format":"int32"},"ProjectLanguage":{"type":"object","properties":{"language_id":{"type":"string","description":"The ID of the language","nullable":true},"language_code":{"type":"string","description":"The code of the language","nullable":true},"language_name":{"type":"string","description":"The name of the language","nullable":true},"is_set_as_default":{"type":"boolean","description":"`True` - Default language of the version; `False` - Non-default language of the version"},"country_flag_code":{"type":"string","description":"The code of the country flag","nullable":true}},"additionalProperties":false},"ProjectProtection":{"enum":[0,1,2],"type":"integer","format":"int32"},"ProjectVersionCustomer":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the project version","nullable":true},"version_number":{"type":"number","description":"Project version number","format":"double"},"base_version_number":{"type":"number","description":"The version number from which this version is derived","format":"double"},"version_code_name":{"type":"string","description":"Custom version name","nullable":true},"is_main_version":{"type":"boolean","description":"\"True\" if this version is the main version after loading documentation"},"is_beta":{"type":"boolean","description":"\"True\" if this version is marked as Beta"},"is_public":{"type":"boolean","description":"\"True\" if this version is visible to the public"},"is_deprecated":{"type":"boolean","description":"\"True\" if this version is marked as deprecated"},"created_at":{"type":"string","description":"The date and time the version was created","format":"date-time"},"modified_at":{"type":"string","description":"The last date and time the version was modified","format":"date-time"},"language_versions":{"type":"array","items":{"$ref":"#/components/schemas/Language"},"nullable":true},"slug":{"type":"string","nullable":true},"order":{"type":"integer","format":"int32"},"version_type":{"allOf":[{"$ref":"#/components/schemas/ProjectVersionTypeCustomer"}],"description":"0 - KB workspace ; 1 - API Reference workspace;"}},"additionalProperties":false},"ProjectVersionTypeCustomer":{"enum":[0,1],"type":"integer","description":"0 - KB workspace , 1 - API Reference workspace","format":"int32"},"PublishArticleRequest":{"required":["user_id","version_number"],"type":"object","properties":{"user_id":{"minLength":1,"type":"string","description":"The ID of the team account that will be marked as the contributor of this publish"},"version_number":{"maximum":32767,"minimum":1,"type":"integer","description":"The version number of the article to be published","format":"int32"},"publish_message":{"type":"string","description":"The publish message of the article","nullable":true}},"additionalProperties":false},"PublishCategoryRequest":{"required":["user_id","version_number"],"type":"object","properties":{"user_id":{"minLength":1,"type":"string","description":"The ID of the team account who is responsible for the publish"},"version_number":{"maximum":32767,"minimum":1,"type":"integer","description":"The version number of the category","format":"int32"},"publish_message":{"type":"string","description":"Publish message for the category","nullable":true}},"additionalProperties":false},"RelatedArticleData":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the article","nullable":true},"title":{"type":"string","description":"The title of the article","nullable":true},"hidden":{"type":"boolean","description":"`True` indicates that the article is hidden"},"slug":{"type":"string","description":"The slug of the article","nullable":true}},"additionalProperties":false},"SSOUserTypes":{"enum":[0,1,2],"type":"integer","description":"SSO user type 0 - Normal user, 1 - SSO user, 2 - Invited SSO user","format":"int32"},"SearchProjectVersionResponseCustomerApi":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/ArticleMatchedData"}],"nullable":true},"extension_data":{"allOf":[{"$ref":"#/components/schemas/ExtensionDataObject"}],"description":"Extention data for customer API response","nullable":true},"success":{"type":"boolean","description":"Status indication for customer API response"},"errors":{"type":"array","items":{"$ref":"#/components/schemas/BaseError"},"description":"Errors in the customer API response","nullable":true},"warnings":{"type":"array","items":{"$ref":"#/components/schemas/BaseWarning"},"description":"Warnings in the customer API response","nullable":true},"information":{"type":"array","items":{"$ref":"#/components/schemas/BaseInformation"},"description":"Information passed by the customer API response","nullable":true}},"additionalProperties":false},"SectionTypeEnum":{"enum":[0,1,2,3,4,5],"type":"integer","format":"int32"},"StaleStatus":{"type":"object","properties":{"article_stale_status":{"allOf":[{"$ref":"#/components/schemas/ArticleStaleStatus"}],"description":"The status of the article: 0 - None, 1 - New, 2 - Updated, 3 - Custom"},"stale_reason":{"type":"string","nullable":true},"expired_at":{"type":"string","format":"date-time"}},"additionalProperties":false},"Title":{"type":"object","properties":{"value":{"type":"string","description":"Markup text with occurrences highlighted.","nullable":true},"match_level":{"type":"string","description":"Indicates how well the attribute matched the search query. Can be: none, partial, full","nullable":true},"fully_highlighted":{"type":"boolean"},"matched_words":{"type":"array","items":{"type":"string"},"description":"List of words from the query that matched the object.","nullable":true}},"additionalProperties":false},"TrophyStatus":{"type":"object","properties":{"first":{"type":"boolean"},"second":{"type":"boolean"},"third":{"type":"boolean"},"fourth":{"type":"boolean"}},"additionalProperties":false},"UIElement":{"type":"object","properties":{"element_type":{"allOf":[{"$ref":"#/components/schemas/UIElementType"}]},"element_name":{"type":"string","nullable":true},"element_guid":{"type":"string","nullable":true},"display_name":{"type":"string","nullable":true},"view_styles":{"type":"object","additionalProperties":{},"nullable":true},"view_properties":{"type":"object","additionalProperties":{},"nullable":true},"editable_properties":{"type":"array","items":{"$ref":"#/components/schemas/FormEditableProperties"},"nullable":true},"children":{"type":"array","items":{"$ref":"#/components/schemas/UIElement"},"nullable":true}},"additionalProperties":false},"UIElementType":{"enum":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"type":"integer","format":"int32"},"UpdateArticleRequest":{"type":"object","properties":{"title":{"type":"string","description":"The title of the article","nullable":true},"content":{"type":"string","description":"The content of the article, for any Editor type, use this property.","nullable":true},"html_content":{"type":"string","description":"The HTML content of the article. If the editor type is WYSIWYG (HTML), use this property - (This property is deprecated and will be removed in a future version of the API.  Kindly use **content** property instead of this.)","nullable":true,"deprecated":true},"category_id":{"type":"string","description":"The ID of the category. If the article has to be moved to another category, enter the desired category ID","nullable":true},"hidden":{"type":"boolean","description":"Visibility status of the article. **true** - Article will be hidden; **false** - Article will be shown"},"version_number":{"type":"integer","description":"The version number of the article to be updated. The latest version is updated by default.","format":"int32","nullable":true},"translation_option":{"type":"string","description":"Translation status of the article. 0 - None, 1 - Needs translation, 2 Translated","nullable":true},"source":{"type":"string","description":"Free text used for future reference","nullable":true},"order":{"type":"integer","description":"To update the position of the article in the category tree. (Default value is 0, and the order starts from 1 when explicitly set or updated).","format":"int32"}},"additionalProperties":false},"UpdateArticleSettingsRequest":{"type":"object","properties":{"slug":{"type":"string","description":"The slug of the article","nullable":true},"seo_title":{"type":"string","description":"The SEO title of the article","nullable":true},"description":{"type":"string","description":"The SEO description of the article","nullable":true},"allow_comments":{"type":"boolean","description":"Enable or disable the commenting on the article. **true** - Commenting will be enabled; **false** - Commenting will be disabled"},"show_table_of_contents":{"type":"boolean","description":"Enable or disable the Table of Contents (TOC) for the article in the knowledge base. **true** - TOC will be enabled; **false** - TOC will be disabled"},"tags":{"type":"array","items":{"type":"string"},"description":"Custom article tags","nullable":true},"status_indicator":{"allOf":[{"$ref":"#/components/schemas/ArticleStatusIndicator"}],"description":"Article status in the knowledge base. 0 - None; 1 - New; 2 - Updated; 3 - Custom"},"status_indicator_expiry_date":{"type":"string","description":"The date-time when the public article status is removed","format":"date-time","nullable":true},"exclude_from_search":{"type":"boolean","description":"**true** - The article will not appear in search results in the knowledge base; **false** - The article will appear in search results in the knowledge base"},"exclude_from_ai_search":{"type":"boolean","description":"**true** - The Eddy-AI assistant will not fetch information from this article; **false** - The Eddy-AI assistant will not exclude this article while fetching information"},"related_articles":{"type":"array","items":{"type":"string"},"description":"The list of related article IDs to show in the knowledge base","nullable":true},"content_type":{"allOf":[{"$ref":"#/components/schemas/ArticleContentType"}],"description":"0 - Markdown; 1 - WYSIWYG(HTML); 2 - Advanced WYSIWYG"},"is_acknowledgement_enabled":{"type":"boolean"}},"additionalProperties":false},"UpdateArticleSettingsResponseCustomer":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/ArticleSettingCustomerResponse"}],"description":"update article settings","nullable":true},"extension_data":{"allOf":[{"$ref":"#/components/schemas/ExtensionDataObject"}],"description":"Extention data for customer API response","nullable":true},"success":{"type":"boolean","description":"Status indication for customer API response"},"errors":{"type":"array","items":{"$ref":"#/components/schemas/BaseError"},"description":"Errors in the customer API response","nullable":true},"warnings":{"type":"array","items":{"$ref":"#/components/schemas/BaseWarning"},"description":"Warnings in the customer API response","nullable":true},"information":{"type":"array","items":{"$ref":"#/components/schemas/BaseInformation"},"description":"Information passed by the customer API response","nullable":true}},"additionalProperties":false},"UpdateCategoryContentCustomerRequest":{"type":"object","properties":{"title":{"type":"string","description":"The title of the category","nullable":true},"content":{"type":"string","description":"The content of the category, for any Editor type, use this property.","nullable":true},"html_content":{"type":"string","description":"The HTML content of the category. If the editor type is WYSIWYG (HTML), use this property - (This property is deprecated and will be removed in a future version of the API, Kindly use **content** property instead of this.)","nullable":true,"deprecated":true},"block_content":{"type":"string","description":"The HTML content of the category. If the editor type is Block Editor (HTML), use this property - (This property is deprecated and will be removed in a future version of the API, Kindly use **content** property instead of this.)","nullable":true,"deprecated":true},"version_number":{"type":"integer","description":"The version number of the category to be updated. The latest version is updated by default.","format":"int32","nullable":true},"translation_option":{"type":"string","description":"Translation status of the category. 0 - None, 1 - Needs translation, 2 Translated","nullable":true},"source":{"type":"string","description":"Free text used for future reference","nullable":true},"updated_by":{"type":"string","description":"The ID of the team account responsible for the category update","nullable":true}},"additionalProperties":false},"UpdateCategoryContentCustomerResponse":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/CategoryVersionDataCustomer"}],"description":"category version data","nullable":true},"extension_data":{"allOf":[{"$ref":"#/components/schemas/ExtensionDataObject"}],"description":"Extention data for customer API response","nullable":true},"success":{"type":"boolean","description":"Status indication for customer API response"},"errors":{"type":"array","items":{"$ref":"#/components/schemas/BaseError"},"description":"Errors in the customer API response","nullable":true},"warnings":{"type":"array","items":{"$ref":"#/components/schemas/BaseWarning"},"description":"Warnings in the customer API response","nullable":true},"information":{"type":"array","items":{"$ref":"#/components/schemas/BaseInformation"},"description":"Information passed by the customer API response","nullable":true}},"additionalProperties":false},"UpdateCategoryContentRequest":{"type":"object","properties":{"category_id":{"type":"string","description":"Category ID for updating the content","nullable":true},"lang_code":{"type":"string","description":"Language Code for updating the content","nullable":true},"title":{"type":"string","description":"The title of the category","nullable":true},"content":{"type":"string","description":"The content of the category, for any Editor type, use this property.","nullable":true},"html_content":{"type":"string","description":"The HTML content of the category. If the editor type is WYSIWYG (HTML), use this property - (This property is deprecated and will be removed in a future version of the API, Kindly use **content** property instead of this.)","nullable":true,"deprecated":true},"block_content":{"type":"string","description":"The HTML content of the category. If the editor type is Block Editor (HTML), use this property - (This property is deprecated and will be removed in a future version of the API, Kindly use **content** property instead of this.)","nullable":true,"deprecated":true},"version_number":{"type":"integer","description":"The version number of the category to be updated. The latest version is updated by default.","format":"int32","nullable":true},"translation_option":{"type":"string","description":"Translation status of the category. 0 - None, 1 - Needs translation, 2 Translated","nullable":true},"source":{"type":"string","description":"Free text used for future reference","nullable":true},"updated_by":{"type":"string","description":"The ID of the team account responsible for the category update","nullable":true}},"additionalProperties":false,"description":"Update category content"},"UpdateCategoryRequest":{"type":"object","properties":{"name":{"type":"string","description":"The name of the category","nullable":true},"order":{"type":"integer","description":"The position of the category. By default, it will be added at the end of the parent category.","format":"int32"},"parent_category_id":{"type":"string","description":"The ID of the category where the category will be moved. By default, it will be created at the first level.","nullable":true},"hidden":{"type":"boolean","description":"Visibility status of the category. **true** - Category will be hidden; **false** - Category will be shown"},"icon":{"type":"string","description":"The icon of the category. Specify the Unicode icon. Example: \ud83d\udcdc (Windows 10 - Win key + . or Mac \u2303-\u2318-Space Bar to open emoji menu)","nullable":true},"language":{"type":"string","description":"Language code of the category. If language is not specified, the category would be updated in the default language.","nullable":true}},"additionalProperties":false},"UpdateCategoryResponse":{"type":"object","properties":{"data":{"allOf":[{"$ref":"#/components/schemas/CategorySimpleData"}],"description":"category simple data","nullable":true},"extension_data":{"allOf":[{"$ref":"#/components/schemas/ExtensionDataObject"}],"description":"Extention data for customer API response","nullable":true},"success":{"type":"boolean","description":"Status indication for customer API response"},"errors":{"type":"array","items":{"$ref":"#/components/schemas/BaseError"},"description":"Errors in the customer API response","nullable":true},"warnings":{"type":"array","items":{"$ref":"#/components/schemas/BaseWarning"},"description":"Warnings in the customer API response","nullable":true},"information":{"type":"array","items":{"$ref":"#/components/schemas/BaseInformation"},"description":"Information passed by the customer API response","nullable":true}},"additionalProperties":false},"UserAccess":{"enum":[1,2,3,4,7],"type":"integer","format":"int32"},"UserDetailsCustomer":{"type":"object","properties":{"id":{"type":"string","nullable":true},"first_name":{"type":"string","nullable":true},"last_name":{"type":"string","nullable":true},"user_description":{"type":"string","nullable":true},"unique_user_name":{"type":"string","nullable":true},"email_id":{"type":"string","nullable":true},"profile_logo_url":{"type":"string","nullable":true},"profile_logo_cdn_url":{"type":"string","nullable":true},"is_enterprise_user":{"type":"boolean"}},"additionalProperties":false},"UserProfileCustomer":{"type":"object","properties":{"id":{"type":"string","nullable":true},"first_name":{"type":"string","nullable":true},"last_name":{"type":"string","nullable":true},"email_id":{"type":"string","nullable":true},"profile_logo_url":{"type":"string","nullable":true},"user_role":{"allOf":[{"$ref":"#/components/schemas/UserAccess"}]},"last_login_at":{"type":"string","format":"date-time","nullable":true},"unique_user_name":{"type":"string","nullable":true},"sso_user_type":{"allOf":[{"$ref":"#/components/schemas/SSOUserTypes"}],"description":"SSO user type 0 - Normal user, 1 - SSO user, 2 - Invited SSO user"},"is_sso_user":{"type":"boolean"}},"additionalProperties":false},"VectorSearchReferenceArticles":{"type":"object","properties":{"category_id":{"type":"string","nullable":true},"category_title":{"type":"string","nullable":true},"category_slug":{"type":"string","nullable":true},"version_name":{"type":"string","nullable":true},"version_slug":{"type":"string","nullable":true},"article_id":{"type":"string","nullable":true},"article_title":{"type":"string","nullable":true},"article_slug":{"type":"string","nullable":true},"version_display_name":{"type":"string","nullable":true},"language_code":{"type":"string","nullable":true}},"additionalProperties":false},"ViewFormControl":{"type":"object","properties":{"property_key":{"type":"string","nullable":true},"is_children":{"type":"integer","format":"int32"},"view_type":{"type":"string","nullable":true},"element_name":{"type":"string","nullable":true},"is_children_root":{"type":"boolean"},"element_type":{"type":"string","nullable":true},"inverted_value":{"type":"boolean"},"is_dirty":{"type":"boolean"}},"additionalProperties":false},"_Highlightresult":{"type":"object","properties":{"title":{"allOf":[{"$ref":"#/components/schemas/Title"}],"nullable":true}},"additionalProperties":false},"_Snippetresult":{"type":"object","properties":{"content":{"allOf":[{"$ref":"#/components/schemas/Content"}],"nullable":true}},"additionalProperties":false}},"securitySchemes":{"api_token":{"type":"apiKey","description":"Enter REST API key. To generate a key, go to Settings \u2192 Knowledge base portal \u2192 API tokens","name":"api_token","in":"header"}}},"security":[{"api_token":[]}]}

... (Data file content truncated to first 5 lines)
</document_content>
</document>

<document index="30">
<source>docs/document361.json</source>
<document_content>
[
  {
    "heading": "What is Document360?",
    "text": "## What is Document360?\n\nHere is an overview and a navigation guide to help you get started with your Document360 experience.\n\n### What is Document360?\n\n**Document360** is a Knowledge management platform that allows you to create and curate a self-service public, private, or mixed access Knowledge base.\n\nWhen using Document360, you'll interact with several key interfaces:\n\n* #### [My Projects](/help/docs/document360-getting-started#my-projects)\n* #### [Knowledge base portal](/help/docs/document360-getting-started#knowledge-base-portal)\n* #### [Knowledge base site](/help/docs/document360-getting-started#knowledge-base-site)\n* #### [Document360 AI - Eddy AI](/help/docs/ai-features)\n* #### [Resources](/help/docs/document360-getting-started#other-resources)\n\n---",
    "summary": "## What is Document360?\n\n**Document360** is a Knowledge management platform for creating public, private, or mixed-access self-service knowledge bases. Key interfaces include **My Projects**, **Knowledge base portal**, **Knowledge base site,** ** Eddy AI**, and **Resources.**"

... (Data file content truncated to first 5 lines)
</document_content>
</document>

<document index="31">
<source>docs/document362.json</source>
<document_content>
[
  {
    "heading": "Table of Contents",
    "text": "## Table of Contents\n\n- [What is Document360?](#document360-getting-started)\n- [Sign up to Document360](#sign-up-to-document-360)\n- [System and browser requirements](#system-and-browser-requirements)\n- [Project dashboard](#document360-my-projects)\n- [Top-right menu overview](#top-right-menu-overview)\n- [Creating a project in Document360](#creating-a-project)\n- [Dashboard](#dashboard)\n- [Multilingual Knowledge bases](#getting-started-with-multi-lingual-knowledge-base)\n- [Creating a sandbox project](#creating-a-sandbox-project)\n- [Document360 security and infrastructure](#quick-summary-of-the-security-and-infrastructure-aspects)\n- [X-Frame options](#x-frame-options)\n- [Content security policy](#content-security-policy)\n- [CSP and Whitelisting guidelines for Document360 widget](#csp-guidelines-for-document360-widget)\n- [Bot management](#bot-management)\n- [Fair usage policy for bot management](#fair-usage-policy-for-bot-management)\n- [Editor choices in Document360](#using-the-text-editor)\n- [Elements of the editor](#elements-of-the-editor)\n- [Markdown editor](#markdown-editor-overview)\n- [Basic Markdown syntax](#markdown-basics)\n- [WYSIWYG editor](#wysiwyg-editor)\n- [Advanced WYSIWYG editor](#advanced-wysiwyg-editor)\n- [Advanced WYSIWYG editor basics](#advanced-wysiwyg-editor-basics)\n- [Movable blocks in Advanced WYSIWYG editor](#movable-blocks-in-advanced-wysiwyg-editor)\n- [Conditional content blocks in Advanced WYSIWYG editor](#conditional-content-blocks)\n- [Tables in Advanced WYSIWYG editor](#tables-in-advanced-wysiwyg-editor)\n- [Image formatting in the Advanced WYSIWYG editor](#image-formatting-in-the-advanced-wysiwyg-editor)\n- [Tabs in the Advanced WYSIWYG editor](#tabs-in-the-advanced-wysiwyg-editor)\n- [Categories and subcategories](#categories-and-subcategories)\n- [Managing categories](#managing-categories)\n- [Category types](#category-types)\n- [Mapping a category with a folder in Drive](#assigning-drive-folder-for-a-category)\n- [Downloading category and article in KB site](#downloading-category-and-article-in-kb-site)\n- [Managing articles](#managing-articles)\n- [Word .docx files](#article-import-from-word-files)\n- [Publishing an article](#publishing-an-article)\n- [Reviewing an article using Inline comments](#reviewing-an-article-inline-comments)\n- [Adding images to articles](#adding-images-to-articles)\n- [Adding videos in articles](#adding-videos-in-articles)\n- [Adding files to article](#adding-files-to-articles)\n- [Adding hyperlinks](#linking-to-other-articles)\n- [Code blocks](#code-blocks)\n- [Adding private notes](#private-notes)\n- [Embedding Stream videos in articles](#embedding-microsoft-streams-video-in-articles)\n- [Embedding Google forms in articles](#embedding-google-forms-in-article)\n- [Embedding a Draw.io diagram](#embedding-a-drawio-diagram)\n- [All articles - Overview page](#all-articles-overview-page)\n- [Using filters in All articles page](#filter-bulk-operations)\n- [Export All articles list](#export-bulk-operations)\n- [Article review reminder](#review-reminders)\n- [Article SEO](#article-seo)\n- [Excluding articles from search engines](#excluding-articles-from-searches)\n- [Change the URL of an article](#changing-the-url-of-an-article)\n- [Article tags](#article-tags)\n- [Add article labels](#adding-article-labels)\n- [Related articles](#related-articles)\n- [Featured image](#featured-image)\n- [Attachments](#attachments)\n- [Status indicator](#status-indicator)\n- [Article status](#article-status)\n- [Preferences](#preferences)\n- [Show/hide table of contents for an article](#showhide-table-of-contents-for-an-article)\n- [Mark as deprecated](#marking-articles-as-deprecated)\n- [Update article contributors](#updating-article-contributors)\n- [Schedule publishing](#schedule-publishing)\n- [Discussion feed](#article-discussion-feed)\n- [Revision history](#revision-history)\n- [Article analytics](#article-analytics)\n- [Security - Article access control](#article-access-control-knowledge-base-site)\n- [Health check metrics](#health-check-metrics)\n- [Readability score](#readability-score)\n- [Sitemap](#sitemap-generator)\n- [Public article comments](#public-comments)\n- [Robots.txt](#robotstxt)\n- [Read receipt](#read-receipt)\n- [Share articles via private link](#share-articles-via-private-link)\n- [Eddy AI customization](#ai-customization)\n- [AI machine translation](#ai-machine-translation)\n- [Eddy AI trust page](#eddy-ai-trust-page)\n- [AI writer suite](#ai-writer-suite)\n- [AI writer](#ai-writer)\n- [AI FAQ generator](#ai-faq-generator)\n- [AI title recommender](#ai-title-recommender)\n- [AI SEO description generator](#seo-description-generator)\n- [AI tag recommender](#ai-tag-recommender)\n- [AI related articles recommender](#ai-related-articles-recommender)\n- [AI Chart generator](#ai-chart-generator)\n- [AI alt text generator](#ai-alt-text-generator)\n- [AI search suite](#ai-search-suite)\n- [AI assistive search (Ask Eddy AI)](#ai-assistive-search-ask-eddy)\n- [AI dynamic related articles recommendation](#ai-dynamic-related-articles-recommendation)\n- [AI Chatbot](#ai-chatbot)\n- [Securing Chatbot authentication using JWT](#securing-chatbot-authentication-using-jwt)\n- [Styling the Chatbot](#styling-the-chatbot)\n- [Adding external sources for AI Assistive search](#eddy-ai-federated-search)\n- [AI article summarizer](#ai-article-summarizer)\n- [Ask Eddy AI API](#ask-eddy-ai-api)\n- [Enhancing accessibility with our read out loud feature](#text-to-voice-functionality)\n- [AI premium suite](#ai-premium-suite)\n- [AI glossary generator](#ai-glossary-generator)\n- [How to write GenAI friendly content](#how-to-write-genai-friendly-content)\n- [Prompt engineering tips](#prompt-engineering-tips)\n- [File management](#drive)\n- [Adding folders and files](#adding-folders-and-files)\n- [Folder actions in Drive](#folder-actions-in-drive)\n- [File actions in Drive](#file-actions-in-drive)\n- [All files overview](#all-content-overview)\n- [Recent, Starred, and Recycle bin files](#recycle-bin-recent-and-starred-files)\n- [Workflow designer](#workflow-designer)\n- [Managing workflow status](#managing-workflow-status)\n- [Workflow assignment](#workflow-assignment)\n- [Templates](#article-templates)\n- [Variables](#variables)\n- [Snippet](#snippets)\n- [Glossary](#glossary)\n- [Adding glossary terms](#adding-glossary-term)\n- [Inserting glossary term in an article](#adding-glossary-term-in-articles)\n- [Managing glossary terms](#editing-and-deleting-glossary-term)\n- [Managing the glossary landing page](#glossary-overview-page)\n- [Feedback manager](#feedback-manager-overview)\n- [Custom pages](#custom-pages)\n- [Tags](#tags)\n- [Manage tags page overview](#tag-manager-overview-page)\n- [Adding a new tag](#adding-a-new-tag)\n- [Tag groups page overview](#tag-groups-overview)\n- [Manage tag dependencies](#tag-dependency-viewer)\n- [Find and replace](#find-and-replace)\n- [SEO descriptions](#seo-descriptions)\n- [Exporting your Document360 project as a ZIP file](#export-documentation-as-zip)\n- [Importing a Document360 project ZIP file](#import-a-documentation-project)\n- [Migrating documentation from other platforms](#migrating-documentation-from-another-knowledge-base-platform)\n- [Designing a PDF template](#pdf-design-templates)\n- [Compiling content for PDF](#compliling-content-for-pdf)\n- [Analytics](#analytics)\n- [Articles analytics](#articles-analytics)\n- [Eddy AI search analytics](#eddy-ai-search-analytics)\n- [Search analytics](#analytics-search)\n- [Reader analytics](#reader-analytics)\n- [Team accounts analytics](#analytics-team-accounts)\n- [Feedback analytics](#feedback)\n- [Links status analytics](#links-status)\n- [Ticket deflector analytics](#ticket-deflector-overview)\n- [Managing API documentation](#manage-api-documentation)\n- [Edit, Clone, and Delete widget](#edit-clone-and-delete)\n- [Managing and customizing the Knowledge base widget](#managing-and-customizing-the-knowledge-base-widget)\n- [URL Mapping](#url-mapping)\n- [Customizing the Knowledge base widget using Custom CSS/JavaScript](#customizing-the-kb-widget-using-custom-css-javascript)\n- [FAQ - Knowledge base widget](#faq-knowledge-base-widget)\n- [Knowledge base site 2.0](#knowledge-base-site-20)\n- [Customize site](#customize-site)\n- [KB site 2.0 migration](#kb-site-20-migration)\n- [Web Content Accessibility Guidelines (WCAG)](#web-content-accessibility-guidelines-wcag)\n- [Header - Primary navigation](#header-primary-navigation)\n- [Header - Secondary navigation](#header-secondary-navigation)\n- [Footer](#footer-navigation)\n- [Custom footer](#custom-footer)\n- [RSS Feeds](#rss-feeds)\n- [Main pages](#main-pages)\n- [Hero section](#hero-section)\n- [Rich text blocks](#text-block)\n- [Multicolumn card section](#text-columns-block)\n- [Image with text block](#image-and-text)\n- [Custom code section](#html-block)\n- [Knowledge base categories block](#knowledge-base-categories)\n- [Widgets block](#widgets)\n- [Error pages](#error-pages)\n- [404 page](#404-page)\n- [Access denied page](#access-denied-page)\n- [Unauthorized page](#unauthorized-page)\n- [IP restriction page](#ip-restriction-page)\n- [Custom CSS & JavaScript](#custom-css-javascript)\n- [CSS Snippets](#css-snippets)\n- [Callout styles](#callout-styles)\n- [Body font style](#body-font-style)\n- [Image alignment](#image-alignment)\n- [Header font style](#header-font-style)\n- [Table style](#table-style)\n- [Article redirect rule](#article-redirect-rules)\n- [Article settings & SEO](#configuring-the-article-settings)\n- [Article header](#article-header)\n- [Site header-What's new](#document-header)\n- [Follow articles and categories](#follow-articles-and-categories)\n- [Search in Knowledge base site](#search-in-knowledge-base-site)\n- [Liking or disliking an article](#liking-or-disliking-an-article)\n- [Smart bars](#smart-bar)\n- [Cookie consent](#cookie-consent)\n- [Accessing the ticket deflectors in portal](#accessing-the-ticket-deflectors)\n- [Adding a new ticket deflector](#adding-a-new-ticket-deflector)\n- [Integrations in Document360](#integrations-getting-started)\n- [Code inclusion and exclusion conditions](#advanced-insertion-rules-in-integration)\n- [LiveChat](#livechat)\n- [Olark](#olark)\n- [Freshchat](#freshchat)\n- [Crisp](#crisp)\n- [Chatra](#chatra)\n- [Doorbell](#door-bell)\n- [Gorgias](#gorgias)\n- [Belco](#belco)\n- [Sunshine Conversations](#sunshine)\n- [Kommunicate](#kommunicate)\n- [Google Analytics](#google-analytics-integration)\n- [Google Analytics (GA4)](#google-analytics-new)\n- [Google Tag Manager](#google-tag-manager)\n- [Heap](#heap)\n- [Segment](#segment-integration)\n- [Hotjar](#hotjar)\n- [Amplitude](#amplitude)\n- [FullStory](#fullstory)\n- [Mixpanel](#mixpanel)\n- [VWO](#vwo)\n- [Freshmarketer](#freshmarketer)\n- [ZOHO PageSense](#zoho-page-sense)\n- [GoSquared](#gosquared)\n- [Commento](#commento)\n- [Disqus](#disqus)\n- [Document360 Extensions - Getting started](#all-extensions)\n- [Freshdesk](#freshdesk)\n- [Freshservice](#freshservice)\n- [Zendesk](#zendesk)\n- [Intercom](#intercom-integration)\n- [Salesforce](#salesforce)\n- [Cases page](#cases-page)\n- [Slack](#slack)\n- [Microsoft Teams](#microsoft-teams)\n- [Drift](#drift)\n- [Zapier - Setup guide](#zapier-setup-guide)\n- [Integrating Google Docs with Document360](#google-docs-document360-integration)\n- [Integrating Google Sheets with Document360](#document360-with-google-sheets-integration)\n- [Integrating Document360 with Google Drive](#google-drive-document360)\n- [Integrating Trello with Document360](#document360-with-trello-integration)\n- [Integrating GitHub with Document360](#github-document360)\n- [Integrating Confluence Server with Document360](#confluence-document360)\n- [Integrating Zoho CRM with Document360](#zoho-crm-document360)\n- [Integrating Pipedrive with Document360](#pipedrive-document360)\n- [Integrating Hubspot with Document360](#hubspot-document360)\n- [Integrating Asana with Document360](#asana-document360)\n- [Integrating Monday.com with Document360](#mondaycom-document360)\n- [Integrating Typeform with Document360](#typeform-document360)\n- [Integrating Gmail with Document360](#document360-gmail)\n- [Integrating Mailchimp with Document360](#document360-mailchimp)\n- [Make - Setup guide](#make-setup-guide)\n- [Integrating Asana with Document360](#asana-and-document360-integration)\n- [Integrating Monday.com with Document360](#monday-document360-integration)\n- [Integrating Typeform with Document360](#typeform-and-document360-integration)\n- [Integrating Google Docs with Document360](#google-docs-and-document360-integration)\n- [Integrating Jira with Document360](#jira-and-document360-integration)\n- [Chrome](#chrome-extension)\n- [Crowdin](#crowdin)\n- [Phrase](#phrase)\n- [General project settings](#general-project-settings)\n- [Team auditing](#team-auditing)\n- [Localization - Getting started](#localization-getting-started)\n- [Setting up a Multi-lingual knowledge base](#setting-up-a-multi-lingual-knowledge-base)\n- [Localization variables](#localization-variables)\n- [Workspaces](#workspaces)\n- [Backup and restore](#backup-restore)\n- [Notifications](#notifications)\n- [Webhook notification channel](#webhook-notification-channel)\n- [Slack notification channel](#slack-notification-channel)\n- [Microsoft Teams notification channel](#microsoft-teams-notification-channel)\n- [SMTP notification channel](#smtp-email-notification-channel)\n- [Notification mapping](#notification-mapping)\n- [Notification history](#notification-history)\n- [Email domain](#send-notifications-from-custom-email-domain)\n- [How to use Postman?](#how-to-use-postman)\n- [How to use Swagger?](#how-to-use-swagger)\n- [Portal search](#full-portal-search)\n- [Article-portal search](#article-full-portal-search)\n- [Drive-portal search](#drive-full-portal-search)\n- [Users & groups-portal search](#users-groups-full-portal-search)\n- [Tags-portal search](#tags-full-portal-search)\n- [Settings-portal search](#settings-full-portal-search)\n- [Custom domain mapping](#custom-domain-mapping)\n- [Hosting Document360 on a sub-directory](#document360-on-a-sub-folder)\n- [Nginx server - Subfolder hosting](#nginx-server)\n- [ASP.NET Core server](#aspnet-core-server)\n- [Microsoft - IIS server](#microsoft-iis-server)\n- [Apache HTTP server](#apache-http-server)\n- [Readers self registration](#reader-self-registration)\n- [Managing reviewer accounts](#managing-reviewer-accounts)\n- [Account locked](#account-locked)\n- [Block inheritance](#block-inheritance)\n- [IP restriction](#ip-restriction)\n- [Single Sign-On (SSO)](#single-sign-on-sso)\n- [Login using SSO - Knowledge base portal](#login-using-sso-knowledge-base-portal)\n- [Login using SSO - Knowledge base site](#login-using-sso-knowledge-base-site)\n- [Inviting or Adding SSO users](#inviting-or-adding-sso-users)\n- [Mapping an existing SSO configuration to other projects](#mapping-an-existing-sso-configuration-to-other-projects)\n- [Disable Document360 login page](#disable-document360-login-page)\n- [Auto assign reader group](#auto-assign-reader-group)\n- [Convert to SSO account](#convert-to-sso-account)\n- [Sign out idle SSO team account](#team-account-idle-timeout)\n- [SAML](#saml)\n- [SAML SSO with Okta](#saml-sso-with-okta)\n- [SAML SSO with Entra](#saml-sso-with-entra)\n- [SAML SSO with Google](#google-sso-saml-configuration)\n- [SAML SSO with OneLogin](#saml-sso-with-onelogin)\n- [SAML SSO with ADFS](#saml-sso-with-adfs)\n- [SAML SSO with other configurations](#saml-sso-with-other-configurations)\n- [Identity Provider (IdP) initiated sign in](#idp-initiated-login)\n- [Removing a configured SAML SSO](#removing-a-configured-saml-sso)\n- [OpenID](#openid)\n- [Okta with OpenID SSO](#okta-with-openid-sso)\n- [Auth0 with OpenID SSO](#auth0-with-openid-sso)\n- [ADFS with OpenID SSO](#adfs-with-openid-sso)\n- [Other configurations with OpenID SSO](#other-configurations-with-openid-sso)\n- [Removing a configured OpenID SSO](#removing-a-configured-openid-sso)\n- [Setting up JWT SSO](#configuring-the-jwt-sso)\n- [JWT reader groups](#jwt-reader-groups)\n- [How to enlarge the pdf preview in the article?](#how-to-enlarge-the-pdf-preview-in-the-article)\n- [How to change the color of the hyperlinks in Dark mode?](#how-to-change-the-color-of-the-hyperlinks-in-dark-mode)\n- [How to change the highlighted search result color in articles?](#how-to-change-the-highlighted-search-result-color-in-articles)\n- [How to hide the project's workspace dropdown in the Knowledge base site?](#how-to-hide-the-project-versions-dropdown-in-the-knowledge-base-site)\n- [How to add a vertical scrollbar to the code blocks?](#how-to-add-a-vertical-scrollbar-to-the-code-blocks)\n- [How to set the default height and width of the embedded PDF?](#how-to-set-the-default-height-and-width-of-the-embedded-pdf)\n- [How to make the table border bold in knowledge base?](#how-to-make-the-table-border-bold-in-knowledge-base)\n- [How to vertically align table contents at the top in the Knowledge base?](#how-to-vertically-align-table-contents-at-the-top-in-the-knowledge-base)\n- [How to restrict the readers from copying the content?](#how-to-restrict-the-readers-from-copying-the-content)\n- [How to keep dark mode for the Knowledge base site by default?](#how-to-keep-dark-mode-for-the-knowledge-base-site-by-default)\n- [How to center align the text in Markdown?](#how-to-center-align-the-text-in-markdown)\n- [How to change the color of the text in Markdown?](#how-to-change-the-color-of-the-text-in-markdown)\n- [How to change the language name text in code blocks?](#how-to-change-the-language-name-text-in-code-blocks)\n- [How to change the callouts color in dark mode?](#how-to-change-the-callouts-color-in-dark-mode)\n- [How to center align the heading in the articles?](#how-to-center-align-the-heading-in-the-articles)\n- [How to change the color of the table header?](#how-to-change-the-color-of-the-table-header)\n- [How to add accordion in Markdown?](#how-to-add-accordion-in-markdown)\n- [How to add extra space in Markdown?](#how-to-add-extra-space-in-markdown)\n- [How to align the image in Markdown?](#how-to-align-the-image-in-markdown)\n- [How to add a background image for a text content?](#how-to-add-a-background-image-for-a-text-content)\n- [How to change the color of the table of contents?](#how-to-change-the-color-of-the-table-of-contents)\n- [How to sort the contents of a table?](#how-to-sort-the-contents-of-a-table)\n- [How to customize the hyperlink size?](#how-to-customize-the-hyperlink)\n- [How to make all links open in new tab?](#how-to-make-all-links-open-in-new-tab)\n- [How to set a default featured image in knowledge base?](#how-to-set-a-default-featured-image-in-knowledge-base)\n- [How to add shadows to an image in Markdown?](#how-to-add-shadows-to-an-image-in-markdown)\n- [How to add borders to an image in Markdown?](#how-to-add-borders-to-an-image-in-markdown)\n- [How to embed YouTube Shorts?](#embed-youtube-shorts)\n- [How to embed a Loom video?](#how-to-embed-loom-video)\n- [How to embed an Excel file?](#how-to-embed-an-excel-file)\n- [How to change the color of Feedback buttons?](#how-to-change-the-color-of-feedback-buttons)\n- [How to hide footer in mobile view?](#how-to-hide-footer-in-mobile-view)\n- [How to change the hover color of the header options?](#how-to-change-the-hover-color-of-the-header-options)\n- [How to move the related articles above the feedback section?](#how-to-move-the-related-articles-above-the-feedback-section)\n- [How to hide the change password option for readers?](#how-to-hide-the-change-password-option-for-readers)\n- [How to hide the category manager?](#how-to-hide-the-category-manager)\n- [How to configure a custom font in the knowledge base?](#how-to-configure-a-custom-font-in-the-knowledge-base)\n- [How to hide the left navigation bar in the knowledge base site?](#how-to-hide-the-left-navigation-bar-in-knowledge-base-site)\n- [Plans and pricing](#plans-and-pricing)\n- [Upgrading your subscription plan](#upgrading-your-plan)\n- [Downgrading your subscription plan](#downgrading-your-plan)\n- [Purchasing add-ons](#add-ons)\n- [Upgrading from trial version](#upgrading-from-trial-version)\n- [Changing payment information](#changing-payment-information)\n- [February 2025 - 11.1.2](#february-2025-1112)\n- [January 2025 - 11.01.1](#january-2025-1111)\n- [December 2024 - 10.12.1](#december-2024-10121)\n- [November 2024 - 10.11.1](#november-2024-10111)\n- [October 2024 - 10.10.1](#october-2024-10101)\n- [September 2024 - 10.9.1](#september-2024-1091)\n- [September 2024 - 10.8.2](#september-2024-1082)\n- [August 2024 - 10.8.1](#august-2024-1081)\n- [July 2024 - 10.7.1](#july-2024-1071)\n- [July 2024 - 10.6.2](#july-2024-1062)\n- [June 2024 - 10.6.1](#june-2024-1061)\n- [June 2024 - 10.5.2](#june-2024-1052)\n- [May 2024 - 10.5.1](#may-2024-1051)\n- [May 2024 - 10.4.2](#may-2024-1042)\n- [April 2024 - 10.4.1](#1041-release-note)\n- [April 2024 - Minor release](#april-2024-minor-release)\n- [March 2024](#march-2024)\n- [February 2024](#february-2024)\n- [January 2024](#january-2024)\n- [December 2023](#december-2023)\n- [November 2023](#november-2023)\n- [August 2023](#august-3)\n- [July 2023](#july-2)\n- [June 2023](#june-3)\n- [May 2023](#may-1)\n- [April 2023](#april-3)\n- [March 2023](#march-4)\n- [February 2023](#february-3)\n- [January 2023](#january-2)\n- [December 2022](#december-2022-release-note)\n- [November 2022](#november-2022-release-note)\n- [October 2022](#october-2022-release-note)\n- [September 2022](#september-2022-release-note)\n- [August 2022](#august-2022-release-note)\n- [July 2022](#july-2022-release-note)\n- [June 2022](#june-2022-release-notes)\n- [May 2022](#may-2022-release-note)\n- [April 2022](#april-2022-release-note)\n- [March 2022](#march-2022-release-note)\n- [February 2022](#february-2022-release-note)\n- [January 2022](#january-2022-release-note)\n- [December 2021](#december-2021-release-note)\n- [November 2021](#november-2021-release-note)\n- [October 2021](#october-2021-release-note)\n- [September 2021](#september-2021-release-note)\n- [August 2021](#august-2021-release-notes)\n- [July 2021](#july-2021-release-note)\n- [June 2021](#june-2021-release-note)\n- [May 2021](#may-2021-release-note)\n- [April 2021](#april-2021-release-note)\n- [March 2021](#march-2021-release-note)\n- [February 2021](#february-2021-release-note)\n- [January 2021](#january-2021-release-note)\n- [November 2020](#november-2020-release-note)\n- [October 2020](#october-2020-release-note)\n- [August 2020](#august-2020-release-note)\n- [June 2020](#june-2020-release-note)\n- [May 2020](#may-2020-release-note)\n- [April 2020](#april-2020-release-note)\n- [March 2020](#march-2020-release-note)\n- [February 2020](#february-2020-release-note)\n- [January 2020](#january-2020)\n- [December 2019](#december)\n- [November 2019](#november)\n- [October 2019](#october)\n- [September 2019](#september-2019)\n- [August 2019](#august)\n- [July 2019](#july)\n- [June 2019](#june)\n- [May 2019](#may-2019)\n- [April 2019](#april-2019)\n- [March 2019](#march)\n- [February 2019](#february)\n- [January 2019](#january-2019)\n- [Support ticket](#support-ticket)\n- [Generating a HAR file](#document360-support-generating-a-har-file)\n\n---\n\n<a id=\"document360-getting-started\"></a>",
    "summary": ""

... (Data file content truncated to first 5 lines)
</document_content>
</document>

<document index="32">
<source>docs/mkdocs_export.md</source>
<document_content>
# MkDocs Export Documentation

**Document360 → MkDocs Export System**

The d361 MkDocs export system converts Document360 archives or API data to modern MkDocs documentation sites, supporting Material theme, popular plugins, and advanced features.

## Table of Contents

1. [Overview](#overview)
2. [Quick Start](#quick-start)
3. [Configuration](#configuration)
4. [Templates](#templates)
5. [Content Processing](#content-processing)
6. [Asset Management](#asset-management)
7. [Navigation](#navigation)
8. [Advanced Features](#advanced-features)
9. [API Reference](#api-reference)
10. [Examples](#examples)
11. [Troubleshooting](#troubleshooting)

## Overview

The MkDocs export system processes Document360 content through multiple specialized components:

### Core Components

- **MkDocsExporter**: Main orchestrator for the complete export process
- **ConfigGenerator**: Dynamic MkDocs YAML configuration generation with template support
- **NavigationBuilder**: Navigation structure creation from Document360 hierarchy
- **ContentEnhancer**: Content optimization with frontmatter, quality assessment, and SEO
- **AssetManager**: Image processing, CDN optimization, and responsive asset handling
- **CrossReferenceResolver**: Internal link resolution and validation

### Supported Features

- Archive and API Sources: Works with Document360 archives (.zip) and live API
- Modern Themes: Full Material for MkDocs integration with all features
- Popular Plugins: autorefs, section-index, redirects, social cards, minify
- Advanced Markdown: SuperFences, tabbed content, admonitions, math expressions
- Performance: Parallel processing, intelligent caching, optimization
- Quality Control: Content validation, broken link detection, SEO optimization
- Template System: Jinja2 templates for customization

## Quick Start

### Basic Export from Archive

```python
import asyncio
from pathlib import Path
from d361.mkdocs import MkDocsExporter

async def export_documentation():
    # Create exporter instance
    exporter = MkDocsExporter(
        source="archive",
        archive_path=Path("my-docs-archive.zip"),
        output_path=Path("mkdocs_site"),
        theme="material",
        enable_plugins=True
    )
    
    # Run export
    results = await exporter.export()
    
    # Check results
    if results["success"]:
        print(f"Export successful!")
        print(f"Output: {results['output_path']}")
        print(f"Config: {results['config_path']}")
        print(f"Processed {results['statistics']['articles_processed']} articles")
    else:
        print("Export failed")
        for error in results["validation"]["errors"]:
            print(f"Error: {error}")

# Run the export
asyncio.run(export_documentation())
```

### Export from API

```python
from d361.mkdocs import MkDocsExporter

async def export_from_api():
    exporter = MkDocsExporter(
        source="api",
        api_token="your-document360-api-token",
        api_base_url="https://apidocs.document360.com",
        output_path=Path("api_mkdocs_site"),
        theme="material"
    )
    
    results = await exporter.export()
    return results

# For hybrid mode (archive + API)
async def export_hybrid():
    exporter = MkDocsExporter(
        source="hybrid",
        archive_path=Path("base-archive.zip"),
        api_token="your-api-token",
        output_path=Path("hybrid_site"),
        theme="material",
        parallel_processing=True,
        max_workers=6
    )
    
    results = await exporter.export()
    return results
```

### Generated Directory Structure

After export:

```
mkdocs_site/
├── mkdocs.yml
├── docs/
│   ├── index.md
│   ├── guides/
│   │   ├── index.md
│   │   ├── getting-started.md
│   │   └── advanced-guide.md
│   ├── reference/
│   │   └── api-docs.md
│   └── assets/
│       ├── images/
│       └── stylesheets/
└── site/
```

## Configuration

### MkDocsExporter Options

```python
exporter = MkDocsExporter(
    # Data Source Configuration
    source="archive",                    # "archive", "api", or "hybrid"
    archive_path=Path("archive.zip"),    # Path to Document360 archive
    api_token="your-token",              # Document360 API token
    api_base_url="https://api.url",      # API base URL
    
    # Output Configuration  
    output_path=Path("output"),          # Output directory
    theme="material",                    # MkDocs theme
    enable_plugins=True,                 # Enable popular MkDocs plugins
    
    # Performance Configuration
    parallel_processing=True,            # Enable parallel processing
    max_workers=4,                       # Number of parallel workers
    
    # Advanced Configuration
    config_path=Path("d361.toml")       # Path to d361 configuration file
)
```

### ConfigGenerator Customization

```python
from d361.mkdocs import ConfigGenerator

# Create config generator
generator = ConfigGenerator(
    theme="material",
    enable_plugins=True
)

# Generate configuration programmatically
config_yaml = await generator.generate_config(
    site_name="My Documentation",
    site_url="https://docs.example.com",
    site_description="Comprehensive project documentation",
    repo_url="https://github.com/user/project",
    navigation=[
        {"Home": "index.md"},
        {
            "User Guide": [
                "guide/getting-started.md",
                "guide/advanced.md"
            ]
        },
        {"API Reference": "api/index.md"}
    ]
)

# Generate from template
config_content = await generator.generate_config_from_template(
    template_name="material_theme.yml.j2",
    context={
        "site_name": "Custom Site",
        "primary_color": "teal",
        "accent_color": "orange",
        "enable_social_cards": True,
        "analytics": {
            "provider": "google",
            "property": "G-XXXXXXXXXX"
        }
    }
)

# Validate configuration
validation_results = generator.validate_final_config(config_yaml)
if not validation_results["valid"]:
    print("Configuration errors:")
    for error in validation_results["errors"]:
        print(f"  - {error}")
```

### Theme-Specific Configuration

#### Material Theme

```python
# Material theme configuration
material_context = {
    "site_name": "Material Documentation",
    "site_url": "https://docs.example.com",
    
    # Color scheme
    "color_scheme": "auto",          # "auto", "light", "dark"
    "primary_color": "indigo",       # Material color palette
    "accent_color": "blue",
    
    # Typography
    "text_font": "Roboto",
    "code_font": "Roboto Mono",
    
    # Features
    "enable_tabs": True,
    "enable_instant": True,
    "enable_social_cards": True,
    "enable_feedback": True,
    
    # Search
    "enable_offline_search": True,
    
    # Analytics
    "analytics": {
        "provider": "google",
        "property": "G-XXXXXXXXXX",
        "feedback": {
            "title": "Was this page helpful?",
            "ratings": [
                {"icon": "material/emoticon-happy-outline", "name": "Yes", "data": 1},
                {"icon": "material/emoticon-sad-outline", "name": "No", "data": 0}
            ]
        }
    }
}
```

#### Read the Docs Theme

```python
# RTD theme configuration
rtd_context = {
    "site_name": "RTD Documentation",
    "theme_name": "readthedocs",
    "highlightjs": True,
    "hljs_languages": ["python", "javascript", "yaml", "bash"]
}
```

## Templates

The system includes three main Jinja2 templates:

### 1. Base Template (`mkdocs_base.yml.j2`)

Basic MkDocs configuration:

```yaml
# Example usage
await generator.generate_config_from_template(
    "mkdocs_base.yml.j2",
    {
        "site_name": "Basic Documentation",
        "theme_name": "mkdocs",
        "navigation": [{"Home": "index.md"}],
        "enable_task_lists": True,
        "enable_superfences": True
    }
)
```

### 2. Material Theme Template (`material_theme.yml.j2`)

Comprehensive Material theme configuration:

```yaml
# Full Material theme example
material_config = await generator.generate_config_from_template(
    "material_theme.yml.j2",
    {
        "site_name": "Advanced Material Site",
        "site_url": "https://docs.example.com",
        "primary_color": "deep purple",
        "accent_color": "pink",
        "color_scheme": "auto",
        "enable_social_cards": True,
        "enable_tags": True,
        "enable_feedback": True,
        "social": [
            {"icon": "fontawesome/brands/github", "link": "https://github.com/user/repo"},
            {"icon": "fontawesome/brands/twitter", "link": "https://twitter.com/user"}
        ]
    }
)
```

### 3. Plugin Configuration Template (`plugin_configs.yml.j2`)

Plugin configuration focused:

```yaml
plugin_config = await generator.generate_config_from_template(
    "plugin_configs.yml.j2",
    {
        "site_name": "Plugin-Rich Site",
        "enable_autorefs": True,
        "enable_section_index": True,
        "enable_redirects": True,
        "redirects": {
            "old-page.html": "new-page.md",
            "legacy/": "current/"
        }
    }
)
```

### Custom Templates

Create templates for specialized use cases:

```yaml
# custom_enterprise.yml.j2
site_name: {{ site_name }}
site_url: {{ site_url }}

theme:
  name: material
  custom_dir: {{ custom_dir | default('theme') }}
  features:
    - navigation.instant
    - navigation.tracking
    {% if enable_enterprise_features %}
    - content.action.edit
    - content.feedback.general
    {% endif %}

plugins:
  - search
  {% if enable_enterprise_auth %}
  - auth:
      providers:
        - saml: {{ saml_config | to_yaml }}
        - oauth: {{ oauth_config | to_yaml }}
  {% endif %}
```

## Content Processing

### ContentEnhancer Features

The ContentEnhancer optimizes Document360 content for MkDocs:

```python
from d361.mkdocs.processors import ContentEnhancer

# Create content enhancer
enhancer = ContentEnhancer(
    site_url="https://docs.example.com",
    enable_seo=True,
    validate_links=True,
    add_edit_links=True,
    enable_social_cards=True,
    custom_css_classes={
        "tables": "data-table",
        "blockquotes": "callout"
    }
)

# Enhance article content
enhanced = await enhancer.enhance_article(article)

# Access enhanced components
frontmatter = enhanced["frontmatter"]      # YAML frontmatter
content = enhanced["content"]              # Processed markdown
quality = enhanced["quality_metrics"]     # Quality assessment
nav_hints = enhanced["navigation_hints"]  # Navigation suggestions
```

### Content Transformations

#### 1. Heading Normalization

```markdown
# Input (Document360)
# Main Title
## Section
### Subsection

# Output (MkDocs)
## Main Title {: #main-title }
## Section {: #section }
### Subsection {: #subsection }
```

#### 2. Link Processing

```markdown
# Internal links
[Guide](../docs/user-guide.html) → [Guide](../docs/user-guide.md)

# External links  
[Example](https://example.com) → [Example](https://example.com){: target="_blank" rel="noopener noreferrer" }
```

#### 3. Image Enhancement

```markdown
# Document360 CDN URLs are optimized
![Diagram](https://d360-cdn.com/image.png) → ![Diagram](assets/images/optimized-image.png)

# Responsive images
![Large Image](big-image.jpg) → ![Large Image](big-image.jpg){: .responsive-image loading="lazy" }
```

#### 4. Code Block Enhancement

```markdown
# Language detection and line numbers
```
def example():
    return "hello world"
```

# Becomes:
```python linenums="1"
def example():
    return "hello world"
```

### Quality Assessment

The system provides quality metrics:

```python
quality_metrics = {
    "word_count": 450,
    "heading_count": 5,
    "link_count": 8,
    "image_count": 3,
    "code_block_count": 2,
    "estimated_reading_time": 3,  # minutes
    "overall_score": 85,          # 0-100
    "quality_level": "excellent"  # needs_improvement, fair, good, excellent
}
```

## Asset Management

### AssetManager Configuration

```python
from d361.mkdocs.processors import AssetManager

# Configure asset processing
manager = AssetManager(
    output_dir=Path("docs/assets"),
    enable_optimization=True,
    generate_responsive=True,
    max_image_width=1200,
    image_quality=85,
    convert_to_webp=True,
    enable_lazy_loading=True,
    download_external_assets=True
)

# Process assets in content
processed_content = await manager.process_assets(content, article_id)

# Copy all assets to output directory
assets_copied = await manager.copy_assets(docs_dir)
```

### Supported Asset Types

- Images: PNG, JPG, WebP, GIF, SVG
- Documents: PDF, DOCX, XLSX
- Code: JSON, XML, CSV
- Media: MP4, WebM

### CDN Optimization

```python
# Document360 CDN URLs are automatically optimized
original_url = "https://document360.com/wp-content/uploads/2023/image.png"
optimized_url = manager.optimize_cdn_url(original_url)
# Result: "assets/images/document360-image-optimized.webp"
```

## Navigation

### NavigationBuilder Features

```python
from d361.mkdocs.exporters import NavigationBuilder

builder = NavigationBuilder()

# Build navigation from Document360 structure
navigation = await builder.build_navigation(articles, categories)

# Example output:
[
    {"Home": "index.md"},
    {
        "Getting Started": [
            "guides/index.md",
            "guides/installation.md",
            "guides/quick-start.md"
        ]
    },
    {
        "API Reference": [
            "api/index.md",
            "api/authentication.md",
            "api/endpoints.md"
        ]
    },
    {"FAQ": "help/faq.md"}
]
```

### Hierarchical Categories

The system handles nested categories:

```python
# Document360 categories
parent_category = Category(id="guides", name="User Guides", parent_id=None)
child_category = Category(id="advanced", name="Advanced Topics", parent_id="guides")

# Generates nested navigation:
{
    "User Guides": [
        "guides/index.md",
        "guides/basic-guide.md",
        {
            "Advanced Topics": [
                "guides/advanced/index.md",
                "guides/advanced/expert-tips.md"
            ]
        }
    ]
}
```

## Advanced Features

### Cross-Reference Resolution

```python
from d361.mkdocs.processors import CrossReferenceResolver

resolver = CrossReferenceResolver(
    articles=all_articles,
    categories=all_categories,
    base_url="https://docs.example.com",
    validate_external=True,
    generate_autorefs=True
)

# Resolve references in content
resolved_content = await resolver.resolve_content_references(content, current_article_id)

# Generate link report
link_report = resolver.generate_link_report()
```

### Template Validation

```python
# Comprehensive template validation
validation_results = generator.validate_final_config(config_yaml)

print(f"Valid: {validation_results['valid']}")
print(f"Errors: {len(validation_results['errors'])}")
print(f"Warnings: {len(validation_results['warnings'])}")
print(f"Suggestions: {len(validation_results['suggestions'])}")

for error in validation_results['errors']:
    print(f"{error}")

for warning in validation_results['warnings']:
    print(f"{warning}")

for suggestion in validation_results['suggestions']:
    print(f"{suggestion}")
```

### Performance Optimization

```python
# Enable parallel processing for large archives
exporter = MkDocsExporter(
    source="archive",
    archive_path=large_archive,
    output_path=output_dir,
    parallel_processing=True,
    max_workers=8
)

# Monitor performance
results = await exporter.export()
performance_metrics = results["performance"]

print(f"Total time: {performance_metrics['total_export']}s")
print(f"Content loading: {performance_metrics['content_loading']}s")  
print(f"Content processing: {performance_metrics['content_processing']}s")
```

## API Reference

### MkDocsExporter

#### Constructor

```python
MkDocsExporter(
    source: str = "archive",
    archive_path: Optional[Path] = None,
    api_token: Optional[str] = None,
    api_base_url: Optional[str] = None,
    output_path: Path = Path("mkdocs_output"),
    theme: str = "material",
    enable_plugins: bool = True,
    parallel_processing: bool = True,
    max_workers: int = 4,
    config_path: Optional[Path] = None
)
```

#### Methods

```python
async def export() -> Dict[str, Any]:
    """Execute complete MkDocs export process."""
    
async def _load_content() -> Tuple[List[Article], List[Category]]:
    """Load content from configured data source."""
    
async def _validate_export() -> Dict[str, Any]:
    """Validate the generated MkDocs export."""
```

### ConfigGenerator

#### Constructor

```python
ConfigGenerator(
    theme: str = "material",
    enable_plugins: bool = True,
    template_dir: Optional[Path] = None
)
```

#### Methods

```python
async def generate_config(
    site_name: str,
    navigation: List[Dict[str, Any]],
    output_path: Path,
    **kwargs
) -> str:
    """Generate MkDocs configuration YAML."""

async def generate_config_from_template(
    template_name: str,
    context: Dict[str, Any],
    validate_output: bool = True
) -> str:
    """Generate configuration from Jinja2 template."""

def validate_final_config(config_yaml: str) -> Dict[str, Any]:
    """Validate MkDocs configuration."""
```

### ContentEnhancer

#### Constructor

```python
ContentEnhancer(
    site_url: Optional[str] = None,
    enable_seo: bool = True,
    validate_links: bool = True,
    add_edit_links: bool = True,
    enable_social_cards: bool = False,
    custom_css_classes: Optional[Dict] = None
)
```

#### Methods

```python
async def enhance_article(article: Article) -> Dict[str, Any]:
    """Enhance single article for MkDocs."""
```

## Examples

### Complete Enterprise Setup

```python
import asyncio
from pathlib import Path
from d361.mkdocs import MkDocsExporter, ConfigGenerator

async def enterprise_documentation_setup():
    """Complete enterprise documentation setup example."""
    
    # Step 1: Create custom configuration
    generator = ConfigGenerator(theme="material", enable_plugins=True)
    
    enterprise_context = {
        "site_name": "Enterprise Documentation Portal",
        "site_url": "https://docs.company.com",
        "site_description": "Comprehensive enterprise documentation",
        "repo_url": "https://github.com/company/docs",
        "copyright": "Copyright &copy; 2025 Company Inc.",
        
        "primary_color": "blue grey",
        "accent_color": "deep orange",
        "color_scheme": "auto",
        "logo": "assets/company-logo.svg",
        "favicon": "assets/favicon.ico",
        
        "enable_social_cards": True,
        "enable_feedback": True,
        "enable_tags": True,
        "enable_offline_search": True,
        
        "analytics": {
            "provider": "google",
            "property": "G-COMPANY123",
            "feedback": {
                "title": "How was this page?",
                "ratings": [
                    {"icon": "material/thumb-up", "name": "Helpful", "data": 1},
                    {"icon": "material/thumb-down", "name": "Not helpful", "data": 0}
                ]
            }
        },
        
        "social": [
            {"icon": "fontawesome/brands/github", "link": "https://github.com/company"},
            {"icon": "fontawesome/brands/linkedin", "link": "https://linkedin.com/company/company"},
            {"icon": "fontawesome/solid/envelope", "link": "mailto:docs@company.com"}
        ],
        
        "navigation": [
            {"Home": "index.md"},
            {
                "Getting Started": [
                    "getting-started/index.md",
                    "getting-started/installation.md",
                    "getting-started/authentication.md",
                    "getting-started/first-steps.md"
                ]
            },
            {
                "User Guides": [
                    "guides/index.md",
                    "guides/basic-usage.md",
                    "guides/advanced-features.md",
                    "guides/integrations.md"
                ]
            },
            {
                "API Reference": [
                    "api/index.md",
                    "api/authentication.md",
                    "api/users.md",
                    "api/projects.md",
                    "api/webhooks.md"
                ]
            },
            {
                "Administration": [
                    "admin/index.md",
                    "admin/user-management.md",
                    "admin/system-configuration.md",
                    "admin/monitoring.md"
                ]
            },
            {"Support": "support/index.md"},
            {"Changelog": "changelog.md"}
        ]
    }
    
    # Step 2: Set up exporter with enterprise configuration
    exporter = MkDocsExporter(
        source="hybrid",
        archive_path=Path("enterprise-docs-archive.zip"),
        api_token="your-enterprise-api-token",
        output_path=Path("enterprise_docs_site"),
        theme="material",
        enable_plugins=True,
        parallel_processing=True,
        max_workers=6
    )
    
    # Step 3: Run export
    print("Starting enterprise documentation export...")
    results = await exporter.export()
    
    # Step 4: Generate custom configuration
    if results["success"]:
        print("Basic export completed successfully!")
        
        # Generate enterprise configuration
        enterprise_config = await generator.generate_config_from_template(
            "material_theme.yml.j2",
            enterprise_context
        )
        
        # Save custom configuration
        config_path = Path(results["output_path"]) / "mkdocs-enterprise.yml"
        config_path.write_text(enterprise_config)
        
        print(f"Enterprise configuration saved: {config_path}")
        print(f"Statistics:")
        print(f"   Articles: {results['statistics']['articles_processed']}")
        print(f"   Categories: {results['statistics']['categories_processed']}")
        print(f"   Assets: {results['statistics']['assets_processed']}")
        print(f"   Links resolved: {results['statistics']['links_resolved']}")
        
        # Validation report
        validation = results["validation"]
        if validation["errors"]:
            print("Validation issues found:")
            for error in validation["errors"]:
                print(f"   {error}")
        
        if validation["warnings"]:
            print("Suggestions:")
            for warning in validation["warnings"]:
                print(f"   {warning}")
    
    else:
        print("Export failed!")
        for error in results["validation"]["errors"]:
            print(f"   Error: {error}")
    
    return results

# Run the enterprise setup
if __name__ == "__main__":
    asyncio.run(enterprise_documentation_setup())
```

### Multi-Site Documentation

```python
async def multi_site_documentation():
    """Generate multiple documentation sites from single source."""
    
    base_archive = Path("complete-documentation.zip")
    
    # Site configurations
    sites = {
        "public": {
            "output": "public_docs",
            "theme": "material",
            "name": "Public Documentation",
            "url": "https://docs.example.com"
        },
        "internal": {
            "output": "internal_docs", 
            "theme": "material",
            "name": "Internal Documentation",
            "url": "https://internal-docs.company.com"
        },
        "api": {
            "output": "api_docs",
            "theme": "material", 
            "name": "API Documentation",
            "url": "https://api-docs.example.com"
        }
    }
    
    results = {}
    
    for site_type, config in sites.items():
        print(f"Generating {site_type} documentation...")
        
        exporter = MkDocsExporter(
            source="archive",
            archive_path=base_archive,
            output_path=Path(config["output"]),
            theme=config["theme"]
        )
        
        result = await exporter.export()
        results[site_type] = result
        
        if result["success"]:
            print(f"{site_type.title()} site generated successfully")
        else:
            print(f"{site_type.title()} site generation failed")
    
    return results
```

## Troubleshooting

### Common Issues

#### 1. Template Not Found

```python
# Error: Template 'custom_template.j2' not found
# Solution: Check template path and ensure it exists
generator = ConfigGenerator(template_dir=Path("custom_templates"))
```

#### 2. Invalid Configuration

```python
# Error: YAML syntax error in generated config
# Solution: Validate template context
validation = generator.validate_final_config(config_yaml)
if not validation["valid"]:
    for error in validation["errors"]:
        print(f"Config error: {error}")
```

#### 3. Asset Processing Issues

```python
# Error: Cannot process external assets
# Solution: Enable external asset downloading
manager = AssetManager(
    output_dir=Path("assets"),
    download_external_assets=True
)
```

#### 4. Performance Issues

```python
# Issue: Slow export for large archives
# Solution: Enable parallel processing
exporter = MkDocsExporter(
    parallel_processing=True,
    max_workers=8
)
```

### Debug Mode

```python
# Enable debug logging
import logging
logging.basicConfig(level=logging.DEBUG)

# Detailed error information
try:
    results = await exporter.export()
except Exception as e:
    logger.error(f"Export failed: {e}", exc_info=True)
```

### Validation Tools

```python
# Comprehensive validation
def validate_export_results(results):
    """Validate export results comprehensively."""
    
    issues = []
    
    # Check basic success
    if not results.get("success"):
        issues.append("Export marked as failed")
    
    # Check output structure
    output_path = Path(results["output_path"])
    if not output_path.exists():
        issues.append(f"Output directory not found: {output_path}")
    
    # Check configuration
    config_path = Path(results["config_path"])  
    if not config_path.exists():
        issues.append(f"Configuration file not found: {config_path}")
    else:
        try:
            import yaml
            yaml.safe_load(config_path.read_text())
        except yaml.YAMLError as e:
            issues.append(f"Invalid YAML configuration: {e}")
    
    # Check docs directory
    docs_dir = output_path / "docs"
    if not docs_dir.exists():
        issues.append("Docs directory not found")
    elif not any(docs_dir.glob("*.md")):
        issues.append("No markdown files found in docs directory")
    
    # Report issues
    if issues:
        print("Validation issues found:")
        for issue in issues:
            print(f"   - {issue}")
        return False
    else:
        print("Export validation passed")
        return True
```

---

**Need Help?**

- [API Reference](#api-reference)
- [Report Issues](https://github.com/d361/issues)
- [Community Support](https://discord.gg/d361)
- [Contact Support](mailto:support@d361.com)

This documentation covers the MkDocs export capabilities of d361. For updates and examples, check the official repository.
</document_content>
</document>

<document index="33">
<source>docs/openapi_spec.json</source>
<document_content>
{
  "openapi": "3.0.1",
  "info": {
    "title": "Document360 Customer API",
    "description": "Document360 RESTful APIs will allow you to integrate your documentation with your software, allowing you to easily onboard new users, manage your articles and more. \n\nYou can find detailed API documentation here : [API Documentation](https://apidocs.document360.io/docs)",

... (Data file content truncated to first 5 lines)
</document_content>
</document>

# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/docs/summarize.py
# Language: python

import asyncio
import json
import re
import sys
from pathlib import Path
from typing import Any
from fire import Fire
from rich.console import Console
from rich.progress import Progress, SpinnerColumn, TextColumn
from tenacity import (
    retry,
    retry_if_exception_type,
    stop_after_attempt,
    wait_exponential,
)
import llm

DEFAULT_FALLBACK_MODELS = =

class LLMError(E, x, c, e, p, t, i, o, n):

class SummarizeCommands:
    def load((
        self,
        input_file: str,
        output_file: str | None = None,
        *,
        verbose: bool = False,
    )):
    def process((
        self,
        input_file: str | None = None,
        output_file: str | None = None,
        model: str | None = None,
        *,
        verbose: bool = False,
        force: bool = False,
        concurrency: int = 3,
        list_models: bool = False,
    )):
    def save((
        self,
        input_file: str,
        output_file: str | None = None,
        *,
        verbose: bool = False,
    )):
    def all((
        self,
        input_file: str | None = None,
        output_file: str | None = None,
        model: str | None = None,
        *,
        verbose: bool = False,
        force: bool = False,
        concurrency: int = 3,
        list_models: bool = False,
    )):

def _try_model((
    prompt: str, model_id: str, attachments: list[llm.Attachment] | None = None
)) -> str:

def ask((
    prompt: str,
    data: str | None = None,
    model_ids: list[str] | None = None,
)) -> str:

def split_markdown_at_h2((content: str)) -> list[dict[str, str]]:

def clean_llm_output((text: str)) -> str:

def summarize_section((
    heading: str, content: str, model_ids: list[str] | None = None
)) -> str:

def load_markdown((
    input_file: str | Path,
    output_file: str | Path | None = None,
    *,
    verbose: bool = False,
)) -> None:

def process_section_async((
    section: dict[str, Any], model: str | None = None, force: bool = False
)) -> tuple[dict[str, Any], str | None, str | None]:

def process_sections_async((
    input_file: str | Path,
    output_file: str | Path | None = None,
    model: str | None = None,
    *,
    verbose: bool = False,
    force: bool = False,
    concurrency: int = 3,
)) -> None:

def process_with_semaphore((section: dict[str, Any], idx: int)) -> None:

def process_sections((
    input_file: str | Path,
    output_file: str | Path | None = None,
    model: str | None = None,
    *,
    verbose: bool = False,
    force: bool = False,
    concurrency: int = 3,
)) -> None:

def save_markdown((
    input_file: str | Path,
    output_file: str | Path | None = None,
    *,
    verbose: bool = False,
)) -> None:

def load((
        self,
        input_file: str,
        output_file: str | None = None,
        *,
        verbose: bool = False,
    )):

def process((
        self,
        input_file: str | None = None,
        output_file: str | None = None,
        model: str | None = None,
        *,
        verbose: bool = False,
        force: bool = False,
        concurrency: int = 3,
        list_models: bool = False,
    )):

def save((
        self,
        input_file: str,
        output_file: str | None = None,
        *,
        verbose: bool = False,
    )):

def all((
        self,
        input_file: str | None = None,
        output_file: str | None = None,
        model: str | None = None,
        *,
        verbose: bool = False,
        force: bool = False,
        concurrency: int = 3,
        list_models: bool = False,
    )):


<document index="34">
<source>docs/test.json</source>
<document_content>
[
  {
    "heading": "My projects",
    "text": "## My projects\n\nThe **project dashboard** is the first thing you see when logging in to [**Document360**](https://portal.document360.io). The dashboard features all the projects you own, projects associated with a team account, and projects associated with a reader.  \nHere, each project will have a visibility tag to indicate the type of project (public, private, or mixed).\n\n![1_Screenshot-My_projects](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-My_projects.png \"My-Projects.png\")\n\n---",
    "summary": "## My projects\n\nThe **Document360** **project dashboard**, accessible upon login, displays all **projects** (owned, **team account**, or **reader** associated). Each project has a **visibility tag**: **public**, **private**, or **mixed**."

... (Data file content truncated to first 5 lines)
</document_content>
</document>

<document index="35">
<source>docs/test.md</source>
<document_content>
# Document360 Documentation

## What is Document360?

Document360 is a knowledge management platform for creating self-service knowledge bases with public, private, or mixed access.

When using Document360, you'll work with these key interfaces:

* [My Projects](/help/docs/document360-getting-started#my-projects)
* [Knowledge base portal](/help/docs/document360-getting-started#knowledge-base-portal)
* [Knowledge base site](/help/docs/document360-getting-started#knowledge-base-site)
* [Document360 AI - Eddy AI](/help/docs/ai-features)
* [Resources](/help/docs/document360-getting-started#other-resources)

---

## My projects

The project dashboard appears when you log into [Document360](https://portal.document360.io). It shows all projects you own, team projects, and reader projects. Each project displays a visibility tag (public, private, or mixed).

![1_Screenshot-My_projects](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_Screenshot-My_projects.png)

---

## Knowledge base portal

The Knowledge base portal is where you:

* Create categories, articles, and templates
* Manage files, team accounts, and readers
* Configure branding, domain, security, and site settings

![Portal interface](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/1_ScreenShot-What_is_Document360.png)

Portal elements include:

1. Dashboard
2. Documentation
3. API Documentation
4. Analytics
5. Widgets
6. Drive
7. Settings
8. Search
9. Open Site

> NOTE: Changes made in the portal affect what readers see on the knowledge base site.

### 1. Dashboard

This page provides project overview and contributor metrics. Team accounts can view:

* Article counts (created, published, drafts)
* Performance insights (views, reads, likes, dislikes)
* Recently seen articles
* Team account and reader information
* Drive capacity
* Broken links
* No result searches
* Last backup date

Use filters to select time frames.

![Dashboard overview](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/3_Screenshot-Knowledge_base_portal_dashboard_overview.png)

The "My contribution" section shows individual user metrics including assigned tasks, article performance, workflow assignments, review reminders, feedback, and broken links.

![User contributions](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/4_Screenshot-Knowledge_base_portal_dashboard_my_contribution.png)

---

### 2. Documentation

The Documentation page manages the category tree structure. Create categories, subcategories, and articles to organize content.

Drag and drop to reorder, hide, rename, or delete items using the menu that appears when hovering over categories.

![Category management](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/5_Screenshot-Knowledge_base_portal_documentation_view.png)

#### a. All articles

Perform bulk operations (publish, hide, move, delete) on multiple articles simultaneously.

![Bulk article operations](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/6_Screenshot-Knowledge_base_portal_documentation_view_all_articles.png)

#### b. Workflow assignments

View team activity and recently published articles. Filter by workflow status: Draft, In review, or Published. Overdue articles appear in the Overdue category.

![Workflow assignments](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/7_Screenshot-Knowledge_base_portal_documentation_view_workflow_assignments.png)

![Workflow page](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/7.1_Screenshot-Knowledge_base_portal_workflow_assignments_page.png)

#### c. Starred

Quick access to favorite articles.

![Starred articles](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/8_Screenshot-Knowledge_base_portal_documentation_view_starred.png)

#### d. Recycle bin

Restore deleted articles and categories within 30 days.

![Recycle bin](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/9_Screenshot-Knowledge_base_portal_documentation_view_recycle_bin.png)

#### e. Site builder

Customize the knowledge base appearance with logos, icons, brand colors, fonts, and styling.

![Site builder](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/10_Screenshot-Knowledge_base_portal_documentation_view_site_builder.png)

#### f. Content tools

Manage article and project content through these features:

* **Content reuse** - Variables, snippets, templates, glossary
* **Import and Export** - PDF export, migration from other tools
* **Content essentials** - Find and replace, review reminders, tags, SEO descriptions
* **Feedback manager** - Article and search feedback responses
* **Workflow designer** - Custom workflow statuses and sequences

![Content tools](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/11_Screenshot-Knowledge_base_portal_documentation_view_content_tools.png)

#### g. Categories & Articles

Create articles by selecting a category, adding title/slug, SEO details, and publishing. Editing creates new revisions without affecting live content. Articles show status indicators (yellow dot) for easy identification.

![Categories and articles](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/12_Screenshot-Knowledge_base_portal_documentation_view_categories_and_articles.png)

---

### 3. API documentation

Create and manage API references with high-quality documentation. The "Try it!" feature lets users test endpoints directly from the knowledge base site.

Upload API references as URLs or JSON/YAML files to create interactive endpoint articles automatically.

![API documentation](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/13_Screenshot-Knowledge_base_portal_api_documentation.png)

---

### 4. Analytics

Track user engagement with these metrics:

* Articles
* Eddy AI
* Search
* Team accounts
* Feedback
* Link status
* Page not found
* Ticket deflector

![Analytics](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/14_Screenshot-Knowledge_base_portal_analytics.png)

---

### 5. Widgets

The knowledge base widget (formerly "Knowledge base assistant" or "In-app assistant") helps readers find answers without leaving your site.

Configure these settings:
* Installation & setup
* Custom CSS
* Custom JavaScript
* URL mapping

![Widgets](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/15_Screenshot-Knowledge_base_portal_widgets.png)

---

### 6. Drive

Cloud storage for project files. Similar to Google Drive or OneDrive. Access via the Drive icon in the left menu.

![Drive](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/16_Screenshot-Knowledge_base_portal_drive.png)

---

### 7. Settings

Configure project aspects including:
* Team member invitations
* Notification settings
* Domain configuration
* Article redirects

Settings are organized into:
* Knowledge base portal
* Knowledge base site
* Users & Security
* AI Features

![Settings](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/17_Screenshot-Knowledge_base_portal_settings.png)

---

### 8. Search

Search all project content across workspaces and languages simultaneously. The search bar appears at the top of all portal modules.

Filter results by workspace, language, visibility, tags, and date range. Preview articles directly or navigate to the editor.

Switch between article and Drive search using tabs below the search bar.

![Search](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/18_Screenshot-Knowledge_base_portal_search.png)

![Search results](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/19_Screenshot-Knowledge_base_portal_search_bar_dropdown.png)

---

### 9. Open site

View the knowledge base site for the currently open workspace. Navigates to the API documentation home page when in API workspace, or to the first available article/category if no home page exists.

---

## Knowledge base site

This is what end-users see when reading articles.

Access settings:
* **Public** - Anyone on the internet
* **Private** - Login required
* **Mixed** - Combination of public and private

![Site preview](https://cdn.document360.io/860f9f88-412e-4570-8222-d5bf2f4b7dd1/Images/Documentation/20_Screenshot-Knowledge_base_site_preview.png)
</document_content>
</document>

# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/example_api_usage.py
# Language: python

import asyncio
import sys
from pathlib import Path
from d361 import Document360ApiClient, ApiConfig
from d361 import Document360Error, AuthenticationError, ValidationError

def example_basic_usage(()):

def example_article_management(()):

def example_error_handling(()):

def example_token_management(()):

def main(()):


<document index="36">
<source>examples/d361.example.toml</source>
<document_content>
# Configuration for standalone Python package

[project]
# List of packages to initialize
packages = [
    "d361"  # Your package name
]

# Output directory (optional, defaults to current directory)
output_dir = "."

[author]
name = "AUTHOR_NAME"
email = "adam+github@twardoch.com"
github_username = "twardoch"

[package]
description = ""
min_python = "3.10"
license = "MIT"
development_status = "4 - Beta"

[package.options]
include_cli = true        # Include CLI boilerplate
include_logging = true    # Include logging setup
use_pydantic = true      # Use Pydantic for data validation
use_rich = true          # Use Rich for terminal output

[features]
mkdocs = false           # Enable MkDocs documentation
vcs = true              # Initialize Git repository
github_actions = true   # Add GitHub Actions workflows 
</document_content>
</document>

<document index="37">
<source>examples/d361api.example.toml</source>
<document_content>
# Configuration for standalone Python package

[project]
# List of packages to initialize
packages = [
    "d361api"  # Your package name
]

# Output directory (optional, defaults to current directory)
output_dir = "."

[author]
name = "AUTHOR_NAME"
email = "adam+github@twardoch.com"
github_username = "twardoch"

[package]
description = ""
min_python = "3.10"
license = "MIT"
development_status = "4 - Beta"

[package.options]
include_cli = true        # Include CLI boilerplate
include_logging = true    # Include logging setup
use_pydantic = true      # Use Pydantic for data validation
use_rich = true          # Use Rich for terminal output

[features]
mkdocs = false           # Enable MkDocs documentation
vcs = true              # Initialize Git repository
github_actions = true   # Add GitHub Actions workflows 
</document_content>
</document>

# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/examples/mkdocs_export_examples.py
# Language: python

import asyncio
from pathlib import Path
from typing import Dict, Any
import sys
from d361.mkdocs import MkDocsExporter, ConfigGenerator
from d361.mkdocs.processors import ContentEnhancer, AssetManager
from d361.core.models import Article

EXAMPLES = =

def basic_archive_export(()):

def api_export(()):

def custom_configuration(()):

def content_enhancement(()):

def asset_processing(()):

def hybrid_export(()):

def advanced_template_usage(()):

def performance_optimization(()):

def validation_and_quality(()):

def main(()):


<document index="38">
<source>llms.sh</source>
<document_content>
#!/usr/bin/env bash

cd "$(dirname "$0")"

llms . "AGENTS.md,CLAUDE.md,GEMINI.md,LLXPRT.md,QWEN.md,WORK.md,external,vendor,vendor-local,build,tests,document360.md"
</document_content>
</document>

<document index="39">
<source>publish.sh</source>
<document_content>
#!/usr/bin/env bash
cd "$(dirname "$0")"
llms . "*.txt"
uvx hatch clean
gitnextver .
uvx hatch build
uvx publish
</document_content>
</document>

<document index="40">
<source>pyproject.toml</source>
<document_content>
# this_file: pyproject.toml
[project]
name = "d361"
dynamic = ["version"]
description = ""
readme = "README.md"
requires-python = ">=3.10"
license = "MIT"
keywords = []
classifiers = [
    "Development Status :: 4 - Beta",
    "Programming Language :: Python",
    "Programming Language :: Python :: 3.10",
    "Programming Language :: Python :: 3.11",
    "Programming Language :: Python :: 3.12",
    "Programming Language :: Python :: Implementation :: CPython",
    "Programming Language :: Python :: Implementation :: PyPy",
]

dependencies = [
    "httpx>=0.25.0",        # Unified HTTP client (replaces aiohttp)
    "pydantic>=2.0,<3.0",   # Pydantic v2 for data validation
    "rich>=13.0.0",         # Rich terminal output
    "fire>=0.5.0",          # CLI framework
    "loguru>=0.7.0",        # Structured logging
    "tenacity>=8.2.0",      # Retry mechanisms
    "diskcache>=5.6.0",     # Persistent caching
    "playwright>=1.40.0",   # Web scraping (optional)
    "beautifulsoup4>=4.12.0", # HTML parsing
    "markdownify>=0.11.0",  # HTML to Markdown conversion
    "lxml>=5.3.1",         # XML/HTML parsing
    "aiofiles>=23.0.0",    # Async file operations
    "d361api",             # Auto-generated Document360 API client
]


[project.optional-dependencies]

# Core optional dependencies
scraping = [
    "playwright>=1.40.0",
    "beautifulsoup4>=4.12.0",
]

api = [
    "httpx-auth>=0.16.0",  # Authentication helpers
]

# Development dependencies
dev = [
    "pre-commit>=3.6.0",
    "ruff>=0.1.0",
    "mypy>=1.0.0",
    "pyupgrade>=3.19.0",
    "types-aiofiles",
    "types-beautifulsoup4",
    "bandit>=1.7.0",       # Security scanning
]

# Testing dependencies
test = [
    "pytest>=7.0.0",
    "pytest-cov>=4.0.0",
    "pytest-mock>=3.10.0",
    "pytest-asyncio>=0.21.0",
    "httpx>=0.25.0",       # For testing HTTP clients
    "pytest-httpx>=0.21.0", # Mock HTTP responses
]

# Monitoring dependencies  
monitoring = [
    "opentelemetry-api>=1.20.0",
    "opentelemetry-sdk>=1.20.0",
    "prometheus-client>=0.19.0",
]


all = [
]

[project.scripts]
d361 = "d361.cli.main:main_cli"
d361-offline = "d361.offline.__main__:main"  # Keep legacy entry point

[project.entry-points."d361.converters"]
# Plugin entry points for converters will be registered here
# Example: confluence = "d361_plugins.confluence:ConfluenceConverter"

[project.entry-points."d361.providers"] 
# Plugin entry points for data providers
# Example: custom = "d361_plugins.custom:CustomProvider"



[[project.authors]]
name = "Adam Twardoch"
email = "adam+github@twardoch.com"

[project.urls]
Documentation = "https://github.com/twardoch/d361#readme"
Issues = "https://github.com/twardoch/d361/issues"
Source = "https://github.com/twardoch/d361"


[build-system]
build-backend = "hatchling.build"
requires = [
    "hatchling>=1.21.0", 
    "hatch-vcs>=0.3.0"
]


[tool.coverage.paths]
d361 = ["src/d361", "*/d361/src/d361"]
tests = ["tests", "*/d361/tests"]



[tool.coverage.report]
exclude_lines = [
    "no cov",
    "if __name__ == .__main__.:",
    "if TYPE_CHECKING:",
]

[tool.coverage.run]
source_pkgs = ["d361", "tests"]
branch = true
parallel = true
omit = [
    "src/d361/__about__.py",
]



[tool.hatch.build.hooks.vcs]
version-file = "src/d361/__version__.py"


[tool.hatch.build.targets.wheel]
packages = ["src/d361"]



[tool.hatch.envs.default]
dependencies = [
  "d361", # Install the project itself by its name
  "mypy>=1.0.0",
  # "types-tenacity", # Tenacity should be typed directly
  # "types-python-fire", # Fire should be typed directly
  "types-aiofiles", # Stubs for aiofiles
  "pytest>=7.0.0", # For MyPy to find pytest stubs
  # Ruff is also good to have for other default scripts like lint/fix
  "ruff>=0.1.0"
]
# This ensures MyPy and the project deps (like pydantic) are in the same env.

[[tool.hatch.envs.all.matrix]]
python = ["3.10", "3.11", "3.12"]


[tool.hatch.envs.default.scripts]
test = "pytest {args:tests}"
test-cov = "pytest --cov-report=term-missing --cov-config=pyproject.toml --cov=src/d361 --cov=tests {args:tests}"
type-check = "mypy src/d361 tests"
lint = ["ruff check src/d361 tests", "ruff format --respect-gitignore src/d361 tests"]
fix = ["ruff check  --fix --unsafe-fixes src/d361 tests", "ruff format --respect-gitignore src/d361 tests"]



[tool.hatch.envs.lint]
detached = true
dependencies = [
]


[tool.hatch.envs.lint.scripts]
typing = "mypy --install-types --non-interactive {args:src/d361 tests}"
style = ["ruff check {args:.}", "ruff format --respect-gitignore {args:.}"]
fmt = ["ruff format --respect-gitignore {args:.}", "ruff check --fix {args:.}"]
all = ["style", "typing"]


[tool.hatch.envs.test]
dependencies = [
  "pytest>=7.0.0",
  "pytest-cov>=4.0.0",
  "pytest-mock>=3.10.0",
  "pytest-xdist>=3.0.0", # For -n auto parallel execution
]

[tool.hatch.envs.test.scripts]
test = "python -m pytest -n auto -p no:briefcase {args:tests}"
test-cov = "python -m pytest -n auto -p no:briefcase --cov-report=term-missing --cov-config=pyproject.toml --cov=src/d361 --cov=tests {args:tests}"
bench = "python -m pytest -v -p no:briefcase tests/test_benchmark.py --benchmark-only"
bench-save = "python -m pytest -v -p no:briefcase tests/test_benchmark.py --benchmark-only --benchmark-json=benchmark/results.json"

[tool.hatch.version]
source = "vcs"
path = 'src/d361/__version__.py'
pattern = "__version__\\s*=\\s*version\\s*=\\s*['\"](?P<version>[^'\"]+)['\"]"


[tool.hatch.version.raw-options]
version_scheme = "post-release"


[tool.mypy]
python_version = "3.10"
warn_return_any = true
warn_unused_configs = true
disallow_untyped_defs = true
disallow_incomplete_defs = true
check_untyped_defs = true
disallow_untyped_decorators = true
no_implicit_optional = true
warn_redundant_casts = true
warn_unused_ignores = true
warn_no_return = true
warn_unreachable = true
plugins = [
  "pydantic.mypy"
]

[[tool.mypy.overrides]]
module = [
    "markdownify",
    "fire",
    "playwright.async_api", # Adding this too as it was missing earlier
    "tenacity" # If it still complains after removing types-tenacity
]
ignore_missing_imports = true

[tool.ruff]
target-version = "py310"
line-length = 88

[tool.ruff.lint]
extend-select = [
    "A",
    "ARG",
    "B",
    "C",
    "DTZ",
    "E",
    "EM",
    "F",
    "FBT",
    "I",
    "ICN",
    "ISC",
    "N",
    "PLC",
    "PLE",
    "PLR",
    "PLW",
    "Q",
    "RUF",
    "S",
    "T",
    "TID",
    "UP",
    "W",
    "YTT",
]
ignore = ["ARG001", "E501", "I001", "RUF001", "PLR2004", "EXE003", "ISC001"]



[tool.ruff.per-file-ignores]
"tests/*" = ["S101"]





[tool.pytest.ini_options]
addopts = "-v --durations=10 -p no:briefcase"
asyncio_mode = "auto"
console_output_style = "progress"
filterwarnings = ["ignore::DeprecationWarning", "ignore::UserWarning"]
log_cli = true
log_cli_level = "INFO"
markers = [
  "benchmark: marks tests as benchmarks (select with '-m benchmark')",
  "unit: mark a test as a unit test",
  "integration: mark a test as an integration test",
  "permutation: tests for permutation functionality",
  "parameter: tests for parameter parsing",
  "prompt: tests for prompt parsing",
]
norecursedirs = [
  ".*",
  "build",
  "dist",
  "venv",
  "__pycache__",
  "*.egg-info",
  "_private",
]

python_classes = ["Test*"]
python_files = ["test_*.py"]
python_functions = ["test_*"]
testpaths = ["tests"]


[tool.pytest-benchmark]
min_rounds = 100
min_time = 0.1
histogram = true
storage = "file"
save-data = true
compare = [
    "min",    # Minimum time
    "max",    # Maximum time
    "mean",   # Mean time
    "stddev", # Standard deviation
    "median", # Median time
    "iqr",    # Inter-quartile range
    "ops",    # Operations per second
    "rounds", # Number of rounds
] 
</document_content>
</document>

<document index="41">
<source>schemas/d361.schema.json</source>
<document_content>
{"$schema": "http://json-schema.org/schema#", "type": "object", "properties": {"Slug": {"type": "string"}, "Workspace": {"type": "string"}, "ResourcePath": {"type": "string"}, "Languages": {"type": "array", "items": {"type": "string"}}, "Categories": {"type": "array", "items": {"type": "object", "properties": {"SubCategories": {"type": "array", "items": {"type": "object", "properties": {"SubCategories": {"type": "array", "items": {"type": "object", "properties": {"SubCategories": {"type": "array", "items": {"type": "object", "properties": {"SubCategories": {"type": "array", "items": {"type": "object", "properties": {"SubCategories": {"type": "array"}, "Articles": {"type": "array", "items": {"type": "object", "properties": {"Id": {"type": "string"}, "Path": {"type": "string"}, "Order": {"type": "integer"}}, "required": ["Id", "Order", "Path"]}}, "Id": {"type": "string"}, "Path": {"type": ["null", "string"]}, "Order": {"type": "integer"}, "CategoryType": {"type": "integer"}, "Icon": {"type": "null"}, "Title": {"type": "string"}, "Languages": {"type": "array", "items": {"type": "object", "properties": {"Code": {"type": "string"}, "Title": {"type": "string"}, "Slug": {"type": "string"}, "ContentType": {"type": "integer"}, "SeoTitle": {"type": "null"}, "Description": {"type": "null"}}, "required": ["Code", "ContentType", "Description", "SeoTitle", "Slug", "Title"]}}}, "required": ["Articles", "CategoryType", "Icon", "Id", "Languages", "Order", "Path", "SubCategories", "Title"]}}, "Articles": {"type": "array", "items": {"type": "object", "properties": {"Id": {"type": "string"}, "Path": {"type": "string"}, "Order": {"type": "integer"}}, "required": ["Id", "Order", "Path"]}}, "Id": {"type": "string"}, "Path": {"type": ["null", "string"]}, "Order": {"type": "integer"}, "CategoryType": {"type": "integer"}, "Icon": {"type": "null"}, "Title": {"type": "string"}, "Languages": {"type": "array", "items": {"type": "object", "properties": {"Code": {"type": "string"}, "Title": {"type": "string"}, "Slug": {"type": "string"}, "ContentType": {"type": "integer"}, "SeoTitle": {"type": "null"}, "Description": {"type": "null"}}, "required": ["Code", "ContentType", "Description", "SeoTitle", "Slug", "Title"]}}}, "required": ["Articles", "CategoryType", "Icon", "Id", "Languages", "Order", "Path", "SubCategories", "Title"]}}, "Articles": {"type": "array", "items": {"type": "object", "properties": {"Id": {"type": "string"}, "Path": {"type": "string"}, "Order": {"type": "integer"}}, "required": ["Id", "Order", "Path"]}}, "Id": {"type": "string"}, "Path": {"type": ["null", "string"]}, "Order": {"type": "integer"}, "CategoryType": {"type": "integer"}, "Icon": {"type": "null"}, "Title": {"type": "string"}, "Languages": {"type": "array", "items": {"type": "object", "properties": {"Code": {"type": "string"}, "Title": {"type": "string"}, "Slug": {"type": "string"}, "ContentType": {"type": "integer"}, "SeoTitle": {"type": ["null", "string"]}, "Description": {"type": "null"}}, "required": ["Code", "ContentType", "Description", "SeoTitle", "Slug", "Title"]}}}, "required": ["Articles", "CategoryType", "Icon", "Id", "Languages", "Order", "Path", "SubCategories", "Title"]}}, "Articles": {"type": "array", "items": {"type": "object", "properties": {"Id": {"type": "string"}, "Path": {"type": "string"}, "Order": {"type": "integer"}}, "required": ["Id", "Order", "Path"]}}, "Id": {"type": "string"}, "Path": {"type": ["null", "string"]}, "Order": {"type": "integer"}, "CategoryType": {"type": "integer"}, "Icon": {"type": ["null", "string"]}, "Title": {"type": "string"}, "Languages": {"type": "array", "items": {"type": "object", "properties": {"Code": {"type": "string"}, "Title": {"type": "string"}, "Slug": {"type": "string"}, "ContentType": {"type": "integer"}, "SeoTitle": {"type": ["null", "string"]}, "Description": {"type": "null"}}, "required": ["Code", "ContentType", "Description", "SeoTitle", "Slug", "Title"]}}}, "required": ["Articles", "CategoryType", "Icon", "Id", "Languages", "Order", "Path", "SubCategories", "Title"]}}, "Articles": {"type": "array", "items": {"type": "object", "properties": {"Id": {"type": "string"}, "Path": {"type": "string"}, "Order": {"type": "integer"}}, "required": ["Id", "Order", "Path"]}}, "Id": {"type": "string"}, "Path": {"type": "null"}, "Order": {"type": "integer"}, "CategoryType": {"type": "integer"}, "Icon": {"type": "null"}, "Title": {"type": "string"}, "Languages": {"type": "array", "items": {"type": "object", "properties": {"Code": {"type": "string"}, "Title": {"type": "string"}, "Slug": {"type": "string"}, "ContentType": {"type": "integer"}, "SeoTitle": {"type": ["null", "string"]}, "Description": {"type": "null"}}, "required": ["Code", "ContentType", "Description", "SeoTitle", "Slug", "Title"]}}}, "required": ["Articles", "CategoryType", "Icon", "Id", "Languages", "Order", "Path", "SubCategories", "Title"]}}}, "required": ["Categories", "Languages", "ResourcePath", "Slug", "Workspace"]}

... (Data file content truncated to first 5 lines)
</document_content>
</document>

<document index="42">
<source>scripts/build.sh</source>
<document_content>
#!/usr/bin/env bash
# this_file: scripts/build.sh
# Build script for d361 project

set -euo pipefail

# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# Function to print colored output
print_step() {
    echo -e "${BLUE}==> $1${NC}"
}

print_success() {
    echo -e "${GREEN}✓ $1${NC}"
}

print_warning() {
    echo -e "${YELLOW}⚠ $1${NC}"
}

print_error() {
    echo -e "${RED}✗ $1${NC}"
}

# Function to check if command exists
command_exists() {
    command -v "$1" >/dev/null 2>&1
}

# Main build function
main() {
    print_step "Starting build process for d361"
    
    # Check for required tools
    if ! command_exists uv; then
        print_error "uv is required but not installed. Please install uv first."
        exit 1
    fi
    
    if ! command_exists hatch; then
        print_warning "hatch not found, installing..."
        uv pip install hatch
    fi
    
    # Clean previous builds
    print_step "Cleaning previous builds"
    rm -rf dist/ build/ src/*.egg-info/
    print_success "Cleaned previous builds"
    
    # Install/update dependencies
    print_step "Installing dependencies"
    uv pip install --upgrade pip
    uv pip install --upgrade build hatchling hatch-vcs
    print_success "Dependencies installed"
    
    # Run code quality checks
    print_step "Running code quality checks"
    hatch run lint:style || {
        print_error "Code style checks failed"
        exit 1
    }
    print_success "Code quality checks passed"
    
    # Run type checking
    print_step "Running type checking"
    hatch run lint:typing || {
        print_error "Type checking failed"
        exit 1
    }
    print_success "Type checking passed"
    
    # Run tests
    print_step "Running tests"
    hatch run test:test-cov || {
        print_error "Tests failed"
        exit 1
    }
    print_success "All tests passed"
    
    # Build the package
    print_step "Building package"
    uv run python -m build --outdir dist || {
        print_error "Build failed"
        exit 1
    }
    print_success "Package built successfully"
    
    # Verify build artifacts
    print_step "Verifying build artifacts"
    if [ ! -f dist/*.whl ] || [ ! -f dist/*.tar.gz ]; then
        print_error "Build artifacts are missing"
        exit 1
    fi
    print_success "Build artifacts verified"
    
    # Show build results
    print_step "Build results"
    echo "Build artifacts:"
    ls -la dist/
    
    print_success "Build completed successfully!"
}

# Parse command line arguments
case "${1:-}" in
    --help|-h)
        echo "Usage: $0 [OPTIONS]"
        echo "Options:"
        echo "  --help, -h     Show this help message"
        echo "  --clean        Clean build artifacts and exit"
        echo "  --quick        Skip tests and quality checks"
        exit 0
        ;;
    --clean)
        print_step "Cleaning build artifacts"
        rm -rf dist/ build/ src/*.egg-info/
        print_success "Cleaned build artifacts"
        exit 0
        ;;
    --quick)
        print_step "Quick build mode (skipping tests and quality checks)"
        rm -rf dist/ build/ src/*.egg-info/
        uv pip install --upgrade build hatchling hatch-vcs
        uv run python -m build --outdir dist
        print_success "Quick build completed"
        exit 0
        ;;
    "")
        main
        ;;
    *)
        print_error "Unknown option: $1"
        echo "Use --help for usage information"
        exit 1
        ;;
esac
</document_content>
</document>

# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/scripts/generate_d360_models.py
# Language: python

import sys
from pathlib import Path
import asyncio
from d361.api.generate_models import generate_models_cli
import fire

def main((**kwargs)):


<document index="43">
<source>scripts/install.sh</source>
<document_content>
#!/usr/bin/env bash
# this_file: scripts/install.sh
# Installation script for d361

set -euo pipefail

# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# Function to print colored output
print_step() {
    echo -e "${BLUE}==> $1${NC}"
}

print_success() {
    echo -e "${GREEN}✓ $1${NC}"
}

print_warning() {
    echo -e "${YELLOW}⚠ $1${NC}"
}

print_error() {
    echo -e "${RED}✗ $1${NC}"
}

# Function to check if command exists
command_exists() {
    command -v "$1" >/dev/null 2>&1
}

# Function to detect OS
detect_os() {
    if [[ "$OSTYPE" == "linux-gnu"* ]]; then
        echo "linux"
    elif [[ "$OSTYPE" == "darwin"* ]]; then
        echo "macos"
    elif [[ "$OSTYPE" == "msys" ]] || [[ "$OSTYPE" == "win32" ]]; then
        echo "windows"
    else
        echo "unknown"
    fi
}

# Function to get latest release version
get_latest_version() {
    local repo="twardoch/d361"
    local api_url="https://api.github.com/repos/$repo/releases/latest"
    
    if command_exists curl; then
        curl -s "$api_url" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/' | sed 's/^v//'
    elif command_exists wget; then
        wget -qO- "$api_url" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/' | sed 's/^v//'
    else
        print_error "curl or wget is required to fetch latest version"
        return 1
    fi
}

# Function to install via pip
install_via_pip() {
    local version="${1:-}"
    
    print_step "Installing d361 via pip"
    
    if [[ -n "$version" ]]; then
        python -m pip install "d361==$version"
    else
        python -m pip install d361
    fi
    
    print_success "d361 installed via pip"
}

# Function to install via uv
install_via_uv() {
    local version="${1:-}"
    
    print_step "Installing d361 via uv"
    
    if ! command_exists uv; then
        print_step "Installing uv first"
        curl -LsSf https://astral.sh/uv/install.sh | sh
        export PATH="$HOME/.cargo/bin:$PATH"
    fi
    
    if [[ -n "$version" ]]; then
        uv pip install "d361==$version"
    else
        uv pip install d361
    fi
    
    print_success "d361 installed via uv"
}

# Function to download binary
download_binary() {
    local os="$1"
    local version="${2:-latest}"
    local install_dir="${3:-$HOME/.local/bin}"
    
    print_step "Downloading d361 binary for $os"
    
    # Create install directory if it doesn't exist
    mkdir -p "$install_dir"
    
    # Determine binary name based on OS
    local binary_name
    case "$os" in
        "linux")
            binary_name="d361-offline-ubuntu-latest"
            ;;
        "macos")
            binary_name="d361-offline-macos-latest"
            ;;
        "windows")
            binary_name="d361-offline-windows-latest.exe"
            ;;
        *)
            print_error "Unsupported OS: $os"
            return 1
            ;;
    esac
    
    # Construct download URL
    local download_url
    if [[ "$version" == "latest" ]]; then
        download_url="https://github.com/twardoch/d361/releases/latest/download/$binary_name"
    else
        download_url="https://github.com/twardoch/d361/releases/download/v$version/$binary_name"
    fi
    
    # Download binary
    local target_file="$install_dir/d361-offline"
    if [[ "$os" == "windows" ]]; then
        target_file="$install_dir/d361-offline.exe"
    fi
    
    if command_exists curl; then
        curl -L -o "$target_file" "$download_url"
    elif command_exists wget; then
        wget -O "$target_file" "$download_url"
    else
        print_error "curl or wget is required to download binary"
        return 1
    fi
    
    # Make executable (not needed on Windows)
    if [[ "$os" != "windows" ]]; then
        chmod +x "$target_file"
    fi
    
    print_success "Binary downloaded to $target_file"
    
    # Check if install_dir is in PATH
    if [[ ":$PATH:" != *":$install_dir:"* ]]; then
        print_warning "Note: $install_dir is not in your PATH"
        print_warning "Add it to your PATH or move the binary to a directory in your PATH"
        print_warning "To add to PATH, add this line to your shell profile:"
        print_warning "export PATH=\"$install_dir:\$PATH\""
    fi
}

# Function to install playwright browsers
install_playwright_browsers() {
    print_step "Installing Playwright browsers"
    
    if command_exists playwright; then
        playwright install chromium
        print_success "Playwright browsers installed"
    else
        print_warning "Playwright not found, skipping browser installation"
        print_warning "Install d361 first, then run: playwright install chromium"
    fi
}

# Function to test installation
test_installation() {
    print_step "Testing d361 installation"
    
    # Test CLI
    if command_exists d361-offline; then
        if d361-offline --help > /dev/null 2>&1; then
            print_success "d361-offline CLI working"
        else
            print_error "d361-offline CLI not working"
            return 1
        fi
    else
        print_warning "d361-offline CLI not found in PATH"
    fi
    
    # Test Python import
    if command_exists python; then
        if python -c "import d361; print(f'd361 version: {d361.__version__}')" > /dev/null 2>&1; then
            print_success "d361 Python package working"
        else
            print_warning "d361 Python package not working or not installed"
        fi
    fi
}

# Main installation function
main() {
    local method="auto"
    local version=""
    local install_dir="$HOME/.local/bin"
    local install_browsers=false
    local test_install=true
    
    # Parse arguments
    while [[ $# -gt 0 ]]; do
        case $1 in
            --method|-m)
                method="$2"
                shift 2
                ;;
            --version|-v)
                version="$2"
                shift 2
                ;;
            --install-dir|-d)
                install_dir="$2"
                shift 2
                ;;
            --install-browsers|-b)
                install_browsers=true
                shift
                ;;
            --no-test)
                test_install=false
                shift
                ;;
            --help|-h)
                echo "Usage: $0 [OPTIONS]"
                echo "Options:"
                echo "  --method, -m METHOD    Installation method: auto, pip, uv, binary"
                echo "  --version, -v VERSION  Specific version to install"
                echo "  --install-dir, -d DIR  Directory for binary installation (default: ~/.local/bin)"
                echo "  --install-browsers, -b Install Playwright browsers"
                echo "  --no-test             Skip installation testing"
                echo "  --help, -h            Show this help message"
                exit 0
                ;;
            *)
                print_error "Unknown option: $1"
                echo "Use --help for usage information"
                exit 1
                ;;
        esac
    done
    
    print_step "Starting d361 installation"
    
    # Detect OS
    local os
    os=$(detect_os)
    print_step "Detected OS: $os"
    
    # Get latest version if not specified
    if [[ -z "$version" ]]; then
        print_step "Getting latest version"
        version=$(get_latest_version)
        print_step "Latest version: $version"
    fi
    
    # Determine installation method
    case "$method" in
        "auto")
            if command_exists python; then
                if command_exists uv; then
                    method="uv"
                else
                    method="pip"
                fi
            else
                method="binary"
            fi
            print_step "Auto-detected installation method: $method"
            ;;
        "pip"|"uv"|"binary")
            # Method explicitly specified
            ;;
        *)
            print_error "Invalid installation method: $method"
            echo "Valid methods: auto, pip, uv, binary"
            exit 1
            ;;
    esac
    
    # Perform installation
    case "$method" in
        "pip")
            if ! command_exists python; then
                print_error "Python not found. Please install Python first."
                exit 1
            fi
            install_via_pip "$version"
            ;;
        "uv")
            if ! command_exists python; then
                print_error "Python not found. Please install Python first."
                exit 1
            fi
            install_via_uv "$version"
            ;;
        "binary")
            download_binary "$os" "$version" "$install_dir"
            ;;
    esac
    
    # Install Playwright browsers if requested
    if [[ "$install_browsers" == "true" ]]; then
        install_playwright_browsers
    fi
    
    # Test installation
    if [[ "$test_install" == "true" ]]; then
        test_installation
    fi
    
    print_success "d361 installation completed!"
    
    # Show usage information
    echo ""
    echo "Usage:"
    echo "  d361-offline --help"
    echo "  d361-offline all --map-url='https://docs.example.com/sitemap.xml'"
    echo ""
    echo "For more information, see: https://github.com/twardoch/d361"
}

# Parse command line arguments
case "${1:-}" in
    --help|-h)
        echo "Usage: $0 [OPTIONS]"
        echo "Options:"
        echo "  --method, -m METHOD    Installation method: auto, pip, uv, binary"
        echo "  --version, -v VERSION  Specific version to install"
        echo "  --install-dir, -d DIR  Directory for binary installation (default: ~/.local/bin)"
        echo "  --install-browsers, -b Install Playwright browsers"
        echo "  --no-test             Skip installation testing"
        echo "  --help, -h            Show this help message"
        echo ""
        echo "Examples:"
        echo "  $0                                    # Auto-detect method and install latest"
        echo "  $0 --method pip --version 1.0.0      # Install specific version via pip"
        echo "  $0 --method binary --install-browsers # Install binary and browsers"
        echo ""
        echo "Installation methods:"
        echo "  auto   - Auto-detect best method (default)"
        echo "  pip    - Install via pip"
        echo "  uv     - Install via uv (faster)"
        echo "  binary - Download pre-built binary"
        exit 0
        ;;
    "")
        main
        ;;
    *)
        main "$@"
        ;;
esac
</document_content>
</document>

# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/scripts/json_compress.py
# Language: python

from pathlib import Path
import json
import fire
from typing import Optional

def remove_textual_content((obj)):

def keep_core_endpoints((data)):

def collect_referenced_schemas((obj, all_schemas, referenced_schemas)):

def process_json((
    input_path: str | Path,
    output_path: str | Path,
    text: bool = False,
    core: bool = False,
)) -> None:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/scripts/monitor_d360_api.py
# Language: python

import sys
import asyncio
from pathlib import Path
from d361.api.api_updater import run_one_time_update
from d361.api.api_updater import create_updater
from d361.api.api_updater import create_updater
import fire

class MonitorCLI:
    def run((self, output_dir: str = "generated/models", force: bool = False)):
    def monitor((
            self,
            output_dir: str = "generated/models",
            check_interval_seconds: int = 3600,
            auto_update: bool = True
        )):
    def status((self)):

def run_update((output_dir: str = "generated/models", force: bool = False)):

def start_monitoring((
    output_dir: str = "generated/models",
    check_interval_seconds: int = 3600,
    auto_update: bool = True
)):

def on_update_start((event)):

def on_update_complete((event)):

def on_update_failed((event)):

def show_status(()):

def main(()):

def run((self, output_dir: str = "generated/models", force: bool = False)):

def monitor((
            self,
            output_dir: str = "generated/models",
            check_interval_seconds: int = 3600,
            auto_update: bool = True
        )):

def status((self)):


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/scripts/process_d360_archive.py
# Language: python

import sys
import asyncio
from pathlib import Path
from d361.archive import ArchiveParser, ArchiveParserConfig
import json
import traceback
from d361.archive import ArchiveParser, SqliteCache, create_archive_schema, ArchiveSchema
from d361.archive import CacheConfig
from d361.archive import SqliteCache, CacheConfig
from d361.archive import create_archive_schema, migrate_archive_schema, get_schema_info
import fire

class ArchiveProcessorCLI:
    def parse((
            self,
            archive_path: str,
            output_format: str = "json",
            verbose: bool = False
        )):
    def index((
            self,
            archive_path: str,
            db_path: str = None,
            enable_fts: bool = True,
            enable_cache: bool = True
        )):
    def search((self, query: str, db_path: str = None, limit: int = 10)):
    def cache((self, action: str, cache_path: str = None)):
    def schema((self, action: str, db_path: str = None)):

def parse_archive((
    archive_path: str,
    output_format: str = "json",
    verbose: bool = False
)):

def index_archive((
    archive_path: str,
    db_path: str = None,
    enable_fts: bool = True,
    enable_cache: bool = True
)):

def search_content((query: str, db_path: str = None, limit: int = 10)):

def manage_cache((action: str, cache_path: str = None)):

def manage_schema((action: str, db_path: str = None)):

def main(()):

def parse((
            self,
            archive_path: str,
            output_format: str = "json",
            verbose: bool = False
        )):

def index((
            self,
            archive_path: str,
            db_path: str = None,
            enable_fts: bool = True,
            enable_cache: bool = True
        )):

def search((self, query: str, db_path: str = None, limit: int = 10)):

def cache((self, action: str, cache_path: str = None)):

def schema((self, action: str, db_path: str = None)):


<document index="44">
<source>scripts/release.sh</source>
<document_content>
#!/usr/bin/env bash
# this_file: scripts/release.sh
# Release script for d361 project

set -euo pipefail

# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# Function to print colored output
print_step() {
    echo -e "${BLUE}==> $1${NC}"
}

print_success() {
    echo -e "${GREEN}✓ $1${NC}"
}

print_warning() {
    echo -e "${YELLOW}⚠ $1${NC}"
}

print_error() {
    echo -e "${RED}✗ $1${NC}"
}

# Function to check if command exists
command_exists() {
    command -v "$1" >/dev/null 2>&1
}

# Function to validate semver format
validate_semver() {
    local version="$1"
    if [[ ! "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*)?(\+[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*)?$ ]]; then
        print_error "Invalid semver format: $version"
        print_error "Expected format: MAJOR.MINOR.PATCH[-PRERELEASE][+BUILD]"
        return 1
    fi
    return 0
}

# Function to get current version from git tags
get_current_version() {
    local current_tag
    current_tag=$(git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0")
    echo "${current_tag#v}"
}

# Function to check if version is newer than current
is_newer_version() {
    local new_version="$1"
    local current_version="$2"
    
    # Use Python to compare versions
    python3 -c "
import sys
from packaging import version
try:
    new_v = version.Version('$new_version')
    current_v = version.Version('$current_version')
    sys.exit(0 if new_v > current_v else 1)
except:
    sys.exit(1)
" 2>/dev/null || {
        print_warning "Could not compare versions, installing packaging..."
        pip install packaging
        python3 -c "
import sys
from packaging import version
new_v = version.Version('$new_version')
current_v = version.Version('$current_version')
sys.exit(0 if new_v > current_v else 1)
"
    }
}

# Function to generate changelog entry
generate_changelog_entry() {
    local version="$1"
    local previous_tag="$2"
    
    print_step "Generating changelog entry for v$version"
    
    echo "## [$version] - $(date +%Y-%m-%d)"
    echo ""
    
    # Get commits since last tag
    if [[ "$previous_tag" != "v0.0.0" ]]; then
        git log --oneline --no-merges "$previous_tag..HEAD" | while IFS= read -r commit; do
            echo "- $commit"
        done
    else
        echo "- Initial release"
    fi
    
    echo ""
}

# Function to update version in pyproject.toml (if needed)
update_version_files() {
    local version="$1"
    
    print_step "Updating version files"
    
    # Since we're using hatch-vcs, version is managed by git tags
    # But we can update other version references if needed
    
    print_success "Version files updated"
}

# Function to run pre-release checks
run_pre_release_checks() {
    print_step "Running pre-release checks"
    
    # Check if git working directory is clean
    if ! git diff-index --quiet HEAD --; then
        print_error "Git working directory is not clean"
        echo "Please commit or stash your changes before releasing"
        return 1
    fi
    
    # Check if we're on the main branch
    local current_branch
    current_branch=$(git rev-parse --abbrev-ref HEAD)
    if [[ "$current_branch" != "main" ]]; then
        print_warning "Not on main branch (current: $current_branch)"
        read -p "Continue anyway? (y/N): " -n 1 -r
        echo
        if [[ ! $REPLY =~ ^[Yy]$ ]]; then
            print_error "Release cancelled"
            return 1
        fi
    fi
    
    # Run tests
    print_step "Running full test suite"
    if ! ./scripts/test.sh; then
        print_error "Tests failed"
        return 1
    fi
    
    # Run build
    print_step "Running build"
    if ! ./scripts/build.sh; then
        print_error "Build failed"
        return 1
    fi
    
    print_success "Pre-release checks passed"
    return 0
}

# Function to create and push tag
create_and_push_tag() {
    local version="$1"
    local tag_name="v$version"
    
    print_step "Creating git tag $tag_name"
    
    # Create annotated tag
    git tag -a "$tag_name" -m "Release $tag_name"
    
    print_step "Pushing tag to origin"
    git push origin "$tag_name"
    
    print_success "Tag $tag_name created and pushed"
}

# Function to create GitHub release
create_github_release() {
    local version="$1"
    local tag_name="v$version"
    
    print_step "Creating GitHub release"
    
    if ! command_exists gh; then
        print_warning "GitHub CLI not found, skipping GitHub release"
        print_warning "You can create the release manually at: https://github.com/$(git config --get remote.origin.url | sed 's/.*github.com[:/]\([^/]*\/[^/]*\)\.git/\1/')/releases/new?tag=$tag_name"
        return 0
    fi
    
    # Generate release notes
    local release_notes
    release_notes=$(generate_changelog_entry "$version" "$(git describe --tags --abbrev=0 HEAD~1 2>/dev/null || echo "v0.0.0")")
    
    # Create release with artifacts
    gh release create "$tag_name" dist/* \
        --title "Release $tag_name" \
        --notes "$release_notes" \
        --latest
    
    print_success "GitHub release created"
}

# Function to publish to PyPI
publish_to_pypi() {
    local dry_run="${1:-false}"
    
    if [[ "$dry_run" == "true" ]]; then
        print_step "Publishing to PyPI (dry run)"
        python -m twine upload --repository testpypi dist/* --verbose
    else
        print_step "Publishing to PyPI"
        python -m twine upload dist/* --verbose
    fi
    
    print_success "Published to PyPI"
}

# Main release function
main() {
    local version=""
    local dry_run=false
    local skip_tests=false
    local skip_github=false
    local skip_pypi=false
    
    # Parse arguments
    while [[ $# -gt 0 ]]; do
        case $1 in
            --version|-v)
                version="$2"
                shift 2
                ;;
            --dry-run)
                dry_run=true
                shift
                ;;
            --skip-tests)
                skip_tests=true
                shift
                ;;
            --skip-github)
                skip_github=true
                shift
                ;;
            --skip-pypi)
                skip_pypi=true
                shift
                ;;
            --help|-h)
                echo "Usage: $0 [OPTIONS]"
                echo "Options:"
                echo "  --version, -v VERSION  Version to release (required)"
                echo "  --dry-run             Perform a dry run (test PyPI)"
                echo "  --skip-tests          Skip running tests"
                echo "  --skip-github         Skip GitHub release"
                echo "  --skip-pypi           Skip PyPI publishing"
                echo "  --help, -h            Show this help message"
                exit 0
                ;;
            *)
                print_error "Unknown option: $1"
                echo "Use --help for usage information"
                exit 1
                ;;
        esac
    done
    
    # Check if version is provided
    if [[ -z "$version" ]]; then
        print_error "Version is required"
        echo "Use --version to specify the version to release"
        exit 1
    fi
    
    # Validate version format
    validate_semver "$version" || exit 1
    
    # Check if version is newer than current
    local current_version
    current_version=$(get_current_version)
    if ! is_newer_version "$version" "$current_version"; then
        print_error "Version $version is not newer than current version $current_version"
        exit 1
    fi
    
    print_step "Starting release process for v$version"
    print_step "Current version: $current_version"
    print_step "New version: $version"
    
    # Check for required tools
    if ! command_exists uv; then
        print_error "uv is required but not installed. Please install uv first."
        exit 1
    fi
    
    if ! command_exists git; then
        print_error "git is required but not installed."
        exit 1
    fi
    
    # Install twine if not present
    if ! command_exists twine; then
        print_warning "twine not found, installing..."
        uv pip install twine
    fi
    
    # Run pre-release checks unless skipped
    if [[ "$skip_tests" != "true" ]]; then
        run_pre_release_checks || exit 1
    fi
    
    # Update version files
    update_version_files "$version"
    
    # Create and push tag
    create_and_push_tag "$version"
    
    # Create GitHub release unless skipped
    if [[ "$skip_github" != "true" ]]; then
        create_github_release "$version"
    fi
    
    # Publish to PyPI unless skipped
    if [[ "$skip_pypi" != "true" ]]; then
        publish_to_pypi "$dry_run"
    fi
    
    print_success "Release v$version completed successfully!"
    
    if [[ "$dry_run" == "true" ]]; then
        print_warning "This was a dry run. The package was published to test PyPI."
    fi
    
    echo ""
    echo "Next steps:"
    echo "1. Check the GitHub release: https://github.com/$(git config --get remote.origin.url | sed 's/.*github.com[:/]\([^/]*\/[^/]*\)\.git/\1/')/releases/tag/v$version"
    if [[ "$skip_pypi" != "true" ]]; then
        echo "2. Check PyPI: https://pypi.org/project/d361/$version/"
    fi
    echo "3. Update documentation if needed"
}

# Parse command line arguments
case "${1:-}" in
    --help|-h)
        echo "Usage: $0 [OPTIONS]"
        echo "Options:"
        echo "  --version, -v VERSION  Version to release (required)"
        echo "  --dry-run             Perform a dry run (test PyPI)"
        echo "  --skip-tests          Skip running tests"
        echo "  --skip-github         Skip GitHub release"
        echo "  --skip-pypi           Skip PyPI publishing"
        echo "  --help, -h            Show this help message"
        echo ""
        echo "Examples:"
        echo "  $0 --version 1.0.0"
        echo "  $0 --version 1.0.0 --dry-run"
        echo "  $0 --version 1.0.0 --skip-tests"
        exit 0
        ;;
    "")
        print_error "Version is required"
        echo "Use --version to specify the version to release"
        echo "Use --help for usage information"
        exit 1
        ;;
    *)
        main "$@"
        ;;
esac
</document_content>
</document>

<document index="45">
<source>scripts/test.sh</source>
<document_content>
#!/usr/bin/env bash
# this_file: scripts/test.sh
# Test script for d361 project

set -euo pipefail

# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# Function to print colored output
print_step() {
    echo -e "${BLUE}==> $1${NC}"
}

print_success() {
    echo -e "${GREEN}✓ $1${NC}"
}

print_warning() {
    echo -e "${YELLOW}⚠ $1${NC}"
}

print_error() {
    echo -e "${RED}✗ $1${NC}"
}

# Function to check if command exists
command_exists() {
    command -v "$1" >/dev/null 2>&1
}

# Function to run linting
run_lint() {
    print_step "Running code formatting and linting"
    
    # Check style
    if ! hatch run lint:style; then
        print_error "Code style check failed"
        return 1
    fi
    
    print_success "Code style check passed"
    return 0
}

# Function to run type checking
run_type_check() {
    print_step "Running type checking"
    
    if ! hatch run lint:typing; then
        print_error "Type checking failed"
        return 1
    fi
    
    print_success "Type checking passed"
    return 0
}

# Function to run unit tests
run_unit_tests() {
    print_step "Running unit tests"
    
    if ! hatch run test:test-cov; then
        print_error "Unit tests failed"
        return 1
    fi
    
    print_success "Unit tests passed"
    return 0
}

# Function to run integration tests
run_integration_tests() {
    print_step "Running integration tests"
    
    if ! hatch run test:test -k "integration"; then
        print_warning "Integration tests failed or not found"
        return 1
    fi
    
    print_success "Integration tests passed"
    return 0
}

# Function to install playwright browsers
install_playwright_browsers() {
    print_step "Installing Playwright browsers"
    
    if ! command_exists playwright; then
        print_warning "Playwright not found, installing..."
        uv pip install playwright
    fi
    
    if ! playwright install chromium; then
        print_error "Failed to install Playwright browsers"
        return 1
    fi
    
    print_success "Playwright browsers installed"
    return 0
}

# Main test function
main() {
    local run_lint=true
    local run_types=true
    local run_unit=true
    local run_integration=false
    local install_browsers=false
    local coverage=true
    
    # Parse arguments
    while [[ $# -gt 0 ]]; do
        case $1 in
            --no-lint)
                run_lint=false
                shift
                ;;
            --no-types)
                run_types=false
                shift
                ;;
            --no-unit)
                run_unit=false
                shift
                ;;
            --integration)
                run_integration=true
                shift
                ;;
            --install-browsers)
                install_browsers=true
                shift
                ;;
            --no-coverage)
                coverage=false
                shift
                ;;
            --help|-h)
                echo "Usage: $0 [OPTIONS]"
                echo "Options:"
                echo "  --no-lint           Skip linting checks"
                echo "  --no-types          Skip type checking"
                echo "  --no-unit           Skip unit tests"
                echo "  --integration       Run integration tests"
                echo "  --install-browsers  Install Playwright browsers"
                echo "  --no-coverage       Skip coverage reporting"
                echo "  --help, -h          Show this help message"
                exit 0
                ;;
            *)
                print_error "Unknown option: $1"
                echo "Use --help for usage information"
                exit 1
                ;;
        esac
    done
    
    print_step "Starting test suite for d361"
    
    # Check for required tools
    if ! command_exists uv; then
        print_error "uv is required but not installed. Please install uv first."
        exit 1
    fi
    
    if ! command_exists hatch; then
        print_warning "hatch not found, installing..."
        uv pip install hatch
    fi
    
    # Install Playwright browsers if requested
    if [[ "$install_browsers" == "true" ]]; then
        install_playwright_browsers || exit 1
    fi
    
    # Run linting if enabled
    if [[ "$run_lint" == "true" ]]; then
        run_lint || exit 1
    fi
    
    # Run type checking if enabled
    if [[ "$run_types" == "true" ]]; then
        run_type_check || exit 1
    fi
    
    # Run unit tests if enabled
    if [[ "$run_unit" == "true" ]]; then
        if [[ "$coverage" == "true" ]]; then
            run_unit_tests || exit 1
        else
            print_step "Running unit tests (no coverage)"
            if ! hatch run test:test; then
                print_error "Unit tests failed"
                exit 1
            fi
            print_success "Unit tests passed"
        fi
    fi
    
    # Run integration tests if enabled
    if [[ "$run_integration" == "true" ]]; then
        run_integration_tests || {
            print_warning "Integration tests failed or not found (continuing)"
        }
    fi
    
    print_success "All tests completed successfully!"
}

# Quick test mode
quick_test() {
    print_step "Quick test mode (unit tests only)"
    
    if ! hatch run test:test; then
        print_error "Quick tests failed"
        exit 1
    fi
    
    print_success "Quick tests passed"
}

# Parse command line arguments
case "${1:-}" in
    --help|-h)
        echo "Usage: $0 [OPTIONS]"
        echo "Options:"
        echo "  --help, -h          Show this help message"
        echo "  --quick             Run only unit tests (no coverage, no lint)"
        echo "  --fix               Fix linting issues"
        echo "  --no-lint           Skip linting checks"
        echo "  --no-types          Skip type checking"
        echo "  --no-unit           Skip unit tests"
        echo "  --integration       Run integration tests"
        echo "  --install-browsers  Install Playwright browsers"
        echo "  --no-coverage       Skip coverage reporting"
        exit 0
        ;;
    --quick)
        quick_test
        ;;
    --fix)
        print_step "Fixing linting issues"
        hatch run lint:fix
        print_success "Linting issues fixed"
        ;;
    "")
        main
        ;;
    *)
        main "$@"
        ;;
esac
</document_content>
</document>

# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/scripts/text_replacement_utility.py
# Language: python

import re


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/__init__.py
# Language: python

from importlib.metadata import PackageNotFoundError, version
from .core.models import Article, Category, ProjectVersion, PublishStatus, ContentType
from .core.interfaces import DataProvider, ConverterPlugin, ConvertedContent
from .core.transformers import ModelTransformer
from .http import UnifiedHttpClient, create_http_client, HttpResponse, RetryConfig
from .api import (
    Document360ApiClient,
    ApiConfig,
    TokenManager,
    TokenStats,
    RateLimiter,
    BulkOperationManager,
    BulkOperationConfig,
    SmartBulkProcessor,
    OperationType,
    OperationRequest,
    BulkOperationResult,
    ChunkedDownloader,
    DownloadConfig,
    DownloadStatus,
    ChunkStatus,
    DownloadChunk,
    DownloadProgress,
    DownloadState,
    CircuitBreaker,
    CircuitBreakerConfig,
    CircuitBreakerError,
    CircuitState,
    CircuitMetrics,
    CircuitBreakerRegistry,
    circuit_breaker,
    get_circuit_breaker,
    get_registry,
    DataSyncManager,
    SyncConfig,
    SyncStrategy,
    DeduplicationStrategy,
    ContentFingerprint,
    ChangeRecord,
    ChangeType,
    SyncState,
    ApiMetrics,
    MetricsConfig,
    MetricType,
    MetricPoint,
    MetricSeries,
    TimeWindow,
    get_metrics,
    configure_metrics,
    Document360Error,
    ApiError,
    AuthenticationError,
    RateLimitError,
    NotFoundError,
    ValidationError as ApiValidationError,
    ServerError,
    ErrorHandler,
    OpenApiIntegration,
    OpenApiConfig,
    OpenApiSpec,
    ModelGenerator,
    ModelGenerationConfig,
    GenerationResult,
    generate_models_cli,
    ApiUpdater,
    ApiUpdaterConfig,
    UpdateEvent,
    UpdateTrigger,
    UpdateStatus,
    create_updater,
    run_one_time_update,
)
from .archive import (
    ArchiveParser,
    ArchiveParserConfig,
    ArchiveMetadata,
    ParsedArchive,
    SqliteCache,
    CacheConfig,
    CacheEntry,
    CacheStats,
    ArchiveSchema,
    create_archive_schema,
    migrate_archive_schema,
)
from .scraping import (
    Document360Scraper,
    ScrapingConfig,
    ScrapedPage,
    ScrapingSession,
    BrowserType,
    ScrapingMode,
    UserAgent,
    ContentExtractor,
    ExtractionConfig,
    ExtractedContent,
    ContentBlock,
    ContentType as ScrapingContentType,
    ExtractionQuality,
    MarkdownConverter,
    ConversionConfig,
    ConversionResult,
    ConversionStats,
    MarkdownStyle,
    LinkHandling,
    Document360MarkdownConverter,
    ContentDeduplicator,
    DeduplicationConfig,
    DuplicateStatus,
    SimilarityScore,
    SimilarityAlgorithm,
    DuplicateGroup,
)
from .providers import ApiProvider, ArchiveProvider, HybridProvider, MockProvider
from .plugins import PluginManager
from .config import (
    Environment,
    LogLevel as ConfigLogLevel,
    CacheEvictionPolicy,
    SecretProvider,
    SecretType,
    AppConfig,
    ApiConfig as ConfigApiConfig,
    ArchiveConfig as ConfigArchiveConfig,
    ScrapingConfig as ConfigScrapingConfig,
    CacheConfig as ConfigCacheConfig,
    MonitoringConfig,
    SecurityConfig,
    EnvironmentLoader,
    ConfigFileHandler,
    SecretMetadata,
    SecretValue,
    SecretsProvider,
    EnvironmentSecretsProvider,
    LocalFileSecretsProvider,
    HashiCorpVaultProvider,
    SecretsManager,
    PROVIDER_REGISTRY,
    create_secrets_provider,
    ConfigLoader,
    ConfigValidator,
    get_config,
    set_config,
    reset_config,
    get_secrets_manager,
    set_secrets_manager,
    reset_secrets_manager,
    get_config_loader,
    set_config_loader,
    reset_config_loader,
)
from .mkdocs import (
    MkDocsExporter,
    ConfigGenerator,
    NavigationBuilder,
    ThemeOptimizer,
    MarkdownProcessor,
    ContentEnhancer,
    CrossReferenceResolver,
    LinkReference,
    AnchorReference,
    AssetManager,
    AssetReference,
    OptimizationResult,
)
from .utils import (
    LoggingManager,
    LogLevel,
    LogFormat,
    LogContext,
    get_logging_manager,
    get_logger,
    setup_logging,
    setup_development_logging,
    setup_production_logging,
    ServiceLifecycle,
    ServiceContainer,
    injectable,
    get_container,
    resolve,
    register_singleton,
    register_transient,
    register_scoped,
    PerformanceOptimizer,
    async_cache,
    batch_processor,
    performance_monitor,
    get_optimizer,
    ValidationHelper,
    ValidatedBaseModel,
    validate_function_inputs,
)


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/api/__init__.py
# Language: python

from .client import Document360ApiClient, ApiConfig
from .errors import ErrorHandler
from .token_manager import TokenManager, TokenStats, RateLimiter
from .bulk_operations import (
    BulkOperationManager,
    BulkOperationConfig,
    SmartBulkProcessor,
    OperationType,
    OperationRequest,
    BulkOperationResult,
)
from .chunked_download import (
    ChunkedDownloader,
    DownloadConfig,
    DownloadStatus,
    ChunkStatus,
    DownloadChunk,
    DownloadProgress,
    DownloadState,
)
from .circuit_breaker import (
    CircuitBreaker,
    CircuitBreakerConfig,
    CircuitBreakerError,
    CircuitState,
    CircuitMetrics,
    CircuitBreakerRegistry,
    circuit_breaker,
    get_circuit_breaker,
    get_registry,
)
from .data_sync import (
    DataSyncManager,
    SyncConfig,
    SyncStrategy,
    DeduplicationStrategy,
    ContentFingerprint,
    ChangeRecord,
    ChangeType,
    SyncState,
)
from .metrics import (
    ApiMetrics,
    MetricsConfig,
    MetricType,
    MetricPoint,
    MetricSeries,
    TimeWindow,
    get_metrics,
    configure_metrics,
)
from .errors import (
    Document360Error,
    ApiError,
    AuthenticationError,
    RateLimitError,
    NotFoundError,
    ValidationError,
    ServerError,
)
from .openapi_integration import (
    OpenApiIntegration,
    OpenApiConfig,
    OpenApiSpec,
)
from .generate_models import (
    ModelGenerator,
    ModelGenerationConfig,
    GenerationResult,
    generate_models_cli,
)
from .api_updater import (
    ApiUpdater,
    ApiUpdaterConfig,
    UpdateEvent,
    UpdateTrigger,
    UpdateStatus,
    create_updater,
    run_one_time_update,
)


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/api/api_updater.py
# Language: python

import asyncio
from datetime import datetime, timedelta
from pathlib import Path
from typing import Any, Dict, List, Optional, Callable, Awaitable
from dataclasses import dataclass, field
from enum import Enum
from loguru import logger
from pydantic import BaseModel, Field
from .openapi_integration import OpenApiIntegration, OpenApiConfig, OpenApiSpec
from .generate_models import ModelGenerator, ModelGenerationConfig, GenerationResult

class UpdateTrigger(s, t, r, ,,  , E, n, u, m):

class UpdateStatus(s, t, r, ,,  , E, n, u, m):

class UpdateEvent:

class ApiUpdaterConfig(B, a, s, e, M, o, d, e, l):

class ApiUpdater:
    def __init__((
        self,
        config: Optional[ApiUpdaterConfig] = None,
        callbacks: Optional[Dict[str, Callable]] = None
    )):
    def start_monitoring((self)) -> None:
    def stop_monitoring((self)) -> None:
    def _monitoring_loop((self)) -> None:
    def check_for_updates((self)) -> bool:
    def update_api_client((
        self,
        trigger: UpdateTrigger = UpdateTrigger.MANUAL,
        force: bool = False
    )) -> UpdateEvent:
    def _get_spec_changes((self, old_hash: str, new_spec: OpenApiSpec)) -> List[str]:
    def _execute_callback((self, callback_name: str, event: UpdateEvent)) -> None:
    def _add_to_history((self, event: UpdateEvent)) -> None:
    def get_update_history((self, limit: Optional[int] = None)) -> List[UpdateEvent]:
    def get_status((self)) -> Dict[str, Any]:
    def close((self)) -> None:

def __init__((
        self,
        config: Optional[ApiUpdaterConfig] = None,
        callbacks: Optional[Dict[str, Callable]] = None
    )):

def start_monitoring((self)) -> None:

def stop_monitoring((self)) -> None:

def _monitoring_loop((self)) -> None:

def check_for_updates((self)) -> bool:

def update_api_client((
        self,
        trigger: UpdateTrigger = UpdateTrigger.MANUAL,
        force: bool = False
    )) -> UpdateEvent:

def _get_spec_changes((self, old_hash: str, new_spec: OpenApiSpec)) -> List[str]:

def _execute_callback((self, callback_name: str, event: UpdateEvent)) -> None:

def _add_to_history((self, event: UpdateEvent)) -> None:

def get_update_history((self, limit: Optional[int] = None)) -> List[UpdateEvent]:

def get_status((self)) -> Dict[str, Any]:

def close((self)) -> None:

def create_updater((
    output_dir: Optional[str] = None,
    check_interval_seconds: int = 3600,
    auto_update: bool = False,
    callbacks: Optional[Dict[str, Callable]] = None
)) -> ApiUpdater:

def run_one_time_update((output_dir: Optional[str] = None, force: bool = False)) -> UpdateEvent:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/api/bulk_operations.py
# Language: python

import asyncio
from dataclasses import dataclass, field
from enum import Enum
from typing import Any, Callable, Dict, List, Optional, Union
from datetime import datetime
from loguru import logger
from pydantic import BaseModel, Field
from .client import Document360ApiClient
from .errors import Document360Error, ErrorHandler

class OperationType(s, t, r, ,,  , E, n, u, m):

class OperationRequest:
    def __post_init__((self)):

class BulkOperationResult:
    def mark_complete((self)) -> None:

class BulkOperationConfig(B, a, s, e, M, o, d, e, l):

class BulkOperationManager:
    def __init__((self, client: Document360ApiClient, config: Optional[BulkOperationConfig] = None)):
    def execute_bulk_create((
        self,
        articles_data: List[Dict[str, Any]],
        chunk_size: Optional[int] = None
    )) -> BulkOperationResult:
    def execute_bulk_update((
        self,
        updates: List[tuple[str, Dict[str, Any]]],  # (article_id, update_data)
        chunk_size: Optional[int] = None
    )) -> BulkOperationResult:
    def execute_bulk_delete((
        self,
        article_ids: List[str],
        chunk_size: Optional[int] = None
    )) -> BulkOperationResult:
    def execute_bulk_fetch((
        self,
        article_ids: List[str],
        chunk_size: Optional[int] = None
    )) -> BulkOperationResult:
    def _execute_bulk_operations((
        self,
        requests: List[OperationRequest],
        chunk_size: Optional[int] = None
    )) -> BulkOperationResult:
    def _execute_single_operation((self, request: OperationRequest)) -> Optional[Dict[str, Any]]:
    def _perform_operation((self, request: OperationRequest)) -> Optional[Dict[str, Any]]:
    def _retry_failed_operations((self, failed_requests: List[OperationRequest])) -> BulkOperationResult:

class SmartBulkProcessor:
    def __init__((self, client: Document360ApiClient)):
    def process_articles_intelligently((
        self,
        operation: str,
        articles_data: List[Union[Dict[str, Any], tuple[str, Dict[str, Any]], str]],
        progress_callback: Optional[Callable[[int, int], None]] = None
    )) -> BulkOperationResult:
    def _adapt_batch_size((self, success_rate: float, response_time: float)) -> None:

def __post_init__((self)):

def success_rate((self)) -> float:

def is_complete((self)) -> bool:

def mark_complete((self)) -> None:

def __init__((self, client: Document360ApiClient, config: Optional[BulkOperationConfig] = None)):

def execute_bulk_create((
        self,
        articles_data: List[Dict[str, Any]],
        chunk_size: Optional[int] = None
    )) -> BulkOperationResult:

def execute_bulk_update((
        self,
        updates: List[tuple[str, Dict[str, Any]]],  # (article_id, update_data)
        chunk_size: Optional[int] = None
    )) -> BulkOperationResult:

def execute_bulk_delete((
        self,
        article_ids: List[str],
        chunk_size: Optional[int] = None
    )) -> BulkOperationResult:

def execute_bulk_fetch((
        self,
        article_ids: List[str],
        chunk_size: Optional[int] = None
    )) -> BulkOperationResult:

def _execute_bulk_operations((
        self,
        requests: List[OperationRequest],
        chunk_size: Optional[int] = None
    )) -> BulkOperationResult:

def _execute_single_operation((self, request: OperationRequest)) -> Optional[Dict[str, Any]]:

def _perform_operation((self, request: OperationRequest)) -> Optional[Dict[str, Any]]:

def _retry_failed_operations((self, failed_requests: List[OperationRequest])) -> BulkOperationResult:

def __init__((self, client: Document360ApiClient)):

def process_articles_intelligently((
        self,
        operation: str,
        articles_data: List[Union[Dict[str, Any], tuple[str, Dict[str, Any]], str]],
        progress_callback: Optional[Callable[[int, int], None]] = None
    )) -> BulkOperationResult:

def _adapt_batch_size((self, success_rate: float, response_time: float)) -> None:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/api/chunked_download.py
# Language: python

import asyncio
import hashlib
import json
import os
import time
from dataclasses import dataclass, field
from datetime import datetime
from enum import Enum
from pathlib import Path
from typing import Any, AsyncGenerator, Callable, Dict, List, Optional, Union
from loguru import logger
from pydantic import BaseModel, Field, validator
from .client import Document360ApiClient
from .errors import Document360Error

class DownloadStatus(s, t, r, ,,  , E, n, u, m):

class ChunkStatus(s, t, r, ,,  , E, n, u, m):

class DownloadChunk:

class DownloadProgress:
    def update_progress((self, items_downloaded: int, chunk_completed: bool = False)) -> None:

class DownloadConfig(B, a, s, e, M, o, d, e, l):

class DownloadState:
    def to_dict((self)) -> Dict[str, Any]:

class ChunkedDownloader:
    def __init__((
        self,
        client: Document360ApiClient,
        config: Optional[DownloadConfig] = None
    )):
    def download_all_articles((
        self,
        category_id: Optional[str] = None,
        project_version_id: Optional[str] = None,
        output_file: Optional[Path] = None
    )) -> DownloadState:
    def _create_chunks((self, total_items: int, chunk_size: int)) -> List[DownloadChunk]:
    def _execute_chunked_download((self, download_state: DownloadState)) -> None:
    def _download_chunk((
        self,
        semaphore: asyncio.Semaphore,
        chunk: DownloadChunk,
        download_state: DownloadState,
        progress: DownloadProgress
    )) -> None:
    def _resume_download((self, download_state: DownloadState)) -> DownloadState:
    def _save_download_state((self, download_state: DownloadState)) -> None:
    def _load_download_state((self, download_id: str)) -> Optional[DownloadState]:
    def _save_download_results((self, download_state: DownloadState, output_file: Path)) -> None:
    def list_downloads((self)) -> List[DownloadState]:
    def cancel_download((self, download_id: str)) -> bool:
    def cleanup_downloads((self, older_than_days: int = 30)) -> int:

def is_complete((self)) -> bool:

def can_retry((self)) -> bool:

def completion_percentage((self)) -> float:

def chunk_completion_percentage((self)) -> float:

def elapsed_time((self)) -> float:

def estimated_time_remaining((self)) -> Optional[float]:

def update_progress((self, items_downloaded: int, chunk_completed: bool = False)) -> None:

def validate_output_directory((cls, v)):

def to_dict((self)) -> Dict[str, Any]:

def from_dict((cls, data: Dict[str, Any])) -> DownloadState:

def __init__((
        self,
        client: Document360ApiClient,
        config: Optional[DownloadConfig] = None
    )):

def download_all_articles((
        self,
        category_id: Optional[str] = None,
        project_version_id: Optional[str] = None,
        output_file: Optional[Path] = None
    )) -> DownloadState:

def _create_chunks((self, total_items: int, chunk_size: int)) -> List[DownloadChunk]:

def _execute_chunked_download((self, download_state: DownloadState)) -> None:

def _download_chunk((
        self,
        semaphore: asyncio.Semaphore,
        chunk: DownloadChunk,
        download_state: DownloadState,
        progress: DownloadProgress
    )) -> None:

def _resume_download((self, download_state: DownloadState)) -> DownloadState:

def _save_download_state((self, download_state: DownloadState)) -> None:

def _load_download_state((self, download_id: str)) -> Optional[DownloadState]:

def _save_download_results((self, download_state: DownloadState, output_file: Path)) -> None:

def list_downloads((self)) -> List[DownloadState]:

def cancel_download((self, download_id: str)) -> bool:

def cleanup_downloads((self, older_than_days: int = 30)) -> int:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/api/circuit_breaker.py
# Language: python

import asyncio
import time
from dataclasses import dataclass, field
from datetime import datetime, timedelta
from enum import Enum
from typing import Any, Callable, Dict, List, Optional, Union
from functools import wraps
from loguru import logger
from pydantic import BaseModel, Field
from .errors import Document360Error, ErrorSeverity, ErrorCategory

class CircuitState(s, t, r, ,,  , E, n, u, m):

class CircuitMetrics:
    def update_request((self, success: bool, response_time: float)) -> None:
    def update_state_change((self, new_state: CircuitState)) -> None:
    def to_dict((self)) -> Dict[str, Any]:

class CircuitBreakerConfig(B, a, s, e, M, o, d, e, l):

class Config:

class CircuitBreakerError(D, o, c, u, m, e, n, t, 3, 6, 0, E, r, r, o, r):
    def __init__((self, message: str, circuit_state: CircuitState, metrics: CircuitMetrics)):

class CircuitBreaker:
    def __init__((self, name: str, config: Optional[CircuitBreakerConfig] = None)):
    def call((self, func: Callable[..., Any], *args, **kwargs)) -> Any:
    def _check_state((self)) -> None:
    def _update_state((self, request_success: bool)) -> None:
    def _is_slow_call_rate_exceeded((self)) -> bool:
    def _transition_to_open((self)) -> None:
    def _transition_to_half_open((self)) -> None:
    def _transition_to_closed((self)) -> None:
    def force_open((self)) -> None:
    def force_close((self)) -> None:
    def reset_metrics((self)) -> None:

class CircuitBreakerRegistry:
    def __init__((self)):
    def get_or_create((self, name: str, config: Optional[CircuitBreakerConfig] = None)) -> CircuitBreaker:
    def get_breaker((self, name: str)) -> Optional[CircuitBreaker]:
    def list_breakers((self)) -> List[str]:
    def get_health_report((self)) -> Dict[str, Any]:
    def force_open_all((self)) -> None:
    def force_close_all((self)) -> None:
    def reset_all_metrics((self)) -> None:

def update_request((self, success: bool, response_time: float)) -> None:

def update_state_change((self, new_state: CircuitState)) -> None:

def success_rate((self)) -> float:

def to_dict((self)) -> Dict[str, Any]:

def __init__((self, message: str, circuit_state: CircuitState, metrics: CircuitMetrics)):

def __init__((self, name: str, config: Optional[CircuitBreakerConfig] = None)):

def call((self, func: Callable[..., Any], *args, **kwargs)) -> Any:

def _check_state((self)) -> None:

def _update_state((self, request_success: bool)) -> None:

def _is_slow_call_rate_exceeded((self)) -> bool:

def _transition_to_open((self)) -> None:

def _transition_to_half_open((self)) -> None:

def _transition_to_closed((self)) -> None:

def force_open((self)) -> None:

def force_close((self)) -> None:

def reset_metrics((self)) -> None:

def is_available((self)) -> bool:

def health_status((self)) -> Dict[str, Any]:

def circuit_breaker((
    name: str,
    config: Optional[CircuitBreakerConfig] = None,
    breaker_instance: Optional[CircuitBreaker] = None
)):

def decorator((func)):

def wrapper((*args, **kwargs)):

def __init__((self)):

def get_or_create((self, name: str, config: Optional[CircuitBreakerConfig] = None)) -> CircuitBreaker:

def get_breaker((self, name: str)) -> Optional[CircuitBreaker]:

def list_breakers((self)) -> List[str]:

def get_health_report((self)) -> Dict[str, Any]:

def force_open_all((self)) -> None:

def force_close_all((self)) -> None:

def reset_all_metrics((self)) -> None:

def get_circuit_breaker((name: str, config: Optional[CircuitBreakerConfig] = None)) -> CircuitBreaker:

def get_registry(()) -> CircuitBreakerRegistry:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/api/client.py
# Language: python

import time
from datetime import datetime
from typing import Any, Dict, List, Optional, Union
from loguru import logger
from pydantic import BaseModel, Field, HttpUrl, validator
from .token_manager import TokenManager, TokenStats
from .errors import Document360Error, ErrorHandler, AuthenticationError, ValidationError
from d361api import ApiClient as D361ApiClient, Configuration, ArticlesApi, CategoriesApi, ProjectVersionsApi
from d361api.exceptions import ApiException as D361ApiException

class ApiConfig(B, a, s, e, M, o, d, e, l):

class Document360ApiClient:
    def __init__((self, config: ApiConfig)):
    def _setup_d361api_clients((self)):
    def _execute_with_d361api((self, operation_name: str, api_call)):
    def get_article((self, article_id: str)) -> Dict[str, Any]:
    def list_articles((
        self,
        category_id: Optional[str] = None,
        project_version_id: Optional[str] = None,
        limit: int = 100,
        offset: int = 0
    )) -> Dict[str, Any]:
    def create_article((self, article_data: Dict[str, Any])) -> Dict[str, Any]:
    def update_article((self, article_id: str, article_data: Dict[str, Any])) -> Dict[str, Any]:
    def delete_article((self, article_id: str)) -> bool:
    def get_categories((self, project_version_id: Optional[str] = None)) -> Dict[str, Any]:
    def get_project_versions((self)) -> Dict[str, Any]:
    def health_check((self)) -> Dict[str, Any]:
    def close((self)) -> None:
    def __aenter__((self)):
    def __aexit__((self, exc_type, exc_val, exc_tb)):
    def reset_statistics((self)) -> None:
    def stream_all_articles((
        self,
        category_id: Optional[str] = None,
        project_version_id: Optional[str] = None,
        page_size: int = 100,
        max_articles: Optional[int] = None
    )):
    def stream_articles_batch((
        self,
        category_id: Optional[str] = None,
        project_version_id: Optional[str] = None,
        batch_size: int = 100,
        max_articles: Optional[int] = None
    )):

def validate_tokens((cls, v)):

def __init__((self, config: ApiConfig)):

def _setup_d361api_clients((self)):

def _execute_with_d361api((self, operation_name: str, api_call)):

def get_article((self, article_id: str)) -> Dict[str, Any]:

def list_articles((
        self,
        category_id: Optional[str] = None,
        project_version_id: Optional[str] = None,
        limit: int = 100,
        offset: int = 0
    )) -> Dict[str, Any]:

def create_article((self, article_data: Dict[str, Any])) -> Dict[str, Any]:

def update_article((self, article_id: str, article_data: Dict[str, Any])) -> Dict[str, Any]:

def delete_article((self, article_id: str)) -> bool:

def get_categories((self, project_version_id: Optional[str] = None)) -> Dict[str, Any]:

def get_project_versions((self)) -> Dict[str, Any]:

def health_check((self)) -> Dict[str, Any]:

def close((self)) -> None:

def __aenter__((self)):

def __aexit__((self, exc_type, exc_val, exc_tb)):

def statistics((self)) -> Dict[str, Any]:

def reset_statistics((self)) -> None:

def stream_all_articles((
        self,
        category_id: Optional[str] = None,
        project_version_id: Optional[str] = None,
        page_size: int = 100,
        max_articles: Optional[int] = None
    )):

def stream_articles_batch((
        self,
        category_id: Optional[str] = None,
        project_version_id: Optional[str] = None,
        batch_size: int = 100,
        max_articles: Optional[int] = None
    )):


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/api/data_sync.py
# Language: python

import asyncio
import hashlib
import json
import time
from dataclasses import dataclass, field
from datetime import datetime, timedelta
from enum import Enum
from pathlib import Path
from typing import Any, Callable, Dict, List, Optional, Set, Tuple, Union
from collections import defaultdict
from loguru import logger
from pydantic import BaseModel, Field
from ..core.models import Article, Category, ProjectVersion, ContentType
from .errors import Document360Error, ErrorSeverity, ErrorCategory

class SyncStrategy(s, t, r, ,,  , E, n, u, m):

class ChangeType(s, t, r, ,,  , E, n, u, m):

class DeduplicationStrategy(s, t, r, ,,  , E, n, u, m):

class ContentFingerprint:
    def similarity_score((self, other: ContentFingerprint)) -> float:
    def to_dict((self)) -> Dict[str, Any]:

class ChangeRecord:
    def to_dict((self)) -> Dict[str, Any]:

class SyncConfig(B, a, s, e, M, o, d, e, l):

class SyncState(B, a, s, e, M, o, d, e, l):
    def to_dict((self)) -> Dict[str, Any]:

class DataSyncManager:
    def __init__((
        self,
        api_client,  # Document360ApiClient
        config: Optional[SyncConfig] = None,
        state_dir: Optional[Path] = None
    )):
    def add_change_callback((self, callback: Callable[[ChangeRecord], None])) -> None:
    def sync_articles((
        self,
        category_id: Optional[str] = None,
        project_version_id: Optional[str] = None,
        sync_id: Optional[str] = None
    )) -> SyncState:
    def _initialize_sync((
        self,
        sync_id: Optional[str],
        operation_type: str,
        operation_params: Dict[str, Any]
    )) -> SyncState:
    def _fetch_articles((
        self,
        category_id: Optional[str],
        project_version_id: Optional[str]
    )) -> List[Article]:
    def _process_articles_batch((
        self,
        articles: List[Article],
        sync_state: SyncState,
        previous_fingerprints: Dict[str, ContentFingerprint]
    )) -> None:
    def _process_single_article((
        self,
        article: Article,
        sync_state: SyncState,
        previous_fingerprints: Dict[str, ContentFingerprint]
    )) -> None:
    def _detect_field_changes((
        self,
        old_fp: ContentFingerprint,
        new_fp: ContentFingerprint
    )) -> Dict[str, Any]:
    def _deduplicate_articles((self, sync_state: SyncState)) -> None:
    def _load_previous_fingerprints((self)) -> Dict[str, ContentFingerprint]:
    def _save_sync_state((self, sync_state: SyncState)) -> None:
    def _load_sync_state((self, sync_id: str)) -> Optional[SyncState]:
    def list_syncs((self)) -> List[Dict[str, Any]]:
    def get_sync_report((self, sync_id: str)) -> Optional[Dict[str, Any]]:
    def cleanup_old_states((self)) -> int:

def from_article((cls, article: Article)) -> ContentFingerprint:

def similarity_score((self, other: ContentFingerprint)) -> float:

def to_dict((self)) -> Dict[str, Any]:

def to_dict((self)) -> Dict[str, Any]:

def completion_percentage((self)) -> float:

def success_rate((self)) -> float:

def to_dict((self)) -> Dict[str, Any]:

def __init__((
        self,
        api_client,  # Document360ApiClient
        config: Optional[SyncConfig] = None,
        state_dir: Optional[Path] = None
    )):

def add_change_callback((self, callback: Callable[[ChangeRecord], None])) -> None:

def sync_articles((
        self,
        category_id: Optional[str] = None,
        project_version_id: Optional[str] = None,
        sync_id: Optional[str] = None
    )) -> SyncState:

def _initialize_sync((
        self,
        sync_id: Optional[str],
        operation_type: str,
        operation_params: Dict[str, Any]
    )) -> SyncState:

def _fetch_articles((
        self,
        category_id: Optional[str],
        project_version_id: Optional[str]
    )) -> List[Article]:

def _process_articles_batch((
        self,
        articles: List[Article],
        sync_state: SyncState,
        previous_fingerprints: Dict[str, ContentFingerprint]
    )) -> None:

def process_article((article: Article)) -> None:

def _process_single_article((
        self,
        article: Article,
        sync_state: SyncState,
        previous_fingerprints: Dict[str, ContentFingerprint]
    )) -> None:

def _detect_field_changes((
        self,
        old_fp: ContentFingerprint,
        new_fp: ContentFingerprint
    )) -> Dict[str, Any]:

def _deduplicate_articles((self, sync_state: SyncState)) -> None:

def _load_previous_fingerprints((self)) -> Dict[str, ContentFingerprint]:

def _save_sync_state((self, sync_state: SyncState)) -> None:

def _load_sync_state((self, sync_id: str)) -> Optional[SyncState]:

def list_syncs((self)) -> List[Dict[str, Any]]:

def get_sync_report((self, sync_id: str)) -> Optional[Dict[str, Any]]:

def cleanup_old_states((self)) -> int:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/api/errors.py
# Language: python

from enum import Enum
from typing import Any, Dict, Optional
from ..http.client import HttpResponse
from loguru import logger

class ErrorSeverity(s, t, r, ,,  , E, n, u, m):

class ErrorCategory(s, t, r, ,,  , E, n, u, m):

class Document360Error(E, x, c, e, p, t, i, o, n):
    def __init__((
        self,
        message: str,
        response: Optional[HttpResponse] = None,
        error_code: Optional[str] = None,
        category: ErrorCategory = ErrorCategory.UNKNOWN,
        severity: ErrorSeverity = ErrorSeverity.MEDIUM,
        retryable: bool = False,
        context: Optional[Dict[str, Any]] = None,
    )):
    def __str__((self)) -> str:

class ApiError(D, o, c, u, m, e, n, t, 3, 6, 0, E, r, r, o, r):
    def __init__((self, message: str, response: Optional[HttpResponse] = None, **kwargs)):

class AuthenticationError(D, o, c, u, m, e, n, t, 3, 6, 0, E, r, r, o, r):
    def __init__((self, message: str, response: Optional[HttpResponse] = None, **kwargs)):

class RateLimitError(D, o, c, u, m, e, n, t, 3, 6, 0, E, r, r, o, r):
    def __init__((
        self,
        message: str,
        response: Optional[HttpResponse] = None,
        retry_after: Optional[int] = None,
        **kwargs
    )):

class NotFoundError(D, o, c, u, m, e, n, t, 3, 6, 0, E, r, r, o, r):
    def __init__((self, message: str, resource_id: Optional[str] = None, **kwargs)):

class ValidationError(D, o, c, u, m, e, n, t, 3, 6, 0, E, r, r, o, r):
    def __init__((
        self,
        message: str,
        field: Optional[str] = None,
        value: Optional[Any] = None,
        **kwargs
    )):

class ServerError(D, o, c, u, m, e, n, t, 3, 6, 0, E, r, r, o, r):
    def __init__((self, message: str, response: Optional[HttpResponse] = None, **kwargs)):

class NetworkError(D, o, c, u, m, e, n, t, 3, 6, 0, E, r, r, o, r):
    def __init__((self, message: str, **kwargs)):

class ErrorHandler:

def __init__((
        self,
        message: str,
        response: Optional[HttpResponse] = None,
        error_code: Optional[str] = None,
        category: ErrorCategory = ErrorCategory.UNKNOWN,
        severity: ErrorSeverity = ErrorSeverity.MEDIUM,
        retryable: bool = False,
        context: Optional[Dict[str, Any]] = None,
    )):

def status_code((self)) -> Optional[int]:

def response_text((self)) -> Optional[str]:

def response_json((self)) -> Optional[Dict[str, Any]]:

def __str__((self)) -> str:

def __init__((self, message: str, response: Optional[HttpResponse] = None, **kwargs)):

def __init__((self, message: str, response: Optional[HttpResponse] = None, **kwargs)):

def __init__((
        self,
        message: str,
        response: Optional[HttpResponse] = None,
        retry_after: Optional[int] = None,
        **kwargs
    )):

def __init__((self, message: str, resource_id: Optional[str] = None, **kwargs)):

def __init__((
        self,
        message: str,
        field: Optional[str] = None,
        value: Optional[Any] = None,
        **kwargs
    )):

def __init__((self, message: str, response: Optional[HttpResponse] = None, **kwargs)):

def __init__((self, message: str, **kwargs)):

def classify_error((response: Optional[HttpResponse], exception: Optional[Exception] = None)) -> Document360Error:

def should_retry((error: Document360Error, attempt: int, max_attempts: int)) -> bool:

def get_retry_delay((error: Document360Error, attempt: int)) -> float:

def log_error((error: Document360Error, operation: str, attempt: int = 1)) -> None:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/api/generate_models.py
# Language: python

import asyncio
import json
import subprocess
import tempfile
from datetime import datetime
from pathlib import Path
from typing import Any, Dict, List, Optional
from loguru import logger
from pydantic import BaseModel, Field
from .openapi_integration import OpenApiIntegration, OpenApiConfig
import fire

class ModelGenerationConfig(B, a, s, e, M, o, d, e, l):

class GenerationResult(B, a, s, e, M, o, d, e, l):

class ModelGenerator:
    def __init__((self, config: Optional[ModelGenerationConfig] = None)):
    def generate_models((self, force_refresh: bool = False)) -> GenerationResult:
    def _generate_with_datamodel_codegen((
        self, 
        spec: Any,
        output_file: Path
    )) -> GenerationResult:
    def _add_file_header((self, output_file: Path, spec: Any)) -> None:
    def check_for_updates((self)) -> bool:
    def get_spec_summary((self)) -> Dict[str, Any]:
    def close((self)) -> None:

def __init__((self, config: Optional[ModelGenerationConfig] = None)):

def generate_models((self, force_refresh: bool = False)) -> GenerationResult:

def _generate_with_datamodel_codegen((
        self, 
        spec: Any,
        output_file: Path
    )) -> GenerationResult:

def _add_file_header((self, output_file: Path, spec: Any)) -> None:

def check_for_updates((self)) -> bool:

def get_spec_summary((self)) -> Dict[str, Any]:

def close((self)) -> None:

def generate_models_cli((
    output_dir: str = "generated/models",
    force_refresh: bool = False,
    config_file: Optional[str] = None
)) -> None:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/api/metrics.py
# Language: python

import asyncio
import time
from collections import defaultdict, deque
from dataclasses import dataclass, field
from datetime import datetime, timedelta
from enum import Enum
from typing import Any, Callable, Dict, List, Optional, Set, Union
import threading
from loguru import logger
from pydantic import BaseModel, Field
from .errors import Document360Error, ErrorCategory, ErrorSeverity
import json

class MetricType(s, t, r, ,,  , E, n, u, m):

class TimeWindow(s, t, r, ,,  , E, n, u, m):

class MetricPoint:
    def to_dict((self)) -> Dict[str, Any]:

class MetricSeries:
    def add_point((self, value: float, timestamp: Optional[datetime] = None, labels: Optional[Dict[str, str]] = None)) -> None:
    def get_points_in_window((self, window: TimeWindow)) -> List[MetricPoint]:
    def _parse_time_window((self, window: TimeWindow)) -> timedelta:
    def aggregate((self, window: TimeWindow)) -> Dict[str, float]:
    def _percentile((self, sorted_values: List[float], percentile: float)) -> float:

class MetricsConfig(B, a, s, e, M, o, d, e, l):

class ApiMetrics:
    def __init__((self, config: Optional[MetricsConfig] = None)):
    def _init_builtin_metrics((self)) -> None:
    def create_metric((self, name: str, metric_type: MetricType, description: str = "", labels: Optional[Dict[str, str]] = None)) -> MetricSeries:
    def increment((self, name: str, value: float = 1.0, labels: Optional[Dict[str, str]] = None)) -> None:
    def gauge((self, name: str, value: float, labels: Optional[Dict[str, str]] = None)) -> None:
    def histogram((self, name: str, value: float, labels: Optional[Dict[str, str]] = None)) -> None:
    def timing((self, name: str, duration: float, labels: Optional[Dict[str, str]] = None)) -> None:
    def record_request((self, method: str, endpoint: str, status_code: int, duration: float, request_size: int = 0, response_size: int = 0)) -> None:
    def record_rate_limit((self, remaining: int, reset_time: float, hit: bool = False)) -> None:
    def record_token_usage((self, token_id: str, success: bool = True)) -> None:
    def record_token_rotation((self, old_token: str, new_token: str, reason: str = "")) -> None:
    def record_connection((self, event: str, count: int = 1)) -> None:
    def record_cache_event((self, event: str, size: Optional[int] = None)) -> None:
    def record_circuit_breaker((self, name: str, event: str, state: Optional[str] = None)) -> None:
    def record_sync_operation((self, operation: str, items: int = 0, duration: float = 0, duplicates: int = 0)) -> None:
    def _update_error_rate((self)) -> None:
    def get_metric((self, name: str, window: TimeWindow = TimeWindow.FIVE_MINUTES)) -> Optional[Dict[str, Any]]:
    def get_all_metrics((self, window: TimeWindow = TimeWindow.FIVE_MINUTES)) -> Dict[str, Dict[str, Any]]:
    def get_health_metrics((self)) -> Dict[str, Any]:
    def add_alert_callback((self, callback: Callable[[str, Dict[str, Any]], None])) -> None:
    def check_alerts((self)) -> None:
    def export_metrics((self, format: str = "prometheus")) -> str:
    def _export_prometheus((self)) -> str:
    def _format_prometheus_labels((self, labels: Dict[str, str])) -> str:
    def _export_json((self)) -> str:
    def start_collection((self)) -> None:
    def stop_collection((self)) -> None:
    def _collection_loop((self)) -> None:
    def _cleanup_old_data((self)) -> None:
    def _export_to_endpoint((self)) -> None:

def to_dict((self)) -> Dict[str, Any]:

def add_point((self, value: float, timestamp: Optional[datetime] = None, labels: Optional[Dict[str, str]] = None)) -> None:

def get_points_in_window((self, window: TimeWindow)) -> List[MetricPoint]:

def _parse_time_window((self, window: TimeWindow)) -> timedelta:

def aggregate((self, window: TimeWindow)) -> Dict[str, float]:

def _percentile((self, sorted_values: List[float], percentile: float)) -> float:

def __init__((self, config: Optional[MetricsConfig] = None)):

def _init_builtin_metrics((self)) -> None:

def create_metric((self, name: str, metric_type: MetricType, description: str = "", labels: Optional[Dict[str, str]] = None)) -> MetricSeries:

def increment((self, name: str, value: float = 1.0, labels: Optional[Dict[str, str]] = None)) -> None:

def gauge((self, name: str, value: float, labels: Optional[Dict[str, str]] = None)) -> None:

def histogram((self, name: str, value: float, labels: Optional[Dict[str, str]] = None)) -> None:

def timing((self, name: str, duration: float, labels: Optional[Dict[str, str]] = None)) -> None:

def record_request((self, method: str, endpoint: str, status_code: int, duration: float, request_size: int = 0, response_size: int = 0)) -> None:

def record_rate_limit((self, remaining: int, reset_time: float, hit: bool = False)) -> None:

def record_token_usage((self, token_id: str, success: bool = True)) -> None:

def record_token_rotation((self, old_token: str, new_token: str, reason: str = "")) -> None:

def record_connection((self, event: str, count: int = 1)) -> None:

def record_cache_event((self, event: str, size: Optional[int] = None)) -> None:

def record_circuit_breaker((self, name: str, event: str, state: Optional[str] = None)) -> None:

def record_sync_operation((self, operation: str, items: int = 0, duration: float = 0, duplicates: int = 0)) -> None:

def _update_error_rate((self)) -> None:

def get_metric((self, name: str, window: TimeWindow = TimeWindow.FIVE_MINUTES)) -> Optional[Dict[str, Any]]:

def get_all_metrics((self, window: TimeWindow = TimeWindow.FIVE_MINUTES)) -> Dict[str, Dict[str, Any]]:

def get_health_metrics((self)) -> Dict[str, Any]:

def add_alert_callback((self, callback: Callable[[str, Dict[str, Any]], None])) -> None:

def check_alerts((self)) -> None:

def export_metrics((self, format: str = "prometheus")) -> str:

def _export_prometheus((self)) -> str:

def _format_prometheus_labels((self, labels: Dict[str, str])) -> str:

def _export_json((self)) -> str:

def start_collection((self)) -> None:

def stop_collection((self)) -> None:

def _collection_loop((self)) -> None:

def _cleanup_old_data((self)) -> None:

def _export_to_endpoint((self)) -> None:

def get_metrics(()) -> ApiMetrics:

def configure_metrics((config: MetricsConfig)) -> ApiMetrics:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/api/openapi_integration.py
# Language: python

import asyncio
import hashlib
import json
import time
from datetime import datetime, timedelta
from pathlib import Path
from typing import Any, Dict, List, Optional, Set, Tuple, Union
from loguru import logger
from pydantic import BaseModel, Field, validator
from ..http import UnifiedHttpClient
from .errors import Document360Error, ErrorCategory, ErrorSeverity
import json
from email.utils import parsedate_to_datetime

class OpenApiConfig(B, a, s, e, M, o, d, e, l):

class OpenApiSpec(B, a, s, e, M, o, d, e, l):
    def get_endpoints((self)) -> List[Dict[str, Any]]:
    def get_models((self)) -> List[Dict[str, Any]]:
    def to_dict((self)) -> Dict[str, Any]:

class OpenApiIntegration:
    def __init__((
        self,
        config: Optional[OpenApiConfig] = None,
        http_client: Optional[UnifiedHttpClient] = None
    )):
    def get_spec((self, force_refresh: bool = False)) -> OpenApiSpec:
    def _fetch_spec((self)) -> OpenApiSpec:
    def _validate_spec((self, spec_data: Dict[str, Any])) -> None:
    def _load_cached_spec((self)) -> Optional[OpenApiSpec]:
    def _save_cached_spec((self, spec: OpenApiSpec)) -> None:
    def check_for_updates((self)) -> bool:
    def get_endpoint_changes((self, old_spec: OpenApiSpec, new_spec: OpenApiSpec)) -> Dict[str, Any]:
    def generate_models_script((self, output_file: Path)) -> str:
    def get_api_summary((self)) -> Dict[str, Any]:
    def close((self)) -> None:

def generate_content_hash((cls, v, values)):

def is_expired((self, ttl_hours: int = 24)) -> bool:

def paths((self)) -> Dict[str, Any]:

def components((self)) -> Dict[str, Any]:

def schemas((self)) -> Dict[str, Any]:

def get_endpoints((self)) -> List[Dict[str, Any]]:

def get_models((self)) -> List[Dict[str, Any]]:

def to_dict((self)) -> Dict[str, Any]:

def __init__((
        self,
        config: Optional[OpenApiConfig] = None,
        http_client: Optional[UnifiedHttpClient] = None
    )):

def get_spec((self, force_refresh: bool = False)) -> OpenApiSpec:

def _fetch_spec((self)) -> OpenApiSpec:

def _validate_spec((self, spec_data: Dict[str, Any])) -> None:

def _load_cached_spec((self)) -> Optional[OpenApiSpec]:

def _save_cached_spec((self, spec: OpenApiSpec)) -> None:

def check_for_updates((self)) -> bool:

def get_endpoint_changes((self, old_spec: OpenApiSpec, new_spec: OpenApiSpec)) -> Dict[str, Any]:

def generate_models_script((self, output_file: Path)) -> str:

def get_api_summary((self)) -> Dict[str, Any]:

def close((self)) -> None:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/api/token_manager.py
# Language: python

import asyncio
import time
from dataclasses import dataclass, field
from datetime import datetime, timedelta
from enum import Enum
from typing import Dict, List, Optional
from loguru import logger
from pydantic import BaseModel, Field
import os

class TokenHealth(s, t, r, ,,  , E, n, u, m):

class TokenStats:
    def __post_init__((self)):
    def record_call((self, response_time: float, success: bool = True)) -> None:
    def update_rate_limit((self, calls_remaining: int, reset_time: Optional[datetime] = None)) -> None:
    def is_rate_limited((self)) -> bool:
    def can_make_call((self)) -> bool:
    def to_dict((self)) -> Dict[str, any]:

class RateLimiter:
    def __init__((self, calls_per_minute: int = 60, safety_margin: int = 5)):
    def wait_if_needed((self)) -> float:
    def record_call((self)) -> None:
    def calls_available((self)) -> int:
    def time_until_reset((self)) -> float:

class TokenManager:
    def __init__((self, tokens: List[str], calls_per_minute: int = 60)):
    def get_best_token((self)) -> Optional[str]:
    def execute_with_token((self, operation: callable, max_retries: int = 3)) -> any:
    def update_token_rate_limit((self, token: str, calls_remaining: int, reset_time: Optional[datetime] = None)) -> None:
    def get_min_reset_time((self)) -> float:
    def get_health_report((self)) -> Dict[str, any]:
    def reset_token_stats((self, token: str)) -> None:
    def add_token((self, token: str)) -> None:
    def remove_token((self, token: str)) -> None:
    def create_concurrency_limiter((self, max_concurrent: int = 10)) -> any:
    def execute_batch_with_concurrency((
        self,
        operations: List[callable],
        max_concurrent: int = 10,
        max_retries: int = 3
    )) -> List[any]:
    def reset_manager_statistics((self)) -> None:

def __post_init__((self)):

def record_call((self, response_time: float, success: bool = True)) -> None:

def update_rate_limit((self, calls_remaining: int, reset_time: Optional[datetime] = None)) -> None:

def is_rate_limited((self)) -> bool:

def can_make_call((self)) -> bool:

def token_hash((self)) -> str:

def utilization_rate((self)) -> float:

def error_rate((self)) -> float:

def to_dict((self)) -> Dict[str, any]:

def __init__((self, calls_per_minute: int = 60, safety_margin: int = 5)):

def wait_if_needed((self)) -> float:

def record_call((self)) -> None:

def calls_available((self)) -> int:

def time_until_reset((self)) -> float:

def __init__((self, tokens: List[str], calls_per_minute: int = 60)):

def from_environment((
        cls,
        prefix: str = "DOCUMENT360_API_TOKEN",
        max_tokens: int = 10,
        calls_per_minute: int = 60
    )) -> 'TokenManager':

def get_best_token((self)) -> Optional[str]:

def token_score((token: str)) -> tuple:

def execute_with_token((self, operation: callable, max_retries: int = 3)) -> any:

def update_token_rate_limit((self, token: str, calls_remaining: int, reset_time: Optional[datetime] = None)) -> None:

def get_min_reset_time((self)) -> float:

def get_health_report((self)) -> Dict[str, any]:

def reset_token_stats((self, token: str)) -> None:

def add_token((self, token: str)) -> None:

def remove_token((self, token: str)) -> None:

def available_tokens_count((self)) -> int:

def create_concurrency_limiter((self, max_concurrent: int = 10)) -> any:

def execute_batch_with_concurrency((
        self,
        operations: List[callable],
        max_concurrent: int = 10,
        max_retries: int = 3
    )) -> List[any]:

def bounded_operation((operation: callable)):

def reset_manager_statistics((self)) -> None:

def manager_statistics((self)) -> Dict[str, any]:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/archive/__init__.py
# Language: python

from .parser import ArchiveParser, ArchiveParserConfig, ArchiveMetadata, ParsedArchive
from .cache import SqliteCache, CacheConfig, CacheEntry, CacheStats
from .schema import ArchiveSchema, create_archive_schema, migrate_archive_schema
from .document360_parser import Document360Parser


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/archive/cache.py
# Language: python

import asyncio
import sqlite3
import threading
import time
from contextlib import asynccontextmanager
from datetime import datetime, timedelta
from pathlib import Path
from typing import Any, Dict, List, Optional, Union, AsyncIterator
from dataclasses import dataclass
from enum import Enum
from queue import Queue
from loguru import logger
from pydantic import BaseModel, Field
from .schema import create_archive_schema, ArchiveSchema
from ..api.errors import Document360Error, ErrorCategory, ErrorSeverity
import pickle
import gzip
import pickle
import pickle
import gzip
import pickle

class EvictionPolicy(s, t, r, ,,  , E, n, u, m):

class CacheStats:

class CacheEntry(B, a, s, e, M, o, d, e, l):

class CacheConfig(B, a, s, e, M, o, d, e, l):

class ConnectionPool:
    def __init__((self, db_path: Path, max_connections: int = 10)):
    def get_connection((self, timeout: float = 30.0)) -> sqlite3.Connection:
    def return_connection((self, conn: sqlite3.Connection)) -> None:
    def _create_connection((self)) -> sqlite3.Connection:
    def close_all((self)) -> None:

class SqliteCache:
    def __init__((self, config: Optional[CacheConfig] = None)):
    def start((self)) -> None:
    def stop((self)) -> None:
    def get((self, key: str)) -> Optional[Any]:
    def set((
        self,
        key: str,
        value: Any,
        ttl_seconds: Optional[int] = None
    )) -> bool:
    def delete((self, key: str)) -> bool:
    def clear((self)) -> None:
    def cleanup_expired((self)) -> int:
    def get_stats((self)) -> CacheStats:
    def _ensure_cache_schema((self)) -> None:
    def _ensure_cache_capacity((self, cursor: sqlite3.Cursor, new_entry_size: int)) -> None:
    def _evict_entries((self, cursor: sqlite3.Cursor)) -> int:
    def _update_stats((self, cursor: sqlite3.Cursor)) -> None:
    def _serialize_value((self, value: Any)) -> Union[str, bytes]:
    def _deserialize_value((self, data: Union[str, bytes])) -> Any:
    def _background_cleanup((self)) -> None:

def hit_rate((self)) -> float:

def miss_rate((self)) -> float:

def is_expired((self)) -> bool:

def age_seconds((self)) -> float:

def __init__((self, db_path: Path, max_connections: int = 10)):

def get_connection((self, timeout: float = 30.0)) -> sqlite3.Connection:

def return_connection((self, conn: sqlite3.Connection)) -> None:

def _create_connection((self)) -> sqlite3.Connection:

def close_all((self)) -> None:

def __init__((self, config: Optional[CacheConfig] = None)):

def start((self)) -> None:

def stop((self)) -> None:

def get((self, key: str)) -> Optional[Any]:

def set((
        self,
        key: str,
        value: Any,
        ttl_seconds: Optional[int] = None
    )) -> bool:

def delete((self, key: str)) -> bool:

def clear((self)) -> None:

def cleanup_expired((self)) -> int:

def get_stats((self)) -> CacheStats:

def _ensure_cache_schema((self)) -> None:

def _ensure_cache_capacity((self, cursor: sqlite3.Cursor, new_entry_size: int)) -> None:

def _evict_entries((self, cursor: sqlite3.Cursor)) -> int:

def _update_stats((self, cursor: sqlite3.Cursor)) -> None:

def _serialize_value((self, value: Any)) -> Union[str, bytes]:

def _deserialize_value((self, data: Union[str, bytes])) -> Any:

def _background_cleanup((self)) -> None:

def get_default_cache(()) -> SqliteCache:

def cache_get((key: str)) -> Optional[Any]:

def cache_set((key: str, value: Any, ttl_seconds: Optional[int] = None)) -> bool:

def cache_delete((key: str)) -> bool:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/archive/document360_parser.py
# Language: python

import re
from datetime import datetime
from pathlib import Path
from typing import Any
from loguru import logger
from d361.core.models import Article, Category
import json
import yaml
import re

class Document360Parser:
    def __init__((self, export_path: Path)) -> None:
    def _validate_export_structure((self)) -> None:
    def _find_version_dir((self)) -> Path:
    def _find_metadata_file((self)) -> Path:
    def parse((self)) -> tuple[list[Category], list[Article]]:
    def _parse_categories((self, metadata: dict[str, Any])) -> list[Category]:
    def _parse_articles_from_categories((
        self, 
        metadata: dict[str, Any], 
        categories: list[Category]
    )) -> list[Article]:
    def _parse_article_metadata((self, art_data: dict[str, Any], category_id: int | str)) -> Article:
    def _load_article_content((self, articles: list[Article])) -> None:
    def _parse_markdown_file((self, md_file: Path)) -> tuple[dict[str, Any] | None, str]:
    def _strip_numeric_prefix((self, slug: str)) -> str:
    def get_statistics((self)) -> dict[str, Any]:

def __init__((self, export_path: Path)) -> None:

def _validate_export_structure((self)) -> None:

def _find_version_dir((self)) -> Path:

def _find_metadata_file((self)) -> Path:

def parse((self)) -> tuple[list[Category], list[Article]]:

def _parse_categories((self, metadata: dict[str, Any])) -> list[Category]:

def parse_category_tree((
            cat_data: dict[str, Any], 
            parent_id: int | None = None, 
            level: int = 0,
            path_prefix: str = ""
        )) -> None:

def _parse_articles_from_categories((
        self, 
        metadata: dict[str, Any], 
        categories: list[Category]
    )) -> list[Article]:

def extract_articles_from_category((cat_data: dict[str, Any], category_id: int | str)) -> None:

def _parse_article_metadata((self, art_data: dict[str, Any], category_id: int | str)) -> Article:

def _load_article_content((self, articles: list[Article])) -> None:

def _parse_markdown_file((self, md_file: Path)) -> tuple[dict[str, Any] | None, str]:

def _strip_numeric_prefix((self, slug: str)) -> str:

def get_statistics((self)) -> dict[str, Any]:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/archive/parser.py
# Language: python

import hashlib
import json
import mimetypes
import tarfile
import zipfile
from datetime import datetime
from pathlib import Path
from typing import Any, Dict, List, Optional, Set, Union, Iterator, BinaryIO
from dataclasses import dataclass, field
from enum import Enum
from loguru import logger
from pydantic import BaseModel, Field, validator
from ..core.models import Article, Category, ProjectVersion
from ..core.transformers import ModelTransformer
from ..api.errors import Document360Error, ErrorCategory, ErrorSeverity
import fnmatch

class ArchiveFormat(s, t, r, ,,  , E, n, u, m):

class ContentType(s, t, r, ,,  , E, n, u, m):

class ArchiveEntry:

class ArchiveParserConfig(B, a, s, e, M, o, d, e, l):

class ArchiveMetadata(B, a, s, e, M, o, d, e, l):

class ParsedArchive(B, a, s, e, M, o, d, e, l):

class ArchiveParser:
    def __init__((self, config: Optional[ArchiveParserConfig] = None)):
    def parse_archive((self, archive_path: Union[str, Path])) -> ParsedArchive:
    def _validate_archive_file((self, archive_path: Path)) -> None:
    def _detect_archive_format((self, archive_path: Path)) -> ArchiveFormat:
    def _calculate_file_hash((self, archive_path: Path)) -> str:
    def _parse_archive_contents((
        self, 
        archive_path: Path, 
        archive_format: ArchiveFormat,
        metadata: ArchiveMetadata
    )) -> List[ArchiveEntry]:
    def _parse_zip_archive((self, archive_path: Path, metadata: ArchiveMetadata)) -> List[ArchiveEntry]:
    def _parse_tar_archive((self, archive_path: Path, metadata: ArchiveMetadata)) -> List[ArchiveEntry]:
    def _should_include_file((self, filename: str)) -> bool:
    def _analyze_entry_content((self, entry: ArchiveEntry)) -> None:
    def _decode_content((self, content: bytes)) -> Optional[str]:
    def _determine_content_type((self, path: str, text_content: Optional[str])) -> ContentType:
    def _extract_article_metadata((self, entry: ArchiveEntry, content: str)) -> None:
    def _extract_json_metadata((self, entry: ArchiveEntry, content: str)) -> None:
    def _extract_structured_data((
        self, 
        entries: List[ArchiveEntry]
    )) -> tuple[List[Article], List[Category], List[ProjectVersion]]:
    def _create_article_from_entry((self, entry: ArchiveEntry)) -> Optional[Article]:
    def _create_category_from_entry((self, entry: ArchiveEntry)) -> Optional[Category]:
    def _create_project_from_entry((self, entry: ArchiveEntry)) -> Optional[ProjectVersion]:

def total_content_size((self)) -> int:

def success_rate((self)) -> float:

def __init__((self, config: Optional[ArchiveParserConfig] = None)):

def parse_archive((self, archive_path: Union[str, Path])) -> ParsedArchive:

def _validate_archive_file((self, archive_path: Path)) -> None:

def _detect_archive_format((self, archive_path: Path)) -> ArchiveFormat:

def _calculate_file_hash((self, archive_path: Path)) -> str:

def _parse_archive_contents((
        self, 
        archive_path: Path, 
        archive_format: ArchiveFormat,
        metadata: ArchiveMetadata
    )) -> List[ArchiveEntry]:

def _parse_zip_archive((self, archive_path: Path, metadata: ArchiveMetadata)) -> List[ArchiveEntry]:

def _parse_tar_archive((self, archive_path: Path, metadata: ArchiveMetadata)) -> List[ArchiveEntry]:

def _should_include_file((self, filename: str)) -> bool:

def _analyze_entry_content((self, entry: ArchiveEntry)) -> None:

def _decode_content((self, content: bytes)) -> Optional[str]:

def _determine_content_type((self, path: str, text_content: Optional[str])) -> ContentType:

def _extract_article_metadata((self, entry: ArchiveEntry, content: str)) -> None:

def _extract_json_metadata((self, entry: ArchiveEntry, content: str)) -> None:

def _extract_structured_data((
        self, 
        entries: List[ArchiveEntry]
    )) -> tuple[List[Article], List[Category], List[ProjectVersion]]:

def _create_article_from_entry((self, entry: ArchiveEntry)) -> Optional[Article]:

def _create_category_from_entry((self, entry: ArchiveEntry)) -> Optional[Category]:

def _create_project_from_entry((self, entry: ArchiveEntry)) -> Optional[ProjectVersion]:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/archive/schema.py
# Language: python

import sqlite3
from datetime import datetime
from pathlib import Path
from typing import Any, Dict, List, Optional
from dataclasses import dataclass
from loguru import logger
from pydantic import BaseModel, Field
from ..api.errors import Document360Error, ErrorCategory, ErrorSeverity

SCHEMA_VERSION_TABLE = =
ARCHIVES_TABLE = =
ARCHIVE_ENTRIES_TABLE = =
ARTICLES_TABLE = =
CATEGORIES_TABLE = =
PROJECTS_TABLE = =
ARTICLES_FTS_TABLE = =
ARCHIVE_ENTRIES_FTS_TABLE = =
ARTICLES_FTS_TRIGGERS = =
ARCHIVE_ENTRIES_FTS_TRIGGERS = =
PERFORMANCE_INDEXES = =
DATABASE_PRAGMAS = =

class ArchiveSchema(B, a, s, e, M, o, d, e, l):

class SchemaVersion:

def create_archive_schema((db_path: Path, config: Optional[ArchiveSchema] = None)) -> None:

def _configure_database((cursor: sqlite3.Cursor, config: ArchiveSchema)) -> None:

def _create_tables((cursor: sqlite3.Cursor, config: ArchiveSchema)) -> None:

def _create_indexes((cursor: sqlite3.Cursor)) -> None:

def _create_fts_tables((cursor: sqlite3.Cursor, config: ArchiveSchema)) -> None:

def _record_schema_version((cursor: sqlite3.Cursor, version: int)) -> None:

def migrate_archive_schema((db_path: Path, target_version: int = 1)) -> None:

def _get_current_schema_version((cursor: sqlite3.Cursor)) -> int:

def _migrate_to_version((cursor: sqlite3.Cursor, version: int)) -> None:

def get_schema_info((db_path: Path)) -> Dict[str, Any]:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/cli/__init__.py
# Language: python

from .main import D361CLI, main_cli


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/cli/main.py
# Language: python

import asyncio
import json
import logging
from pathlib import Path
from typing import Any, Optional
import fire
from rich import print as rprint
from rich.console import Console
from rich.progress import Progress, SpinnerColumn, TextColumn
from rich.table import Table
from ..plugins.manager import PluginManager
from ..providers.mock_provider import MockProvider
import traceback
import traceback

class D361CLI:
    def __init__((self)):
    def _setup_logging((self, debug: bool = False, verbose: bool = False)) -> None:
    def sync((
        self,
        source: str = "api",
        tokens: Optional[str] = None,
        output: str = "./docs",
        format: str = "markdown",  # noqa: A002
        category_id: Optional[int] = None,
        verbose: bool = False,
        debug: bool = False,
        config: Optional[str] = None,
    )) -> None:
    def _sync_with_provider((
        self,
        provider: Any,
        output_dir: Path,
        output_format: str,
        category_id: Optional[int] = None,
    )) -> dict[str, Any]:
    def convert((
        self,
        input_path: str,
        output: Optional[str] = None,
        from_format: str = "html",
        to_format: str = "markdown",
        plugin: Optional[str] = None,
        verbose: bool = False,
        debug: bool = False,
    )) -> None:
    def status((
        self,
        verbose: bool = False,
        debug: bool = False,
    )) -> None:
    def plugins((
        self,
        list_all: bool = False,
        show_formats: bool = False,
        verbose: bool = False,
        debug: bool = False,
    )) -> None:
    def migrate((
        self,
        from_system: str,
        config: Optional[str] = None,
        output: Optional[str] = None,
        dry_run: bool = False,
        verbose: bool = False,
        debug: bool = False,
    )) -> None:

def __init__((self)):

def _setup_logging((self, debug: bool = False, verbose: bool = False)) -> None:

def sync((
        self,
        source: str = "api",
        tokens: Optional[str] = None,
        output: str = "./docs",
        format: str = "markdown",  # noqa: A002
        category_id: Optional[int] = None,
        verbose: bool = False,
        debug: bool = False,
        config: Optional[str] = None,
    )) -> None:

def _sync_with_provider((
        self,
        provider: Any,
        output_dir: Path,
        output_format: str,
        category_id: Optional[int] = None,
    )) -> dict[str, Any]:

def convert((
        self,
        input_path: str,
        output: Optional[str] = None,
        from_format: str = "html",
        to_format: str = "markdown",
        plugin: Optional[str] = None,
        verbose: bool = False,
        debug: bool = False,
    )) -> None:

def status((
        self,
        verbose: bool = False,
        debug: bool = False,
    )) -> None:

def plugins((
        self,
        list_all: bool = False,
        show_formats: bool = False,
        verbose: bool = False,
        debug: bool = False,
    )) -> None:

def migrate((
        self,
        from_system: str,
        config: Optional[str] = None,
        output: Optional[str] = None,
        dry_run: bool = False,
        verbose: bool = False,
        debug: bool = False,
    )) -> None:

def main_cli(()) -> None:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/config/__init__.py
# Language: python

from .schema import (
    # Enums
    Environment,
    LogLevel,
    CacheEvictionPolicy,
    SecretProvider,
    
    # Configuration Models
    AppConfig,
    ApiConfig,
    ArchiveConfig,
    ScrapingConfig,
    CacheConfig,
    MonitoringConfig,
    SecurityConfig,
    
    # Global Configuration Functions
    get_config,
    set_config,
    reset_config,
)
from .environment import (
    # Environment Loading
    EnvironmentLoader,
    ConfigFileHandler,
)
from .secrets import (
    # Secret Types and Models
    SecretType,
    SecretMetadata,
    SecretValue,
    
    # Provider Base Class
    SecretsProvider,
    
    # Concrete Providers
    EnvironmentSecretsProvider,
    LocalFileSecretsProvider,
    HashiCorpVaultProvider,
    
    # Provider Registry
    PROVIDER_REGISTRY,
    create_secrets_provider,
)
from .secrets_manager import (
    # Secrets Management
    SecretsManager,
    
    # Global Functions
    get_secrets_manager,
    set_secrets_manager,
    reset_secrets_manager,
)
from .loader import (
    # Configuration Loading
    ConfigLoader,
    ConfigValidator,
    
    # Global Functions
    get_config_loader,
    set_config_loader,
    reset_config_loader,
)


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/config/environment.py
# Language: python

import os
import time
from pathlib import Path
from typing import Any, Dict, List, Optional, Union, Callable
from threading import Thread, Event
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler, FileModifiedEvent
from loguru import logger
from pydantic_settings import BaseSettings
from pydantic import BaseSettings
from .schema import AppConfig, Environment
from ..api.errors import Document360Error, ErrorCategory, ErrorSeverity
import json
import yaml

class ConfigFileHandler(F, i, l, e, S, y, s, t, e, m, E, v, e, n, t, H, a, n, d, l, e, r):
    def __init__((self, config_paths: List[Path], callback: Callable[[Path], None])):
    def on_modified((self, event)):

class EnvironmentLoader:
    def __init__((
        self,
        base_config_dir: Optional[Path] = None,
        environment_override: Optional[str] = None
    )):
    def detect_environment((self)) -> Environment:
    def load_dotenv_file((self, env_file: Path)) -> Dict[str, str]:
    def get_config_file_paths((self, environment: Environment)) -> List[Path]:
    def get_env_file_paths((self, environment: Environment)) -> List[Path]:
    def load_from_files((self, environment: Environment)) -> Dict[str, Any]:
    def _load_config_file((self, config_path: Path)) -> Dict[str, Any]:
    def merge_env_vars((self, base_data: Dict[str, Any], environment: Environment)) -> Dict[str, Any]:
    def load_configuration((self, environment: Optional[Environment] = None)) -> AppConfig:
    def start_hot_reload((
        self,
        reload_callback: Callable[[AppConfig], None],
        poll_interval: float = 1.0
    )) -> None:
    def stop_hot_reload((self)) -> None:
    def _handle_file_change((self, file_path: Path)) -> None:
    def get_config_summary((self)) -> Dict[str, Any]:
    def __enter__((self)):
    def __exit__((self, exc_type, exc_val, exc_tb)):

def __init__((self, config_paths: List[Path], callback: Callable[[Path], None])):

def on_modified((self, event)):

def __init__((
        self,
        base_config_dir: Optional[Path] = None,
        environment_override: Optional[str] = None
    )):

def detect_environment((self)) -> Environment:

def load_dotenv_file((self, env_file: Path)) -> Dict[str, str]:

def get_config_file_paths((self, environment: Environment)) -> List[Path]:

def get_env_file_paths((self, environment: Environment)) -> List[Path]:

def load_from_files((self, environment: Environment)) -> Dict[str, Any]:

def _load_config_file((self, config_path: Path)) -> Dict[str, Any]:

def merge_env_vars((self, base_data: Dict[str, Any], environment: Environment)) -> Dict[str, Any]:

def load_configuration((self, environment: Optional[Environment] = None)) -> AppConfig:

def start_hot_reload((
        self,
        reload_callback: Callable[[AppConfig], None],
        poll_interval: float = 1.0
    )) -> None:

def stop_hot_reload((self)) -> None:

def _handle_file_change((self, file_path: Path)) -> None:

def get_config_summary((self)) -> Dict[str, Any]:

def __enter__((self)):

def __exit__((self, exc_type, exc_val, exc_tb)):


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/config/loader.py
# Language: python

import os
from pathlib import Path
from typing import Any, Dict, List, Optional, Set, Tuple, Callable
from datetime import datetime
from loguru import logger
from pydantic import ValidationError
from .schema import AppConfig, Environment
from .environment import EnvironmentLoader
from .secrets_manager import SecretsManager
from ..api.errors import Document360Error, ErrorCategory, ErrorSeverity

class ConfigValidator:
    def __init__((self, environment: Environment)):
    def _add_default_rules((self)) -> None:
    def _validate_production_debug((self, config: AppConfig)) -> List[str]:
    def _validate_production_secrets((self, config: AppConfig)) -> List[str]:
    def _validate_production_monitoring((self, config: AppConfig)) -> List[str]:
    def _validate_production_security((self, config: AppConfig)) -> List[str]:
    def _validate_resource_limits((self, config: AppConfig)) -> List[str]:
    def _validate_network_settings((self, config: AppConfig)) -> List[str]:
    def _validate_database_settings((self, config: AppConfig)) -> List[str]:
    def validate((self, config: AppConfig)) -> List[str]:
    def add_rule((self, rule: Callable[[AppConfig], List[str]])) -> None:

class ConfigLoader:
    def __init__((
        self,
        base_config_dir: Optional[Path] = None,
        environment_override: Optional[str] = None,
        enable_secrets: bool = True,
        enable_hot_reload: bool = True
    )):
    def load_configuration((
        self,
        environment: Optional[Environment] = None,
        validate: bool = True,
        fail_on_validation_errors: bool = None
    )) -> AppConfig:
    def _initialize_secrets_manager((self, security_config)) -> None:
    def _inject_secrets((self, config: AppConfig)) -> AppConfig:
    def _validate_configuration((
        self,
        config: AppConfig,
        fail_on_errors: bool
    )) -> List[str]:
    def _start_hot_reload((self, config: AppConfig)) -> None:
    def _handle_config_reload((self, new_config: AppConfig)) -> None:
    def get_current_config((self)) -> Optional[AppConfig]:
    def reload_configuration((
        self,
        validate: bool = True,
        fail_on_validation_errors: bool = None
    )) -> AppConfig:
    def get_config_summary((self)) -> Dict[str, Any]:
    def cleanup((self)) -> None:
    def __aenter__((self)):
    def __aexit__((self, exc_type, exc_val, exc_tb)):

def __init__((self, environment: Environment)):

def _add_default_rules((self)) -> None:

def _validate_production_debug((self, config: AppConfig)) -> List[str]:

def _validate_production_secrets((self, config: AppConfig)) -> List[str]:

def _validate_production_monitoring((self, config: AppConfig)) -> List[str]:

def _validate_production_security((self, config: AppConfig)) -> List[str]:

def _validate_resource_limits((self, config: AppConfig)) -> List[str]:

def _validate_network_settings((self, config: AppConfig)) -> List[str]:

def _validate_database_settings((self, config: AppConfig)) -> List[str]:

def validate((self, config: AppConfig)) -> List[str]:

def add_rule((self, rule: Callable[[AppConfig], List[str]])) -> None:

def __init__((
        self,
        base_config_dir: Optional[Path] = None,
        environment_override: Optional[str] = None,
        enable_secrets: bool = True,
        enable_hot_reload: bool = True
    )):

def load_configuration((
        self,
        environment: Optional[Environment] = None,
        validate: bool = True,
        fail_on_validation_errors: bool = None
    )) -> AppConfig:

def _initialize_secrets_manager((self, security_config)) -> None:

def _inject_secrets((self, config: AppConfig)) -> AppConfig:

def _validate_configuration((
        self,
        config: AppConfig,
        fail_on_errors: bool
    )) -> List[str]:

def _start_hot_reload((self, config: AppConfig)) -> None:

def _handle_config_reload((self, new_config: AppConfig)) -> None:

def get_current_config((self)) -> Optional[AppConfig]:

def reload_configuration((
        self,
        validate: bool = True,
        fail_on_validation_errors: bool = None
    )) -> AppConfig:

def get_config_summary((self)) -> Dict[str, Any]:

def cleanup((self)) -> None:

def __aenter__((self)):

def __aexit__((self, exc_type, exc_val, exc_tb)):

def get_config_loader((
    base_config_dir: Optional[Path] = None,
    environment_override: Optional[str] = None
)) -> ConfigLoader:

def set_config_loader((loader: ConfigLoader)) -> None:

def reset_config_loader(()) -> None:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/config/schema.py
# Language: python

import os
from pathlib import Path
from typing import Any, Dict, List, Optional, Set, Union
from enum import Enum
from loguru import logger
from pydantic_settings import BaseSettings
from pydantic import Field, field_validator, model_validator
from pydantic import BaseSettings, Field
from pydantic import validator as field_validator, root_validator as model_validator
from ..api.errors import Document360Error, ErrorCategory, ErrorSeverity
import json
import yaml
import json
import yaml

class Environment(s, t, r, ,,  , E, n, u, m):

class LogLevel(s, t, r, ,,  , E, n, u, m):

class CacheEvictionPolicy(s, t, r, ,,  , E, n, u, m):

class SecretProvider(s, t, r, ,,  , E, n, u, m):

class ApiConfig(B, a, s, e, S, e, t, t, i, n, g, s):

class Config:

class ArchiveConfig(B, a, s, e, S, e, t, t, i, n, g, s):

class Config:

class ScrapingConfig(B, a, s, e, S, e, t, t, i, n, g, s):

class Config:

class CacheConfig(B, a, s, e, S, e, t, t, i, n, g, s):

class Config:

class MonitoringConfig(B, a, s, e, S, e, t, t, i, n, g, s):

class Config:

class SecurityConfig(B, a, s, e, S, e, t, t, i, n, g, s):

class Config:

class AppConfig(B, a, s, e, S, e, t, t, i, n, g, s):
    def is_development((self)) -> bool:
    def is_production((self)) -> bool:
    def is_testing((self)) -> bool:
    def get_feature_flag((self, feature_name: str, default: bool = False)) -> bool:
    def validate_configuration((self)) -> List[str]:
    def to_dict((self, exclude_secrets: bool = True)) -> Dict[str, Any]:
    def save_to_file((self, config_path: Path, exclude_secrets: bool = True)) -> None:

class Config:

def validate_paths((cls, v)):

def validate_disk_cache_dir((cls, v)):

def validate_and_create_directories((cls, v)):

def validate_production_settings((self)):

def validate_component_consistency((self)):

def is_development((self)) -> bool:

def is_production((self)) -> bool:

def is_testing((self)) -> bool:

def get_feature_flag((self, feature_name: str, default: bool = False)) -> bool:

def validate_configuration((self)) -> List[str]:

def to_dict((self, exclude_secrets: bool = True)) -> Dict[str, Any]:

def load_from_file((cls, config_path: Path)) -> AppConfig:

def save_to_file((self, config_path: Path, exclude_secrets: bool = True)) -> None:

def get_config(()) -> AppConfig:

def set_config((config: AppConfig)) -> None:

def reset_config(()) -> None:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/config/secrets.py
# Language: python

import json
import os
from abc import ABC, abstractmethod
from pathlib import Path
from typing import Any, Dict, List, Optional, Union, Set
from dataclasses import dataclass
from enum import Enum
from datetime import datetime, timedelta
from loguru import logger
from pydantic import BaseModel, Field, validator
from .schema import SecretProvider
from ..api.errors import Document360Error, ErrorCategory, ErrorSeverity
import base64
import base64
import base64
import base64
import hvac

PROVIDER_REGISTRY = :

class SecretType(s, t, r, ,,  , E, n, u, m):

class SecretMetadata:
    def __post_init__((self)):
    def is_expired((self)) -> bool:
    def expires_soon((self, threshold_hours: int = 24)) -> bool:

class SecretValue(B, a, s, e, M, o, d, e, l):
    def is_valid((self)) -> bool:

class Config:

class SecretsProvider(A, B, C):
    def __init__((self, config: Dict[str, Any])):
    def cleanup((self)) -> None:

class EnvironmentSecretsProvider(S, e, c, r, e, t, s, P, r, o, v, i, d, e, r):
    def __init__((self, config: Dict[str, Any])):
    def initialize((self)) -> None:
    def get_secret((self, secret_id: str)) -> SecretValue:
    def set_secret((
        self,
        secret_id: str,
        value: str,
        secret_type: SecretType,
        metadata: Optional[Dict[str, Any]] = None
    )) -> SecretMetadata:
    def delete_secret((self, secret_id: str)) -> bool:
    def list_secrets((
        self,
        secret_type: Optional[SecretType] = None,
        tags: Optional[Dict[str, str]] = None
    )) -> List[SecretMetadata]:
    def health_check((self)) -> bool:

class LocalFileSecretsProvider(S, e, c, r, e, t, s, P, r, o, v, i, d, e, r):
    def __init__((self, config: Dict[str, Any])):
    def initialize((self)) -> None:
    def _get_secret_file_path((self, secret_id: str)) -> Path:
    def _encrypt_value((self, value: str)) -> str:
    def _decrypt_value((self, encrypted_value: str)) -> str:
    def get_secret((self, secret_id: str)) -> SecretValue:
    def set_secret((
        self,
        secret_id: str,
        value: str,
        secret_type: SecretType,
        metadata: Optional[Dict[str, Any]] = None
    )) -> SecretMetadata:
    def delete_secret((self, secret_id: str)) -> bool:
    def list_secrets((
        self,
        secret_type: Optional[SecretType] = None,
        tags: Optional[Dict[str, str]] = None
    )) -> List[SecretMetadata]:
    def health_check((self)) -> bool:

class HashiCorpVaultProvider(S, e, c, r, e, t, s, P, r, o, v, i, d, e, r):
    def __init__((self, config: Dict[str, Any])):
    def initialize((self)) -> None:
    def _get_vault_path((self, secret_id: str)) -> str:
    def get_secret((self, secret_id: str)) -> SecretValue:
    def set_secret((
        self,
        secret_id: str,
        value: str,
        secret_type: SecretType,
        metadata: Optional[Dict[str, Any]] = None
    )) -> SecretMetadata:
    def delete_secret((self, secret_id: str)) -> bool:
    def list_secrets((
        self,
        secret_type: Optional[SecretType] = None,
        tags: Optional[Dict[str, str]] = None
    )) -> List[SecretMetadata]:
    def health_check((self)) -> bool:

def __post_init__((self)):

def is_expired((self)) -> bool:

def expires_soon((self, threshold_hours: int = 24)) -> bool:

def is_valid((self)) -> bool:

def __init__((self, config: Dict[str, Any])):

def initialize((self)) -> None:

def get_secret((self, secret_id: str)) -> SecretValue:

def set_secret((
        self,
        secret_id: str,
        value: str,
        secret_type: SecretType,
        metadata: Optional[Dict[str, Any]] = None
    )) -> SecretMetadata:

def delete_secret((self, secret_id: str)) -> bool:

def list_secrets((
        self,
        secret_type: Optional[SecretType] = None,
        tags: Optional[Dict[str, str]] = None
    )) -> List[SecretMetadata]:

def health_check((self)) -> bool:

def cleanup((self)) -> None:

def __init__((self, config: Dict[str, Any])):

def initialize((self)) -> None:

def get_secret((self, secret_id: str)) -> SecretValue:

def set_secret((
        self,
        secret_id: str,
        value: str,
        secret_type: SecretType,
        metadata: Optional[Dict[str, Any]] = None
    )) -> SecretMetadata:

def delete_secret((self, secret_id: str)) -> bool:

def list_secrets((
        self,
        secret_type: Optional[SecretType] = None,
        tags: Optional[Dict[str, str]] = None
    )) -> List[SecretMetadata]:

def health_check((self)) -> bool:

def __init__((self, config: Dict[str, Any])):

def initialize((self)) -> None:

def _get_secret_file_path((self, secret_id: str)) -> Path:

def _encrypt_value((self, value: str)) -> str:

def _decrypt_value((self, encrypted_value: str)) -> str:

def get_secret((self, secret_id: str)) -> SecretValue:

def set_secret((
        self,
        secret_id: str,
        value: str,
        secret_type: SecretType,
        metadata: Optional[Dict[str, Any]] = None
    )) -> SecretMetadata:

def delete_secret((self, secret_id: str)) -> bool:

def list_secrets((
        self,
        secret_type: Optional[SecretType] = None,
        tags: Optional[Dict[str, str]] = None
    )) -> List[SecretMetadata]:

def health_check((self)) -> bool:

def __init__((self, config: Dict[str, Any])):

def initialize((self)) -> None:

def _get_vault_path((self, secret_id: str)) -> str:

def get_secret((self, secret_id: str)) -> SecretValue:

def set_secret((
        self,
        secret_id: str,
        value: str,
        secret_type: SecretType,
        metadata: Optional[Dict[str, Any]] = None
    )) -> SecretMetadata:

def delete_secret((self, secret_id: str)) -> bool:

def list_secrets((
        self,
        secret_type: Optional[SecretType] = None,
        tags: Optional[Dict[str, str]] = None
    )) -> List[SecretMetadata]:

def health_check((self)) -> bool:

def create_secrets_provider((provider_type: SecretProvider, config: Dict[str, Any])) -> SecretsProvider:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/config/secrets_manager.py
# Language: python

import os
from pathlib import Path
from typing import Any, Dict, List, Optional, Set, Tuple
from datetime import datetime
from loguru import logger
from .schema import SecretProvider, SecurityConfig
from .secrets import (
    SecretsProvider,
    SecretValue,
    SecretMetadata,
    SecretType,
    create_secrets_provider,
    PROVIDER_REGISTRY
)
from ..api.errors import Document360Error, ErrorCategory, ErrorSeverity
import hvac
import boto3

class SecretsManager:
    def __init__((self, config: Optional[SecurityConfig] = None)):
    def initialize((self)) -> None:
    def _initialize_primary_provider((self)) -> None:
    def _initialize_fallback_providers((self)) -> None:
    def _get_fallback_config((self, provider_type: SecretProvider)) -> Dict[str, Any]:
    def _detect_best_provider((self)) -> SecretProvider:
    def _is_vault_available((self)) -> bool:
    def _is_aws_available((self)) -> bool:
    def get_secret((self, secret_id: str)) -> SecretValue:
    def set_secret((
        self,
        secret_id: str,
        value: str,
        secret_type: SecretType,
        metadata: Optional[Dict[str, Any]] = None
    )) -> SecretMetadata:
    def delete_secret((self, secret_id: str)) -> bool:
    def list_secrets((
        self,
        secret_type: Optional[SecretType] = None,
        tags: Optional[Dict[str, str]] = None
    )) -> List[SecretMetadata]:
    def health_check((self)) -> Dict[str, bool]:
    def get_provider_info((self)) -> Dict[str, Any]:
    def rotate_secrets((
        self,
        secret_ids: Optional[List[str]] = None,
        secret_types: Optional[List[SecretType]] = None
    )) -> Dict[str, bool]:
    def cleanup((self)) -> None:
    def __aenter__((self)):
    def __aexit__((self, exc_type, exc_val, exc_tb)):

def __init__((self, config: Optional[SecurityConfig] = None)):

def initialize((self)) -> None:

def _initialize_primary_provider((self)) -> None:

def _initialize_fallback_providers((self)) -> None:

def _get_fallback_config((self, provider_type: SecretProvider)) -> Dict[str, Any]:

def _detect_best_provider((self)) -> SecretProvider:

def _is_vault_available((self)) -> bool:

def _is_aws_available((self)) -> bool:

def get_secret((self, secret_id: str)) -> SecretValue:

def set_secret((
        self,
        secret_id: str,
        value: str,
        secret_type: SecretType,
        metadata: Optional[Dict[str, Any]] = None
    )) -> SecretMetadata:

def delete_secret((self, secret_id: str)) -> bool:

def list_secrets((
        self,
        secret_type: Optional[SecretType] = None,
        tags: Optional[Dict[str, str]] = None
    )) -> List[SecretMetadata]:

def health_check((self)) -> Dict[str, bool]:

def get_provider_info((self)) -> Dict[str, Any]:

def rotate_secrets((
        self,
        secret_ids: Optional[List[str]] = None,
        secret_types: Optional[List[SecretType]] = None
    )) -> Dict[str, bool]:

def cleanup((self)) -> None:

def __aenter__((self)):

def __aexit__((self, exc_type, exc_val, exc_tb)):

def get_secrets_manager((config: Optional[SecurityConfig] = None)) -> SecretsManager:

def set_secrets_manager((manager: SecretsManager)) -> None:

def reset_secrets_manager(()) -> None:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/core/interfaces.py
# Language: python

from abc import abstractmethod
from typing import Any, AsyncIterator, Protocol, runtime_checkable
from pydantic import BaseModel
from .models import Article, Category, ProjectVersion

class DataProvider(P, r, o, t, o, c, o, l):

class ContentWriter(P, r, o, t, o, c, o, l):

class ConvertedContent(B, a, s, e, M, o, d, e, l):

class ConverterPlugin(P, r, o, t, o, c, o, l):

class CacheProvider(P, r, o, t, o, c, o, l):

class SecretsProvider(P, r, o, t, o, c, o, l):

def get_article((self, article_id: int, **kwargs: Any)) -> Article:

def list_articles((
        self,
        category_id: int | None = None,
        status: str | None = None,
        **kwargs: Any,
    )) -> list[Article]:

def stream_articles((self, **kwargs: Any)) -> AsyncIterator[Article]:

def get_category((self, category_id: int, **kwargs: Any)) -> Category:

def list_categories((self, **kwargs: Any)) -> list[Category]:

def get_project_version((self, **kwargs: Any)) -> ProjectVersion:

def write_article((self, article: Article, destination: str, **kwargs: Any)) -> bool:

def write_articles_batch((
        self, articles: list[Article], destination: str, **kwargs: Any
    )) -> dict[str, bool]:

def convert((self, content: str, **options: Any)) -> ConvertedContent:

def supported_formats((self)) -> tuple[str, str]:

def plugin_name((self)) -> str:

def get((self, key: str)) -> Any | None:

def set((self, key: str, value: Any, ttl: int | None = None)) -> bool:

def delete((self, key: str)) -> bool:

def clear((self)) -> bool:

def get_secret((self, key: str)) -> str | None:

def list_secrets((self, prefix: str = "")) -> list[str]:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/core/models.py
# Language: python

from datetime import datetime
from enum import Enum
from typing import Any, Union
from pydantic import BaseModel, ConfigDict, Field, computed_field
import re

class ContentType(s, t, r, ,,  , E, n, u, m):

class PublishStatus(s, t, r, ,,  , E, n, u, m):

class Article(B, a, s, e, M, o, d, e, l):
    def __str__((self)) -> str:

class Category(B, a, s, e, M, o, d, e, l):
    def __str__((self)) -> str:

class ProjectVersion(B, a, s, e, M, o, d, e, l):
    def __str__((self)) -> str:

class SearchResult(B, a, s, e, M, o, d, e, l):
    def __str__((self)) -> str:

class BulkOperation(B, a, s, e, M, o, d, e, l):
    def __str__((self)) -> str:

def word_count((self)) -> int:

def reading_time_minutes((self)) -> int:

def is_published((self)) -> bool:

def __str__((self)) -> str:

def is_root_category((self)) -> bool:

def full_name((self)) -> str:

def __str__((self)) -> str:

def full_project_name((self)) -> str:

def __str__((self)) -> str:

def has_results((self)) -> bool:

def __str__((self)) -> str:

def progress_percentage((self)) -> float:

def is_completed((self)) -> bool:

def success_rate((self)) -> float:

def __str__((self)) -> str:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/core/transformers.py
# Language: python

import re
from datetime import datetime
from typing import Any
from .models import Article, Category, ProjectVersion, PublishStatus

class ModelTransformer:

def from_api_response((data: dict[str, Any], content_type: str = "article")) -> Article | Category | ProjectVersion:

def _transform_api_article((data: dict[str, Any])) -> Article:

def _transform_api_category((data: dict[str, Any])) -> Category:

def _transform_api_project((data: dict[str, Any])) -> ProjectVersion:

def from_archive_metadata((data: dict[str, Any], content_type: str = "article")) -> Article | Category | ProjectVersion:

def _transform_archive_article((data: dict[str, Any])) -> Article:

def _transform_archive_category((data: dict[str, Any])) -> Category:

def _transform_archive_project((data: dict[str, Any])) -> ProjectVersion:

def to_legacy_format((model: Article | Category | ProjectVersion, format_name: str)) -> dict[str, Any]:

def _article_to_legacy((article: Article, format_name: str)) -> dict[str, Any]:

def _category_to_legacy((category: Category, format_name: str)) -> dict[str, Any]:

def _project_to_legacy((project: ProjectVersion, format_name: str)) -> dict[str, Any]:

def _parse_timestamp((value: Any)) -> datetime:

def _parse_tags((tags: Any)) -> list[str]:


<document index="46">
<source>src/d361/edit/SPEC.md</source>
<document_content>
# A Human-Friendly Python Package for Document360: `d361util`

This document outlines the design and specification for a Python package, `d361util`, built on top of the auto-generated `d361api` package. The goal is to provide a simplified interface for interacting with Document360 knowledge bases, abstracting away API complexities and presenting a filesystem-like structure for managing articles and categories. Users can synchronize local Markdown files with their Document360 cloud storage.
</document_content>
</document>

# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/http/__init__.py
# Language: python

from .client import (
    HttpMethod,
    HttpResponse, 
    RetryConfig,
    RequestMetrics,
    UnifiedHttpClient,
    create_http_client,
)
from .client import (
    HttpError,
    HttpClientError,
    HttpServerError,
    HttpTimeoutError,
    HttpNetworkError,
)
from .compatibility import (
    AiohttpResponse,
    AiohttpSession,
    ClientSession,
    MigrationHelper,
    session,
)

def get((url: str, **kwargs)) -> HttpResponse:

def post((url: str, **kwargs)) -> HttpResponse:

def put((url: str, **kwargs)) -> HttpResponse:

def delete((url: str, **kwargs)) -> HttpResponse:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/http/client.py
# Language: python

import asyncio
import time
from contextlib import asynccontextmanager
from contextvars import ContextVar
from dataclasses import dataclass, field
from enum import Enum
from typing import Any, AsyncGenerator, Dict, List, Optional, Union
import httpx
from loguru import logger
from pydantic import BaseModel, Field
from tenacity import (
    AsyncRetrying,
    retry_if_exception_type,
    stop_after_attempt,
    wait_exponential,
)
import json

class HttpMethod(s, t, r, ,,  , E, n, u, m):

class RetryConfig(B, a, s, e, M, o, d, e, l):

class RequestMetrics(B, a, s, e, M, o, d, e, l):

class HttpResponse:

class HttpError(E, x, c, e, p, t, i, o, n):
    def __init__((self, message: str, response: Optional[HttpResponse] = None)):

class HttpClientError(H, t, t, p, E, r, r, o, r):

class HttpServerError(H, t, t, p, E, r, r, o, r):

class HttpTimeoutError(H, t, t, p, E, r, r, o, r):

class HttpNetworkError(H, t, t, p, E, r, r, o, r):

class UnifiedHttpClient:
    def __init__((
        self,
        base_url: Optional[str] = None,
        timeout: float = 30.0,
        retry_config: Optional[RetryConfig] = None,
        default_headers: Optional[Dict[str, str]] = None,
        verify_ssl: bool = True,
        follow_redirects: bool = True,
        max_connections: int = 100,
        max_keepalive_connections: int = 20,
    )):
    def __aenter__((self)):
    def __aexit__((self, exc_type, exc_val, exc_tb)):
    def close((self)):
    def add_request_middleware((self, middleware: callable)):
    def add_response_middleware((self, middleware: callable)):
    def _apply_request_middleware((self, request_data: Dict[str, Any])) -> Dict[str, Any]:
    def _apply_response_middleware((self, response: HttpResponse)) -> HttpResponse:
    def _call_middleware((self, middleware: callable, data: Any)) -> Any:
    def _should_retry((self, exception: Exception, response: Optional[HttpResponse] = None)) -> bool:
    def _make_request((
        self,
        method: HttpMethod,
        url: str,
        headers: Optional[Dict[str, str]] = None,
        params: Optional[Dict[str, Any]] = None,
        json_data: Optional[Dict[str, Any]] = None,
        data: Optional[Any] = None,
        files: Optional[Dict[str, Any]] = None,
        **kwargs,
    )) -> HttpResponse:
    def get((
        self,
        url: str,
        params: Optional[Dict[str, Any]] = None,
        headers: Optional[Dict[str, str]] = None,
        **kwargs,
    )) -> HttpResponse:
    def post((
        self,
        url: str,
        json_data: Optional[Dict[str, Any]] = None,
        data: Optional[Any] = None,
        headers: Optional[Dict[str, str]] = None,
        **kwargs,
    )) -> HttpResponse:
    def put((
        self,
        url: str,
        json_data: Optional[Dict[str, Any]] = None,
        data: Optional[Any] = None,
        headers: Optional[Dict[str, str]] = None,
        **kwargs,
    )) -> HttpResponse:
    def patch((
        self,
        url: str,
        json_data: Optional[Dict[str, Any]] = None,
        data: Optional[Any] = None,
        headers: Optional[Dict[str, str]] = None,
        **kwargs,
    )) -> HttpResponse:
    def delete((
        self,
        url: str,
        headers: Optional[Dict[str, str]] = None,
        **kwargs,
    )) -> HttpResponse:
    def head((
        self,
        url: str,
        headers: Optional[Dict[str, str]] = None,
        **kwargs,
    )) -> HttpResponse:

def is_success((self)) -> bool:

def is_client_error((self)) -> bool:

def is_server_error((self)) -> bool:

def __init__((self, message: str, response: Optional[HttpResponse] = None)):

def __init__((
        self,
        base_url: Optional[str] = None,
        timeout: float = 30.0,
        retry_config: Optional[RetryConfig] = None,
        default_headers: Optional[Dict[str, str]] = None,
        verify_ssl: bool = True,
        follow_redirects: bool = True,
        max_connections: int = 100,
        max_keepalive_connections: int = 20,
    )):

def __aenter__((self)):

def __aexit__((self, exc_type, exc_val, exc_tb)):

def close((self)):

def add_request_middleware((self, middleware: callable)):

def add_response_middleware((self, middleware: callable)):

def _apply_request_middleware((self, request_data: Dict[str, Any])) -> Dict[str, Any]:

def _apply_response_middleware((self, response: HttpResponse)) -> HttpResponse:

def _call_middleware((self, middleware: callable, data: Any)) -> Any:

def _should_retry((self, exception: Exception, response: Optional[HttpResponse] = None)) -> bool:

def _make_request((
        self,
        method: HttpMethod,
        url: str,
        headers: Optional[Dict[str, str]] = None,
        params: Optional[Dict[str, Any]] = None,
        json_data: Optional[Dict[str, Any]] = None,
        data: Optional[Any] = None,
        files: Optional[Dict[str, Any]] = None,
        **kwargs,
    )) -> HttpResponse:

def get((
        self,
        url: str,
        params: Optional[Dict[str, Any]] = None,
        headers: Optional[Dict[str, str]] = None,
        **kwargs,
    )) -> HttpResponse:

def post((
        self,
        url: str,
        json_data: Optional[Dict[str, Any]] = None,
        data: Optional[Any] = None,
        headers: Optional[Dict[str, str]] = None,
        **kwargs,
    )) -> HttpResponse:

def put((
        self,
        url: str,
        json_data: Optional[Dict[str, Any]] = None,
        data: Optional[Any] = None,
        headers: Optional[Dict[str, str]] = None,
        **kwargs,
    )) -> HttpResponse:

def patch((
        self,
        url: str,
        json_data: Optional[Dict[str, Any]] = None,
        data: Optional[Any] = None,
        headers: Optional[Dict[str, str]] = None,
        **kwargs,
    )) -> HttpResponse:

def delete((
        self,
        url: str,
        headers: Optional[Dict[str, str]] = None,
        **kwargs,
    )) -> HttpResponse:

def head((
        self,
        url: str,
        headers: Optional[Dict[str, str]] = None,
        **kwargs,
    )) -> HttpResponse:

def session((self)) -> AsyncGenerator[UnifiedHttpClient, None]:

def create_http_client((
    base_url: Optional[str] = None,
    timeout: float = 30.0,
    max_retries: int = 3,
    verify_ssl: bool = True,
    retry_config: Optional[RetryConfig] = None,
    **kwargs,
)) -> UnifiedHttpClient:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/http/compatibility.py
# Language: python

import asyncio
import warnings
from contextlib import asynccontextmanager
from typing import Any, AsyncGenerator, Dict, List, Optional, Union
from urllib.parse import urljoin
from loguru import logger
from .client import HttpResponse, UnifiedHttpClient, create_http_client
import json
from .client import HttpClientError
from .client import HttpServerError
from .client import HttpMethod

class AiohttpResponse:
    def __init__((self, http_response: HttpResponse)):
    def ok((self)) -> bool:
    def text((self, encoding: Optional[str] = None)) -> str:
    def json((self, **kwargs)) -> Any:
    def read((self)) -> bytes:
    def raise_for_status((self)) -> None:
    def __aenter__((self)):
    def __aexit__((self, exc_type, exc_val, exc_tb)):
    def close((self)):

class AiohttpSession:
    def __init__((
        self,
        base_url: Optional[str] = None,
        timeout: Optional[Union[float, Dict[str, float]]] = None,
        headers: Optional[Dict[str, str]] = None,
        trust_env: bool = True,
        connector: Optional[Any] = None,
        **kwargs,
    )):
    def __aenter__((self)):
    def __aexit__((self, exc_type, exc_val, exc_tb)):
    def close((self)):
    def _ensure_not_closed((self)):
    def _make_request((
        self,
        method: str,
        url: str,
        **kwargs,
    )) -> AiohttpResponse:
    def get((self, url: str, **kwargs)) -> AiohttpResponse:
    def post((self, url: str, **kwargs)) -> AiohttpResponse:
    def put((self, url: str, **kwargs)) -> AiohttpResponse:
    def patch((self, url: str, **kwargs)) -> AiohttpResponse:
    def delete((self, url: str, **kwargs)) -> AiohttpResponse:
    def head((self, url: str, **kwargs)) -> AiohttpResponse:
    def options((self, url: str, **kwargs)) -> AiohttpResponse:
    def request((self, method: str, url: str, **kwargs)) -> AiohttpResponse:

class MigrationHelper:

def __init__((self, http_response: HttpResponse)):

def status((self)) -> int:

def headers((self)) -> Dict[str, str]:

def url((self)) -> str:

def content_type((self)) -> str:

def charset((self)) -> Optional[str]:

def content_length((self)) -> Optional[int]:

def closed((self)) -> bool:

def ok((self)) -> bool:

def text((self, encoding: Optional[str] = None)) -> str:

def json((self, **kwargs)) -> Any:

def read((self)) -> bytes:

def raise_for_status((self)) -> None:

def __aenter__((self)):

def __aexit__((self, exc_type, exc_val, exc_tb)):

def close((self)):

def __init__((
        self,
        base_url: Optional[str] = None,
        timeout: Optional[Union[float, Dict[str, float]]] = None,
        headers: Optional[Dict[str, str]] = None,
        trust_env: bool = True,
        connector: Optional[Any] = None,
        **kwargs,
    )):

def closed((self)) -> bool:

def __aenter__((self)):

def __aexit__((self, exc_type, exc_val, exc_tb)):

def close((self)):

def _ensure_not_closed((self)):

def _make_request((
        self,
        method: str,
        url: str,
        **kwargs,
    )) -> AiohttpResponse:

def get((self, url: str, **kwargs)) -> AiohttpResponse:

def post((self, url: str, **kwargs)) -> AiohttpResponse:

def put((self, url: str, **kwargs)) -> AiohttpResponse:

def patch((self, url: str, **kwargs)) -> AiohttpResponse:

def delete((self, url: str, **kwargs)) -> AiohttpResponse:

def head((self, url: str, **kwargs)) -> AiohttpResponse:

def options((self, url: str, **kwargs)) -> AiohttpResponse:

def request((self, method: str, url: str, **kwargs)) -> AiohttpResponse:

def ClientSession((*args, **kwargs)) -> AiohttpSession:

def session((*args, **kwargs)) -> AsyncGenerator[AiohttpSession, None]:

def convert_aiohttp_timeout((aiohttp_timeout: Any)) -> float:

def get_migration_guide(()) -> str:

def log_migration_suggestion((context: str)):


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/http/middleware.py
# Language: python

import time
import uuid
from typing import Any, Dict, Optional
from urllib.parse import urlparse
from loguru import logger
from .client import HttpResponse, RequestMetrics
import base64
import json
import asyncio

class AuthenticationMiddleware:
    def __init__((
        self,
        auth_type: str = "bearer",
        token: Optional[str] = None,
        api_key: Optional[str] = None,
        api_key_header: str = "X-API-Key",
        username: Optional[str] = None,
        password: Optional[str] = None,
    )):
    def __call__((self, request_data: Dict[str, Any])) -> Dict[str, Any]:

class RequestIdMiddleware:
    def __init__((self, header_name: str = "X-Request-ID")):
    def __call__((self, request_data: Dict[str, Any])) -> Dict[str, Any]:

class UserAgentMiddleware:
    def __init__((self, user_agent: str = "d361-http-client/1.0")):
    def __call__((self, request_data: Dict[str, Any])) -> Dict[str, Any]:

class SecurityHeadersMiddleware:
    def __init__((self, enable_all: bool = True)):
    def __call__((self, request_data: Dict[str, Any])) -> Dict[str, Any]:

class LoggingMiddleware:
    def __init__((
        self, 
        log_requests: bool = True,
        log_responses: bool = True,
        log_body: bool = False,
        max_body_size: int = 1000,
    )):
    def log_request((self, request_data: Dict[str, Any])) -> Dict[str, Any]:
    def log_response((self, response: HttpResponse)) -> HttpResponse:
    def __call__((self, data: Any)) -> Any:

class MetricsMiddleware:
    def __init__((self)):
    def __call__((self, response: HttpResponse)) -> HttpResponse:
    def get_metrics((self)) -> Dict[str, Any]:

class RateLimitMiddleware:
    def __init__((self, max_requests: int = 60, time_window: int = 60)):
    def __call__((self, request_data: Dict[str, Any])) -> Dict[str, Any]:

class RetryMetricsMiddleware:
    def __init__((self)):
    def __call__((self, response: HttpResponse)) -> HttpResponse:
    def _get_url_pattern((self, url: str)) -> str:
    def get_retry_stats((self)) -> Dict[str, Any]:

def __init__((
        self,
        auth_type: str = "bearer",
        token: Optional[str] = None,
        api_key: Optional[str] = None,
        api_key_header: str = "X-API-Key",
        username: Optional[str] = None,
        password: Optional[str] = None,
    )):

def __call__((self, request_data: Dict[str, Any])) -> Dict[str, Any]:

def __init__((self, header_name: str = "X-Request-ID")):

def __call__((self, request_data: Dict[str, Any])) -> Dict[str, Any]:

def __init__((self, user_agent: str = "d361-http-client/1.0")):

def __call__((self, request_data: Dict[str, Any])) -> Dict[str, Any]:

def __init__((self, enable_all: bool = True)):

def __call__((self, request_data: Dict[str, Any])) -> Dict[str, Any]:

def __init__((
        self, 
        log_requests: bool = True,
        log_responses: bool = True,
        log_body: bool = False,
        max_body_size: int = 1000,
    )):

def log_request((self, request_data: Dict[str, Any])) -> Dict[str, Any]:

def log_response((self, response: HttpResponse)) -> HttpResponse:

def __call__((self, data: Any)) -> Any:

def __init__((self)):

def __call__((self, response: HttpResponse)) -> HttpResponse:

def get_metrics((self)) -> Dict[str, Any]:

def __init__((self, max_requests: int = 60, time_window: int = 60)):

def __call__((self, request_data: Dict[str, Any])) -> Dict[str, Any]:

def __init__((self)):

def __call__((self, response: HttpResponse)) -> HttpResponse:

def _get_url_pattern((self, url: str)) -> str:

def get_retry_stats((self)) -> Dict[str, Any]:

def create_auth_middleware((
    auth_type: str = "bearer",
    token: Optional[str] = None,
    **kwargs,
)) -> AuthenticationMiddleware:

def create_logging_middleware((
    log_requests: bool = True,
    log_responses: bool = True,
    log_body: bool = False,
)) -> LoggingMiddleware:

def create_metrics_middleware(()) -> MetricsMiddleware:

def create_security_middleware(()) -> SecurityHeadersMiddleware:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/mkdocs/__init__.py
# Language: python

from d361.mkdocs.exporters.mkdocs_exporter import MkDocsExporter
from d361.mkdocs.exporters.config_generator import ConfigGenerator
from d361.mkdocs.exporters.navigation_builder import NavigationBuilder
from d361.mkdocs.exporters.theme_optimizer import ThemeOptimizer
from d361.mkdocs.processors.markdown_processor import MarkdownProcessor
from d361.mkdocs.processors.content_enhancer import ContentEnhancer
from d361.mkdocs.processors.cross_reference_resolver import CrossReferenceResolver, LinkReference, AnchorReference
from d361.mkdocs.processors.asset_manager import AssetManager, AssetReference, OptimizationResult
from d361.mkdocs.processors.plugin_manager import (
    PluginManager,
    PluginConfig,
    PluginSet,
    MarkdownExtensionManager,
)
from d361.mkdocs.processors.seo_optimizer import (
    SEOOptimizer,
    SEOMetadata,
    StructuredData,
)
from d361.mkdocs.processors.accessibility_optimizer import (
    AccessibilityOptimizer,
    AccessibilityReport,
    AccessibilityIssue,
    WCAGLevel,
    ContrastRatio,
)


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/mkdocs/exporters/__init__.py
# Language: python

from d361.mkdocs.exporters.mkdocs_exporter import MkDocsExporter
from d361.mkdocs.exporters.config_generator import ConfigGenerator
from d361.mkdocs.exporters.navigation_builder import NavigationBuilder
from d361.mkdocs.exporters.theme_optimizer import ThemeOptimizer


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/mkdocs/exporters/config_generator.py
# Language: python

import yaml
from pathlib import Path
from typing import Dict, Any, List, Optional, Union
from jinja2 import Environment, PackageLoader, select_autoescape, Template, TemplateError, TemplateSyntaxError
from loguru import logger
from d361.api.errors import Document360Error, ErrorCategory, ErrorSeverity

class ConfigGenerator:
    def __init__((
        self,
        theme: str = "material",
        enable_plugins: bool = True,
        template_dir: Optional[Path] = None,
    )) -> None:
    def _yaml_filter((self, obj: Any)) -> str:
    def generate_config((
        self,
        site_name: str,
        navigation: List[Dict[str, Any]],
        output_path: Path,
        site_url: Optional[str] = None,
        site_description: Optional[str] = None,
        repo_url: Optional[str] = None,
        edit_uri: Optional[str] = None,
        custom_config: Optional[Dict[str, Any]] = None,
    )) -> str:
    def _build_base_config((
        self,
        site_name: str,
        site_url: Optional[str] = None,
        site_description: Optional[str] = None,
        repo_url: Optional[str] = None,
        edit_uri: Optional[str] = None,
    )) -> Dict[str, Any]:
    def _build_theme_config((self)) -> Dict[str, Any]:
    def _build_material_theme_config((self)) -> Dict[str, Any]:
    def _build_readthedocs_theme_config((self)) -> Dict[str, Any]:
    def _build_plugins_config((self)) -> List[Dict[str, Any]]:
    def _build_markdown_extensions((self)) -> List[Dict[str, Any] | str]:
    def _build_extra_config((self)) -> Dict[str, Any]:
    def _merge_configs((
        self, 
        base_config: Dict[str, Any], 
        custom_config: Dict[str, Any]
    )) -> Dict[str, Any]:
    def generate_config_from_template((
        self,
        template_name: str,
        context: Dict[str, Any],
        validate_output: bool = True,
    )) -> str:
    def _validate_template_exists((self, template_name: str)) -> None:
    def _validate_template_context((self, template_name: str, context: Dict[str, Any])) -> None:
    def _validate_generated_config((self, config_content: str, template_name: str)) -> None:
    def _validate_mkdocs_structure((self, config: Dict[str, Any], template_name: str)) -> None:
    def _validate_theme_config((self, theme_config: Union[str, Dict[str, Any]], template_name: str)) -> None:
    def _validate_plugin_configs((self, plugins: List[Any], template_name: str)) -> None:
    def _get_available_templates((self)) -> List[str]:
    def validate_final_config((self, config_yaml: str)) -> Dict[str, Any]:

def __init__((
        self,
        theme: str = "material",
        enable_plugins: bool = True,
        template_dir: Optional[Path] = None,
    )) -> None:

def _yaml_filter((self, obj: Any)) -> str:

def generate_config((
        self,
        site_name: str,
        navigation: List[Dict[str, Any]],
        output_path: Path,
        site_url: Optional[str] = None,
        site_description: Optional[str] = None,
        repo_url: Optional[str] = None,
        edit_uri: Optional[str] = None,
        custom_config: Optional[Dict[str, Any]] = None,
    )) -> str:

def _build_base_config((
        self,
        site_name: str,
        site_url: Optional[str] = None,
        site_description: Optional[str] = None,
        repo_url: Optional[str] = None,
        edit_uri: Optional[str] = None,
    )) -> Dict[str, Any]:

def _build_theme_config((self)) -> Dict[str, Any]:

def _build_material_theme_config((self)) -> Dict[str, Any]:

def _build_readthedocs_theme_config((self)) -> Dict[str, Any]:

def _build_plugins_config((self)) -> List[Dict[str, Any]]:

def _build_markdown_extensions((self)) -> List[Dict[str, Any] | str]:

def _build_extra_config((self)) -> Dict[str, Any]:

def _merge_configs((
        self, 
        base_config: Dict[str, Any], 
        custom_config: Dict[str, Any]
    )) -> Dict[str, Any]:

def deep_merge((base: Dict[str, Any], custom: Dict[str, Any])) -> Dict[str, Any]:

def generate_config_from_template((
        self,
        template_name: str,
        context: Dict[str, Any],
        validate_output: bool = True,
    )) -> str:

def _validate_template_exists((self, template_name: str)) -> None:

def _validate_template_context((self, template_name: str, context: Dict[str, Any])) -> None:

def _validate_generated_config((self, config_content: str, template_name: str)) -> None:

def _validate_mkdocs_structure((self, config: Dict[str, Any], template_name: str)) -> None:

def _validate_theme_config((self, theme_config: Union[str, Dict[str, Any]], template_name: str)) -> None:

def _validate_plugin_configs((self, plugins: List[Any], template_name: str)) -> None:

def _get_available_templates((self)) -> List[str]:

def validate_final_config((self, config_yaml: str)) -> Dict[str, Any]:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/mkdocs/exporters/mkdocs_exporter.py
# Language: python

import asyncio
from pathlib import Path
from typing import Any, Optional, Dict, List
from loguru import logger
from d361.core.interfaces import DataProvider
from d361.core.models import Article, Category
from d361.providers.archive_provider import ArchiveProvider
from d361.providers.api_provider import ApiProvider
from d361.providers.hybrid_provider import HybridProvider
from d361.scraping.content_processor import ContentProcessor
from d361.config.schema import AppConfig
from d361.utils.logging import setup_logging
from d361.utils.performance import PerformanceOptimizer
from contextlib import contextmanager
import time
from d361.mkdocs.exporters.config_generator import ConfigGenerator
from d361.mkdocs.exporters.navigation_builder import NavigationBuilder
from d361.mkdocs.exporters.theme_optimizer import ThemeOptimizer
from d361.mkdocs.processors.markdown_processor import MarkdownProcessor
from d361.mkdocs.processors.content_enhancer import ContentEnhancer
from d361.mkdocs.processors.asset_manager import AssetManager
from d361.mkdocs.processors.cross_reference_resolver import CrossReferenceResolver
from ...providers.mock_provider import MockProvider

class SimplePerformanceMonitor:
    def __init__((self)):
    def get_metrics((self)) -> dict:

class MkDocsExporter:
    def __init__((
        self,
        source: str = "archive",
        archive_path: Optional[Path] = None,
        api_token: Optional[str] = None,
        api_base_url: Optional[str] = None,
        output_path: Path = Path("mkdocs_output"),
        theme: str = "material",
        enable_plugins: bool = True,
        parallel_processing: bool = True,
        max_workers: int = 4,
        config_path: Optional[Path] = None,
    )) -> None:
    def _initialize_provider((self)) -> None:
    def export((self)) -> Dict[str, Any]:
    def _load_content((self)) -> tuple[List[Article], List[Category]]:
    def _process_content((self, articles: List[Article])) -> List[Article]:
    def _process_single_article((self, article: Article)) -> Article:
    def _process_categories((self, categories: List[Category])) -> List[Category]:
    def _generate_mkdocs_structure((
        self, 
        articles: List[Article], 
        categories: List[Category]
    )) -> None:
    def _write_article_file((self, article: Article, docs_dir: Path)) -> None:
    def _generate_category_indexes((
        self, 
        categories: List[Category], 
        docs_dir: Path
    )) -> None:
    def _copy_assets((self, docs_dir: Path)) -> None:
    def _generate_config((
        self, 
        articles: List[Article], 
        categories: List[Category]
    )) -> Path:
    def _optimize_theme((
        self, 
        articles: List[Article], 
        categories: List[Category]
    )) -> None:
    def _validate_export((self)) -> Dict[str, Any]:
    def _generate_export_results((
        self, 
        config_path: Path, 
        validation_results: Dict[str, Any]
    )) -> Dict[str, Any]:

def __init__((self)):

def measure((self, operation_name: str)):

def get_metrics((self)) -> dict:

def __init__((
        self,
        source: str = "archive",
        archive_path: Optional[Path] = None,
        api_token: Optional[str] = None,
        api_base_url: Optional[str] = None,
        output_path: Path = Path("mkdocs_output"),
        theme: str = "material",
        enable_plugins: bool = True,
        parallel_processing: bool = True,
        max_workers: int = 4,
        config_path: Optional[Path] = None,
    )) -> None:

def _initialize_provider((self)) -> None:

def export((self)) -> Dict[str, Any]:

def _load_content((self)) -> tuple[List[Article], List[Category]]:

def _process_content((self, articles: List[Article])) -> List[Article]:

def _process_single_article((self, article: Article)) -> Article:

def _process_categories((self, categories: List[Category])) -> List[Category]:

def _generate_mkdocs_structure((
        self, 
        articles: List[Article], 
        categories: List[Category]
    )) -> None:

def _write_article_file((self, article: Article, docs_dir: Path)) -> None:

def _generate_category_indexes((
        self, 
        categories: List[Category], 
        docs_dir: Path
    )) -> None:

def _copy_assets((self, docs_dir: Path)) -> None:

def _generate_config((
        self, 
        articles: List[Article], 
        categories: List[Category]
    )) -> Path:

def _optimize_theme((
        self, 
        articles: List[Article], 
        categories: List[Category]
    )) -> None:

def _validate_export((self)) -> Dict[str, Any]:

def _generate_export_results((
        self, 
        config_path: Path, 
        validation_results: Dict[str, Any]
    )) -> Dict[str, Any]:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/mkdocs/exporters/navigation_builder.py
# Language: python

from typing import List, Dict, Any, Optional, Set
from pathlib import Path
import re
import asyncio
from dataclasses import dataclass
from loguru import logger
from d361.core.models import Article, Category

class NavigationItem:
    def __post_init__((self)):

class NavigationAnalytics:
    def __post_init__((self)):

class NavigationBuilder:
    def __init__((
        self,
        use_category_indexes: bool = True,
        sort_by_order: bool = True,
        include_hidden: bool = False,
        max_depth: int = 5,
        # Phase 2 enhancements
        enable_literate_nav: bool = True,
        generate_section_indexes: bool = True,
        smart_ordering: bool = True,
        enable_navigation_analytics: bool = True,
        auto_generate_titles: bool = True,
        enable_breadcrumbs: bool = True,
        navigation_validation: bool = True,
        optimize_for_mobile: bool = True,
    )) -> None:
    def build_navigation((
        self,
        articles: List[Article],
        categories: List[Category],
    )) -> Dict[str, Any]:
    def _build_category_tree((self, categories: List[Category])) -> List[Category]:
    def _map_articles_to_categories((
        self, 
        articles: List[Article], 
        categories: List[Category]
    )) -> Dict[str, List[Article]]:
    def _build_category_navigation((
        self,
        category: Category,
        article_map: Dict[str, List[Article]],
        depth: int = 0,
    )) -> Optional[Dict[str, Any]]:
    def _find_home_article((self, articles: List[Article])) -> Optional[Article]:
    def _find_orphaned_articles((
        self, 
        articles: List[Article], 
        categories: List[Category]
    )) -> List[Article]:
    def generate_literate_nav((
        self,
        articles: List[Article],
        categories: List[Category],
        output_path: Path,
    )) -> Path:
    def _nav_item_to_literate((
        self, 
        nav_item: Dict[str, Any] | str, 
        level: int = 0
    )) -> List[str]:
    def validate_navigation((
        self,
        navigation: List[Dict[str, Any]],
        docs_path: Path,
    )) -> Dict[str, Any]:
    def _apply_smart_ordering((self, articles: List[Article])) -> List[Article]:
    def _apply_smart_category_ordering((self, categories: List[Category])) -> List[Category]:
    def _generate_section_indexes((self, categories: List[Category], articles: List[Article])) -> Dict[str, str]:
    def _create_section_index_content((self, category: Category, articles: List[Article])) -> str:
    def _build_enhanced_category_navigation((
        self,
        category: Category,
        article_map: Dict[str, List[Article]],
        section_indexes: Dict[str, str],
        depth: int = 0,
    )) -> Optional[NavigationItem]:
    def _classify_article_type((self, article: Article)) -> str:
    def _generate_breadcrumbs((self, navigation_items: List[NavigationItem])) -> Dict[str, List[Dict[str, str]]]:
    def _validate_navigation((self, navigation_items: List[NavigationItem], articles: List[Article])) -> Dict[str, Any]:
    def _convert_to_mkdocs_format((self, navigation_items: List[NavigationItem])) -> List[Dict[str, Any]]:
    def _generate_literate_nav((self, navigation_items: List[NavigationItem])) -> str:
    def _calculate_max_depth((self, navigation_items: List[NavigationItem])) -> int:
    def get_navigation_analytics((self)) -> Dict[str, Any]:

def __post_init__((self)):

def __post_init__((self)):

def __init__((
        self,
        use_category_indexes: bool = True,
        sort_by_order: bool = True,
        include_hidden: bool = False,
        max_depth: int = 5,
        # Phase 2 enhancements
        enable_literate_nav: bool = True,
        generate_section_indexes: bool = True,
        smart_ordering: bool = True,
        enable_navigation_analytics: bool = True,
        auto_generate_titles: bool = True,
        enable_breadcrumbs: bool = True,
        navigation_validation: bool = True,
        optimize_for_mobile: bool = True,
    )) -> None:

def build_navigation((
        self,
        articles: List[Article],
        categories: List[Category],
    )) -> Dict[str, Any]:

def _build_category_tree((self, categories: List[Category])) -> List[Category]:

def _map_articles_to_categories((
        self, 
        articles: List[Article], 
        categories: List[Category]
    )) -> Dict[str, List[Article]]:

def _build_category_navigation((
        self,
        category: Category,
        article_map: Dict[str, List[Article]],
        depth: int = 0,
    )) -> Optional[Dict[str, Any]]:

def _find_home_article((self, articles: List[Article])) -> Optional[Article]:

def _find_orphaned_articles((
        self, 
        articles: List[Article], 
        categories: List[Category]
    )) -> List[Article]:

def generate_literate_nav((
        self,
        articles: List[Article],
        categories: List[Category],
        output_path: Path,
    )) -> Path:

def _nav_item_to_literate((
        self, 
        nav_item: Dict[str, Any] | str, 
        level: int = 0
    )) -> List[str]:

def validate_navigation((
        self,
        navigation: List[Dict[str, Any]],
        docs_path: Path,
    )) -> Dict[str, Any]:

def validate_nav_item((item: Dict[str, Any] | str, path_prefix: str = "")):

def _apply_smart_ordering((self, articles: List[Article])) -> List[Article]:

def calculate_article_weight((article: Article)) -> int:

def _apply_smart_category_ordering((self, categories: List[Category])) -> List[Category]:

def calculate_category_weight((category: Category)) -> int:

def _generate_section_indexes((self, categories: List[Category], articles: List[Article])) -> Dict[str, str]:

def _create_section_index_content((self, category: Category, articles: List[Article])) -> str:

def _build_enhanced_category_navigation((
        self,
        category: Category,
        article_map: Dict[str, List[Article]],
        section_indexes: Dict[str, str],
        depth: int = 0,
    )) -> Optional[NavigationItem]:

def _classify_article_type((self, article: Article)) -> str:

def _generate_breadcrumbs((self, navigation_items: List[NavigationItem])) -> Dict[str, List[Dict[str, str]]]:

def build_breadcrumbs((item: NavigationItem, path: List[Dict[str, str]] = None)):

def _validate_navigation((self, navigation_items: List[NavigationItem], articles: List[Article])) -> Dict[str, Any]:

def validate_item((item: NavigationItem, depth: int = 0)):

def _convert_to_mkdocs_format((self, navigation_items: List[NavigationItem])) -> List[Dict[str, Any]]:

def convert_item((item: NavigationItem)) -> Dict[str, Any] | str:

def _generate_literate_nav((self, navigation_items: List[NavigationItem])) -> str:

def add_nav_item((item: NavigationItem, level: int = 0)):

def _calculate_max_depth((self, navigation_items: List[NavigationItem])) -> int:

def get_depth((item: NavigationItem)) -> int:

def get_navigation_analytics((self)) -> Dict[str, Any]:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/mkdocs/exporters/theme_optimizer.py
# Language: python

from pathlib import Path
from typing import List, Dict, Any, Optional
import shutil
from loguru import logger
from d361.core.models import Article, Category

class ThemeOptimizer:
    def __init__((
        self,
        theme: str = "material",
        custom_css: Optional[List[str]] = None,
        custom_js: Optional[List[str]] = None,
        enable_customizations: bool = True,
    )) -> None:
    def _get_theme_settings((self)) -> Dict[str, Any]:
    def optimize((
        self,
        articles: List[Article],
        categories: List[Category],
        output_path: Path,
    )) -> Dict[str, Any]:
    def _optimize_material_theme((
        self,
        articles: List[Article],
        categories: List[Category],
        output_path: Path,
        results: Dict[str, Any],
    )) -> None:
    def _create_material_css((self, output_path: Path, results: Dict[str, Any])) -> None:
    def _create_material_js((self, output_path: Path, results: Dict[str, Any])) -> None:
    def _setup_material_social_cards((self, output_path: Path, results: Dict[str, Any])) -> None:
    def _create_material_templates((self, output_path: Path, results: Dict[str, Any])) -> None:
    def _optimize_material_content((
        self, 
        articles: List[Article], 
        output_path: Path, 
        results: Dict[str, Any]
    )) -> None:
    def _optimize_readthedocs_theme((
        self,
        articles: List[Article],
        categories: List[Category],
        output_path: Path,
        results: Dict[str, Any],
    )) -> None:
    def _optimize_generic_theme((
        self,
        articles: List[Article],
        categories: List[Category],
        output_path: Path,
        results: Dict[str, Any],
    )) -> None:
    def _apply_common_optimizations((
        self,
        articles: List[Article],
        categories: List[Category],
        output_path: Path,
        results: Dict[str, Any],
    )) -> None:
    def get_theme_config_updates((self)) -> Dict[str, Any]:

def __init__((
        self,
        theme: str = "material",
        custom_css: Optional[List[str]] = None,
        custom_js: Optional[List[str]] = None,
        enable_customizations: bool = True,
    )) -> None:

def _get_theme_settings((self)) -> Dict[str, Any]:

def optimize((
        self,
        articles: List[Article],
        categories: List[Category],
        output_path: Path,
    )) -> Dict[str, Any]:

def _optimize_material_theme((
        self,
        articles: List[Article],
        categories: List[Category],
        output_path: Path,
        results: Dict[str, Any],
    )) -> None:

def _create_material_css((self, output_path: Path, results: Dict[str, Any])) -> None:

def _create_material_js((self, output_path: Path, results: Dict[str, Any])) -> None:

def _setup_material_social_cards((self, output_path: Path, results: Dict[str, Any])) -> None:

def _create_material_templates((self, output_path: Path, results: Dict[str, Any])) -> None:

def _optimize_material_content((
        self, 
        articles: List[Article], 
        output_path: Path, 
        results: Dict[str, Any]
    )) -> None:

def _optimize_readthedocs_theme((
        self,
        articles: List[Article],
        categories: List[Category],
        output_path: Path,
        results: Dict[str, Any],
    )) -> None:

def _optimize_generic_theme((
        self,
        articles: List[Article],
        categories: List[Category],
        output_path: Path,
        results: Dict[str, Any],
    )) -> None:

def _apply_common_optimizations((
        self,
        articles: List[Article],
        categories: List[Category],
        output_path: Path,
        results: Dict[str, Any],
    )) -> None:

def get_theme_config_updates((self)) -> Dict[str, Any]:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/mkdocs/processors/__init__.py
# Language: python

from d361.mkdocs.processors.markdown_processor import MarkdownProcessor
from d361.mkdocs.processors.content_enhancer import ContentEnhancer
from d361.mkdocs.processors.asset_manager import AssetManager
from d361.mkdocs.processors.cross_reference_resolver import CrossReferenceResolver
from d361.mkdocs.processors.plugin_manager import (
    PluginManager,
    PluginConfig,
    PluginSet,
    MarkdownExtensionManager,
)
from d361.mkdocs.processors.seo_optimizer import (
    SEOOptimizer,
    SEOMetadata,
    StructuredData,
)
from d361.mkdocs.processors.accessibility_optimizer import (
    AccessibilityOptimizer,
    AccessibilityReport,
    AccessibilityIssue,
    WCAGLevel,
    ContrastRatio,
)


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/mkdocs/processors/accessibility_optimizer.py
# Language: python

import re
from typing import Dict, Any, List, Optional, Tuple
from dataclasses import dataclass, field
from enum import Enum
from loguru import logger
from d361.api.errors import Document360Error, ErrorCategory, ErrorSeverity

class WCAGLevel(E, n, u, m):

class ContrastRatio(E, n, u, m):

class AccessibilityIssue:

class AccessibilityReport:
    def add_issue((self, issue: AccessibilityIssue)) -> None:
    def is_compliant((self)) -> bool:

class AccessibilityOptimizer:
    def __init__((
        self,
        wcag_level: WCAGLevel = WCAGLevel.AA,
        auto_fix: bool = True,
        generate_alt_text: bool = True,
        enhance_links: bool = True,
    )) -> None:
    def enhance_content((
        self,
        content: str,
        page_title: str,
        base_url: Optional[str] = None,
    )) -> Tuple[str, AccessibilityReport]:
    def _enhance_headings((self, content: str, report: AccessibilityReport)) -> str:
    def _enhance_images((self, content: str, report: AccessibilityReport)) -> str:
    def _enhance_links((self, content: str, report: AccessibilityReport, base_url: Optional[str])) -> str:
    def _enhance_tables((self, content: str, report: AccessibilityReport)) -> str:
    def _enhance_lists((self, content: str, report: AccessibilityReport)) -> str:
    def _validate_content_structure((self, content: str, report: AccessibilityReport)) -> None:
    def generate_accessibility_config((self)) -> Dict[str, Any]:
    def generate_content_guidelines((self)) -> Dict[str, List[str]]:
    def audit_full_site((
        self,
        pages: List[Dict[str, Any]],
        site_config: Dict[str, Any],
    )) -> Dict[str, Any]:
    def _audit_site_config((self, config: Dict[str, Any])) -> List[AccessibilityIssue]:

def add_issue((self, issue: AccessibilityIssue)) -> None:

def is_compliant((self)) -> bool:

def __init__((
        self,
        wcag_level: WCAGLevel = WCAGLevel.AA,
        auto_fix: bool = True,
        generate_alt_text: bool = True,
        enhance_links: bool = True,
    )) -> None:

def enhance_content((
        self,
        content: str,
        page_title: str,
        base_url: Optional[str] = None,
    )) -> Tuple[str, AccessibilityReport]:

def _enhance_headings((self, content: str, report: AccessibilityReport)) -> str:

def _enhance_images((self, content: str, report: AccessibilityReport)) -> str:

def enhance_image((match)):

def _enhance_links((self, content: str, report: AccessibilityReport, base_url: Optional[str])) -> str:

def enhance_link((match)):

def _enhance_tables((self, content: str, report: AccessibilityReport)) -> str:

def _enhance_lists((self, content: str, report: AccessibilityReport)) -> str:

def _validate_content_structure((self, content: str, report: AccessibilityReport)) -> None:

def generate_accessibility_config((self)) -> Dict[str, Any]:

def generate_content_guidelines((self)) -> Dict[str, List[str]]:

def audit_full_site((
        self,
        pages: List[Dict[str, Any]],
        site_config: Dict[str, Any],
    )) -> Dict[str, Any]:

def _audit_site_config((self, config: Dict[str, Any])) -> List[AccessibilityIssue]:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/mkdocs/processors/asset_manager.py
# Language: python

import asyncio
import hashlib
import mimetypes
from pathlib import Path
from typing import Dict, List, Optional, Tuple, Any, Set
from urllib.parse import urlparse, urljoin
from dataclasses import dataclass
import re
from loguru import logger
import httpx
from PIL import Image, ImageOps, ImageDraw, ImageFont
from PIL import ImageFilter
import textwrap
import io
import base64

class AssetReference:

class OptimizationResult:

class AssetManager:
    def __init__((
        self,
        output_dir: Path,
        enable_optimization: bool = True,
        generate_responsive: bool = False,
        cdn_prefix: Optional[str] = None,
        max_image_width: int = 1200,
        image_quality: int = 85,
        convert_to_webp: bool = False,
        enable_lazy_loading: bool = True,
        download_external_assets: bool = False,
        # Phase 2 enhancements
        generate_social_cards: bool = False,
        social_card_template: str = "material",
        social_card_size: Tuple[int, int] = (1200, 630),
        social_card_background_color: str = "#ffffff",
        social_card_text_color: str = "#333333",
        social_card_accent_color: str = "#1976d2",
        social_card_font_family: Optional[str] = None,
        social_card_logo_path: Optional[str] = None,
        enable_social_card_caching: bool = True,
    )) -> None:
    def process_assets((self, content: str, article_context: Optional[Dict] = None)) -> List[AssetReference]:
    def update_asset_references((self, content: str, assets: List[AssetReference])) -> str:
    def _extract_and_process_images((self, content: str, article_context: Optional[Dict] = None)) -> List[AssetReference]:
    def _extract_and_process_documents((self, content: str, article_context: Optional[Dict] = None)) -> List[AssetReference]:
    def _process_single_image((self, asset: AssetReference, article_context: Optional[Dict] = None)) -> AssetReference:
    def _process_single_document((self, asset: AssetReference, article_context: Optional[Dict] = None)) -> AssetReference:
    def _download_asset((self, asset: AssetReference, target_dir: Path)) -> Optional[Path]:
    def _optimize_image((self, image_path: Path, asset: AssetReference)) -> Optional[Path]:
    def _generate_responsive_variants((self, image_path: Path, asset: AssetReference)) -> List[str]:
    def _optimize_d360_image_url((self, url: str)) -> str:
    def _optimize_d360_document_url((self, url: str)) -> str:
    def _generate_filename((self, url: str, content_type: Optional[str] = None)) -> str:
    def _generate_asset_url((self, file_path: Path)) -> str:
    def _is_external_url((self, url: str)) -> bool:
    def _is_document360_url((self, url: str)) -> bool:
    def get_asset_report((self)) -> Dict[str, Any]:
    def _generate_social_card((self, article_context: Dict[str, Any], content: str)) -> Optional[AssetReference]:
    def _extract_social_description((self, content: str, article_context: Dict[str, Any])) -> str:
    def _create_social_card_image((
        self,
        title: str,
        description: str,
        article_context: Dict[str, Any],
        cache_key: str
    )) -> Optional[Path]:
    def _load_font((self, size: int)) -> ImageFont.FreeTypeFont:
    def _wrap_text((self, text: str, max_width: int, font: ImageFont.FreeTypeFont, draw: ImageDraw.Draw)) -> List[str]:
    def _draw_material_background((self, draw: ImageDraw.Draw, width: int, height: int)) -> None:
    def _draw_logo((self, draw: ImageDraw.Draw, logo_path: Path, x: int, y: int, max_height: int = 80)) -> int:
    def _lighten_color((self, hex_color: str, factor: float = 0.7)) -> str:
    def _hex_to_rgb((self, hex_color: str)) -> Tuple[int, int, int]:
    def get_social_cards_report((self)) -> Dict[str, Any]:
    def cleanup((self)):

def __init__((
        self,
        output_dir: Path,
        enable_optimization: bool = True,
        generate_responsive: bool = False,
        cdn_prefix: Optional[str] = None,
        max_image_width: int = 1200,
        image_quality: int = 85,
        convert_to_webp: bool = False,
        enable_lazy_loading: bool = True,
        download_external_assets: bool = False,
        # Phase 2 enhancements
        generate_social_cards: bool = False,
        social_card_template: str = "material",
        social_card_size: Tuple[int, int] = (1200, 630),
        social_card_background_color: str = "#ffffff",
        social_card_text_color: str = "#333333",
        social_card_accent_color: str = "#1976d2",
        social_card_font_family: Optional[str] = None,
        social_card_logo_path: Optional[str] = None,
        enable_social_card_caching: bool = True,
    )) -> None:

def process_assets((self, content: str, article_context: Optional[Dict] = None)) -> List[AssetReference]:

def update_asset_references((self, content: str, assets: List[AssetReference])) -> str:

def replace_image((match)):

def replace_document((match)):

def _extract_and_process_images((self, content: str, article_context: Optional[Dict] = None)) -> List[AssetReference]:

def _extract_and_process_documents((self, content: str, article_context: Optional[Dict] = None)) -> List[AssetReference]:

def _process_single_image((self, asset: AssetReference, article_context: Optional[Dict] = None)) -> AssetReference:

def _process_single_document((self, asset: AssetReference, article_context: Optional[Dict] = None)) -> AssetReference:

def _download_asset((self, asset: AssetReference, target_dir: Path)) -> Optional[Path]:

def _optimize_image((self, image_path: Path, asset: AssetReference)) -> Optional[Path]:

def _generate_responsive_variants((self, image_path: Path, asset: AssetReference)) -> List[str]:

def _optimize_d360_image_url((self, url: str)) -> str:

def _optimize_d360_document_url((self, url: str)) -> str:

def _generate_filename((self, url: str, content_type: Optional[str] = None)) -> str:

def _generate_asset_url((self, file_path: Path)) -> str:

def _is_external_url((self, url: str)) -> bool:

def _is_document360_url((self, url: str)) -> bool:

def get_asset_report((self)) -> Dict[str, Any]:

def _generate_social_card((self, article_context: Dict[str, Any], content: str)) -> Optional[AssetReference]:

def _extract_social_description((self, content: str, article_context: Dict[str, Any])) -> str:

def _create_social_card_image((
        self,
        title: str,
        description: str,
        article_context: Dict[str, Any],
        cache_key: str
    )) -> Optional[Path]:

def _load_font((self, size: int)) -> ImageFont.FreeTypeFont:

def _wrap_text((self, text: str, max_width: int, font: ImageFont.FreeTypeFont, draw: ImageDraw.Draw)) -> List[str]:

def _draw_material_background((self, draw: ImageDraw.Draw, width: int, height: int)) -> None:

def _draw_logo((self, draw: ImageDraw.Draw, logo_path: Path, x: int, y: int, max_height: int = 80)) -> int:

def _lighten_color((self, hex_color: str, factor: float = 0.7)) -> str:

def _hex_to_rgb((self, hex_color: str)) -> Tuple[int, int, int]:

def get_social_cards_report((self)) -> Dict[str, Any]:

def cleanup((self)):


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/mkdocs/processors/content_enhancer.py
# Language: python

import re
from typing import Dict, Any, Optional, List, Tuple, Union
from pathlib import Path
from datetime import datetime
import asyncio
from urllib.parse import urlparse, urljoin
from loguru import logger
from d361.core.models import Article, Category
import html2text
from bs4 import BeautifulSoup
import requests
import markdown
from markdown.extensions import admonition, codehilite, tables, toc

class ContentEnhancer:
    def __init__((
        self,
        site_url: Optional[str] = None,
        enable_seo: bool = True,
        validate_links: bool = True,
        add_edit_links: bool = True,
        enable_social_cards: bool = False,
        custom_css_classes: Optional[Dict[str, str]] = None,
        # Phase 2 enhancements
        enable_html_conversion: bool = True,
        mkdocs_extensions: Optional[List[str]] = None,
        enable_admonitions: bool = True,
        enable_superfences: bool = True,
        enable_tabbed_content: bool = True,
        enable_task_lists: bool = True,
        validate_content_quality: bool = True,
        check_broken_links: bool = False,
        reading_time_estimation: bool = True,
    )) -> None:
    def enhance_article((self, article: Article)) -> Dict[str, Any]:
    def _generate_frontmatter((self, article: Article)) -> Dict[str, Any]:
    def _process_content((self, content: str)) -> str:
    def _normalize_headings((self, content: str)) -> str:
    def _process_links((self, content: str)) -> str:
    def _process_images((self, content: str)) -> str:
    def _enhance_code_blocks((self, content: str)) -> str:
    def _add_css_classes((self, content: str)) -> str:
    def _clean_whitespace((self, content: str)) -> str:
    def _assess_quality((self, content: str)) -> Dict[str, Any]:
    def _generate_navigation_hints((self, article: Article)) -> Dict[str, Any]:
    def _generate_file_path((self, article: Article)) -> str:
    def _has_html_content((self, content: str)) -> bool:
    def _convert_html_to_markdown((self, content: str)) -> str:
    def _preprocess_html((self, html_content: str)) -> str:
    def _postprocess_converted_markdown((self, markdown_content: str)) -> str:
    def _convert_to_admonitions((self, content: str)) -> str:
    def _enhance_code_blocks_superfences((self, content: str)) -> str:
    def _convert_to_tabbed_content((self, content: str)) -> str:
    def _convert_to_task_lists((self, content: str)) -> str:
    def _assess_quality_advanced((self, content: str, article: Article)) -> Dict[str, Any]:
    def _detect_broken_links((self, content: str)) -> List[Dict[str, Any]]:
    def _calculate_reading_time((self, content: str)) -> int:
    def _get_used_extensions((self, content: str)) -> List[str]:
    def _has_introduction((self, content: str)) -> bool:
    def _has_conclusion((self, content: str)) -> bool:
    def _analyze_heading_structure((self, content: str)) -> int:
    def _analyze_content_depth((self, content: str)) -> int:
    def _analyze_internal_linking((self, content: str)) -> int:
    def _analyze_code_examples((self, content: str)) -> int:
    def _analyze_media_richness((self, content: str)) -> int:
    def _calculate_readability_score((self, content: str)) -> int:
    def _analyze_seo_optimization((self, content: str, article: Article)) -> int:
    def _analyze_mkdocs_compatibility((self, content: str)) -> int:
    def _generate_quality_recommendations((self, metrics: Dict[str, Any])) -> List[str]:
    def _extract_description((self, content: str)) -> str:
    def _extract_tags((self, article: Article)) -> List[str]:
    def _generate_seo_metadata((self, article: Article)) -> Dict[str, str]:
    def _generate_social_card_metadata((self, article: Article)) -> Dict[str, str]:
    def _determine_template((self, article: Article)) -> Optional[str]:
    def _is_internal_d360_link((self, url: str)) -> bool:
    def _convert_internal_link((self, url: str)) -> str:
    def _is_external_link((self, url: str)) -> bool:
    def _process_d360_image_url((self, src: str)) -> str:
    def _is_large_image_url((self, src: str)) -> bool:
    def _detect_code_language((self, code: str)) -> str:
    def _determine_quality_level((self, score: int)) -> str:
    def _generate_nav_title((self, title: str)) -> str:
    def _generate_breadcrumb_path((self, article: Article)) -> List[str]:
    def _calculate_navigation_weight((self, article: Article)) -> int:
    def _generate_edit_url((self, article: Article)) -> Optional[str]:

def __init__((
        self,
        site_url: Optional[str] = None,
        enable_seo: bool = True,
        validate_links: bool = True,
        add_edit_links: bool = True,
        enable_social_cards: bool = False,
        custom_css_classes: Optional[Dict[str, str]] = None,
        # Phase 2 enhancements
        enable_html_conversion: bool = True,
        mkdocs_extensions: Optional[List[str]] = None,
        enable_admonitions: bool = True,
        enable_superfences: bool = True,
        enable_tabbed_content: bool = True,
        enable_task_lists: bool = True,
        validate_content_quality: bool = True,
        check_broken_links: bool = False,
        reading_time_estimation: bool = True,
    )) -> None:

def enhance_article((self, article: Article)) -> Dict[str, Any]:

def _generate_frontmatter((self, article: Article)) -> Dict[str, Any]:

def _process_content((self, content: str)) -> str:

def _normalize_headings((self, content: str)) -> str:

def replace_heading((match)):

def _process_links((self, content: str)) -> str:

def replace_link((match)):

def _process_images((self, content: str)) -> str:

def replace_image((match)):

def _enhance_code_blocks((self, content: str)) -> str:

def replace_code_block((match)):

def _add_css_classes((self, content: str)) -> str:

def _clean_whitespace((self, content: str)) -> str:

def _assess_quality((self, content: str)) -> Dict[str, Any]:

def _generate_navigation_hints((self, article: Article)) -> Dict[str, Any]:

def _generate_file_path((self, article: Article)) -> str:

def _has_html_content((self, content: str)) -> bool:

def _convert_html_to_markdown((self, content: str)) -> str:

def _preprocess_html((self, html_content: str)) -> str:

def _postprocess_converted_markdown((self, markdown_content: str)) -> str:

def _convert_to_admonitions((self, content: str)) -> str:

def _enhance_code_blocks_superfences((self, content: str)) -> str:

def enhance_code_block((match)):

def _convert_to_tabbed_content((self, content: str)) -> str:

def replace_with_tabs((match)):

def _convert_to_task_lists((self, content: str)) -> str:

def _assess_quality_advanced((self, content: str, article: Article)) -> Dict[str, Any]:

def _detect_broken_links((self, content: str)) -> List[Dict[str, Any]]:

def _calculate_reading_time((self, content: str)) -> int:

def _get_used_extensions((self, content: str)) -> List[str]:

def _has_introduction((self, content: str)) -> bool:

def _has_conclusion((self, content: str)) -> bool:

def _analyze_heading_structure((self, content: str)) -> int:

def _analyze_content_depth((self, content: str)) -> int:

def _analyze_internal_linking((self, content: str)) -> int:

def _analyze_code_examples((self, content: str)) -> int:

def _analyze_media_richness((self, content: str)) -> int:

def _calculate_readability_score((self, content: str)) -> int:

def _analyze_seo_optimization((self, content: str, article: Article)) -> int:

def _analyze_mkdocs_compatibility((self, content: str)) -> int:

def _generate_quality_recommendations((self, metrics: Dict[str, Any])) -> List[str]:

def _extract_description((self, content: str)) -> str:

def _extract_tags((self, article: Article)) -> List[str]:

def _generate_seo_metadata((self, article: Article)) -> Dict[str, str]:

def _generate_social_card_metadata((self, article: Article)) -> Dict[str, str]:

def _determine_template((self, article: Article)) -> Optional[str]:

def _is_internal_d360_link((self, url: str)) -> bool:

def _convert_internal_link((self, url: str)) -> str:

def _is_external_link((self, url: str)) -> bool:

def _process_d360_image_url((self, src: str)) -> str:

def _is_large_image_url((self, src: str)) -> bool:

def _detect_code_language((self, code: str)) -> str:

def _determine_quality_level((self, score: int)) -> str:

def _generate_nav_title((self, title: str)) -> str:

def _generate_breadcrumb_path((self, article: Article)) -> List[str]:

def _calculate_navigation_weight((self, article: Article)) -> int:

def _generate_edit_url((self, article: Article)) -> Optional[str]:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/mkdocs/processors/cross_reference_resolver.py
# Language: python

import re
from typing import Dict, List, Set, Optional, Tuple, Any
from pathlib import Path
from urllib.parse import urlparse, unquote
from dataclasses import dataclass
from loguru import logger
from d361.core.models import Article, Category
import httpx
import asyncio
from concurrent.futures import ThreadPoolExecutor

class LinkReference:

class AnchorReference:

class CrossReferenceResolver:
    def __init__((
        self,
        articles: List[Article],
        categories: Optional[List[Category]] = None,
        base_url: Optional[str] = None,
        validate_external: bool = True,
        generate_autorefs: bool = True,
        create_redirects: bool = True,
        # Phase 2 enhancements
        enable_autorefs_plugin: bool = True,
        autorefs_plugin_config: Optional[Dict[str, Any]] = None,
        enable_http_validation: bool = False,
        validation_timeout: int = 10,
        max_concurrent_validations: int = 10,
        generate_reference_index: bool = True,
        smart_link_suggestions: bool = True,
        broken_link_reporting: bool = True,
        enable_link_analytics: bool = True,
    )) -> None:
    def resolve_references((self, content: str, current_article: Article)) -> Dict[str, Any]:
    def resolve_references_bulk((self, articles: List[Article], navigation: Dict[str, Any])) -> List[Article]:
    def generate_link_report((self)) -> Dict[str, Any]:
    def get_redirect_mappings((self)) -> Dict[str, str]:
    def get_autoref_suggestions((self)) -> Dict[str, List[str]]:
    def _build_article_index((self)) -> Dict[str, Article]:
    def _build_category_index((self)) -> Dict[str, Category]:
    def _build_url_mappings((self)) -> Dict[str, str]:
    def _extract_anchors((self, content: str, article_id: str)) -> List[AnchorReference]:
    def _extract_links((self, content: str)) -> List[LinkReference]:
    def _resolve_link((self, link: LinkReference, current_article: Article)) -> LinkReference:
    def _resolve_anchor_link((self, link: LinkReference, current_article: Article)) -> LinkReference:
    def _resolve_external_link((self, link: LinkReference)) -> LinkReference:
    def _resolve_d360_link((self, link: LinkReference)) -> LinkReference:
    def _resolve_relative_link((self, link: LinkReference, current_article: Article)) -> LinkReference:
    def _apply_link_resolutions((self, content: str, links: List[LinkReference])) -> str:
    def _add_autorefs((self, content: str, current_article: Article)) -> str:
    def _generate_anchor_id((self, heading_text: str)) -> str:
    def _generate_article_url((self, article: Article)) -> str:
    def _is_document360_link((self, url: str)) -> bool:
    def _extract_keywords((self, title: str)) -> List[str]:
    def _calculate_success_rate((self)) -> float:
    def _get_common_errors((self)) -> List[Dict[str, Any]]:
    def _extract_autorefs((self, content: str)) -> List[Dict[str, Any]]:
    def _validate_external_links_batch((self, external_links: List[LinkReference])) -> None:
    def _validate_external_link_http((self, link: LinkReference)) -> None:
    def _track_link_analytics((self, link: LinkReference, current_article: Article)) -> None:
    def _process_autorefs((self, content: str, autorefs: List[Dict[str, Any]], current_article: Article)) -> str:
    def _resolve_autoref_identifier((self, identifier: str)) -> Optional[str]:
    def _update_reference_index((self, resolved_links: List[LinkReference], current_article: Article)) -> None:
    def _generate_smart_suggestions((self, current_article: Article, content: str)) -> List[Dict[str, Any]]:
    def _calculate_content_relevance((self, content: str, article: Article)) -> float:
    def _generate_suggestion_explanation((self, current_article: Article, suggested_article: Article, relevance_score: float)) -> str:
    def _get_validation_summary((self, links: List[LinkReference])) -> Dict[str, Any]:
    def _get_analytics_summary((self, links: List[LinkReference])) -> Dict[str, Any]:
    def _get_most_referenced_urls((self)) -> List[Dict[str, Any]]:
    def _get_reference_graph_data((self, current_article: Article)) -> Dict[str, Any]:
    def cleanup((self)):

def __init__((
        self,
        articles: List[Article],
        categories: Optional[List[Category]] = None,
        base_url: Optional[str] = None,
        validate_external: bool = True,
        generate_autorefs: bool = True,
        create_redirects: bool = True,
        # Phase 2 enhancements
        enable_autorefs_plugin: bool = True,
        autorefs_plugin_config: Optional[Dict[str, Any]] = None,
        enable_http_validation: bool = False,
        validation_timeout: int = 10,
        max_concurrent_validations: int = 10,
        generate_reference_index: bool = True,
        smart_link_suggestions: bool = True,
        broken_link_reporting: bool = True,
        enable_link_analytics: bool = True,
    )) -> None:

def resolve_references((self, content: str, current_article: Article)) -> Dict[str, Any]:

def resolve_references_bulk((self, articles: List[Article], navigation: Dict[str, Any])) -> List[Article]:

def generate_link_report((self)) -> Dict[str, Any]:

def get_redirect_mappings((self)) -> Dict[str, str]:

def get_autoref_suggestions((self)) -> Dict[str, List[str]]:

def _build_article_index((self)) -> Dict[str, Article]:

def _build_category_index((self)) -> Dict[str, Category]:

def _build_url_mappings((self)) -> Dict[str, str]:

def _extract_anchors((self, content: str, article_id: str)) -> List[AnchorReference]:

def _extract_links((self, content: str)) -> List[LinkReference]:

def _resolve_link((self, link: LinkReference, current_article: Article)) -> LinkReference:

def _resolve_anchor_link((self, link: LinkReference, current_article: Article)) -> LinkReference:

def _resolve_external_link((self, link: LinkReference)) -> LinkReference:

def _resolve_d360_link((self, link: LinkReference)) -> LinkReference:

def _resolve_relative_link((self, link: LinkReference, current_article: Article)) -> LinkReference:

def _apply_link_resolutions((self, content: str, links: List[LinkReference])) -> str:

def _add_autorefs((self, content: str, current_article: Article)) -> str:

def replace_match((match)):

def _generate_anchor_id((self, heading_text: str)) -> str:

def _generate_article_url((self, article: Article)) -> str:

def _is_document360_link((self, url: str)) -> bool:

def _extract_keywords((self, title: str)) -> List[str]:

def _calculate_success_rate((self)) -> float:

def _get_common_errors((self)) -> List[Dict[str, Any]]:

def _extract_autorefs((self, content: str)) -> List[Dict[str, Any]]:

def _validate_external_links_batch((self, external_links: List[LinkReference])) -> None:

def validate_single_link((link: LinkReference)):

def _validate_external_link_http((self, link: LinkReference)) -> None:

def _track_link_analytics((self, link: LinkReference, current_article: Article)) -> None:

def _process_autorefs((self, content: str, autorefs: List[Dict[str, Any]], current_article: Article)) -> str:

def _resolve_autoref_identifier((self, identifier: str)) -> Optional[str]:

def _update_reference_index((self, resolved_links: List[LinkReference], current_article: Article)) -> None:

def _generate_smart_suggestions((self, current_article: Article, content: str)) -> List[Dict[str, Any]]:

def _calculate_content_relevance((self, content: str, article: Article)) -> float:

def _generate_suggestion_explanation((self, current_article: Article, suggested_article: Article, relevance_score: float)) -> str:

def _get_validation_summary((self, links: List[LinkReference])) -> Dict[str, Any]:

def _get_analytics_summary((self, links: List[LinkReference])) -> Dict[str, Any]:

def _get_most_referenced_urls((self)) -> List[Dict[str, Any]]:

def _get_reference_graph_data((self, current_article: Article)) -> Dict[str, Any]:

def cleanup((self)):


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/mkdocs/processors/markdown_processor.py
# Language: python

import re
from typing import Dict, Any, List, Optional
from pathlib import Path
from loguru import logger

class MarkdownProcessor:
    def __init__((
        self,
        enable_extensions: bool = True,
        code_highlighting: bool = True,
        responsive_images: bool = True,
        table_optimization: bool = True,
    )) -> None:
    def convert((self, content: str)) -> str:
    def _reset_stats((self)) -> None:
    def _convert_d360_elements((self, content: str)) -> str:
    def _convert_d360_callouts((self, content: str)) -> str:
    def _convert_d360_code_blocks((self, content: str)) -> str:
    def _convert_d360_tables((self, content: str)) -> str:
    def _html_table_to_markdown((self, table_html: str)) -> str:
    def _convert_d360_images((self, content: str)) -> str:
    def _html_to_markdown((self, content: str)) -> str:
    def _process_code_blocks((self, content: str)) -> str:
    def _process_tables((self, content: str)) -> str:
    def _process_images((self, content: str)) -> str:
    def _process_links((self, content: str)) -> str:
    def _apply_mkdocs_extensions((self, content: str)) -> str:
    def _convert_to_tabs((self, content: str)) -> str:
    def _enhance_admonitions((self, content: str)) -> str:
    def _final_cleanup((self, content: str)) -> str:
    def get_conversion_stats((self)) -> Dict[str, int]:

def __init__((
        self,
        enable_extensions: bool = True,
        code_highlighting: bool = True,
        responsive_images: bool = True,
        table_optimization: bool = True,
    )) -> None:

def convert((self, content: str)) -> str:

def _reset_stats((self)) -> None:

def _convert_d360_elements((self, content: str)) -> str:

def _convert_d360_callouts((self, content: str)) -> str:

def _convert_d360_code_blocks((self, content: str)) -> str:

def _convert_d360_tables((self, content: str)) -> str:

def _html_table_to_markdown((self, table_html: str)) -> str:

def _convert_d360_images((self, content: str)) -> str:

def _html_to_markdown((self, content: str)) -> str:

def _process_code_blocks((self, content: str)) -> str:

def _process_tables((self, content: str)) -> str:

def _process_images((self, content: str)) -> str:

def _process_links((self, content: str)) -> str:

def _apply_mkdocs_extensions((self, content: str)) -> str:

def _convert_to_tabs((self, content: str)) -> str:

def _enhance_admonitions((self, content: str)) -> str:

def _final_cleanup((self, content: str)) -> str:

def get_conversion_stats((self)) -> Dict[str, int]:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/mkdocs/processors/plugin_manager.py
# Language: python

from typing import Dict, Any, List, Optional, Set
from dataclasses import dataclass, field
from pathlib import Path
import yaml
from loguru import logger
from d361.api.errors import Document360Error, ErrorCategory, ErrorSeverity
import asyncio

class PluginConfig:
    def to_dict((self)) -> Dict[str, Any]:

class PluginSet:

class PluginManager:
    def __init__((
        self,
        theme: str = "material",
        site_url: Optional[str] = None,
        enable_offline: bool = False,
    )) -> None:
    def _init_core_plugins((self)) -> PluginSet:
    def _init_seo_plugins((self)) -> PluginSet:
    def _init_performance_plugins((self)) -> PluginSet:
    def _init_accessibility_plugins((self)) -> PluginSet:
    def _init_advanced_plugins((self)) -> PluginSet:
    def get_optimal_plugins((
        self,
        enable_seo: bool = True,
        enable_performance: bool = True,
        enable_accessibility: bool = True,
        enable_advanced: bool = False,
        custom_plugins: Optional[List[PluginConfig]] = None,
    )) -> List[Dict[str, Any]]:
    def get_plugin_dependencies((
        self,
        enable_seo: bool = True,
        enable_performance: bool = True,
        enable_accessibility: bool = True,
        enable_advanced: bool = False,
    )) -> Dict[str, List[str]]:
    def get_installation_guide((
        self,
        enable_seo: bool = True,
        enable_performance: bool = True,
        enable_accessibility: bool = True,
        enable_advanced: bool = False,
    )) -> Dict[str, Any]:
    def validate_plugin_configuration((self, plugins_config: List[Any])) -> Dict[str, Any]:

class MarkdownExtensionManager:
    def __init__((self, theme: str = "material")) -> None:
    def get_core_extensions((self)) -> List[Dict[str, Any] | str]:
    def get_enhanced_extensions((self)) -> List[Dict[str, Any] | str]:
    def get_advanced_extensions((self)) -> List[Dict[str, Any] | str]:
    def get_optimal_extensions((
        self,
        include_advanced: bool = True,
        include_math: bool = True,
        include_diagrams: bool = True,
    )) -> List[Dict[str, Any] | str]:

def to_dict((self)) -> Dict[str, Any]:

def __init__((
        self,
        theme: str = "material",
        site_url: Optional[str] = None,
        enable_offline: bool = False,
    )) -> None:

def _init_core_plugins((self)) -> PluginSet:

def _init_seo_plugins((self)) -> PluginSet:

def _init_performance_plugins((self)) -> PluginSet:

def _init_accessibility_plugins((self)) -> PluginSet:

def _init_advanced_plugins((self)) -> PluginSet:

def get_optimal_plugins((
        self,
        enable_seo: bool = True,
        enable_performance: bool = True,
        enable_accessibility: bool = True,
        enable_advanced: bool = False,
        custom_plugins: Optional[List[PluginConfig]] = None,
    )) -> List[Dict[str, Any]]:

def get_plugin_dependencies((
        self,
        enable_seo: bool = True,
        enable_performance: bool = True,
        enable_accessibility: bool = True,
        enable_advanced: bool = False,
    )) -> Dict[str, List[str]]:

def get_installation_guide((
        self,
        enable_seo: bool = True,
        enable_performance: bool = True,
        enable_accessibility: bool = True,
        enable_advanced: bool = False,
    )) -> Dict[str, Any]:

def validate_plugin_configuration((self, plugins_config: List[Any])) -> Dict[str, Any]:

def __init__((self, theme: str = "material")) -> None:

def get_core_extensions((self)) -> List[Dict[str, Any] | str]:

def get_enhanced_extensions((self)) -> List[Dict[str, Any] | str]:

def get_advanced_extensions((self)) -> List[Dict[str, Any] | str]:

def get_optimal_extensions((
        self,
        include_advanced: bool = True,
        include_math: bool = True,
        include_diagrams: bool = True,
    )) -> List[Dict[str, Any] | str]:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/mkdocs/processors/seo_optimizer.py
# Language: python

import json
from typing import Dict, Any, List, Optional, Union
from dataclasses import dataclass, field
from pathlib import Path
from datetime import datetime, timezone
from urllib.parse import urljoin, urlparse
from loguru import logger
from d361.api.errors import Document360Error, ErrorCategory, ErrorSeverity
import re

class SEOMetadata:
    def to_frontmatter((self)) -> Dict[str, Any]:

class StructuredData:
    def to_json_ld((self)) -> str:

class SEOOptimizer:
    def __init__((
        self,
        site_url: str,
        site_name: str,
        site_description: Optional[str] = None,
        default_author: Optional[str] = None,
        default_og_image: Optional[str] = None,
        organization_name: Optional[str] = None,
        organization_logo: Optional[str] = None,
    )) -> None:
    def generate_page_metadata((
        self,
        title: str,
        content: str,
        url_path: str,
        author: Optional[str] = None,
        tags: Optional[List[str]] = None,
        published_date: Optional[datetime] = None,
        modified_date: Optional[datetime] = None,
        og_image: Optional[str] = None,
        schema_type: str = "Article",
    )) -> SEOMetadata:
    def _generate_description((self, content: str, title: str, max_length: int = 155)) -> str:
    def generate_structured_data((
        self,
        metadata: SEOMetadata,
        content: str,
        breadcrumbs: Optional[List[Dict[str, str]]] = None,
    )) -> StructuredData:
    def generate_social_media_config((self)) -> Dict[str, Any]:
    def generate_analytics_config((
        self,
        google_analytics: Optional[str] = None,
        google_tag_manager: Optional[str] = None,
        enable_feedback: bool = True,
    )) -> Dict[str, Any]:
    def generate_performance_config((self)) -> Dict[str, Any]:
    def generate_accessibility_config((self)) -> Dict[str, Any]:
    def validate_seo_config((self, config: Dict[str, Any])) -> Dict[str, Any]:
    def generate_sitemap_urls((
        self,
        pages: List[Dict[str, Any]],
        priority_map: Optional[Dict[str, float]] = None,
        changefreq_map: Optional[Dict[str, str]] = None,
    )) -> List[Dict[str, Any]]:

def to_frontmatter((self)) -> Dict[str, Any]:

def to_json_ld((self)) -> str:

def __init__((
        self,
        site_url: str,
        site_name: str,
        site_description: Optional[str] = None,
        default_author: Optional[str] = None,
        default_og_image: Optional[str] = None,
        organization_name: Optional[str] = None,
        organization_logo: Optional[str] = None,
    )) -> None:

def generate_page_metadata((
        self,
        title: str,
        content: str,
        url_path: str,
        author: Optional[str] = None,
        tags: Optional[List[str]] = None,
        published_date: Optional[datetime] = None,
        modified_date: Optional[datetime] = None,
        og_image: Optional[str] = None,
        schema_type: str = "Article",
    )) -> SEOMetadata:

def _generate_description((self, content: str, title: str, max_length: int = 155)) -> str:

def generate_structured_data((
        self,
        metadata: SEOMetadata,
        content: str,
        breadcrumbs: Optional[List[Dict[str, str]]] = None,
    )) -> StructuredData:

def generate_social_media_config((self)) -> Dict[str, Any]:

def generate_analytics_config((
        self,
        google_analytics: Optional[str] = None,
        google_tag_manager: Optional[str] = None,
        enable_feedback: bool = True,
    )) -> Dict[str, Any]:

def generate_performance_config((self)) -> Dict[str, Any]:

def generate_accessibility_config((self)) -> Dict[str, Any]:

def validate_seo_config((self, config: Dict[str, Any])) -> Dict[str, Any]:

def generate_sitemap_urls((
        self,
        pages: List[Dict[str, Any]],
        priority_map: Optional[Dict[str, float]] = None,
        changefreq_map: Optional[Dict[str, str]] = None,
    )) -> List[Dict[str, Any]]:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/offline/__init__.py
# Language: python

from .__main__ import CLI, main
from .config import Config
from .d361_offline import D361Offline


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/offline/__main__.py
# Language: python

import asyncio
import sys
from pathlib import Path
from typing import Any
import fire
from loguru import logger
from .config import Config
from .d361_offline import D361Offline
import json
import json
import traceback

class CLI:
    def __init__((self)) -> None:
    def prep((
        self,
        map_url: str = "https://docs.document360.com/sitemap-en.xml",
        nav_url: str = "",
        output_dir: str = "",
        style: str = "",
        effort: int = 1,
        parallel: int = 3,
        retries: int = 2,
        timeout: int = 60,
        verbose: bool = False,
        test: bool = False,
        wait: int = 0,
    )) -> dict[str, Any]:
    def fetch((
        self,
        prep_file: str = "",
        output_dir: str = "",
        parallel: int = 3,
        retries: int = 2,
        timeout: int = 60,
        verbose: bool = False,
        test: bool = False,
        wait: int = 0,
    )) -> dict[str, Any]:
    def build((
        self,
        fetch_file: str = "",
        output_dir: str = "",
        style: str = "",
        verbose: bool = False,
    )) -> None:
    def all((
        self,
        map_url: str = "https://docs.document360.com/sitemap-en.xml",
        nav_url: str = "",
        output_dir: str = "",
        style: str = "",
        effort: int = 1,
        parallel: int = 3,
        retries: int = 2,
        timeout: int = 60,
        verbose: bool = False,
        test: bool = False,
        pause: int = 0,
    )) -> None:

def __init__((self)) -> None:

def prep((
        self,
        map_url: str = "https://docs.document360.com/sitemap-en.xml",
        nav_url: str = "",
        output_dir: str = "",
        style: str = "",
        effort: int = 1,
        parallel: int = 3,
        retries: int = 2,
        timeout: int = 60,
        verbose: bool = False,
        test: bool = False,
        wait: int = 0,
    )) -> dict[str, Any]:

def fetch((
        self,
        prep_file: str = "",
        output_dir: str = "",
        parallel: int = 3,
        retries: int = 2,
        timeout: int = 60,
        verbose: bool = False,
        test: bool = False,
        wait: int = 0,
    )) -> dict[str, Any]:

def build((
        self,
        fetch_file: str = "",
        output_dir: str = "",
        style: str = "",
        verbose: bool = False,
    )) -> None:

def all((
        self,
        map_url: str = "https://docs.document360.com/sitemap-en.xml",
        nav_url: str = "",
        output_dir: str = "",
        style: str = "",
        effort: int = 1,
        parallel: int = 3,
        retries: int = 2,
        timeout: int = 60,
        verbose: bool = False,
        test: bool = False,
        pause: int = 0,
    )) -> None:

def main(()) -> None:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/offline/browser.py
# Language: python

from loguru import logger
from playwright.async_api import Browser, BrowserContext, Page
from playwright.async_api import async_playwright

def setup_browser((headless: bool = True)) -> tuple[Browser, BrowserContext]:

def scroll_to_bottom((page: Page, selector: str, max_scrolls: int = 30)) -> None:

def expand_all_items((page: Page, selector: str, max_attempts: int = 12)) -> int:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/offline/config.py
# Language: python

from pathlib import Path
from typing import Any
from urllib.parse import urlparse
from pydantic import AnyHttpUrl, BaseModel, Field, TypeAdapter, computed_field

DEFAULT_TIMEOUT = =
DEFAULT_RETRIES = =
DEFAULT_MAX_CONCURRENT = =
DEFAULT_USER_AGENT = =
DEFAULT_MAP_URL = =

class Config(B, a, s, e, M, o, d, e, l):
    def model_post_init((self, __context: Any)) -> None:
    def model_dump((self, **kwargs: Any)) -> dict[str, Any]:

def root_domain((self)) -> str:

def prep_filename((self)) -> str:

def fetch_filename((self)) -> str:

def nav_json_filename((self)) -> str:

def nav_html_filename((self)) -> str:

def nav_md_filename((self)) -> str:

def all_docs_html_filename((self)) -> str:

def all_docs_md_filename((self)) -> str:

def html_dir((self)) -> Path:

def md_dir((self)) -> Path:

def prep_file((self)) -> Path:

def fetch_file((self)) -> Path:

def model_post_init((self, __context: Any)) -> None:

def model_dump((self, **kwargs: Any)) -> dict[str, Any]:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/offline/content.py
# Language: python

from loguru import logger
from markdownify import markdownify as md
from playwright.async_api import Page
from tenacity import retry, stop_after_attempt, wait_exponential

def extract_page_content((page: Page)) -> dict[str, str] | None:


<document index="47">
<source>src/d361/offline/d361_offline.css</source>
<document_content>
:root {
    --font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
    --font-mono: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
    --font-serif: Georgia, Cambria, "Times New Roman", Times, serif;
    
    --color-background: #ffffff;
    --color-text: #333333;
    --color-text-muted: #666666;
    --color-link: #0366d6;
    --color-link-hover: #2188ff;
    --color-border: #e1e4e8;
    --color-heading: #24292e;
    --color-code-bg: #f6f8fa;
    --color-blockquote: #f0f4f8;
    --color-sidebar-bg: #f8f9fa;
    
    --spacing-unit: 16px;
    --content-width: 760px;
    --sidebar-width: 280px;
}

@media (prefers-color-scheme: dark) {
    :root {
        --color-background: #0d1117;
        --color-text: #c9d1d9;
        --color-text-muted: #8b949e;
        --color-link: #58a6ff;
        --color-link-hover: #79c0ff;
        --color-border: #30363d;
        --color-heading: #e6edf3;
        --color-code-bg: #161b22;
        --color-blockquote: #161b22;
        --color-sidebar-bg: #0d1117;
    }
}

html {
    box-sizing: border-box;
    font-size: 16px;
    -webkit-text-size-adjust: 100%;
}

*, *:before, *:after {
    box-sizing: inherit;
}

body {
    margin: 0;
    padding: 0;
    font-family: var(--font-sans);
    line-height: 1.6;
    color: var(--color-text);
    background-color: var(--color-background);
    display: flex;
    min-height: 100vh;
    font-size: 1rem;
}

/* Layout */
aside {
    position: fixed;
    width: var(--sidebar-width);
    height: 100vh;
    overflow-y: auto;
    padding: var(--spacing-unit);
    border-right: 1px solid var(--color-border);
    background-color: var(--color-sidebar-bg);
}

aside nav ul {
    padding-left: 0;
    list-style-type: none;
}

aside nav li {
    margin-bottom: calc(var(--spacing-unit) / 2);
}

aside nav li a {
    display: block;
    padding: calc(var(--spacing-unit) / 4) 0;
    text-decoration: none;
    color: var(--color-text);
    border-radius: 4px;
    transition: color 0.2s ease;
}

aside nav li a:hover {
    color: var(--color-link-hover);
}

main {
    flex: 1;
    padding: var(--spacing-unit) var(--spacing-unit) var(--spacing-unit) calc(var(--sidebar-width) + var(--spacing-unit));
    max-width: calc(var(--content-width) + var(--sidebar-width) + var(--spacing-unit));
    margin: 0 auto;
}

/* Typography */
h1, h2, h3, h4, h5, h6 {
    margin-top: calc(var(--spacing-unit) * 2);
    margin-bottom: var(--spacing-unit);
    font-weight: 600;
    line-height: 1.25;
    color: var(--color-heading);
}

h1 { font-size: 2em; border-bottom: 1px solid var(--color-border); padding-bottom: calc(var(--spacing-unit) / 2); }
h2 { font-size: 1.5em; border-bottom: 1px solid var(--color-border); padding-bottom: calc(var(--spacing-unit) / 2); }
h3 { font-size: 1.25em; }
h4 { font-size: 1em; }
h5 { font-size: 0.875em; }
h6 { font-size: 0.85em; color: var(--color-text-muted); }

p, ul, ol, dl, blockquote, table, pre {
    margin-top: 0;
    margin-bottom: var(--spacing-unit);
}

a {
    color: var(--color-link);
    text-decoration: none;
    transition: color 0.2s ease;
}

a:hover {
    color: var(--color-link-hover);
    text-decoration: underline;
}

code, pre {
    font-family: var(--font-mono);
    font-size: 0.9em;
    background-color: var(--color-code-bg);
    border-radius: 3px;
}

code {
    padding: 0.2em 0.4em;
}

pre {
    padding: var(--spacing-unit);
    overflow-x: auto;
    line-height: 1.45;
    border-radius: 6px;
}

pre code {
    padding: 0;
    background-color: transparent;
}

blockquote {
    margin-left: 0;
    padding: var(--spacing-unit);
    background-color: var(--color-blockquote);
    border-left: 4px solid var(--color-border);
}

table {
    border-collapse: collapse;
    width: 100%;
}

table th, table td {
    padding: 8px 12px;
    border: 1px solid var(--color-border);
}

table th {
    background-color: var(--color-code-bg);
    font-weight: 600;
}

img {
    max-width: 100%;
    height: auto;
}

/* Custom styles for article content */
#articleContent {
    margin-bottom: calc(var(--spacing-unit) * 3);
}

/* Responsive adjustments */
@media screen and (max-width: 900px) {
    :root {
        --sidebar-width: 220px;
    }
    
    body {
        font-size: 0.95rem;
    }
}

@media screen and (max-width: 768px) {
    body {
        flex-direction: column;
    }
    
    aside {
        position: static;
        width: 100%;
        height: auto;
        border-right: none;
        border-bottom: 1px solid var(--color-border);
    }
    
    main {
        padding: var(--spacing-unit);
        max-width: var(--content-width);
        margin: 0 auto;
    }
} 
</document_content>
</document>

# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/offline/d361_offline.py
# Language: python

import asyncio
import json
import os
import re
import shutil
from datetime import datetime, timezone
from pathlib import Path
from typing import Any
from loguru import logger
from playwright.async_api import Browser, BrowserContext
from .browser import setup_browser
from .config import Config
from .content import extract_page_content
from .navigation import extract_navigation
from .parser import parse_sitemap
import re
from urllib.parse import urlparse

class D361Offline:
    def __init__((self, config: Config)) -> None:
    def prep((self)) -> dict[str, Any]:
    def _generate_nav_html((self, nav_structure: dict[str, Any])) -> str:
    def process_url((
        self, url: str, browser: Browser, context: BrowserContext
    )) -> dict[str, Any] | None:
    def _get_slug((self, url: str)) -> str:
    def fetch((self, prep_file: Path | None = None)) -> dict[str, Any]:
    def build((self, fetch_file: Path | None = None)) -> None:
    def _generate_combined_files((
        self,
        content_map: dict[str, Any],
        navigation: dict[str, Any],
        css_path: Path | None = None,
    )) -> None:
    def _extract_ordered_urls_from_nav((
        self, navigation: dict[str, Any], content_map: dict[str, Any]
    )) -> list[str]:
    def all((self, prep_file: Path | None = None)) -> None:

def __init__((self, config: Config)) -> None:

def prep((self)) -> dict[str, Any]:

def write_items((
                        items: list[dict[str, Any]], level: int = 0
                    )) -> None:

def _generate_nav_html((self, nav_structure: dict[str, Any])) -> str:

def process_items((items: list[dict[str, Any]])) -> None:

def process_url((
        self, url: str, browser: Browser, context: BrowserContext
    )) -> dict[str, Any] | None:

def _get_slug((self, url: str)) -> str:

def fetch((self, prep_file: Path | None = None)) -> dict[str, Any]:

def process_with_semaphore((url: str)) -> None:

def build((self, fetch_file: Path | None = None)) -> None:

def _generate_combined_files((
        self,
        content_map: dict[str, Any],
        navigation: dict[str, Any],
        css_path: Path | None = None,
    )) -> None:

def extract_urls_from_nav((items: list[dict[str, Any]])) -> None:

def _extract_ordered_urls_from_nav((
        self, navigation: dict[str, Any], content_map: dict[str, Any]
    )) -> list[str]:

def extract_urls_from_nav((items: list[dict[str, Any]])) -> None:

def all((self, prep_file: Path | None = None)) -> None:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/offline/generator.py
# Language: python

import os
import shutil
from pathlib import Path
from typing import Any
import aiofiles
from loguru import logger
from markdownify import markdownify

def create_output_directory((
    output_dir: Path, css_file: Path | None = None
)) -> None:

def generate_html_file((
    url: str,
    content: dict[str, str],
    output_dir: Path,
    nav_html: str,
    css_filename: str,
)) -> Path:

def generate_markdown_file((
    url: str, content: dict[str, str], output_dir: Path
)) -> Path:

def generate_navigation_html((nav_structure: dict[str, Any])) -> str:

def render_items((items: list[dict[str, Any]])) -> None:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/offline/navigation.py
# Language: python

from typing import Any
from urllib.parse import urljoin
from loguru import logger
from playwright.async_api import Page
from .browser import expand_all_items, scroll_to_bottom

def extract_navigation((
    page: Page, nav_url: str, test: bool = False
)) -> dict[str, Any]:

def expand_navigation_tree((page: Page, test: bool = False)) -> None:

def extract_tree_structure((page: Page, tree_selector: str)) -> dict[str, Any]:

def extract_fallback_nav_structure((page: Page)) -> dict[str, Any]:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/offline/parser.py
# Language: python

import asyncio
import random
import re
from typing import Any
import aiohttp
from bs4 import BeautifulSoup
from loguru import logger
from playwright.async_api import BrowserContext, Page, async_playwright

def parse_sitemap((
    sitemap_url: str, test: bool = False, pause: int = 0
)) -> set[str]:

def _setup_stealth_context(()) -> tuple[Any, BrowserContext]:

def _parse_with_playwright_direct((sitemap_url: str)) -> set[str]:

def _parse_with_playwright_stealth((sitemap_url: str)) -> set[str]:

def _parse_with_aiohttp_direct((sitemap_url: str)) -> set[str]:

def _parse_with_playwright_via_robots((sitemap_url: str)) -> set[str]:

def _extract_urls_from_content((
    content: str, page: Page | None = None
)) -> set[str]:

def _extract_urls_from_xml((content: str)) -> set[str]:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/plugins/__init__.py
# Language: python

from .manager import PluginManager


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/plugins/manager.py
# Language: python

import importlib
import importlib.metadata
from typing import Any, Dict, List, Type
from loguru import logger
from ..core.interfaces import ConvertedContent, ConverterPlugin

class PluginManager:
    def __init__((self)) -> None:
    def _discover_plugins((self)) -> None:
    def _validate_converter_plugin((self, plugin_class: Type[Any])) -> bool:
    def get_converter_plugin((self, plugin_name: str)) -> Type[ConverterPlugin] | None:
    def list_converter_plugins((self)) -> List[str]:
    def get_plugins_for_format((self, source_format: str, target_format: str)) -> List[str]:
    def convert((
        self,
        content: str,
        from_format: str,
        to_format: str,
        plugin_name: str | None = None,
        **options: Any,
    )) -> ConvertedContent:
    def reload_plugins((self)) -> None:
    def register_converter_plugin((
        self, 
        name: str, 
        plugin_class: Type[ConverterPlugin]
    )) -> None:
    def unregister_plugin((self, name: str)) -> bool:

def __init__((self)) -> None:

def _discover_plugins((self)) -> None:

def _validate_converter_plugin((self, plugin_class: Type[Any])) -> bool:

def get_converter_plugin((self, plugin_name: str)) -> Type[ConverterPlugin] | None:

def list_converter_plugins((self)) -> List[str]:

def get_plugins_for_format((self, source_format: str, target_format: str)) -> List[str]:

def convert((
        self,
        content: str,
        from_format: str,
        to_format: str,
        plugin_name: str | None = None,
        **options: Any,
    )) -> ConvertedContent:

def reload_plugins((self)) -> None:

def register_converter_plugin((
        self, 
        name: str, 
        plugin_class: Type[ConverterPlugin]
    )) -> None:

def unregister_plugin((self, name: str)) -> bool:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/providers/__init__.py
# Language: python

from .api_provider import ApiProvider
from .archive_provider import ArchiveProvider
from .hybrid_provider import HybridProvider
from .mock_provider import MockProvider


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/providers/api_provider.py
# Language: python

import asyncio
from datetime import datetime
from typing import Any, AsyncIterator
from urllib.parse import urljoin
from loguru import logger
from ..api.client import Document360ApiClient
from ..api.token_manager import TokenManager
from ..core.interfaces import DataProvider
from ..core.models import Article, Category, ProjectVersion
from ..http.client import UnifiedHttpClient

class ApiProvider:
    def __init__((
        self,
        tokens: list[str],
        base_url: str = "https://apidocs.document360.com",
        rate_limit: int = 60,
        **kwargs: Any,
    )) -> None:
    def get_article((self, article_id: int, **kwargs: Any)) -> Article:
    def list_articles((
        self,
        category_id: int | None = None,
        status: str | None = None,
        **kwargs: Any,
    )) -> list[Article]:
    def stream_articles((self, **kwargs: Any)) -> AsyncIterator[Article]:
    def get_category((self, category_id: int, **kwargs: Any)) -> Category:
    def list_categories((
        self,
        parent_id: int | None = None,
        **kwargs: Any
    )) -> list[Category]:
    def get_project_version((self, **kwargs: Any)) -> ProjectVersion:
    def _parse_datetime((self, date_str: str | None)) -> datetime | None:
    def get_statistics((self)) -> dict[str, Any]:
    def _get_http_stats((self)) -> dict[str, Any]:

def __init__((
        self,
        tokens: list[str],
        base_url: str = "https://apidocs.document360.com",
        rate_limit: int = 60,
        **kwargs: Any,
    )) -> None:

def get_article((self, article_id: int, **kwargs: Any)) -> Article:

def list_articles((
        self,
        category_id: int | None = None,
        status: str | None = None,
        **kwargs: Any,
    )) -> list[Article]:

def stream_articles((self, **kwargs: Any)) -> AsyncIterator[Article]:

def get_category((self, category_id: int, **kwargs: Any)) -> Category:

def list_categories((
        self,
        parent_id: int | None = None,
        **kwargs: Any
    )) -> list[Category]:

def get_project_version((self, **kwargs: Any)) -> ProjectVersion:

def _parse_datetime((self, date_str: str | None)) -> datetime | None:

def get_statistics((self)) -> dict[str, Any]:

def _get_http_stats((self)) -> dict[str, Any]:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/providers/archive_provider.py
# Language: python

from pathlib import Path
from typing import Any, AsyncIterator
from ..core.interfaces import DataProvider
from ..core.models import Article, Category, ProjectVersion
from ..archive.document360_parser import Document360Parser

class ArchiveProvider:
    def __init__((
        self,
        archive_path: str | Path,
        enable_fts: bool = True,
        cache_dir: str | Path | None = None,
        **kwargs: Any,
    )) -> None:
    def _ensure_parsed((self)) -> None:
    def get_articles((self, **kwargs: Any)) -> list[Article]:
    def get_categories((self, **kwargs: Any)) -> list[Category]:
    def get_article((self, article_id: int, **kwargs: Any)) -> Article:
    def list_articles((
        self,
        category_id: int | None = None,
        status: str | None = None,
        **kwargs: Any,
    )) -> list[Article]:
    def stream_articles((self, **kwargs: Any)) -> AsyncIterator[Article]:
    def get_category((self, category_id: int, **kwargs: Any)) -> Category:
    def list_categories((self, **kwargs: Any)) -> list[Category]:
    def get_project_version((self, **kwargs: Any)) -> ProjectVersion:
    def search_full_text((self, query: str, **kwargs: Any)) -> list[Article]:

def __init__((
        self,
        archive_path: str | Path,
        enable_fts: bool = True,
        cache_dir: str | Path | None = None,
        **kwargs: Any,
    )) -> None:

def _ensure_parsed((self)) -> None:

def get_articles((self, **kwargs: Any)) -> list[Article]:

def get_categories((self, **kwargs: Any)) -> list[Category]:

def get_article((self, article_id: int, **kwargs: Any)) -> Article:

def list_articles((
        self,
        category_id: int | None = None,
        status: str | None = None,
        **kwargs: Any,
    )) -> list[Article]:

def stream_articles((self, **kwargs: Any)) -> AsyncIterator[Article]:

def get_category((self, category_id: int, **kwargs: Any)) -> Category:

def list_categories((self, **kwargs: Any)) -> list[Category]:

def get_project_version((self, **kwargs: Any)) -> ProjectVersion:

def search_full_text((self, query: str, **kwargs: Any)) -> list[Article]:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/providers/hybrid_provider.py
# Language: python

import asyncio
from datetime import datetime, timedelta
from typing import Any, AsyncIterator, Dict, List, Optional, Union
from dataclasses import dataclass, field
from enum import Enum
from loguru import logger
from pydantic import BaseModel, Field
from ..core.interfaces import DataProvider
from ..core.models import Article, Category, ProjectVersion
from ..api.errors import Document360Error, ErrorCategory, ErrorSeverity
from .api_provider import ApiProvider
from .archive_provider import ArchiveProvider

class DataSource(s, t, r, ,,  , E, n, u, m):

class FreshnessRequirement(s, t, r, ,,  , E, n, u, m):

class SourceMetrics:

class DataRequest:

class HybridConfig(B, a, s, e, M, o, d, e, l):

class HybridProvider(D, a, t, a, P, r, o, v, i, d, e, r):
    def __init__((
        self,
        config: Optional[HybridConfig] = None,
        api_provider: Optional[ApiProvider] = None,
        archive_provider: Optional[ArchiveProvider] = None,
        scraper_provider: Optional[Any] = None,  # ScraperProvider when implemented
    )) -> None:
    def get_article((self, article_id: int, **kwargs: Any)) -> Article:
    def list_articles((
        self,
        category_id: Optional[int] = None,
        status: Optional[str] = None,
        **kwargs: Any,
    )) -> List[Article]:
    def stream_articles((self, **kwargs: Any)) -> AsyncIterator[Article]:
    def get_category((self, category_id: int, **kwargs: Any)) -> Category:
    def list_categories((self, **kwargs: Any)) -> List[Category]:
    def get_project_version((self, **kwargs: Any)) -> ProjectVersion:
    def _fetch_with_strategy((
        self, 
        request: DataRequest, 
        fetch_func: Any
    )) -> Any:
    def _fetch_parallel((
        self,
        request: DataRequest,
        fetch_func: Any,
        sources: List[DataSource]
    )) -> Any:
    def _fetch_sequential((
        self,
        request: DataRequest,
        fetch_func: Any,
        sources: List[DataSource]
    )) -> Any:
    def _fetch_from_source_with_metrics((
        self,
        source: DataSource,
        request: DataRequest,
        fetch_func: Any
    )) -> Any:
    def _determine_source_priority((
        self,
        freshness: FreshnessRequirement,
        preferred: List[DataSource] = None,
        fallback: List[DataSource] = None
    )) -> List[DataSource]:
    def _is_source_available((self, source: DataSource)) -> bool:
    def _source_meets_freshness((self, source: DataSource, freshness: FreshnessRequirement)) -> bool:
    def _get_cached_data((self, request: DataRequest)) -> Optional[Any]:
    def _cache_data((self, request: DataRequest, data: Any)) -> None:
    def _fetch_article_from_source((self, source: DataSource, request: DataRequest)) -> Article:
    def _fetch_articles_list_from_source((
        self,
        source: DataSource,
        request: DataRequest,
        category_id: Optional[int],
        status: Optional[str],
        **kwargs: Any
    )) -> List[Article]:
    def _fetch_category_from_source((self, source: DataSource, request: DataRequest)) -> Category:
    def _fetch_categories_list_from_source((self, source: DataSource, request: DataRequest)) -> List[Category]:
    def _fetch_project_version_from_source((self, source: DataSource, request: DataRequest)) -> ProjectVersion:
    def _stream_from_source((self, source: DataSource, **kwargs: Any)) -> AsyncIterator[Article]:
    def get_source_metrics((self)) -> Dict[DataSource, SourceMetrics]:
    def clear_cache((self)) -> None:

def __init__((
        self,
        config: Optional[HybridConfig] = None,
        api_provider: Optional[ApiProvider] = None,
        archive_provider: Optional[ArchiveProvider] = None,
        scraper_provider: Optional[Any] = None,  # ScraperProvider when implemented
    )) -> None:

def get_article((self, article_id: int, **kwargs: Any)) -> Article:

def list_articles((
        self,
        category_id: Optional[int] = None,
        status: Optional[str] = None,
        **kwargs: Any,
    )) -> List[Article]:

def stream_articles((self, **kwargs: Any)) -> AsyncIterator[Article]:

def get_category((self, category_id: int, **kwargs: Any)) -> Category:

def list_categories((self, **kwargs: Any)) -> List[Category]:

def get_project_version((self, **kwargs: Any)) -> ProjectVersion:

def _fetch_with_strategy((
        self, 
        request: DataRequest, 
        fetch_func: Any
    )) -> Any:

def _fetch_parallel((
        self,
        request: DataRequest,
        fetch_func: Any,
        sources: List[DataSource]
    )) -> Any:

def _fetch_sequential((
        self,
        request: DataRequest,
        fetch_func: Any,
        sources: List[DataSource]
    )) -> Any:

def _fetch_from_source_with_metrics((
        self,
        source: DataSource,
        request: DataRequest,
        fetch_func: Any
    )) -> Any:

def _determine_source_priority((
        self,
        freshness: FreshnessRequirement,
        preferred: List[DataSource] = None,
        fallback: List[DataSource] = None
    )) -> List[DataSource]:

def _is_source_available((self, source: DataSource)) -> bool:

def _source_meets_freshness((self, source: DataSource, freshness: FreshnessRequirement)) -> bool:

def _get_cached_data((self, request: DataRequest)) -> Optional[Any]:

def _cache_data((self, request: DataRequest, data: Any)) -> None:

def _fetch_article_from_source((self, source: DataSource, request: DataRequest)) -> Article:

def _fetch_articles_list_from_source((
        self,
        source: DataSource,
        request: DataRequest,
        category_id: Optional[int],
        status: Optional[str],
        **kwargs: Any
    )) -> List[Article]:

def _fetch_category_from_source((self, source: DataSource, request: DataRequest)) -> Category:

def _fetch_categories_list_from_source((self, source: DataSource, request: DataRequest)) -> List[Category]:

def _fetch_project_version_from_source((self, source: DataSource, request: DataRequest)) -> ProjectVersion:

def _stream_from_source((self, source: DataSource, **kwargs: Any)) -> AsyncIterator[Article]:

def get_source_metrics((self)) -> Dict[DataSource, SourceMetrics]:

def clear_cache((self)) -> None:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/providers/mock_provider.py
# Language: python

import asyncio
from datetime import datetime
from typing import Any, AsyncIterator
from ..core.interfaces import DataProvider
from ..core.models import Article, Category, ProjectVersion, PublishStatus
import random

class MockProvider:
    def __init__((
        self,
        simulate_delays: bool = False,
        delay_ms: int = 100,
        fail_probability: float = 0.0,
        **kwargs: Any,
    )) -> None:
    def get_article((self, article_id: int, **kwargs: Any)) -> Article:
    def list_articles((
        self,
        category_id: int | None = None,
        status: str | None = None,
        **kwargs: Any,
    )) -> list[Article]:
    def stream_articles((self, **kwargs: Any)) -> AsyncIterator[Article]:
    def get_category((self, category_id: int, **kwargs: Any)) -> Category:
    def list_categories((self, **kwargs: Any)) -> list[Category]:
    def get_project_version((self, **kwargs: Any)) -> ProjectVersion:
    def get_articles((self, **kwargs: Any)) -> list[Article]:
    def get_categories((self, **kwargs: Any)) -> list[Category]:
    def _generate_mock_articles((self)) -> list[Article]:
    def _generate_mock_categories((self)) -> list[Category]:
    def _generate_mock_project((self)) -> ProjectVersion:
    def _simulate_operation((self)) -> None:

def __init__((
        self,
        simulate_delays: bool = False,
        delay_ms: int = 100,
        fail_probability: float = 0.0,
        **kwargs: Any,
    )) -> None:

def get_article((self, article_id: int, **kwargs: Any)) -> Article:

def list_articles((
        self,
        category_id: int | None = None,
        status: str | None = None,
        **kwargs: Any,
    )) -> list[Article]:

def stream_articles((self, **kwargs: Any)) -> AsyncIterator[Article]:

def get_category((self, category_id: int, **kwargs: Any)) -> Category:

def list_categories((self, **kwargs: Any)) -> list[Category]:

def get_project_version((self, **kwargs: Any)) -> ProjectVersion:

def get_articles((self, **kwargs: Any)) -> list[Article]:

def get_categories((self, **kwargs: Any)) -> list[Category]:

def _generate_mock_articles((self)) -> list[Article]:

def _generate_mock_categories((self)) -> list[Category]:

def _generate_mock_project((self)) -> ProjectVersion:

def _simulate_operation((self)) -> None:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/scraping/__init__.py
# Language: python

from .scraper import (
    Document360Scraper, ScrapingConfig, ScrapedPage, ScrapingSession,
    BrowserType, ScrapingMode, UserAgent
)
from .extractor import (
    ContentExtractor, ExtractionConfig, ExtractedContent, ContentBlock,
    ContentType, ExtractionQuality
)
from .converter import (
    MarkdownConverter, ConversionConfig, ConversionResult, ConversionStats,
    MarkdownStyle, LinkHandling, Document360MarkdownConverter
)
from .deduplicator import (
    ContentDeduplicator, DeduplicationConfig, DuplicateStatus, SimilarityScore,
    SimilarityAlgorithm, DuplicateGroup
)
from .content_processor import ContentProcessor, Document360ContentProcessor


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/scraping/content_processor.py
# Language: python

import asyncio
import re
from concurrent.futures import ThreadPoolExecutor, as_completed
from datetime import datetime
from pathlib import Path
from typing import Any, Optional
from urllib.parse import unquote, urlparse
from loguru import logger
from ..core.models import Article, Category
from ..core.interfaces import DataProvider
from .converter import Document360MarkdownConverter, ConversionConfig
from .deduplicator import ContentDeduplicator, DeduplicationConfig

class ContentProcessor:
    def __init__((self, image_base_url: str | None = None)) -> None:
    def clean_content((self, content: str)) -> str:
    def convert_image_urls((self, content: str)) -> str:
    def clean_slug((self, slug: str)) -> str:
    def strip_numeric_prefix((self, text: str)) -> str:
    def extract_metadata_from_content((self, content: str)) -> dict[str, Any]:
    def _remove_d360_artifacts((self, content: str)) -> str:
    def _normalize_whitespace((self, content: str)) -> str:
    def _clean_markdown_formatting((self, content: str)) -> str:
    def analyze_content_quality((self, content: str)) -> dict[str, Any]:

class Document360ContentProcessor(C, o, n, t, e, n, t, P, r, o, c, e, s, s, o, r):
    def __init__((self, image_base_url: str | None = None, max_workers: int = 4)):
    def load_and_merge_content((
        self,
        archive_provider: Optional[DataProvider] = None,
        api_provider: Optional[DataProvider] = None,
        data_source: str = "hybrid"
    )) -> tuple[list[Article], list[Category]]:
    def _merge_content_intelligently((
        self, 
        archive_provider: DataProvider, 
        api_provider: DataProvider
    )) -> tuple[list[Article], list[Category]]:
    def _merge_articles_with_conflict_resolution((
        self, 
        archive_articles: list[Article], 
        api_articles: list[Article]
    )) -> list[Article]:
    def _merge_categories_with_conflict_resolution((
        self,
        archive_categories: list[Category],
        api_categories: list[Category]
    )) -> list[Category]:
    def _merge_single_article((self, archive_article: Article, api_article: Article)) -> Article:
    def _merge_single_category((self, archive_category: Category, api_category: Category)) -> Category:
    def enhance_content_with_advanced_processing((
        self, 
        articles: list[Article],
        use_parallel: bool = True
    )) -> list[Article]:
    def _enhance_content_sequential((self, articles: list[Article])) -> list[Article]:
    def _enhance_content_parallel((self, articles: list[Article])) -> list[Article]:
    def _enhance_single_article_sync((self, article: Article)) -> Article:
    def _enhance_single_article_content((self, article: Article)) -> Article:
    def _content_needs_advanced_processing((self, content: str)) -> bool:
    def resolve_duplicates_with_advanced_detection((
        self, 
        articles: list[Article]
    )) -> list[Article]:
    def _process_duplicate_detection_results((
        self, 
        original_articles: list[Article],
        duplicate_groups: list, 
        article_map: dict
    )) -> list[Article]:
    def _merge_similar_article_metadata((
        self, 
        primary_article: Article, 
        similar_articles: list[Article], 
        similarity_score: float
    )) -> Article:
    def get_processing_statistics((self)) -> dict[str, Any]:
    def reset_statistics((self)) -> None:

def __init__((self, image_base_url: str | None = None)) -> None:

def clean_content((self, content: str)) -> str:

def convert_image_urls((self, content: str)) -> str:

def replace_image_url((match)):

def clean_slug((self, slug: str)) -> str:

def strip_numeric_prefix((self, text: str)) -> str:

def extract_metadata_from_content((self, content: str)) -> dict[str, Any]:

def _remove_d360_artifacts((self, content: str)) -> str:

def _normalize_whitespace((self, content: str)) -> str:

def _clean_markdown_formatting((self, content: str)) -> str:

def analyze_content_quality((self, content: str)) -> dict[str, Any]:

def __init__((self, image_base_url: str | None = None, max_workers: int = 4)):

def load_and_merge_content((
        self,
        archive_provider: Optional[DataProvider] = None,
        api_provider: Optional[DataProvider] = None,
        data_source: str = "hybrid"
    )) -> tuple[list[Article], list[Category]]:

def _merge_content_intelligently((
        self, 
        archive_provider: DataProvider, 
        api_provider: DataProvider
    )) -> tuple[list[Article], list[Category]]:

def _merge_articles_with_conflict_resolution((
        self, 
        archive_articles: list[Article], 
        api_articles: list[Article]
    )) -> list[Article]:

def _merge_categories_with_conflict_resolution((
        self,
        archive_categories: list[Category],
        api_categories: list[Category]
    )) -> list[Category]:

def _merge_single_article((self, archive_article: Article, api_article: Article)) -> Article:

def _merge_single_category((self, archive_category: Category, api_category: Category)) -> Category:

def enhance_content_with_advanced_processing((
        self, 
        articles: list[Article],
        use_parallel: bool = True
    )) -> list[Article]:

def _enhance_content_sequential((self, articles: list[Article])) -> list[Article]:

def _enhance_content_parallel((self, articles: list[Article])) -> list[Article]:

def _enhance_single_article_sync((self, article: Article)) -> Article:

def _enhance_single_article_content((self, article: Article)) -> Article:

def _content_needs_advanced_processing((self, content: str)) -> bool:

def resolve_duplicates_with_advanced_detection((
        self, 
        articles: list[Article]
    )) -> list[Article]:

def _process_duplicate_detection_results((
        self, 
        original_articles: list[Article],
        duplicate_groups: list, 
        article_map: dict
    )) -> list[Article]:

def _merge_similar_article_metadata((
        self, 
        primary_article: Article, 
        similar_articles: list[Article], 
        similarity_score: float
    )) -> Article:

def get_processing_statistics((self)) -> dict[str, Any]:

def reset_statistics((self)) -> None:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/scraping/converter.py
# Language: python

import re
from datetime import datetime
from pathlib import Path
from typing import Any, Dict, List, Optional, Set, Callable, Union
from dataclasses import dataclass, field
from enum import Enum
from urllib.parse import urljoin, urlparse
from loguru import logger
from pydantic import BaseModel, Field, validator
from bs4 import BeautifulSoup, Tag
import markdownify
from markdownify import MarkdownConverter as BaseMarkdownConverter
from ..api.errors import Document360Error, ErrorCategory, ErrorSeverity

class MarkdownStyle(s, t, r, ,,  , E, n, u, m):

class LinkHandling(s, t, r, ,,  , E, n, u, m):

class ConversionStats:

class ConversionConfig(B, a, s, e, M, o, d, e, l):

class ConversionResult:

class Document360MarkdownConverter(B, a, s, e, M, a, r, k, d, o, w, n, C, o, n, v, e, r, t, e, r):
    def __init__((self, **options)):
    def convert_hn((self, n, el, text, convert_as_inline)):
    def convert_code((self, el, text, convert_as_inline)):
    def convert_pre((self, el, text, convert_as_inline)):
    def convert_table((self, el, text, convert_as_inline)):
    def convert_img((self, el, text, convert_as_inline)):
    def convert_a((self, el, text, convert_as_inline)):

class MarkdownConverter:
    def __init__((self, config: Optional[ConversionConfig] = None)):
    def convert((self, html: str, title: Optional[str] = None)) -> ConversionResult:
    def _preprocess_html((self, soup: BeautifulSoup, stats: ConversionStats)) -> BeautifulSoup:
    def _normalize_whitespace((self, soup: BeautifulSoup)) -> None:
    def _enhance_code_blocks((self, soup: BeautifulSoup, stats: ConversionStats)) -> None:
    def _detect_code_language((self, element: Tag)) -> Optional[str]:
    def _postprocess_markdown((self, markdown: str, stats: ConversionStats)) -> str:
    def _fix_list_formatting((self, markdown: str)) -> str:
    def _fix_table_formatting((self, markdown: str)) -> str:
    def _wrap_lines((self, markdown: str, max_length: int)) -> str:
    def _validate_markdown((self, markdown: str)) -> List[str]:
    def _extract_images((self, soup: BeautifulSoup)) -> List[Dict[str, str]]:
    def _extract_links((self, soup: BeautifulSoup)) -> List[Dict[str, str]]:
    def _assess_conversion_quality((self, html: str, markdown: str, stats: ConversionStats)) -> float:
    def _get_converter_options((self)) -> Dict[str, Any]:

def is_high_quality((self)) -> bool:

def compression_ratio((self)) -> float:

def __init__((self, **options)):

def convert_hn((self, n, el, text, convert_as_inline)):

def convert_code((self, el, text, convert_as_inline)):

def convert_pre((self, el, text, convert_as_inline)):

def convert_table((self, el, text, convert_as_inline)):

def convert_img((self, el, text, convert_as_inline)):

def convert_a((self, el, text, convert_as_inline)):

def __init__((self, config: Optional[ConversionConfig] = None)):

def convert((self, html: str, title: Optional[str] = None)) -> ConversionResult:

def _preprocess_html((self, soup: BeautifulSoup, stats: ConversionStats)) -> BeautifulSoup:

def _normalize_whitespace((self, soup: BeautifulSoup)) -> None:

def _enhance_code_blocks((self, soup: BeautifulSoup, stats: ConversionStats)) -> None:

def _detect_code_language((self, element: Tag)) -> Optional[str]:

def _postprocess_markdown((self, markdown: str, stats: ConversionStats)) -> str:

def _fix_list_formatting((self, markdown: str)) -> str:

def _fix_table_formatting((self, markdown: str)) -> str:

def _wrap_lines((self, markdown: str, max_length: int)) -> str:

def _validate_markdown((self, markdown: str)) -> List[str]:

def _extract_images((self, soup: BeautifulSoup)) -> List[Dict[str, str]]:

def _extract_links((self, soup: BeautifulSoup)) -> List[Dict[str, str]]:

def _assess_conversion_quality((self, html: str, markdown: str, stats: ConversionStats)) -> float:

def _get_converter_options((self)) -> Dict[str, Any]:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/scraping/deduplicator.py
# Language: python

import hashlib
import re
from datetime import datetime
from typing import Any, Dict, List, Optional, Set, Tuple, Union
from dataclasses import dataclass, field
from enum import Enum
from loguru import logger
from pydantic import BaseModel, Field, validator
from ..api.errors import Document360Error, ErrorCategory, ErrorSeverity
import random

class DuplicateStatus(s, t, r, ,,  , E, n, u, m):

class SimilarityAlgorithm(s, t, r, ,,  , E, n, u, m):

class SimilarityScore:

class DuplicateGroup:

class DeduplicationConfig(B, a, s, e, M, o, d, e, l):

class ContentDeduplicator:
    def __init__((self, config: Optional[DeduplicationConfig] = None)):
    def find_duplicates((
        self, 
        content_items: Dict[str, str],
        return_groups: bool = True
    )) -> Union[List[DuplicateGroup], Dict[str, DuplicateStatus]]:
    def calculate_similarity((
        self, 
        content1: str, 
        content2: str,
        algorithm: Optional[SimilarityAlgorithm] = None
    )) -> SimilarityScore:
    def _cache_normalized_content((self, content_items: Dict[str, str])) -> None:
    def _normalize_content((self, content: str)) -> str:
    def _find_similar_pairs((self, content_items: Dict[str, str])) -> List[Tuple[str, str, float]]:
    def _verify_with_secondary_algorithms((
        self, 
        similar_pairs: List[Tuple[str, str, float]],
        content_items: Dict[str, str]
    )) -> List[Tuple[str, str, float]]:
    def _group_duplicates((self, similar_pairs: List[Tuple[str, str, float]])) -> List[DuplicateGroup]:
    def _create_status_dict((
        self, 
        duplicate_groups: List[DuplicateGroup],
        content_items: Dict[str, str]
    )) -> Dict[str, DuplicateStatus]:
    def _exact_hash_similarity((self, content1: str, content2: str)) -> float:
    def _content_hash_similarity((self, content1: str, content2: str)) -> float:
    def _jaccard_similarity((self, content1: str, content2: str)) -> float:
    def _shingle_similarity((self, content1: str, content2: str)) -> float:
    def _levenshtein_similarity((self, content1: str, content2: str)) -> float:
    def clear_cache((self)) -> None:

def is_duplicate((self)) -> bool:

def is_similar((self)) -> bool:

def size((self)) -> int:

def average_similarity((self)) -> float:

def __init__((self, config: Optional[DeduplicationConfig] = None)):

def find_duplicates((
        self, 
        content_items: Dict[str, str],
        return_groups: bool = True
    )) -> Union[List[DuplicateGroup], Dict[str, DuplicateStatus]]:

def calculate_similarity((
        self, 
        content1: str, 
        content2: str,
        algorithm: Optional[SimilarityAlgorithm] = None
    )) -> SimilarityScore:

def _cache_normalized_content((self, content_items: Dict[str, str])) -> None:

def _normalize_content((self, content: str)) -> str:

def _find_similar_pairs((self, content_items: Dict[str, str])) -> List[Tuple[str, str, float]]:

def _verify_with_secondary_algorithms((
        self, 
        similar_pairs: List[Tuple[str, str, float]],
        content_items: Dict[str, str]
    )) -> List[Tuple[str, str, float]]:

def _group_duplicates((self, similar_pairs: List[Tuple[str, str, float]])) -> List[DuplicateGroup]:

def find((x)):

def union((x, y)):

def _create_status_dict((
        self, 
        duplicate_groups: List[DuplicateGroup],
        content_items: Dict[str, str]
    )) -> Dict[str, DuplicateStatus]:

def _exact_hash_similarity((self, content1: str, content2: str)) -> float:

def _content_hash_similarity((self, content1: str, content2: str)) -> float:

def _jaccard_similarity((self, content1: str, content2: str)) -> float:

def _shingle_similarity((self, content1: str, content2: str)) -> float:

def get_shingles((text: str, k: int)) -> Set[str]:

def _levenshtein_similarity((self, content1: str, content2: str)) -> float:

def clear_cache((self)) -> None:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/scraping/extractor.py
# Language: python

import re
from datetime import datetime
from pathlib import Path
from typing import Any, Dict, List, Optional, Set, Union
from dataclasses import dataclass, field
from enum import Enum
from urllib.parse import urljoin, urlparse
from loguru import logger
from pydantic import BaseModel, Field, validator
from bs4 import BeautifulSoup, Tag, NavigableString
from bs4.formatter import HTMLFormatter
from ..api.errors import Document360Error, ErrorCategory, ErrorSeverity

class ContentType(s, t, r, ,,  , E, n, u, m):

class ExtractionQuality(s, t, r, ,,  , E, n, u, m):

class ContentBlock:

class ExtractionConfig(B, a, s, e, M, o, d, e, l):

class ExtractedContent:

class ContentExtractor:
    def __init__((self, config: Optional[ExtractionConfig] = None)):
    def extract((self, html: str, url: str)) -> ExtractedContent:
    def _clean_html((self, soup: BeautifulSoup)) -> None:
    def _extract_title((self, soup: BeautifulSoup)) -> str:
    def _extract_article_content((self, soup: BeautifulSoup)) -> Optional[Tag]:
    def _extract_text((self, element: Tag)) -> str:
    def _detect_content_type((self, title: str, content: str, soup: BeautifulSoup)) -> ContentType:
    def _assess_quality((self, title: str, content: str, soup: BeautifulSoup)) -> tuple[ExtractionQuality, float]:
    def _extract_metadata((self, soup: BeautifulSoup, url: str)) -> Dict[str, Any]:
    def _parse_date((self, date_string: str)) -> Optional[datetime]:
    def _extract_headings((self, element: Tag)) -> List[Dict[str, str]]:
    def _extract_content_blocks((self, element: Tag)) -> List[ContentBlock]:
    def _extract_links((self, soup: BeautifulSoup, base_url: str)) -> List[Dict[str, str]]:
    def _extract_images((self, soup: BeautifulSoup, base_url: str)) -> List[Dict[str, str]]:
    def _detect_language((self, content: str)) -> Optional[str]:

def is_significant((self)) -> bool:

def is_high_quality((self)) -> bool:

def summary((self)) -> str:

def __init__((self, config: Optional[ExtractionConfig] = None)):

def extract((self, html: str, url: str)) -> ExtractedContent:

def _clean_html((self, soup: BeautifulSoup)) -> None:

def _extract_title((self, soup: BeautifulSoup)) -> str:

def _extract_article_content((self, soup: BeautifulSoup)) -> Optional[Tag]:

def _extract_text((self, element: Tag)) -> str:

def _detect_content_type((self, title: str, content: str, soup: BeautifulSoup)) -> ContentType:

def _assess_quality((self, title: str, content: str, soup: BeautifulSoup)) -> tuple[ExtractionQuality, float]:

def _extract_metadata((self, soup: BeautifulSoup, url: str)) -> Dict[str, Any]:

def _parse_date((self, date_string: str)) -> Optional[datetime]:

def _extract_headings((self, element: Tag)) -> List[Dict[str, str]]:

def _extract_content_blocks((self, element: Tag)) -> List[ContentBlock]:

def _extract_links((self, soup: BeautifulSoup, base_url: str)) -> List[Dict[str, str]]:

def _extract_images((self, soup: BeautifulSoup, base_url: str)) -> List[Dict[str, str]]:

def _detect_language((self, content: str)) -> Optional[str]:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/scraping/scraper.py
# Language: python

import asyncio
import random
import time
from datetime import datetime, timedelta
from pathlib import Path
from typing import Any, Dict, List, Optional, Set, Union, AsyncIterator
from urllib.parse import urljoin, urlparse
from dataclasses import dataclass, field
from enum import Enum
from loguru import logger
from pydantic import BaseModel, Field, validator
from playwright.async_api import async_playwright, Browser, BrowserContext, Page
from ..api.errors import Document360Error, ErrorCategory, ErrorSeverity

class BrowserType(s, t, r, ,,  , E, n, u, m):

class ScrapingMode(s, t, r, ,,  , E, n, u, m):

class UserAgent:

class ScrapingConfig(B, a, s, e, M, o, d, e, l):

class ScrapedPage:

class ScrapingSession(B, a, s, e, M, o, d, e, l):

class Document360Scraper:
    def __init__((self, config: Optional[ScrapingConfig] = None)):
    def start((self)) -> None:
    def stop((self)) -> None:
    def scrape_url((self, url: str)) -> ScrapedPage:
    def scrape_multiple((self, urls: List[str])) -> List[ScrapedPage]:
    def _respect_rate_limits((self, url: str)) -> None:
    def _get_random_user_agent((self)) -> UserAgent:
    def _configure_page((self, page: Page)) -> None:
    def _setup_ad_blocking((self)) -> None:
    def _block_requests((self, route, request)) -> None:
    def _dismiss_cookie_banners((self, page: Page)) -> None:
    def _extract_page_content((
        self, 
        page: Page, 
        url: str, 
        load_time_ms: float,
        status_code: int
    )) -> ScrapedPage:
    def _save_screenshot((self, page: Page, url: str)) -> Path:
    def get_session_stats((self)) -> Optional[ScrapingSession]:
    def __aenter__((self)):
    def __aexit__((self, exc_type, exc_val, exc_tb)):

def success_rate((self)) -> float:

def duration_seconds((self)) -> float:

def __init__((self, config: Optional[ScrapingConfig] = None)):

def start((self)) -> None:

def stop((self)) -> None:

def scrape_url((self, url: str)) -> ScrapedPage:

def scrape_multiple((self, urls: List[str])) -> List[ScrapedPage]:

def scrape_with_semaphore((url: str)) -> ScrapedPage:

def _respect_rate_limits((self, url: str)) -> None:

def _get_random_user_agent((self)) -> UserAgent:

def _configure_page((self, page: Page)) -> None:

def _setup_ad_blocking((self)) -> None:

def _block_requests((self, route, request)) -> None:

def _dismiss_cookie_banners((self, page: Page)) -> None:

def _extract_page_content((
        self, 
        page: Page, 
        url: str, 
        load_time_ms: float,
        status_code: int
    )) -> ScrapedPage:

def _save_screenshot((self, page: Page, url: str)) -> Path:

def get_session_stats((self)) -> Optional[ScrapingSession]:

def __aenter__((self)):

def __aexit__((self, exc_type, exc_val, exc_tb)):


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/utils/__init__.py
# Language: python

from .logging import (
    LogLevel,
    LogFormat,
    LogContext,
    LoggingManager,
    LoggingConfig,
    LogHandlerConfig,
    get_logging_manager,
    get_logger,
    setup_logging,
    setup_development_logging,
    setup_production_logging,
    set_correlation_id,
    set_user_id,
    set_request_id,
    clear_log_context,
)
from .dependency_injection import (
    ServiceLifecycle,
    ServiceContainer,
    ServiceDescriptor,
    ServiceScope,
    ServiceError,
    ServiceNotFoundError,
    CircularDependencyError,
    ServiceRegistrationError,
    injectable,
    get_container,
    set_container,
    resolve,
    register_singleton,
    register_transient,
    register_scoped,
)
from .performance import (
    CacheStrategy,
    BatchStrategy,
    CacheConfig,
    BatchConfig,
    PerformanceMetrics,
    AsyncCache,
    BatchProcessor,
    PerformanceOptimizer,
    get_optimizer,
    set_optimizer,
    async_cache,
    batch_processor,
    performance_monitor,
)
from .validation import (
    ValidationException,
    ValidationHelper,
    MigrationHelper,
    ValidatedBaseModel,
    validate_url_field,
    validate_email_field,
    validate_slug_field,
    validate_api_token_field,
    validate_function_inputs,
)


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/utils/dependency_injection.py
# Language: python

import inspect
import threading
from contextlib import contextmanager
from dataclasses import dataclass, field
from enum import Enum
from functools import wraps
from typing import Any, Callable, Dict, List, Optional, Type, TypeVar, Union, get_origin, get_args
from loguru import logger

T = =

class ServiceLifecycle(s, t, r, ,,  , E, n, u, m):

class ServiceError(E, x, c, e, p, t, i, o, n):

class ServiceNotFoundError(S, e, r, v, i, c, e, E, r, r, o, r):

class CircularDependencyError(S, e, r, v, i, c, e, E, r, r, o, r):

class ServiceRegistrationError(S, e, r, v, i, c, e, E, r, r, o, r):

class ServiceDescriptor:
    def __post_init__((self)):
    def _extract_dependencies((self, cls: Type)) -> List[Type]:

class ServiceScope:
    def __init__((self, name: str = "default")):
    def get_instance((self, service_type: Type)) -> Optional[Any]:
    def set_instance((self, service_type: Type, instance: Any)) -> None:
    def clear((self)) -> None:

class ServiceContainer:
    def __init__((self)):
    def register_singleton((
        self, 
        service_type: Type[T], 
        implementation: Union[Type[T], T, Callable[..., T]], 
        factory: Optional[Callable] = None
    )) -> ServiceContainer:
    def register_transient((
        self, 
        service_type: Type[T], 
        implementation: Union[Type[T], Callable[..., T]], 
        factory: Optional[Callable] = None
    )) -> ServiceContainer:
    def register_scoped((
        self, 
        service_type: Type[T], 
        implementation: Union[Type[T], Callable[..., T]], 
        factory: Optional[Callable] = None
    )) -> ServiceContainer:
    def _register((
        self, 
        service_type: Type[T], 
        implementation: Union[Type[T], T, Callable[..., T]], 
        lifecycle: ServiceLifecycle, 
        factory: Optional[Callable] = None
    )) -> ServiceContainer:
    def resolve((self, service_type: Type[T])) -> T:
    def _resolve((self, service_type: Type[T], resolving_stack: set)) -> T:
    def _create_instance((self, descriptor: ServiceDescriptor, resolving_stack: set)) -> Any:
    def _resolve_dependencies((self, func: Callable, resolving_stack: set)) -> Dict[str, Any]:
    def is_registered((self, service_type: Type)) -> bool:
    def get_registered_services((self)) -> List[Type]:
    def clear_scope((self, scope_name: str = None)) -> None:

def __post_init__((self)):

def _extract_dependencies((self, cls: Type)) -> List[Type]:

def __init__((self, name: str = "default")):

def get_instance((self, service_type: Type)) -> Optional[Any]:

def set_instance((self, service_type: Type, instance: Any)) -> None:

def clear((self)) -> None:

def __init__((self)):

def register_singleton((
        self, 
        service_type: Type[T], 
        implementation: Union[Type[T], T, Callable[..., T]], 
        factory: Optional[Callable] = None
    )) -> ServiceContainer:

def register_transient((
        self, 
        service_type: Type[T], 
        implementation: Union[Type[T], Callable[..., T]], 
        factory: Optional[Callable] = None
    )) -> ServiceContainer:

def register_scoped((
        self, 
        service_type: Type[T], 
        implementation: Union[Type[T], Callable[..., T]], 
        factory: Optional[Callable] = None
    )) -> ServiceContainer:

def _register((
        self, 
        service_type: Type[T], 
        implementation: Union[Type[T], T, Callable[..., T]], 
        lifecycle: ServiceLifecycle, 
        factory: Optional[Callable] = None
    )) -> ServiceContainer:

def resolve((self, service_type: Type[T])) -> T:

def _resolve((self, service_type: Type[T], resolving_stack: set)) -> T:

def _create_instance((self, descriptor: ServiceDescriptor, resolving_stack: set)) -> Any:

def _resolve_dependencies((self, func: Callable, resolving_stack: set)) -> Dict[str, Any]:

def is_registered((self, service_type: Type)) -> bool:

def get_registered_services((self)) -> List[Type]:

def scope((self, scope_name: str = None)):

def clear_scope((self, scope_name: str = None)) -> None:

def get_container(()) -> ServiceContainer:

def set_container((container: ServiceContainer)) -> None:

def injectable((
    service_type: Optional[Type] = None,
    lifecycle: ServiceLifecycle = ServiceLifecycle.TRANSIENT,
    container: Optional[ServiceContainer] = None,
)) -> Callable[[Type[T]], Type[T]]:

def decorator((cls: Type[T])) -> Type[T]:

def resolve((service_type: Type[T], container: Optional[ServiceContainer] = None)) -> T:

def register_singleton((
    service_type: Type[T], 
    implementation: Union[Type[T], T, Callable[..., T]], 
    container: Optional[ServiceContainer] = None
)) -> None:

def register_transient((
    service_type: Type[T], 
    implementation: Union[Type[T], Callable[..., T]], 
    container: Optional[ServiceContainer] = None
)) -> None:

def register_scoped((
    service_type: Type[T], 
    implementation: Union[Type[T], Callable[..., T]], 
    container: Optional[ServiceContainer] = None
)) -> None:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/utils/logging.py
# Language: python

import json
import sys
from contextvars import ContextVar
from dataclasses import dataclass, field
from enum import Enum
from pathlib import Path
from typing import Any, Dict, List, Optional, Union
from loguru import logger
from pydantic import BaseModel, Field

class LogLevel(s, t, r, ,,  , E, n, u, m):

class LogFormat(s, t, r, ,,  , E, n, u, m):

class LogHandlerConfig(B, a, s, e, M, o, d, e, l):

class LoggingConfig(B, a, s, e, M, o, d, e, l):

class LogContext:
    def to_dict((self)) -> Dict[str, Any]:

class LoggingManager:
    def __init__((self, config: Optional[LoggingConfig] = None)):
    def initialize((self)) -> None:
    def _add_handler((self, handler_config: LogHandlerConfig)) -> None:
    def _add_default_handlers((self)) -> None:
    def _get_format((self)) -> str:
    def _get_console_format((self)) -> str:
    def _get_json_format((self)) -> str:
    def _get_structured_format((self)) -> str:
    def _configure_correlation((self)) -> None:
    def set_level((self, level: LogLevel)) -> None:
    def add_handler((
        self,
        sink: Union[str, object],
        level: LogLevel = LogLevel.INFO,
        format_type: Optional[LogFormat] = None,
        **kwargs,
    )) -> None:
    def _format_for_type((self, format_type: LogFormat)) -> str:
    def create_context((
        self,
        correlation_id: str = "",
        user_id: str = "",
        request_id: str = "",
        **kwargs,
    )) -> LogContext:
    def set_context((self, context: LogContext)) -> None:
    def clear_context((self)) -> None:
    def get_logger((self, name: str)) -> object:
    def shutdown((self)) -> None:

def to_dict((self)) -> Dict[str, Any]:

def __init__((self, config: Optional[LoggingConfig] = None)):

def initialize((self)) -> None:

def _add_handler((self, handler_config: LogHandlerConfig)) -> None:

def _add_default_handlers((self)) -> None:

def _get_format((self)) -> str:

def _get_console_format((self)) -> str:

def _get_json_format((self)) -> str:

def _get_structured_format((self)) -> str:

def _configure_correlation((self)) -> None:

def correlation_filter((record)):

def set_level((self, level: LogLevel)) -> None:

def add_handler((
        self,
        sink: Union[str, object],
        level: LogLevel = LogLevel.INFO,
        format_type: Optional[LogFormat] = None,
        **kwargs,
    )) -> None:

def _format_for_type((self, format_type: LogFormat)) -> str:

def create_context((
        self,
        correlation_id: str = "",
        user_id: str = "",
        request_id: str = "",
        **kwargs,
    )) -> LogContext:

def set_context((self, context: LogContext)) -> None:

def clear_context((self)) -> None:

def get_logger((self, name: str)) -> object:

def shutdown((self)) -> None:

def get_logging_manager(()) -> LoggingManager:

def setup_logging((
    level: LogLevel = LogLevel.INFO,
    format_type: LogFormat = LogFormat.CONSOLE,
    log_file: Optional[Path] = None,
    enable_correlation: bool = True,
)) -> LoggingManager:

def get_logger((name: str)) -> object:

def set_correlation_id((correlation_id: str)) -> None:

def set_user_id((user_id: str)) -> None:

def set_request_id((request_id: str)) -> None:

def clear_log_context(()) -> None:

def setup_development_logging((log_file: Optional[Path] = None)) -> LoggingManager:

def setup_production_logging((log_file: Path)) -> LoggingManager:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/utils/performance.py
# Language: python

import asyncio
import functools
import hashlib
import inspect
import json
import time
from collections import defaultdict, deque
from concurrent.futures import ThreadPoolExecutor
from contextlib import asynccontextmanager
from dataclasses import dataclass, field
from enum import Enum
from pathlib import Path
from typing import Any, Callable, Dict, List, Optional, Set, Tuple, TypeVar, Union
from weakref import WeakKeyDictionary
import diskcache
from loguru import logger
from pydantic import BaseModel, Field
import psutil
import psutil

T = =
F = =

class CacheStrategy(s, t, r, ,,  , E, n, u, m):

class BatchStrategy(s, t, r, ,,  , E, n, u, m):

class CacheConfig:
    def __post_init__((self)):

class BatchConfig:

class PerformanceMetrics:
    def add_processing_time((self, duration: float)) -> None:

class AsyncCache:
    def __init__((self, config: CacheConfig)):
    def get((self, key: str)) -> Optional[Any]:
    def set((self, key: str, value: Any, timeout: Optional[float] = None)) -> None:
    def delete((self, key: str)) -> bool:
    def clear((self)) -> None:
    def _update_access_stats((self, key: str)) -> None:
    def get_stats((self)) -> Dict[str, Any]:

class BatchProcessor:
    def __init__((self, config: BatchConfig)):
    def add_item((self, item: Any, processor: Callable[[List[Any]], Any])) -> Any:
    def _should_trigger_batch((self)) -> bool:
    def _wait_for_timeout((self, processor: Callable[[List[Any]], Any])) -> None:
    def _process_batch((self, processor: Callable[[List[Any]], Any])) -> None:
    def flush((self, processor: Callable[[List[Any]], Any])) -> None:
    def shutdown((self)) -> None:

class PerformanceOptimizer:
    def __init__((
        self,
        cache_config: Optional[CacheConfig] = None,
        batch_config: Optional[BatchConfig] = None,
    )):
    def get_cache((self, name: str = "default")) -> AsyncCache:
    def get_batch_processor((self, func: Callable)) -> BatchProcessor:
    def clear_all_caches((self)) -> None:
    def get_global_metrics((self)) -> Dict[str, Any]:

def __post_init__((self)):

def hit_rate((self)) -> float:

def add_processing_time((self, duration: float)) -> None:

def __init__((self, config: CacheConfig)):

def get((self, key: str)) -> Optional[Any]:

def set((self, key: str, value: Any, timeout: Optional[float] = None)) -> None:

def delete((self, key: str)) -> bool:

def clear((self)) -> None:

def _update_access_stats((self, key: str)) -> None:

def get_stats((self)) -> Dict[str, Any]:

def __init__((self, config: BatchConfig)):

def add_item((self, item: Any, processor: Callable[[List[Any]], Any])) -> Any:

def _should_trigger_batch((self)) -> bool:

def _wait_for_timeout((self, processor: Callable[[List[Any]], Any])) -> None:

def _process_batch((self, processor: Callable[[List[Any]], Any])) -> None:

def flush((self, processor: Callable[[List[Any]], Any])) -> None:

def shutdown((self)) -> None:

def __init__((
        self,
        cache_config: Optional[CacheConfig] = None,
        batch_config: Optional[BatchConfig] = None,
    )):

def get_cache((self, name: str = "default")) -> AsyncCache:

def get_batch_processor((self, func: Callable)) -> BatchProcessor:

def clear_all_caches((self)) -> None:

def get_global_metrics((self)) -> Dict[str, Any]:

def get_optimizer(()) -> PerformanceOptimizer:

def set_optimizer((optimizer: PerformanceOptimizer)) -> None:

def async_cache((
    cache_name: str = "default",
    timeout: Optional[float] = None,
    key_func: Optional[Callable[..., str]] = None,
    optimizer: Optional[PerformanceOptimizer] = None,
)) -> Callable[[F], F]:

def decorator((func: F)) -> F:

def default_key_func((*args, **kwargs)) -> str:

def wrapper((*args, **kwargs)):

def batch_processor((
    max_size: int = 100,
    max_wait: float = 1.0,
    strategy: BatchStrategy = BatchStrategy.HYBRID,
    optimizer: Optional[PerformanceOptimizer] = None,
)) -> Callable[[F], F]:

def decorator((func: F)) -> F:

def wrapper((item)):

def performance_monitor((
    track_timing: bool = True,
    track_memory: bool = False,
    log_slow_calls: bool = True,
    slow_threshold: float = 1.0,
)) -> Callable[[F], F]:

def decorator((func: F)) -> F:

def async_wrapper((*args, **kwargs)):

def sync_wrapper((*args, **kwargs)):


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/src/d361/utils/validation.py
# Language: python

import re
from datetime import datetime, timezone
from functools import wraps
from pathlib import Path
from typing import Any, Callable, Dict, List, Optional, Type, TypeVar, Union
from urllib.parse import urlparse
from loguru import logger
from pydantic import BaseModel, Field, ValidationError, field_validator, model_validator
from pydantic import EmailStr, HttpUrl
from pydantic.types import EmailStr, HttpUrl
from pydantic import HttpUrl
import html
import inspect

T = =
F = =

class ValidationException(E, x, c, e, p, t, i, o, n):
    def __init__((self, message: str, field: Optional[str] = None, value: Any = None, errors: Optional[List[Dict]] = None)):

class ValidationHelper:

class MigrationHelper:

class ValidatedBaseModel(B, a, s, e, M, o, d, e, l):
    def to_dict((self, exclude_none: bool = True)) -> Dict[str, Any]:

class Article(V, a, l, i, d, a, t, e, d, B, a, s, e, M, o, d, e, l):

def __init__((self, message: str, field: Optional[str] = None, value: Any = None, errors: Optional[List[Dict]] = None)):

def validate_url((cls, value: Any, allow_relative: bool = False)) -> str:

def validate_email((cls, value: Any)) -> str:

def validate_slug((cls, value: Any, allow_empty: bool = False)) -> str:

def validate_version((cls, value: Any)) -> str:

def validate_uuid((cls, value: Any)) -> str:

def validate_api_token((cls, value: Any, min_length: int = 20)) -> str:

def validate_file_path((cls, value: Any, must_exist: bool = False, must_be_file: bool = True)) -> Path:

def validate_date_string((cls, value: Any, format: str = "%Y-%m-%d")) -> datetime:

def validate_json_dict((cls, value: Any, required_keys: Optional[List[str]] = None)) -> Dict[str, Any]:

def clean_html_content((cls, value: Any, allow_basic_tags: bool = True)) -> str:

def validate_url_field((allow_relative: bool = False)):

def validator((cls, v)):

def validate_email_field(()):

def validator((cls, v)):

def validate_slug_field((allow_empty: bool = False)):

def validator((cls, v)):

def validate_api_token_field((min_length: int = 20)):

def validator((cls, v)):

def validate_function_inputs((**field_validators: Dict[str, Callable])):

def decorator((func: F)) -> F:

def wrapper((*args, **kwargs)):

def convert_v1_field_to_v2((
        v1_field: Any,
        field_name: str,
        default: Any = None,
        description: Optional[str] = None,
        **extra_kwargs
    )):

def create_migration_report((model_class: Type[BaseModel])) -> Dict[str, Any]:

def from_dict((cls, data: Dict[str, Any])) -> 'ValidatedBaseModel':

def to_dict((self, exclude_none: bool = True)) -> Dict[str, Any]:

def validate_dict_input((cls, values)):

def validate_slug((cls, v)):

def validate_tags((cls, v)):

def validate_article_consistency((self)):


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/test_api_client.py
# Language: python

import asyncio
import sys
from pathlib import Path
from d361.api import Document360ApiClient, ApiConfig
from d361.api.errors import ValidationError, AuthenticationError
from d361.api.errors import ErrorHandler, ErrorSeverity, ErrorCategory
from d361.http.client import HttpResponse
from d361.api.errors import RateLimitError

class MockResponse:
    def __init__((self, status_code, json_data=None, text="", url="https://test.com", headers=None)):

def test_api_client(()):

def test_error_classification(()):

def __init__((self, status_code, json_data=None, text="", url="https://test.com", headers=None)):

def main(()):


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/test_chunked_download.py
# Language: python

import asyncio
import sys
from pathlib import Path
from d361.api import Document360ApiClient, ApiConfig
from d361.api.chunked_download import (
    ChunkedDownloader,
    DownloadConfig,
    DownloadStatus,
    ChunkStatus,
    DownloadChunk,
    DownloadProgress,
    DownloadState
)

def test_download_config(()):

def test_download_chunk(()):

def test_download_progress(()):

def test_download_state(()):

def test_chunked_downloader(()):

def test_progress_callback(()):

def progress_callback((progress: DownloadProgress)):

def main(()):


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/test_circuit_breaker.py
# Language: python

import asyncio
import sys
import time
from pathlib import Path
from d361.api.circuit_breaker import (
    CircuitBreaker,
    CircuitBreakerConfig,
    CircuitBreakerError,
    CircuitState,
    CircuitMetrics,
    CircuitBreakerRegistry,
    circuit_breaker,
    get_circuit_breaker,
    get_registry
)

class TestException(E, x, c, e, p, t, i, o, n):

def test_circuit_breaker_config(()):

def test_circuit_metrics(()):

def test_circuit_breaker_states(()):

def failing_function(()):

def successful_function(()):

def test_circuit_breaker_recovery(()):

def failing_function(()):

def successful_function(()):

def test_circuit_breaker_decorator(()):

def test_function((should_fail=False)):

def test_circuit_breaker_registry(()):

def test_circuit_breaker_error(()):

def main(()):


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/test_data_sync.py
# Language: python

import asyncio
import sys
import tempfile
from datetime import datetime, timedelta
from pathlib import Path
from d361.api import Document360ApiClient, ApiConfig
from d361.api.data_sync import (
    DataSyncManager,
    SyncConfig,
    SyncStrategy,
    DeduplicationStrategy,
    ContentFingerprint,
    ChangeRecord,
    ChangeType,
    SyncState
)
from d361.core.models import Article, PublishStatus

def test_content_fingerprint(()):

def test_sync_config(()):

def test_change_record(()):

def test_sync_state(()):

def test_data_sync_manager(()):

def test_callback((change_record: ChangeRecord)):

def test_deduplication_logic(()):

def main(()):


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/test_metrics.py
# Language: python

import asyncio
import sys
import time
from datetime import datetime, timedelta
from pathlib import Path
from d361.api.metrics import (
    ApiMetrics,
    MetricsConfig,
    MetricType,
    MetricPoint,
    MetricSeries,
    TimeWindow,
    get_metrics,
    configure_metrics
)
import json

def test_metric_point(()):

def test_metric_series(()):

def test_metrics_config(()):

def test_api_metrics(()):

def test_metrics_export(()):

def test_alerts_system(()):

def test_alert_callback((metric_name: str, alert_data: dict)):

def test_global_metrics(()):

def test_metrics_performance(()):

def main(()):


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/test_streaming_bulk.py
# Language: python

import asyncio
import sys
from pathlib import Path
from d361.api import Document360ApiClient, ApiConfig
from d361.api.bulk_operations import (
    BulkOperationManager,
    BulkOperationConfig,
    OperationType,
    OperationRequest,
    SmartBulkProcessor
)
from d361.api.errors import ValidationError
from d361.api.bulk_operations import BulkOperationResult
from datetime import datetime

def test_streaming_operations(()):

def test_bulk_operations(()):

def test_operation_requests(()):

def test_bulk_result_tracking(()):

def main(()):


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/tests/conftest.py
# Language: python

import asyncio
import os
import tempfile
from pathlib import Path
from typing import AsyncGenerator, Dict, Generator, Optional, Any
from unittest.mock import AsyncMock, Mock, patch
import pytest
from loguru import logger
from d361.core.models import Article, Category, ProjectVersion
from d361.core.transformers import ModelTransformer
from d361.config import AppConfig, Environment, ConfigLoader, SecretsManager
from d361.providers import MockProvider
from d361.archive import SqliteCache, ArchiveParser
from d361.api import Document360ApiClient, TokenManager
from d361.utils import ServiceContainer, LoggingManager, PerformanceOptimizer
from d361.plugins import PluginManager
from d361.archive.schema import create_archive_schema
import zipfile
import json
import json
import yaml
import time

TEST_DB_NAME = =
TEST_CONFIG_DIR = =
TEST_CACHE_SIZE = =
TEST_API_TIMEOUT = =

class TestHelpers:

def event_loop(()):

def test_data_dir(()) -> Generator[Path, None, None]:

def test_config((test_data_dir: Path)) -> AppConfig:

def test_database((test_data_dir: Path)) -> AsyncGenerator[Path, None]:

def sqlite_cache((test_database: Path, test_config: AppConfig)) -> AsyncGenerator[SqliteCache, None]:

def mock_api_client(()) -> Mock:

def mock_token_manager(()) -> Mock:

def mock_secrets_manager(()) -> AsyncMock:

def mock_get_secret((secret_id: str)):

def config_loader((test_data_dir: Path)) -> AsyncGenerator[ConfigLoader, None]:

def mock_provider(()) -> MockProvider:

def model_transformer(()) -> ModelTransformer:

def plugin_manager(()) -> PluginManager:

def service_container(()) -> Generator[ServiceContainer, None, None]:

def performance_optimizer((test_data_dir: Path)) -> PerformanceOptimizer:

def logging_manager((test_data_dir: Path)) -> Generator[LoggingManager, None, None]:

def sample_article(()) -> Article:

def sample_category(()) -> Category:

def sample_articles(()) -> list[Article]:

def test_environment_vars(()) -> Generator[Dict[str, str], None, None]:

def mock_archive_file((test_data_dir: Path)) -> Path:

def archive_parser((test_data_dir: Path)) -> ArchiveParser:

def create_test_config_file((config_dir: Path, filename: str, config_data: Dict[str, Any])) -> Path:

def create_test_env_file((config_dir: Path, env_vars: Dict[str, str])) -> Path:

def wait_for_condition((condition_func, timeout: float = 5.0, interval: float = 0.1)):

def test_helpers(()) -> TestHelpers:

def pytest_configure((config)):

def pytest_collection_modifyitems((config, items)):

def anyio_backend(()):


<document index="48">
<source>tests/data/v1_categories_articles.json</source>
<document_content>
{"Slug":"v1","Workspace":"v1","ResourcePath":"https://cdn.document360.io/f64a08c7-43f3-48cf-ac56-a1facdb8f0ec/Images/Documentation","Languages":["en"],"Categories":[{"SubCategories":[{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"d8a6d418-a7d4-4ccb-99cb-e78d988353ff","Path":"balanced-strokes-1.md","Order":4},{"Id":"fc5ec1c0-eacb-471a-a419-e1fdd7061af6","Path":"extrapolated-1.md","Order":5},{"Id":"dcc687c1-9a40-4ca1-976f-a238b8e79a91","Path":"handmade-creating-1.md","Order":1},{"Id":"52aa4a13-db52-4461-88cf-ccc30fe7028c","Path":"blending-strokes-1.md","Order":3},{"Id":"77de5ee4-5f22-40eb-82a5-722ddb680eb0","Path":"manual-1.md","Order":2},{"Id":"f27bae0c-e7d3-4647-bb80-2a77bfe2b2e4","Path":"mask-strokes-1.md","Order":6}],"Id":"9c5c9828-0e95-43e2-ae8d-c4d2ca9c4b23","Path":"handmade-fills.md","Order":14,"CategoryType":1,"Icon":null,"Title":"Handmade Fills","Languages":[{"Code":"en","Title":"Handmade Fills","Slug":"handmade-fills","ContentType":0,"SeoTitle":"Halftone","Description":null}]}],"Articles":[{"Id":"532a5620-54ee-4754-900a-d1b22cbc200c","Path":"trace.md","Order":9},{"Id":"17bb59f9-04a6-4815-8514-f22de876b1d0","Path":"creating-new-fill.md","Order":2},{"Id":"575c42d6-c240-4958-9a57-1a6288c82ff9","Path":"understanding-fill-types.md","Order":1},{"Id":"fcfae55b-f449-4c37-90c9-c26a42303603","Path":"radial.md","Order":5},{"Id":"24e4cd74-5a00-4f96-8f98-9940919537f3","Path":"linear.md","Order":3},{"Id":"cd147a52-7f04-49bd-b6ec-9e9d788d4f55","Path":"wireframe.md","Order":10},{"Id":"310d077b-0f7b-43f6-89d5-e007b8e64523","Path":"fractals.md","Order":13},{"Id":"956e920d-083d-4f45-a8b4-a037021f5992","Path":"units.md","Order":15},{"Id":"14bd8051-696c-47c8-849b-a141f6fcdd7e","Path":"spiral.md","Order":7},{"Id":"954ca4cd-07f2-4784-8438-b071be94316e","Path":"text-2.md","Order":12},{"Id":"68c0794a-c5a3-4ce4-adeb-c446e8d92b08","Path":"wave.md","Order":4},{"Id":"cb1ff674-d722-4b63-b6c6-057e026a4350","Path":"circular.md","Order":6},{"Id":"90366d55-dcf3-4b5a-8383-740416ae9ecf","Path":"halftone.md","Order":8},{"Id":"13bf6467-c2f6-4889-afac-1076246e6f13","Path":"scribble.md","Order":11}],"Id":"90b0e327-f05a-4893-96ce-0b2acf6b6d99","Path":null,"Order":6,"CategoryType":0,"Icon":null,"Title":"Fills","Languages":[{"Code":"en","Title":"Fills","Slug":"fills","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"7fe540cc-05f8-4bf4-bd8b-2d58621a74c4","Path":"system-requirements-2.md","Order":2},{"Id":"a3cb3f84-bd40-47f5-875c-15b9e47afdc3","Path":"what-is-vexy-lines.md","Order":1}],"Id":"48006562-278a-4b9d-aa07-8c76ba23aa1e","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Introduction","Languages":[{"Code":"en","Title":"Introduction","Slug":"introduction","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"67fc3d26-2faf-4d16-864a-4896d2790a89","Path":"phase-shift.md","Order":7},{"Id":"ea1caee8-863e-4ec6-85b2-beacf321aaca","Path":"randomization.md","Order":2},{"Id":"47b61d24-130a-4eed-93fd-d019412232fe","Path":"wave-fading.md","Order":8},{"Id":"d86adec9-ecfb-4c07-881b-e2796a8ae1c6","Path":"curviness.md","Order":9},{"Id":"3d638a8a-fd58-444f-839a-6d2e8929aaf1","Path":"angle.md","Order":4},{"Id":"63caebaf-0115-44ab-97ed-6b53fa565e14","Path":"interval.md","Order":1},{"Id":"4c03ab40-5a7e-4770-ac05-30a00f4db0c9","Path":"wave-height.md","Order":5},{"Id":"fe5b671d-64b9-4c97-8538-5098d1f75d11","Path":"shift.md","Order":3},{"Id":"72336515-7f2b-452a-a701-1d54bbb9bdc6","Path":"wave-width.md","Order":6}],"Id":"5db64d3b-05af-4590-ae3d-2396db673c1d","Path":null,"Order":9,"CategoryType":0,"Icon":null,"Title":"Fill parameters","Languages":[{"Code":"en","Title":"Fill parameters","Slug":"fill-parameters","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"22014b64-79c7-414f-8fa7-920f69c9d90e","Path":"image-threshold-draft.md","Order":3},{"Id":"92cc91ce-c31b-41ea-883e-b68a5e2f4835","Path":"stroke-caps-draft.md","Order":6},{"Id":"99b7e95e-7e8e-475f-bd54-93b9291762ab","Path":"fill-properties.md","Order":1},{"Id":"71e7f76b-23ea-45db-8973-6e09248bcc0b","Path":"align-and-arrange-draft.md","Order":10},{"Id":"e6f32c39-b8eb-4874-b832-9af6588c7ede","Path":"color-1.md","Order":2},{"Id":"d832a358-b4ea-4aae-bf80-549c992461c3","Path":"transfom-draft.md","Order":9},{"Id":"59912802-c636-4237-a9ee-e957d714d9ed","Path":"dashed-line-draft.md","Order":5},{"Id":"f8bc9a4d-d4b1-4e7a-a2a8-ef97f6d3f5df","Path":"stroke-thickness-draft.md","Order":4},{"Id":"fd5c5422-5c85-4edb-8841-caef3b9a408e","Path":"mesh-2.md","Order":11},{"Id":"4b2a7350-3503-40ca-9ed9-28320be03763","Path":"overlap-control-draft.md","Order":12},{"Id":"9b477d02-c071-4577-976e-bd98e1e0e6a5","Path":"view-1.md","Order":13},{"Id":"f41cac1c-610f-4471-85f2-e3606d03b959","Path":"emboss-draft.md","Order":7},{"Id":"b57eb7e2-1e04-4ad4-9f15-3aa4ebe07eed","Path":"smooth-mask.md","Order":8}],"Id":"2ea06353-5d08-422e-bb6b-6297ede17fca","Path":null,"Order":8,"CategoryType":0,"Icon":null,"Title":"Properties","Languages":[{"Code":"en","Title":"Properties","Slug":"properties","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"84737f12-2223-462c-8a81-41b5c3e57b78","Path":"layer-1.md","Order":3},{"Id":"3f717b1b-0edf-4bb4-b62f-d57c7b895c54","Path":"group.md","Order":6},{"Id":"80005406-8831-47a6-a687-8173f204506c","Path":"mask.md","Order":4},{"Id":"e18e6850-3d8c-48e9-a00e-66c6d53ec348","Path":"source.md","Order":1},{"Id":"d81c59af-5819-4d0b-93aa-f5dc65d403cd","Path":"fills-2.md","Order":2},{"Id":"33ed916a-0bd5-4427-8ef5-472726507397","Path":"refreshing.md","Order":7},{"Id":"d96fe67a-86ba-4de0-9532-549d2cd9936b","Path":"clone.md","Order":8},{"Id":"418ae2ec-1e5d-468a-8e19-ad4dc10393e9","Path":"mesh.md","Order":5}],"Id":"d88e376d-5e77-4525-bc21-220992f11f78","Path":null,"Order":6,"CategoryType":0,"Icon":null,"Title":"Basic terms","Languages":[{"Code":"en","Title":"Basic terms","Slug":"basic-terms","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"d6771706-bf22-4ce2-a044-bda648d681b4","Path":"zooming.md","Order":5},{"Id":"0c733405-7ed4-49c0-be14-58d5ca241347","Path":"import.md","Order":9},{"Id":"1819dc5b-d703-4a19-b1a5-cb948e171c92","Path":"open-document-and-images.md","Order":4},{"Id":"62f3e30e-4eba-41f1-9be7-a2c85d03d4cb","Path":"export-2.md","Order":10},{"Id":"ad54c246-1ef8-4056-bcf5-1efe80099f1e","Path":"panscroll-the-document-view.md","Order":6},{"Id":"63539f6c-ad8b-42b9-827f-7046091d1a97","Path":"system-requirements.md","Order":1},{"Id":"8bfa3084-3597-4219-8578-672bb36ac1e1","Path":"new-from-clipboard.md","Order":3},{"Id":"87397752-2648-4c3e-87d4-cd975752f045","Path":"create-new-document.md","Order":2},{"Id":"4d35fdbf-a00a-4ce0-8afa-06606fe27897","Path":"save-1.md","Order":8},{"Id":"47144d0e-0291-4bc8-9da6-102f371be902","Path":"close.md","Order":11},{"Id":"c7c6c1b3-60eb-453a-a39e-b1e8642cc528","Path":"open.md","Order":7}],"Id":"d97a3c99-a2f9-47ce-9890-88963c63ea5a","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Getting started","Languages":[{"Code":"en","Title":"Getting started","Slug":"getting-started","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"6af30d54-b5c6-492b-8a69-269f8797561c","Path":"knife-draft.md","Order":4},{"Id":"8de084b0-0404-498d-88a3-d88cbd4f65d9","Path":"pencil-draft.md","Order":3},{"Id":"6c85814f-160e-43ab-b78e-4e4042cbca1f","Path":"meter-draft.md","Order":2},{"Id":"7516a608-5185-4d6f-a9b7-ad7920cd3fe5","Path":"editor-draft.md","Order":1},{"Id":"19fe2574-e33a-4000-a5a4-b3e299f3a7ba","Path":"transform.md","Order":5},{"Id":"e0c2f157-8094-4dfa-9e5f-50cb438a032f","Path":"mask-tools.md","Order":7},{"Id":"929d9579-5b09-45d9-8515-88cd72e452b8","Path":"mesh-1.md","Order":6}],"Id":"03364b4e-a370-4598-87ce-3d6d0b11fc6f","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Tools","Languages":[{"Code":"en","Title":"Tools","Slug":"tools","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"3a8c7e18-1a56-4c12-b9df-ec409a580c7e","Path":"layers-1.md","Order":2},{"Id":"19ccf987-bb2b-4979-92a1-992c384e0945","Path":"properties-1.md","Order":3},{"Id":"e6e145fd-ec50-418b-a50d-314cca02be6c","Path":"history.md","Order":5},{"Id":"857d5d8b-b86a-435a-84cc-a4c3322ee60c","Path":"preview-1.md","Order":4},{"Id":"32eaccd8-0a31-4e24-91e2-c808983f7d89","Path":"keyboard-shortcuts-1.md","Order":7},{"Id":"76940e4d-6463-47d1-aeaa-31207474a429","Path":"workspace.md","Order":1},{"Id":"c3c5ecaa-659e-4ce7-a4df-5e0ab4af5a82","Path":"preferences-2.md","Order":6}],"Id":"96c65e9a-8c7b-41be-a3d3-968ff3bb302c","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"User interface","Languages":[{"Code":"en","Title":"User interface","Slug":"user-interface","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"ef14312b-5437-45b8-b7ae-ae330d1de2a9","Path":"fills-1.md","Order":2},{"Id":"e3e79c37-cc3c-4248-b9d2-985113562e43","Path":"customize-filling.md","Order":3},{"Id":"d104c434-d7ff-43c1-8317-60720af6c180","Path":"keys.md","Order":1}],"Id":"6ad56bf7-6f89-48c6-8d94-40f2b416bd1f","Path":null,"Order":10,"CategoryType":0,"Icon":null,"Title":"__Draft","Languages":[{"Code":"en","Title":"__Draft","Slug":"draft","ContentType":0,"SeoTitle":"Draft","Description":null}]},{"SubCategories":[],"Articles":[{"Id":"4fde2ff6-b9c5-48bd-bf33-4902500add59","Path":"view.md","Order":12},{"Id":"008cc96e-7d5e-4a4a-af76-a31d995fd295","Path":"emboss.md","Order":6},{"Id":"22e4034b-f006-4de3-b13f-e83f8f19157c","Path":"color-strokes.md","Order":1},{"Id":"7570e22f-b245-4c41-945d-1ad50068ea72","Path":"stroke-caps.md","Order":5},{"Id":"c89909b6-4611-40dd-ab6b-4cfcf7665e6e","Path":"stroke-thickness.md","Order":3},{"Id":"6a482743-a4de-4bda-b3c5-9d8b5d5f1aaa","Path":"dashed-line.md","Order":4},{"Id":"25901b1c-b803-4d9e-9786-89d47b024ab6","Path":"image-threshold.md","Order":2},{"Id":"da08c8ef-f849-44e4-ab82-0d1b52406ae1","Path":"align-and-arrange.md","Order":9},{"Id":"654a4823-1cce-4922-9280-a2defe77ac40","Path":"mesh-4.md","Order":10},{"Id":"70db60ae-5c52-4ba1-a49b-3c16ad68b165","Path":"overlap-control.md","Order":11},{"Id":"7e5f5e98-a21e-4a20-ab6a-f67f30e89db0","Path":"smooth-mask-1.md","Order":7},{"Id":"3161ab6f-3c0e-4aef-9d31-041094afbe73","Path":"transform-2.md","Order":8}],"Id":"f86c81fe-0b47-4ab8-bd7c-be261b1830ec","Path":null,"Order":7,"CategoryType":0,"Icon":null,"Title":"Strokes","Languages":[{"Code":"en","Title":"Strokes","Slug":"common-properties","ContentType":0,"SeoTitle":"Common Properties","Description":null}]},{"SubCategories":[],"Articles":[{"Id":"0169c3d2-424b-44f3-9dfa-d20124ed4c4b","Path":"document-structure.md","Order":1},{"Id":"992cc19f-9e7d-4aad-9a94-767522ae14e5","Path":"document-properties.md","Order":2},{"Id":"db675911-863c-4107-97a7-bb5685b51179","Path":"view-modes.md","Order":3}],"Id":"96a7a605-4719-415e-b4d8-fadb557de24b","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"Working with Documents","Languages":[{"Code":"en","Title":"Working with Documents","Slug":"working-with-documents","ContentType":0,"SeoTitle":"Working with Documents","Description":null}]},{"SubCategories":[],"Articles":[{"Id":"674daba8-90bb-4e7c-bfa6-dadf6401be0a","Path":"transform-tool.md","Order":6},{"Id":"1c8d4af4-869b-467c-85ad-d6b8fae1492b","Path":"knife.md","Order":5},{"Id":"8bfd386c-6ecd-4e43-8c49-b51b442c8a43","Path":"freeform.md","Order":10},{"Id":"79259166-72ad-4de0-9dda-51d4c1c96159","Path":"editor.md","Order":2},{"Id":"e4de7bd3-7055-448c-89db-05594858de94","Path":"pencil.md","Order":4},{"Id":"757abdb7-3e62-40cb-8da4-1f15e630629d","Path":"ellipse.md","Order":9},{"Id":"b17ca525-c01d-41d8-9314-d250c14294d4","Path":"toolbar.md","Order":1},{"Id":"4aca33aa-d089-4b79-a67d-531b411e4c76","Path":"meter.md","Order":3},{"Id":"00279b48-8d77-4c28-ba8b-9b4d1784de24","Path":"brush.md","Order":7},{"Id":"5eb95bcd-b1f4-49ba-af9b-d911152a2010","Path":"rectangle.md","Order":8}],"Id":"42fd3a09-a3d6-4549-a79a-8038a90bdb42","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Tools","Languages":[{"Code":"en","Title":"Tools","Slug":"tools-3","ContentType":0,"SeoTitle":"Tools","Description":null}]},{"SubCategories":[],"Articles":[{"Id":"3cc24c83-6508-4b7e-bf15-c39d29fc158b","Path":"objects-group.md","Order":8},{"Id":"bf94836c-9283-40dc-9d98-d15b5d0617b8","Path":"layers-2.md","Order":2},{"Id":"eacdd97d-9517-4c3c-8e9a-1fcfea65ad83","Path":"objects-clone.md","Order":7},{"Id":"8dd63758-7ae8-4637-aef5-a4f680c505a4","Path":"mesh-3.md","Order":6},{"Id":"62fc1274-4250-4831-8f90-29dd612be27a","Path":"objects-layer.md","Order":4},{"Id":"84036311-cd0c-4912-a734-95b2e2e36d33","Path":"source-images.md","Order":3},{"Id":"45b51443-83b2-4dd1-a2e8-2f786d8eae1e","Path":"objects-mask.md","Order":5},{"Id":"232e2968-605b-41e9-958d-4f516e3b3808","Path":"selecting-objects.md","Order":1}],"Id":"e29231ce-34c5-45e9-9698-c63cde3262f9","Path":null,"Order":8,"CategoryType":0,"Icon":null,"Title":"Objects, Layers and Groups","Languages":[{"Code":"en","Title":"Objects, Layers and Groups","Slug":"object-control","ContentType":0,"SeoTitle":"Object control","Description":null}]},{"SubCategories":[{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"ff1184dc-65eb-4c0f-93cb-f4d3fc83fb71","Path":"edit.md","Order":2},{"Id":"8f94392e-2b03-4b79-9c2f-dacc66c338ec","Path":"layer.md","Order":4},{"Id":"3bd9d83d-a94b-4b54-8807-1288a12f3c72","Path":"fill.md","Order":5},{"Id":"d17c9a58-f615-4391-9838-7ec2a51c4bb9","Path":"tools-2.md","Order":6},{"Id":"bc7bfd5e-6f39-4133-9529-f65f3992ab2e","Path":"help.md","Order":8},{"Id":"4188e43e-955a-48b0-bb31-c72a17483461","Path":"window.md","Order":7},{"Id":"b4e1c4de-04c0-4f5d-9fee-11a8ba8a31cf","Path":"file.md","Order":1},{"Id":"21f50257-ecb9-4c27-902c-ce17882344e2","Path":"menu-view.md","Order":3}],"Id":"823f0dc2-555e-4420-a4f3-4ded4648bef1","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Menu","Languages":[{"Code":"en","Title":"Menu","Slug":"menu","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"3358a138-6444-43f5-822f-0772b96a0846","Path":"zooming-1.md","Order":2},{"Id":"2c692a20-e313-4e2a-a022-4bf4fec03e1f","Path":"preview.md","Order":3},{"Id":"bcdf65fa-13f5-41a1-aa22-f918ed055238","Path":"preferences-1.md","Order":5},{"Id":"73931869-e0be-45ae-881f-34a30a717909","Path":"history-1.md","Order":4}],"Id":"e769949d-f1ce-4e63-8815-21032891d6dd","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"User Interface","Languages":[{"Code":"en","Title":"User Interface","Slug":"user-interface-2","ContentType":0,"SeoTitle":"User Interface","Description":null}]}],"Articles":[{"Id":"77e24fcb-f14e-4a03-8d35-81f4456d7fa6","Path":"app-installing-and-activation.md","Order":1}],"Id":"b44e3ec8-c803-46df-8a2c-f08541a1fd9e","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Getting Started","Languages":[{"Code":"en","Title":"Getting Started","Slug":"getting-started-2","ContentType":0,"SeoTitle":"Getting Started","Description":null}]},{"SubCategories":[],"Articles":[{"Id":"8bea4217-00a3-4db7-baaa-bec546c1e053","Path":"creating-new-document.md","Order":1},{"Id":"a4b744a3-0ead-4aaf-952a-d5760cddf8db","Path":"export.md","Order":7},{"Id":"4d87d2c3-8b39-49fb-aa92-f912bcb58694","Path":"clipboard-operations.md","Order":6},{"Id":"eb6a89ab-5a9d-42c4-823e-7857df6433ec","Path":"opening-an-existing-document.md","Order":2},{"Id":"4c9989dd-d92e-4fc0-9a66-a2ea69cd9d8f","Path":"saving-your-work.md","Order":3},{"Id":"038ef1f8-3eff-46e7-acb1-ca01aa1f301b","Path":"accessing-recent-files.md","Order":4},{"Id":"380dbdc9-2c47-49cb-8148-945158f89a24","Path":"import-1.md","Order":5}],"Id":"aa9ed1ad-11f6-46dd-b012-9ec46c509106","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"File Management","Languages":[{"Code":"en","Title":"File Management","Slug":"document-management","ContentType":0,"SeoTitle":"Document Management","Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"a3dd7bfc-f68e-462e-ac1b-b3739d50c513","Path":"libzip-1.md","Order":7},{"Id":"c8c4bf81-58ce-4244-aff7-ebf97c43f601","Path":"libjpeg.md","Order":5},{"Id":"1c18b527-3eca-4b5c-80e8-094675a0ead9","Path":"openssl-1.md","Order":9},{"Id":"670d945b-7d10-4ada-ac29-cca12620dd88","Path":"standard-license-texts-1.md","Order":15},{"Id":"d5a2b888-9e4e-4bbc-98dc-308ad6ee4f0a","Path":"cmark-gfm-1.md","Order":1},{"Id":"a62b3fa4-439f-4496-8639-e87cd87d5c2b","Path":"expat-1.md","Order":2},{"Id":"2c2eb225-4755-4707-a5d7-826f5a3293cb","Path":"qtnproperty-1.md","Order":12},{"Id":"35a2fc55-09d1-4dcc-b734-8bca046d7aa8","Path":"sparkle-1.md","Order":13},{"Id":"e21c55b2-5a0c-4985-b339-67ca680d0bf9","Path":"opencv.md","Order":14},{"Id":"2ee49480-785b-4f3c-bb29-2cd79c035f71","Path":"freetype-ttfautohint-1.md","Order":3},{"Id":"cdb1e259-ebef-4898-8685-357f078c012f","Path":"qt-1.md","Order":11},{"Id":"eae48aba-a83c-4dee-b7ca-53fb35a193e3","Path":"harfbuzz-1.md","Order":4},{"Id":"d8cecce5-8158-4f43-bf8a-19cd08aa74b1","Path":"muparser-1.md","Order":8},{"Id":"a4fb583b-05ac-4217-b9fe-e053b710d347","Path":"libpng-1.md","Order":6},{"Id":"9b75ab94-a005-4f15-8f31-ed5f73d65798","Path":"podofo-1.md","Order":10}],"Id":"65d9c488-f772-4181-9003-d8416bec46b6","Path":"fontlab-third-party-licenses-1.md","Order":3,"CategoryType":1,"Icon":null,"Title":"FontLab Third-Party Licenses","Languages":[{"Code":"en","Title":"FontLab Third-Party Licenses","Slug":"fontlab-third-party-licenses-1","ContentType":0,"SeoTitle":"FontLab Third-Party Licenses","Description":null}]}],"Articles":[{"Id":"074b62fb-4878-43ff-b922-b69405b89c87","Path":"vexy-lines-software-end-user-license-agreement-eula.md","Order":5},{"Id":"04ea70f1-f76d-4a06-800c-66f9a2f00ff0","Path":"fontlab-user-guide-license-agreement.md","Order":2}],"Id":"311b572f-dfa7-4a92-a4da-b90f4a720b2a","Path":null,"Order":9,"CategoryType":0,"Icon":null,"Title":"Licenses","Languages":[{"Code":"en","Title":"Licenses","Slug":"licenses-1","ContentType":0,"SeoTitle":"Licenses","Description":null}]}],"Articles":[],"Id":"f5f607b5-c9f9-4c53-9930-ac25029c04bd","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Vexy Lines 1","Languages":[{"Code":"en","Title":"Vexy Lines 1","Slug":"vexy-lines-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"b4298bd0-0e2e-4763-90de-39741253ef61","Path":"custom-keyboard-shortcuts-with-alt-and-shiftalt.md","Order":1},{"Id":"8e2c6ea1-e3f4-412c-b2ba-e1b0bede4feb","Path":"enter-key-in-commands-shortcuts.md","Order":2}],"Id":"9410ed2b-baae-43d2-a93a-1607355335bd","Path":"commands-shortcuts-dialog.md","Order":6,"CategoryType":1,"Icon":null,"Title":"Commands & Shortcuts dialog","Languages":[{"Code":"en","Title":"Commands & Shortcuts dialog","Slug":"commands-shortcuts-dialog","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"df8421ec-7f36-4f9a-b701-93fbdcc5a4c8","Path":"using-previous-versions.md","Order":9},{"Id":"f571ca1a-7359-4b49-83ed-9a1d33bb98ed","Path":"validation.md","Order":4},{"Id":"eab008e5-9fe6-4d66-bacf-959a497046c6","Path":"academic-licenses.md","Order":5},{"Id":"ed0c92a1-132d-470f-96b9-e3a272a7e55b","Path":"trial-period.md","Order":2},{"Id":"3e9ced5a-c49a-4320-9ca7-e4cc8a2c06fa","Path":"updates.md","Order":8},{"Id":"c1669ed4-f506-48d9-b3a6-f60dc809c0a1","Path":"silent-installation-on-windows.md","Order":10},{"Id":"c421ed0a-bc99-4825-9869-2c9ec5c7ffad","Path":"system-requirements-1.md","Order":1},{"Id":"ebf2d1c0-3211-4acd-a568-3e8b1d0fcef5","Path":"first-run-on-macos.md","Order":7},{"Id":"ec7c40f0-adf6-4183-9193-50a9d3c7e819","Path":"installing.md","Order":6},{"Id":"7ee132be-3272-4963-a5f6-da9ae026b87f","Path":"demo-mode.md","Order":3}],"Id":"f1bae13e-5402-46d0-8931-0aefc2c31ad5","Path":"setting-up.md","Order":3,"CategoryType":1,"Icon":null,"Title":"Setting Up","Languages":[{"Code":"en","Title":"Setting Up","Slug":"setting-up","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"de467429-f625-4635-80d5-402ca6a08bdf","Path":"how-to-reopen-a-report.md","Order":4},{"Id":"9b9110b8-0e65-4303-9a24-b2fefc983bf9","Path":"user-requests.md","Order":5},{"Id":"b8402ed4-9dcb-4d78-8ee1-3d3853517526","Path":"when-should-i-report.md","Order":3},{"Id":"97b9c1e7-9190-45c8-878b-18276d3b75aa","Path":"attaching-files.md","Order":2},{"Id":"f7ae8938-9e27-4074-bbe8-8b5fba905872","Path":"submitting-a-report.md","Order":1}],"Id":"97413029-d5fe-4b27-b169-f052df7f06a9","Path":"support.md","Order":4,"CategoryType":1,"Icon":null,"Title":"Support","Languages":[{"Code":"en","Title":"Support","Slug":"support","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"c84829b2-0750-420d-a97a-cd571388e116","Path":"what-is-fontlab.md","Order":1},{"Id":"49f6fbe2-2e8e-4f2e-8ea4-1c50341408ec","Path":"why-fontlab.md","Order":2},{"Id":"6ed3657f-68bb-4a65-8368-cbe1f099b8e1","Path":"quick-help-and-help-panel.md","Order":5}],"Id":"cd9df8e0-4f3c-416f-a6f6-a6f8798a5ab8","Path":"getting-started-1.md","Order":1,"CategoryType":1,"Icon":null,"Title":"Getting started","Languages":[{"Code":"en","Title":"Getting started","Slug":"getting-started-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"87ef72a1-1f02-421d-a2f4-c49526e20ae8","Path":"change-stroke-in-multiple-elements.md","Order":7},{"Id":"a0d4765f-86bb-4158-a8d1-946fc640303e","Path":"stroke-join-properties.md","Order":3},{"Id":"f89c14d1-060e-44f5-ba25-9d585391c580","Path":"stroke-cap-properties.md","Order":2},{"Id":"876d2a7b-e0f9-4d1a-a229-d91ebb790e06","Path":"stroke-location.md","Order":4},{"Id":"db8d3cad-9859-4fd9-afb0-b614cd004e92","Path":"stroke-thickness-and-color.md","Order":1},{"Id":"f57b8d27-d86d-4d71-9784-76f6c4e8fa99","Path":"additional-stroke-properties.md","Order":5},{"Id":"50dd8cf9-c396-40af-9734-ffa8b9094ec3","Path":"stroke-operations.md","Order":6}],"Id":"8f1439a2-2337-4dfc-976a-967779f44d8c","Path":"stroke-panel.md","Order":4,"CategoryType":1,"Icon":null,"Title":"Stroke panel","Languages":[{"Code":"en","Title":"Stroke panel","Slug":"stroke-panel","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"6a62ae91-3571-4e94-a47b-c90e4366e1e7","Path":"stroke-vs-brush.md","Order":1},{"Id":"d40ef401-0b70-445f-8c2c-0c03d115ba53","Path":"local-stroke-properties-for-the-node-in-the-node-panel.md","Order":5},{"Id":"c8b6c5e5-b75b-4453-b717-2ff2b205803c","Path":"simple-stroke-vs-power-stroke.md","Order":2},{"Id":"1c2a7365-f19f-49c0-bdc9-acbdbcc34682","Path":"merge-stroke-into-the-body-contour.md","Order":3}],"Id":"d25d80b6-879d-4b08-8f3f-b3a0070ff774","Path":"stroke.md","Order":2,"CategoryType":1,"Icon":null,"Title":"Stroke","Languages":[{"Code":"en","Title":"Stroke","Slug":"stroke","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"5018f4e3-66f2-4eb1-873d-b83125257d35","Path":"import-sketchboard.md","Order":3},{"Id":"a208c245-f491-4119-bc39-d92fb0970333","Path":"export-sketchboard.md","Order":4},{"Id":"c4431829-954d-434e-959c-74fd12c9dcf5","Path":"introduction-2.md","Order":1},{"Id":"4e657a7a-0527-4aaa-b535-685e32f568d1","Path":"open-sketchboard.md","Order":2}],"Id":"bd578a2b-c016-4993-8569-cf41d51dd9a7","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Sketchboard","Languages":[{"Code":"en","Title":"Sketchboard","Slug":"sketchboard","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"8dc1cdc3-55a4-493f-b7c1-b5fe1eeddc18","Path":"brush-stroke-modulation-with-the-brush-panel.md","Order":1}],"Id":"c0848a4e-6514-4c57-9fd6-6bc5835080d8","Path":"brush-panel.md","Order":2,"CategoryType":1,"Icon":null,"Title":"Brush panel","Languages":[{"Code":"en","Title":"Brush panel","Slug":"brush-panel","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"7b9570f9-d933-4fea-9ff0-deb0bf92242b","Path":"soft-brush.md","Order":1}],"Id":"c0ab2afb-dc2f-4395-a737-e51c2ad73685","Path":"brush-tool.md","Order":1,"CategoryType":1,"Icon":null,"Title":"Brush tool","Languages":[{"Code":"en","Title":"Brush tool","Slug":"brush-tool","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"cd446f12-2140-4476-812d-1e1cb18cf022","Path":"brush-stroke-modulation-with-the-thickness-tool.md","Order":3}],"Id":"3443f317-90ca-4ab1-ac1c-a88875b8f7ad","Path":"brush-power-brush.md","Order":1,"CategoryType":1,"Icon":null,"Title":"Brush & Power Brush","Languages":[{"Code":"en","Title":"Brush & Power Brush","Slug":"brush-power-brush","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"9ef323ce-0d95-435f-bf7f-f4225a6951e1","Path":"default-drawing-with-pen.md","Order":1},{"Id":"bc7e50e1-4489-4c2c-8623-89c9f0537a0a","Path":"simplified-drawing-with-pen.md","Order":3},{"Id":"319b713f-3eca-4add-ac21-a18c34ebcda5","Path":"editing-existing-contours.md","Order":2},{"Id":"173c765c-8566-45b2-a146-e7065b228c2e","Path":"editing-handles-of-existing-segments.md","Order":4},{"Id":"021fab72-bc24-4014-96cd-637ad60fbefd","Path":"preview-next-segment.md","Order":5}],"Id":"8d7d0d6c-9080-4c8f-b7a5-ffe09247ea06","Path":"pen-tool.md","Order":2,"CategoryType":1,"Icon":null,"Title":"Pen tool","Languages":[{"Code":"en","Title":"Pen tool","Slug":"pen-tool","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"fa89279b-2b04-4e02-98cd-3ceaea6aa6c9","Path":"smart-pencil.md","Order":2},{"Id":"11e86b2c-bb52-45ec-b2d5-b4ea86bcbe55","Path":"simple-pencil.md","Order":3},{"Id":"ba363bdb-5d07-4d50-b1da-f497b4dcda29","Path":"soft-pencil.md","Order":1}],"Id":"06f22806-824a-4936-bb02-70f7ddbcf001","Path":"pencil-tool.md","Order":1,"CategoryType":1,"Icon":null,"Title":"Pencil tool","Languages":[{"Code":"en","Title":"Pencil tool","Slug":"pencil-tool","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"ae281bdb-7535-413c-b6e3-af4b8cc7b02b","Path":"adjusting-nodes-and-tension-points-with-rapid-tool.md","Order":6},{"Id":"ae84ae3c-752d-44ef-a46f-c415fd8b61b4","Path":"adding-rapid-tension-points.md","Order":5},{"Id":"69bf9407-8ccf-4e1a-aec2-18d6a7bcd6f0","Path":"drawing-tangent-nodes.md","Order":2},{"Id":"3a0eeebd-2f4f-49f5-9cb7-6247b4cdf7cc","Path":"drawing-sharp-and-smooth-nodes.md","Order":1},{"Id":"1cc9466f-c818-4331-8383-3541c8180abd","Path":"closing-rapid-contours.md","Order":3},{"Id":"9c2bdd39-a295-4675-8d0a-6360d23b9b68","Path":"curve-segments-1.md","Order":4}],"Id":"0debd1b0-b0ad-43ed-a4c8-31394aea43c7","Path":"rapid-tool.md","Order":3,"CategoryType":1,"Icon":null,"Title":"Rapid tool","Languages":[{"Code":"en","Title":"Rapid tool","Slug":"rapid-tool","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"11c7ff8b-9d15-48ba-bc6f-d04f4b0fef3a","Path":"distance-suggestions.md","Order":2},{"Id":"d6bfed48-a61e-45bc-8263-3c04d7572043","Path":"adjusting-brush-and-stroke-thickness.md","Order":3},{"Id":"3f1b7764-4ca6-4b6b-9046-66eb8290bd40","Path":"stroke-thickness-and-stem-suggestions.md","Order":1}],"Id":"57fc1586-f465-44ae-8b5e-42cdce2fca8b","Path":"thickness-tool.md","Order":3,"CategoryType":1,"Icon":null,"Title":"Thickness tool","Languages":[{"Code":"en","Title":"Thickness tool","Slug":"thickness-tool","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"a5b8b2ec-02eb-4ba8-9353-04df7f5464e1","Path":"substitution.md","Order":3},{"Id":"55c21939-36f9-41b0-9dbc-82ae160fef9a","Path":"feature.md","Order":1},{"Id":"e58d943f-0a5d-45dc-aa8f-c7564b2844a9","Path":"positioning.md","Order":4},{"Id":"471dc513-f54e-4ab8-b808-1f737044acfa","Path":"lookup.md","Order":2}],"Id":"3b5e4890-cdd8-4168-8e72-10f9a7fa0b12","Path":"opentype.md","Order":11,"CategoryType":1,"Icon":null,"Title":"OpenType","Languages":[{"Code":"en","Title":"OpenType","Slug":"opentype","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"eb064dcf-7ba9-4857-8216-ba3fae96b1fb","Path":"sidebearings-1.md","Order":3},{"Id":"d4de82a8-589f-4776-9500-9c2d8044e64d","Path":"kerning-5.md","Order":4},{"Id":"b6564a0d-14b7-4817-8859-d7cccfc22c1e","Path":"advance-width.md","Order":2},{"Id":"7dc01ac3-d3bb-4b33-ab42-1303e8762f2d","Path":"the-em-square.md","Order":1}],"Id":"03e3b497-800a-4cb7-8af9-4797c640cada","Path":"glyph-metrics.md","Order":9,"CategoryType":1,"Icon":null,"Title":"Glyph metrics","Languages":[{"Code":"en","Title":"Glyph metrics","Slug":"glyph-metrics","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"802a1ef2-0904-46f5-838a-3cee0ea218a2","Path":"layers-and-masters-1.md","Order":10},{"Id":"8bedf6b9-726e-4d08-a185-3b31823f2441","Path":"character-vs-glyph.md","Order":4},{"Id":"4e2dfcab-f5d1-4112-8c6e-f6399d53a362","Path":"metrics-and-dimensions.md","Order":8},{"Id":"fbaac300-237f-4387-9de4-3dedfc7fe59f","Path":"font-family.md","Order":2},{"Id":"16c83759-926a-4794-81ca-39368a0c939a","Path":"component.md","Order":6},{"Id":"10434e7d-415b-4d05-9430-2a3781fdee38","Path":"element.md","Order":7},{"Id":"89502de4-772f-4990-951b-4968801e8999","Path":"contour-node-point-and-handle.md","Order":5},{"Id":"0f8bba69-1637-40fc-9216-d087ac40f81b","Path":"script.md","Order":3},{"Id":"6625096b-7826-4185-8b47-86a73ea5be9c","Path":"font-1.md","Order":1}],"Id":"69a4ed62-6883-4892-92c9-871ce6cc502c","Path":"basic-concepts.md","Order":2,"CategoryType":1,"Icon":null,"Title":"Basic concepts","Languages":[{"Code":"en","Title":"Basic concepts","Slug":"basic-concepts","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"7e93bb18-1126-4d6f-9862-af1894987504","Path":"collapsed-panels.md","Order":2},{"Id":"71679d9a-504e-4037-bc62-2dbdf8ed85a3","Path":"opening-closing-and-activating-panels.md","Order":5},{"Id":"4218633a-52ef-427c-a682-e8d8d9795c30","Path":"open-the-right-panel-depending-on-current-tool-selection-or-highlight.md","Order":4},{"Id":"93fca503-b1ab-4c3b-bb81-a27ce6080ebc","Path":"panels-list-1.md","Order":3},{"Id":"8de4fc81-ddd9-4487-b85c-47ccd3048802","Path":"font-size-in-code-editors.md","Order":1},{"Id":"8a5079ee-c6e1-42a2-b5e9-d2f2612fc441","Path":"scrolling-panels.md","Order":6}],"Id":"2f239dec-7b42-4c60-b09b-bd5371fb98cf","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"Panels","Languages":[{"Code":"en","Title":"Panels","Slug":"panels","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"4c1bcccf-c5a3-4b63-848d-f8a389699f2e","Path":"grid-and-guides-1.md","Order":1}],"Id":"eb03c541-9c79-4d89-88b8-3fd6eaa75323","Path":"preferences.md","Order":1,"CategoryType":1,"Icon":null,"Title":"Preferences","Languages":[{"Code":"en","Title":"Preferences","Slug":"preferences","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"5d9e2fe6-df18-4630-83e8-6563cc6162a4","Path":"dark-or-light-theme.md","Order":4},{"Id":"5eff8975-4215-4e40-b8c3-8e59e9bd1989","Path":"text-and-numeric-fields.md","Order":2},{"Id":"bfacc4a0-d927-446a-a023-d43f8fa39ef4","Path":"windows-and-tabs.md","Order":5}],"Id":"3b841594-30f3-4a01-94ca-793f56d895ee","Path":"user-interface-1.md","Order":3,"CategoryType":1,"Icon":null,"Title":"User Interface","Languages":[{"Code":"en","Title":"User Interface","Slug":"user-interface-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"ffd1cb45-4a6a-45e5-a257-10b3359ba09c","Path":"add-nodes.md","Order":1},{"Id":"63c82ff0-76ed-43fc-b99d-785420db94c8","Path":"break-contour.md","Order":2},{"Id":"a36cf131-c0f6-404d-94d4-e34b920b9a4b","Path":"slice-contour.md","Order":3}],"Id":"06d494fa-a076-409b-9aa7-7f92609a3e83","Path":"knife-tool.md","Order":8,"CategoryType":1,"Icon":null,"Title":"Knife tool","Languages":[{"Code":"en","Title":"Knife tool","Slug":"knife-tool","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"777fd22b-0be0-4867-b16e-b2a21ff2c272","Path":"loop.md","Order":2},{"Id":"d877c68c-dac9-4031-88dc-7593939ec04d","Path":"ink-trap.md","Order":3},{"Id":"7d143f64-4826-4e4b-ad7d-514ff5839720","Path":"disconnect.md","Order":1}],"Id":"4e66850c-54f6-487f-b325-9687cdaa533b","Path":"scissors-tool.md","Order":10,"CategoryType":1,"Icon":null,"Title":"Scissors tool","Languages":[{"Code":"en","Title":"Scissors tool","Slug":"scissors-tool","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"3bb3134b-dcc4-48b4-b9ba-a7d9ac2b9d0d","Path":"switching-masters-now-keeps-the-contour-selection.md","Order":4},{"Id":"3f35e911-3855-4f27-a4ee-9af33c2473c3","Path":"store-contour-selections-in-selections-panel.md","Order":6},{"Id":"7229cc7b-91e1-4149-afb6-ab229e3131bc","Path":"add-node-to-selection-on-shiftdrag-preference.md","Order":1},{"Id":"a23b7c35-6bc2-4b30-b39f-8f3a565844aa","Path":"slanted-marquee-selection.md","Order":5},{"Id":"2cb6fa3b-0d2a-4f66-b4d4-14e8e2edd444","Path":"select-all-for-components-and-elements.md","Order":3},{"Id":"77a98d3e-14e3-44d2-acdf-f3212095cc9d","Path":"selecting-contours-with-cmd.md","Order":2}],"Id":"fdc6933f-d87a-4c7b-bb3d-f40e90ac0a39","Path":"selecting-contours.md","Order":1,"CategoryType":1,"Icon":null,"Title":"Selecting contours","Languages":[{"Code":"en","Title":"Selecting contours","Slug":"selecting-contours","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"9de0d2f1-8f0a-4ea3-afc5-6481915fb30c","Path":"numerical-adjustment-of-curve-tension-in-the-node-panel.md","Order":1},{"Id":"7703052b-4afb-4854-9f14-b46999f288e2","Path":"conversion-of-line-to-curve-segments.md","Order":2}],"Id":"681212a3-bc9d-4cc2-b3ca-0b9d73f46324","Path":"curve-segments.md","Order":3,"CategoryType":1,"Icon":null,"Title":"Curve segments","Languages":[{"Code":"en","Title":"Curve segments","Slug":"curve-segments","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"bd0b91aa-d8d6-4a43-9c11-c11d3ffecd72","Path":"quickly-reverse-contour-direction-with-fill-tool.md","Order":1},{"Id":"e8c6d77b-a28a-43b5-8470-00abd9e233d1","Path":"reordering-contours.md","Order":2},{"Id":"430eccfb-b1f1-4d97-b140-90a37cd2e2a8","Path":"paste-to-replace-selection.md","Order":5},{"Id":"4aedd7da-2633-4836-b5c5-bb4849cc9c93","Path":"nodes-at-extremes.md","Order":4},{"Id":"043d64f9-f513-4c16-aca5-e73752d6389c","Path":"contour-start-and-end-nodes-show-contour-direction.md","Order":3}],"Id":"3123f837-6997-4a00-90ad-c5f31658ab15","Path":"contours.md","Order":5,"CategoryType":1,"Icon":null,"Title":"Contours","Languages":[{"Code":"en","Title":"Contours","Slug":"contours","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"dfe98c1b-a7fc-4db2-aee4-7f899196ed64","Path":"nudge-proportionally-move-handles-as-you-drag-nodes.md","Order":3},{"Id":"b2747994-ccfe-492d-8763-c10d6d065065","Path":"toolbox-toggles.md","Order":1},{"Id":"7b0a42be-63ef-4d1f-9e96-873d859fc86e","Path":"harmonized-drag-adjust-segments-as-you-slide-a-smooth-node-pull-handles-as-you-move-a-sharp-node.md","Order":4},{"Id":"022cba14-fb40-4b6e-a1bd-dcc192988624","Path":"power-nudge-adjust-contours-smartly.md","Order":2},{"Id":"17f6a0e4-c5f4-47f0-8a9b-d53a1b338007","Path":"slide-move-or-extend-node-along-the-segment-while-preserving-shape.md","Order":5},{"Id":"cda5f350-bd20-453d-86af-24d6cb894525","Path":"contour-lever-drag-precisely.md","Order":6},{"Id":"1d2dde37-34b8-4f2e-9cd5-8c0fb5dc400a","Path":"fractional-coordinates.md","Order":7}],"Id":"3f9cc5b6-3a93-4d58-a7a4-c6b3a6f975ed","Path":"contour-tool.md","Order":2,"CategoryType":1,"Icon":null,"Title":"Contour tool","Languages":[{"Code":"en","Title":"Contour tool","Slug":"contour-tool","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"be4ad06c-f270-43f9-87e1-33a2495d1ac9","Path":"remove-points.md","Order":1},{"Id":"3dcb1e4b-6476-47ac-a27b-c98888ddb15b","Path":"lasso-eraser.md","Order":2},{"Id":"ee13df77-3ce3-45e3-9b1d-b5ab0c17a3c5","Path":"simplify-path.md","Order":3}],"Id":"6aa2c25b-7693-4542-9a1e-fcb93e1069b8","Path":"eraser-tool.md","Order":7,"CategoryType":1,"Icon":null,"Title":"Eraser tool","Languages":[{"Code":"en","Title":"Eraser tool","Slug":"eraser-tool","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"e9acceea-8c91-4602-8cd1-91505631f392","Path":"select-all-tunni-lines.md","Order":1}],"Id":"462c14d6-781e-47ad-92ad-fd47445f00fe","Path":"tunni-lines.md","Order":11,"CategoryType":1,"Icon":null,"Title":"Tunni Lines","Languages":[{"Code":"en","Title":"Tunni Lines","Slug":"tunni-lines","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"0245e0f6-84f9-44e8-a795-8b072c2016af","Path":"undo-selection.md","Order":1}],"Id":"5475e895-074e-42c5-b42c-3eeacab5d98a","Path":null,"Order":12,"CategoryType":0,"Icon":null,"Title":"Selecting Nodes","Languages":[{"Code":"en","Title":"Selecting Nodes","Slug":"selecting-nodes","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"410e7ca1-c39b-45a5-96b4-09be9c00a750","Path":"hidden-node-names.md","Order":1},{"Id":"c6cd8e13-0d9a-48bb-a42b-3a18c501bfc3","Path":"usage-of-node-names.md","Order":2}],"Id":"4be59a67-1e0b-4095-8438-729f9958e7d4","Path":"node-names.md","Order":6,"CategoryType":1,"Icon":null,"Title":"Node names","Languages":[{"Code":"en","Title":"Node names","Slug":"node-names","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"0ec05e12-6c48-435f-b208-cde00ca53d9f","Path":"collapse-points.md","Order":3},{"Id":"e8eae2d6-6917-4512-b2c8-f56acba94b08","Path":"spike-nodes.md","Order":1},{"Id":"1424b237-6f50-4354-81ea-87b22487c1d1","Path":"align-points.md","Order":2},{"Id":"537214d7-05c5-4e87-84ac-8f8d08022e1a","Path":"customize-the-distance-from-your-pointer-at-which-fontlab-shows-nodes-and-handles-if-they-are-hidden.md","Order":4},{"Id":"54d915d8-666c-4780-884c-311d558f21bf","Path":"lock-the-outline-to-disable-manual-editing-of-points-and-contours.md","Order":5}],"Id":"91ee480c-a8dd-4252-b4fa-dd9221a97b42","Path":"nodes-and-handles.md","Order":4,"CategoryType":1,"Icon":null,"Title":"Nodes and handles","Languages":[{"Code":"en","Title":"Nodes and handles","Slug":"nodes-and-handles","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"52208d66-84f1-4f2e-91c3-ae13bf667ea2","Path":"vertical-slant.md","Order":1},{"Id":"5551ae99-8ce7-4ac3-b34b-99e68e64a708","Path":"increased-precision.md","Order":2}],"Id":"d19f94b1-eddb-4fe1-9068-0be857233c30","Path":"transform-panel.md","Order":1,"CategoryType":1,"Icon":null,"Title":"Transform panel","Languages":[{"Code":"en","Title":"Transform panel","Slug":"transform-panel","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"cb171461-6634-41e5-b82a-e00b50112362","Path":"transform-a-single-node.md","Order":2},{"Id":"3593cf81-cbea-4104-badd-6a5d93682fae","Path":"introduction-3.md","Order":3}],"Id":"1c1ff047-d4af-4f30-8d21-609ff4a12162","Path":null,"Order":6,"CategoryType":0,"Icon":null,"Title":"Transformation","Languages":[{"Code":"en","Title":"Transformation","Slug":"transformation","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"fe814538-9cde-4401-80dc-177fe8478876","Path":"unified-controls-for-window-bars.md","Order":1}],"Id":"d4700a44-bd99-4d8d-a574-f677ebbde5b1","Path":"property-bar.md","Order":4,"CategoryType":1,"Icon":null,"Title":"Property bar","Languages":[{"Code":"en","Title":"Property bar","Slug":"property-bar","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"42746bd2-1aac-4701-a1d9-a11b3f4a9caa","Path":"preferences-3.md","Order":2},{"Id":"3904747b-0973-4fa1-ba49-8002a0dcbd7e","Path":"sidebar.md","Order":5},{"Id":"c5f39263-24ca-4575-b829-9c1d008b75d8","Path":"tab-preview.md","Order":3},{"Id":"7e315598-d9de-498b-bfba-a42e738af0a0","Path":"toolbox.md","Order":1}],"Id":"74b5e154-045c-42b5-95d7-2b09417a0fe1","Path":null,"Order":13,"CategoryType":0,"Icon":null,"Title":"Glyph Window","Languages":[{"Code":"en","Title":"Glyph Window","Slug":"glyph-window","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"26ebc20c-564f-4b8e-8c25-c06e24735be1","Path":"window-zoom-preferences.md","Order":2},{"Id":"f8a5d1c4-9043-45d8-9b2a-77b91d15e7f1","Path":"zoom-tool-1.md","Order":1}],"Id":"969ee72a-a80f-4892-992e-5d6fefc63af0","Path":null,"Order":14,"CategoryType":0,"Icon":null,"Title":"Zoom","Languages":[{"Code":"en","Title":"Zoom","Slug":"zoom","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"891248db-6b80-4446-a1ef-52309cd0c52a","Path":"default-smart-corner-tension.md","Order":1},{"Id":"e89c4354-8c3c-459c-8884-670d732c1c5b","Path":"smart-corners-always-produce-two-nodes.md","Order":2},{"Id":"36518813-fd79-482a-af90-56480eaaa4bb","Path":"apply-smart-corner-in-node-panel.md","Order":3}],"Id":"65577cbb-e8b6-4ab6-a993-3379ab2b5614","Path":null,"Order":22,"CategoryType":0,"Icon":null,"Title":"Smart corner","Languages":[{"Code":"en","Title":"Smart corner","Slug":"smart-corner","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"832a723f-3172-44fb-ac52-bfdf654f8938","Path":"pernode-settings-for-smart-ink-traps-and-smart-corners.md","Order":18},{"Id":"3455fc7e-3f72-4885-a22a-d4491b40a863","Path":"corner-and-smooth-nodes.md","Order":17},{"Id":"486075c5-13a2-4d71-b99d-a79448b72b75","Path":"contour-menu.md","Order":21},{"Id":"817f8001-6655-4781-8e93-8c6463afa100","Path":"knife-tool-2.md","Order":9},{"Id":"bb5288e7-2625-4362-ad4f-90669a646212","Path":"replace-with-corner.md","Order":23},{"Id":"37bf0be4-d06a-4e7e-a8c1-663878de6d71","Path":"view-panel-2.md","Order":16},{"Id":"39ea0a58-7eda-4f42-9ee5-fc811167fce2","Path":"joining-open-contours-with-keyboard.md","Order":19},{"Id":"197042f5-129a-45d9-8da4-04d661f92a03","Path":"number-of-nodes-and-points-in-a-contour.md","Order":20},{"Id":"d36e8ca8-7084-4576-9482-6ecd8c125436","Path":"view-menu.md","Order":15}],"Id":"ac63c681-0285-40eb-a81b-83df5304827e","Path":"edit-refine.md","Order":5,"CategoryType":1,"Icon":null,"Title":"Edit & Refine","Languages":[{"Code":"en","Title":"Edit & Refine","Slug":"edit-refine","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"f6fdbe2a-54de-462e-9817-c777d5254a46","Path":"searching-actions.md","Order":1},{"Id":"c16af177-74ba-421a-9096-2be2449e0a04","Path":"action-sets.md","Order":2},{"Id":"414bbb51-4338-47fd-b18a-ea147dc7f3ac","Path":"action-status-bar.md","Order":3},{"Id":"49db3819-b033-4cc3-985a-fc43fac9db49","Path":"running-actions.md","Order":5},{"Id":"272882c5-7dfe-4929-b01b-16c6c44cc1be","Path":"actions-preview.md","Order":4}],"Id":"64618291-6d2a-47fc-b061-03bcfb50d02f","Path":"actions-dialog.md","Order":1,"CategoryType":1,"Icon":null,"Title":"Actions dialog","Languages":[{"Code":"en","Title":"Actions dialog","Slug":"actions-dialog","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"e113d2ed-966a-4ab7-930c-f884cc2f040c","Path":"scribble-strokes-effect-action.md","Order":4},{"Id":"8e45366a-0c02-4efe-a2b9-2e62a8a2fdde","Path":"warp-effect-action.md","Order":5},{"Id":"921533da-de0f-4a47-b87f-c22756f4fee8","Path":"3d-extrude-action.md","Order":8},{"Id":"b1fc7d30-b666-4d05-acf5-adbaa21ad5e2","Path":"engrave-action.md","Order":9},{"Id":"3c95d3af-6092-4792-84c0-ca5cef37a3a6","Path":"shadow-action.md","Order":7},{"Id":"4193cb37-5631-4819-8eca-39b3b544d2c5","Path":"multiplemaster-actions.md","Order":2},{"Id":"a3eec449-930a-4179-83ff-1f0109d9b5b5","Path":"adjust-stems-action.md","Order":3},{"Id":"4c5c12a6-e17e-4238-9843-0d0d23512933","Path":"outline-action.md","Order":6}],"Id":"92dde174-aaf9-4037-ae44-10f8fa2da29a","Path":"actions.md","Order":1,"CategoryType":1,"Icon":null,"Title":"Actions","Languages":[{"Code":"en","Title":"Actions","Slug":"actions","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"ff73c65b-2bd1-4cdd-b480-47032420312a","Path":"see-cousins-in-quick-preview-when-you-hold-space.md","Order":1}],"Id":"3a27e8e6-0b68-4646-97f8-03756c65032e","Path":"cousins.md","Order":6,"CategoryType":1,"Icon":null,"Title":"Cousins","Languages":[{"Code":"en","Title":"Cousins","Slug":"cousins","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"407c81c8-1ce4-4682-bd59-5ec7cbc9a240","Path":"short-segment.md","Order":2},{"Id":"f47a24a8-9336-46a3-9049-cc3b4400eee4","Path":"fontaudit-action.md","Order":1}],"Id":"a115d1a4-244c-4521-ad52-fee37c6537e2","Path":"fontaudit.md","Order":3,"CategoryType":1,"Icon":null,"Title":"FontAudit","Languages":[{"Code":"en","Title":"FontAudit","Slug":"fontaudit","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"00646b1c-4d22-4733-8998-ccb0e94dbe13","Path":"quickly-customize-the-preview-panel.md","Order":1},{"Id":"ba1177f6-ad6e-43b9-9b14-9a49b474cd09","Path":"optical-size-opsz-axis-in-waterfall-modes-of-the-preview-panel.md","Order":4},{"Id":"9774991a-c6d2-4ace-a45b-961012d5ee9d","Path":"all-or-visible-masters-mode-of-the-preview-panel.md","Order":2},{"Id":"e5ae6f1f-619b-4866-b261-cf5dc3d9e284","Path":"preview-panel-colors-and-lightdark-preview.md","Order":5},{"Id":"35303a05-7a7f-4447-be69-372ddc2ccb3e","Path":"echo-text-in-text-waterfall-mode-of-the-preview-panel.md","Order":3}],"Id":"ce871a3e-46b6-4a6f-b7af-7c1e99ca9925","Path":"preview-panel.md","Order":7,"CategoryType":1,"Icon":null,"Title":"Preview panel","Languages":[{"Code":"en","Title":"Preview panel","Slug":"preview-panel","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"56e97964-b76c-4172-9d6d-28705e0c03d9","Path":"using-delta-filter-for-local-adjustments.md","Order":8},{"Id":"fece0a1a-2d0b-4a90-8dc0-5069db27d261","Path":"adding-a-delta-filter.md","Order":1},{"Id":"5cd71105-fb08-4651-9908-4c928decba10","Path":"attachment-delta.md","Order":4},{"Id":"e57b46fb-342a-4129-a017-34b32d47bd49","Path":"bidirectional-move-delta.md","Order":2},{"Id":"7bf780b8-a86a-416a-bc44-ceeba4312fd9","Path":"using-delta-filter-for-variations.md","Order":9},{"Id":"215ca3ea-33a0-43b7-85e1-a510108120d3","Path":"using-delta-filter-for-derived-glyphs.md","Order":10},{"Id":"09e7e6da-85ec-4629-8723-a476c947f667","Path":"converting-to-simple-contours.md","Order":7},{"Id":"09fd952c-e09f-480d-8ed4-6624206a44e3","Path":"editing-deltas.md","Order":5},{"Id":"47e7cfb6-0acf-48ea-91cf-07d6bac77184","Path":"unidirectional-horizontal-or-vertical-move-delta.md","Order":3},{"Id":"35247689-3304-4a1c-9b48-43b4bd450f30","Path":"adjusting-the-delta-strength.md","Order":6}],"Id":"578b9a1d-7b31-4bc4-865d-31e3120d1dbd","Path":"delta-filter.md","Order":5,"CategoryType":1,"Icon":null,"Title":"Delta filter","Languages":[{"Code":"en","Title":"Delta filter","Slug":"delta-filter","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"dd87c810-be0a-4524-abfa-c0d72a87bd88","Path":"printing-the-preview-panel-contents.md","Order":1}],"Id":"e6c69b30-8069-4318-83f7-883ec9bb9e07","Path":"printing.md","Order":8,"CategoryType":1,"Icon":null,"Title":"Printing","Languages":[{"Code":"en","Title":"Printing","Slug":"printing","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"a5e4c85e-d450-41f8-942c-0048737773d5","Path":"power-guides-1.md","Order":4}],"Id":"458d4147-4b78-4761-a28d-328c17422289","Path":"test-adjust.md","Order":10,"CategoryType":1,"Icon":null,"Title":"Test & adjust","Languages":[{"Code":"en","Title":"Test & adjust","Slug":"test-adjust","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"2a526056-9c29-49a9-bd32-5ba8adfd6c66","Path":"use-metrics-line-with-set-sidebearings-action.md","Order":1}],"Id":"88ade6f1-9ad0-46be-8404-69b21f495612","Path":"metrics-line.md","Order":6,"CategoryType":1,"Icon":null,"Title":"Metrics Line","Languages":[{"Code":"en","Title":"Metrics Line","Slug":"metrics-line","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"dd205c3c-729d-47ba-9a0b-f3ded386d062","Path":"metrics-lever-precision-dragging-of-metrics.md","Order":2},{"Id":"62f81b05-724c-48aa-806f-7500c58c3d49","Path":"spacing-controls-visibility.md","Order":4},{"Id":"b149c3c9-7c32-40eb-a778-f81ee59e0f37","Path":"refined-dragging-of-sidebearings.md","Order":5},{"Id":"87a695fd-e529-406c-a35b-78f1fdb7f214","Path":"center-glyph-in-advance-width.md","Order":1},{"Id":"5fb312b4-b77b-4f01-adbb-837044c44b1b","Path":"rendering-of-spacing-controls.md","Order":3},{"Id":"355562d3-1bd4-49a0-9dab-654e11f82aa6","Path":"autospacing.md","Order":7},{"Id":"579e9961-62a7-4b98-a425-b09652529358","Path":"editing-of-optical-bounds.md","Order":8}],"Id":"11c9901e-6bd6-4269-8792-8f74a8e1ed9e","Path":"spacing.md","Order":2,"CategoryType":1,"Icon":null,"Title":"Spacing","Languages":[{"Code":"en","Title":"Spacing","Slug":"spacing","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"507258b3-2c69-4fde-97d4-c5b27d607020","Path":"visual-vs-logical-order-of-kerning-pairs.md","Order":2},{"Id":"a7459d59-fc51-4715-8460-d29f8a839895","Path":"bidirectionality-in-unicode.md","Order":1},{"Id":"ca0bc818-bec3-4739-8bb6-2da9a0a434e6","Path":"righttoleft-text-in-glyph-window.md","Order":3},{"Id":"27b49138-0cb7-415e-92ae-16cf1d8a64b3","Path":"righttoleft-kerning-support.md","Order":4}],"Id":"bf91a097-4a00-4740-be75-db8ebc85623f","Path":"right-to-left-and-bidirectional-kerning-in-opentype.md","Order":15,"CategoryType":1,"Icon":null,"Title":"Right-to-left and bidirectional kerning in OpenType","Languages":[{"Code":"en","Title":"Right-to-left and bidirectional kerning in OpenType","Slug":"right-to-left-and-bidirectional-kerning-in-opentype","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"def99fca-02b3-40e9-9288-3ef6eb2df95d","Path":"kerning-lever-precision-dragging-of-kerning.md","Order":1},{"Id":"a9ff9f89-f06f-43bf-9487-55bb24950697","Path":"copy-kerning-classes-between-masters.md","Order":13},{"Id":"57328134-b271-4e1b-b863-5ba1c852d0ee","Path":"remove-kerning-pairs-by-specified-criteria.md","Order":10},{"Id":"a5b05305-2b2b-49cd-8e6f-e52c96a69714","Path":"better-kerning-matching-across-masters.md","Order":14},{"Id":"51861352-b7ba-47e5-a7ac-f391b3cdc3ea","Path":"kerning-classes-arrangement-in-the-font-window.md","Order":6},{"Id":"efefdc46-87ed-4795-b871-f89fc526d60b","Path":"new-terminology-and-icons-for-kerning-classes.md","Order":3},{"Id":"a769c112-c8c5-43b2-af4b-f65445341b2d","Path":"kerning-classes-arrangement-in-glyph-panel.md","Order":5},{"Id":"24588ae6-6d96-448a-bb2b-76a6af742689","Path":"arrangement-of-kerning-class-assignment-boxes.md","Order":4},{"Id":"f42de2e3-a339-400d-8b8d-159756e06f2e","Path":"selective-audit-of-kerning-exceptions.md","Order":9},{"Id":"de648f6a-27b8-4fea-88b4-065fb98f858f","Path":"autokerning.md","Order":16},{"Id":"11752ef2-79ee-43ad-be98-510ee1366563","Path":"kern-to-distance.md","Order":11},{"Id":"b01adcb3-a24b-4538-a9dc-b97492332b98","Path":"copy-kerning-class-assignment-between-glyphs.md","Order":12},{"Id":"27382aef-aabf-451f-9e65-ec9741d07041","Path":"manually-create-class-kerning-exceptions.md","Order":8},{"Id":"1766a74a-dc7c-4f27-8821-f236a7c08c17","Path":"better-editing-of-kerning-classes.md","Order":7},{"Id":"a53d24ee-630a-455f-b6d4-26f82ad2bad5","Path":"hide-pointer-as-you-drag-in-kerning-mode.md","Order":2}],"Id":"eaa12960-ff29-473a-8ff8-ee98837c7c7f","Path":"kerning.md","Order":3,"CategoryType":1,"Icon":null,"Title":"Kerning","Languages":[{"Code":"en","Title":"Kerning","Slug":"kerning","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"6c1a2d7e-45d6-4a95-b716-31dfd9f2fef9","Path":"table-text-wrap.md","Order":3},{"Id":"a94aea59-7aa8-4e3b-aa0a-02e015438d33","Path":"manual-text-wrap.md","Order":1},{"Id":"a40995db-7061-4fd1-ab0c-edec9b8eb7b9","Path":"apply-text-wrap.md","Order":4},{"Id":"752cc2fa-5426-4f6b-83b5-bdd574fb0978","Path":"auto-text-wrap.md","Order":2}],"Id":"6343c132-d9bf-4057-87f1-2d5453c498d1","Path":"text-wrapping-in-glyph-window.md","Order":1,"CategoryType":1,"Icon":null,"Title":"Text wrapping in Glyph window","Languages":[{"Code":"en","Title":"Text wrapping in Glyph window","Slug":"text-wrapping-in-glyph-window","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"e147046c-6b8e-4d12-bfc6-dc5276d6276a","Path":"edit-duplicate-in-text-mode.md","Order":1},{"Id":"06140bdb-a511-4ac6-b893-95f71c2e2891","Path":"righttoleft-text.md","Order":2}],"Id":"29c07774-e97e-49fc-9819-e886167446e8","Path":"text-tool.md","Order":4,"CategoryType":1,"Icon":null,"Title":"Text tool","Languages":[{"Code":"en","Title":"Text tool","Slug":"text-tool","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"bc2b71bd-67bd-409e-aa16-ed35a52c0daf","Path":"go-back-and-forward-between-changes-of-the-glyph-window-text.md","Order":5},{"Id":"7812a437-36bc-4bde-addb-79eed1a45009","Path":"title-case-text-conversion.md","Order":2},{"Id":"657292d7-8252-4b5c-ad5b-094f0e1944b2","Path":"wrap-text-in-glyph-window.md","Order":3}],"Id":"fa68a76c-47b3-42fb-9e75-bb1990f2042f","Path":"text.md","Order":1,"CategoryType":1,"Icon":null,"Title":"Text","Languages":[{"Code":"en","Title":"Text","Slug":"text","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"3915cf1d-9cf2-456d-a335-2afd24a09974","Path":"showing-coordinates-for-key-nodes.md","Order":1},{"Id":"755028ee-44ab-46b9-ae02-c689b2b22444","Path":"showing-pointer-coordinates-on-canvas.md","Order":2},{"Id":"5cedf1c5-0077-4105-bd5b-63d720a848f6","Path":"scoreboard.md","Order":4},{"Id":"a5afa11e-fad4-4eb0-86c5-25fa4d88247a","Path":"choosing-when-to-see-coordinates.md","Order":3}],"Id":"4282a3a5-ac09-4467-be9f-14997eff278a","Path":"coordinates.md","Order":1,"CategoryType":1,"Icon":null,"Title":"Coordinates","Languages":[{"Code":"en","Title":"Coordinates","Slug":"coordinates","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"bb3aeb6f-db35-45fe-90f8-6ea7ad5f59c5","Path":"quick-measurement-between-elements-and-components.md","Order":4},{"Id":"bccce34d-8dc9-4cdf-84fa-534b31ff82a8","Path":"basic-quick-measurement-between-guides.md","Order":2},{"Id":"28b5d066-0a4b-417d-9fe7-3f0c0c755aeb","Path":"precision-of-quick-measurement.md","Order":1},{"Id":"ad002653-9fc2-4a85-b9c2-249409cf0878","Path":"show-node-offset-option-for-quick-measurement.md","Order":3}],"Id":"1727b978-2e50-465b-adbd-36af1e000954","Path":"quick-measurement.md","Order":12,"CategoryType":1,"Icon":null,"Title":"Quick measurement","Languages":[{"Code":"en","Title":"Quick measurement","Slug":"quick-measurement","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"98aa079b-8d84-49a5-ba4e-6b2780e31a5b","Path":"ghost-hints-in-glyph-window.md","Order":1},{"Id":"fedcf849-b9f6-4b24-97f7-b5ecd58a53d2","Path":"adding-ghost-hints.md","Order":2}],"Id":"8c4cd015-66f4-457a-b27d-1a65865625a4","Path":"ghost-hints.md","Order":7,"CategoryType":1,"Icon":null,"Title":"Ghost hints","Languages":[{"Code":"en","Title":"Ghost hints","Slug":"ghost-hints","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"d06ccf6d-bfe7-4e81-895e-74d1859aca8f","Path":"show-font-dimensions-zones-and-font-guides-in-current-glyph-only.md","Order":3},{"Id":"da95c14a-185c-4770-9da1-62762d27f071","Path":"locked-guides.md","Order":5},{"Id":"7fd032b9-13fc-4278-b59c-2f8b159f7e4c","Path":"converting-thick-guides-to-hints.md","Order":6},{"Id":"a2cbe2eb-5108-4dd9-b361-a7e9bccde5fa","Path":"color-opacity-of-font-glyph-and-element-guides-of-font-dimensions-hints-and-zones.md","Order":4},{"Id":"7f9a186e-5b1a-4b06-b133-8eb28657679f","Path":"hints-linked-to-nodes.md","Order":8},{"Id":"c395854f-c328-4f64-b12a-d0a84c8975c3","Path":"zones-in-glyph-window.md","Order":2},{"Id":"30aace4a-91da-4907-806f-2e7df33f89ae","Path":"add-stems-quickly.md","Order":9},{"Id":"89232182-d6fc-4021-bceb-48b1c72d66f0","Path":"zones-in-font-info.md","Order":1}],"Id":"477d7e44-3445-4384-8cf7-0583eac1fbd3","Path":"hints-zones-guides.md","Order":16,"CategoryType":1,"Icon":null,"Title":"Hints, zones, guides","Languages":[{"Code":"en","Title":"Hints, zones, guides","Slug":"hints-zones-guides","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"e1a517c1-56d0-4409-89c7-d3af4d6d7912","Path":"use-autometer-to-view-stem-widths.md","Order":1},{"Id":"e9b74594-afb9-4f8a-939b-9992c6455b6e","Path":"use-autometer-to-automatically-adjust-stems.md","Order":3},{"Id":"31b3fd39-f698-4705-bc0e-df33935ce889","Path":"use-autometer-to-view-height-or-width-of-counters.md","Order":4},{"Id":"5f2be991-ae57-4fc7-8a54-52f2465c8cfd","Path":"use-autometer-to-view-corner-angles.md","Order":5},{"Id":"43731281-d95d-4fe0-b8f5-85728b46123e","Path":"use-autometer-to-manually-adjust-stems.md","Order":2}],"Id":"029cbde4-6833-4e55-b462-6082838fcd2f","Path":"auto-meter-for-stems-counters-and-corner-angles.md","Order":11,"CategoryType":1,"Icon":null,"Title":"Auto-meter for stems, counters, and corner angles","Languages":[{"Code":"en","Title":"Auto-meter for stems, counters, and corner angles","Slug":"auto-meter-for-stems-counters-and-corner-angles","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"b0bac26f-8b1c-4236-94db-c35bbd68d4d0","Path":"autometer-for-corner-angles.md","Order":4},{"Id":"61a152f1-863d-44c7-8b3b-35e2b1353f41","Path":"freeform-measuring-of-angles.md","Order":7},{"Id":"9e44581d-4029-46c0-a892-fbd6c666c4dc","Path":"guides-in-guides-tool.md","Order":5},{"Id":"2246a1c9-83e2-4473-a3a1-1c052af8972e","Path":"context-menu-operations.md","Order":6},{"Id":"570c165a-da28-45f4-a49e-f2f2eab1a943","Path":"autometer-for-stem-widths.md","Order":3},{"Id":"3215e0fc-a795-4990-82cd-1cdaa920cbc8","Path":"length-of-line-segments-and-handle-vectors.md","Order":1},{"Id":"ba9a008e-d0ba-4533-80c5-72a3f295a273","Path":"visible-masters-and-master-relations.md","Order":8},{"Id":"eb248b47-5bf9-4b5c-9064-1de945785615","Path":"showing-curve-segment-tension.md","Order":2}],"Id":"063ed44a-8f22-401d-9aac-68d44a10c27c","Path":"guides-tool.md","Order":14,"CategoryType":1,"Icon":null,"Title":"Guides tool","Languages":[{"Code":"en","Title":"Guides tool","Slug":"guides-tool","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"b86023ca-b685-4a62-82ae-df33a82a41fd","Path":"suggest-lines.md","Order":2},{"Id":"d54c729c-e0d0-4ee1-bdfc-3ff57e39b680","Path":"distance-suggestions-with-open-contours.md","Order":3},{"Id":"a7ccefce-9e78-41be-b60a-8f64de2cffde","Path":"suggest-handles.md","Order":1}],"Id":"867f621d-23b5-4935-9db2-49b3e8f7f8f2","Path":"snapping-suggestions.md","Order":2,"CategoryType":1,"Icon":null,"Title":"Snapping suggestions","Languages":[{"Code":"en","Title":"Snapping suggestions","Slug":"snapping-suggestions","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"a4b3952a-6239-4c1d-953b-e192bc7e077d","Path":"showing-the-length-of-line-segments-and-handle-vectors.md","Order":1},{"Id":"c18bd14a-3419-4dd0-a11f-20f51a91e5be","Path":"showing-the-tension-of-curve-segments.md","Order":2}],"Id":"01cafffc-bb33-41c2-95b5-eb9594a5e7b4","Path":"measuring-details-in-glyph-window.md","Order":13,"CategoryType":1,"Icon":null,"Title":"Measuring details in Glyph window","Languages":[{"Code":"en","Title":"Measuring details in Glyph window","Slug":"measuring-details-in-glyph-window","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"8ccdec12-70f8-431b-bd2c-ed529a5707cc","Path":"delta-hints-in-the-tth-glyph-window-waterfall.md","Order":5},{"Id":"e90c2684-70e9-4b8c-a545-99cd2c45cb04","Path":"removing-tth-commands.md","Order":8},{"Id":"e29ebdfc-97d1-4931-a51b-e6a6d10bb675","Path":"remove-x-or-y-hints-only-with-tools-actions.md","Order":9},{"Id":"979db7db-1b3d-4633-96a2-14ded0c45875","Path":"truetype-hinting-preview-in-glyph-window.md","Order":2},{"Id":"440a979e-d777-49b8-97ea-e347444c47f4","Path":"import-tth-stems-and-tth-zones-from-font-info.md","Order":1},{"Id":"0443e00c-be62-4227-a4c9-cc5320542c92","Path":"tth-stems-dropdown-in-tth-tool-property-bar.md","Order":7},{"Id":"73aa8d19-ba75-40a9-ae6a-0bde091e2f7d","Path":"ppm-size-selector-in-the-tth-tool-property-bar.md","Order":6},{"Id":"5a93808e-8b50-427c-a0d9-fe734a5175a5","Path":"zoomable-preview-in-the-truetype-hinting-panel.md","Order":4},{"Id":"b1fa8744-7108-4b8c-94fc-ee8dc83f895d","Path":"preview-rasterized-glyphs-in-the-truetype-hinting-panel.md","Order":3}],"Id":"cd2e190a-3ada-4c83-8d02-7b687708f30b","Path":"truetype-hinting.md","Order":17,"CategoryType":1,"Icon":null,"Title":"TrueType Hinting","Languages":[{"Code":"en","Title":"TrueType Hinting","Slug":"truetype-hinting","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"c1c56d4e-964f-45c5-9558-b7794c5b9f11","Path":"view-distance-of-dragged-guides.md","Order":5},{"Id":"f1e4e004-7b7f-4a9c-a3d6-b5bd84db962c","Path":"align-points-to-grid.md","Order":7},{"Id":"0511ec4e-3e2f-4428-83b6-c9becd7964fd","Path":"long-and-short-guides.md","Order":4},{"Id":"233340b8-51df-4779-8b57-585e39a13c3b","Path":"align-points-to-guides.md","Order":6},{"Id":"f6984b26-b80d-4b73-9304-9a68aa859713","Path":"align-points-to-mask.md","Order":8},{"Id":"b6d5278f-5ce6-47b5-b23b-8c269d40f118","Path":"better-autohinting-settings.md","Order":9},{"Id":"e26d4334-3295-423e-ab1e-bc147f4df340","Path":"quick-measurement-for-guides-and-anchors.md","Order":3},{"Id":"09ba1a25-44e6-4d07-9bf0-a79b0e697d7d","Path":"number-of-stems-and-zones.md","Order":10}],"Id":"cedc16cf-bf70-45ef-ac06-570473117839","Path":"consistency-precision.md","Order":6,"CategoryType":1,"Icon":null,"Title":"Consistency & precision","Languages":[{"Code":"en","Title":"Consistency & precision","Slug":"consistency-precision","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"41ee41b1-406a-446c-9a96-54f36aeabccb","Path":"font-info-add-master.md","Order":2},{"Id":"22595bc1-a299-4c61-bc9e-d91272bef7ae","Path":"use-font-info-axes-detect-axes-to-build-variation-axes-info-based-on-the-names-of-the-layers.md","Order":1}],"Id":"39cd8ae0-c423-4dd9-95ed-f784f65a01e9","Path":"variation-in-font-info.md","Order":9,"CategoryType":1,"Icon":null,"Title":"Variation in **Font Info**","Languages":[{"Code":"en","Title":"Variation in **Font Info**","Slug":"variation-in-font-info","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"70b83fbf-ead8-4dc3-8bd7-a07018d04094","Path":"manually-matching-masters-with-matchmaker.md","Order":3},{"Id":"9f15039b-a5e3-4610-b379-7c5b93699f8c","Path":"match-masters-in-matchmaker-tool.md","Order":4},{"Id":"02c54d08-ebbe-45ae-aa1e-845a525d78c8","Path":"show-intermediates-turned-off.md","Order":2},{"Id":"a6e063dd-4019-4c01-81b1-742b891e5a63","Path":"contour-order-in-matchmaker-tool.md","Order":5},{"Id":"032916c7-00a9-4adf-9fd4-257b8b392b5a","Path":"start-points-in-matchmaker-tool.md","Order":6},{"Id":"98538c8a-8697-41e0-aeec-614941f47e66","Path":"contour-direction-in-matchmaker-tool.md","Order":7},{"Id":"52814f40-6cf0-4087-8fbc-f9c861ed4e76","Path":"show-intermediates-turned-on.md","Order":1}],"Id":"69d1ab1c-63c1-400c-b259-aef99f12dcac","Path":"matchmaker-tool.md","Order":4,"CategoryType":1,"Icon":null,"Title":"Matchmaker tool","Languages":[{"Code":"en","Title":"Matchmaker tool","Slug":"matchmaker-tool","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"2bae4ae6-0bab-4a9a-9966-110996800408","Path":"choose-dynamic-instance-for-a-smart-variable-component.md","Order":1},{"Id":"0036ad4a-9440-4398-be29-7205d5871605","Path":"define-custom-glyph-axes-for-smart-variable-component-sources.md","Order":2},{"Id":"3e3cc4b9-9c5d-44d1-87f7-2dc81d2394fc","Path":"component-sources-that-have-fontless-masters.md","Order":3}],"Id":"aa649856-8f77-4353-aec6-a326b561e6de","Path":"smart-variable-components.md","Order":11,"CategoryType":1,"Icon":null,"Title":"Smart variable components","Languages":[{"Code":"en","Title":"Smart variable components","Slug":"smart-variable-components","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"338b8182-587c-4aef-9b9d-4ff5b9d953f5","Path":"match-when-editing.md","Order":3},{"Id":"f54bf011-1f7b-48ce-9033-30c372cae272","Path":"make-variable-fonts-from-static-fonts.md","Order":1},{"Id":"f1ec02ce-5af2-4bd3-a1e3-9f3139513caf","Path":"add-variation-quickly.md","Order":2},{"Id":"20d4dc19-04e0-42fa-84e8-a1a710a5da4c","Path":"improved-match-masters.md","Order":5},{"Id":"96369836-890f-4989-918e-633bf369f050","Path":"set-variation-location-when-you-add-a-new-layer.md","Order":7},{"Id":"084b29e1-f704-4a9b-be34-30286dad425b","Path":"specify-location-of-fontless-masters.md","Order":6},{"Id":"2277ff87-8208-4c14-b59c-07885f2dbd62","Path":"tools-actions-adjust-by-variation.md","Order":10}],"Id":"f1fa706b-b8c1-4f60-8a39-a73ab093d464","Path":"variation.md","Order":1,"CategoryType":1,"Icon":null,"Title":"Variation","Languages":[{"Code":"en","Title":"Variation","Slug":"variation","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"8fb7c08b-5106-48f3-88ca-d93b44a35df8","Path":"associated-layers.md","Order":2},{"Id":"432985ce-3c69-4673-8a35-59e3cb049e19","Path":"mask-layer.md","Order":1}],"Id":"a896c96d-5b39-445a-8d69-c90cf8675136","Path":"visual-grouping-of-layers-in-the-layers-masters-panel.md","Order":1,"CategoryType":1,"Icon":null,"Title":"Visual grouping of layers in the **Layers & Masters** panel","Languages":[{"Code":"en","Title":"Visual grouping of layers in the **Layers & Masters** panel","Slug":"visual-grouping-of-layers-in-the-layers-masters-panel","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"8f7c8d8c-effb-4ee8-86b6-7e09e7a095ec","Path":"inactive-layers-as-wireframes.md","Order":3},{"Id":"ff873b51-bd30-409c-9827-8ccca5a1992a","Path":"components-in-mask-layer.md","Order":2}],"Id":"e35ced50-5c4b-4ab6-8763-f72c05a4a650","Path":"layers.md","Order":2,"CategoryType":1,"Icon":null,"Title":"Layers","Languages":[{"Code":"en","Title":"Layers","Slug":"layers","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"d7991556-4523-45b4-a787-317ad6e378a9","Path":"conditional-glyph-substitution-with-features-other-than-rvrn.md","Order":4},{"Id":"a0c3aaf4-7de2-432b-a19e-82d9837265b6","Path":"automatic-panning-of-glyph-window.md","Order":3}],"Id":"d9802a6f-5d18-4d35-8615-bfa93b3cba2c","Path":"families-variation.md","Order":9,"CategoryType":1,"Icon":null,"Title":"Families & variation","Languages":[{"Code":"en","Title":"Families & variation","Slug":"families-variation","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"14e6ca9b-452e-4d13-a522-cbe488e0e8de","Path":"contour-convert-to-new-element.md","Order":2},{"Id":"14a90d38-6b2d-4b47-b90a-3de380e82824","Path":"element-references-and-filters.md","Order":5},{"Id":"f261916a-bd1f-4c95-8c4f-a367ba359a9e","Path":"adding-element-references.md","Order":6},{"Id":"b64981d1-52e4-44a7-b10a-dfefed8ddbd4","Path":"contour-convert-detect-element-reference.md","Order":3},{"Id":"1baa5f9e-d3c4-44fa-99fa-13c7074c8766","Path":"copypaste-live-transformation-between-elements.md","Order":4}],"Id":"f053daec-b6c9-45bf-a705-f4aa1491e128","Path":"elements-and-components.md","Order":1,"CategoryType":1,"Icon":null,"Title":"Elements and components","Languages":[{"Code":"en","Title":"Elements and components","Slug":"elements-and-components","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"76704fee-b0fd-4632-8d7d-e0999b129994","Path":"applying-fusion.md","Order":2},{"Id":"fa318762-8c86-43f8-86ee-f02634f280df","Path":"editing-fusion.md","Order":1}],"Id":"27e5b425-e6ca-4673-bcc7-f0c97d60e108","Path":"fusion-filter.md","Order":2,"CategoryType":1,"Icon":null,"Title":"Fusion filter","Languages":[{"Code":"en","Title":"Fusion filter","Slug":"fusion-filter","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"c33cce1e-3589-4463-ae30-46a2a907803e","Path":"contour-overlap-subtract.md","Order":2},{"Id":"784d4f47-2900-49e8-adbd-7b6d61f63f26","Path":"contour-overlap-intersect.md","Order":3},{"Id":"6fe7190c-383a-4bd7-a325-7503fa043bbc","Path":"protecting-contours-from-contour-overlap-operations.md","Order":5},{"Id":"0c91a227-0ce4-41cf-ae3b-81652ce6822d","Path":"choosing-the-front-and-back-contours.md","Order":1},{"Id":"5877f827-1993-497f-be90-e002bc34e590","Path":"contour-overlap-exclude.md","Order":4}],"Id":"2fedcab4-81a9-41a3-b2b7-9911df12c3fb","Path":"contour-overlap-operations.md","Order":4,"CategoryType":1,"Icon":null,"Title":"**Contour: Overlap** operations","Languages":[{"Code":"en","Title":"**Contour: Overlap** operations","Slug":"contour-overlap-operations","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"0150f89d-1064-4a32-ad9e-097b17719421","Path":"inverted-glyphs-with-smart-fill.md","Order":1}],"Id":"e68d08bf-fe6e-4154-b8d1-8aea050616ba","Path":"fill-tool-and-filter.md","Order":1,"CategoryType":1,"Icon":null,"Title":"Fill tool and filter","Languages":[{"Code":"en","Title":"Fill tool and filter","Slug":"fill-tool-and-filter","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"7d503de3-78d9-42c3-af64-f346def3091e","Path":"clipping-group.md","Order":3}],"Id":"a67c9c86-f44e-43cb-93b1-014f65df0958","Path":"boolean-operations.md","Order":7,"CategoryType":1,"Icon":null,"Title":"Boolean operations","Languages":[{"Code":"en","Title":"Boolean operations","Slug":"boolean-operations","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"fe181c1e-267a-4e77-9cd1-872fd880d9f6","Path":"move-anchors-vertically-along-italic-angle.md","Order":3},{"Id":"1ebfccef-fb89-42e1-8fa7-f7c2bae8e24b","Path":"aligning-anchors.md","Order":4},{"Id":"dec8d3ca-91b6-437a-8f4b-9ac85c990d91","Path":"tools-actions-guides-anchors.md","Order":2}],"Id":"00100fc5-d393-468e-82ab-88bb4ff46a81","Path":"anchors.md","Order":2,"CategoryType":1,"Icon":null,"Title":"Anchors","Languages":[{"Code":"en","Title":"Anchors","Slug":"anchors","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"7d5f3cc8-2106-40ec-aa8c-a0114c5bdcb3","Path":"contour-convert-detect-component.md","Order":3},{"Id":"6e569caa-19f4-4b97-ba33-892d483d1bb8","Path":"paste-glyph-as-component-with-edit-paste-special.md","Order":6},{"Id":"5f689956-06ec-47b3-86c7-8d9367de2625","Path":"contour-convert-to-new-component.md","Order":2},{"Id":"c85e0f11-7f62-4443-84d6-9ab808abccbc","Path":"build-glyphs-and-add-glyphs-from-catalog-in-the-font-menu.md","Order":1},{"Id":"1cd453bd-d70c-44a3-9f41-3ff769082077","Path":"copy-auto-layer-recipes.md","Order":7},{"Id":"816e61bb-0b26-4fab-9d7a-d46ccce4c5ab","Path":"do-not-inherit-mark-anchors-from-components-to-base-or-ligature-glyphs-on-export.md","Order":4},{"Id":"c8e0b8e9-b361-4804-b197-35c90576a37f","Path":"attached-components-and-auto-layers-with-exitentry-anchors.md","Order":8},{"Id":"ee5673e2-c899-47ca-aaad-4eb92a9ee6f6","Path":"do-not-inherit-any-anchors-from-components-when-building-an-auto-layer.md","Order":5}],"Id":"ad3bf2c6-d57a-4c9a-b035-1502caecd8be","Path":"components-auto-layers-mark-attachment.md","Order":3,"CategoryType":1,"Icon":null,"Title":"Components, Auto layers, mark attachment","Languages":[{"Code":"en","Title":"Components, Auto layers, mark attachment","Slug":"components-auto-layers-mark-attachment","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"0b5d07cc-04e7-4573-8636-8fbd2a78fa6f","Path":"segment-skin.md","Order":2},{"Id":"eda9abf0-12ee-48a7-80b9-9c5ca5c47d43","Path":"corner-skin.md","Order":4},{"Id":"4bf51f74-ccfe-4eda-bffa-9d9360a5bf1c","Path":"editing-skin.md","Order":6},{"Id":"fc9f55f9-a925-4874-ab31-4493acfffde7","Path":"add-anchor-for-skin-source-glyphs.md","Order":7},{"Id":"d3e9cfec-151f-4873-adbb-1bef4e6d7bb8","Path":"cap-skin.md","Order":5},{"Id":"1cb96af9-f5f0-44f0-bfd8-9efb76868446","Path":"dash-skin.md","Order":3},{"Id":"571d91fe-bbcb-49e3-8c19-7923863edf36","Path":"filter-glyphs-when-you-add-a-skin-filter.md","Order":1}],"Id":"9d05cd79-8491-4288-9750-0ada542024d4","Path":"skin-filter.md","Order":4,"CategoryType":1,"Icon":null,"Title":"Skin Filter","Languages":[{"Code":"en","Title":"Skin Filter","Slug":"skin-filter","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"fbcda2a1-e70d-4dc7-9f83-010a02895d2d","Path":"replacing-a-serif-with-a-corner-skin.md","Order":2},{"Id":"52b85efa-10b7-4a82-88ff-8c25e1977e18","Path":"replacing-a-serif-with-a-glued-element.md","Order":1}],"Id":"e1c9a384-bd67-42cc-889f-c2c73f4a33a8","Path":"skin-filter-vs-glue.md","Order":6,"CategoryType":1,"Icon":null,"Title":"Skin Filter vs. Glue","Languages":[{"Code":"en","Title":"Skin Filter vs. Glue","Slug":"skin-filter-vs-glue","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"fc301668-9b02-43b5-a75a-2e83c0c31d81","Path":"new-glue-filter.md","Order":1},{"Id":"dc76870a-750d-49e9-b6da-3e3676f7bb75","Path":"legacy-glue-filter.md","Order":2}],"Id":"0085aba1-2bf8-449f-8b50-0844329832f1","Path":"glue-filter.md","Order":5,"CategoryType":1,"Icon":null,"Title":"Glue filter","Languages":[{"Code":"en","Title":"Glue filter","Slug":"glue-filter","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"dcda5ea8-31d5-4ae7-9a44-97546987b0ed","Path":"the-element-itself.md","Order":1},{"Id":"bbee5c3e-7e60-402b-814f-83c33402e703","Path":"relationships-between-elements.md","Order":2},{"Id":"e1ad5335-aeb8-40f5-be43-1ceab7a7a894","Path":"design-with-live-filters.md","Order":3},{"Id":"9c50ba51-30f5-4a2d-be9d-8db15dd45367","Path":"images-and-color.md","Order":4}],"Id":"932b5f2d-a5ef-4395-bc1e-5f327e3971cc","Path":"element-menu.md","Order":9,"CategoryType":1,"Icon":null,"Title":"Element menu","Languages":[{"Code":"en","Title":"Element menu","Slug":"element-menu","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"36c5cbe3-dd70-4945-af34-da1164a64715","Path":"automatic-detection-of-composites-and-element-references.md","Order":10}],"Id":"62b35e61-4bb3-46b9-83d3-0ec4f92d2654","Path":"build-assemble.md","Order":7,"CategoryType":1,"Icon":null,"Title":"Build & assemble","Languages":[{"Code":"en","Title":"Build & assemble","Slug":"build-assemble","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"9a05a4c2-3f4e-4462-9a59-06bfaaee41e5","Path":"builtin-vs-custominstalled-fonttools.md","Order":1}],"Id":"37601bb2-c6da-4839-9e70-3a8b15623ca4","Path":"fonttools.md","Order":2,"CategoryType":1,"Icon":null,"Title":"fontTools","Languages":[{"Code":"en","Title":"fontTools","Slug":"fonttools","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"3b9e4448-1cef-466c-8fe1-c0676fe12450","Path":"typerig-1.md","Order":1}],"Id":"d43f21d2-adad-4e40-ac78-d74f68107f37","Path":"installing-and-using-scripts.md","Order":4,"CategoryType":1,"Icon":null,"Title":"Installing and using scripts","Languages":[{"Code":"en","Title":"Installing and using scripts","Slug":"installing-and-using-scripts","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"fe68362f-0ab7-4a71-974e-09b722f2bd00","Path":"direct-access-to-preferences.md","Order":1},{"Id":"f344eeb8-9f23-48ed-9485-cb0e91a9ca51","Path":"extended-access-to-preferences.md","Order":2}],"Id":"daecf8d7-5fd1-41f7-aade-696a31ba6f89","Path":"preferences-in-python.md","Order":5,"CategoryType":1,"Icon":null,"Title":"Preferences in Python","Languages":[{"Code":"en","Title":"Preferences in Python","Slug":"preferences-in-python","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"3c124043-0c2b-4e75-8974-747a592838ba","Path":"html-in-output-panel.md","Order":1},{"Id":"60c0eb89-e1e3-4b6f-b646-e0e354399814","Path":"html-links-in-output-panel.md","Order":2}],"Id":"a33daf7e-c2ae-4408-aa89-df4fde329510","Path":"output-panel.md","Order":2,"CategoryType":1,"Icon":null,"Title":"Output panel","Languages":[{"Code":"en","Title":"Output panel","Slug":"output-panel","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"b19e80fb-086d-48d2-8dfe-885a876c5473","Path":"run-current-script-from-collapsed-scripting-panel.md","Order":2},{"Id":"2fdd87c8-ccd0-416a-b81b-1d1525e1de92","Path":"clearing-output-panel-whenever-you-run-a-script.md","Order":1},{"Id":"0b71ced6-9280-4365-beab-fe943564f21d","Path":"find-next-1.md","Order":3}],"Id":"fdc04aa4-fbd7-423a-8bfb-b6ef8cbc2b5e","Path":"scripting-panel.md","Order":1,"CategoryType":1,"Icon":null,"Title":"Scripting panel","Languages":[{"Code":"en","Title":"Scripting panel","Slug":"scripting-panel","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"daf92776-2c62-43e5-8d64-7f4cd535d426","Path":"python-scripting-on-macos.md","Order":1},{"Id":"70ec10e5-d586-45fe-a30e-f1e77462e7da","Path":"troubleshooting-your-python-packages.md","Order":3},{"Id":"9eee485c-9cb3-4896-8d53-1a47d3548182","Path":"python-scripting-on-windows.md","Order":2}],"Id":"93d995c7-68b0-459b-b9d1-820c5ba7fc1a","Path":"python-311.md","Order":3,"CategoryType":1,"Icon":null,"Title":"Python 3.11","Languages":[{"Code":"en","Title":"Python 3.11","Slug":"python-311","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"7ae60f94-275c-4acb-90ac-378b19d79f9a","Path":"run-actions-and-action-sets-in-python.md","Order":7},{"Id":"9c8d78f8-b1ed-47d3-b157-edaa9064d71d","Path":"integrated-libraries.md","Order":8},{"Id":"01b4ea06-7ece-4df9-82af-86422c52976e","Path":"python-hooks.md","Order":6}],"Id":"d50b223a-26d3-4c1f-a7a3-8f7fa6af7208","Path":"scripts-extensions.md","Order":14,"CategoryType":1,"Icon":null,"Title":"Scripts & extensions","Languages":[{"Code":"en","Title":"Scripts & extensions","Slug":"scripts-extensions","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"c31d575c-5a26-4892-8338-ee45d790a04d","Path":"color-and-gradient-bar.md","Order":2},{"Id":"77459883-48da-436e-92bc-ea9b9d5de45d","Path":"color-type-selector.md","Order":1},{"Id":"01e5ca14-9117-424d-8764-c725e279b394","Path":"text-color-selector.md","Order":7},{"Id":"4760bc4a-c995-438d-8694-20eb4f8f2502","Path":"system-color-selector.md","Order":8},{"Id":"3af09a50-44cf-44e4-a6ab-816edcdebbfe","Path":"transparency-selector.md","Order":6},{"Id":"6714ecb2-faa7-4291-8ddc-3604fb854e4a","Path":"apply-button.md","Order":9},{"Id":"d05ae763-e427-48b7-a668-d71bd0859e3c","Path":"color-editor.md","Order":4},{"Id":"df3cf85e-4468-484d-8ece-a7bd64763ad4","Path":"visual-gradient-editor.md","Order":3},{"Id":"7aa6346c-458b-4e01-b391-8f2bb732f47a","Path":"palettes-dialog.md","Order":5}],"Id":"70b4343a-dffe-4c9f-bae9-c410ab83f605","Path":"colors-panel.md","Order":1,"CategoryType":1,"Icon":null,"Title":"Colors panel","Languages":[{"Code":"en","Title":"Colors panel","Slug":"colors-panel","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"d0c58c8c-ee87-4a29-8af4-95d2a44f674e","Path":"copypaste-of-stroke-fill.md","Order":2}],"Id":"60cc9947-9ee9-450a-ad71-017685600129","Path":"color.md","Order":11,"CategoryType":1,"Icon":null,"Title":"Color","Languages":[{"Code":"en","Title":"Color","Slug":"color","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"5024c7fe-1e7a-48e9-a9bd-8f549d6bff01","Path":"open-variable-installed-fonts.md","Order":1}],"Id":"3fe35e48-0b12-482f-af8e-1c0ea40621db","Path":"open-installed-fonts.md","Order":2,"CategoryType":1,"Icon":null,"Title":"Open installed fonts","Languages":[{"Code":"en","Title":"Open installed fonts","Slug":"open-installed-fonts","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"905c1066-536e-4cf2-83f6-4901166ff0a2","Path":"exporting-current-layer-or-masters.md","Order":2},{"Id":"18029c54-bc9d-411c-93e8-91e3fde294f9","Path":"exporting-designspaceufo.md","Order":3},{"Id":"dcf51e29-c6b2-4bc2-9754-f104c8da30ea","Path":"better-handling-of-reserved-windows-filenames.md","Order":1}],"Id":"3546654d-ae12-4174-8f6b-e6bce2d613ef","Path":"exporting-ufo-or-designspaceufo.md","Order":4,"CategoryType":1,"Icon":null,"Title":"Exporting UFO or DesignSpace+UFO","Languages":[{"Code":"en","Title":"Exporting UFO or DesignSpace+UFO","Slug":"exporting-ufo-or-designspaceufo","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"16fb0b66-40d4-42ba-9ccb-c96a1d43a07f","Path":"recover-autosaved-files.md","Order":1}],"Id":"926c365e-5326-4add-8d66-1c47e1602047","Path":"autosave.md","Order":7,"CategoryType":1,"Icon":null,"Title":"Autosave","Languages":[{"Code":"en","Title":"Autosave","Slug":"autosave","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"20f2dc4a-2b9f-474f-b755-6c6ad86d8115","Path":"export-large-asian-opentype-fonts.md","Order":2},{"Id":"b1a33f10-1d55-4d9f-ab9e-46a758aa312b","Path":"exporting-opentypecolr.md","Order":3},{"Id":"194a8d28-4c4e-4a04-a120-2f6157b1b251","Path":"export-variable-colrv1-fonts.md","Order":4},{"Id":"ff613a9c-e67f-4192-b660-e2b67ed603bb","Path":"export-static-opentype-fonts-with-a-cubic-glyf-table.md","Order":1},{"Id":"6cc8be31-cbe6-4fef-bd73-f76ce3355a10","Path":"legacy-truetype-kern-table-only-includes-pairs-of-encoded-glyphs.md","Order":5}],"Id":"8d151afa-475c-4a25-89f3-8e64cf1768fd","Path":"exporting-opentype.md","Order":1,"CategoryType":1,"Icon":null,"Title":"Exporting OpenType","Languages":[{"Code":"en","Title":"Exporting OpenType","Slug":"exporting-opentype","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"62204302-1a6f-4737-a332-f6f0caf864ef","Path":"exporting-glyphs-format-version-2-or-3.md","Order":1}],"Id":"803ca181-6532-4ba3-b57d-ba9c5b8fd4c4","Path":"exporting-glyphs.md","Order":3,"CategoryType":1,"Icon":null,"Title":"Exporting `.glyphs`","Languages":[{"Code":"en","Title":"Exporting `.glyphs`","Slug":"exporting-glyphs","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"c4a9d8b3-0917-4413-97e9-1356926b9186","Path":"exporting-color-woff2.md","Order":2},{"Id":"d27367e6-0ad7-4b93-8e7a-07b9303ebe80","Path":"exporting-variable-woff2.md","Order":1},{"Id":"ead2fbd6-5566-4768-9de8-033794e85e7f","Path":"generating-supporting-html-css-files.md","Order":3}],"Id":"7fa856fc-c47d-417c-b10a-6e9b4b859850","Path":"exporting-webfonts.md","Order":2,"CategoryType":1,"Icon":null,"Title":"Exporting Webfonts","Languages":[{"Code":"en","Title":"Exporting Webfonts","Slug":"exporting-webfonts","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"b334305b-0026-49ca-8bc0-7c1e6735764d","Path":"more-portable-vfj-saving-for-better-interchange.md","Order":5},{"Id":"1ebeb09f-b50f-43e6-aef1-4bb4a782286c","Path":"temporarily-install-exported-fonts.md","Order":6},{"Id":"ab032405-cc04-4124-b8f1-e98d1c7c3fab","Path":"exporting-with-same-as-source.md","Order":9},{"Id":"98bb98f5-8f6b-481f-8cb4-05428388dbef","Path":"save-and-export-confirmations.md","Order":10},{"Id":"ed1f286c-1680-4de1-8b74-11c64e6ec1ad","Path":"export-multiple-fonts-into-multiple-profiles-in-one-step.md","Order":8}],"Id":"6aa8045d-c71f-4842-95ba-b2145336937b","Path":"saving-and-exporting-fonts.md","Order":3,"CategoryType":1,"Icon":null,"Title":"Saving and exporting fonts","Languages":[{"Code":"en","Title":"Saving and exporting fonts","Slug":"saving-and-exporting-fonts","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"24b182d0-6551-4938-8ee2-10b025e14337","Path":"storing-original-ufo-folder-and-filenames.md","Order":1},{"Id":"29882466-34e6-4d13-a89f-99a98d8d4249","Path":"singlemaster-axis.md","Order":2},{"Id":"192e8c8a-52e4-4530-b228-297ec7d109bb","Path":"caret-offset.md","Order":3}],"Id":"42e94be6-7d9e-42f9-adb3-5262bdab77ff","Path":"opening-ufo-or-designspaceufo.md","Order":2,"CategoryType":1,"Icon":null,"Title":"Opening UFO or DesignSpace+UFO","Languages":[{"Code":"en","Title":"Opening UFO or DesignSpace+UFO","Slug":"opening-ufo-or-designspaceufo","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"4beb5bd2-4003-4b58-87ee-4ca3f0df503b","Path":"opening-color-opentypesbix.md","Order":5},{"Id":"9a064b97-6569-4e10-9dfc-ec6476dfac00","Path":"open-opentype-fonts-with-cubic-glyf-table.md","Order":7},{"Id":"78f3d6cc-3747-4780-8e2c-407a8e61d7ca","Path":"open-variable-colrv1-fonts.md","Order":4},{"Id":"876831ad-6616-4ea4-9415-51244cf4f000","Path":"opening-multiflavor-color-opentype.md","Order":6},{"Id":"c6090601-7c82-4a05-b253-8b672a94800f","Path":"opening-color-opentypesvg.md","Order":3},{"Id":"1a7036f9-fadd-4010-beeb-2e4c0b983a25","Path":"decompilation-of-apple-aat-features.md","Order":10},{"Id":"d22d9dd6-e974-4bae-9281-6e2c814c7959","Path":"opening-truetypeflavored-opentype-ttf.md","Order":1},{"Id":"40281da3-a621-46ee-a5be-5a0f976031fa","Path":"opening-variable-opentype.md","Order":2},{"Id":"d3fe7e65-abb5-4227-b644-b425aec70e88","Path":"decompiling-features-for-complexscript-fonts.md","Order":8},{"Id":"6470eddd-c490-4c5c-bfb9-45e72b4bd312","Path":"better-decompilation-of-contextual-opentype-features.md","Order":9}],"Id":"1974eb87-94b5-4fdf-9a98-4e954fd8dbeb","Path":"opening-opentype.md","Order":1,"CategoryType":1,"Icon":null,"Title":"Opening OpenType","Languages":[{"Code":"en","Title":"Opening OpenType","Slug":"opening-opentype","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"cb43b4bd-9855-499c-943f-fc60bcc7f8a5","Path":"opening-bdf-bitmap-fonts.md","Order":3},{"Id":"2251b636-03ac-416b-8d9c-cd158eea3ff5","Path":"opening-fonts-or-importing-artwork-with-fractional-coordinates.md","Order":4},{"Id":"aaedbc29-33a3-442a-a9af-36c2b38debbc","Path":"import-multiple-images.md","Order":5}],"Id":"a9aa6554-27d7-49f9-a5d0-09b44611647e","Path":"opening-files.md","Order":1,"CategoryType":1,"Icon":null,"Title":"Opening files","Languages":[{"Code":"en","Title":"Opening files","Slug":"opening-files","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"3c057cb6-5ab9-4f1a-8d6d-59a25e75f56a","Path":"export-preview-panel-content-as-pdf.md","Order":6},{"Id":"943dfa1a-aac6-4826-83bc-134d355fbdc1","Path":"export-glyph-window-text-as-pdf-or-svg.md","Order":5},{"Id":"b413724f-ac66-408a-8d80-67b595b3bf06","Path":"export-multiple-glyphs-as-single-pdf-svg-or-png-images.md","Order":4},{"Id":"34a0f509-34ab-4b50-8047-035600c54a66","Path":"export-font-window-glyph-table-as-pdf.md","Order":7}],"Id":"30276b7f-589c-494a-be0f-495263fbf066","Path":"formats.md","Order":13,"CategoryType":1,"Icon":null,"Title":"Formats","Languages":[{"Code":"en","Title":"Formats","Slug":"formats","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"a0bf1554-26e2-4ae1-8fd4-1ecfe2547723","Path":"global-keys.md","Order":3},{"Id":"b3bb9323-3728-413a-94fb-7fa38e404935","Path":"quick-find-glyph.md","Order":2},{"Id":"0ed447db-c3ac-448c-8f55-49ea883603ea","Path":"scrolling-to-browse-glyphs-and-layers-in-glyph-window.md","Order":1}],"Id":"319b8848-3b16-4078-9e84-dc0a6e80dfc8","Path":"navigating-glyphs.md","Order":1,"CategoryType":1,"Icon":null,"Title":"Navigating glyphs","Languages":[{"Code":"en","Title":"Navigating glyphs","Slug":"navigating-glyphs","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"d89d151a-1bd1-46d8-b33a-d35f27e7db37","Path":"synonyms-in-preview-panel.md","Order":3},{"Id":"0dac200e-237d-4248-b1d4-4b72259dac5e","Path":"renaming-alternate-glyphs-when-renaming-a-glyph.md","Order":4},{"Id":"5ee9051f-35ad-4c95-8573-a764490c1485","Path":"copy-glyph-name-in-glyph-window-property-bar.md","Order":1},{"Id":"a22856c0-f843-4eca-ab39-1ff177eef8d0","Path":"long-glyph-names.md","Order":2}],"Id":"8d7c39b6-d9de-4d3b-b643-50c25d81344b","Path":"renaming-glyphs.md","Order":1,"CategoryType":1,"Icon":null,"Title":"Renaming glyphs","Languages":[{"Code":"en","Title":"Renaming glyphs","Slug":"renaming-glyphs","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"51ec98e1-c237-45b4-825d-770821c015c0","Path":"font-color-flags.md","Order":2},{"Id":"a39eab24-14fa-4f7b-99cc-7adb72e87b46","Path":"color-flags-intensity.md","Order":4},{"Id":"8201d6a8-fa2c-46d9-ae6b-54a3ec806d62","Path":"color-flag-selectors.md","Order":5},{"Id":"4f1561f0-1f9d-4f28-aba1-12bad574e4a3","Path":"kerning-pair-color-flags.md","Order":3},{"Id":"82cc4664-9f7d-4175-b138-ea43e197a428","Path":"glyph-color-flags.md","Order":1}],"Id":"5503b365-84a1-4e60-aa7a-e50aa6bbf504","Path":"color-flags.md","Order":7,"CategoryType":1,"Icon":null,"Title":"Color flags","Languages":[{"Code":"en","Title":"Color flags","Slug":"color-flags","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"ac241988-a34d-436e-b5ce-a987581fcc8f","Path":"tagbased-font-window-filters-are-now-casesensitive.md","Order":3},{"Id":"9ac9a01e-2efe-4814-a013-2b8530b406ca","Path":"properties-manual-composite.md","Order":2},{"Id":"784b6c23-a3d3-417c-95b3-057abfe5b2a1","Path":"expanding-or-collapse-font-window-sidebar-sections.md","Order":1}],"Id":"709fc77e-84a9-45de-9e70-c4bf871004e3","Path":"font-window-sidebar.md","Order":3,"CategoryType":1,"Icon":null,"Title":"Font window sidebar","Languages":[{"Code":"en","Title":"Font window sidebar","Slug":"font-window-sidebar","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"41ffe512-cf06-48f7-8874-bbd0fa8ca7e9","Path":"unicodebased-font-window-filters.md","Order":2},{"Id":"e7cb8572-465a-477f-bb49-dc27fb40d682","Path":"property-bar-visibility.md","Order":3},{"Id":"af021174-b400-4e89-a42c-88b774b1c7c7","Path":"find-box-in-the-font-window-property-bar-filters.md","Order":1},{"Id":"97ce3f97-953e-4d2a-ad15-9d70d0601210","Path":"codepages-filter.md","Order":4}],"Id":"08bb09e8-9b3c-48b2-99bb-a16724f311f3","Path":"font-window-property-bar.md","Order":2,"CategoryType":1,"Icon":null,"Title":"Font window property bar","Languages":[{"Code":"en","Title":"Font window property bar","Slug":"font-window-property-bar","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"634ea40c-0c7e-4597-8864-ce72c7a5900c","Path":"select-same-suffix-in-the-contextual-menu.md","Order":3},{"Id":"8470f1ca-9436-41c1-8f6d-48ec345ff915","Path":"select-same-caption-in-the-contextual-menu.md","Order":2},{"Id":"fd23863d-6ce9-4bdc-b9fc-edfabf29a3df","Path":"select-related-glyphs-in-the-contextual-menu.md","Order":1}],"Id":"63e7f060-fbb4-440b-8a2a-f7aa9fa52c99","Path":"font-window-contextual-menu.md","Order":4,"CategoryType":1,"Icon":null,"Title":"Font window contextual menu","Languages":[{"Code":"en","Title":"Font window contextual menu","Slug":"font-window-contextual-menu","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"7286197a-e479-4502-8045-d17b72070755","Path":"hide-unfiltered-glyphs.md","Order":1}],"Id":"e40dbfda-c53a-4bde-a991-7c9938aa1d59","Path":"font-window-filters.md","Order":6,"CategoryType":1,"Icon":null,"Title":"Font window filters","Languages":[{"Code":"en","Title":"Font window filters","Slug":"font-window-filters","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"3d83864a-f2f4-4434-9609-0ac13284767e","Path":"status-bar-visibility.md","Order":1}],"Id":"d9388149-a11d-4338-8fb3-da121520962e","Path":"font-window-status-bar.md","Order":5,"CategoryType":1,"Icon":null,"Title":"Font window status bar","Languages":[{"Code":"en","Title":"Font window status bar","Slug":"font-window-status-bar","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"7ec4bd56-11e4-4ff2-a2d6-ab00f3cddbb9","Path":"font-window-cells.md","Order":1}],"Id":"d72adab6-67f4-4bfe-9013-09d1cb3584d4","Path":"font-window.md","Order":14,"CategoryType":1,"Icon":null,"Title":"Font window","Languages":[{"Code":"en","Title":"Font window","Slug":"font-window","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"62486211-eab8-4b35-846b-7ddde76bf9c7","Path":"note-page.md","Order":2},{"Id":"0ebe181f-f067-4c33-a515-2af90f85a2d9","Path":"searching-the-font-info-dialog.md","Order":1},{"Id":"4895753a-d9ad-4d12-8261-53f44770c32d","Path":"parameters-page.md","Order":3},{"Id":"99b27dc3-a93f-41a3-8199-0854fb471146","Path":"overview-page.md","Order":4},{"Id":"e1778c95-0086-4e2c-b596-9c655ee16bc5","Path":"applying-font-info-changes.md","Order":5}],"Id":"af5a0ede-ce1f-4368-889d-745823772911","Path":"the-font-info-dialog.md","Order":1,"CategoryType":1,"Icon":null,"Title":"The **Font Info** dialog","Languages":[{"Code":"en","Title":"The **Font Info** dialog","Slug":"the-font-info-dialog","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"6b27a5a0-6b02-4e25-b41a-40042bae843c","Path":"copypaste-of-classes-between-fonts-or-masters.md","Order":1},{"Id":"71713889-a8f2-494b-8259-20d50957397b","Path":"find-glyph-search-box.md","Order":2}],"Id":"ec56c436-fc96-49dd-99dd-e77da3e8b958","Path":"classes-panel.md","Order":1,"CategoryType":1,"Icon":null,"Title":"Classes panel","Languages":[{"Code":"en","Title":"Classes panel","Slug":"classes-panel","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"f51a2c8f-6acc-4f6f-94dc-a6df2247d9c6","Path":"choose-if-new-glyphs-should-be-independent-components-or-references.md","Order":1},{"Id":"05eff21b-df9e-48ff-ada7-60199e358c64","Path":"option-to-replace-suffix.md","Order":2},{"Id":"c72582cf-e47c-4643-abd7-6cdf4fb156a3","Path":"copy-kerning-classes.md","Order":3}],"Id":"0c3fe3e4-1257-44a1-8935-c1375b87a881","Path":"duplicate-glyphs.md","Order":5,"CategoryType":1,"Icon":null,"Title":"Duplicate glyphs","Languages":[{"Code":"en","Title":"Duplicate glyphs","Slug":"duplicate-glyphs","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"7b7e1dd1-5e74-445e-ae07-736f2c6ebd66","Path":"compare-fonts.md","Order":2},{"Id":"63aa31f9-6e3e-432e-a42a-a2b56b89785e","Path":"fonts-with-identical-names.md","Order":1}],"Id":"b5a419f5-dac5-4287-93f3-aa81e1466562","Path":"fonts-panel.md","Order":13,"CategoryType":1,"Icon":null,"Title":"Fonts panel","Languages":[{"Code":"en","Title":"Fonts panel","Slug":"fonts-panel","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"386c5e59-f9f4-4bbb-a6eb-2a7b577523b9","Path":"warning-about-unused-lookups.md","Order":2},{"Id":"71e610ef-c4ff-40ab-88d3-6cb766ac9926","Path":"update-features-to-match-reduced-glyph-set.md","Order":1}],"Id":"5716e4b4-4bdc-4ac3-8cba-6dfae7121086","Path":"compiling-features.md","Order":3,"CategoryType":1,"Icon":null,"Title":"Compiling features","Languages":[{"Code":"en","Title":"Compiling features","Slug":"compiling-features","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"7020ed55-72eb-4e42-b2b8-ab72f6f6f141","Path":"find-next.md","Order":1},{"Id":"42a1d401-8eff-45da-ab84-10160ab25a7b","Path":"navigate-between-feature-definitions.md","Order":2}],"Id":"3d0f35b2-5485-4656-95f9-4d5885d79fe2","Path":"features-panel.md","Order":2,"CategoryType":1,"Icon":null,"Title":"Features panel","Languages":[{"Code":"en","Title":"Features panel","Slug":"features-panel","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"57301a39-7228-4357-a064-b88493e60bbb","Path":"automatic-features.md","Order":1}],"Id":"a36d7e70-0342-44f0-bfea-b2dc8401d154","Path":"opentype-features-and-unicode.md","Order":12,"CategoryType":1,"Icon":null,"Title":"OpenType features and Unicode","Languages":[{"Code":"en","Title":"OpenType features and Unicode","Slug":"opentype-features-and-unicode","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"f8d754ce-7add-4369-9b7f-6b8f9eb27642","Path":"no-export-in-glyph-panel-and-the-noexport-export-to-declare-glyphs-nonexporting.md","Order":1}],"Id":"e40a849c-d3c9-4305-b4fb-62a9f0ee7e1a","Path":"non-exporting-glyphs.md","Order":6,"CategoryType":1,"Icon":null,"Title":"Non-exporting glyphs","Languages":[{"Code":"en","Title":"Non-exporting glyphs","Slug":"non-exporting-glyphs","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"828cacb8-da2c-443b-befb-eb8fb3e052c3","Path":"manual-reordering-of-glyphs.md","Order":8},{"Id":"7e685749-8885-4258-acbd-39e4b9f84b16","Path":"deleting-glyphs-1.md","Order":3},{"Id":"d406ac52-ebf7-4ed3-8182-cb52d021fd8e","Path":"case-conversion-of-the-font-window-selection.md","Order":9},{"Id":"c9cd045e-0036-44a4-9c0b-acde3ed3ff9b","Path":"font-new-glyph.md","Order":2}],"Id":"14ba304c-73c9-49da-87eb-0078a96645cf","Path":"glyphs-fonts.md","Order":12,"CategoryType":1,"Icon":null,"Title":"Glyphs & fonts","Languages":[{"Code":"en","Title":"Glyphs & fonts","Slug":"glyphs-fonts","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"c1f9e96d-1f60-4e4f-af05-b6e2f799cc50","Path":"updates-1.md","Order":3},{"Id":"d6ad1be5-2f1f-4cef-aee6-f6d3212ad0ed","Path":"fontlab-community.md","Order":4},{"Id":"c5f3b8d1-b9c4-482b-b419-bf6335937793","Path":"fontlab-vi-and-7-reviews.md","Order":7},{"Id":"80ee5a88-1a0e-46b4-bc7e-8cce99b054d0","Path":"towards-fontlab-7.md","Order":6},{"Id":"66727471-e530-47e1-b5f8-6999829d67cd","Path":"bug-and-crash-reporting.md","Order":5},{"Id":"00a02171-c7b2-40ff-8183-525d75a6bbb5","Path":"keyboard-shortcuts-2.md","Order":8},{"Id":"fc8c3b2f-5261-4b76-a3e4-bf18fa6e9a7b","Path":"installation-and-requirements-1.md","Order":2},{"Id":"9e4c9e15-9fe4-40d1-8980-5b59f8895602","Path":"getting-started-in-fontlab.md","Order":9},{"Id":"786fc013-60cc-428c-afad-c723d957c854","Path":"introduction-4.md","Order":1}],"Id":"2f7add57-a06a-4ca8-96b2-3613b77e7a4e","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Intro","Languages":[{"Code":"en","Title":"Intro","Slug":"intro","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"cb91d791-d710-44c7-93b8-9e528e11665b","Path":"fontlab-7-release-notes-part-5-1.md","Order":6},{"Id":"dafaba0a-7996-42d7-af46-7aabb25cf36a","Path":"fontlab-7-release-notes-part-1-1.md","Order":2},{"Id":"50903974-822a-4583-9717-1f570fc6e9eb","Path":"fontlab-7-release-notes-part-3-1.md","Order":4},{"Id":"007cfe30-7334-4046-a2f3-8939c0f57a21","Path":"fontlab-7-release-notes-part-2-1.md","Order":3},{"Id":"c752753c-4e3e-44b6-b1e9-f7fc7cc6c20e","Path":"fontlab-7-release-notes-part-4-1.md","Order":5},{"Id":"860d5f35-df46-4e63-af05-e647af31da7c","Path":"intro-1.md","Order":1}],"Id":"306435f4-e098-49c6-b3e2-fe7761824c21","Path":null,"Order":17,"CategoryType":0,"Icon":null,"Title":"7.0.0.7264","Languages":[{"Code":"en","Title":"7.0.0.7264","Slug":"7007264","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"89d6c0bb-2655-40cc-a827-b89bd5ba06f0","Path":"7117383.md","Order":13},{"Id":"a381d4a3-dcfa-45cb-8ece-4dd232c2e139","Path":"6006550.md","Order":36},{"Id":"edc787ec-cc71-4129-bf8a-70e810286c8f","Path":"6116878.md","Order":24},{"Id":"e675d887-00c9-4aad-bdff-3546ddb9bfab","Path":"7117382.md","Order":14},{"Id":"7ca95ccd-4c35-47e6-a2e9-9832840d4eb0","Path":"6126927.md","Order":22},{"Id":"2a62ed07-d2dc-4111-a25b-66f87e43a56a","Path":"release-notes-fontlab-7207614.md","Order":6},{"Id":"d7eb72aa-6088-462a-9bf1-7d285fbb996a","Path":"7127436.md","Order":10},{"Id":"e7fcafa7-6237-4dab-9077-b029c2d1268b","Path":"6137016.md","Order":20},{"Id":"70cf2068-7f31-4d61-9a33-4808be276723","Path":"6116879.md","Order":23},{"Id":"0c7e63cb-ef54-46ae-ba0d-64a835b68c01","Path":"6096798.md","Order":26},{"Id":"9a2f320c-ce75-405f-a4c6-b33edc8960b7","Path":"6036611.md","Order":33},{"Id":"069c2598-0eb1-42a7-b26c-99aa597cc043","Path":"6106871.md","Order":25},{"Id":"c247acc3-5bf0-484f-a4ed-7ef742a0e074","Path":"release-notes-archive.md","Order":2},{"Id":"be050fec-1efe-46fb-8a86-67527fb1be02","Path":"7127432.md","Order":12},{"Id":"1cff900b-1731-4984-a09e-4b609a9f9c82","Path":"6147044.md","Order":18},{"Id":"36c47707-89cb-4429-a240-a9e2e5578492","Path":"6137013.md","Order":21},{"Id":"c688d974-1a43-4685-acb4-8a1976d4bfc6","Path":"6066722.md","Order":30},{"Id":"d24198cc-7819-45f5-9981-2d272c8a6ebd","Path":"6016558.md","Order":35},{"Id":"aafab90c-2a28-4cb6-9ed3-5e75d61d3e83","Path":"6086790.md","Order":27},{"Id":"6db16735-3478-4f03-a577-cce10a4064ac","Path":"7127435.md","Order":11},{"Id":"f1da8cfc-1dc2-4fdc-aa96-51838c6ba985","Path":"release-notes-fontlab-7207622.md","Order":5},{"Id":"7d92b6a0-c918-4889-a9e9-5735552a259b","Path":"release-notes-fontlab-7207608.md","Order":7},{"Id":"f5addaa9-40d2-4c99-aefe-be5f36a48e2b","Path":"7137495.md","Order":9},{"Id":"643b05be-145d-406b-bab4-118b9f6b25fd","Path":"6147043.md","Order":19},{"Id":"e4769702-b7e0-491a-944c-5989ba129541","Path":"release-notes-fontlab-7207649.md","Order":3},{"Id":"d00551b5-573c-4983-ad9d-445c10f1aef3","Path":"6076772.md","Order":29},{"Id":"d8fb6da5-46f7-409e-a80a-8fbab060943b","Path":"release-notes-beta.md","Order":1},{"Id":"c75f8849-19da-40aa-bafe-f8a4bf5364ad","Path":"7017276.md","Order":16},{"Id":"44f15877-cc70-4d53-bbdf-77b42aaf57e4","Path":"release-notes-fontlab-7147515.md","Order":8},{"Id":"5f26cabc-20bd-4dd7-8cf9-2ea2510f4335","Path":"6056675.md","Order":31},{"Id":"92a96f48-8e8b-40e4-8d6d-4b1a4d6f8c08","Path":"6026578.md","Order":34},{"Id":"58cb9097-d4c2-4ba2-8f5c-54a0b729c301","Path":"6046634.md","Order":32},{"Id":"887f59a7-f927-4ca6-b2b1-937d9da1e762","Path":"6076774.md","Order":28},{"Id":"a2855836-1611-4716-89d5-e497dbd25628","Path":"7107363.md","Order":15},{"Id":"62f4bbfa-91de-4639-8b96-e7427a05b9a7","Path":"release-notes-fontlab-7207644.md","Order":4}],"Id":"bf1ccef3-7ef0-46e0-b5e1-1800b6bdc036","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"Release History","Languages":[{"Code":"en","Title":"Release History","Slug":"release-history","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"388330f6-9a2e-454d-bcfc-7ca718997b06","Path":"fontlab-multiseat-license-setup.md","Order":1},{"Id":"c0a01975-b0b8-4f18-a646-b66d61888865","Path":"fontlab-credits-1.md","Order":2},{"Id":"bef68812-9394-424f-b3e6-77588f5d9b8e","Path":"fontlab-licenses.md","Order":3}],"Id":"73bfad19-0acf-49d7-8bc1-2fbe49f30a55","Path":null,"Order":8,"CategoryType":0,"Icon":null,"Title":"Appendices","Languages":[{"Code":"en","Title":"Appendices","Slug":"appendices","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"1b7e924e-6bc9-410c-b8de-020034509373","Path":"glyph-substitution-rules-1.md","Order":1}],"Id":"09185267-de7c-4d89-908d-bcc100f8f1e0","Path":"opentype-features.md","Order":4,"CategoryType":1,"Icon":null,"Title":"OpenType Features","Languages":[{"Code":"en","Title":"OpenType Features","Slug":"opentype-features","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"83119f00-fc49-4686-b86a-1ddc05d9c3bf","Path":"scripting-with-python.md","Order":1},{"Id":"c3981cad-2110-4ae4-8931-95cd2692b3d9","Path":"scripts-menu.md","Order":2}],"Id":"70a1c07c-165b-4ff3-a3f7-a01d081675f9","Path":null,"Order":6,"CategoryType":0,"Icon":null,"Title":"Python","Languages":[{"Code":"en","Title":"Python","Slug":"python","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"dc1edcdc-d12a-4312-b4d3-fbc8dc380170","Path":"before-you-export-1.md","Order":2},{"Id":"49a6a419-6a7a-4abe-9b5b-da37b9131653","Path":"exporting-options.md","Order":3},{"Id":"8c1ff5f1-21e8-4e5f-9ad3-b1e98a857caa","Path":"export-profiles-2.md","Order":4},{"Id":"97aeae6b-e1d0-45ec-8bb2-4c39aeed6afb","Path":"additional-export-features.md","Order":5},{"Id":"d9610c11-c60f-4b34-b182-3972c152fd8c","Path":"exporting-fonts-3.md","Order":1}],"Id":"ab2a6f6e-ba6a-40a1-b86e-acfc41e780e1","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Font Export","Languages":[{"Code":"en","Title":"Font Export","Slug":"font-export","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"d4d6dfbd-fb71-409f-b1f3-1c46c15d648e","Path":"postscript-hinting-1.md","Order":3},{"Id":"21882750-8230-41f6-8ce5-857f98070c09","Path":"automatic-hinting.md","Order":4},{"Id":"29e82c70-fa93-474d-9938-ed24f3c1a54b","Path":"hinting-a-font-1.md","Order":1},{"Id":"2cf0f06c-51b1-4809-8b9d-2e27389f2261","Path":"truetype-hinting-1.md","Order":2}],"Id":"7b91e507-5483-4bba-a4b5-331932dbc76e","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"Hinting","Languages":[{"Code":"en","Title":"Hinting","Slug":"hinting","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"b082332a-1f51-4c54-8427-4fc6b1a0d637","Path":"font-info-5.md","Order":1},{"Id":"ef1b428f-cffe-456d-b7d1-4dbbdac21792","Path":"embedding.md","Order":2}],"Id":"3323df81-eccf-4fdf-979d-b374e6353e87","Path":null,"Order":6,"CategoryType":0,"Icon":null,"Title":"Font Production","Languages":[{"Code":"en","Title":"Font Production","Slug":"font-production","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"2acbe0c4-c258-40e6-8134-3ee8ea65e57a","Path":"guides-tool-2.md","Order":15},{"Id":"3edb738c-ecf4-4284-a54e-9177f5d66395","Path":"truetype-hinting-tool-1.md","Order":17},{"Id":"d3dab4d4-dd2f-425f-85f0-482af5a22871","Path":"pencil-tool-2.md","Order":8},{"Id":"b56bc679-eb38-42c5-888b-7118b1f3c85b","Path":"ellipse-tool-2.md","Order":18},{"Id":"762aec61-2961-4ba0-8968-015e5a030ac9","Path":"rectangle-tool-2.md","Order":19},{"Id":"1d1f80f9-dd88-47cd-ac6c-ce1fa859e74e","Path":"rapid-tool-2.md","Order":9},{"Id":"bae5d06f-9158-4615-9e2f-bc1adfa0574a","Path":"scissors-tool-2.md","Order":12},{"Id":"a58f2f3a-058b-4c1e-9e77-cd2afb131c53","Path":"eraser-tool-2.md","Order":6},{"Id":"73bc1233-dbc9-4a1e-8431-50c9214d20d5","Path":"fill-tool-1.md","Order":14},{"Id":"679bdfe7-b9e4-4af8-9b49-ad5a597b9ba9","Path":"matchmaker-tool-2.md","Order":16},{"Id":"7521d7d0-231a-419a-8ee6-474b0ab85584","Path":"contour-tool-2.md","Order":1},{"Id":"909010ac-334a-49af-a2a6-7587c2a619ce","Path":"pen-tool-2.md","Order":10},{"Id":"c63009fc-ee41-40d2-8b48-828b3ae584a5","Path":"magnet-tool-1.md","Order":13},{"Id":"eefe3ecd-78d9-4bb8-b76a-a37c910305ce","Path":"brush-tool-2.md","Order":7},{"Id":"55ddb582-7847-4158-8b22-672bd03a7cd3","Path":"text-tool-2.md","Order":5},{"Id":"f8bab9d0-40aa-4641-8a4a-5f3e2a718106","Path":"metrics-tool-1.md","Order":3},{"Id":"f198c5b7-01f3-4c65-88a5-f85454acfa57","Path":"element-tool-1.md","Order":2},{"Id":"72f7a89e-c492-4abc-abb3-bcd2f48bdf30","Path":"kerning-tool-1.md","Order":4},{"Id":"1e551fde-fccd-47cd-aee8-4ec469557835","Path":"knife-tool-3.md","Order":11}],"Id":"d660afff-c795-4055-9045-bc20e9d5faf0","Path":"tools-1.md","Order":16,"CategoryType":1,"Icon":null,"Title":"Tools","Languages":[{"Code":"en","Title":"Tools","Slug":"tools-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"4ca79a14-ba81-40db-b558-c205ca16cbdc","Path":"hinting-actions-1.md","Order":5},{"Id":"5cb8aa99-6f94-4f60-9de7-e42f792694d3","Path":"metrics-actions-1.md","Order":3},{"Id":"0be360e5-001d-4baa-a0fc-4cd332625ba6","Path":"basic-actions-1.md","Order":1},{"Id":"6aa5af28-d4b9-46b3-881a-4b664a2cb4b3","Path":"contour-actions-1.md","Order":2},{"Id":"944f71e2-6163-4f80-8488-ae34f1224f81","Path":"effects-1.md","Order":4}],"Id":"f0efd799-ddc5-4c2f-901c-23d4a892b4a5","Path":"actions-1.md","Order":17,"CategoryType":1,"Icon":null,"Title":"Actions","Languages":[{"Code":"en","Title":"Actions","Slug":"actions-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"982bd329-19d0-4376-a413-5808c379a370","Path":"pairs-and-phrases-panel-1.md","Order":21},{"Id":"b7d7fe39-be1e-40bb-9bb0-76f41e5cdc0d","Path":"stroke-panel-2.md","Order":25},{"Id":"98606dc8-721f-406c-b0b2-773eb36aea11","Path":"node-panel-1.md","Order":19},{"Id":"087a310e-7299-4357-aacb-f1b49685b318","Path":"image-panel-1.md","Order":15},{"Id":"b7479d41-11a4-42d7-ba34-eff505e0a9c3","Path":"preview-panel-5.md","Order":22},{"Id":"f3427c96-b734-4426-9b78-79a4f4d06ac0","Path":"anchors-and-pins-panel-1.md","Order":1},{"Id":"1ab9fae2-1aa8-42b7-b3dd-61aa993381ea","Path":"guideline-panel-1.md","Order":13},{"Id":"dd5d5a4e-5f6d-48b6-a63d-8b5aa1cbcc66","Path":"transform-panel-3.md","Order":28},{"Id":"b6aee0d8-ac99-4513-ab55-ad4128f24a20","Path":"layers-and-masters-panel-1.md","Order":17},{"Id":"9f0e2c41-dbb7-4c10-aa74-32b4283dd93f","Path":"swatches-panel-1.md","Order":26},{"Id":"0d2f38b3-1ed8-4463-a9ec-b996b4c7dc89","Path":"color-panel-1.md","Order":4},{"Id":"ac6f750e-be72-4b24-8d52-3c2ac6c863b8","Path":"source-panel-1.md","Order":24},{"Id":"26fe7c98-b4e4-47ac-92c8-b89dcdc05cd3","Path":"tables-panel-1.md","Order":27},{"Id":"176de8b7-a484-454e-b557-cfd526bc6923","Path":"variations-panel-2.md","Order":29},{"Id":"1b3e3992-6cd4-4273-9181-d5e619015803","Path":"fontaudit-panel-1.md","Order":7},{"Id":"9ff66cbb-9e02-4775-8cef-4cfd41e8644c","Path":"glyph-panel-1.md","Order":12},{"Id":"0baf4500-60c4-4d70-973c-21d0fbc1a350","Path":"font-map-panel-1.md","Order":9},{"Id":"dc87345b-88bb-4f03-950e-221f4b751f52","Path":"metrics-panel-1.md","Order":18},{"Id":"3c04edb0-521f-488d-aa94-9ab169742587","Path":"scripting-panel-2.md","Order":23},{"Id":"c90edc5a-2190-47f9-8fc9-3a8493ddaa6e","Path":"brush-panel-2.md","Order":2},{"Id":"1f7eae85-93d3-4e78-b2af-7d86f35533bc","Path":"view-panel-3.md","Order":30},{"Id":"d50ef996-88bf-4ce7-a7cb-18bfb8306d92","Path":"elements-panel-2.md","Order":5},{"Id":"8b3d5393-fddf-4af6-851c-cce284510649","Path":"kerning-panel-1.md","Order":16},{"Id":"f4a12422-726f-415a-978c-91302383d7a4","Path":"fonts-panel-2.md","Order":10},{"Id":"24619042-69b4-43ec-8ad4-e03844e8719a","Path":"gallery-panel-2.md","Order":11},{"Id":"6128748a-2a95-463a-abb4-7d8cff029a9d","Path":"classes-panel-2.md","Order":3},{"Id":"e1925c68-e8a3-4e28-bd2d-682a48e5e135","Path":"font-info-panel-1.md","Order":8},{"Id":"328eaea3-572e-4872-80fb-f9b3b7d1e3a4","Path":"history-panel-1.md","Order":14},{"Id":"bcad0bf8-18a3-47b3-b4ef-cd69b84b26db","Path":"output-panel-2.md","Order":20},{"Id":"9869f6de-20de-4f12-a2a2-5892233c1202","Path":"features-panel-2.md","Order":6}],"Id":"ed7d34fc-d6f7-47f5-b8fb-26ed04a3db66","Path":"panels-1.md","Order":18,"CategoryType":1,"Icon":null,"Title":"Panels","Languages":[{"Code":"en","Title":"Panels","Slug":"panels-1","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"2a985162-23ee-49ea-9406-14be07a87422","Path":"using-sketchboard-2.md","Order":8},{"Id":"400b08b4-f668-4948-b59f-b704fabc8836","Path":"grid.md","Order":12},{"Id":"fc4a25a6-cf9e-4435-bdc6-bbd72a80e65e","Path":"metrics-window.md","Order":7},{"Id":"453e2578-8804-41e2-bbe0-cf15e2094ab2","Path":"font-info-dialog-box.md","Order":3},{"Id":"1f9d5460-895a-4889-9e2d-b71488ad7877","Path":"glyph-cell-marks-1.md","Order":5},{"Id":"b8f44b38-3e29-47d2-9a44-f37f37d85a9d","Path":"scoreboard-1.md","Order":13},{"Id":"ad2f2c7e-c490-4f60-8702-54804ef03c4e","Path":"property-bar-2.md","Order":10},{"Id":"32de88f1-be01-4f6d-a308-1bb81b327c81","Path":"keyboard-shortcuts-3.md","Order":14},{"Id":"34d098a2-d151-4971-99ce-9507fa9d2821","Path":"customizing-keyboard-shortcuts.md","Order":15},{"Id":"baf9ad97-fcb2-42e9-beea-99a5ae173aa8","Path":"toolbar-1.md","Order":9},{"Id":"6c328441-cc22-46d5-ae8c-34426f1a3c27","Path":"glyph-window-6.md","Order":6},{"Id":"d44674ac-5594-4b41-9f29-64e11886b623","Path":"rulers.md","Order":11},{"Id":"8253e73e-d56a-4e55-8dd2-3b84a8f62fe5","Path":"welcome-dialog-2.md","Order":1},{"Id":"bed4885d-98e6-4681-92a1-74db1c091dda","Path":"preferences-5.md","Order":2},{"Id":"cfe8d7be-c7e0-4c67-b7c3-58ecba68c956","Path":"font-window-6.md","Order":4}],"Id":"eb2385b6-49b1-4c33-b209-e2206126c03c","Path":null,"Order":7,"CategoryType":0,"Icon":null,"Title":"FontLab User Interface","Languages":[{"Code":"en","Title":"FontLab User Interface","Slug":"fontlab-user-interface","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"b2e78318-1ab7-4c3a-8ff9-52f64d1c6198","Path":"glyph-tags-and-classes-1.md","Order":3},{"Id":"c85b649e-cd5a-41f5-b85e-d67b34cb0b4c","Path":"glyph-notes-1.md","Order":1},{"Id":"62651079-7473-4574-9cd6-c70c95d38973","Path":"flagging-marking-glyphs.md","Order":2}],"Id":"ac23282d-0019-4352-903e-a1eec1f14172","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Organizing Glyphs","Languages":[{"Code":"en","Title":"Organizing Glyphs","Slug":"organizing-glyphs","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"ffda3e3c-72d3-4ea5-a250-648819ef6748","Path":"organizing-font-families-1.md","Order":1},{"Id":"b2410d0c-45f1-41c4-aa7d-85759f141007","Path":"working-with-font-variations.md","Order":2},{"Id":"8d1ca545-d542-4ed2-8a00-d34572438295","Path":"creating-a-variable-font-example.md","Order":3}],"Id":"005c0fd0-6abb-4d9e-877a-64710e0b72ef","Path":null,"Order":8,"CategoryType":0,"Icon":null,"Title":"Extending Fonts","Languages":[{"Code":"en","Title":"Extending Fonts","Slug":"extending-fonts","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"5b4f6c1f-1693-4862-a366-0b8dbf7be128","Path":"clean-up.md","Order":2},{"Id":"0334f24b-0e55-40db-98b6-3ee187c76055","Path":"using-the-eraser-tool.md","Order":6},{"Id":"736ff54c-7649-4f2e-92c3-1c03c7a20318","Path":"making-a-font-from-color-vector-graphics.md","Order":10},{"Id":"07cf8ee4-057f-4afe-a7bd-266c8dca25bc","Path":"balance.md","Order":4},{"Id":"2291571e-b80b-4055-81bf-067ce2719a67","Path":"creating-an-italic-font.md","Order":8},{"Id":"f67c51b7-06f2-421d-bf8a-021b402ff317","Path":"slanted-grid.md","Order":9},{"Id":"2310acc5-8e2e-425e-b27b-e020d8daa519","Path":"simplify.md","Order":1},{"Id":"3dce5471-abe4-452d-8b2b-d666c1e74135","Path":"adding-nodes-to-extremes-1.md","Order":5},{"Id":"9c724ca0-f283-42fa-982e-bf12c92316b8","Path":"harmonize.md","Order":3},{"Id":"39b902fe-80a0-432a-9569-4017dfa93bf5","Path":"making-a-font-from-color-bitmap-images.md","Order":11},{"Id":"9ad4d247-c7a8-4a23-82f6-4acf857c6468","Path":"overlaying-fonts.md","Order":12},{"Id":"4a2d314a-6903-4ea5-a328-4fed99a61956","Path":"fontaudit-5.md","Order":7}],"Id":"52b89569-5c4a-4834-b85c-77c998d32d0d","Path":null,"Order":6,"CategoryType":0,"Icon":null,"Title":"Correcting glyph drawings","Languages":[{"Code":"en","Title":"Correcting glyph drawings","Slug":"correcting-glyph-drawings","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"55591ccf-65cf-4533-9e61-c8a623c58f7c","Path":"free-transform-operation-1.md","Order":3},{"Id":"c874f075-92e2-4125-949e-a0d5cff1f925","Path":"geometric-transformations-1.md","Order":1},{"Id":"218662e1-25d5-4b71-9bd1-b3d0e11d4a63","Path":"quick-transformations.md","Order":2}],"Id":"eeebbac7-0264-4f90-84ea-3e3e40cc35da","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"Transformations","Languages":[{"Code":"en","Title":"Transformations","Slug":"transformations","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"f8cdf2c4-bb5d-44f5-9ab5-084207693ba9","Path":"editing-kerning.md","Order":3},{"Id":"0e5a9ea8-1edb-4c87-83e1-a08a3251bb38","Path":"using-kerning-classes.md","Order":4},{"Id":"7e112935-e503-4ba7-ac3a-eaf8843181f1","Path":"using-the-metrics-table.md","Order":2},{"Id":"d387c3b0-624c-4d13-87c0-7c15c7241ac7","Path":"editing-glyph-metrics.md","Order":1},{"Id":"803c5d31-d2cc-4507-a074-c8786e4505df","Path":"importing-and-exporting-metrics-1.md","Order":5}],"Id":"774f189d-61f1-40ac-99bd-2d02daa40439","Path":"spacing-and-kerning.md","Order":7,"CategoryType":1,"Icon":null,"Title":"Spacing and Kerning","Languages":[{"Code":"en","Title":"Spacing and Kerning","Slug":"spacing-and-kerning","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"a99f5fb4-a26c-45dc-b087-3d9704f0e0f1","Path":"printing-2.md","Order":16},{"Id":"004583c8-8baf-4ef0-a632-c2bcc0311361","Path":"navigating-a-font-1.md","Order":4},{"Id":"03b7624e-3b0e-414c-839d-33e0313807c4","Path":"saving-a-font-1.md","Order":14},{"Id":"8abe5ac8-7ac2-4de4-92d5-566262658605","Path":"deleting-glyphs-2.md","Order":12},{"Id":"3931c36c-fa06-4f38-aada-a5e6ddbcf3ff","Path":"language-support-and-glyphs-1.md","Order":2},{"Id":"f3322239-4b84-44b8-a819-5a0d3e641b14","Path":"using-fonts-and-font-map-panels.md","Order":6},{"Id":"8f3b2754-321f-4dad-8871-f592f1f36d9f","Path":"selecting-a-glyph-for-editing.md","Order":9},{"Id":"87749548-41d3-4401-81fc-eaab69254e99","Path":"sorting-glyphs.md","Order":8},{"Id":"7c96eadf-6361-44fb-939e-a6b8746c1252","Path":"moving-glyphs.md","Order":11},{"Id":"8da38287-d44b-412b-b50f-1749151049c2","Path":"copying-and-pasting-glyphs-1.md","Order":10},{"Id":"ba86559d-1d14-4ebb-9ebb-381077bbcc50","Path":"renaming-glyphs-1.md","Order":13},{"Id":"2f24b33c-9e0f-443c-ab95-67e407685165","Path":"searching-glyphs-1.md","Order":7},{"Id":"beb25176-8708-4236-8707-ea6ff5f7bc0b","Path":"creating-a-new-font-2.md","Order":1},{"Id":"46a6862c-994f-4117-b24d-78ea1c503b0d","Path":"comparing-fonts-1.md","Order":15},{"Id":"776dd0fb-4fa1-42d3-8d15-b0cfecdebf86","Path":"using-the-font-window-1.md","Order":5},{"Id":"b4f81b19-9989-44ff-b0e8-649f48a1f057","Path":"opening-an-existing-font.md","Order":3}],"Id":"2301a52e-e46c-4c3c-a00c-23e27f6ee620","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Working with a Font","Languages":[{"Code":"en","Title":"Working with a Font","Slug":"working-with-a-font","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"8c46a516-cbeb-4413-95cf-8fec2fc700b1","Path":"unlink-corners.md","Order":6},{"Id":"c2c3c6aa-59b7-4d9c-a630-3f57dd580893","Path":"create-overlaps-1.md","Order":9},{"Id":"2e12bfff-34e5-47b8-ad90-6c5f5141f1c2","Path":"power-brush-1.md","Order":12},{"Id":"1a195f89-0e16-48ba-94ee-a04c54a17ff6","Path":"rewind-record-1.md","Order":13},{"Id":"0734da99-e744-46e8-907b-21ed399e9ef7","Path":"using-smart-corners.md","Order":4},{"Id":"9ca02711-6f6e-47c8-8555-2ef5573ae6c9","Path":"make-overlap.md","Order":10},{"Id":"dd1c48fb-b76b-4f33-b570-dd6507bab9eb","Path":"using-expressions.md","Order":14},{"Id":"d7a59b67-5f33-4848-9d28-1f1c8cb9dcf6","Path":"create-parallel-contour-1.md","Order":7},{"Id":"6c23215a-e9b5-4303-8bc5-d8b6624f70b6","Path":"remove-overlap-1.md","Order":11},{"Id":"cfbacfbe-59bd-4958-b89b-37f95ef3d798","Path":"tunni-lines-2.md","Order":1},{"Id":"0cd50101-1c3a-491e-8b1c-8e99bd2d0a15","Path":"using-glue-selection.md","Order":3},{"Id":"629d74a9-9622-456f-abee-dc8ea6f2c9a9","Path":"power-guides-2.md","Order":5},{"Id":"621a24dc-bf62-43a0-b08d-c0f3d7d546ce","Path":"expand-contour.md","Order":8},{"Id":"5d5ddd1e-5fc1-48d6-a10e-b97a4993edec","Path":"find-and-replace-outline-operation.md","Order":2}],"Id":"f3a975e6-63bc-419f-b7df-a8b39c80daf2","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"Improving drawing workflow","Languages":[{"Code":"en","Title":"Improving drawing workflow","Slug":"improving-drawing-workflow","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"588d8b78-0c90-4f90-b713-18173b352cc5","Path":"drawing-vector-curves-1.md","Order":29},{"Id":"38e5cde2-b41d-4de3-9427-c9e2fdda7508","Path":"glyph-window-contents-1.md","Order":9},{"Id":"5e3dfe70-bf2e-4459-a82a-2e2732b54e6c","Path":"moving-single-segments.md","Order":39},{"Id":"c1e4a53e-2d9b-4a88-9e58-400751b19e8b","Path":"using-smart-nodes.md","Order":36},{"Id":"37fc1021-61f8-4ea7-85e8-3482730c79ba","Path":"changing-segment-types-1.md","Order":42},{"Id":"1df17a8f-f5a6-47cc-82fe-c09834e770e5","Path":"using-sketchboard-1.md","Order":19},{"Id":"3770d423-2de1-4d01-9f89-663e80deee63","Path":"using-elements.md","Order":45},{"Id":"d2ab0d5c-3290-47f2-9389-6b5bd486d1c8","Path":"duplicating-contours.md","Order":41},{"Id":"ab2b0dc4-ec99-4004-a17e-2f8369bc5aa1","Path":"using-guides-1.md","Order":16},{"Id":"6a99e2e5-b25d-4dfb-8bc4-6baf24ec7060","Path":"previewing-glyphs-1.md","Order":14},{"Id":"7f3a3a87-3b08-4bad-8236-777c80fa6b6b","Path":"active-points-vs-selected-points.md","Order":30},{"Id":"9b07d4b9-26ed-43e1-ab8a-9b59b4ae7c89","Path":"selecting-points.md","Order":32},{"Id":"8055e3c2-08da-47a1-9d59-d772c42d4b45","Path":"moving-contour-selections-1.md","Order":40},{"Id":"566bdd7a-7e01-4269-8149-0fea724c97a2","Path":"editing-an-existing-glyph-1.md","Order":7},{"Id":"9ad65337-5371-4bcf-bc38-7c62d965f8bc","Path":"add-glyphs.md","Order":2},{"Id":"10d1fbda-ba21-41ce-b99b-4f9d57b92b72","Path":"drawing-with-geometric-shapes-1.md","Order":28},{"Id":"61a7758d-ecae-42e3-9432-9fe287ac9c08","Path":"outline-appearance-1.md","Order":12},{"Id":"3efb84b6-62a8-4ad5-9412-8f81dfd4c4db","Path":".md","Order":15},{"Id":"208d6ece-267e-422b-b1fc-13a95e85b561","Path":"working-with-layers-2.md","Order":24},{"Id":"8c9dc8ad-80ef-44f7-ac2b-505f012bbc1b","Path":"adding-points-1.md","Order":31},{"Id":"175cdabc-71c1-4ee3-8dca-c4e8aa6fc44d","Path":"changing-node-types-1.md","Order":35},{"Id":"09da2870-fae7-4cd2-91de-9b8d4af50451","Path":"selecting-segments.md","Order":37},{"Id":"949fc3a1-dc19-4c50-bf40-fd179354f51e","Path":"generate-glyphs-1.md","Order":3},{"Id":"b3cbef0c-1c75-4f9d-8ec8-287751764eb3","Path":"copying-and-pasting-layers-1.md","Order":25},{"Id":"f41a769a-6cd2-4941-8501-492e64be154c","Path":"scope-of-editing-1.md","Order":17},{"Id":"b395db24-e215-4920-9472-3a5e099f94f9","Path":"using-the-glyph-window-1.md","Order":10},{"Id":"7979eb1c-ccd0-4c27-b97a-174d2d440beb","Path":"creating-a-new-glyph-1.md","Order":1},{"Id":"92d1989e-06ec-401e-a843-71b3a96a8df3","Path":"mask-layers-1.md","Order":26},{"Id":"85e8deec-54c0-466a-b3bc-96426dd9c90a","Path":"view-details-and-settings-1.md","Order":13},{"Id":"9c0e220e-5766-4423-b58b-51a0a96c6ef1","Path":"selecting-contours-2.md","Order":38},{"Id":"9eb5022f-4c50-49cc-89c8-52564f380598","Path":"outline-conversion.md","Order":43},{"Id":"0f25e581-93dc-4035-8f28-9b270e39e4f2","Path":"truetype-editing.md","Order":44},{"Id":"65332f07-3ddf-466f-bbf4-cb43c04e484d","Path":"autotracing-1.md","Order":23},{"Id":"c5ae6958-a3b8-4eae-808f-23e4475e0631","Path":"using-composite-and-auto-glyphs.md","Order":46},{"Id":"8995274e-9144-4d5d-b8bd-5a4d1390c45a","Path":"components-in-fontlab-2.md","Order":47},{"Id":"3241a158-4125-4c48-8f34-52ce5f0bfc02","Path":"working-with-glyphs-1.md","Order":8},{"Id":"80f3fd7b-02b7-4630-82eb-757487896002","Path":"using-element-references.md","Order":49},{"Id":"71edaed7-3368-43d8-8eda-d65c725e85d3","Path":"generate-names.md","Order":5},{"Id":"ea0b713f-00db-4f23-87bf-da8cff4ebf3e","Path":"using-components-1.md","Order":48},{"Id":"891b64a5-d183-470e-bd46-e313b2282254","Path":"moving-points-1.md","Order":33},{"Id":"4c38d47f-bc8c-4a45-80c6-c7878293b227","Path":"rounding-coordinates.md","Order":18},{"Id":"b1acde02-670e-4339-9384-1e8301d7e6ee","Path":"importing-artwork-2.md","Order":21},{"Id":"f84e4004-bc81-4215-b06e-9d56d1ed08db","Path":"deleting-points-1.md","Order":34},{"Id":"86592e0d-a061-48fb-a3e8-e98271ae1efb","Path":"detecting-element-references-or-composites.md","Order":50},{"Id":"eea053ad-4ae5-4f1b-8b13-c98f633b4ccb","Path":"bitmap-effects-1.md","Order":22},{"Id":"f8753baf-a56f-468d-ba01-feff467225dd","Path":"glyph-recipe-syntax.md","Order":4},{"Id":"1b3d1de3-c5a5-48e7-8b10-c53628be72d6","Path":"drawing-freehand.md","Order":27},{"Id":"364f182a-904c-46c1-9fab-059634a487af","Path":"workspaces-2.md","Order":11},{"Id":"38ab54d9-0e6f-4f5c-9ecd-90a0367e429b","Path":"preparing-bitmap-artwork-1.md","Order":20},{"Id":"2c3f5cef-8e35-4926-9144-65ae73b28124","Path":"generate-unicodes.md","Order":6},{"Id":"6f5e35f8-5f11-4108-950c-1cad96464832","Path":"element-stickers-1.md","Order":51},{"Id":"dd861760-3e05-42d9-b6ab-5ea5d092b411","Path":"anchors-and-pins.md","Order":52}],"Id":"34e76651-a167-4ce3-8c03-ff6e2c85b013","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Drawing and Editing Glyphs","Languages":[{"Code":"en","Title":"Drawing and Editing Glyphs","Slug":"drawing-and-editing-glyphs","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"6c5c4649-381d-4987-a3df-e7c3075fa725","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Designing Type in FontLab","Languages":[{"Code":"en","Title":"Designing Type in FontLab","Slug":"designing-type-in-fontlab","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"6aa5bfec-cba7-4631-bfde-db1b1937f1fb","Path":"other-file-formats.md","Order":3},{"Id":"4b216b0e-b3b5-4cb9-93dd-07a0c3d73823","Path":"color-font-formats.md","Order":2},{"Id":"c4c47719-53cf-4348-b273-27c278331888","Path":"font-formats.md","Order":1},{"Id":"ccbd3189-1034-46d1-a328-f12f38ed6a82","Path":"custom-data-files-and-locations.md","Order":4}],"Id":"945b8fc3-1a16-458c-93f3-3bcf6be3ca73","Path":"files.md","Order":4,"CategoryType":1,"Icon":null,"Title":"Files","Languages":[{"Code":"en","Title":"Files","Slug":"files","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"21a1f68b-87c0-4088-9049-057fa0f610b6","Path":"glyph-positioning.md","Order":14},{"Id":"6124204e-ba16-4118-a1e3-045699529f1e","Path":"mark-attachment-1.md","Order":16},{"Id":"8944ca29-a3d1-44f4-9dca-c9acf510ff29","Path":"components-in-fontlab-1.md","Order":9},{"Id":"c1ee4509-a77e-4f3c-a7c4-af8eb3769f55","Path":"color-glyphs-1.md","Order":13},{"Id":"4b4a2fc8-e292-478c-b7c7-b6e0981bd533","Path":"elements-2.md","Order":8},{"Id":"8d5bf01f-bc80-48f7-a369-f0f925ad9753","Path":"glyph-naming-and-encoding-1.md","Order":2},{"Id":"6af1c9f3-dcff-4e1b-be0a-6f1ad085158a","Path":"kerning-6.md","Order":15},{"Id":"07d8f139-2328-4952-8904-2787e19aadb8","Path":"segments-1.md","Order":5},{"Id":"11c20f84-77df-4b86-82d5-71a990b09369","Path":"measurement-line-1.md","Order":11},{"Id":"b478191b-93e1-4123-9f69-a2f507c201f6","Path":"glyph-metrics-3.md","Order":10},{"Id":"d2fbc7a7-7cbf-4489-9fba-62698189fa57","Path":"points-1.md","Order":6},{"Id":"6c55a997-af72-4412-949a-84b27bc0ca92","Path":"about-glyphs-1.md","Order":1},{"Id":"57742ae1-2915-487d-839e-d7deb7fefcfc","Path":"curve-types-1.md","Order":4},{"Id":"b9ade1e1-c854-4bb6-9a80-07220c84d4ba","Path":"composite-and-auto-glyphs.md","Order":12},{"Id":"e5c2bae6-6e9e-4049-ade3-a6ac01a36653","Path":"layers-and-masters-2.md","Order":3},{"Id":"cdbc6cdd-fc11-4a98-a644-d9862d4b1a25","Path":"contours-2.md","Order":7}],"Id":"caa21bd0-b83c-4712-962b-9bdbb070b5a9","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Glyphs","Languages":[{"Code":"en","Title":"Glyphs","Slug":"glyphs","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"144b531f-3ad9-4a65-a57e-d94dc7fd529f","Path":"font-sizes-and-the-coordinate-system.md","Order":3},{"Id":"41d7ce82-7547-4f08-8f97-e86d76c1fc27","Path":"font-naming-1.md","Order":2},{"Id":"7ab2711f-e804-41e2-8d82-fe5107fc5d59","Path":"variations-2.md","Order":4},{"Id":"593b8036-06a3-4206-81ac-5e9b21a85c13","Path":"glyphsets-1.md","Order":5},{"Id":"c5cfec01-5894-4af7-9f4b-be28b23b1d88","Path":"font-2.md","Order":1}],"Id":"d92b501a-81ef-456a-80c3-37c7a68da40e","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Fonts","Languages":[{"Code":"en","Title":"Fonts","Slug":"fonts","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"2202202f-91a7-48da-b175-c497d6ecd8a3","Path":"hinting-3.md","Order":3}],"Id":"455c26c7-fc1b-4856-a9bd-763e85aeb65a","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"Basics","Languages":[{"Code":"en","Title":"Basics","Slug":"basics","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"9497a8ca-45d2-450c-987f-bffb87f9fd10","Path":"fontlab-7-release-notes-part-3.md","Order":3},{"Id":"2935f927-1e89-4cc5-8b2c-9fbf88685167","Path":"fontlab-7-release-notes-part-1.md","Order":1},{"Id":"a49ebc55-5ef9-4165-a989-5b3b177a591c","Path":"fontlab-7-release-notes-part-4.md","Order":4},{"Id":"c01753fa-231a-42ed-9bc4-6f217ba13579","Path":"fontlab-7-release-notes-part-2.md","Order":2},{"Id":"3e0687e0-fbd1-42fb-a944-70ad40421ba9","Path":"fontlab-7-release-notes-part-5.md","Order":5}],"Id":"ec7fedf0-5d95-44ea-bbf5-2e8f01f9dfbc","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"New in 7","Languages":[{"Code":"en","Title":"New in 7","Slug":"new-in-7","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"4f8f3abb-5ca5-409c-84a0-6e23c162c8c3","Path":"release-notes-current.md","Order":1}],"Id":"e901e4c4-cb2c-47b5-a9df-53cb3021ea5f","Path":"release-notes.md","Order":3,"CategoryType":1,"Icon":null,"Title":"Release Notes","Languages":[{"Code":"en","Title":"Release Notes","Slug":"release-notes","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"7465cef2-233d-411c-bc83-6fe3b0b1fd4d","Path":"fontlab-7-user-manual.md","Order":1}],"Id":"2f16f8d4-73b5-4ec1-bbfc-e3ab2170ba01","Path":null,"Order":15,"CategoryType":0,"Icon":null,"Title":"GITHUB","Languages":[{"Code":"en","Title":"GITHUB","Slug":"github","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"738d7597-26e6-4e49-a449-25855a63c8da","Path":"upgrading-from-fontlab-5-or-vi.md","Order":6},{"Id":"590d8a45-83f6-4c65-ac35-f4900488cdf0","Path":"validation-1.md","Order":8},{"Id":"cf210f74-a999-4248-adb5-71369facc065","Path":"demo-mode-1.md","Order":2},{"Id":"4cd35456-ded7-44a8-9bda-3e4ce294dbff","Path":"using-previous-versions-1.md","Order":7},{"Id":"8098c07a-b41e-4daf-a5d2-915efcf2d94e","Path":"updates-2.md","Order":5},{"Id":"4fb9b848-1e1e-4f51-83ef-980ad3f3bee0","Path":"trial-period-1.md","Order":4},{"Id":"9d13eb37-521c-4093-9872-678568c22742","Path":"first-run-on-macos-1.md","Order":3},{"Id":"6336b9dd-603d-48c0-adda-c6c13c23c30a","Path":"academic-licenses-1.md","Order":1}],"Id":"2396d421-757c-43ef-84c7-732d8ffc608c","Path":"installation-and-requirements.md","Order":1,"CategoryType":1,"Icon":null,"Title":"Installation and Requirements","Languages":[{"Code":"en","Title":"Installation and Requirements","Slug":"installation-and-requirements","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"4e8f9a09-5140-40c2-a8ac-addadf06f67c","Path":"attaching-files-1.md","Order":1},{"Id":"33e528e3-98b3-4eae-b670-de4689cfa1d8","Path":"how-to-reopen-a-report-1.md","Order":2},{"Id":"6af2addc-0ae6-40b1-a90d-cab38c1736b7","Path":"submitting-a-report-1.md","Order":3},{"Id":"e2f90dff-5461-4438-9d92-b3d742f2979e","Path":"user-requests-1.md","Order":4},{"Id":"b16e5e55-aeef-44db-a029-5c3a110d050c","Path":"when-should-i-report-1.md","Order":5}],"Id":"4aceae5f-b56e-4c8f-8472-5092abc18078","Path":"support-1.md","Order":2,"CategoryType":1,"Icon":null,"Title":"Support","Languages":[{"Code":"en","Title":"Support","Slug":"support-1","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"ca6bebdb-cdcb-44b9-9577-a7ab630df75c","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"Getting Started","Languages":[{"Code":"en","Title":"Getting Started","Slug":"getting-started-3","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"c0d9c18d-0958-44c6-9510-14c761ca11b8","Path":"advance-width-1.md","Order":1},{"Id":"9c898f7f-570a-4a42-8366-827f91e993bf","Path":"kerning-7.md","Order":2},{"Id":"5492290a-2556-4548-817d-2bf9325ccf73","Path":"sidebearings-2.md","Order":3},{"Id":"b64f0c22-6e61-4a57-8c58-d5b99b688c29","Path":"the-em-square-1.md","Order":4}],"Id":"a6bbf69e-afde-4aff-bd0e-fb3f17f84198","Path":null,"Order":8,"CategoryType":0,"Icon":null,"Title":"Glyph Metrics","Languages":[{"Code":"en","Title":"Glyph Metrics","Slug":"glyph-metrics-1","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"7eb1cdf9-872e-45ec-b157-d6a424d303ff","Path":"script-1.md","Order":2},{"Id":"aafda55c-9b5c-47c5-8b0e-586c232ed234","Path":"font-3.md","Order":4},{"Id":"fc164a35-aa3e-474f-b480-9c07a7589bb9","Path":"opentype-2.md","Order":11},{"Id":"2ff704a0-5692-459b-b6e8-3390abc6afa5","Path":"contour-and-point.md","Order":3},{"Id":"012e3cc3-aa87-46e1-8be7-76a3402bbb28","Path":"font-family-1.md","Order":5},{"Id":"754f84c7-ccfe-47d2-b642-40385860a7a7","Path":"lookup-1.md","Order":9},{"Id":"42537c68-061d-47f2-9e09-201ba0dd7fc3","Path":"positioning-1.md","Order":12},{"Id":"64821c2b-261d-4884-bfbf-dccf52ecf53f","Path":"feature-1.md","Order":6},{"Id":"701050cb-8507-48ea-bcda-839296ab1bd1","Path":"metrics-and-dimensions-1.md","Order":10},{"Id":"8f212ada-8bea-411e-a346-b9002c59512e","Path":"component-1.md","Order":13},{"Id":"0206d111-f84f-4ccb-aebf-f77ba7874b5a","Path":"element-1.md","Order":7},{"Id":"28dc4fc2-efb2-494b-b998-b8f42fd944f9","Path":"character-vs.md","Order":1},{"Id":"36d6f00d-2b85-4e44-9d18-a0f3a6e26a4c","Path":"substitution-1.md","Order":14},{"Id":"e75d1a79-16c7-487f-8fd0-5ba680c678ce","Path":"variable-font-1.md","Order":15}],"Id":"024aea4d-3fce-4165-a094-05dc249e98b8","Path":"basic-concepts-1.md","Order":1,"CategoryType":1,"Icon":null,"Title":"Basic Concepts","Languages":[{"Code":"en","Title":"Basic Concepts","Slug":"basic-concepts-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"14f2d557-7972-44e3-92d8-1882c71e93ae","Path":"glyph-window-7.md","Order":1},{"Id":"2db5dbe2-4a3a-4c51-b06e-f72bee7c5f6c","Path":"zoom-control.md","Order":6},{"Id":"a9285699-28f4-4aba-acfa-bf40de400fe6","Path":"metrics-and-dimensions-2.md","Order":2},{"Id":"3b383635-c731-4bb5-89fd-f21b29621486","Path":"property-bar-4.md","Order":3},{"Id":"3afb15e4-25cb-4527-8935-06838bd667e0","Path":"rulers-and-guides.md","Order":4},{"Id":"879d61a3-46e9-43da-a5f8-81616f7918d8","Path":"view-options-2.md","Order":5}],"Id":"a9697571-db23-469f-88c3-4886f5b5ea70","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"Glyph Window","Languages":[{"Code":"en","Title":"Glyph Window","Slug":"glyph-window-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"c0ab5043-4218-4866-88cf-cbd22abe4933","Path":"status-bar.md","Order":5},{"Id":"168a2c50-5b53-4a26-99ff-d5eed7cdb54b","Path":"list-view.md","Order":6},{"Id":"16c38e04-8b82-441b-a190-b41d9a0f9332","Path":"visual-indicators-in-the-table-area.md","Order":7},{"Id":"82a36664-d9cb-44a2-a9b8-76b49021f1ba","Path":"property-bar-3.md","Order":3},{"Id":"b7cb3e2b-580c-4b54-85b5-d61477adab20","Path":"font-window-7.md","Order":1},{"Id":"2709f5f2-f6b8-4387-be04-ffda9e35166f","Path":"sidebar-1.md","Order":4},{"Id":"254d43e6-e6a1-4fa3-b30e-f7b8537f84b7","Path":"table-area.md","Order":2}],"Id":"4c92563d-d26d-470f-b651-3730e8357b4d","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Font Window","Languages":[{"Code":"en","Title":"Font Window","Slug":"font-window-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"68c3a08e-fa2f-4896-9c2c-73a30225f52a","Path":"operations-1.md","Order":2},{"Id":"241b3a01-df4e-4ed0-8362-9024732e1540","Path":"new-fonts-and-glyph-sets.md","Order":1},{"Id":"063b2d5b-de95-4320-a40f-6b4d1b3495e9","Path":"welcome-dialog-3.md","Order":3}],"Id":"fc33c486-87d3-4d66-b90e-9b26d97ac401","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Welcome Dialog","Languages":[{"Code":"en","Title":"Welcome Dialog","Slug":"welcome-dialog","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"4b5ec1c4-b36c-4e9d-8642-694f4662310c","Path":"docking-the-toolbar.md","Order":2},{"Id":"dbcf4af2-fcd9-4c47-b565-44987fbc389a","Path":"additional-commands.md","Order":1},{"Id":"982b4b1d-168d-4fe0-8733-03269c8f4ad9","Path":"the-toolbar-1.md","Order":4},{"Id":"998b7c12-2cbd-4368-9acd-ff95db1e5112","Path":"keyboard-shortcuts-for-tools.md","Order":3}],"Id":"e8c37352-5ecc-4f77-af81-bf579967d004","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"The Toolbar","Languages":[{"Code":"en","Title":"The Toolbar","Slug":"the-toolbar","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"9938aaf6-dc60-4fd6-a3dc-d8b6498bb4ba","Path":"managing-panels.md","Order":2},{"Id":"8aadd6b0-8a4a-4fc8-a66a-339f16fdfc7b","Path":"additional-options.md","Order":1},{"Id":"c22f8099-930a-4328-b709-adb426f767ed","Path":"panels-list-2.md","Order":3},{"Id":"6e8f3c54-bc98-40c5-86d2-76feb918a7c4","Path":"what-each-panel-does.md","Order":4}],"Id":"12b1cd5e-068b-4d8e-86f5-2514401e2982","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Panels","Languages":[{"Code":"en","Title":"Panels","Slug":"panels-2","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"e0030216-e405-40a5-9626-cd0839824136","Path":"keyboard-shortcuts-5.md","Order":1},{"Id":"76e7cdaf-b10d-483f-bef6-43fecf8e1b21","Path":"navigation-shortcuts.md","Order":2},{"Id":"b9c673c0-649c-493c-b705-44c1d6eeaa33","Path":"using-commands.md","Order":3}],"Id":"92f377a9-f515-47fd-9ee8-a555338a9d92","Path":null,"Order":6,"CategoryType":0,"Icon":null,"Title":"Commands & Shortcuts","Languages":[{"Code":"en","Title":"Commands & Shortcuts","Slug":"commands-shortcuts","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"669f126b-aaf0-4334-92f1-a5a2d0c9d876","Path":"workspaces-3.md","Order":8},{"Id":"888389c6-e5f8-4dd2-895f-7cf123155914","Path":"quick-help.md","Order":7}],"Id":"a35a89c1-8f2f-4a24-85c9-c0c5049c082f","Path":"running-fontlab.md","Order":5,"CategoryType":1,"Icon":null,"Title":"Running FontLab","Languages":[{"Code":"en","Title":"Running FontLab","Slug":"running-fontlab","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"e392e963-03e5-48e0-937f-61c5359e6d2e","Path":"welcome-to-fontlab-7-1.md","Order":1},{"Id":"af435ff0-a00e-437f-a18e-ed95d23976fd","Path":"what-fontlab-7-can-do.md","Order":2}],"Id":"bf5544d1-5d11-4299-a7e7-bf4cd3d81f35","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"Welcome to FontLab 7","Languages":[{"Code":"en","Title":"Welcome to FontLab 7","Slug":"welcome-to-fontlab-7","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"176e074d-d6d1-471e-a9b2-cc7203b78972","Path":"keyboard-shortcuts-4.md","Order":3},{"Id":"01c067db-32e9-4b5f-a802-bfa4a717b7ca","Path":"user-community.md","Order":4},{"Id":"6654170f-73da-4535-ab6b-13494321e6bb","Path":"about-this-guide.md","Order":1},{"Id":"d50eb89a-2602-422e-bd97-1b82cb4df558","Path":"always-updated.md","Order":2}],"Id":"e4c7fe3e-d9b8-414a-954f-95ba4c596b89","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"FontLab 7 Documentation","Languages":[{"Code":"en","Title":"FontLab 7 Documentation","Slug":"fontlab-7-documentation","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"d9e85468-84a5-4062-8c2d-e7c1a5e2e0cc","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Introduction","Languages":[{"Code":"en","Title":"Introduction","Slug":"introduction-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"af2003f4-6a1a-414b-a50a-f43bd2ec73ee","Path":"layers-in-font-window-sidebar.md","Order":8},{"Id":"dfba8cb5-5807-46c6-a933-a9eec1440103","Path":"layers-in-new-glyphs.md","Order":6},{"Id":"02f21e12-bcf3-43fa-80fb-89082fc1f5cd","Path":"glyph-window-layers.md","Order":3},{"Id":"6c5be383-66ad-44d7-be2e-095f5d80e1c0","Path":"layers-visibility.md","Order":5},{"Id":"e6db8e38-123c-4c47-a282-39c29015fd3e","Path":"switching-layers.md","Order":2},{"Id":"948a66f3-8d5b-498a-aecf-605dcbad71fe","Path":"show-inactive-layers-as-wireframes.md","Order":7},{"Id":"5d4ae1e8-140b-4203-9af5-f6aeb82acda6","Path":"editing-across-exportable-and-service-layers.md","Order":9},{"Id":"26afc537-a4ff-49e6-ad9d-01360450e041","Path":"removing-layers.md","Order":4},{"Id":"12c762b9-d8a3-477e-936c-da41485087ea","Path":"adding-layers.md","Order":1}],"Id":"0e79646d-43b0-4766-bcb2-112d69d3f2e8","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Working with Layers","Languages":[{"Code":"en","Title":"Working with Layers","Slug":"working-with-layers-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"9dce0c6b-6dce-4466-9027-386c0acc84a2","Path":"removing-a-global-mask-layer.md","Order":3},{"Id":"d17e32f6-f87b-4829-b04e-287a9ed234b7","Path":"creating-a-global-mask-layer.md","Order":1},{"Id":"7d9bc62d-d115-4b2f-9ba0-4900084932b4","Path":"global-mask.md","Order":2}],"Id":"e941d944-7784-44eb-bbc8-c70fc4fdab46","Path":"the-global-mask.md","Order":5,"CategoryType":1,"Icon":null,"Title":"The Global Mask","Languages":[{"Code":"en","Title":"The Global Mask","Slug":"the-global-mask","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"eba45c92-a716-4882-ba1e-02487fdb3302","Path":"copy-and-paste.md","Order":1}],"Id":"dd12fb79-aebb-4e86-bbaf-a792c3a61062","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Copying and Pasting Layers","Languages":[{"Code":"en","Title":"Copying and Pasting Layers","Slug":"copying-and-pasting-layers","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"f538e45e-37ee-4ebf-aee3-d52bf4cc63c8","Path":"mask-2.md","Order":3},{"Id":"77d70fb4-07fa-4b5c-9c54-5a4ec20743da","Path":"swap-with-mask.md","Order":6},{"Id":"b9e5a547-6719-4814-9031-36b8d2ca8267","Path":"creating-a-mask-layer.md","Order":1},{"Id":"78e0a288-c43c-43a4-aa33-57b9958a0108","Path":"editing-a-mask-layer.md","Order":2},{"Id":"9e5d8f47-5369-46c9-9512-ee1542e23eef","Path":"paste-mask.md","Order":4},{"Id":"62250884-22de-4d6f-bd78-91598a07e70e","Path":"removing-a-mask-layer.md","Order":5}],"Id":"f2ade6d0-eaf7-444b-8cbb-f51d7058260d","Path":"mask-layers.md","Order":3,"CategoryType":1,"Icon":null,"Title":"Mask Layers","Languages":[{"Code":"en","Title":"Mask Layers","Slug":"mask-layers","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"9e13278e-d96d-4a21-b119-b6e278dd7b18","Path":"filling-layers-with-the-content-of-other-fonts-or-masters.md","Order":1}],"Id":"99da586a-4f62-40a7-b549-7b91e075dee9","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"Importing Glyphs to a Layer","Languages":[{"Code":"en","Title":"Importing Glyphs to a Layer","Slug":"importing-glyphs-to-a-layer","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"dcc15ded-83a9-4f67-a367-633998fd0a1d","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"Working with Layers","Languages":[{"Code":"en","Title":"Working with Layers","Slug":"working-with-layers","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"7633a785-15bb-411b-9c15-9f6da7beaa19","Path":"append-and-unicode-positions.md","Order":1},{"Id":"d81ed14d-5c47-4bc8-b49f-9b04353ce8d2","Path":"paste-in-font-window-replace-or-append.md","Order":2}],"Id":"44d6e8d3-59e4-447f-a599-56428137af8c","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Appending Glyphs","Languages":[{"Code":"en","Title":"Appending Glyphs","Slug":"appending-glyphs","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"1d884e35-6ea3-42b8-b984-058795c48938","Path":"paste-glyph-reference.md","Order":1},{"Id":"f3da0d03-7ab7-4355-b61a-b218225c9cdd","Path":"paste-special.md","Order":2},{"Id":"b078b754-97ed-4a51-89c4-a699c3c50b73","Path":"simple-paste.md","Order":3},{"Id":"130f153e-807e-4dc0-be08-af53bdeffb9b","Path":"using-draganddrop.md","Order":4},{"Id":"44fb10b9-f827-412a-b781-09c7c3134792","Path":"using-menu-commands.md","Order":5}],"Id":"f8acfe38-dcc7-4473-9790-32b094fb6a80","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Copying and Pasting Glyphs","Languages":[{"Code":"en","Title":"Copying and Pasting Glyphs","Slug":"copying-and-pasting-glyphs","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"0b748f12-759b-46a7-87e5-de1c87fdaae2","Path":"deleting-glyphs1.md","Order":1},{"Id":"c147c40c-ea21-4e93-8c61-0c86823b8e16","Path":"remove-glyphs-from-the-font.md","Order":2},{"Id":"c7a5000b-7ffc-4d32-a9de-f9fef8a9a4c5","Path":"remove-glyphs-used-elsewhere.md","Order":3}],"Id":"02934e0a-f885-49ad-b288-d38e521d8071","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"Deleting Glyphs","Languages":[{"Code":"en","Title":"Deleting Glyphs","Slug":"deleting-glyphs","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"16bbb0f2-f761-46db-9484-6766914b1a0f","Path":"sorting-glyphs-1.md","Order":1},{"Id":"87248be4-45ac-420d-b9c7-133df580e1e7","Path":"moving-in-the-index-mode.md","Order":3},{"Id":"cdedf4fe-28d1-48fc-84ac-f5fcaa4b865c","Path":"moving-glyphs-1.md","Order":4},{"Id":"4d06a2a8-5371-45b3-95d3-2a85f89794c2","Path":"sorting-in-index-mode.md","Order":2}],"Id":"4b422da2-db64-4bb2-9dde-f21712adb63c","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"Sorting and Moving Glyphs","Languages":[{"Code":"en","Title":"Sorting and Moving Glyphs","Slug":"sorting-and-moving-glyphs","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"abfc15c7-a1b2-40de-80c4-3bf2bfd9c5ce","Path":"glyph-name-synonyms-in-font-window-quick-preview.md","Order":1},{"Id":"4ce33e73-444b-42ec-a464-63421375a905","Path":"glyph-panel-with-multiple-selected-glyphs.md","Order":2},{"Id":"961d73a6-cc1b-4939-8d13-8eee46861291","Path":"opening-glyph-tabs-or-windows.md","Order":3}],"Id":"d73c947b-545b-40db-a614-6ebb2cf29292","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Font window and Glyph panel","Languages":[{"Code":"en","Title":"Font window and Glyph panel","Slug":"font-window-and-glyph-panel","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"e689d403-5dd7-4872-b1c0-79bd5317ab1e","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Managing Glyphs","Languages":[{"Code":"en","Title":"Managing Glyphs","Slug":"managing-glyphs","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"de0a6748-8364-48cf-8015-946b696f22a9","Path":"simple-stickers.md","Order":1},{"Id":"f99a8f88-d510-4aa4-ad16-ee0999a840ba","Path":"stickers-1.md","Order":2},{"Id":"e3d15b3b-2898-4317-aab7-f10fac3d3b11","Path":"text-stickers.md","Order":3}],"Id":"28c359df-5bbe-4ce2-8147-ef75295b61f1","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Glyph stickers","Languages":[{"Code":"en","Title":"Glyph stickers","Slug":"glyph-stickers","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"6f53de29-f893-4271-aaeb-5a15258a6702","Path":"glyph-names-and-unicode.md","Order":6},{"Id":"18f80edc-d6ca-4172-a14a-b7848668f54f","Path":"unicode-in-cjk-fonts.md","Order":7},{"Id":"9ebeb2fc-43c2-4edd-80ae-9a56d4e06eea","Path":"duplicating-unicode-codepoints.md","Order":2},{"Id":"dce45e5c-5be5-4b20-950d-2f8b25abbd4c","Path":"characters-codes-and-glyphs.md","Order":1},{"Id":"e855a1a5-b722-4ca2-bfac-905c4079cba3","Path":"generate-names-1.md","Order":4},{"Id":"e62d81c4-e330-4da8-b583-b4c912aaacf5","Path":"encoding-standards.md","Order":3},{"Id":"4960bab9-dda5-4352-bb98-4c8035530cd6","Path":"generate-unicodes-1.md","Order":5}],"Id":"c0d71795-93df-4031-b470-3441ad022b14","Path":"glyph-naming-and-encoding.md","Order":1,"CategoryType":1,"Icon":null,"Title":"Glyph Naming and Encoding","Languages":[{"Code":"en","Title":"Glyph Naming and Encoding","Slug":"glyph-naming-and-encoding","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"4d1d7ad2-20da-4b1f-b1fd-ff12a81e9510","Path":"methods-for-glyph-renaming.md","Order":6},{"Id":"1665fd6e-ad1e-4703-8e50-30515ce9d0e7","Path":"standardnam-mapping.md","Order":10},{"Id":"1254e969-d513-4346-ae96-8410baf75219","Path":"synonyms.md","Order":11},{"Id":"80b7c8cc-ba55-4c26-bf8e-711a4628dd0b","Path":"unixxxx-and-production-names.md","Order":12},{"Id":"7eb2a3aa-3264-4085-a21a-b015cd0f3eab","Path":"attributing-glyph-names-when-a-font-is-open.md","Order":1},{"Id":"b2fce356-54cc-48bc-bf20-39b3a34a7c69","Path":"missing-glyph-placeholders.md","Order":7},{"Id":"a8711998-8346-4325-8650-c9e7df423290","Path":"renaming-glyphs1.md","Order":8},{"Id":"883e9b2f-03ba-45cb-853b-a5c2c49a050d","Path":"glyph-names-2.md","Order":5},{"Id":"694b35a0-7f67-4adb-a24b-ccb4bba5d82b","Path":"flexible-custom-renaming.md","Order":3},{"Id":"69b6c82e-1891-4912-9e3d-6ab8ab01a827","Path":"renaming-glyphs-2.md","Order":9},{"Id":"1d685706-f580-42b1-9604-eec6557cb1f3","Path":"builtin-glyph-names.md","Order":2},{"Id":"5acf2dad-ab33-428a-87a9-eb2d3c4a01e8","Path":"friendly-and-alternative-names.md","Order":4}],"Id":"56f4d348-df6b-4afe-ac41-ecafe5e7f68c","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Glyph Naming","Languages":[{"Code":"en","Title":"Glyph Naming","Slug":"glyph-naming","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"a798f733-d465-4d79-83b8-8145c96b7f2c","Path":"procedure.md","Order":2},{"Id":"d143e77c-dd76-45a0-b040-9248a4057bde","Path":"limitations-regarding-notes.md","Order":1},{"Id":"f3d86f3b-cc23-4a42-991b-cc6fd86256e5","Path":"styling-text-in-notes.md","Order":3}],"Id":"84c17b33-fd64-4f85-a103-f934573aeed5","Path":"glyph-notes.md","Order":3,"CategoryType":1,"Icon":null,"Title":"Glyph Notes","Languages":[{"Code":"en","Title":"Glyph Notes","Slug":"glyph-notes","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"3e75e27b-4b44-41fb-ba52-59ca9076b3d9","Path":"using-suffixes-to-filter-a-font.md","Order":2},{"Id":"3bc1dfd4-e00f-42df-883a-f6ab41395f9e","Path":"using-custom-suffixes.md","Order":1},{"Id":"8a258f16-d0bf-4ac8-a498-ca9dffaaad55","Path":"using-suggested-suffixes.md","Order":3},{"Id":"30ca1244-f75f-43ef-8c69-56ba9d9aad38","Path":"what-is-allowed.md","Order":4}],"Id":"36745381-ebb6-4487-b869-4c64eb6e1584","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"Using Suffixes","Languages":[{"Code":"en","Title":"Using Suffixes","Slug":"using-suffixes","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"15789fe7-0288-413a-bed7-67333fe37acd","Path":"editing-classes.md","Order":2},{"Id":"ab26a7a5-a77b-43e1-8af9-6b20aff650c5","Path":"editing-glyph-tags.md","Order":3},{"Id":"6da66b51-ad38-4644-92d6-c9a8f15f5274","Path":"custom-glyph-tags.md","Order":1},{"Id":"144f44b6-c81f-4023-ba37-cb25fe07b021","Path":"glyph-classes.md","Order":4},{"Id":"14054ed5-1dc1-4b1a-8761-5f42bb4d8d25","Path":"glyph-tags.md","Order":5},{"Id":"5b2d8564-2da6-4260-8c3d-05e64cc52d99","Path":"virtual-tags.md","Order":6}],"Id":"4a9903dd-a857-4105-b3a0-bae5325c2c88","Path":null,"Order":6,"CategoryType":0,"Icon":null,"Title":"Glyph Tags and Classes","Languages":[{"Code":"en","Title":"Glyph Tags and Classes","Slug":"glyph-tags-and-classes","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"7359cb35-4e1c-4449-b652-8b39f880c9a2","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Glyph Information","Languages":[{"Code":"en","Title":"Glyph Information","Slug":"glyph-information","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"ead8df40-679d-493d-b04f-029c0efd1f1a","Path":"vector-artwork-section.md","Order":4},{"Id":"af4846cb-8c60-4e54-b1c1-97f247e42c07","Path":"fit-artwork-section.md","Order":2},{"Id":"bcdab03d-7ed4-415b-9ab3-47d8e08a86da","Path":"preferences-6.md","Order":3},{"Id":"5fedc8e4-3a46-4902-a801-5ee41d0e9d9c","Path":"keep-artwork-size-section.md","Order":1}],"Id":"dd9e180b-1e51-4fbe-bd37-397f764db80a","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Preferences applicable","Languages":[{"Code":"en","Title":"Preferences applicable","Slug":"preferences-applicable","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"a9822996-7057-4f55-9c66-e8c80fd5ae66","Path":"preparation-of-drawings.md","Order":4},{"Id":"9b08085b-c0b6-42d0-bf31-a3bab36a1cab","Path":"exporting-the-font.md","Order":8},{"Id":"44a52db7-d745-461a-9c44-0c338688e6fa","Path":"bringing-the-drawings-to-fontlab.md","Order":1},{"Id":"36bf1108-8d77-4628-bfd1-00aa928b3e1c","Path":"placing-to-font.md","Order":6},{"Id":"963fd992-f441-49ed-80ac-60e40259f52e","Path":"separating-the-letters.md","Order":3},{"Id":"46647eeb-6eb0-439b-aacb-915ad0356a49","Path":"making-a-font-from-color-vector-graphics-1.md","Order":2},{"Id":"d001f286-01ea-44a3-af71-51f31d8625dd","Path":"setting-up-the-new-font.md","Order":7},{"Id":"f0ae7f70-2299-4cd1-a396-248974a9bf7e","Path":"saving-and-testing.md","Order":5}],"Id":"40e8db0b-cdf6-4734-b80c-a4dee8b1f8c5","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Using Color Vector Graphics","Languages":[{"Code":"en","Title":"Using Color Vector Graphics","Slug":"using-color-vector-graphics","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"653eb40c-66c4-46f3-b661-74f03218323c","Path":"pasting-vector-artwork.md","Order":5},{"Id":"fa09c042-fef9-4789-9810-0d917b411381","Path":"place-as-glyphs.md","Order":7},{"Id":"f013bf8a-c460-45d5-84c0-56ba8d041dbd","Path":"in-the-sketchboard.md","Order":3},{"Id":"75ca95cb-ef82-4476-9303-2b8800ed92da","Path":"paste-or-import-vector-artwork.md","Order":4},{"Id":"1e228cba-f01e-493b-9518-9a515e1bccd4","Path":"placing-artwork-1.md","Order":8},{"Id":"c153d854-a96b-43fd-a8f0-2663bdfa7b47","Path":"preparing-artwork.md","Order":9},{"Id":"fe98ff14-4f5a-435a-995a-fbaa6dc6e9ec","Path":"pasting.md","Order":6},{"Id":"06890f53-4760-4e71-b119-9a299046bcdd","Path":"handling-the-elements.md","Order":2},{"Id":"07ab215a-f510-44af-88ea-da8fd3298fc5","Path":"copypaste-and-import-artwork-in-pdf-format.md","Order":1}],"Id":"390f436b-0261-4270-9a1b-a03c1af98363","Path":"importing-artwork.md","Order":2,"CategoryType":1,"Icon":null,"Title":"Importing Artwork","Languages":[{"Code":"en","Title":"Importing Artwork","Slug":"importing-artwork","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"5a0c58b7-7188-47ea-bc4c-8546f481b2c5","Path":"copying-elements-to-the-font.md","Order":11},{"Id":"a2eb3da6-9c6a-4b48-92b5-b7f3b76d727b","Path":"using-the-sketchboard-for-editing-glyphs.md","Order":12},{"Id":"9123cd25-cced-4aa9-a810-feab5f211300","Path":"using-text-frames.md","Order":3},{"Id":"1a314f1c-18b1-44fb-9ded-63ee749caf8c","Path":"importing-artwork-3.md","Order":5},{"Id":"ba37ccef-20e8-4e3a-9190-440c147d1f9a","Path":"removing-a-text-frame.md","Order":8},{"Id":"32472966-73e9-4d6c-9283-ef218cb09143","Path":"converting-a-text-into-a-glyph-window.md","Order":2},{"Id":"1f0ac92b-37e4-4d1f-9cb4-331af846383d","Path":"exporting-the-sketchboard.md","Order":7},{"Id":"e8cd762c-1240-4247-a0f0-75085ca1304a","Path":"lockingunlocking-a-text-frame.md","Order":6},{"Id":"0d31056b-8d12-4aa0-b837-fcf9d4d10405","Path":"changing-text-wrap.md","Order":1},{"Id":"7133e89d-2988-4158-b483-902d5daf36d9","Path":"saving-the-sketchboard.md","Order":9},{"Id":"e3d7ffab-f336-4378-8c6b-c57729efa233","Path":"opening-the-sketchboard.md","Order":4},{"Id":"1a218d81-5b89-430d-a4f1-e47929f6c30e","Path":"deleting-the-sketchboard-contents.md","Order":10}],"Id":"26117858-057d-4657-9c8a-106dabf25838","Path":"using-sketchboard.md","Order":3,"CategoryType":1,"Icon":null,"Title":"Using Sketchboard","Languages":[{"Code":"en","Title":"Using Sketchboard","Slug":"using-sketchboard","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"e62e25ca-e8a8-4fef-ac1f-3f20522978f5","Path":"importing-artwork-svg-artwork.md","Order":5},{"Id":"059834b4-cfba-4120-a6fc-81cd1397515d","Path":"improved-conversion-from-svg-to-editable-contours.md","Order":6},{"Id":"2f8d8929-207a-4633-8ac6-c79a23d48478","Path":"dragdrop-artwork-onto-the-font-window.md","Order":4},{"Id":"b986ea01-1b36-4d7e-89b2-827c10af2ad1","Path":"pasteimport-of-vector-artwork-coordinate-rounding.md","Order":9},{"Id":"82f6de45-e5b6-4af6-bcac-f297e4c55ae4","Path":"opentypesvg-fonts.md","Order":8},{"Id":"d230a342-7faf-4b75-8164-d902bc4bbd01","Path":"copy-and-paste-from-adobe-illustrator.md","Order":1},{"Id":"ef130594-bc35-4a85-a9a8-0b722e9d0b3b","Path":"make-svg-editable.md","Order":7},{"Id":"5157b05b-1685-41d5-803c-5eefcbd2d41a","Path":"pasteimport-of-vector-artwork-monochrome-artwork.md","Order":10},{"Id":"c1583422-20ed-4f63-a3fe-97486eb7a11a","Path":"dragdrop.md","Order":3},{"Id":"1921f385-a7ac-48c3-894a-13a5b2bdd46e","Path":"copy-and-paste-from-fontlab-studio-5.md","Order":2}],"Id":"00a99049-26a4-4e36-9978-3a396b670cf7","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"Importing Vector Graphics","Languages":[{"Code":"en","Title":"Importing Vector Graphics","Slug":"importing-vector-graphics","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"a385c74f-10e2-4e8c-af59-e4886281d4c1","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"Importing Vectors","Languages":[{"Code":"en","Title":"Importing Vectors","Slug":"importing-vectors","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"f6d3e250-8cf1-4f52-a979-55b0eb5e0c28","Path":"print-from-a-font-window.md","Order":1},{"Id":"a8bd8d92-ac4a-4307-bb86-d3b97a19c7cf","Path":"print-from-a-glyph-window.md","Order":2},{"Id":"d737a29f-2825-4ddb-bd24-295f88e6c233","Path":"printing-alternatives.md","Order":3}],"Id":"fe65105c-3641-424c-8f49-d4cc066b6a92","Path":"printing-1.md","Order":6,"CategoryType":1,"Icon":null,"Title":"Printing","Languages":[{"Code":"en","Title":"Printing","Slug":"printing-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"62055ac4-1cc9-4e1e-aa9d-25d69d1e4442","Path":"more-improvements-to-autotrace-and-bitmap-images.md","Order":3},{"Id":"f962c80e-4d0d-4b02-b5d7-f86fdffc60ab","Path":"postprocess-the-initial-contours.md","Order":5},{"Id":"d670af03-5e89-4226-8412-888f8ef1449b","Path":"build-the-initial-contours.md","Order":2},{"Id":"274641f2-e611-48e7-b7d8-752b0a0b3b73","Path":"postprocess-the-image.md","Order":4},{"Id":"0690c8d3-a33a-496d-bc46-de50dc21f720","Path":"prepare-the-image.md","Order":6},{"Id":"bf433e21-a435-49aa-a389-e24b09b56a87","Path":"bitmaps-and-autotrace-1.md","Order":1}],"Id":"6397f8ba-f8bf-4c3d-b568-e9069e7e066e","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Importing bitmaps","Languages":[{"Code":"en","Title":"Importing bitmaps","Slug":"importing-bitmaps-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"74cf67e7-3c56-4951-b3dd-37d57dd90865","Path":"exporting-the-font-1.md","Order":3},{"Id":"5cf91d74-470a-4657-954c-d67106a551a6","Path":"preparation-of-images.md","Order":1},{"Id":"9c9edcb2-a281-40b4-abdc-6720f5e7d57a","Path":"placing-to-font-1.md","Order":2},{"Id":"27a938c8-c06e-4332-8255-5d93a12fccde","Path":"updating-font-info.md","Order":6},{"Id":"76e7c316-89ef-4fd5-8bea-ff4f1db52294","Path":"saving-and-testing-1.md","Order":4},{"Id":"bc937988-be95-426c-8fda-8fd3d2a69a8a","Path":"separating-the-images.md","Order":5},{"Id":"c9692eeb-3b92-477d-b3ff-749b2caaf8fe","Path":"bringing-the-images-to-fontlab.md","Order":7}],"Id":"a18c795f-4ef1-4a39-b69a-14fbb45e06a1","Path":"using-color-bitmap-images.md","Order":3,"CategoryType":1,"Icon":null,"Title":"Using Color Bitmap Images","Languages":[{"Code":"en","Title":"Using Color Bitmap Images","Slug":"using-color-bitmap-images","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"3a9f7f71-dbbd-4191-aacf-3a92450a7327","Path":"preparation-of-the-source-image.md","Order":1},{"Id":"c432986b-a9ba-41bc-93d0-a97a795cbe23","Path":"scanning-an-image.md","Order":2}],"Id":"b847992a-b4d6-4628-abc0-660b874dae2e","Path":"preparing-bitmap-artwork.md","Order":1,"CategoryType":1,"Icon":null,"Title":"Preparing Bitmap Artwork","Languages":[{"Code":"en","Title":"Preparing Bitmap Artwork","Slug":"preparing-bitmap-artwork","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"56241d69-7e48-4607-8be7-16622988ad8e","Path":"despeckle.md","Order":3},{"Id":"effba112-1481-44b0-9af8-eee8ce712b01","Path":"sharpen.md","Order":7},{"Id":"2aa08777-ca5c-42f9-9d45-787e3a817017","Path":"remove-background.md","Order":8},{"Id":"75e72f69-867d-4350-81a3-d51624df135a","Path":"autotrace.md","Order":9},{"Id":"fb173252-751f-4027-9dca-103bdc1b2c7c","Path":"reduce-noise.md","Order":6},{"Id":"444522e4-40af-4be9-b83e-e38a3740cdf7","Path":"gaussian-blur.md","Order":5},{"Id":"b41a13f0-bc37-48a6-a9e5-e920869d2814","Path":"bitmap-effects-2.md","Order":2},{"Id":"620bbfef-d7c5-4e57-b468-31c0af6ff737","Path":"find-edges.md","Order":4},{"Id":"72b653fd-a384-406b-bb21-c0237cb7641e","Path":"threshold.md","Order":10},{"Id":"fcdc9724-9a51-45ee-a051-37291678eec4","Path":"soften.md","Order":1}],"Id":"f993c75f-ae30-4be3-9dba-83f77200743c","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"Bitmap Effects","Languages":[{"Code":"en","Title":"Bitmap Effects","Slug":"bitmap-effects","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"cf9356d0-b611-490a-859a-710c5f83ad9f","Path":"better-optical-separation.md","Order":3},{"Id":"9c6ceb61-f809-41a2-9cdf-dfd74279825c","Path":"autotrace-1.md","Order":2},{"Id":"13828438-106a-41eb-ba50-aa4495b20ad6","Path":"autotrace-options.md","Order":1}],"Id":"56b6adba-53e4-4658-a26a-ba03f89bec5f","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Autotracing","Languages":[{"Code":"en","Title":"Autotracing","Slug":"autotracing","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"dcb2083a-f3f0-4162-9cee-a74bd93c9e31","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Importing Bitmaps","Languages":[{"Code":"en","Title":"Importing Bitmaps","Slug":"importing-bitmaps","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"353dbd7d-79d7-4fcc-84f4-196bd2e0b863","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"Working with Glyphs","Languages":[{"Code":"en","Title":"Working with Glyphs","Slug":"working-with-glyphs","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"105cf8b5-5845-45a9-a3ab-e92470700d4e","Path":"file-menu.md","Order":2},{"Id":"8558c774-3d11-4652-b35a-eca6b09e2544","Path":"drag-and-drop.md","Order":1},{"Id":"7f83bab0-8a7c-4c5b-9748-1b042cf7dc20","Path":"open-font-preferences.md","Order":5},{"Id":"5b476ef2-fa7d-411a-8ca7-c06d488a2860","Path":"opening.md","Order":4},{"Id":"11b0f01b-298e-4157-8407-82ffcb3d5c33","Path":"welcome-dialog-4.md","Order":3}],"Id":"e0bb8a30-7f8e-4a3d-87b1-6f10216e2658","Path":"opening-a-font.md","Order":2,"CategoryType":1,"Icon":null,"Title":"Opening a Font","Languages":[{"Code":"en","Title":"Opening a Font","Slug":"opening-a-font","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"76933ef2-9608-4775-b95f-7c9191128e5d","Path":"auxiliary-file-formats-1.md","Order":1},{"Id":"f50e202c-0b1f-4d39-8620-a35142e52bff","Path":"export-formats.md","Order":2},{"Id":"437a9cc2-bda5-4565-b5a9-5e984c3d05ec","Path":"import-and-export-files.md","Order":3},{"Id":"429ee076-a821-4c7e-8dc4-2f9b80c8e6b6","Path":"import-formats.md","Order":4}],"Id":"067b1f04-14c7-4fc7-a32e-d0f5e68775e2","Path":"file-formats.md","Order":1,"CategoryType":1,"Icon":null,"Title":"File formats","Languages":[{"Code":"en","Title":"File formats","Slug":"file-formats","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"fdbb3f2d-9d54-4746-9ffc-17a2f0d54192","Path":"manually-saving.md","Order":3},{"Id":"13dd6e47-33a8-4dd1-868c-496d76cd895e","Path":"save-preferences.md","Order":4},{"Id":"a1245265-73dc-4afa-828c-e65b4fb343c5","Path":"bitmap-fonts.md","Order":2},{"Id":"c2be998a-1a29-4756-8a7a-1ba0f28b4dd8","Path":"autosaving.md","Order":1}],"Id":"7bea85ca-af1c-4490-a4c7-71d042fecf04","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"Saving a Font","Languages":[{"Code":"en","Title":"Saving a Font","Slug":"saving-a-font","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"1ae96d43-6dc2-475f-80fa-659b9169f8ac","Path":"font-families-1.md","Order":2},{"Id":"8f374e97-66a8-4da9-b3f8-6ff04e24f6b5","Path":"multiple-fonts-open.md","Order":3},{"Id":"32beea38-a584-4688-aa1c-6ad18d2c8a10","Path":"font-attributes.md","Order":1},{"Id":"9610b0e5-5cf6-4b17-87d8-a1506a2466c9","Path":"using-the-fonts-panel.md","Order":4}],"Id":"3f64e8ac-1983-46d6-8569-14907ce17929","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"Fonts and Families","Languages":[{"Code":"en","Title":"Fonts and Families","Slug":"fonts-and-families","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"b0d2bc8b-6638-4d68-ac94-4f5eb1d99da8","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Files and Fonts","Languages":[{"Code":"en","Title":"Files and Fonts","Slug":"files-and-fonts","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"ad5bd0e5-83b1-400f-8f2b-be965de544bf","Path":"tba-2.md","Order":1}],"Id":"7a93e413-ba66-4250-9394-4f440d2f66b4","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"Script and Index","Languages":[{"Code":"en","Title":"Script and Index","Slug":"script-and-index","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"ea8983ff-4c5d-47dd-b853-67fc04e6d294","Path":"tba-1.md","Order":1}],"Id":"847c3166-0743-49bf-992e-24b933282727","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"Codepages","Languages":[{"Code":"en","Title":"Codepages","Slug":"codepages","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"1ada4e70-d0b7-4a0f-b083-552bf68eb0ec","Path":"tba-3.md","Order":1}],"Id":"a0ee380f-d164-4409-8901-a7ce1d211622","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Categories","Languages":[{"Code":"en","Title":"Categories","Slug":"categories","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"e59cfece-d550-40c6-b68b-e09b1b5bb1b7","Path":"encoding-views.md","Order":1},{"Id":"611d0f2f-7adb-4e6d-bc64-7f745c7a0eba","Path":"tips.md","Order":4},{"Id":"754e7f18-0391-4151-a763-b77d11717224","Path":"language-support-and-encoding-views.md","Order":3},{"Id":"3b3e0696-c333-4c47-a60a-de13c087e68a","Path":"what-is-an-encoding.md","Order":5},{"Id":"b106ffb0-5f0e-460e-bbc9-b6c99a3552a1","Path":"export-and-import-encoding.md","Order":2}],"Id":"a82260e0-ee21-4178-9b0f-f351042d64c1","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Encodings","Languages":[{"Code":"en","Title":"Encodings","Slug":"encodings","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"af4c7830-2e21-4d19-ae5f-b84b1ef1b684","Path":"tba.md","Order":1}],"Id":"eda288bd-22a3-4d00-8c9a-1a5b74b4a169","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Unicode","Languages":[{"Code":"en","Title":"Unicode","Slug":"unicode","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"0d1e182f-34bd-470c-b39a-b9d419f36c17","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"Font Filter Types","Languages":[{"Code":"en","Title":"Font Filter Types","Slug":"font-filter-types","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"085c59db-5ba5-42ee-bbef-34e0536240d0","Path":"search-box.md","Order":4},{"Id":"923736f5-44d9-45f6-a9a3-eb88581144f2","Path":"list-related-glyphs.md","Order":2},{"Id":"132e0d71-f8cf-467a-8b1a-4d73529baa2b","Path":"searching-for-glyphs.md","Order":5},{"Id":"670c54eb-f8c6-4f8c-866f-1dbf419c5a2e","Path":"quick-find-by-name.md","Order":3},{"Id":"29d1156a-ffec-489b-bd79-1f80eae9e353","Path":"find-glyphs.md","Order":1}],"Id":"6407a86b-dd22-455b-853f-7ada46ed9c9c","Path":"searching-glyphs.md","Order":3,"CategoryType":1,"Icon":null,"Title":"Searching Glyphs","Languages":[{"Code":"en","Title":"Searching Glyphs","Slug":"searching-glyphs","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"106d4e53-f90f-49bb-a7cb-ba1e435d2bb3","Path":"glyph-cells-1.md","Order":1},{"Id":"b97782d9-b372-4a56-ac2a-f818734777f3","Path":"caption-colors.md","Order":2},{"Id":"b1015810-6646-480d-9b3d-653cf9a76f62","Path":"keyboard-zooming.md","Order":5},{"Id":"eb61ebba-c99d-408b-a6d9-382c1c48ee17","Path":"navigating.md","Order":6},{"Id":"35c5b48e-92ee-475e-b3f6-fdb39e59aacc","Path":"cell-size.md","Order":3},{"Id":"37f433bd-2be4-4163-82ce-6ec3e234ecee","Path":"unicodename-mismatch.md","Order":7},{"Id":"eecbdfc0-e428-460f-b9b7-aade805fac10","Path":"background-colors.md","Order":4}],"Id":"28dfa726-8ecd-4109-9117-523de06b2c09","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Glyph Cells","Languages":[{"Code":"en","Title":"Glyph Cells","Slug":"glyph-cells","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"8cb9889b-3181-44dc-9300-1c648a8d6feb","Path":"find-characters-and-categories.md","Order":4},{"Id":"45885dc5-c54e-4562-a0dd-ca2121564c29","Path":"index-filter.md","Order":7},{"Id":"c90fd8b3-2b59-4911-82a6-2b872bdf5afb","Path":"filter-font-window-by-color-flag.md","Order":2},{"Id":"fa966f84-6bb8-4025-b809-517a3183cd4f","Path":"predefined-filters.md","Order":8},{"Id":"d8093c81-829c-4ebf-9706-ccd496927fc9","Path":"saved-searches-and-bookmarks.md","Order":9},{"Id":"2db9e9b4-1efc-4475-965b-fbe3e3fc4a87","Path":"font-window-filters-1.md","Order":5},{"Id":"e37f1967-c445-44ba-9527-ca9a9dd66023","Path":"color-filter.md","Order":1},{"Id":"c3bbd92e-50d2-4ff7-beb8-f4cfe20d35bf","Path":"using-the-sidebar.md","Order":10},{"Id":"7ea76068-caa5-42cf-b5d8-f6e12dcfa271","Path":"how-the-table-shows-results.md","Order":6},{"Id":"fe148f4c-1185-4c32-a6c9-be110916a5a7","Path":"filter-font-window-by-glyph-name-suffix.md","Order":3}],"Id":"f0fff927-1363-4ccb-9cae-fe3bba30bca0","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Filtering Glyphs","Languages":[{"Code":"en","Title":"Filtering Glyphs","Slug":"filtering-glyphs","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"0025ed46-c217-4239-87f3-1e86b845b228","Path":"glyph-table.md","Order":3},{"Id":"33edafeb-5bea-452d-93b7-0934411c82c4","Path":"status-bar-1.md","Order":6},{"Id":"8462ce9e-4665-46f6-aa7b-b5343d40e472","Path":"context-menu.md","Order":1},{"Id":"e127aa82-5af1-4e6a-9d56-28766705c908","Path":"list-view-1.md","Order":4},{"Id":"dbbec568-86c1-4189-93bb-52ba7ffc8e91","Path":"font-window-property-bar-1.md","Order":2},{"Id":"8d287dd1-6042-4194-91b4-4d000ea371a4","Path":"sidebar-2.md","Order":5}],"Id":"4f1bba3d-f848-4b31-a443-9749ce18d735","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Using the Font Window","Languages":[{"Code":"en","Title":"Using the Font Window","Slug":"using-the-font-window","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"5409901a-bd0e-4a95-950e-691e9975b6c4","Path":"more-selections.md","Order":4},{"Id":"b99b203b-b574-4ed1-963d-5da7111b053d","Path":"select-in-context-menu.md","Order":7},{"Id":"6d1b7d28-1b10-4bc9-a351-180c6ebe021a","Path":"selecting-cells.md","Order":8},{"Id":"3d2ecfde-5e5e-42c0-8cb1-8a49c80195bd","Path":"componentrelated-selection.md","Order":2},{"Id":"11f9a682-15d6-4f81-9ab2-adbf24fbd0f0","Path":"same-as-current-glyph-selection.md","Order":5},{"Id":"5cf8f659-333e-4b1a-813d-f9dc686ea4d3","Path":"additional-selection-for-tags.md","Order":1},{"Id":"8473eb39-7e0e-4de7-96cc-a1ddd5aadffa","Path":"saving-selections-and-filters.md","Order":6},{"Id":"df42c164-fd3a-4ab3-98a5-4a39f85cc76d","Path":"general-selection.md","Order":3}],"Id":"6c39e4d9-7cb6-42c8-92ce-597d6658c67b","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"Selecting Glyphs","Languages":[{"Code":"en","Title":"Selecting Glyphs","Slug":"selecting-glyphs","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"43683bba-7e78-4545-ab03-f613285bcaef","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Navigating a Font","Languages":[{"Code":"en","Title":"Navigating a Font","Slug":"navigating-a-font","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"47df54d1-54d5-4d98-86ed-3d0613cf9f7b","Path":"floating-windows-mode.md","Order":1},{"Id":"f2235a55-40cf-420f-9f8c-dad3451b1ce1","Path":"single-window-mode.md","Order":3},{"Id":"1a4ea2a4-8661-4df3-ace3-f6a8890ab1f0","Path":"tabs-mode.md","Order":4},{"Id":"959bca84-8d01-4134-b77a-6f630590d930","Path":"save-and-restore-windows-tabs-panels-and-font-filters.md","Order":2},{"Id":"c1516826-2ce4-4153-852f-b003bb44e049","Path":"windows-and-window-tabs.md","Order":5}],"Id":"971dd77a-da37-4756-abc7-57313ab8f14a","Path":"modes.md","Order":1,"CategoryType":1,"Icon":null,"Title":"Modes","Languages":[{"Code":"en","Title":"Modes","Slug":"modes","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"6c9a5400-136a-488d-84f9-bce8041c0aca","Path":"view-menu-1.md","Order":2},{"Id":"6a419d07-cd8d-4178-8511-7eb0eedbf65b","Path":"view-options1.md","Order":3},{"Id":"8ff49c43-cf7f-41b6-8338-fc5ca754cbc6","Path":"control-bars-view-settings.md","Order":1},{"Id":"246ac03c-0e9c-4f11-9915-84f59d3c1467","Path":"window-menu.md","Order":4}],"Id":"4c9b110b-c97d-46dc-9154-8366fe7c63e0","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"View Options","Languages":[{"Code":"en","Title":"View Options","Slug":"view-options","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"8ae69d93-3cc1-4d43-8396-9b086e3d322b","Path":"windows-with-multiple-monitors.md","Order":1}],"Id":"9890f900-d7c0-4182-93a2-ee71a1f5a871","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Multiple Monitors","Languages":[{"Code":"en","Title":"Multiple Monitors","Slug":"multiple-monitors","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"c0f80cc9-b5e4-4026-b968-8442dceaea52","Path":"managing-workspaces.md","Order":2},{"Id":"a2aa4944-5911-4a25-99e0-5e3556336c9f","Path":"creating-workspaces.md","Order":1},{"Id":"52f7273c-7411-4a3b-9f3f-009edfe78ed1","Path":"shortcuts-for-workspaces.md","Order":3},{"Id":"10e84c3c-6bc0-4274-ab74-effb17f1a712","Path":"switching-workspaces.md","Order":4},{"Id":"56214816-35d2-4d75-bc14-bbef33cde6d8","Path":"workspaces-on-windows.md","Order":5}],"Id":"3a6dce87-9b47-4ead-8821-7d580eb600f3","Path":"workspaces.md","Order":4,"CategoryType":1,"Icon":null,"Title":"Workspaces","Languages":[{"Code":"en","Title":"Workspaces","Slug":"workspaces","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"d982a029-7b74-4882-b930-0ef288001828","Path":null,"Order":6,"CategoryType":0,"Icon":null,"Title":"Managing Windows","Languages":[{"Code":"en","Title":"Managing Windows","Slug":"managing-windows","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"c7d1bde6-ae40-4a5e-8b02-7e5e952d6adc","Path":"applying-and-removing-flags.md","Order":1},{"Id":"f3c43fdb-4d71-49be-a446-5042dbf09447","Path":"color-flags-in-the-sidebar.md","Order":2},{"Id":"5b7b723a-c373-43af-ac4f-7c9dcbf582f3","Path":"using-flags-to-sort-the-font.md","Order":4},{"Id":"4502bb87-3662-4bf4-a6f6-0ecd6a05d59a","Path":"marking-glyphs-with-colors-1.md","Order":3}],"Id":"ef953ef4-22ea-4573-ae35-910b0a1cb84d","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Marking Glyphs with Colors","Languages":[{"Code":"en","Title":"Marking Glyphs with Colors","Slug":"marking-glyphs-with-colors","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"a03d0419-80ba-4813-a247-ef7ab46253ae","Path":"comparing-glyph-sets.md","Order":2},{"Id":"177d4d84-5269-4b52-9b0d-a23d057393b8","Path":"comparing-font-designs.md","Order":1}],"Id":"f1036426-b4fa-4013-92ae-14974fbc6974","Path":"comparing-fonts.md","Order":3,"CategoryType":1,"Icon":null,"Title":"Comparing Fonts","Languages":[{"Code":"en","Title":"Comparing Fonts","Slug":"comparing-fonts","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"fd23ee4e-9807-4278-a264-9468de90da67","Path":"color-cells.md","Order":1},{"Id":"3a280c32-bb5a-40ff-b2b2-40853190ac3c","Path":"color-lines.md","Order":2},{"Id":"543b6e2a-2ec8-4ada-9961-2bb738cfba63","Path":"other-cell-marks.md","Order":3}],"Id":"adf08163-04aa-452c-a8ae-913d25c5cf63","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Glyph Cell Marks","Languages":[{"Code":"en","Title":"Glyph Cell Marks","Slug":"glyph-cell-marks","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"71a7acb6-d792-45fa-85ce-321d9730fcde","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Managing Fonts","Languages":[{"Code":"en","Title":"Managing Fonts","Slug":"managing-fonts","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"fa6f8f0f-175b-4b5b-a9a5-0da292ea2343","Path":"font-units.md","Order":2},{"Id":"73178c81-3935-4bf4-be5b-b4cbb84aff8e","Path":"dimensions-basics.md","Order":1},{"Id":"5f0304b9-6455-4994-a8cb-7102c94d493e","Path":"ppm-size.md","Order":3},{"Id":"33f33366-eb06-4e3a-81ad-80018fba79fd","Path":"the-em-and-the-upm-size.md","Order":4}],"Id":"39e1b141-c206-4764-aee3-372cbd2b75e5","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Sizes and the Coordinate System","Languages":[{"Code":"en","Title":"Sizes and the Coordinate System","Slug":"sizes-and-the-coordinate-system","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"f1200f1b-ec9e-42ab-b214-7acee36a5ae8","Path":"creating-a-new-font-3.md","Order":1},{"Id":"817d6110-22b1-4801-a902-b33fd218542a","Path":"default-glyphset.md","Order":2},{"Id":"1d23eecc-e886-42fb-bd56-047ecdbc5467","Path":"essential-font-info.md","Order":3}],"Id":"afd72f0b-a43c-4ad3-a23c-d7285ae22aa7","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Creating a New Font","Languages":[{"Code":"en","Title":"Creating a New Font","Slug":"creating-a-new-font-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"36cf8fd6-3f28-420a-b8b6-4fca56933122","Path":"language-support-encoding-views.md","Order":1},{"Id":"b16ec9ad-b6e9-43a1-9730-4272083cb7b0","Path":"using-friendly-names.md","Order":2}],"Id":"f696e693-7e84-490e-b824-8ca70f55a8c7","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"Language Support and Glyphs","Languages":[{"Code":"en","Title":"Language Support and Glyphs","Slug":"language-support-and-glyphs","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"c8c11afc-0589-4567-8855-c564d8d7a706","Path":"adding-glyphs1.md","Order":2},{"Id":"4d98fa99-0b42-4bf7-8424-9e0be0d86219","Path":"make-existing-glyphs-blank.md","Order":6},{"Id":"9c12ab54-e58f-4fae-986c-dd0935f0f2b7","Path":"creating-a-new-blank-glyph.md","Order":3},{"Id":"557bf246-46eb-4fab-a5c0-4f9c52143831","Path":"creating-new-glyphs-in-empty-cells.md","Order":4},{"Id":"3c5f2f24-c5e1-4532-828a-938d45851d01","Path":"add-a-new-glyph-to-the-font.md","Order":1},{"Id":"b24d0e16-a7da-48fc-8238-da95f78ce08d","Path":"initial-contents.md","Order":5}],"Id":"21f0bd85-0ebb-4c07-b356-24e2fff24c98","Path":"adding-glyphs.md","Order":1,"CategoryType":1,"Icon":null,"Title":"Adding Glyphs","Languages":[{"Code":"en","Title":"Adding Glyphs","Slug":"adding-glyphs","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"ba7aef85-636f-4abf-a426-c0fe00fb10a1","Path":"selectionbased-generation.md","Order":5},{"Id":"550cc6fa-be87-459a-aae8-05aa7b4b474c","Path":"anchors-in-generated-glyphs.md","Order":4},{"Id":"4ad84dc8-0f7b-47a4-9965-45075543f29d","Path":"controlling-the-results.md","Order":1},{"Id":"040f5ef3-a43b-4e61-b222-bf2ee3dcd452","Path":"when-to-use.md","Order":6},{"Id":"59801edd-8b81-4ea3-be67-222236034292","Path":"generate-glyphs-2.md","Order":3},{"Id":"5a64381d-53ab-4bf6-a7d0-6e1099694f54","Path":"custom-glyph-generation.md","Order":2}],"Id":"cae8d53b-16ca-4db7-9353-24a93fe5707f","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"Generating Glyphs","Languages":[{"Code":"en","Title":"Generating Glyphs","Slug":"generating-glyphs","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"259c5647-ced8-4bb4-9c56-4599b6fe0f45","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"Creating a New Font","Languages":[{"Code":"en","Title":"Creating a New Font","Slug":"creating-a-new-font","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"93be9af2-379a-40af-a698-13a5d93a8e09","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Working with Fonts","Languages":[{"Code":"en","Title":"Working with Fonts","Slug":"working-with-fonts","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"3ec0b34a-9785-44a8-8f03-909299c1b448","Path":"preview-panel1.md","Order":1},{"Id":"9fe24a9f-b74a-44bc-91d4-adf886d2fbbc","Path":"preview-panel2.md","Order":2}],"Id":"f7d86d50-cba3-439d-86d1-478031d76dda","Path":"preview-panel-1.md","Order":3,"CategoryType":1,"Icon":null,"Title":"Preview Panel","Languages":[{"Code":"en","Title":"Preview Panel","Slug":"preview-panel-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"6ed62771-8e7e-4afb-8ac0-2b20250e2930","Path":"text-in-preview-panel.md","Order":1}],"Id":"474f48da-8b3f-4f89-9fc4-e9251d76f23d","Path":"texts-in-preview-panel.md","Order":4,"CategoryType":1,"Icon":null,"Title":"Texts in Preview Panel","Languages":[{"Code":"en","Title":"Texts in Preview Panel","Slug":"texts-in-preview-panel","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"5eac85a5-d840-4841-a114-6eb4049c344b","Path":"quick-preview.md","Order":1},{"Id":"97911c96-02c2-4693-8ee4-c5c0d2bb07eb","Path":"true-fill.md","Order":2}],"Id":"be10e4d4-a90a-4672-978b-ebad055bd277","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Preview in Glyph Window","Languages":[{"Code":"en","Title":"Preview in Glyph Window","Slug":"preview-in-glyph-window","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"b1387701-649c-42a3-a0b0-426ab80243b0","Path":"testing-languagedependent-opentype-features-locl.md","Order":3},{"Id":"1b8b8752-a563-4b29-b8c4-da9013c725f7","Path":"text-features-selector.md","Order":4},{"Id":"95dedb94-a08f-4208-b38c-5e304b9e18dd","Path":"previewing-opentype-features.md","Order":1},{"Id":"353b3a4c-5f19-4361-8e18-4f31a31248ec","Path":"test-script-and-languagespecific-opentype-features.md","Order":2}],"Id":"cbd23c96-5ba0-49ff-830d-0c99d4526230","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Preview Features","Languages":[{"Code":"en","Title":"Preview Features","Slug":"preview-features","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"eb92e7a6-81b4-4380-a797-76c615bef92f","Path":"glyph-window-wrapping.md","Order":2},{"Id":"ccb44698-a9ef-480a-b5cd-e567ddf436e1","Path":"apply-glyph-window-wrapping.md","Order":1},{"Id":"2a02192f-4f99-4cbc-821a-803fee7c3374","Path":"text-in-glyph-window1.md","Order":3}],"Id":"e1124135-0fe5-43f6-b4a0-ce7003c276b1","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Text in Glyph window","Languages":[{"Code":"en","Title":"Text in Glyph window","Slug":"text-in-glyph-window","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"8da6e89e-b4d2-4ec5-af8c-b9b95ebf837b","Path":"wrapping-text.md","Order":6},{"Id":"199bed37-1278-4f53-b8cc-bfd7eb66611c","Path":"cousins-2.md","Order":2},{"Id":"008490a3-1828-424f-8cd1-b833d7c35628","Path":"text-improvements-1.md","Order":4},{"Id":"6c447a2e-2b85-4d23-b892-cc885245b760","Path":"zigzag-glyphs.md","Order":7},{"Id":"f11de472-8c06-4bae-83ee-9ca13dbac4e5","Path":"switching-glyphs-in-the-editing-area.md","Order":3},{"Id":"b779b26b-48e3-4eb3-ab86-518fe6a231f0","Path":"text-wrapping.md","Order":5},{"Id":"84607593-18cd-4a3b-b7f3-618e4c86d5ef","Path":"adding-context-to-text-in-the-glyph-window.md","Order":1}],"Id":"9d434793-642c-48f7-bb12-8fb7b414b6aa","Path":"other.md","Order":4,"CategoryType":1,"Icon":null,"Title":"Other","Languages":[{"Code":"en","Title":"Other","Slug":"other","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"a5f7ff45-6823-40c6-a87b-aee2194f9179","Path":"pairs-phrases-panel.md","Order":3},{"Id":"4231bb6d-fc7b-4a4d-a888-85eb9ed469cf","Path":"unicode-glyph-specifiers.md","Order":6},{"Id":"bb17f9b4-acda-4abd-be15-fccf499088d0","Path":"adding-text-to-the-glyph-window.md","Order":1},{"Id":"d639314f-63c3-4899-8254-28d10df4ba9c","Path":"glyph-window-text.md","Order":2},{"Id":"47c4ac6c-133e-4e6f-8f4a-3bdb7ec0f0b5","Path":"synchronize-text-between-glyph-windows.md","Order":4},{"Id":"bf37afcc-88b0-4c1c-82c8-1e3dbe8003ad","Path":"typing-glyphs-in-glyph-window.md","Order":5}],"Id":"6c060903-252d-4f35-8d49-d1adcd22dc7a","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Adding Text","Languages":[{"Code":"en","Title":"Adding Text","Slug":"adding-text","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"cda7829a-b287-4f72-a1b2-e1fc7ea9930a","Path":"copy-unicode-text-glyph-names-or-auto-layer-recipes.md","Order":1},{"Id":"cddf5217-78de-4efa-8957-85af28f2b5cd","Path":"text-copy-text-as.md","Order":2}],"Id":"09070a91-05fd-4859-82ed-3ae0e0e24b78","Path":"copying-text.md","Order":2,"CategoryType":1,"Icon":null,"Title":"Copying Text","Languages":[{"Code":"en","Title":"Copying Text","Slug":"copying-text","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"b736c9d7-4903-483d-9d9a-840362763d9f","Path":"navigate-through-missing-glyphs.md","Order":3}],"Id":"3ec90045-2f07-4255-a3be-e9ede8cee44e","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Text Mode","Languages":[{"Code":"en","Title":"Text Mode","Slug":"text-mode","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"792aebf6-cb6a-4ef2-8d50-c76a862a4337","Path":"duplicating-a-guide.md","Order":2},{"Id":"f8d25636-2024-4a73-b7b5-f7afea45fc5d","Path":"proportional-guide-markers.md","Order":13},{"Id":"54cee280-3239-4885-9683-e6c5248b9da8","Path":"guide-tags.md","Order":4},{"Id":"e1f11738-4140-4d9c-867b-ff0681c61d27","Path":"guides-anchors-pins-snapping.md","Order":7},{"Id":"9a536d3f-e2a6-40c7-9cf2-8283f75ebe01","Path":"guide-markers.md","Order":3},{"Id":"0d04529a-b5f3-4eba-a771-38ccf448b08a","Path":"guides-context-menu.md","Order":6},{"Id":"617c189d-80d8-4f8a-b3b4-1170f2e44d07","Path":"guides.md","Order":8},{"Id":"aedd2c56-abee-40a1-a47a-be3f69fa7acc","Path":"opacity-of-guides-zones-hints-font-dimensions.md","Order":12},{"Id":"58f9fb71-fa1d-42ab-ac4d-d9569df82a40","Path":"slanting-a-guide.md","Order":16},{"Id":"addbb254-a2ca-46c3-aadc-7eb16b6653d8","Path":"changing-the-guide-type.md","Order":17},{"Id":"19df8333-6add-4bde-9382-ff3e810981e4","Path":"selecting-a-guide.md","Order":15},{"Id":"d12b51d5-3602-4b59-9167-3cf9d9abfdaa","Path":"removing-a-guide.md","Order":14},{"Id":"868a6e46-d9d9-4df9-84ab-24146b30bd6d","Path":"creating-a-guide.md","Order":1},{"Id":"7cd114c8-9bb8-49f3-80af-70bcea40a60d","Path":"guide-width.md","Order":5},{"Id":"3a85fdf9-6491-4c6c-9c98-3c6e942f8ee3","Path":"measurement-markers.md","Order":10},{"Id":"90cc2abd-d28a-4c3a-bcc0-82ef3f73aee2","Path":"moving-a-guide.md","Order":11},{"Id":"5a97fd2d-0dd9-4e4f-8b4a-b1bae679e9da","Path":"locking-a-guide.md","Order":9}],"Id":"c36334f2-f92b-4e30-b6e9-4e06b7875aec","Path":"using-guides.md","Order":6,"CategoryType":1,"Icon":null,"Title":"Using Guides","Languages":[{"Code":"en","Title":"Using Guides","Slug":"using-guides","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"7ba7a28e-d020-40cb-9862-d1353055bb01","Path":"property-bar-5.md","Order":3},{"Id":"567d2c4f-b165-4a58-92b1-00aa104f651c","Path":"editing-area.md","Order":2},{"Id":"2adf715a-e7a9-4e2b-b5ac-62b0b22720a0","Path":"selection-remembered.md","Order":6},{"Id":"9538b8fa-abf2-4949-ab63-254435cc9eb5","Path":"content-sidebar.md","Order":9},{"Id":"0482f003-f566-4f8e-8641-25f09582b77d","Path":"searching-in-the-glyph-window.md","Order":5},{"Id":"c1bd93e0-8d3d-4ea5-9d33-45cf68ce9f53","Path":"using-the-property-bar-1.md","Order":8},{"Id":"db57ace0-ae74-494f-ab7d-3454e2937c2e","Path":"working-in-the-editing-area.md","Order":1},{"Id":"22486e30-74de-46b9-b219-47c0f02a9ff7","Path":"zoom-preferences.md","Order":10},{"Id":"7057886e-ce96-4d30-9d3e-4126d382d65b","Path":"top-and-left-rulers.md","Order":7},{"Id":"1641e11d-1158-46e8-8523-45174c05b631","Path":"metrics-table-1.md","Order":4}],"Id":"65c91c3d-6550-4bb3-a208-ecb9fcd18da8","Path":"glyph-window-contents.md","Order":2,"CategoryType":1,"Icon":null,"Title":"Glyph Window Contents","Languages":[{"Code":"en","Title":"Glyph Window Contents","Slug":"glyph-window-contents","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"2e08dabc-7118-4ec9-9522-28460168d78d","Path":"when-the-ellipse-or-rectangle-tool-is-active.md","Order":6},{"Id":"cde78c25-23d5-4e46-b06e-e8911519f426","Path":"when-one-or-more-points-are-selected.md","Order":4},{"Id":"69fdba1e-7d4d-456c-9b9c-dd5945239531","Path":"when-the-kerning-tool-is-active.md","Order":9},{"Id":"b35a97b1-6eca-4811-8ecb-dd6bf9d17b48","Path":"when-a-guideline-or-hint-is-active.md","Order":2},{"Id":"f0b2aad2-e147-4053-ad34-87c6faf49027","Path":"when-the-metrics-tool-is-active.md","Order":11},{"Id":"324cf935-ae6e-4575-baec-fd63ae6af85c","Path":"when-the-brush-tool-is-active.md","Order":5},{"Id":"5e6c1feb-d282-4a4f-b8c1-28df9c6954b2","Path":"default.md","Order":1},{"Id":"7ada58af-165a-4362-bd8f-768bdd1a78e4","Path":"when-the-free-transform-tool-is-active.md","Order":8},{"Id":"0f5ea4ae-d3f4-4ed2-a6f2-202dda7b120a","Path":"when-an-anchor-or-pin-is-active.md","Order":3},{"Id":"724d5933-fe64-4f5c-ba1c-19eb7cb53bb8","Path":"when-the-matchmaker-tool-is-active.md","Order":10},{"Id":"ca4a4e29-efe7-483a-ad20-221595ef4972","Path":"when-the-guides-tool-is-active.md","Order":7},{"Id":"e41a3874-ce7b-4115-aac8-b6524b72e252","Path":"when-the-text-tool-is-active.md","Order":12}],"Id":"6e501951-f53f-4e41-9cb2-47cc40b4888b","Path":"glyph-window-property-bar.md","Order":3,"CategoryType":1,"Icon":null,"Title":"Glyph Window Property bar","Languages":[{"Code":"en","Title":"Glyph Window Property bar","Slug":"glyph-window-property-bar","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"b901bd2a-5885-4ba7-9459-b5ff48054215","Path":"edit-across-commands.md","Order":2},{"Id":"0d4b2ff7-d1a0-4d27-b398-9b3d3761ec95","Path":"editing-several-glyphs-together.md","Order":6},{"Id":"41f14310-48cf-41db-b390-fa65b1e4d298","Path":"editing-several-elements-together.md","Order":5},{"Id":"2b3b7eea-bfb6-44d6-b1b4-09eb59658bca","Path":"edit-across-glyphs.md","Order":3},{"Id":"c8ac76b6-f397-4a68-8a66-d9362be13ad4","Path":"editing-across-elements.md","Order":4},{"Id":"db89dfd8-1714-4934-92ef-3aaa25eaf411","Path":"editing-several-layers-together.md","Order":7},{"Id":"dcbc4b4b-e821-44f4-a3e5-8b264ffbeec6","Path":"details-across-glyphs.md","Order":1},{"Id":"ea122549-9276-47ca-a8f3-65842c9fe8c5","Path":"free-transform-across-elements-and-layers.md","Order":8},{"Id":"de232629-6650-470f-b0e1-caa8480fd0e1","Path":"editing-across-layers.md","Order":9}],"Id":"21a32356-293c-4dd3-87aa-9a715fc0770f","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"Scope of Editing","Languages":[{"Code":"en","Title":"Scope of Editing","Slug":"scope-of-editing","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"ee985ccd-2d24-4b22-b1cb-f7db71c90305","Path":"flagging-glyphs.md","Order":2},{"Id":"912ca73c-da19-47fd-97b6-ebb0c4b4602f","Path":"using-the-property-bar-2.md","Order":6},{"Id":"e58705e5-8886-42de-8e2f-42703d2a1986","Path":"using-the-text-bar.md","Order":7},{"Id":"16560849-818d-443d-975f-e134b64d17cb","Path":"from-glyph-window-to-font-window.md","Order":3},{"Id":"2fa56407-a1ff-4f84-b71c-370d4580024e","Path":"using-the-content-sidebar.md","Order":5},{"Id":"47cd2fb0-7e7f-4f82-9762-3928b3f07330","Path":"modifying-formatting-in-the-glyph-window.md","Order":4},{"Id":"9abea1c5-2731-477d-95a9-1c1fdc1b85ec","Path":"adding-and-editing-glyph-tags.md","Order":1}],"Id":"8f4f520c-9f8d-4405-b034-7f6e2db3dcf4","Path":null,"Order":6,"CategoryType":0,"Icon":null,"Title":"Using the Property Bar","Languages":[{"Code":"en","Title":"Using the Property Bar","Slug":"using-the-property-bar","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"2249932a-114f-478f-bb2a-db585144f2e0","Path":"glyph-window-modes1.md","Order":4},{"Id":"07ca0e0f-4ee7-4e26-bd0b-e5d60aa675bf","Path":"production-modes.md","Order":5},{"Id":"7a17948f-ce72-4238-a273-092d6c7201a1","Path":"editing-mode.md","Order":2},{"Id":"92b9eae1-49b8-49c0-aa78-3cb36b3b6172","Path":"spacing-modes-metrics-kerning.md","Order":6},{"Id":"fb751bbc-58ce-4736-bef0-eebb00ad2adb","Path":"drawing-mode.md","Order":1},{"Id":"e2152cdc-fcdc-4eb4-882f-4539c63762f9","Path":"text-mode-1.md","Order":7},{"Id":"ffc2be2f-8620-4fd8-905b-5578c5a1dfb3","Path":"element-mode.md","Order":3}],"Id":"80444ddc-843c-4420-a233-35c3f3133612","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Glyph Window Modes","Languages":[{"Code":"en","Title":"Glyph Window Modes","Slug":"glyph-window-modes","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"0a60b2fc-939a-4fb7-a8ad-f07298ba3aee","Path":"noncurrent-glyph-details.md","Order":5},{"Id":"3d19b0d2-6978-4d17-91d8-f84a42fbe33f","Path":"current-glyph-details.md","Order":1},{"Id":"9293e033-1f94-4375-805d-9178c7e26a77","Path":"opening-a-glyph-window.md","Order":7},{"Id":"5d4c0bcf-e80d-463b-982e-1b69be27df3c","Path":"glyph-window-view-sets.md","Order":4},{"Id":"429d8647-1e90-47c3-a8f7-997ee5e51c45","Path":"esc-key-in-the-glyph-window.md","Order":2},{"Id":"4f0c1df7-2090-4ce9-a49e-72b1050656aa","Path":"glyph-size-in-glyph-window.md","Order":3},{"Id":"b4847ead-ef3d-4184-aff0-2c44484c2ab5","Path":"outline-color-in-glyph-window.md","Order":8},{"Id":"baeab1f1-fd60-434e-995e-156537e697cc","Path":"using-several-glyphs.md","Order":9},{"Id":"55e116bd-20a7-4c99-8427-5f3e0740dac4","Path":"open-glyphs-for-editing-more-easily.md","Order":6}],"Id":"f3c794bf-4ffe-4bc8-8bd9-78e50cf8621a","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Editing an Existing Glyph","Languages":[{"Code":"en","Title":"Editing an Existing Glyph","Slug":"editing-an-existing-glyph","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"43f4d589-8781-4591-864a-9da7cae5f98b","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Using the Glyph Window","Languages":[{"Code":"en","Title":"Using the Glyph Window","Slug":"using-the-glyph-window","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"509ff0f6-14c9-435e-8abf-3b0e69d3f8f1","Path":"font-names.md","Order":1},{"Id":"69720d29-e72d-434d-b89e-1c4219a4cf9c","Path":"righttoleft-mark-attachment.md","Order":3},{"Id":"d3512233-a323-40ce-85ef-092a2e9eb58a","Path":"bidirectional-support-in-glyph-window-and-preview-panel.md","Order":4},{"Id":"bd32ba53-9926-42c6-ae2d-67d8cf67a651","Path":"virtual-tags-1.md","Order":5},{"Id":"6e9b00f2-388f-4edd-ba45-5652d3e18b4b","Path":"positional-features.md","Order":2}],"Id":"a8ca7b44-c532-432e-9b09-06628e36bd5d","Path":"script-support.md","Order":8,"CategoryType":1,"Icon":null,"Title":"Script support","Languages":[{"Code":"en","Title":"Script support","Slug":"script-support","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"96ca6be3-44c3-47ac-b445-86a80edd7623","Path":"show-missing-glyph-placeholders.md","Order":9},{"Id":"5a85517c-2c25-4dfb-a920-2bdef3e60fa7","Path":"show-cross.md","Order":14},{"Id":"149807ee-4148-41cf-a595-5c38b53ec033","Path":"always-show-anchor-names.md","Order":16},{"Id":"61eac6ae-5fc6-4d7c-aee4-2205d289e6f4","Path":"live-preview-may-be-slow.md","Order":17},{"Id":"82ed7b18-12ff-4dec-b791-bc7e8d82b87f","Path":"clicking-outline-selects-segment.md","Order":2},{"Id":"383f4fa5-1e80-497b-8eb5-6b10287ced6b","Path":"holding-cmd-activates-contour-tool.md","Order":8},{"Id":"496a0d23-c4e0-4f7d-bb1d-035aae4c2b8e","Path":"highlight-nodes-on-alignment-zones.md","Order":7},{"Id":"35595da6-bd8a-43d0-88f5-f920dc463bce","Path":"marquee-selection-selects-nodes-but-not-handles.md","Order":10},{"Id":"a9bbc0f9-ddb7-4b88-a312-234be1283860","Path":"rapid-tool-remembers-last-state.md","Order":15},{"Id":"fd4cd901-2122-4e09-bee0-05580950b22c","Path":"curve-handles-have-fixed-direction-when-curve-point-is-dragged.md","Order":3},{"Id":"10096c33-543e-4904-b0ad-29f84ec38d7a","Path":"pen-and-pencil-tools-can-change-contour.md","Order":12},{"Id":"247b4106-1530-4a8d-81f3-5b2690c70382","Path":"preferences-for-editing-1.md","Order":13},{"Id":"a9a7cb5f-0887-48d6-a96c-d03f8199ea38","Path":"pasting-contour-to-another-element-preserves-appearance.md","Order":11},{"Id":"ff2fc23f-8e20-4e0d-ae2c-3348292161ce","Path":"force-snap-to-guides.md","Order":4},{"Id":"1e1071aa-69c5-4a4e-9436-eb69af2e79e7","Path":"free-transform-scaling-nonproportional-with-shift-otherwise-proportional.md","Order":5},{"Id":"9b126c51-4ccf-4d0f-a6a8-0d5a9ac923dd","Path":"hide-character-placeholders-if-layer-is-not-empty.md","Order":6},{"Id":"3791980b-8cd2-4236-8bf5-5759561f2c27","Path":"show-scroll-bars-in-the-glyph-window.md","Order":1}],"Id":"c14b1506-2081-4a51-9c71-f5bf88baa06b","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Preferences for Editing","Languages":[{"Code":"en","Title":"Preferences for Editing","Slug":"preferences-for-editing","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"fea80f01-e0a2-4e9a-9eab-f4e6d669ab56","Path":"font-data.md","Order":2},{"Id":"f7702cbe-da50-4d5c-a666-288638004988","Path":"font-data-from-open-fonts.md","Order":1}],"Id":"bd278ed3-8488-4b8b-b707-dca76daddc64","Path":null,"Order":7,"CategoryType":0,"Icon":null,"Title":"Importing Font Data","Languages":[{"Code":"en","Title":"Importing Font Data","Slug":"importing-font-data","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"26fb68dc-15c1-4f34-b9ce-de6463823a6e","Path":"fractional-vs.md","Order":2},{"Id":"415d35b8-45e3-430c-9267-4e39e3fc398d","Path":"fractional-coordinates-1.md","Order":1},{"Id":"657fd6ff-5934-4876-929e-c9b2906829f9","Path":"sketchboard-coordinates.md","Order":5},{"Id":"e26d7303-6f73-4223-81a4-c7d264df7791","Path":"working-in-rounded-coordinates.md","Order":8},{"Id":"339bdba4-8422-4ae2-89aa-ed76e2b50a92","Path":"preview-rounding.md","Order":4},{"Id":"dc89ee4c-b8c8-4f47-90d0-82ae89ba79b0","Path":"using-integers.md","Order":6},{"Id":"8b4e4f26-4fc9-486e-bb94-a25d134e4a1f","Path":"working-in-fractional-coordinates.md","Order":7},{"Id":"c9c851c4-4063-4500-9b43-0c3f956e81ee","Path":"working-with-fractional-coordinates.md","Order":9},{"Id":"fabd15bd-f438-43f5-af51-25bd874a922c","Path":"increasing-the-precision-of-coordinates.md","Order":3}],"Id":"f3cc21a6-43cd-4abb-8b18-ce9e9ce81b6d","Path":"coordinates-1.md","Order":1,"CategoryType":1,"Icon":null,"Title":"Coordinates","Languages":[{"Code":"en","Title":"Coordinates","Slug":"coordinates-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"1821b38b-b19a-40f4-8223-496cfb1ce539","Path":"grid-preferences.md","Order":2},{"Id":"9e82baee-2ed8-4393-a1a6-b7c49fa0adf4","Path":"quick-measurement-1.md","Order":4},{"Id":"d35aae9d-b4cd-4aca-b666-a80cd59032b1","Path":"snapping-glyph-parts-and-interface-features.md","Order":6},{"Id":"83bf4e31-ac12-4f35-9052-a98be9d9490d","Path":"coordinates-and-measurements.md","Order":7},{"Id":"84cbbf3c-bf7d-4504-b144-415fb4fa6701","Path":"viewing-glyph-parts-and-interface-features.md","Order":8},{"Id":"2280acfd-39dc-4f04-b8af-68a4963d0d24","Path":"locking-glyph-parts-and-interface-features.md","Order":3},{"Id":"6bb30675-ec5d-4be5-8417-6335f50eb8df","Path":"scrolling-in-the-editing-area.md","Order":5},{"Id":"651002d7-3a5a-4797-9c92-217b3446b79b","Path":"zooming-in-the-editing-area.md","Order":9},{"Id":"c48c835c-81d0-4355-9688-cb65bcf640d3","Path":"end-lines-center-line-rainbow.md","Order":1}],"Id":"f31f8053-8df3-4c53-b5cd-b6c898e31acc","Path":"to-be-defined.md","Order":2,"CategoryType":1,"Icon":null,"Title":"To be defined","Languages":[{"Code":"en","Title":"To be defined","Slug":"to-be-defined","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"74aad822-5570-4665-85f5-00ab36ecd383","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"Editing Glyphs","Languages":[{"Code":"en","Title":"Editing Glyphs","Slug":"editing-glyphs","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"6b338636-1014-46d5-978a-f3661a52096e","Path":"using-the-ellipse-tool.md","Order":3},{"Id":"ea50bdbf-dc12-45b3-80ba-0d092456395f","Path":"drawing-ellipses-and-rectangles.md","Order":1},{"Id":"2cd3dd44-b3c6-40e8-a25d-44c9ff9914de","Path":"rectangle-and-ellipse-tools.md","Order":2},{"Id":"11843fdc-3c9c-4758-8fe0-c0388f812235","Path":"using-the-rectangle-tool.md","Order":4}],"Id":"3fc7cd0a-4ad5-41da-8ede-9e0773fcc668","Path":"drawing-with-geometric-shapes.md","Order":3,"CategoryType":1,"Icon":null,"Title":"Drawing with Geometric Shapes","Languages":[{"Code":"en","Title":"Drawing with Geometric Shapes","Slug":"drawing-with-geometric-shapes","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"b0230695-be36-42a5-b31e-bfd671bab982","Path":"appearance-of-contours.md","Order":1},{"Id":"a84d792e-11b2-4fad-ae52-9a3ffb724518","Path":"appearance-of-nodes.md","Order":2},{"Id":"2c6982c0-0bc9-48f0-98fe-c3268813a50e","Path":"fill-and-preview.md","Order":3},{"Id":"888bc477-e5fc-4b53-ad8b-43b414543fab","Path":"selections.md","Order":4}],"Id":"b5be7de8-15b0-4d06-877d-c392a5af043f","Path":"outline-appearance.md","Order":4,"CategoryType":1,"Icon":null,"Title":"Outline Appearance","Languages":[{"Code":"en","Title":"Outline Appearance","Slug":"outline-appearance","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"aed3f129-e79e-495f-ae7d-ac9310229123","Path":"using-the-rapid-tool.md","Order":3},{"Id":"6d2d8e1f-d502-467e-9c79-8aaa26dece51","Path":"drawing-freehand-1.md","Order":1},{"Id":"825f0097-bc10-4d60-9050-5accf44b5a76","Path":"using-the-pen-tool.md","Order":2}],"Id":"e83c5d2b-942f-4ccb-92fa-dd07952c7cdf","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Drawing vector curves","Languages":[{"Code":"en","Title":"Drawing vector curves","Slug":"drawing-vector-curves","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"8bb1fe0b-05e6-49ba-b1e0-5e1362a3e574","Path":"creating-a-new-blank-glyph-1.md","Order":3},{"Id":"d6377c8d-dfc6-4588-9ec6-a923b7560545","Path":"creating-a-new-glyph-2.md","Order":4},{"Id":"f0d5d23c-9550-4e49-88a0-9cb0e7927828","Path":"add-a-new-glyph-to-the-font-1.md","Order":1},{"Id":"212a8d7c-ce11-4a5d-9753-6b6b4e5f31e0","Path":"creating-a-glyph-in-an-empty-glyph-cell.md","Order":2},{"Id":"4a281940-1e62-4513-a6cf-134f32cd15cc","Path":"creating-several-glyphs-from-empty-glyph-cells.md","Order":6},{"Id":"9fc37062-3b5b-41a1-9b31-f6b53297e3ac","Path":"creating-glyphs-even-when-placeholder-is-not-visible.md","Order":5}],"Id":"dc6fb372-5b38-4c2d-9ab1-21286410cda7","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Creating a new glyph","Languages":[{"Code":"en","Title":"Creating a new glyph","Slug":"creating-a-new-glyph","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"a20bd9b2-57eb-4bc2-98f2-a0cb748eab6a","Path":"snap-to-baseline.md","Order":3},{"Id":"db94cc41-bf08-459e-8563-5d44c307e788","Path":"power-guides-3.md","Order":1},{"Id":"13c2a88f-2532-4b19-aee5-37e6f2b4668a","Path":"suggest-distance.md","Order":4},{"Id":"9541df1b-c1f3-4845-b76b-35a2d4d57555","Path":"slanted-guides.md","Order":2}],"Id":"a951f05e-4a30-43aa-8e62-05c94c2001d6","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Guides and snapping","Languages":[{"Code":"en","Title":"Guides and snapping","Slug":"guides-and-snapping","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"4b284a84-5ddd-4117-9f8c-1bf69b3d9664","Path":"remove-overlap1.md","Order":1},{"Id":"9e26235d-2e0a-4d26-a1cc-d623773fbb39","Path":"removing-overlaps.md","Order":2}],"Id":"c4928ce3-8733-426b-b901-54d7b53c8e35","Path":"remove-overlap.md","Order":7,"CategoryType":1,"Icon":null,"Title":"Remove Overlap","Languages":[{"Code":"en","Title":"Remove Overlap","Slug":"remove-overlap","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"3d637c65-cc10-4491-8b1b-6c0cdf7973e0","Path":"asymmetrically-changing-curves.md","Order":1},{"Id":"3cd02435-161e-4cf4-8efb-0d9ce2fd6f37","Path":"tunni-lines1.md","Order":3},{"Id":"6d7d5a4c-78e6-4610-b585-5ae2c35ab5a8","Path":"symmetrically-changing-curves.md","Order":2},{"Id":"e337ab97-9749-4932-a144-41c0f7ab36d9","Path":"tunni-lines2.md","Order":4}],"Id":"88c2f631-442a-4111-8187-b3a48d32daf4","Path":"tunni-lines-1.md","Order":4,"CategoryType":1,"Icon":null,"Title":"Tunni Lines","Languages":[{"Code":"en","Title":"Tunni Lines","Slug":"tunni-lines-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"3f9d074f-6f29-4f47-a8ac-0ed33d258004","Path":"balance-1.md","Order":1},{"Id":"3f93c8d1-cf39-49ff-a6df-291175842dbb","Path":"harmonize-1.md","Order":2}],"Id":"1f970ee5-159b-4d31-b15f-e4c82b9953c8","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"Harmonize and Balance","Languages":[{"Code":"en","Title":"Harmonize and Balance","Slug":"harmonize-and-balance","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"c6c5cb3b-ed63-4b95-924c-b8648c3fe59e","Path":"extremes.md","Order":1},{"Id":"b8d3f006-4d00-4e08-b5b2-90d9a4ed5b18","Path":"nodes-at-extremes-1.md","Order":2}],"Id":"eaad1d84-2ac1-47e7-9fe1-f600e462b4f6","Path":"adding-nodes-to-extremes.md","Order":9,"CategoryType":1,"Icon":null,"Title":"Adding Nodes to Extremes","Languages":[{"Code":"en","Title":"Adding Nodes to Extremes","Slug":"adding-nodes-to-extremes","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"f0404083-9485-4942-a70f-364c9c3334d6","Path":"loop-corners-with-scissors-tool.md","Order":1},{"Id":"a3e03f7c-8fb5-4ad6-b5f6-b0ac46b3992f","Path":"unfill-looped-corners.md","Order":2}],"Id":"107be0b7-aca8-4981-80a3-e14cfdd8d4ff","Path":null,"Order":6,"CategoryType":0,"Icon":null,"Title":"Looped Corners","Languages":[{"Code":"en","Title":"Looped Corners","Slug":"looped-corners","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"fc7a65cc-6bd3-42ab-a72b-2f3a15e58329","Path":"make-overlap-1.md","Order":2},{"Id":"d2abc1bb-868c-4878-a289-4d0a9f6f979d","Path":"creating-overlaps.md","Order":1}],"Id":"f421da20-a7b5-4980-895f-3ddfd613e186","Path":"create-overlaps.md","Order":8,"CategoryType":1,"Icon":null,"Title":"Create Overlaps","Languages":[{"Code":"en","Title":"Create Overlaps","Slug":"create-overlaps","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"ba4176af-5bd7-4ce8-950c-5bc28d7d6fba","Path":"g1-continuity.md","Order":2},{"Id":"9998789c-7632-4f2d-a50e-dbbf550f98eb","Path":"g0-g1-g2-g3-curve-continuity.md","Order":3},{"Id":"50f615de-3752-4955-ba7d-b988abd4807e","Path":"g3-curve-continuity-smooth-nodes-with-harmonized-handles.md","Order":7},{"Id":"b0e31b2d-c9ec-4da3-a02b-d1e1d962c648","Path":"harmonizing-nodes-g2-and-handles-g3.md","Order":8},{"Id":"607870b4-1571-48c0-b804-6c289a7b4296","Path":"curvature-and-smoothness.md","Order":1},{"Id":"a3741f63-ef44-4988-8d05-0c7a8a276ac1","Path":"autodetection-of-smooth-nodes-g1.md","Order":6},{"Id":"719402ae-2616-4ac6-ac32-5f6004aaafa8","Path":"g3-curve-continuity-harmonized-smooth-nodes.md","Order":4},{"Id":"fa3c9387-b9e4-4d32-8877-1a575ef585c6","Path":"g2-curve-continuity-smooth-nodes.md","Order":5}],"Id":"131688be-d880-45bf-974c-4824ae85863a","Path":"curve-continuity.md","Order":2,"CategoryType":1,"Icon":null,"Title":"Curve continuity","Languages":[{"Code":"en","Title":"Curve continuity","Slug":"curve-continuity","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"828e0cfd-d4d3-40a6-ab9f-13251c8219bc","Path":"find-and-replace.md","Order":1},{"Id":"3b000ace-076d-4ea7-84c7-7eb5675f5cc9","Path":"procedure-1.md","Order":3},{"Id":"643891e4-5145-4a7e-bb22-4900220b2322","Path":"finding-differences.md","Order":2}],"Id":"764bbade-dfad-41f7-8f17-6cb6e9298d42","Path":"find-and-replace-outline.md","Order":5,"CategoryType":1,"Icon":null,"Title":"Find and Replace Outline","Languages":[{"Code":"en","Title":"Find and Replace Outline","Slug":"find-and-replace-outline","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"7e1f4704-2809-451f-8a86-e17de3ab6768","Path":"clean-up-1.md","Order":1},{"Id":"4f0962de-b439-4b9f-9d6b-ace24140ac4d","Path":"simplify-1.md","Order":2}],"Id":"ca5eb913-789a-4c15-a56e-0ca0499322c0","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Simplify and Clean Up","Languages":[{"Code":"en","Title":"Simplify and Clean Up","Slug":"simplify-and-clean-up","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"5c645f16-2f2a-4852-84ce-01cd09909c35","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Improving contours","Languages":[{"Code":"en","Title":"Improving contours","Slug":"improving-contours","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"46c69ca5-e486-4083-a93c-fa5298dd3ed2","Path":"quick-measurement-2.md","Order":2},{"Id":"2680de28-fd6c-4fc8-b981-b854a36d32f8","Path":"scoreboard-2.md","Order":3},{"Id":"5c0d4184-accf-403d-a526-8afc86b4f0f6","Path":"measurement-line-2.md","Order":1}],"Id":"4b2526c1-bb82-491f-a85a-3700839f2647","Path":null,"Order":8,"CategoryType":0,"Icon":null,"Title":"Measurement Line","Languages":[{"Code":"en","Title":"Measurement Line","Slug":"measurement-line","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"965f877f-6b70-4332-b42f-ee8c7337ac6e","Path":"drawing-and-glyph-editing-1.md","Order":3},{"Id":"ad56e0f5-a8f8-4d50-a1a7-a8094d85b2c7","Path":"jsonbased-copypaste-system.md","Order":8},{"Id":"dee013d4-8f0b-4237-af1b-00246e6261a4","Path":"tangent-start-points.md","Order":10},{"Id":"551a59f3-256f-4498-9cb1-22050a8d1b8b","Path":"anchor-cloud-only-for-selected.md","Order":9},{"Id":"10239cc3-f218-468f-8e79-73569fa35295","Path":"glyph-window-oncanvas-text-fields.md","Order":4},{"Id":"fab97305-5d92-4d57-820d-ce889f435e7e","Path":"unlink-node.md","Order":11},{"Id":"8654490a-2fa9-4baa-a830-2c2e132de1af","Path":"contour-operations-in-the-node-panel.md","Order":2},{"Id":"79e7df70-3302-41e4-927c-cc5fce634919","Path":"selection-frame.md","Order":5},{"Id":"6d38ad91-b552-435b-aa55-7e5534747a5e","Path":"set-start-point.md","Order":1},{"Id":"ebf9c2a1-38a9-47bd-a650-bbae32e7e7e4","Path":"outline-conversion-1.md","Order":6},{"Id":"138ca837-83ef-42eb-bbc6-34a0166287b7","Path":"relative-handle-positions.md","Order":7}],"Id":"af6fdf64-723d-4a80-b61d-7c3cfe0eb37b","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Glyph Design","Languages":[{"Code":"en","Title":"Glyph Design","Slug":"glyph-design","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"8a940b23-fc9c-44c7-b8a6-b0b8445d6917","Path":"other-options.md","Order":1},{"Id":"5f4622ac-02f9-4bb6-99c0-2d9c606bb2ee","Path":"using-the-eraser-tool-1.md","Order":2}],"Id":"a0376cfe-d5dd-4958-8530-2bef9b312bea","Path":"deleting-points.md","Order":7,"CategoryType":1,"Icon":null,"Title":"Deleting Points","Languages":[{"Code":"en","Title":"Deleting Points","Slug":"deleting-points","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"35425821-b1a4-4c52-a587-593d46c193a0","Path":"action-add-nodes.md","Order":1},{"Id":"3a1b605c-7004-4221-827d-1728b8a12986","Path":"basic-operations.md","Order":2}],"Id":"444873c2-7182-4e9d-be61-73ce55c0420f","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"Adding Points","Languages":[{"Code":"en","Title":"Adding Points","Slug":"adding-points","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"e477e0bb-8839-4c8a-bf35-61f94b393aa3","Path":"move-nodes-or-handles-with-cursor-keys-after-dragging.md","Order":5},{"Id":"14900388-c5d4-40cc-a004-b58fe76a115c","Path":"aligning-of-nodes-handles-and-contours.md","Order":1},{"Id":"82b2fe08-553b-4ddb-bc6b-b33133be86f4","Path":"refined-arrow-key-shortcuts-for-moving-nodes-and-selections.md","Order":8},{"Id":"3bf9847a-b256-41ee-91c8-4c6cef5fb6a9","Path":"highprecision-nonnode-editing.md","Order":3},{"Id":"8367db67-bd85-4fef-8455-69cd89177820","Path":"altdragging-a-node.md","Order":2},{"Id":"c7b0e0f9-89aa-4eb0-9b47-820e806e43f6","Path":"more-flexible-shiftdragging-of-points.md","Order":4},{"Id":"06c38c08-b8bf-4168-a9d7-4e2cf687cbe4","Path":"power-nudge.md","Order":6},{"Id":"d353dbda-b987-4a9a-a1c1-a4f7d1bff1d0","Path":"precision-cmdctrldragging-of-nodes-and-handles.md","Order":7},{"Id":"5c580e23-8975-4202-be49-5d4172550474","Path":"some.md","Order":9}],"Id":"4cc30123-abda-4f95-a751-bd42ab516054","Path":"moving-points.md","Order":6,"CategoryType":1,"Icon":null,"Title":"Moving Points","Languages":[{"Code":"en","Title":"Moving Points","Slug":"moving-points","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"952f7fdd-6db0-49f7-a64b-8ed47974e0f6","Path":"clicking-near-a-node-handle-or-segment.md","Order":3},{"Id":"b864f21e-4996-441e-a945-fe210019cf5b","Path":"additional-options-for-nodes-connecting-postscript-curves.md","Order":2},{"Id":"0a6e51fe-9e93-4a6a-ab1d-58c196fef105","Path":"moving-control-points.md","Order":6},{"Id":"f0f43eb9-cb46-46c5-bccc-db30b068a138","Path":"using-the-arrow-keys.md","Order":9},{"Id":"5ee9510f-633f-4d9a-a52e-25b2ea7ad59b","Path":"showing-handles-in-mask-and-inactive-layers.md","Order":8},{"Id":"f555a453-2b34-4269-bb47-a1af36e6c47c","Path":"deselecting-nodes-and-handles.md","Order":4},{"Id":"a18b8855-0677-4e95-8dbf-b69c8e54cae0","Path":"active-and-selected-points-1.md","Order":1},{"Id":"62441e61-c912-4f4c-bf0c-336f09ab3482","Path":"selecting-points-1.md","Order":7},{"Id":"ce358edc-8a84-4a4e-a1fd-98bb088e1d22","Path":"marquee-selection-of-nodes-and-handles.md","Order":5},{"Id":"5c5b2152-fbf0-4d5b-b685-9011c9232f16","Path":"using-the-contour-tool.md","Order":10}],"Id":"30d56f4f-7466-4791-99d8-905d311dd675","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Active and Selected Points","Languages":[{"Code":"en","Title":"Active and Selected Points","Slug":"active-and-selected-points","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"29f5c312-8ae7-4e36-8ce2-be873e531dec","Path":"from-line-segment-to-curve-segment.md","Order":2},{"Id":"013531fd-6e5c-4d04-9dd7-088fdb03f795","Path":"ps-curve-into-tt-curve.md","Order":4},{"Id":"0dd89ec9-927b-478c-8a6a-15652a30760b","Path":"from-curve-segment-to-line-segment.md","Order":1},{"Id":"b3fe1d0f-4211-41fb-a5c1-8e46cd8f810c","Path":"from-segment-to-tt-and-back-to-ps.md","Order":3},{"Id":"28663539-faf5-4d92-9c38-c1b1c084aeb4","Path":"relative-handle-positions-1.md","Order":5}],"Id":"45876ea1-4c74-46c2-b3b6-0b92c66dc3f6","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Changing Segment Types","Languages":[{"Code":"en","Title":"Changing Segment Types","Slug":"changing-segment-types","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"969755bf-8f4c-457f-beb5-fe9ef049909a","Path":"using-the-slanted-grid.md","Order":3},{"Id":"4f46dcff-4445-4e4b-a1c2-716809c058db","Path":"italic-contours-follow-italic-angle.md","Order":1},{"Id":"63020136-e5a4-4b89-b539-3294bc2c8b52","Path":"make-slanted-glyph-guides.md","Order":2}],"Id":"441cfc0a-debe-45c4-a43a-ba403e316942","Path":"italic-things.md","Order":9,"CategoryType":1,"Icon":null,"Title":"Italic Things","Languages":[{"Code":"en","Title":"Italic Things","Slug":"italic-things","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"d057b67e-fd8c-45b1-af79-ae92f34f39ca","Path":"using-menu-commands-1.md","Order":2},{"Id":"94e10a6f-09f3-4e5d-a0ca-b61419635a63","Path":"autodetection-of-smooth-nodes.md","Order":6},{"Id":"eb9c0876-5bfb-40e8-afe8-867d3f35751d","Path":"smooth-and-sharp-nodes.md","Order":1},{"Id":"a53f2915-7c29-4b1a-a590-5ae25600ee8e","Path":"smart-nodes-1.md","Order":4},{"Id":"ad126b6d-6e62-454f-a167-e27394d2d998","Path":"using-rapid-tool.md","Order":5},{"Id":"32e57832-7485-4f0f-ba29-602b711a1926","Path":"using-the-contour-tool-1.md","Order":3}],"Id":"df7a8b75-1360-4bc5-b516-01e744456d5c","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"Changing Node Types","Languages":[{"Code":"en","Title":"Changing Node Types","Slug":"changing-node-types","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"d08646d4-1e67-4fa2-8320-a23a006d2ca2","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"Working with Points","Languages":[{"Code":"en","Title":"Working with Points","Slug":"working-with-points","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"d5eeb5e2-af41-48a5-83e1-42c6f83dc56c","Path":"doubleclick-a-node-has-precedence-over-activating-another-glyph.md","Order":3},{"Id":"a948ad62-b6cb-4aa9-bfe0-8dc2b130d8f4","Path":"adding-a-node-selects-it.md","Order":2},{"Id":"be2b9053-0ec8-4ba4-941f-076f3fd09ac4","Path":"pen-tool-3.md","Order":5},{"Id":"0c5290fe-f100-428f-8fc7-f5fb453bc95f","Path":"simple-calculations.md","Order":6},{"Id":"754910a3-581d-49f1-878a-d239ec5a9433","Path":"add-nodes-at-inflections-with-knife.md","Order":1},{"Id":"737fd52a-d137-4e84-bc90-d94667d2fb1c","Path":"duplicate-nodes.md","Order":4}],"Id":"7cf027fb-020e-4678-abaf-7d0c4e2afeb5","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Contour editing","Languages":[{"Code":"en","Title":"Contour editing","Slug":"contour-editing","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"9a8efe78-5dde-4bd4-a28d-6d5e18b5802a","Path":"duplicate-nodes-1.md","Order":2},{"Id":"675fafd1-3c4c-42b1-a953-a4e97926079a","Path":"break-and-slice.md","Order":1},{"Id":"753584b8-868c-470f-9b9c-13fab41070dd","Path":"snapping-knife.md","Order":3}],"Id":"7be4a24f-19ea-4793-a9f0-f8a036747042","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"Knife usage","Languages":[{"Code":"en","Title":"Knife usage","Slug":"knife-usage","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"d0abcf4d-226c-4b83-83d5-9bd07b3860f8","Path":"move-nodes-and-handles-along-the-vertical-italic-axis.md","Order":1},{"Id":"2096a258-c1d7-4573-801e-48b9dd346397","Path":"slide-node.md","Order":2}],"Id":"439b5f7b-be0c-4c02-a9d4-46e1a17dc57d","Path":"moving-contour-selections.md","Order":9,"CategoryType":1,"Icon":null,"Title":"Moving Contour Selections","Languages":[{"Code":"en","Title":"Moving Contour Selections","Slug":"moving-contour-selections","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"34639ea5-fe1b-4a4e-8ada-4669bdbf62ce","Path":"create-parallel-contour2.md","Order":2},{"Id":"66cbcd8d-c637-4334-8590-1c7a5babc999","Path":"create-parallel-contour1.md","Order":1}],"Id":"2dc26f34-c6f4-4590-ab86-190e2dda1b5b","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Create Parallel Contour","Languages":[{"Code":"en","Title":"Create Parallel Contour","Slug":"create-parallel-contour","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"705c4c6e-437d-4320-b107-a267ec2b10d8","Path":"scale-tool-1.md","Order":2},{"Id":"7867ee88-2862-48ca-a9d4-68bd2a409cb2","Path":"slant-tool-1.md","Order":3},{"Id":"7410edfc-a071-47c3-8543-01cfae793fce","Path":"rotate-tool-1.md","Order":1},{"Id":"b831f955-704c-4af4-b4f0-1d2b6e83f60e","Path":"the-quick-transform-tools-are-rotate-scale-and-slant.md","Order":4}],"Id":"8ad5f530-3c4c-4de3-994b-f62899cdab0e","Path":"quick-transform-tools-rotate-scale-and-slant.md","Order":3,"CategoryType":1,"Icon":null,"Title":"Quick transform tools Rotate, Scale and Slant","Languages":[{"Code":"en","Title":"Quick transform tools Rotate, Scale and Slant","Slug":"quick-transform-tools-rotate-scale-and-slant","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"009e8f4c-0faa-4634-9da7-a4c0fad5ecb4","Path":"selecting-contours1.md","Order":1},{"Id":"01d9fe17-e227-4555-930d-6ad81615795b","Path":"selecting-segments-1.md","Order":2}],"Id":"f5e91773-c799-49d2-8be9-8edf55e0b3f6","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Selecting Contours","Languages":[{"Code":"en","Title":"Selecting Contours","Slug":"selecting-contours-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"d86d9b90-8ff8-412d-99da-dfd0aa10429f","Path":"scissors-tool-simple-ink-traps-and-blunt-corners.md","Order":2},{"Id":"f07892c3-1e49-4b62-9d9d-7618ca1838eb","Path":"pressuresensitive-brush.md","Order":1}],"Id":"b23c68a8-6c7c-4746-baac-8c10d1206bcc","Path":null,"Order":6,"CategoryType":0,"Icon":null,"Title":"Other Drawing Tools","Languages":[{"Code":"en","Title":"Other Drawing Tools","Slug":"other-drawing-tools","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"95b52fca-f180-453b-868c-220c5b047050","Path":"expand-contour-1.md","Order":4},{"Id":"b6a1e8ab-f901-4503-83b3-d7378919c475","Path":"autostems-and-suggest-stems.md","Order":1},{"Id":"a7f86128-3522-4daa-a034-bc9ab197baeb","Path":"using-the-arrow-keys-1.md","Order":8},{"Id":"9a5efdb2-ff19-4743-bf3e-d5d84f6cc422","Path":"improved-action-set-contour-direction.md","Order":5},{"Id":"4a63e8b1-c563-45dd-a3ef-4fb3bb4da1f7","Path":"using-the-contour-tool-2.md","Order":9},{"Id":"05a60c7b-493e-4fc7-a126-64851f6776d7","Path":"editing-contours1.md","Order":3},{"Id":"57e93bf2-e607-4245-a511-e74aed900f4b","Path":"truetype-editing-1.md","Order":7},{"Id":"9ac90fc3-85ef-4fc6-abd6-59ff9a5e0539","Path":"pantograph-nonnode-editing.md","Order":10},{"Id":"bc4f44d8-148a-4dea-add8-6398f62d17ef","Path":"in-element-mode.md","Order":6},{"Id":"b12c9ca9-98b6-441c-a454-841073c108b2","Path":"duplicating-contours-1.md","Order":2}],"Id":"cd4472d3-240d-49ec-97b8-350fb4d8d05f","Path":null,"Order":7,"CategoryType":0,"Icon":null,"Title":"Editing contours","Languages":[{"Code":"en","Title":"Editing contours","Slug":"editing-contours","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"aef7f4fa-afb5-49e0-bdc5-4c111305e3c6","Path":"paste-special-element-references-linked-metrics-tags.md","Order":8},{"Id":"b481f5b2-6531-4a89-963a-7a26447dce76","Path":"contour-tool-cheat-sheet.md","Order":10},{"Id":"a6c19358-6332-4eb9-98ee-2777c4c49d27","Path":"stroke-1.md","Order":11}],"Id":"eaa1ae87-aed6-4604-a40e-949efcfa3476","Path":"working-with-contours.md","Order":4,"CategoryType":1,"Icon":null,"Title":"Working with Contours","Languages":[{"Code":"en","Title":"Working with Contours","Slug":"working-with-contours","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"0bbf3c75-1ed8-482c-bd68-1dc64e11f8f8","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Drawing Glyphs","Languages":[{"Code":"en","Title":"Drawing Glyphs","Slug":"drawing-glyphs","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"65a4a87c-fa0a-4932-ab54-4b04744a590a","Path":"color-glyphs-2.md","Order":1}],"Id":"be93b400-dc2b-4d75-8f3a-140dca76c60e","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Color Glyphs","Languages":[{"Code":"en","Title":"Color Glyphs","Slug":"color-glyphs","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"e85f6d46-45e0-4862-964f-17994f0730c6","Path":"using-bitmap-images.md","Order":3},{"Id":"5b3cd73a-4f50-4866-bba0-ee189c4a0b9a","Path":"using-vector-graphics.md","Order":4},{"Id":"eaaf524e-6048-4088-9c8e-3ca874d710aa","Path":"overlaying-fonts-1.md","Order":2}],"Id":"75735206-5649-4358-839c-0b50204e7741","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"Working with Color","Languages":[{"Code":"en","Title":"Working with Color","Slug":"working-with-color","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"8edeac1c-a0ab-4ee4-a4d5-c630b1edb6d5","Path":"new-fontaudit-test-nearly-flat-curve.md","Order":5},{"Id":"2b56d6e5-5f6e-437d-b1ad-fa08352324d6","Path":"fontaudit3.md","Order":3},{"Id":"5a997a55-f5b0-4352-8e8e-ca8e9a27fd89","Path":"new-fontaudit-tests-irregular-stem-and-uncommon-stem.md","Order":6},{"Id":"a6d3adba-9df8-4982-abc4-d13a366e6b8f","Path":"other-fontaudit-improvements.md","Order":7},{"Id":"b0625907-357e-4c7f-b12f-4d95462adedf","Path":"fontaudit-6.md","Order":4},{"Id":"6e80ca55-6b88-4285-a533-f7dc6ba8f638","Path":"enabling-and-disabling-fontaudit-tests.md","Order":1},{"Id":"8fb24e43-7860-4d32-966e-5db6f79de3c8","Path":"fontaudit2.md","Order":2}],"Id":"303c2e25-915e-4085-857d-4a91f6ab53fe","Path":"fontaudit-2.md","Order":2,"CategoryType":1,"Icon":null,"Title":"FontAudit-1","Languages":[{"Code":"en","Title":"FontAudit-1","Slug":"fontaudit-2","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"09d83736-73da-4aaa-8554-f0db0cb5d7eb","Path":"auto-stems-and-suggest-stems.md","Order":1}],"Id":"e8ae0cd7-c7a6-4201-a3a0-37575af6b89b","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"Stems","Languages":[{"Code":"en","Title":"Stems","Slug":"stems","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"b20920a1-f90f-482d-88f4-cc3b8c1cc4f7","Path":"when-you-open-the-fontaudit-panel-fontlab-runs-some-tests-and-shows-a-list.md","Order":1}],"Id":"e40e6595-ac8c-4349-a9a5-799515cc78e5","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"FontAudit","Languages":[{"Code":"en","Title":"FontAudit","Slug":"fontaudit-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"ba4273f3-ba43-4648-8367-b5c751a311d3","Path":"when-you-edit-contours-in-a-glyph-window-fontlab-now-only-runs-the-fontaudit.md","Order":1}],"Id":"5fd66a8e-0eee-4455-8b5a-c88293dffda3","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"Tests","Languages":[{"Code":"en","Title":"Tests","Slug":"tests","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"7daf5537-eb92-4dd2-914a-2f7056f89d0d","Path":"transformations1.md","Order":5},{"Id":"ed380356-d79c-4440-bdb2-ac86a818b87a","Path":"rotating-a-selection.md","Order":2},{"Id":"44c329de-49ff-4de0-bb24-f974d9745828","Path":"scale-and-flip-selections-with-selection-frame.md","Order":3},{"Id":"1fbd0e4a-4465-45b0-a7a5-ae4c627fcb54","Path":"align-and-offset.md","Order":1},{"Id":"81972ff3-1734-4eae-ad7e-e9f7fdd5a7e6","Path":"transform-panel-4.md","Order":4}],"Id":"ad027e72-b8ce-49e0-9c97-30e4f8f88139","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"Transformations","Languages":[{"Code":"en","Title":"Transformations","Slug":"transformations-2","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"40289ac5-5e30-4bfd-bba9-136e6e42b160","Path":"free-transform-operation-2.md","Order":1},{"Id":"57e931b8-f51e-4de4-89a6-b6c1b04707a1","Path":"free-transform.md","Order":2}],"Id":"c88ce24a-daa4-46c2-8eba-aaa5fa6abe73","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Free Transform operation","Languages":[{"Code":"en","Title":"Free Transform operation","Slug":"free-transform-operation","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"0eb82ce1-8d71-4225-bfcd-45c2c9d92118","Path":"quick-transformations-1.md","Order":4},{"Id":"95a543d2-e58c-435e-aaa7-3f08f0f6691f","Path":"elementlevel-transformation.md","Order":2},{"Id":"07b58128-2b81-46cf-8243-e6a356a9a834","Path":"how-do-i-perform-transformations.md","Order":3},{"Id":"c52cca43-2276-4473-a600-3fea2dc55841","Path":"contourlevel-transformation.md","Order":1},{"Id":"79bec3c7-c8e6-48ef-b106-dfc1b6050431","Path":"transformations-done-to-the-geometry-of-your-glyph-drawings-scale-slant-rotate.md","Order":5}],"Id":"e8119ba0-ce59-4c00-9037-103ac9910166","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Geometric transformations","Languages":[{"Code":"en","Title":"Geometric transformations","Slug":"geometric-transformations","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"1720344c-635a-49d1-939d-0459c65413c4","Path":"glue-selection-options.md","Order":2},{"Id":"da7dc838-e512-44f9-bd29-885fcdd512b2","Path":"unlink-corners-1.md","Order":3},{"Id":"d5864632-0999-4b9b-9fc0-d4cf2ecd2d67","Path":"using-glue-selection-1.md","Order":4},{"Id":"b27b89b1-886c-401f-9b87-39e22dd79744","Path":"converting-glued-elements-into-regular-contours.md","Order":1}],"Id":"d1980e97-f092-4a73-b429-2739795f40fd","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"Glue Selection","Languages":[{"Code":"en","Title":"Glue Selection","Slug":"glue-selection","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"b7c0be78-4cca-4ad6-81f9-3dbf1b15cad1","Path":"smart-corners1.md","Order":1},{"Id":"45618f6b-679f-46dc-9a31-141b0d98c640","Path":"smart-corners2.md","Order":2},{"Id":"65132b26-de6b-4045-a88d-84c3dbef1193","Path":"using-smart-corners-1.md","Order":3}],"Id":"0781f87f-c0bc-4291-9651-3967e8ca7013","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Smart Corners","Languages":[{"Code":"en","Title":"Smart Corners","Slug":"smart-corners","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"b3e16f8b-1871-4082-aebd-90d0e16b714b","Path":"when-to-use-1.md","Order":2},{"Id":"a9b64012-c495-41da-884d-2df81513e35c","Path":"rewind-record1.md","Order":1}],"Id":"8b13d329-f0e9-4e4c-84ab-1116c9f96e53","Path":null,"Order":7,"CategoryType":0,"Icon":null,"Title":"Rewind Record","Languages":[{"Code":"en","Title":"Rewind Record","Slug":"rewind-record","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"99f0d7c9-d2c1-4ff0-91e3-decd3a8b7c14","Path":"close-actions-dialog-with-esc.md","Order":1},{"Id":"7dccd2a9-2de0-42df-842c-a8a495004c7a","Path":"perspective-action.md","Order":2},{"Id":"4a4d7701-b82d-4cd5-9e61-d90f911da8f4","Path":"slant-action.md","Order":3}],"Id":"20f627ae-230d-4a69-bc8a-f85aa6c28606","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Actions","Languages":[{"Code":"en","Title":"Actions","Slug":"actions-2","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"75224768-7e91-4c5b-9996-b1c1426a1446","Path":"stroke-and-power-brush.md","Order":3},{"Id":"e1680734-64c4-419d-841e-4bd5db0584d2","Path":"brush-tool-3.md","Order":1},{"Id":"fa148236-501e-42ea-bf12-f02ad3f88884","Path":"power-brush1.md","Order":2}],"Id":"08715565-2783-4a06-97c0-4c3e28f755e5","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Power Brush","Languages":[{"Code":"en","Title":"Power Brush","Slug":"power-brush","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"faf23529-25f5-4992-930e-c4e9ded293ac","Path":"creating-power-guides.md","Order":1},{"Id":"68aa93d9-1c26-4575-826a-dff846382685","Path":"power-guides1.md","Order":2},{"Id":"eda0650e-c2ea-45b2-8fc3-62372662bec5","Path":"removing-links.md","Order":3}],"Id":"29dac481-6570-4095-918a-585ca2f3f664","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"Power Guides","Languages":[{"Code":"en","Title":"Power Guides","Slug":"power-guides","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"4e536264-127f-4506-a942-0dccb2aff1bb","Path":"remarks.md","Order":10},{"Id":"b79acccf-3c90-44a0-a908-1d5bb1e73608","Path":"change-height.md","Order":3},{"Id":"e86428b8-2b47-4f85-815e-345b30679ab7","Path":"keyboard-shortcut.md","Order":7},{"Id":"6931f976-85a2-4fcd-b913-a6f569f60a07","Path":"manually-improve-the-results.md","Order":9},{"Id":"93c3ee1f-a558-45c4-bcb7-db444f81edc0","Path":"using-actions.md","Order":12},{"Id":"7dfc934a-30b2-4e91-9b2b-2499471eb789","Path":"layer-scope.md","Order":8},{"Id":"d9ee39a1-7c68-4fdd-8764-f8d0f5d456b1","Path":"change-width.md","Order":5},{"Id":"3ae21e9a-54ce-43bb-9431-04d1126887e0","Path":"scope-of-actions.md","Order":11},{"Id":"6e235892-b28c-45a5-86da-b8e2ebc28e6f","Path":"actions-6.md","Order":2},{"Id":"a7008895-47d7-4154-baa4-1ad54878f89e","Path":"change-width-and-change-weight.md","Order":4},{"Id":"495416ff-1549-438b-ba2a-91ba62671f7b","Path":"glyph-scope.md","Order":6},{"Id":"5bbc4f7e-ad8c-43d2-b904-a31edd8129a5","Path":"action-sections.md","Order":1}],"Id":"e58798d1-b6ae-4b2d-a540-8e660036af25","Path":null,"Order":8,"CategoryType":0,"Icon":null,"Title":"Actions-1","Languages":[{"Code":"en","Title":"Actions-1","Slug":"actions-3","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"610fd11a-9f72-433d-be7e-7192703951f6","Path":"genius-nodes-power-nudge-servant.md","Order":6},{"Id":"96dff098-d07c-4b47-8541-f60aa8bfb3db","Path":"servant-nodes.md","Order":2},{"Id":"0e1226ab-eb65-4d2b-8ed0-a633262958f0","Path":"removing-servant-property.md","Order":3},{"Id":"f372120a-6402-4f97-bc6c-6b73d2b871fe","Path":"using-smart-nodes-1.md","Order":4},{"Id":"e1ff2d70-665e-485f-84f0-5885d9863d9a","Path":"genius-nodes.md","Order":5},{"Id":"910edeed-fde6-4bbc-81cd-24b2caae102e","Path":"adding-servant-property.md","Order":1},{"Id":"b368ccba-0946-4940-8881-74afded6ab83","Path":"creating-a-genius-node.md","Order":7},{"Id":"903426a0-9012-4aa6-b9f1-a39f142f5af4","Path":"removing-genius-property.md","Order":8}],"Id":"c8a569b4-3813-404f-beb4-f18f9a044234","Path":null,"Order":6,"CategoryType":0,"Icon":null,"Title":"Smart Nodes","Languages":[{"Code":"en","Title":"Smart Nodes","Slug":"smart-nodes","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"1e4d4a0e-8b5f-41ba-a854-d0efa594533a","Path":"font-info-guide-expressions.md","Order":1},{"Id":"f442bddc-fed2-4887-9c07-c3e5b8427a43","Path":"location-expressions.md","Order":2},{"Id":"6c249795-7ea4-4b1f-9226-756e157ad144","Path":"using-expressions-1.md","Order":3}],"Id":"5118368b-3bcd-486a-9b61-150b2c01c2e6","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Expressions","Languages":[{"Code":"en","Title":"Expressions","Slug":"expressions","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"4f666800-5308-466a-abd3-46baab5b95d1","Path":"measurements-panel-2.md","Order":1}],"Id":"1fda3574-9bc2-49e9-aec5-74d0b0591811","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"Suggested drawing items","Languages":[{"Code":"en","Title":"Suggested drawing items","Slug":"suggested-drawing-items","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"e2d8361a-64c2-419f-b848-e5cc5372b9a2","Path":"parameters.md","Order":2},{"Id":"6cdf4d07-3d55-483c-8f28-673ab5749423","Path":"font-info-parameters.md","Order":1},{"Id":"134b6b0b-0fe7-4094-a15c-23fd4174b875","Path":"variables.md","Order":3}],"Id":"6d9813ca-7341-466a-af95-04f13901ad9d","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Parameters and Variables","Languages":[{"Code":"en","Title":"Parameters and Variables","Slug":"parameters-and-variables","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"43274c18-1bec-48b6-9b9a-169242c12da3","Path":"defining-position-of-anchors-and-pins.md","Order":2},{"Id":"49e56761-7522-40cb-8d04-c67a658fccc8","Path":"sample-useful-calculations.md","Order":6},{"Id":"6c6b0c34-2fb5-4916-a3dc-5d81f55623a5","Path":"defining-position-of-guidelines.md","Order":3},{"Id":"5038e49b-852d-46fc-b9df-de769abafb35","Path":"defining-position-of-alignment-zones.md","Order":1},{"Id":"afe46c87-b1a9-4f77-9a62-eed0a2c228fe","Path":"guidelines-zones-and-anchors.md","Order":4},{"Id":"0f7ab3da-698e-4576-886e-2bebf4bee03f","Path":"guides-1.md","Order":5}],"Id":"5e477f34-0366-4fe2-8f68-d584e5197679","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"Position for Guides, Zones, Anchors, and Pins","Languages":[{"Code":"en","Title":"Position for Guides, Zones, Anchors, and Pins","Slug":"position-for-guides-zones-anchors-and-pins","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"ea93649d-4bac-469b-af12-db16266dbe9e","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Dynamic Things","Languages":[{"Code":"en","Title":"Dynamic Things","Slug":"dynamic-things","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"6666c691-ed0a-4acd-857f-cffe7890b514","Path":"flatten-glyph-and-flatten-layer.md","Order":6}],"Id":"ef9039ec-cc60-4204-a7af-5dd74630fddd","Path":null,"Order":6,"CategoryType":0,"Icon":null,"Title":"Advanced Drawing","Languages":[{"Code":"en","Title":"Advanced Drawing","Slug":"advanced-drawing","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"8de1bf51-6aa7-4255-924c-561be98dc0d8","Path":"sample-volt-fonts.md","Order":11},{"Id":"db232170-e9cc-4b31-9579-7fb5bc4af529","Path":"more-volt-resources.md","Order":8},{"Id":"11b54e6a-4dff-431a-97a9-d30a03c82ace","Path":"featurecentric-vs.md","Order":1},{"Id":"4987f9f2-53be-4bce-a899-59d535b9c4a0","Path":"testing-mark-attachment.md","Order":14},{"Id":"78d28093-b96e-4877-a6bf-5f13cfbcf3f6","Path":"lookups-area.md","Order":6},{"Id":"25ef3b71-c859-45bf-b0b6-d3a60ba27434","Path":"exporting-feature-definitions-to-volt.md","Order":4},{"Id":"886b0ed9-14b9-4902-a423-5effedf38745","Path":"testing-kerning.md","Order":13},{"Id":"708e841d-fc22-4cae-a248-f00416281e90","Path":"visual-proofing-in-the-lookups-panel.md","Order":17},{"Id":"39c5ccb3-1f37-40c6-bc31-8afad4c5a957","Path":"lookups-panel-1.md","Order":7},{"Id":"1a3d337f-cb07-4c65-8b9e-9a56b916d454","Path":"proofing-opentype-features.md","Order":9},{"Id":"eb2cb534-e0d8-4900-96d9-4fcabb0de1da","Path":"features-panel-3.md","Order":3},{"Id":"e5bca770-4b96-41dc-b1e0-3758654e7358","Path":"the-opentype-layout-process.md","Order":15},{"Id":"b0e69340-9e8b-43fa-8223-fa03d2780fb6","Path":"using-microsoft-volt.md","Order":16},{"Id":"42a612b3-06aa-4640-8fbb-a1edc405c7f7","Path":"rules-area.md","Order":10},{"Id":"60ec130c-2d66-4919-88ff-9bea017e0b91","Path":"testing-features-in-text.md","Order":12},{"Id":"9c7446d8-2aff-4af2-b3f1-a3cb47e1ea5e","Path":"features-area.md","Order":2},{"Id":"421c4e2e-8e50-42fb-930e-27a059e827dd","Path":"interchange-with-microsoft-volt.md","Order":5}],"Id":"c15be36d-9bf0-4f6c-9510-1d49e87a4e08","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Features","Languages":[{"Code":"en","Title":"Features","Slug":"features","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"a141abf9-217a-4fbd-8ae1-7ce97fd4a0c3","Path":"glyph-substitution-rules1.md","Order":1}],"Id":"b504c502-b8bf-4e85-98ed-4dc5510fd179","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"Glyph Substitution Rules","Languages":[{"Code":"en","Title":"Glyph Substitution Rules","Slug":"glyph-substitution-rules","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"52e85baf-43f7-4299-88b4-c34696521b56","Path":"classes-and-tags-in-feature-definitions.md","Order":2},{"Id":"bb9e8c77-4248-4d94-b721-03936c674735","Path":"import-features.md","Order":4},{"Id":"e7cda704-5acf-468f-8653-423524962d81","Path":"features-panel-4.md","Order":3},{"Id":"bce3d096-be16-478f-a350-505fa7720972","Path":"applying-features-in-glyph-window-and-preview-panel.md","Order":1}],"Id":"65579111-c45d-4818-b57c-670d6e5ee5f1","Path":null,"Order":8,"CategoryType":0,"Icon":null,"Title":"Features","Languages":[{"Code":"en","Title":"Features","Slug":"features-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"9ca63ed5-b899-4793-9c1f-88e317d800b9","Path":"use-classes-panel-classes-tags-and-virtual-tags-in-feature-code.md","Order":14},{"Id":"65a92cd6-f98f-4cb0-b698-37515d2cd210","Path":"automatically-generate-code-for-common-opentype-features.md","Order":7},{"Id":"747a31b1-c2e1-4a67-8fb3-83931a60cca7","Path":"adding-custom-code-to-autogenerated-feature-definitions.md","Order":3},{"Id":"bb2dce3a-53f8-4b38-a53a-515cfb034fd5","Path":"gdef-glyph-definition-classes.md","Order":8},{"Id":"7826f63e-b36b-4d6a-927e-383bc667b488","Path":"updating-auto-features.md","Order":13},{"Id":"e3874300-1312-46c2-b5fa-8ec0ecbb9a63","Path":"update-current-auto-feature-or-all-auto-features.md","Order":12},{"Id":"6968b84d-3809-4c05-bc7c-7b4259e7925a","Path":"autogenerated-portion-of-a-feature-definition.md","Order":6},{"Id":"c60b0233-ff44-4960-932a-bff7bd41530c","Path":"adding-autogenerated-code-to-existing-feature-definitions.md","Order":2},{"Id":"fd7d8138-dde2-469f-b194-a3057d801b42","Path":"view-features-that-are-or-can-be-aurogenerated.md","Order":16},{"Id":"0e102017-ed05-4a08-afe1-9c9d4ebcca0a","Path":"adding-custom-kerning-lookups-kern.md","Order":4},{"Id":"b40729c1-8df8-432e-8fd0-9e2c2811573a","Path":"modifying-auto-feature-definitions.md","Order":10},{"Id":"20fe6d39-83e0-430a-a5bc-0ac3dd5f36e5","Path":"adding-auto-features.md","Order":1},{"Id":"5932b599-c388-4a91-aebd-c689647d9446","Path":"interpolable-positioning-features-cpsp-etc.md","Order":9},{"Id":"04106e93-b705-460d-b91d-d20702d256b6","Path":"using-tags-and-classes-in-feature-code.md","Order":15},{"Id":"1b3c9622-9482-4ad3-b24b-9f663909c839","Path":"naming-glyphs-for-auto-feature-generation.md","Order":11},{"Id":"6e615b8a-6d8d-4e55-8bb3-6e5bf9e2f359","Path":"auto-opentype-features-and-the-features-panel.md","Order":5}],"Id":"c380ee9a-8d7f-4bea-ad1c-030113677251","Path":null,"Order":6,"CategoryType":0,"Icon":null,"Title":"OpenType Features","Languages":[{"Code":"en","Title":"OpenType Features","Slug":"opentype-features-2","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"6d1842a9-d207-4cd9-b1b4-936b6df1edb0","Path":"using-microsoft-volt-1.md","Order":6},{"Id":"d4c69947-76fd-47dd-8b63-4b079253a804","Path":"volt-tutorials-and-info.md","Order":7},{"Id":"fba059a8-4384-48e4-a3bc-25bc5209c0d0","Path":"fontlab-8.md","Order":2},{"Id":"fa864eba-8409-48d8-aa49-3df2cc9cc63d","Path":"exporting-fea-features-to-volt.md","Order":1},{"Id":"80b78d1c-f80d-4752-bdc6-f631cc325420","Path":"more-voltrelated-tools.md","Order":4},{"Id":"08f24d8e-90e6-4d21-b7dd-68e380d6ea80","Path":"sample-volt-fonts-1.md","Order":5},{"Id":"eb6868ce-8396-4596-93c6-054184fef21e","Path":"microsoft-volt-and-features-for-complex-scripts.md","Order":3}],"Id":"01415273-4c6e-4c9a-84a8-1b2acf98609b","Path":null,"Order":7,"CategoryType":0,"Icon":null,"Title":"OpenTye Features","Languages":[{"Code":"en","Title":"OpenTye Features","Slug":"opentye-features","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"bf762e7f-d9b2-4a67-95f6-a4d7ff62eadf","Path":"decompiling-features.md","Order":9},{"Id":"d648be22-64ed-49cb-be43-517d8b1064d4","Path":"stylistic-set-features-ssxx.md","Order":10},{"Id":"d9e3b769-35ad-434a-a2ab-14b57f48e1e2","Path":"lookups.md","Order":2},{"Id":"b0a162bb-d838-404b-a735-9512c9aebe56","Path":"opening-1.md","Order":1},{"Id":"680d0597-e66b-41ea-86fb-becead63c16c","Path":"adding-features-with-or-without-autogenerated-content.md","Order":11},{"Id":"8bc5cc57-70df-474f-8e78-0bbd19a68dbc","Path":"mark-positioning.md","Order":3},{"Id":"c1ade011-152d-409e-8a8b-2613027fc284","Path":"opentype-features-6.md","Order":5},{"Id":"3c2ed78c-96c6-426c-8faf-d668bb38943d","Path":"substitutions.md","Order":4}],"Id":"a58d78b2-2226-4401-aebe-c026d92792da","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"OpenType Structure","Languages":[{"Code":"en","Title":"OpenType Structure","Slug":"opentype-structure","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"4310d69a-a8f7-42fe-8fad-7bc2aa8e9171","Path":"enumerating-pairs.md","Order":4},{"Id":"632f4f3c-8f17-4d00-844f-b21013e3c3fb","Path":"marktobase-attachment-positioning.md","Order":9},{"Id":"9b80151a-7321-4b5e-a96d-2b2e3b3890e5","Path":"marktoligature-attachment-positioning.md","Order":10},{"Id":"47ebf198-bd7f-4efe-9eff-55e8f2317fed","Path":"specifying-exceptions-to-the-context-rule.md","Order":20},{"Id":"5e7f2b8e-8967-4fb3-8d3c-05eecc1f630c","Path":"value-record.md","Order":23},{"Id":"3e793965-a94e-4ffa-b1f2-9ee559ea24a4","Path":"marktomark-attachment-positioning.md","Order":11},{"Id":"6ba283a8-a7ed-4aa6-8826-c0353d44b9cc","Path":"multiple-substitution.md","Order":12},{"Id":"1d2d800c-d4de-4981-a2b3-5af49290cace","Path":"single-positioning.md","Order":17},{"Id":"938dcc40-4be8-4c64-a609-f418fb2e5cb7","Path":"substitution-lookups.md","Order":21},{"Id":"29671d5d-cf81-42e2-a932-2b99ca06a8bc","Path":"alternate-substitution.md","Order":1},{"Id":"a1017f8f-85ea-4fae-9da3-3b78e6ea7c0e","Path":"context-dependent-substitutions.md","Order":2},{"Id":"7be6f9d4-7175-4189-9e10-49251aeb56a8","Path":"fea-classes.md","Order":5},{"Id":"bf840abb-5b9e-4f54-9f11-e6f3effd8e88","Path":"cursive-attachment-positioning.md","Order":3},{"Id":"12b3b4c3-4f59-4887-9da2-a9265ae60023","Path":"ot-features.md","Order":14},{"Id":"647a5220-7dc7-4214-96b1-4499017a1865","Path":"positioning-lookups.md","Order":16},{"Id":"98cc0419-1485-423a-bb64-c36cbcd204b5","Path":"single-substitution.md","Order":18},{"Id":"78633a09-b9ce-428e-b032-f896555313fe","Path":"glyph-geometry.md","Order":7},{"Id":"4d5d0397-9500-45b1-bf3e-432d0bc000a4","Path":"ligature-substitution.md","Order":8},{"Id":"facaf2d6-f197-4177-a76e-67dd48cf0914","Path":"fea-lookups.md","Order":6},{"Id":"4656b5d2-fca4-4641-b98c-6022f82017d4","Path":"subtable-breaks.md","Order":22},{"Id":"608946d8-b6b1-4d8a-9a2b-9b68f213e127","Path":"specially-handled-features.md","Order":19},{"Id":"85a5bfec-4d1a-4b47-89f2-90279d92a6ee","Path":"opentype-tables.md","Order":13},{"Id":"52019276-b7f9-4b6d-bf9f-7fe6b69c3580","Path":"pair-positioning.md","Order":15}],"Id":"3a4c31d5-f2cd-49e0-a724-4b0bb863fa0d","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"OpenType Features","Languages":[{"Code":"en","Title":"OpenType Features","Slug":"opentype-features-3","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"708ac671-4037-40cb-b873-397c68633f76","Path":null,"Order":10,"CategoryType":0,"Icon":null,"Title":"OpenType Features","Languages":[{"Code":"en","Title":"OpenType Features","Slug":"opentype-features-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"19d18bbb-30b6-484b-a5ac-0f130d2b002d","Path":"kerning-8.md","Order":1},{"Id":"0ae28eb5-83f7-45b6-a1c9-ce8a9649617c","Path":"import-kerning-from-kern-feature.md","Order":2}],"Id":"aa9d8e87-f011-4bfa-ab88-c6bcf23a28c1","Path":null,"Order":8,"CategoryType":0,"Icon":null,"Title":"Kerning-1","Languages":[{"Code":"en","Title":"Kerning-1","Slug":"kerning-2","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"b9764153-56f8-45bb-b2ae-83212d6d68b4","Path":"manually-linking-metrics.md","Order":5},{"Id":"c4cbc524-95b7-467b-bc7f-31e950ca7bc7","Path":"linking-metrics-across-masters.md","Order":7},{"Id":"7cec283e-6512-439a-8445-1ec42d064816","Path":"linked-metrics1.md","Order":3},{"Id":"64a40bf1-b985-4f94-8b2b-6f97f39dbd2e","Path":"linked-metrics-and-live-metrics.md","Order":2},{"Id":"cd0b2594-55c3-457a-be45-30363f1b89d4","Path":"viewing-linked-metrics.md","Order":9},{"Id":"63976dc3-7bc7-46c9-8c13-e53a01575865","Path":"linking-metrics.md","Order":6},{"Id":"96bcd668-25fe-4259-ab58-588128d13ce5","Path":"removing-metrics-links.md","Order":8},{"Id":"ef9ef171-9066-4241-bd9c-daf71b73563e","Path":"automatically-linking-metrics.md","Order":1},{"Id":"fe62e98a-1954-413d-8596-1d51a8b2605a","Path":"warnings-about-problematic-linked-metrics.md","Order":10},{"Id":"73aa5b53-18b8-42f2-8ccc-aaa756e036cf","Path":"linked-metrics2.md","Order":4}],"Id":"1402b957-4451-4006-926f-56c261f0e698","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Linked Metrics","Languages":[{"Code":"en","Title":"Linked Metrics","Slug":"linked-metrics","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"269d9196-874d-4b19-91a7-e958fa85485a","Path":"auto-layer-for-all-layers.md","Order":3},{"Id":"d79f4235-43ea-4dc4-89e7-900bf3f17e21","Path":"auto-layer-contents.md","Order":2},{"Id":"920b4687-da6d-4638-a729-2bd91e0c36ed","Path":"auto-layer-and-composite-glyph-cell-icons.md","Order":1},{"Id":"914f591d-b1ac-4d36-b1aa-8f173d99c6d9","Path":"auto-layers-1.md","Order":4},{"Id":"c641b555-a331-426b-818f-58ec7dad64f7","Path":"live-update-of-metrics-and-auto-layers.md","Order":5},{"Id":"66451964-228d-47e3-a733-b5f533aa6342","Path":"updating-metrics-automatically.md","Order":6}],"Id":"7b4ab416-7b82-4e06-96ea-8901ee6a8871","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Metrics and Auto Layers","Languages":[{"Code":"en","Title":"Metrics and Auto Layers","Slug":"metrics-and-auto-layers","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"6e5a82da-548b-4644-97c1-367658eca67b","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Spacing","Languages":[{"Code":"en","Title":"Spacing","Slug":"spacing-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"9dd0b9c2-bb3c-4bc0-9e0d-278c3225f7c1","Path":"importing-metrics.md","Order":3},{"Id":"85230158-8f91-42fc-83ca-f7f842f23898","Path":"exporting-metrics.md","Order":1},{"Id":"57d9fdcb-f774-4d33-b6b0-638e39129e4f","Path":"import-metrics.md","Order":2}],"Id":"db274ff2-fc76-445e-92f4-73401504c31f","Path":null,"Order":6,"CategoryType":0,"Icon":null,"Title":"Importing and Exporting Metrics","Languages":[{"Code":"en","Title":"Importing and Exporting Metrics","Slug":"importing-and-exporting-metrics","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"404b63d2-9cac-4dc4-a699-07ac8e0ec83c","Path":"using-the-metrics-table-1.md","Order":4},{"Id":"143a9294-bba0-470c-8a1f-84347cc28bc3","Path":"metrics-table1.md","Order":1},{"Id":"bc464c34-656d-4198-ba62-05fbe72aa098","Path":"metrics-table2.md","Order":2},{"Id":"f7683a85-9d91-461d-a1bc-d898400b0017","Path":"metrics-table3.md","Order":3}],"Id":"90ed0ace-e67b-4777-a431-1befb0ed817c","Path":null,"Order":14,"CategoryType":0,"Icon":null,"Title":"Metrics Table","Languages":[{"Code":"en","Title":"Metrics Table","Slug":"metrics-table","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"398a3a6c-0c09-406a-a55f-304035e0b9ca","Path":"using-extended-expressions.md","Order":1},{"Id":"f7fca097-29ed-4822-ac78-f857bf3b24d8","Path":"using-simple-expressions.md","Order":2},{"Id":"1ff222f5-bfa0-4c30-9932-0735e63e3586","Path":"location-expressions-1.md","Order":4},{"Id":"49d4e34b-61e0-4c4d-9871-b1cc4a623996","Path":"calculations-in-numeric-text-fields.md","Order":3}],"Id":"2326aa61-79e4-4f36-8aa9-5929138d432d","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Calculated metrics","Languages":[{"Code":"en","Title":"Calculated metrics","Slug":"calculated-metrics","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"a6ab59e2-4404-4219-a512-572fa50814b5","Path":"setting-sidebearings.md","Order":9},{"Id":"ee88e29c-e85f-4195-86e3-2c808b7b890c","Path":"metric-expressions-in-glyph-panel.md","Order":5},{"Id":"5a2bce7f-b175-4af1-a902-acca3895bd3e","Path":"copypaste-sidebearings.md","Order":3},{"Id":"0bc7d306-f5cb-47d2-83f7-bb021de34308","Path":"binding-sidebearings.md","Order":1},{"Id":"bbcdb3cc-d6d9-4f8a-b138-391f04cfc0b4","Path":"copy-expressions-to-masters-in-glyph-panel.md","Order":2},{"Id":"80ee4ed0-6550-436b-8380-5cf67757c755","Path":"setting-advance-width.md","Order":8},{"Id":"a52fb4a9-a545-4526-bd5b-26fb47440ce3","Path":"negative-widths.md","Order":6},{"Id":"0781bc1c-ca1b-4c66-9a4c-84085e25e1fb","Path":"opposite-sidebearing.md","Order":7},{"Id":"cf9db933-7de6-4b4d-8458-01f5cb2bde7b","Path":"using-spacing-strings.md","Order":10},{"Id":"2fde9d40-7759-46c6-9505-2c0c1080d078","Path":"each-glyph-in-the-font-has-a-bounding-box-a-rectangle-positioned-in-a-theoretical.md","Order":4}],"Id":"e02fbbb7-32c3-4592-b062-4894b21d8564","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Sidebearings","Languages":[{"Code":"en","Title":"Sidebearings","Slug":"sidebearings","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"76e8c851-2b32-474d-8d1c-840f82698d62","Path":"glyph-window-pairs-and-phrases.md","Order":23},{"Id":"3b732b73-a39f-4c99-8b55-c6dccb2e4092","Path":"strong-ligature-attachment-in-legacy-recipe-syntax.md","Order":24},{"Id":"1e82548f-4122-461c-857d-4de4f1b7a876","Path":"metrics-window-1.md","Order":15},{"Id":"179970e7-3cc3-4e43-b58f-691ae46fc5a0","Path":"editing-glyph-metrics-1.md","Order":4},{"Id":"5684e78e-cfc3-4212-8cc4-3cf4c364b219","Path":"preview-panel-6.md","Order":8},{"Id":"19b8594c-469a-4f66-8162-aa362a2a7b0b","Path":"using-direct-numeric-input.md","Order":7},{"Id":"9d621960-0737-4eab-84ff-505f004119c4","Path":"metrics-panel-2.md","Order":13},{"Id":"68702d37-6104-41f9-b110-3e5c4718bff1","Path":"pairs-phrases-panel-1.md","Order":18},{"Id":"d257ee86-f913-45ea-9154-a63e41fda557","Path":"pairs-and-phrases.md","Order":19},{"Id":"107ae623-d0c2-4d96-a515-b15fccde1bff","Path":"preview-panel-sidebar.md","Order":9},{"Id":"0b09f0a6-59b5-4f02-b3f1-a9759f780761","Path":"adjusting-metrics.md","Order":3},{"Id":"5793e3de-3436-4070-b613-1f70ad38eda9","Path":"manual-metrics-editing.md","Order":11},{"Id":"76b69e2c-092f-4314-92b2-d77e648f2d6c","Path":"measurement-line-3.md","Order":20},{"Id":"2bebcbaf-1ba9-482e-9ecf-25d473ce457a","Path":"viewing-metrics.md","Order":6},{"Id":"86df942e-5e6c-4dc6-8452-fdd05190f41e","Path":"metrics-editing.md","Order":12},{"Id":"8f50ebe6-dcbd-46f0-8013-66cf16fae2c3","Path":"metrics-3.md","Order":17},{"Id":"189fe4a5-af2f-4603-a704-4d152a518b56","Path":"keyboard-shortcuts-for-navigation.md","Order":10},{"Id":"2427edfd-5e6f-422e-aa17-0ff0e3b70e4d","Path":"metrics1.md","Order":16},{"Id":"f9f4b0a6-d1ff-4029-bd1e-841340cdeff8","Path":"italic-metrics.md","Order":21},{"Id":"0dac115a-0351-44ff-a3ba-1191a66f0d11","Path":"quick-autospacingautokerning-the-key.md","Order":22},{"Id":"13ad2bc5-bdde-413a-b8da-2e6825560908","Path":"tracking.md","Order":25},{"Id":"239ef301-6829-4b18-ad36-b4513ba9fc5e","Path":"glyph-window-get-glyph-by-name.md","Order":26},{"Id":"b453ffab-5f60-439b-b458-8273a44a8c77","Path":"glyph-metrics-without-and-with-measurement-line.md","Order":27},{"Id":"9f55357a-9597-4459-b0ef-28dae55d491b","Path":"entering-input.md","Order":5}],"Id":"9cee9118-bd7c-4b46-b054-db51f388eab4","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"About Metrics","Languages":[{"Code":"en","Title":"About Metrics","Slug":"about-metrics","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"ce31a414-ba25-44cd-b5e7-7e3e3542b15f","Path":"kerning-get-glyphs.md","Order":5},{"Id":"814ddb31-602d-4ba1-8f0d-918a93ba610a","Path":"creating-a-kerning-class.md","Order":10},{"Id":"0bef7a4c-4507-41cf-9073-fb12deacc413","Path":"classes-panel-3.md","Order":36},{"Id":"ddda9e42-0b98-4a62-9c5b-5767394c9943","Path":"editing-kerning-exceptions.md","Order":11},{"Id":"330fe675-29a3-47dc-a82a-d8c40aeeadab","Path":"adding-kerning-pairs.md","Order":29},{"Id":"69a454cd-bec6-485f-a829-9a32a3ecc0bd","Path":"kerning2.md","Order":2},{"Id":"9938b440-7e20-4c1f-b4aa-1bc4ff61b9fc","Path":"editing-kerning-1.md","Order":12},{"Id":"0027f74a-1be6-4be5-9035-9a30818b456a","Path":"metrics-and-kerning-smart-navigation-with-the-updown-keys.md","Order":32},{"Id":"417ee8c5-614a-4305-a484-4a13b9c23772","Path":"kerning-cloud.md","Order":18},{"Id":"cf9317d4-2d9d-436e-9110-5e299d96eefc","Path":"classes-and-kerning.md","Order":21},{"Id":"421b657c-0cc2-4689-91a0-15680b28711f","Path":"automatic-kerning-generation.md","Order":28},{"Id":"a41e8c0c-84d5-4bd8-92b8-c2981119434a","Path":"bothsided-kerning-class.md","Order":25},{"Id":"fe49ce09-3a2a-4f42-9733-d3ad0a5512d3","Path":"kerning-mode.md","Order":4},{"Id":"170fa196-488d-4b48-af44-39b0acebda59","Path":"metrics-and-kerning-2.md","Order":30},{"Id":"70a6a6ba-a2b9-4e60-9d85-c333fcea5b7a","Path":"metrics-and-kerning-walking-in-the-glyph-window.md","Order":33},{"Id":"122237de-a325-40da-94b9-3853310bf410","Path":"kerning3.md","Order":1},{"Id":"238cbd4c-92e0-4a2b-aec5-5327720f7faf","Path":"kerning-classes-in-multiplemaster-or-variable-fonts.md","Order":17},{"Id":"0216b62f-235a-48f1-888a-8032ea96d2e3","Path":"class-glyphs-behind-exception-glyphs.md","Order":34},{"Id":"7b7901d4-3056-4cd2-9a91-d24f401c2910","Path":"from-visual-kerning-to-the-kern-feature.md","Order":14},{"Id":"7f22444d-150e-44fc-89b8-2fdf918f1439","Path":"defining-a-class-kerning-pair.md","Order":9},{"Id":"594a1f07-65bd-488d-a576-cc8ac710fb3b","Path":"class-kerning-with-exceptions.md","Order":35},{"Id":"e2dfebc7-4446-45a3-a980-c1ecf281d37e","Path":"include-or-import-kerning-classes.md","Order":15},{"Id":"069a6694-f3b9-4456-a308-aeb53829cc89","Path":"kerning-editing-kerning.md","Order":19},{"Id":"e99f9d29-10c2-4f71-a840-5e3d38f0aa09","Path":"set-kerning-class.md","Order":20},{"Id":"fc86de99-e547-401a-ad76-ad12a33f6c09","Path":"kerning1.md","Order":3},{"Id":"20587e54-c4c2-4da5-8441-2b2eb5e14f73","Path":"from-the-kern-feature-to-visual-kerning.md","Order":13},{"Id":"65045a44-1a26-4b16-815e-57c88ee71dd9","Path":"using-kerning-classes-1.md","Order":23},{"Id":"4d395983-3168-4dff-ac84-3b846e9259ee","Path":"kerning-class-cloud-no-longer-shown-behind-exceptions.md","Order":16},{"Id":"ae780cf6-1be4-46a4-b9ba-bed9f2a0a98c","Path":"building-opentype-kerning-feature.md","Order":24},{"Id":"210c3914-abe1-4f37-a994-ad6992d73b49","Path":"kerning-get-class-pairs-or-exceptions.md","Order":7},{"Id":"8a356d60-4080-4ef0-9800-80f2e56289fc","Path":"kerning-get-existing-pairs.md","Order":6},{"Id":"6a611d87-249e-43d5-8722-2e497d1fbdc5","Path":"kerning-show-all-combinations.md","Order":27},{"Id":"e4b1f2e6-0f32-4865-a9cf-6c2dfd88f6e2","Path":"definition.md","Order":8},{"Id":"3351ad3c-7766-472e-a32a-d024c834e556","Path":"kerning-panel-2.md","Order":26},{"Id":"533b0b82-7c97-4d47-8439-14ca36c887e7","Path":"modifying-kerning.md","Order":22},{"Id":"f3b48110-d331-4083-a622-07f874f24433","Path":"metrics-and-kerning-clean-view.md","Order":31}],"Id":"890c6cec-2d45-4d3e-9cf2-3cf4e7a0bb70","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"Kerning","Languages":[{"Code":"en","Title":"Kerning","Slug":"kerning-1","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"55d5d076-69d8-4565-affb-9b30a274642f","Path":"import-and-export-classes.md","Order":5},{"Id":"5f128eb1-a6e2-4e88-a56e-57b5617310da","Path":"metrics-table-2.md","Order":11},{"Id":"1dd3465a-3ff7-415b-a380-97566a340108","Path":"glyph-metrics-4.md","Order":4},{"Id":"dda5b5d0-b17f-4358-a562-bdb0a35c9e87","Path":"locked-metrics.md","Order":9},{"Id":"813f1f13-2a13-4a81-a3e6-644c44f52b55","Path":"classes-and-tags.md","Order":7},{"Id":"da519175-76ba-4134-8dcb-8d6d567abd1a","Path":"rightclick-to-remove-kerning-pair.md","Order":12},{"Id":"b79f0bba-8eae-47c0-89db-01ed131840a7","Path":"adding-glyphs-into-a-kerning-class.md","Order":13},{"Id":"c1196496-a2c3-4427-bbb3-3f749d033825","Path":"tags-in-classes-panel.md","Order":14},{"Id":"15ee60dc-4973-4e9a-aa09-636d742cc821","Path":"virtual-tags-2.md","Order":15},{"Id":"3eb2d137-370a-4e42-b786-0ada5fc37ad0","Path":"wildcards-in-tags-search.md","Order":16},{"Id":"e46a6052-8641-44e6-babf-46b096e81515","Path":"metrics-and-kerning-1.md","Order":10}],"Id":"29a4f88a-87a5-4fbe-b349-4020ac50913c","Path":null,"Order":7,"CategoryType":0,"Icon":null,"Title":"Spacing and Kerning","Languages":[{"Code":"en","Title":"Spacing and Kerning","Slug":"spacing-and-kerning-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"3949c12b-0963-48cd-bd28-fc69db254dbe","Path":"adding-pins.md","Order":2},{"Id":"0d5c107b-f326-4087-92e7-617b40e7814f","Path":"renaming-pins.md","Order":3},{"Id":"ab1eed6a-659a-410c-b021-95a23f63292c","Path":"moving-pins.md","Order":4},{"Id":"928764f7-0349-4fa2-8116-9415786c3293","Path":"activatingdeactivating-pins.md","Order":1},{"Id":"e5a5ca0d-e550-4939-b119-c0d2ed1cb18a","Path":"removing-pins.md","Order":6},{"Id":"f5a58fbf-6aca-454c-aec9-5a7cbfbab568","Path":"linking-pins.md","Order":7},{"Id":"c19b458a-b07e-4077-8e4d-5933bffa286f","Path":"pins1.md","Order":5}],"Id":"aee0d744-1f23-4eb5-96a7-1c830ae939d9","Path":null,"Order":6,"CategoryType":0,"Icon":null,"Title":"Pins","Languages":[{"Code":"en","Title":"Pins","Slug":"pins","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"649719eb-7bc7-4f35-9f9b-0d9b8d611684","Path":"sticker.md","Order":1},{"Id":"a08b2b33-428e-4c2a-bfe0-a9b1117716c4","Path":"stickers-2.md","Order":2}],"Id":"6c8d3110-24f3-46cd-bb7a-3668974d85c2","Path":"element-stickers.md","Order":4,"CategoryType":1,"Icon":null,"Title":"Element Stickers","Languages":[{"Code":"en","Title":"Element Stickers","Slug":"element-stickers","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"0db75258-ec1b-4214-9432-94386adc3d50","Path":"element-guides1.md","Order":1}],"Id":"a340991e-a43a-406e-9201-2e5674e7cb9c","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"Element Guides","Languages":[{"Code":"en","Title":"Element Guides","Slug":"element-guides","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"c485e8d8-c490-43bc-b016-32f913a9d230","Path":"element-group.md","Order":2},{"Id":"8a215449-5fd7-48bd-8aa7-90af267cf778","Path":"grouping-and-combining-elements.md","Order":3},{"Id":"2b7d1b69-627b-4c9a-ba85-893a756b534f","Path":"ungrouping-and-separating-elements.md","Order":4},{"Id":"9cd5b349-1732-47f8-9373-6379ba7ff012","Path":"add-new-elementscomponents-to-a-group.md","Order":1}],"Id":"19964638-c622-4660-b8a3-4441a3a390ea","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Element Groups","Languages":[{"Code":"en","Title":"Element Groups","Slug":"element-groups","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"8fc0df75-2a0b-4838-8636-f4cff0eeb3c6","Path":"anchors-and-pins-panel-2.md","Order":1},{"Id":"faed47e8-492e-49e6-99b4-e270c17cf445","Path":"anchors1-1.md","Order":2}],"Id":"3c7de0cd-ebd8-4cb1-8500-c7839252462e","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Anchors","Languages":[{"Code":"en","Title":"Anchors","Slug":"anchors-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"562478c6-0d75-493b-9a6e-550e1a099554","Path":"gallery-panel-filter-and-remove-elements.md","Order":1},{"Id":"77e23d50-3310-4dbc-824c-758c18cf35f6","Path":"gallery-panel2.md","Order":3},{"Id":"9937422f-8ccf-4d7b-8667-c82371eb4310","Path":"gallery-panel1.md","Order":2}],"Id":"c2f73413-5184-46a2-9b31-7863d3d53f17","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Gallery Panel","Languages":[{"Code":"en","Title":"Gallery Panel","Slug":"gallery-panel","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"cdc7e377-08a6-4153-aff0-a81d1d37bbec","Path":null,"Order":6,"CategoryType":0,"Icon":null,"Title":"Additional Features","Languages":[{"Code":"en","Title":"Additional Features","Slug":"additional-features","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"b35b6d79-7cb0-4a01-897d-8dc26073c9ec","Path":"creating-a-composite-glyph-layer.md","Order":5},{"Id":"48e9b778-6e63-4119-988f-8368f6997d35","Path":"composite-glyphs.md","Order":2},{"Id":"50f87a29-0b8f-4838-84cd-af520bbcab45","Path":"using-composite-glyphs.md","Order":6},{"Id":"3deffaca-509e-4808-9225-8d8a917f56c1","Path":"composite-and-auto-glyphs-1.md","Order":1},{"Id":"e7a4138d-5c9d-49ff-b7ea-0994e5f6610d","Path":"simple-glyphs.md","Order":3},{"Id":"4365d5ec-f7d7-4a05-9950-bc7691662e1b","Path":"editing-a-composite-glyph-layer.md","Order":4}],"Id":"4936f159-6e79-48fe-9535-27e59b55058d","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Composites","Languages":[{"Code":"en","Title":"Composites","Slug":"composites","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"bdaf2226-2e9b-44a7-9ad6-fbb8cf4a3b18","Path":"components2.md","Order":10},{"Id":"da60d528-a4a9-45cc-abc7-f7daecf06c85","Path":"converting-element-references-to-components.md","Order":6},{"Id":"5af21d40-9ee8-4173-b58c-9206f7790397","Path":"glyph-add-component.md","Order":14},{"Id":"86bb0220-0273-4788-b0ce-bdac7a33c81d","Path":"adding-components.md","Order":1},{"Id":"501a5a98-bc5d-4715-b9b9-12884a5d8860","Path":"working-with-components.md","Order":22},{"Id":"4eada089-f847-4e8e-868b-22f0331a5c82","Path":"nonspacing-components.md","Order":17},{"Id":"edd70d1c-e29a-4000-b43a-3c32affeefdd","Path":"components1.md","Order":11},{"Id":"e9bead6c-a751-435a-a4f2-b82c7e270d2e","Path":"opening-font-formats-that-support-components.md","Order":4},{"Id":"70cb841c-e73e-4eb4-9e72-a15a695b7369","Path":"differences-between-components-element-references.md","Order":13},{"Id":"b670bfd4-12f4-4339-b4ab-ec4748a6fcd1","Path":"start-using-components.md","Order":2},{"Id":"7038d045-7368-4451-ba0f-7a261008facd","Path":"components-coordinates-and-index.md","Order":20},{"Id":"ad89ded3-509a-4e01-8d21-5a899d4e5a55","Path":"components3.md","Order":7},{"Id":"7d1a5afc-3d2e-4c3c-82d2-c2908098dfd5","Path":"components.md","Order":9},{"Id":"eb5e48ba-cf10-4046-9c9d-25d593898176","Path":"opening-fontlab-files-vfc-vfj.md","Order":3},{"Id":"fd3a1c2d-4dce-4edb-963b-0473270213f6","Path":"components4.md","Order":8},{"Id":"1bcacad4-34f3-494e-8134-b92ba6d6d0a5","Path":"manually-adding-components.md","Order":16},{"Id":"062f78c7-52ea-4827-82ea-9e60ff9f1f73","Path":"replacing-a-component.md","Order":19},{"Id":"fba8e236-e8a2-46a7-b784-239e0c0c3ad2","Path":"components-and-element-references.md","Order":21},{"Id":"0d2b0a95-c5a7-4620-a388-8e5295fb6045","Path":"opening-font-formats-that-dont-support-components.md","Order":5},{"Id":"998d6e13-c8aa-4be7-989b-1ef99416a796","Path":"components-mode.md","Order":15},{"Id":"3a9dc4dd-77ce-49bb-a403-7d6d668057fc","Path":"replace-component.md","Order":18},{"Id":"08ad2573-00e7-43e9-8288-e94aec8ea1dd","Path":"copypaste.md","Order":12}],"Id":"e69bc272-056c-4d34-9d27-28bfcdc76c74","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Using Components","Languages":[{"Code":"en","Title":"Using Components","Slug":"using-components","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"b0866784-2de2-4463-809a-ef6a2708d284","Path":"copypasting-anchors.md","Order":8},{"Id":"0538236e-9c67-41c8-b574-f0f7e8ef0b73","Path":"renaming-anchors.md","Order":3},{"Id":"ee197fb5-95f3-4a23-8041-43739fe6f275","Path":"removing-anchors.md","Order":4},{"Id":"7b4561f1-dc18-4758-925a-d40692cca8ac","Path":"exporting-mark-attachment-features.md","Order":11},{"Id":"3029472d-b599-4197-a7d3-c56c2a29f6d4","Path":"anchors-2.md","Order":6},{"Id":"2519a177-402e-4e6c-b375-27016ee49f13","Path":"show-mark-attachment-no-longer-normalizes-text.md","Order":20},{"Id":"49905bd6-cdef-463c-bbb4-a33ef6a310aa","Path":"shift-anchors-with-contours.md","Order":19},{"Id":"3892add3-8405-43c3-907e-fa506477b0a0","Path":"anchors-in-auto-layers-and-composites.md","Order":17},{"Id":"5a3dba1f-ec3e-420d-b5fc-12e7544fc9a8","Path":"using-anchors-to-build-composites.md","Order":22},{"Id":"162f9c5e-fa1a-406a-80aa-971af5b9080d","Path":"custom-appearance-or-anchors-and-pins.md","Order":10},{"Id":"2ace87b1-cdab-43b5-9c60-b5c9bee941ad","Path":"moving-anchors.md","Order":5},{"Id":"c19ae4b1-36e6-45eb-9e29-973d36d4b1ff","Path":"linking-anchors.md","Order":7},{"Id":"cb3dc1a1-d50c-41f9-96f5-9012bae5e614","Path":"adding-anchors.md","Order":2},{"Id":"702352c4-7877-41df-a8f4-0c7f54b0ed3a","Path":"copying-anchors-and-pins.md","Order":9},{"Id":"1e4697dc-9f27-4c9d-9293-2431c13f8a9c","Path":"moving-anchors-and-contour-selections.md","Order":13},{"Id":"713d0704-50d3-4334-bc01-cf783afd56bb","Path":"activatingdeactivating-anchors.md","Order":1},{"Id":"50973c19-7c23-4fb7-a1e0-f4f5a63aeee1","Path":"selecting-anchors-and-pins.md","Order":18},{"Id":"df63b1fe-4bb2-43ca-b38f-e1c9ed4494ec","Path":"anchors-when-decomposing-composite-glyphs.md","Order":15},{"Id":"640eea45-80b6-4ede-b169-e35c5c7580ff","Path":"appearance-of-automaticallynamed-anchors.md","Order":12},{"Id":"ed9cc663-00d0-44df-835e-6f8904dab93d","Path":"slanting-anchors.md","Order":21},{"Id":"1f5670f7-b20c-432b-b103-1fc6248a609b","Path":"viewing-the-anchor-cloud.md","Order":23},{"Id":"3fc93891-32f5-4ab6-87c4-1ff742713684","Path":"anchors1.md","Order":14},{"Id":"5914098f-0a4a-4409-8e1a-148a87628c47","Path":"removing-anchors1.md","Order":16}],"Id":"4d9b4687-8c74-4eb2-a45b-ba7363cb80a6","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"Anchors, Pins and Mark Attachment","Languages":[{"Code":"en","Title":"Anchors, Pins and Mark Attachment","Slug":"anchors-pins-and-mark-attachment","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"afb90847-f40a-43c5-b8b8-b314ab910bc3","Path":"auto-glyphs-1.md","Order":1},{"Id":"176cdfb2-bbe3-4ef9-8c0d-de741609c683","Path":"finding-auto-glyphs.md","Order":5},{"Id":"33dab50c-f51a-484b-846c-dc9c7e677cdb","Path":"creating-custom-glyph-recipes.md","Order":3},{"Id":"78d0dc82-ac40-4cf0-94dd-2d99afe7a1fe","Path":"creating-an-auto-glyph-layer.md","Order":2},{"Id":"a4c58698-9d6b-4ceb-89ee-4df71a51e9c3","Path":"editing-an-auto-glyph.md","Order":6},{"Id":"73442c89-86a5-4dd5-96fa-3b031a61b4cc","Path":"using-auto-glyphs.md","Order":4}],"Id":"aebe93b5-9df7-4f75-86a5-51a79ec64189","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Auto-glyphs ???","Languages":[{"Code":"en","Title":"Auto-glyphs ???","Slug":"auto-glyphs","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"3b4ba823-6f73-496c-acb1-cc7f87a654b6","Path":"flatten-layer-and-flatten-glyph.md","Order":4},{"Id":"4a0a9509-b55b-4ab2-9bef-00db25cc58af","Path":"decomposing-composite-glyphs.md","Order":2},{"Id":"2255277e-3e8e-4f2c-b8fb-4fc7d941a6ac","Path":"remove-or-reorder-elementscomponents-while-in-font-window.md","Order":6},{"Id":"e5309ee4-3513-46e5-8b06-1f6a4d5d9b6a","Path":"decompose.md","Order":1},{"Id":"6401b6ba-7e9b-4bf1-8a81-1f79489f52f9","Path":"keep-source-glyphs.md","Order":5},{"Id":"1d5caefa-8a89-488c-81ed-f10e6a19f553","Path":"to-references.md","Order":7},{"Id":"182d021f-69fb-4729-a4bb-96ce5ab0f9a1","Path":"decomposing1.md","Order":3}],"Id":"b02ef804-29e6-4694-9841-ccbade063b2f","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"Decomposing","Languages":[{"Code":"en","Title":"Decomposing","Slug":"decomposing","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"f8eada6a-8689-4865-a0d4-b0a7b14410ff","Path":"live-auto-layers.md","Order":2},{"Id":"3dadfefe-56c7-457e-b02f-b4e6aae3a420","Path":"custom-auto-layers.md","Order":21},{"Id":"60917278-a3b3-48ba-88c5-a46241ff3611","Path":"live-auto-layers1.md","Order":27},{"Id":"6cee4e60-6f9a-4d11-84b0-b4e2005765b8","Path":"creating-dynamic-auto-layers-in-existing-glyphs.md","Order":7},{"Id":"36c33f44-b1c5-43e6-9859-bd34a18d7cc9","Path":"create-custom-auto-layers-in-multiple-existing-glyphs1.md","Order":14},{"Id":"05bdb2d3-c8ad-4def-be84-85722e5e0cab","Path":"custom-recipes.md","Order":22},{"Id":"f3011d6d-90ce-4608-a1f0-44fef0293619","Path":"composite-glyphs-and-auto-layers.md","Order":9},{"Id":"039248b9-7597-49c9-a5d3-c16731bc077f","Path":"work-with-auto-layers.md","Order":8},{"Id":"1fff008a-1dce-47b2-9ffa-5bf5035dcbbf","Path":"auto-layer-column-in-font-window-list-view.md","Order":30},{"Id":"63ab87e8-dd1d-4bf6-b578-86eddde9506a","Path":"turn-dynamic-auto-layers-into-custom-auto-layers.md","Order":29},{"Id":"79726fdc-55a0-4f37-9479-8ed9921f2197","Path":"turning-dynamic-auto-layers-into-custom-auto-layers.md","Order":1},{"Id":"9061117a-1d5b-4869-ac50-be485fc421fc","Path":"glyph-recipe-syntax-1.md","Order":25},{"Id":"e4d33526-0b9b-42ad-b7d0-e7d1716cb4ca","Path":"create-new-glyphs-as-auto-layers1.md","Order":16},{"Id":"38050e28-d836-4bea-a314-a40db9c9da13","Path":"create-auto-layers-in-existing-glyphs.md","Order":12},{"Id":"10053b54-0099-4c80-8ae4-15e7f71b34e2","Path":"dynamic-auto-layers.md","Order":3},{"Id":"96c97416-b97b-44f1-8a88-6ac6bbc1bf5e","Path":"extended-syntax.md","Order":24},{"Id":"0815e18d-b749-4967-aa8a-f517e7c39d18","Path":"unsupported-extended-syntax.md","Order":31},{"Id":"b3491858-d595-43aa-a2ae-c40ee678a1f3","Path":"auto-layers-for-all-masters-and-multiple-glyphs.md","Order":26},{"Id":"64634374-730a-4106-85ed-a7ffafd8b88d","Path":"auto-layers1.md","Order":5},{"Id":"b1c2d0d1-e3b6-4c0e-a2d2-5d6b0f6c708a","Path":"auto-layers-showing-builtin-recipes.md","Order":19},{"Id":"7e5ee4fb-5836-4aa5-a82b-7d2bbb4c9f14","Path":"create-new-glyphs-as-auto-layers.md","Order":10},{"Id":"75dd3ed4-8f76-48b4-aea5-356afcb1da95","Path":"simple-syntax.md","Order":28},{"Id":"52ea0d31-550c-4fa9-8a46-def78d1130ed","Path":"custom-auto-layers1.md","Order":20},{"Id":"1334ae2f-3f5a-4b17-8f5b-c140a7f200e8","Path":"create-custom-auto-layers-in-multiple-existing-glyphs.md","Order":11},{"Id":"79b2a70d-9bf1-42d8-b1ef-d893f6e1ff86","Path":"dynamic-auto-layers1.md","Order":23},{"Id":"ebcd1bc5-84fe-42e8-93e0-c6d56e8265c5","Path":"create-auto-layers-in-existing-glyphs1.md","Order":13},{"Id":"f92fb073-da58-4125-9a3f-f85b06356a80","Path":"comments-and-glyph-notes.md","Order":17},{"Id":"010a6b50-4448-4d14-97f8-8d7dbfe36147","Path":"creating-new-glyphs-as-auto-layers.md","Order":4},{"Id":"3af2ade8-27c0-4550-b728-00c3c18719a2","Path":"auto-layers2.md","Order":6},{"Id":"0eda9bf6-0cdd-4187-9e76-1d91b1da9244","Path":"r-composite-glyphs-and-auto-layers.md","Order":32},{"Id":"b818efae-10f8-4947-84af-1bf781839e33","Path":"copy-recipes.md","Order":15},{"Id":"e4eccd57-af6c-470e-be2c-5435b88ea946","Path":"work-with-auto-layers1.md","Order":33},{"Id":"bbf12f02-9b56-450f-ba46-50fa456d06c9","Path":"auto-layers3.md","Order":18}],"Id":"871b1fe0-ee1e-4690-aa3b-a57b443612ed","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Auto layers","Languages":[{"Code":"en","Title":"Auto layers","Slug":"auto-layers","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"32767ff7-12db-4310-8241-ec229dc025d9","Path":"anchors-pins-panel.md","Order":2},{"Id":"44c9fa9e-542f-43af-975c-51f42d18a42e","Path":"manual-composite-layers.md","Order":5},{"Id":"a0782265-8815-4a08-b51a-30ab464738a9","Path":"quicker-selection-of-anchors.md","Order":6},{"Id":"a4a3137b-34b7-4ecf-a23e-9387e190b69e","Path":"variable-components.md","Order":7},{"Id":"84342dba-4978-46b5-8332-09b59c73f714","Path":"anchor-expressions.md","Order":1},{"Id":"e21ffb8c-b3fb-45c7-940e-2458562b1278","Path":"attached-components.md","Order":3},{"Id":"6312ec69-990d-4db7-9d20-64c50575702a","Path":"auto-layers-2.md","Order":4}],"Id":"74f578dc-88fb-44d8-a2b0-0de05915467b","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Components and anchors","Languages":[{"Code":"en","Title":"Components and anchors","Slug":"components-and-anchors","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"5c1864a5-f992-4891-8e4f-f28fb23c2de6","Path":"references-mode.md","Order":9},{"Id":"cb41adb5-5015-422c-bc63-94093eed113c","Path":"element-references2.md","Order":1},{"Id":"335c1e5a-eaf2-4668-9f57-3ef4fecc4bd3","Path":"reusing-elements.md","Order":10},{"Id":"083fc0fe-7209-408f-82e4-c2e2da18b67c","Path":"append-glyphs-now-uses-references.md","Order":3},{"Id":"7a9a5f4b-29a1-42c4-8fc2-2d4d8ceffd29","Path":"using-elements-1.md","Order":11},{"Id":"f102d5b7-4ce3-4a50-b8c4-b802eaa6f0e6","Path":"element-references4.md","Order":5},{"Id":"e48c050a-264d-4d2d-adc7-1047aa52b49d","Path":"element-references3.md","Order":4},{"Id":"31ba5133-d2d4-4d28-9419-969b0f843e02","Path":"element-references5.md","Order":6},{"Id":"7d3b923d-de3f-4a9f-9691-76d94686cfd8","Path":"element-references1.md","Order":2},{"Id":"bb961c58-2fc2-4f41-beb7-b360d469ac27","Path":"elements-3.md","Order":8},{"Id":"e5f4949e-ebd4-4ad7-a040-d94e20e607da","Path":"element-references6.md","Order":7}],"Id":"3360f646-c0eb-4e49-9cfa-e9db73a50fd4","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Element References","Languages":[{"Code":"en","Title":"Element References","Slug":"element-references","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"916825c8-46ce-4f81-9352-8ed251e9dfe2","Path":"compound-element.md","Order":2},{"Id":"0094efbc-b682-40aa-93d0-508039d6878b","Path":"element-references-1.md","Order":9},{"Id":"c499ee3d-d05c-4cd2-a18e-92083e149b34","Path":"elements-panel-3.md","Order":11},{"Id":"ddd4d103-ae8a-4e4d-abb7-76e77aea2183","Path":"elements-4.md","Order":12},{"Id":"76578f5e-be3e-4c99-bb18-4590855a1688","Path":"reuse-portions-of-glyphs.md","Order":14},{"Id":"e6fe28d9-7ec0-4247-99b7-b5307672c4ef","Path":"element-references1-1.md","Order":8},{"Id":"52773c16-250f-47b0-acf8-f94eb5c3757b","Path":"contour-element.md","Order":3},{"Id":"0ac45814-a523-4e7a-b8a8-4cfb5aea94a4","Path":"copy-contour.md","Order":6},{"Id":"71ec77a8-ad8f-41c4-8db6-016fe0f40b5a","Path":"copied-elements.md","Order":5},{"Id":"97ceda0f-c033-42bb-b55f-631cdb098ab5","Path":"image-element.md","Order":13},{"Id":"e4dae495-0a75-4e9d-82b3-306f256313cc","Path":"element-element-reference-add-contours.md","Order":7},{"Id":"460b1340-72b6-4267-bbce-98bcf541524a","Path":"add-element-reference-add-contours.md","Order":1},{"Id":"de61f325-fc03-4714-8fc8-3e3631d33502","Path":"what-is.md","Order":16},{"Id":"b7b18753-5bd5-4d09-9144-4e0e16b48517","Path":"element-types.md","Order":10},{"Id":"176dac55-553f-4abd-b141-9ff4fa2019e4","Path":"copied-contours.md","Order":4},{"Id":"6101d61a-24ea-4843-af0f-690d202f732f","Path":"svg-element.md","Order":15}],"Id":"72d64f06-dadf-4c84-9525-865dce5e5783","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Element Basics","Languages":[{"Code":"en","Title":"Element Basics","Slug":"element-basics","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"73beb4c5-3f3c-40df-84aa-68d4b6fade75","Path":"activating-components-in-glyph-window.md","Order":22},{"Id":"27f56af4-b3c9-44b0-ada7-ad5faeb244e4","Path":"active-elements-when-you-open-a-glyph.md","Order":23},{"Id":"55e08f7a-0c44-4d86-a0a0-2efb599bf80c","Path":"unfill-element-references-in-element-groups.md","Order":25},{"Id":"a6999bf5-5117-4e40-8a15-06ba89b363aa","Path":"copying-elements.md","Order":9},{"Id":"40b3733d-365e-40d0-ae33-9a0a5340fdf4","Path":"metrics-when-inserting-a-component-or-reference.md","Order":20},{"Id":"b3322a1d-b522-449c-a540-e906a4d12f88","Path":"other-improvements-1.md","Order":21},{"Id":"bacc8983-3fcb-4cb3-96b0-3f2de5dd4834","Path":"transforming-elements.md","Order":11},{"Id":"7e786d36-971d-4f31-991d-067c1dae7f12","Path":"browsing-elements.md","Order":5},{"Id":"437e7fa9-9c16-4265-821e-5395690686c2","Path":"element-menu-1.md","Order":15},{"Id":"254a869f-b86b-4de7-9f47-ba0f72ef80f2","Path":"copied-elements-1.md","Order":8},{"Id":"6142d4d7-ee83-4305-b044-3969be3fb21d","Path":"copied-contours-1.md","Order":7},{"Id":"37e2eed9-9a54-43dd-b69e-87c06d9093f0","Path":"selecting-and-deselecting-elements.md","Order":16},{"Id":"11ef4dea-fb89-4101-9d28-bf3c80b68b71","Path":"combine-contours-to-element.md","Order":6},{"Id":"edadfd70-733b-4f7f-9c9f-a6f776d58e8f","Path":"edit-across-elements.md","Order":17},{"Id":"7ec9ca2c-2d3b-4a00-8e41-f9b390df313c","Path":"join-open-contours-across-elements.md","Order":18},{"Id":"9f13726b-41e8-4761-942e-20db66a99f16","Path":"detecting-element-references-or-composites-1.md","Order":12},{"Id":"9a292973-2d88-493e-acee-51128150f75f","Path":"elementscomponents-in-scoreboard.md","Order":19},{"Id":"b1045327-68b2-41a2-863e-8cd057358d8c","Path":"custom-glyph-metrics-in-auto-layers.md","Order":24},{"Id":"4f1b7684-e347-4c69-9ed8-7f0b5b404d89","Path":"add-element-reference-add-contours-1.md","Order":3},{"Id":"d693d80a-8c43-4a6c-b7bc-e65e364324ed","Path":"aligning-elements.md","Order":4},{"Id":"19325944-abf2-44c9-bdc8-d0e279a4e0a1","Path":"element-frame.md","Order":14},{"Id":"749f24f5-2b45-4169-9d5e-10cf9ad1bda1","Path":"using-named-elements.md","Order":13},{"Id":"0bb3f97d-f15c-42f4-b9f2-974626a756ab","Path":"creating-new-elements.md","Order":10}],"Id":"339fa3d9-620d-4469-b416-38d8e54d8f60","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"Elements","Languages":[{"Code":"en","Title":"Elements","Slug":"elements","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"49cd99ba-3308-4df5-a57f-2a79cea0af0a","Path":"reusing-portions-of-glyphs.md","Order":2}],"Id":"78a745b7-b574-4254-8d4d-7f5c33ac010c","Path":null,"Order":8,"CategoryType":0,"Icon":null,"Title":"Components and Elements","Languages":[{"Code":"en","Title":"Components and Elements","Slug":"components-and-elements","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"15716227-dbf5-48ae-b232-cc4743d0d404","Path":"fontlevel-hinting.md","Order":5},{"Id":"74eba905-150a-4552-aab2-98a127ca316e","Path":"family-alignment-zones.md","Order":4},{"Id":"b17bd6b5-1708-4be5-bf73-b05335e81479","Path":"standard-stem-widths.md","Order":7},{"Id":"bfa275b5-31d4-4eda-9fc7-c4c046b82c65","Path":"truetype-alignment-zones.md","Order":8},{"Id":"4238f5a1-dfc3-46a6-909a-1ea6de96ca46","Path":"alignment-zones.md","Order":1},{"Id":"5eb2d4c3-fbbc-478f-8259-98eab65c7c84","Path":"coordinate-rounding-gridfitting.md","Order":2},{"Id":"d75a04ed-fb97-437b-96cc-febda79a2a8b","Path":"how-fontlab-calculates-alignment-zones.md","Order":6},{"Id":"a593ddf4-7ba2-4ba4-b5bf-46fb3a938fb8","Path":"editing-alignment-zones.md","Order":3},{"Id":"96cc9708-1796-4a20-ae72-00c813226192","Path":"truetype-and-postscript-hints.md","Order":9}],"Id":"50bcd2b4-7a1b-4481-91ce-1f7d69cc7abb","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"Introduction to Hinting","Languages":[{"Code":"en","Title":"Introduction to Hinting","Slug":"introduction-to-hinting","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"ee61bd68-37c2-4405-8053-d659de82176c","Path":"finetuning-the-tt-autohinting-results.md","Order":16},{"Id":"f19bad31-4c3e-4dbc-9e18-0b0f558a9657","Path":"resetting-truetype-hints.md","Order":10},{"Id":"bebd64a1-8d84-48d0-9f54-1e9209ee3ce8","Path":"truetype-hinting-3.md","Order":13},{"Id":"b1e52f79-3e47-42ab-b6c4-c6beb751c90e","Path":"font-info-7.md","Order":3},{"Id":"077eaee7-1055-4ce4-8b94-d118da71accb","Path":"hints-and-power-guides-1.md","Order":5},{"Id":"36ca8374-bc4f-4c6c-990f-b2b86f747992","Path":"tt-hinting-ui-elements.md","Order":2},{"Id":"0fa8b7b1-471f-4a61-82c9-a4084eb16041","Path":"sequence-of-commands.md","Order":11},{"Id":"aacc64be-4f23-496d-b34c-4d38e86ae382","Path":"preferences-7.md","Order":7},{"Id":"3b2a4d3f-d7a7-4bbb-bbc6-6bd7101a6e37","Path":"text-waterfall-ppms.md","Order":12},{"Id":"a17584a3-e498-498e-a6cc-3d8b54e8a280","Path":"no-hinting-above-this-ppm.md","Order":14},{"Id":"4f87b91f-245d-4148-a390-4739888afc2c","Path":"profiles-1.md","Order":6},{"Id":"a6c4e5fe-216c-4f40-a1f4-e448ffb5f0ad","Path":"application-windows.md","Order":1},{"Id":"0738802d-5dae-41eb-b5a2-0ba153eece72","Path":"no-zone-alignment-above-this-ppm.md","Order":9},{"Id":"9bdb1c05-b214-4428-8c07-e6e850d4e204","Path":"truetype-outlines-and-tt-hinting.md","Order":4},{"Id":"52666581-90d4-484f-a820-6f5b4444617d","Path":"glyph-waterfall-ppms.md","Order":15},{"Id":"a7e8f10d-3bb1-43c4-8473-72c566c8e044","Path":"visual-truetype-hints.md","Order":17},{"Id":"d21bb38d-48b9-4041-8f23-a0aeb692f8de","Path":"outline-conversion-and-tt-autohinting.md","Order":8}],"Id":"5e72b4a7-afc1-4240-a909-305699affded","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"TrueType Hiting","Languages":[{"Code":"en","Title":"TrueType Hiting","Slug":"truetype-hiting","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"27c220f4-9f8a-4481-b823-2e75cdf0a6b3","Path":"reassigning-zones.md","Order":11},{"Id":"c339d84f-b73f-4e3e-98ee-f5622901cdf3","Path":"hinting-in-otf.md","Order":4},{"Id":"e78ccfc4-e827-4e5a-90df-833d91d0df5a","Path":"using-stem-tags.md","Order":8},{"Id":"7a53a67d-770a-4a6e-a303-cb0f3cffb369","Path":"hints-2.md","Order":6},{"Id":"dcb8e8e4-fdca-4681-88c3-8a0e47283dc4","Path":"editing-links.md","Order":16},{"Id":"dd9569b8-2128-4455-b9ea-ce5e0504ec60","Path":"stems-rounding.md","Order":2},{"Id":"b24e00e6-bca1-49da-8f35-66c1c84be7da","Path":"hints1.md","Order":5},{"Id":"50077679-8ebc-488d-be82-593680eaa41f","Path":"editing-hints.md","Order":17},{"Id":"23160e36-a6bf-48dd-b4fa-c4cfcf5aa4c6","Path":"reassigning-stems.md","Order":10},{"Id":"19a86abc-a12e-44ee-8c0f-326cd512bf18","Path":"calculation-of-zones-hints-and-guides-thickness.md","Order":1},{"Id":"a44d2ea2-dd3b-4822-921c-ec4381f30bfb","Path":"linked-nodes-and-power-guides.md","Order":7},{"Id":"3b6540cd-20c8-41c6-a6ff-dc25acdc9b22","Path":"hinting-actions-2.md","Order":15},{"Id":"5d8f59fd-968a-4f6c-a310-a7ff3dbf019c","Path":"remove-hints.md","Order":13},{"Id":"a8f0f380-c8e2-48a7-9347-1f0cc6a8b5f6","Path":"sample-texts.md","Order":12},{"Id":"abeddf26-aa55-4d72-9287-e208df2448e7","Path":"standard-stems.md","Order":9},{"Id":"e0c17584-e691-4338-9ce9-54680354cbdc","Path":"links.md","Order":14},{"Id":"b57ec76d-85ce-4cd9-af96-021721a97989","Path":"stem-snap-precision.md","Order":3}],"Id":"3ee3d3c3-7aba-451a-87a5-5b3b9e5f1e2f","Path":"hinting-1.md","Order":2,"CategoryType":1,"Icon":null,"Title":"Hinting","Languages":[{"Code":"en","Title":"Hinting","Slug":"hinting-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"0ba8fc48-042f-4664-bad8-b26a8a642a83","Path":"adding-tt-authohint.md","Order":1},{"Id":"1842ee03-3155-476a-8957-62d857e4c56a","Path":"autohint-1.md","Order":2},{"Id":"f5a36ca5-f5f8-42a7-ae9f-7ad3ef3f9fea","Path":"autohinting1.md","Order":3},{"Id":"808e13ba-cf5d-497e-a8ef-1c2ab451509a","Path":"autohinting2.md","Order":4},{"Id":"aba9c206-e900-4edd-b580-05db6d1043e4","Path":"automatic-hinting-1.md","Order":6},{"Id":"cb1bdf09-88de-4aaf-a611-49737ac1a91b","Path":"autohinting3.md","Order":5}],"Id":"3a249561-a649-4045-ac2a-e75b5ab3ee1c","Path":null,"Order":12,"CategoryType":0,"Icon":null,"Title":"Autohinting","Languages":[{"Code":"en","Title":"Autohinting","Slug":"autohinting","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"b00b9fa7-dd53-4379-ad5d-1af5c96a6e65","Path":"postscript-outlines-and-ps-hinting.md","Order":10},{"Id":"48d5bffa-e2a2-49b4-ae25-959e534754a4","Path":"manually-adding-hints-with-the-magnet-tool.md","Order":5},{"Id":"76345462-a1b4-4ea5-a0c8-5eb79515329c","Path":"postscript-hinting1.md","Order":9},{"Id":"f9fdd245-0e4d-41c5-b296-4e002ca690e5","Path":"ps-hinting-ui-elements.md","Order":13},{"Id":"222f3c84-bf5a-4171-8f87-59b1e6164c25","Path":"font-info-6.md","Order":7},{"Id":"b7e930ac-326c-4ca6-90d0-5f6043384b09","Path":"ps-autohinting.md","Order":12},{"Id":"7cd8a418-3898-45a9-9a5e-4431a2de32c4","Path":"ghost-hints-1.md","Order":4},{"Id":"2c69cc1b-9c17-4a8b-8ecf-040df1d4c1b5","Path":"opening-fonts.md","Order":6},{"Id":"278ed5fc-b96d-4e72-9773-fd562191867d","Path":"postscript-and-truetype-standard-stems.md","Order":1},{"Id":"dd60d3fc-43ec-45f1-ac36-e0eba1d7cef9","Path":"hinting-a-font-2.md","Order":2},{"Id":"74da9f14-fed4-4b1c-b2b9-3f2fc23609e4","Path":"adding-postscript-autohint.md","Order":8},{"Id":"bbebe35b-3098-4124-8cdc-c8b9a6a22c7b","Path":"glyph-window-8.md","Order":3},{"Id":"c73bd28b-8b47-4c75-832c-73bf8f19e7a9","Path":"stdw-vs-1.md","Order":15},{"Id":"51047240-7f33-466e-a6d8-a44d101bee16","Path":"zones.md","Order":17},{"Id":"dc13d3b0-4064-43e2-8119-516a9377ae00","Path":"profiles.md","Order":11},{"Id":"19e8e8c9-eaa3-4c54-a84b-ab03325dcd15","Path":"removing-hints.md","Order":14},{"Id":"4b3ebbda-6b00-4136-9052-bb6229c751ae","Path":"stems-1.md","Order":16}],"Id":"41480755-c9df-4e25-89d3-fcb8bf26d377","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"PostScript Hinting","Languages":[{"Code":"en","Title":"PostScript Hinting","Slug":"postscript-hinting","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"394c36b3-e2a9-470b-9ed1-79f907733289","Path":"autohint.md","Order":1},{"Id":"4bcf0e65-3f0e-46e4-82a5-79e037b5ec94","Path":"postscript-hints.md","Order":2},{"Id":"a76d19cd-6abd-485f-90e8-9188544cd215","Path":"truetype-hinting-2.md","Order":4},{"Id":"404b8d78-277f-43f1-9182-5c620df71b59","Path":"stdw-vs.md","Order":3}],"Id":"e5d15e22-134a-4972-b76f-4921998f9a94","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Hints","Languages":[{"Code":"en","Title":"Hints","Slug":"hints","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"bca13238-8dc9-4ddd-8e0c-4315a681dd41","Path":"hinting-4.md","Order":6},{"Id":"fe2254e0-b0a5-4e21-8fe3-ed9f429f252f","Path":"autohinting-glyphs-with-overlaps.md","Order":8},{"Id":"aa2cee67-2732-4636-af19-d51facb47e23","Path":"postscript-hinting-in-ufo.md","Order":9},{"Id":"8185820e-eeab-479e-9746-2b49ccdead77","Path":"problematic-zones.md","Order":10},{"Id":"d2c12658-21b9-4b4e-8fb3-d269c83f1cd5","Path":"truetype-hinting-in-ufo.md","Order":11},{"Id":"404771d2-011e-4b98-b649-e166d819a41a","Path":"converting-guides-into-alignment-zones-or-hints.md","Order":7}],"Id":"328fa175-54fd-4ff4-9050-b2faa59e156f","Path":null,"Order":9,"CategoryType":0,"Icon":null,"Title":"Hinting a Font","Languages":[{"Code":"en","Title":"Hinting a Font","Slug":"hinting-a-font","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"fe945987-dde1-4443-8cfe-d0201929fbb6","Path":"tba-5.md","Order":1}],"Id":"c943a35b-5d12-4ac3-bac5-f9f78bd42039","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"TypeRig","Languages":[{"Code":"en","Title":"TypeRig","Slug":"typerig","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"836625b7-7dc4-461b-a9a4-7db8fa381b31","Path":"tba-4.md","Order":1}],"Id":"5cf23370-58b7-49f3-9269-27ad2d1327cd","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"BetterTouchTool","Languages":[{"Code":"en","Title":"BetterTouchTool","Slug":"bettertouchtool","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"bd12ec80-342a-4a01-8873-6b941993f8d2","Path":"more-voltrelated-tools-1.md","Order":4},{"Id":"791d456e-f8ee-424e-87d3-628772d2a14f","Path":"sample-volt-fonts-2.md","Order":5},{"Id":"169e4c57-c859-4059-b8ec-f973639a56fe","Path":"exporting-fea-features-to-volt-1.md","Order":1},{"Id":"9d63551d-0374-438d-940b-30a6017a9b51","Path":"microsoft-volt-and-features-for-complex-scripts-1.md","Order":3},{"Id":"11b8085e-30e3-4f45-879b-19144a2dd008","Path":"using-microsoft-volt-2.md","Order":6},{"Id":"c2083892-1ccf-4bfb-87a9-7daf3815817f","Path":"fontlab-and-ms-volt.md","Order":2}],"Id":"a965ed60-871e-4568-b80b-75133a23d576","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"MS VOLT","Languages":[{"Code":"en","Title":"MS VOLT","Slug":"ms-volt","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"867bc73f-4640-4105-9f0c-f2b27e9e9880","Path":"installupdate-typerig.md","Order":1},{"Id":"6627cfe0-8c4a-434f-b685-4c3bd24b4ee6","Path":"typerig-delta-machine-2.md","Order":3},{"Id":"82bad312-93a8-443d-a594-945486a38f4b","Path":"typerig-panel.md","Order":5},{"Id":"48b980ad-8146-42f9-80ad-ee6a88641b45","Path":"other-typerig-plugins.md","Order":2},{"Id":"84179c15-62d1-4bb6-bc8e-9369ce17a217","Path":"typerig-is-a-powerful-set-of-extensions-for-fontlab-7.md","Order":4}],"Id":"9e3fafe6-7d8e-464c-8dd1-e22033033dc6","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"TypeRig & Delta Machine","Languages":[{"Code":"en","Title":"TypeRig & Delta Machine","Slug":"typerig-delta-machine","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"4ccd1770-e2a8-4780-93c6-44090c863fc1","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"Third-Party Tools","Languages":[{"Code":"en","Title":"Third-Party Tools","Slug":"third-party-tools","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"1f85ca0c-abe7-421e-90eb-40503b22b871","Path":"customizing-keyboard-shortcuts-1.md","Order":1},{"Id":"3a8a5941-ae39-41b6-a03c-3659ff320444","Path":"kbs.md","Order":4},{"Id":"dfbf19e0-62f7-47f8-8485-f618cca929d0","Path":"menu-items.md","Order":5},{"Id":"ab92fae9-d386-4315-af60-c4b5302e50c9","Path":"removing-existing-keyboard-shortcut.md","Order":6},{"Id":"1c2502a1-6757-421c-9326-39c898d38810","Path":"resetting-all-fontlab-keyboard-shortcuts.md","Order":7},{"Id":"595ccf5e-2317-43cb-9cb9-0dae7265bfdb","Path":"defining-a-new-keyboard-shortcut.md","Order":2},{"Id":"422473f0-6c13-4412-8900-c3b4fe8b668e","Path":"importing-and-exporting-keyboard-shortcuts.md","Order":3}],"Id":"36293436-0016-449a-9a37-4f652ab360ce","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Keyboard Shortcuts","Languages":[{"Code":"en","Title":"Keyboard Shortcuts","Slug":"keyboard-shortcuts","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"b5f4fef5-7aa3-44c4-9a55-0a49297b07f0","Path":"local-data-folder.md","Order":3},{"Id":"cd6f809d-039c-4fd3-b704-7426ac9c83ec","Path":"shared-user-data-folder.md","Order":5},{"Id":"b9514c8d-c0c8-447a-8a1d-4bebab51f759","Path":"user-data-folder.md","Order":6},{"Id":"0a1107b8-65ee-479b-b0fc-91710e7216d6","Path":"custom-data-files-and-locations-1.md","Order":2},{"Id":"8e9b003c-356e-46a0-87a3-d62822497787","Path":"app-data-folder.md","Order":1},{"Id":"03ad9e75-0c27-46f7-b4fa-d3fc774c2e0e","Path":"shared-app-data-folder.md","Order":4}],"Id":"c8b24826-3e24-4c05-ba1e-1ac49110adf5","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Data Folders","Languages":[{"Code":"en","Title":"Data Folders","Slug":"data-folders","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"43e064e5-ff02-4a87-b85c-8ab94482d629","Path":"specific-file-information.md","Order":1},{"Id":"46080fa1-513b-434a-ae4c-a3320e1a9754","Path":"encoding-files.md","Order":2},{"Id":"e02f59b3-786c-47fe-b228-ac808d6cf574","Path":"custom-codepage-definitions.md","Order":4},{"Id":"967bca68-3647-4169-aabf-7f9268534fb8","Path":"unicode-ranges-uranges.md","Order":5},{"Id":"63460792-366d-423b-835e-afd841698b2e","Path":"glyph-name-to-unicode-mapping-rules-standard.md","Order":3}],"Id":"c8086ffa-bad9-4ab0-a7e1-3e74f3b89e48","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"Customized Files","Languages":[{"Code":"en","Title":"Customized Files","Slug":"customized-files","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"377f21f5-d3ac-4d17-8d1e-3dfd8f3e8613","Path":"lib-font-master-glyph-layer.md","Order":6},{"Id":"be5dca9a-f0da-4ee0-a383-67dc62dcd967","Path":"metrics-expressions-in-glif.md","Order":7},{"Id":"a0007661-63eb-492f-bbb4-217dd969da0e","Path":"auto-layers-in-glif.md","Order":4},{"Id":"21f2aadc-0647-4b8b-8801-43e401f69468","Path":"designspace-ufo-and-glif-lib.md","Order":5}],"Id":"7b2ecb41-dbf9-4d69-95b9-aecd281dcbd5","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Customizing FontLab","Languages":[{"Code":"en","Title":"Customizing FontLab","Slug":"customizing-fontlab","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"6af7c6c1-9393-4e8a-9ee4-bc2d8a11d219","Path":"typerig-2.md","Order":9},{"Id":"d3c8f87e-13fd-40af-997b-e9a776673b5e","Path":"anchors-in-python.md","Order":1},{"Id":"cf27a8e9-69fd-48ab-aa07-aaa99e5fbf3c","Path":"preferences-in-python-1.md","Order":6},{"Id":"cd4f3ea2-aa5d-40fc-aec8-c31b31e47e23","Path":"autokerning-in-python.md","Order":2},{"Id":"af8f6a01-db09-42d7-a854-dc89bc169e9f","Path":"python-api.md","Order":7},{"Id":"46eeb969-3c0e-4e44-bbdd-152d2bc0bfa5","Path":"fontlab-and-fontgate.md","Order":4},{"Id":"be5db1f7-c62d-4db4-804b-5c0a6d2a9527","Path":"fl.md","Order":3},{"Id":"1bead392-8aef-47fb-a2e9-f240fe021871","Path":"lib-in-python.md","Order":5},{"Id":"2afbed78-c2e5-4595-8c8c-bbb18f80933b","Path":"pythonqt-1.md","Order":8}],"Id":"4dc5b747-e85e-4eaf-9a1f-6591cb54a56c","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Improvements","Languages":[{"Code":"en","Title":"Improvements","Slug":"improvements","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"5b7c415e-9da9-408f-b0d5-7ba1fc434681","Path":"scripting-with-python-1.md","Order":1},{"Id":"e46f2df8-ab98-471b-9d07-b04e17184395","Path":"scripts-menu-1.md","Order":2},{"Id":"1602ec28-3878-401f-b9e9-0f0d177e5e57","Path":"fontlab-7-python-api.md","Order":3}],"Id":"51767b3e-0a1c-48d4-9691-dbe2e809cc15","Path":"extending-fontlab-7.md","Order":1,"CategoryType":1,"Icon":null,"Title":"Extending FontLab 7","Languages":[{"Code":"en","Title":"Extending FontLab 7","Slug":"extending-fontlab-7","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"c6998ee5-c9a5-4f80-b450-d4a7000904ee","Path":"execute.md","Order":2},{"Id":"1e6963da-3d85-4a06-b84a-b377e430ac72","Path":"additions-to-the-fontlab-7-python-api.md","Order":1},{"Id":"9eba995a-b1ea-4dfb-9c6c-fc6561be50b6","Path":"exporting-fonts-via-python.md","Order":6},{"Id":"ba98dfe0-b016-4fe5-9bba-03f4e8a7e498","Path":"typerig-with-delta-machine.md","Order":3},{"Id":"2d8d5dbc-32e2-423f-9b0a-57352d4db9a4","Path":"python-scripting1.md","Order":4},{"Id":"d03bdbf5-f187-4bdc-bec0-4113330cfcdb","Path":"scripting-panel-3.md","Order":5}],"Id":"284554dd-ace9-4986-974e-f9a89895ece7","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"Python scripting","Languages":[{"Code":"en","Title":"Python scripting","Slug":"python-scripting","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"e01dfa72-7b23-41b6-abf5-fdf6c2591b97","Path":"scripts.md","Order":4}],"Id":"63bff4c2-9a15-4ab6-acf6-998a3a52e16d","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Scripting","Languages":[{"Code":"en","Title":"Scripting","Slug":"scripting","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"aaf2188c-f0c1-429e-abbc-19a5acfc7c08","Path":null,"Order":13,"CategoryType":0,"Icon":null,"Title":"Customizing and Extending","Languages":[{"Code":"en","Title":"Customizing and Extending","Slug":"customizing-and-extending","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"df910271-0940-44f7-9f1a-00496473cdc1","Path":"unicode-ranges-uranges-1.md","Order":5},{"Id":"db98d0a9-492e-4f37-bf2e-a2563d51600c","Path":"specific-file-information-1.md","Order":4},{"Id":"dade5861-8f94-4c80-bbb7-1828d5268dea","Path":"custom-codepage-definitions-1.md","Order":1},{"Id":"8f2a4f44-1e6a-4854-b9be-48bbdddbd039","Path":"glyph-name-to-unicode-mapping-rules-standard-1.md","Order":3},{"Id":"63ca42a3-b0ff-496a-b238-9e2812e0de80","Path":"encoding-files-1.md","Order":2}],"Id":"56fd36c6-30cb-41c8-ad87-acb946eafa1e","Path":null,"Order":11,"CategoryType":0,"Icon":null,"Title":"Customized Files","Languages":[{"Code":"en","Title":"Customized Files","Slug":"customized-files-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"cff8532f-1e51-4d10-b8f2-0af1c4a8817b","Path":"sidebearings-3.md","Order":4},{"Id":"b340a3cc-5242-4ae6-8eb1-9b09fd053298","Path":"vertical-glyph-metrics.md","Order":5},{"Id":"328b5237-6033-4704-95b0-2612a6c53e67","Path":"sidebearings-and-the-measurement-line.md","Order":2},{"Id":"a8b5f376-46c5-4705-81cd-f352d184aacd","Path":"horizontal-glyph-metrics.md","Order":1},{"Id":"530de18e-1549-4389-b074-5e61aa7b09eb","Path":"sidebearings-in-slanted-or-italic.md","Order":3}],"Id":"211144c7-e436-4454-ac0b-450ec88fa228","Path":null,"Order":12,"CategoryType":0,"Icon":null,"Title":"Glyph Metrics","Languages":[{"Code":"en","Title":"Glyph Metrics","Slug":"glyph-metrics-2","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"c24682c5-fd75-4d60-be67-573693a820a3","Path":"filled-and-unfilled-contours.md","Order":4},{"Id":"75dfc63e-7cd1-4951-a20c-14f041b0a886","Path":"terminology.md","Order":6},{"Id":"4bd8143d-db4d-4aa3-837b-5ac32a9d33ed","Path":"startpoint.md","Order":5},{"Id":"ed52e8e3-da69-4420-910f-43ab6a738058","Path":"closed-and-open-contours.md","Order":1},{"Id":"131e54b0-27d8-4406-8bc7-64c87f3682c9","Path":"compound-contours.md","Order":2},{"Id":"e56f0b40-228b-4a01-a58b-cde3e49a693e","Path":"contour-direction.md","Order":3}],"Id":"e4412d20-b1dd-4e3d-a4d2-1979b5aa1fa2","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Contours","Languages":[{"Code":"en","Title":"Contours","Slug":"contours-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"01a33c9e-e8f1-40c4-b52d-a653ca678f9a","Path":"handles.md","Order":2},{"Id":"5bf4b783-03f8-422b-a8c1-e52d52a0c7e0","Path":"nodespoints.md","Order":3},{"Id":"145d3b31-b421-4a33-9459-b62e15866cbc","Path":"types-of-connections.md","Order":5},{"Id":"370ad4ed-ce2e-43f0-97c3-290888cb3212","Path":"servant-nodes-1.md","Order":4},{"Id":"3bd0b989-496e-4487-818b-1a2304054a3b","Path":"genius-nodes-1.md","Order":1},{"Id":"8af120cd-1cab-4533-a5bc-424736db01f2","Path":"types-of-nodes.md","Order":6}],"Id":"0ff0b8ba-b6bb-4dc9-b528-10feb4c7a42f","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"Points","Languages":[{"Code":"en","Title":"Points","Slug":"points","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"9ada0926-2a73-455d-b29c-3b47542938c8","Path":"marks.md","Order":2},{"Id":"98440352-bbb0-4627-9dba-45eda4243dd9","Path":"glyph-positioning-1.md","Order":1}],"Id":"10c790e2-f8a3-4de8-bd68-98e1ffdf22f7","Path":null,"Order":9,"CategoryType":0,"Icon":null,"Title":"Mark Attachment","Languages":[{"Code":"en","Title":"Mark Attachment","Slug":"mark-attachment","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"8aab4368-bb10-4b00-b7e0-2d8539c25028","Path":"local-data-folder-1.md","Order":3},{"Id":"8db6896d-71d7-4285-b5a4-6591cba1da56","Path":"shared-user-data-folder-1.md","Order":5},{"Id":"4a3fb1b7-b5d8-4a42-b8f2-6ac4f1394fc1","Path":"custom-data-files-and-locations-2.md","Order":2},{"Id":"b6cf5f28-22d7-4ed3-81ba-edfcf12766b6","Path":"shared-app-data-folder-1.md","Order":4},{"Id":"f523001d-55ec-4c17-abf7-eb4397603042","Path":"app-data-folder-1.md","Order":1},{"Id":"92e1f68d-8bc4-4092-9aad-6ba7c078168d","Path":"user-data-folder-1.md","Order":6}],"Id":"66a28759-37d7-4741-af4e-483320d50a57","Path":null,"Order":6,"CategoryType":0,"Icon":null,"Title":"Data Folders","Languages":[{"Code":"en","Title":"Data Folders","Slug":"data-folders-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"f6fac94d-8b7a-4e59-85ea-fa9e5ac14e77","Path":"a-segment-is-a-part-of-of-the-contourcontours-between-two-neighboring-nodes.md","Order":1}],"Id":"9d927dca-8e36-4457-a3bd-856c3f7967c4","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Segments","Languages":[{"Code":"en","Title":"Segments","Slug":"segments","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"4a6433d4-2966-4c4f-ae0f-fd1ba8abfeb5","Path":"a-glyphset-is-the-glyph-repertoire-of-a-font-i.md","Order":1}],"Id":"590fd8c6-7463-4220-b0aa-37f7502aeaa6","Path":null,"Order":7,"CategoryType":0,"Icon":null,"Title":"Glyphsets","Languages":[{"Code":"en","Title":"Glyphsets","Slug":"glyphsets","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"97357b3b-5ca6-4958-a663-2c4133ba81e9","Path":"masters-3.md","Order":3},{"Id":"f542f9ad-851b-4add-816f-a5947cfca77c","Path":"masks.md","Order":2},{"Id":"a665df3e-cb37-455c-be80-86aba33a5da6","Path":"layers-3.md","Order":1}],"Id":"98b5533a-f005-43ef-b1bc-0841f3ba8202","Path":null,"Order":8,"CategoryType":0,"Icon":null,"Title":"Layers and Masters","Languages":[{"Code":"en","Title":"Layers and Masters","Slug":"layers-and-masters","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"cdd64d92-91a3-4e78-b6c0-ddc3116bd001","Path":"app-start-and-macos-10.md","Order":2},{"Id":"fdf488bb-b36a-4ece-9129-b845c030c87a","Path":"glyph-tags-1.md","Order":5},{"Id":"33a8c492-29c1-413f-9961-0daa46a218bc","Path":"tunni-lines-3.md","Order":15},{"Id":"89953d83-8564-4b37-9b4e-2ded2a02cf16","Path":"power-nudge-1.md","Order":9},{"Id":"e46a52f5-9e7a-4518-ba94-9bfa8ee56057","Path":"demo-mode-2.md","Order":3},{"Id":"ee975c5b-d96b-4e69-bd73-a6dd8fb8c69d","Path":"visual-aids.md","Order":16},{"Id":"1ab4f59b-52ff-431a-9c96-8811e4d6b0f5","Path":"guides-2.md","Order":6},{"Id":"1048064f-031c-4038-95f6-8dc392c64535","Path":"tunni-lines1-1.md","Order":14},{"Id":"6e894273-df69-4632-af3c-c10c0051c047","Path":"quick-help-1.md","Order":11},{"Id":"57c5f99e-0a67-44a2-b97e-c03a0af3ab09","Path":"preview-rounding-1.md","Order":10},{"Id":"5072efcb-c0ce-4117-a6fa-9a45adcbe2a6","Path":"snapping.md","Order":12},{"Id":"e23bf018-af4b-462b-92a6-a9d8b33ebc13","Path":"glyph-classes-1.md","Order":4},{"Id":"dcfcf2c4-083b-4155-a649-480a3303f881","Path":"suggested-values.md","Order":13},{"Id":"f21b7c68-f02f-440f-a3e8-5f682e3a8e27","Path":"highlights-2.md","Order":7},{"Id":"7a9944cc-4fc0-48bf-8a65-6a5753ba7ca6","Path":"install-stable-or-beta-versions-of-fontlab.md","Order":8},{"Id":"175808be-5d03-405b-b11d-bdce4f57292a","Path":"activation.md","Order":1}],"Id":"5a6c907c-91f8-4525-ba81-b9a5eb7f1b5a","Path":"other-1.md","Order":10,"CategoryType":1,"Icon":null,"Title":"Other","Languages":[{"Code":"en","Title":"Other","Slug":"other-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"5a3f4117-f522-412b-8bc4-2316c688fc20","Path":"glyph-contents.md","Order":3},{"Id":"e26d4478-3a39-40d1-8174-edacc1d69ebe","Path":"glyph-input-in-text.md","Order":4},{"Id":"73273005-4567-4029-a350-cc723bb0355b","Path":"glyph-1.md","Order":6},{"Id":"ffe90d6d-39a0-42b2-a85d-1ae1d3131268","Path":"character.md","Order":2},{"Id":"a6911a8b-8c01-4f48-8579-d396c39ac420","Path":"character-vs-1.md","Order":1},{"Id":"b3cfb7a3-069f-416f-9f86-b27630af6a9f","Path":"glyph-name-limitations.md","Order":5},{"Id":"157f1c35-7ee0-4c2b-8551-230a4b5ecc68","Path":"glyphsets-2.md","Order":7}],"Id":"41b283da-ab6b-4857-870a-644e9ace6f91","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"About Glyphs","Languages":[{"Code":"en","Title":"About Glyphs","Slug":"about-glyphs","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"45670e11-8e5e-4553-8d51-75504d01cbf0","Path":"truetype-curves.md","Order":3},{"Id":"6ba76000-137c-433f-a22e-bcfc3e0920c3","Path":"curves-are-of-two-types-postscript-curves-segment-or-truetype-curve-segments.md","Order":1},{"Id":"9e8a01ff-e36d-47fb-a19e-341da59ac46d","Path":"postscript-curves.md","Order":2}],"Id":"f383600e-7f9a-42df-ae34-f86e18e2660a","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"Curve Types","Languages":[{"Code":"en","Title":"Curve Types","Slug":"curve-types","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"98b59873-8ee0-4f91-ae9c-e2550db84709","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Definitions","Languages":[{"Code":"en","Title":"Definitions","Slug":"definitions","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"b5188058-ddaa-4931-ae9f-24c5d6166576","Path":"remove-group.md","Order":9},{"Id":"b02d431f-8734-4ba0-a40b-51102c0c4053","Path":"transform-group.md","Order":1},{"Id":"90b15c89-4749-4a76-b0d6-05a4c207911f","Path":"global-mask-1.md","Order":4},{"Id":"2753d373-65d0-4e31-bbcb-83dac7c539fb","Path":"mask-group1.md","Order":5},{"Id":"3afff328-2ff1-4d5c-96ad-6ba02a4723f7","Path":"add-hint-group.md","Order":8},{"Id":"77f6a0fd-40d2-4732-97cb-fadb577351d0","Path":"rewind-submenu.md","Order":10},{"Id":"546886e1-b7b4-413b-949e-97c1fa7d393b","Path":"mask-group.md","Order":2},{"Id":"3bd71601-e56a-49e7-aca8-9501683a586c","Path":"hint-group.md","Order":3},{"Id":"dab6d1af-e62e-4bb5-8339-2779272cfb58","Path":"tools-submenu.md","Order":11},{"Id":"c9d6f74e-acab-4b00-80e2-f616011bd335","Path":"mask-group2.md","Order":12},{"Id":"bfc4fbb1-f0f7-48d8-b241-3bac1238ded2","Path":"actions-group.md","Order":6},{"Id":"6340fcfc-aedd-4d95-b190-f94df6dd989d","Path":"commands.md","Order":7}],"Id":"a6f8d0e3-dc43-4aca-a769-3a96c155dd2f","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"Menu Tools","Languages":[{"Code":"en","Title":"Menu Tools","Slug":"menu-tools","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"23c0390b-324e-4c09-93aa-83d33746908c","Path":"engraving.md","Order":6},{"Id":"c0d782f0-a1a2-4aed-9268-154d93d186d2","Path":"boldchange-weight.md","Order":4},{"Id":"a5e99e7d-a9a9-4077-ada0-3f88e7491c7e","Path":"3d-extrude.md","Order":1},{"Id":"acb59049-6328-4a9b-a85a-036523cb6ff0","Path":"round.md","Order":9},{"Id":"d80dc132-0403-4987-889f-5a77cac257da","Path":"perspective.md","Order":8},{"Id":"cee8e352-f349-4450-9d94-54a5e07656d0","Path":"add-nodes-1.md","Order":2},{"Id":"6f3abfa9-d5cf-474f-b97e-f883330862e7","Path":"outline.md","Order":7},{"Id":"e8c129c0-0b80-4af7-baa3-79e77a7de436","Path":"blur.md","Order":3},{"Id":"c16ee2bc-919f-4902-9d9c-6d0b1606de4e","Path":"distort.md","Order":5},{"Id":"7f1269e1-bcf7-40a4-948b-334e1c28ca49","Path":"shadow.md","Order":10},{"Id":"ef541c7d-d49d-4ff8-a7e7-32edb2c45b99","Path":"sharp.md","Order":11},{"Id":"e7cf9aa1-9564-4240-a492-541738dadb5f","Path":"smooth.md","Order":12}],"Id":"d5f3a087-b40d-48cb-af28-7d1fd470e6a4","Path":"effects.md","Order":12,"CategoryType":1,"Icon":null,"Title":"Effects","Languages":[{"Code":"en","Title":"Effects","Slug":"effects","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"50119d89-bdf3-4953-9710-0370c11d9350","Path":"center-layer.md","Order":3},{"Id":"a9868124-2130-41ba-ad97-ac762dced823","Path":"set-advance-width.md","Order":2},{"Id":"85a8f523-59f2-40cf-8c44-f00f1b2e25ac","Path":"bind-sidebearings-to-contour.md","Order":4},{"Id":"d4b69881-5cbd-480d-ad27-d88b5466ca43","Path":"set-sidebearings.md","Order":5},{"Id":"5440ceae-0e25-4794-8f7c-7bdf8d1ec696","Path":"synchronize-sidebearings.md","Order":6},{"Id":"66e245cf-3300-4bdc-b3a0-12a7b6b83bf2","Path":"adjust-metrics.md","Order":1}],"Id":"1ecebf6f-23b9-45ab-b62e-167ec2ab8682","Path":"metrics-actions.md","Order":9,"CategoryType":1,"Icon":null,"Title":"Metrics actions","Languages":[{"Code":"en","Title":"Metrics actions","Slug":"metrics-actions","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"b2db8367-366d-4a9c-95ba-32ff54819744","Path":"slant.md","Order":9},{"Id":"fc09f2c8-b787-47c5-b461-c2e560e4c67d","Path":"scale.md","Order":7},{"Id":"d9438a00-4395-4da0-83c8-8e1437ff2e65","Path":"basic-tools-actions-are-one-of-five-types-of-actions-in-fontlab.md","Order":1},{"Id":"54a418d9-a6f7-4477-bc9c-08e3570f8650","Path":"rotate.md","Order":6},{"Id":"2cff3491-b970-434f-a1e1-77c0a162800b","Path":"convert-to-tt-curves.md","Order":3},{"Id":"603f5a82-6825-4639-86cd-ce425267e6fa","Path":"shift-1.md","Order":8},{"Id":"f3ee091e-2339-44aa-81e6-9a058bdae8ff","Path":"remove-overlap-2.md","Order":5},{"Id":"e00849e7-0b46-47cd-97ac-7bfb891b407d","Path":"convert-to-ps-curves.md","Order":2},{"Id":"ba1ed26e-bf4f-48d9-ba3b-5b3da16b6cc0","Path":"make-overlap-2.md","Order":4}],"Id":"f9c6ca9f-5c36-4ee2-942c-5c83f89a881b","Path":"basic-actions.md","Order":3,"CategoryType":1,"Icon":null,"Title":"Basic actions","Languages":[{"Code":"en","Title":"Basic actions","Slug":"basic-actions","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"8c68d90f-1e46-40df-85b5-88d99e9481ea","Path":"nodes-at-extremes-2.md","Order":11},{"Id":"0922b749-d563-4d55-bfed-e3c9894b9cf8","Path":"add-ink-traps.md","Order":1},{"Id":"3787ceca-20be-4479-a374-44386b5e6d0d","Path":"clean-up-2.md","Order":5},{"Id":"417ba0b3-bbf3-4707-ae52-fd8af93dbeee","Path":"flatten-glyph.md","Order":9},{"Id":"f4f6cdd8-3f9c-412b-b4b4-94a03ab9a9f6","Path":"simplify-2.md","Order":15},{"Id":"9d18da97-3292-4476-b11d-1bd117f762ac","Path":"remove-guides.md","Order":13},{"Id":"cc5dd965-6963-4032-9b35-0233b1a8430c","Path":"disconnect-power-guides.md","Order":8},{"Id":"3d5ccd22-502b-4855-a216-81474b69ed20","Path":"remove-smart-corners.md","Order":14},{"Id":"a1e005e5-3d25-43f7-944a-5cb4152ec11c","Path":"change-width-2.md","Order":4},{"Id":"1b7f1593-763d-479e-a9d5-a1633ad0bcef","Path":"contour-actions-tools-actions-are-one-of-five-types-of-actions-in-fontlab.md","Order":6},{"Id":"63b49a4f-cfd2-488a-8b45-dca16a03c05c","Path":"add-smart-corners.md","Order":2},{"Id":"b68d07aa-7feb-4d9a-88f1-e992877109a4","Path":"balance-2.md","Order":3},{"Id":"9d479c42-a50d-41f6-ad1f-d24bc5ff4e13","Path":"power-guides-5.md","Order":12},{"Id":"36cb3976-8d44-416d-b3aa-583794b9dbb0","Path":"detect.md","Order":7},{"Id":"8428d6e7-cd3b-4a50-a1e5-f9641bb4e5a3","Path":"harmonize-2.md","Order":10}],"Id":"a03c0eba-d699-4127-b15d-e9839369333f","Path":null,"Order":10,"CategoryType":0,"Icon":null,"Title":"Contour actions","Languages":[{"Code":"en","Title":"Contour actions","Slug":"contour-actions","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"63efd0ae-0342-4c8d-8bf4-80192c52709b","Path":"autohint-2.md","Order":1},{"Id":"fd129893-eafe-4af4-9436-363e2ab83796","Path":"reassign-zones.md","Order":3},{"Id":"32352698-2997-48b8-b840-5657c286ff0c","Path":"tt-authohint.md","Order":5},{"Id":"95fe333f-bc58-49e1-b60f-b9b9a1751a1d","Path":"remove-hints-1.md","Order":2},{"Id":"be573903-e655-4313-88e4-156e28fdaf72","Path":"tt-reset.md","Order":6},{"Id":"a67fe65c-14b2-4b1e-b1a0-cc90baf05551","Path":"reassign-stems.md","Order":4}],"Id":"53e6d935-8ad6-48d8-b325-f69a32ba25cb","Path":"hinting-actions.md","Order":11,"CategoryType":1,"Icon":null,"Title":"Hinting actions","Languages":[{"Code":"en","Title":"Hinting actions","Slug":"hinting-actions","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"6668bd9f-58a5-4596-b7d9-430b1e7baab5","Path":"actions1-1.md","Order":2},{"Id":"b14c6483-d75b-4c6b-8884-9cad03ac2ec3","Path":"change-width-1.md","Order":5},{"Id":"ac833a7d-dcdf-460b-8772-047bc324ed5b","Path":"weight.md","Order":6},{"Id":"c21e9102-1559-4d10-87a3-65cdcc8477e7","Path":"remarks-1.md","Order":7},{"Id":"d62eb0e0-d41f-4044-82da-6bc952baa256","Path":"make-existing-glyphs-blank-1.md","Order":8},{"Id":"b86bd3f7-c480-4b28-adf6-aa3730682072","Path":"action-sections-1.md","Order":1},{"Id":"2982412e-a5cb-40a5-8f57-9f0e246f19cb","Path":"change-height-1.md","Order":4}],"Id":"dba64642-6795-414c-b178-ee729a287cff","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Actions","Languages":[{"Code":"en","Title":"Actions","Slug":"actions-4","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"476b0496-0d73-4ba6-8fe2-782863a0a27f","Path":"components-1.md","Order":1},{"Id":"c7898fea-d526-499f-a73b-600f5942ec55","Path":"glyph-names-4.md","Order":3},{"Id":"d522b8bd-4ae5-4768-b5b8-49c26ca998a3","Path":"zones-2.md","Order":8},{"Id":"677a1399-805b-48d4-9566-13e93556be41","Path":"vfcvfj.md","Order":7},{"Id":"05ac2351-31ee-4ec3-be57-2d71af054164","Path":"ot-features-1.md","Order":5},{"Id":"b5911f6e-2221-451b-a6e8-8a5305afd683","Path":"ot-tables.md","Order":6},{"Id":"dc3f3b49-0e28-4e74-b021-6fe3a3eeb3f3","Path":"contours-3.md","Order":2},{"Id":"4d601856-9db8-4865-a938-546ec6a51a1b","Path":"open-fonts-1.md","Order":4}],"Id":"87272fd6-9b5b-44bc-8815-55fcc572d535","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"Open Fonts","Languages":[{"Code":"en","Title":"Open Fonts","Slug":"open-fonts","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"e80559f6-bba9-445d-8a3e-a149dfd99e58","Path":"color-flag-brightness.md","Order":6},{"Id":"88f6e0ed-ad04-4608-81ee-73ac5c537ff8","Path":"default-mode.md","Order":8},{"Id":"8ab2016f-c661-4b44-9a98-401742369d94","Path":"cell-caption-properties.md","Order":3},{"Id":"fe61a6f0-a012-4b9e-b7d4-512cf1c1fc56","Path":"use-glyph-name-as-fallback-when-filtering-by-unicode-name-category-or-script.md","Order":17},{"Id":"5904a464-ecc0-4cb2-92b0-e5c80b844572","Path":"caption.md","Order":1},{"Id":"d07f0378-30e2-4f0f-8b39-52415542183c","Path":"scrolling.md","Order":14},{"Id":"f1901638-a016-4b0b-a34b-094f129c57e4","Path":"font-window-9.md","Order":12},{"Id":"8cdffc04-a45d-4732-a2f3-e1db4e55e7cc","Path":"default-encoding.md","Order":7},{"Id":"86898e2d-67b0-4e62-b739-f7ff8c9bb5ba","Path":"filter.md","Order":11},{"Id":"dfaa4f35-7b71-44a2-9f14-9d4d3867c2e5","Path":"cell.md","Order":5},{"Id":"7e591cd6-3811-44c0-9c19-ddb2d6664ce0","Path":"default-sorting.md","Order":9},{"Id":"68e28fa0-8533-4a55-bc41-b43d64f5ab89","Path":"docking-windows-as-tabs.md","Order":10},{"Id":"98dd1143-b358-4011-bfaa-7fe46ef0a2db","Path":"cell-highlight.md","Order":4},{"Id":"33f96118-4937-4799-8788-aa8f679508cc","Path":"placeholder-font.md","Order":13},{"Id":"18cf6632-ee6f-4965-b2a6-cca935083ece","Path":"show-in-cell.md","Order":15},{"Id":"4ab77914-a5be-4ce2-8f35-7a6e8da57d28","Path":"unicode-index-format.md","Order":16},{"Id":"f0f7eb78-ce26-4c55-b331-7bf841765f4c","Path":"cell-background.md","Order":2}],"Id":"5d70afe7-67b8-44f2-8489-c005adc35a9b","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"Font Window","Languages":[{"Code":"en","Title":"Font Window","Slug":"font-window-2","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"503ec3b7-3b55-4ead-b802-38863d14f59f","Path":"smart-rounding.md","Order":5},{"Id":"de6c9716-221e-4f47-8610-2b25167f1489","Path":"preferences-variations.md","Order":2},{"Id":"17bbe4fb-cfcc-4e04-94e8-232327b9e5a2","Path":"guess-weightwidthweightwidth-axis-location-from-master-style-attribute-or.md","Order":1},{"Id":"428a4ecd-d3b1-4de2-bbf8-f0f9c5f4f704","Path":"show-instance-layer.md","Order":4},{"Id":"645d947a-f845-4dab-a58e-fe7c61915fba","Path":"synchronize-in-matching-masters.md","Order":6},{"Id":"189457df-0ddc-4ac5-9b3a-ec0c3b2ad614","Path":"variations-3.md","Order":7},{"Id":"7b3bca2c-b676-45c0-a131-45f191c2a3e6","Path":"preview-master-color.md","Order":3}],"Id":"820facf9-9fa5-438d-a312-165c8a4c66b1","Path":null,"Order":12,"CategoryType":0,"Icon":null,"Title":"Variations","Languages":[{"Code":"en","Title":"Variations","Slug":"variations","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"c9920502-d654-4d15-911f-e9d6b7347583","Path":"here-is-where-you-set-the-type-of-sample-texts-you-wish-to-use-such-as-lorem.md","Order":1},{"Id":"9ec3b06a-a241-4acb-a5c9-46e96f1db306","Path":"preferences-texts.md","Order":2}],"Id":"e316d24e-40d0-4e77-91fa-b529c5842462","Path":null,"Order":20,"CategoryType":0,"Icon":null,"Title":"Texts","Languages":[{"Code":"en","Title":"Texts","Slug":"texts","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"56a0b942-22f7-49c4-b202-6d11ed18b433","Path":"nodes.md","Order":3},{"Id":"83859740-d75f-4b32-9b57-a490cc074cbc","Path":"preferences-glyph-window.md","Order":4},{"Id":"4001ff94-5f41-42cb-8149-79e93b74d562","Path":"lengths-and-angles.md","Order":2},{"Id":"18ef63d1-33b8-4663-b2fa-02988337cee7","Path":"size-settings.md","Order":6},{"Id":"8a8aced2-9868-450d-99ef-eba55e197271","Path":"size-of-the-curvature-comb.md","Order":5},{"Id":"882881bb-a5c9-4378-8a1f-954b3e64b282","Path":"glyph-window-10.md","Order":1}],"Id":"249be670-8745-43cc-9358-88b6153a171a","Path":null,"Order":6,"CategoryType":0,"Icon":null,"Title":"Glyph Window","Languages":[{"Code":"en","Title":"Glyph Window","Slug":"glyph-window-2","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"ea373398-1bbd-4ddd-8ffc-53677a5725c7","Path":"generate-the-time-stamp-using-the-following-url.md","Order":6},{"Id":"e89c83eb-5297-442c-a794-70c8ee16ccd3","Path":"digital-signature-1.md","Order":2},{"Id":"b0e15a0a-b2a6-489d-9caa-30b6bfd2530e","Path":"file-paths.md","Order":4},{"Id":"0a15f2a2-9ab3-4952-91f4-77b7345b8f17","Path":"digitally-sign-exported-opentype-fonts.md","Order":3},{"Id":"0d8812ad-dc11-417b-adb3-6d189b840a60","Path":"request-private-key-password-every-time.md","Order":8},{"Id":"6088c226-8a84-4f25-81f3-7a416f9a6268","Path":"use-the-following-password.md","Order":9},{"Id":"5b848913-0345-49f9-b888-be31c181b05c","Path":"font-vendor-url.md","Order":5},{"Id":"24134ba4-a19b-4e09-8d7b-b5777884ccf1","Path":"preferences-digital-signature.md","Order":7},{"Id":"1838c26e-6b8e-4b51-8aba-b0f9b31d4804","Path":"algorithm-to-build-font-data-hash.md","Order":1}],"Id":"2baa8649-ed78-4ed1-a74e-7ea57e7fe5d5","Path":null,"Order":17,"CategoryType":0,"Icon":null,"Title":"Digital Signature","Languages":[{"Code":"en","Title":"Digital Signature","Slug":"digital-signature","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"5ee85050-1a55-4102-b3f9-3e47ef13aaa4","Path":"something-tba.md","Order":1}],"Id":"95034346-d2b8-45b8-8a6f-4fb06020a1ba","Path":"code-editors.md","Order":18,"CategoryType":1,"Icon":null,"Title":"Code Editors","Languages":[{"Code":"en","Title":"Code Editors","Slug":"code-editors","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"7c346c7e-07d2-480d-b381-7f47f38114c7","Path":"curve-conversion-1.md","Order":1},{"Id":"2b548868-272e-4826-ad4e-4142c7753c0a","Path":"preferences-curve-conversion.md","Order":2},{"Id":"56f09b77-cfb7-4bee-8d79-f2c93a54455f","Path":"the-curve-conversion-tolerance-options-are-used-whenever-you-convert-truetype.md","Order":3}],"Id":"e2fee234-a5ed-4974-9cb0-f6cea5619214","Path":null,"Order":16,"CategoryType":0,"Icon":null,"Title":"Curve Conversion","Languages":[{"Code":"en","Title":"Curve Conversion","Slug":"curve-conversion","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"b3dd276d-173a-4c98-9d63-ec14f15b9bb6","Path":"glyph-window-default-zoom-level.md","Order":2},{"Id":"2043b677-0bba-484b-876d-aaad247b9c3c","Path":"preferences-distances.md","Order":3},{"Id":"1a6cb714-0cd7-46ba-b087-6b0d94c45c23","Path":"distances-1.md","Order":1}],"Id":"ec13da2a-96b2-4fb8-9a0a-4b63d6371632","Path":null,"Order":14,"CategoryType":0,"Icon":null,"Title":"Distances","Languages":[{"Code":"en","Title":"Distances","Slug":"distances","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"a3d44ae0-5b21-4095-8d49-63ce8d41d0b7","Path":"include-in-vfc-windows-andor-panels.md","Order":6},{"Id":"110d6763-6c61-475c-b63b-c2dd61030427","Path":"backups-when-saving-files.md","Order":8},{"Id":"63de5513-0ab7-483c-aa0a-56daf13745ff","Path":"existing-files.md","Order":4},{"Id":"eed77603-24c3-419f-9725-221c29e9a582","Path":"autosave-1.md","Order":1},{"Id":"0fe4585f-32e0-4bae-9d15-93bb573effbe","Path":"save-fonts-1.md","Order":2},{"Id":"4b875610-64c0-42f3-89e9-cd60cc59f73d","Path":"bitmap-fonts-2.md","Order":7},{"Id":"951d8d5d-907e-4e8f-b098-861ce29c2dba","Path":"first-save-options.md","Order":5},{"Id":"bc52fc86-8ad8-4a6c-adfc-616dab72ce82","Path":"include-in-vfj.md","Order":3}],"Id":"56713b7b-664b-4db1-af25-b8cbf34f18a3","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Save Fonts","Languages":[{"Code":"en","Title":"Save Fonts","Slug":"save-fonts","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"05f951f0-b99a-4377-82e5-654f07e19cf2","Path":"general-information-1.md","Order":3},{"Id":"27a2c149-cb79-4a6e-91f2-15d0b8658bcf","Path":"glyph-window-9.md","Order":5},{"Id":"759678a0-803c-4592-96fa-63523a110b79","Path":"general-2.md","Order":4},{"Id":"14203e15-fc82-4812-8e4e-2063ac6880ff","Path":"hardwareaccelerated-rendering-on-windows.md","Order":6},{"Id":"ac1126ea-00a0-49e7-8b6a-3fd52f6443c3","Path":"other-3.md","Order":7},{"Id":"18c66796-f7f9-41fc-9752-f833694e04e1","Path":"updates-3.md","Order":10},{"Id":"c997a0a7-c8b3-4ea1-9f22-f705bc2cfc70","Path":"user-data-folder-2.md","Order":11},{"Id":"859181d6-7a75-4418-a64a-56551610665e","Path":"sidebars.md","Order":8},{"Id":"e9574565-af5e-4e2a-8791-fbe4be053676","Path":"windows-and-tabs-configuration.md","Order":1},{"Id":"64571bd9-0beb-45a0-9118-2614005daf79","Path":"sketchboard-1.md","Order":9},{"Id":"68b7c41e-417a-4ab4-bfe9-bad79861275c","Path":"focus-highlight.md","Order":12},{"Id":"efdafa43-9ef9-45b6-afa2-9d7031d220c5","Path":"font-window-8.md","Order":2}],"Id":"0b4be18a-2c7a-4d3d-b881-4c926e95b466","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"General","Languages":[{"Code":"en","Title":"General","Slug":"general","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"66f71473-1691-4553-b5be-fc68329ade93","Path":"when-testing-your-hinted-fonts-test-a-range-of-sizes.md","Order":2},{"Id":"6e552482-b4ca-4a5d-90a8-6b12a1ff4f22","Path":"preferences-default-texts.md","Order":1}],"Id":"4516fe01-b323-4ed1-9639-65dc020c964e","Path":null,"Order":19,"CategoryType":0,"Icon":null,"Title":"Default Texts","Languages":[{"Code":"en","Title":"Default Texts","Slug":"default-texts","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"b47b78bb-11bd-4e29-adf6-6596f8965c57","Path":"tba-6.md","Order":1}],"Id":"5ab676a2-8d20-4591-b160-666ad71fb452","Path":null,"Order":8,"CategoryType":0,"Icon":null,"Title":"FontAudit","Languages":[{"Code":"en","Title":"FontAudit","Slug":"fontaudit-3","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"dba55e7d-ab61-4fec-a5db-a2fd8b5041d6","Path":"paste-duplicate-1.md","Order":1},{"Id":"81986a52-e867-4c94-906f-7e9baacac365","Path":"scale-artwork.md","Order":2},{"Id":"ab8edc85-2914-446e-9084-5ab3f4a29337","Path":"preferences-paste-duplicate.md","Order":3}],"Id":"c6862569-853a-4c50-98f0-afe32c956077","Path":null,"Order":10,"CategoryType":0,"Icon":null,"Title":"Paste & Duplicate","Languages":[{"Code":"en","Title":"Paste & Duplicate","Slug":"paste-duplicate","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"210fb40d-cdd8-48bb-9be0-f57e9c86ac4a","Path":"preferences-autohinting.md","Order":8},{"Id":"c9be302b-87bd-48da-8403-95e718926975","Path":"interpolate-positions-of-the-double-links.md","Order":9},{"Id":"1880ebe9-dca2-4ef3-9eb1-d954d5a12c07","Path":"remove-existing-hints-when-autohinting-a-glyph.md","Order":7},{"Id":"dbdacc3e-22fc-45d4-9850-be4cabb3eddf","Path":"single-link-attachment-precision.md","Order":10},{"Id":"f6b9d656-2689-4950-b551-bb691e58fba7","Path":"add-link-to-the-right-sidebearing-point.md","Order":11},{"Id":"7ddb1cdf-a1a9-482a-9d78-1374a45bbe2d","Path":"automatically-interpolate-positions-of-the-cusp-points.md","Order":3},{"Id":"4136755e-a0da-4e8c-b59a-65ef64234c8f","Path":"generate-triple-hints.md","Order":1},{"Id":"93e0265a-9a21-4645-8fb0-9cc95c8e8a9d","Path":"convert-hints-to-links-when-autohinting.md","Order":4},{"Id":"3a81bc4d-f0d1-4be0-9d65-d9c96118a0de","Path":"direct-links-to-the-center-of-the-glyphs-where-possible.md","Order":5},{"Id":"d415a537-c353-495a-a887-6cd475e42bd9","Path":"try-to-automatically-generate-middle-delta-instructions.md","Order":6},{"Id":"6c95f99d-3a49-43b4-a3e9-f03ceb8c3d28","Path":"autohinting-2.md","Order":2}],"Id":"aa44eff0-89ee-4061-be2a-ba5dd976ccc6","Path":null,"Order":15,"CategoryType":0,"Icon":null,"Title":"Autohinting","Languages":[{"Code":"en","Title":"Autohinting","Slug":"autohinting-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"391dc972-36bb-47d8-9c7e-7395bd875b85","Path":"integer-coordinates-and-grid.md","Order":2},{"Id":"fdec09fa-e2cc-4618-8463-6f28cb2ca43d","Path":"in-preferences-grid-guides-you-can-now-customize-the-opacity-transparency.md","Order":3},{"Id":"e5506195-af62-4f81-b39e-220aed5139d8","Path":"opacity-of-guides-zones-hints-font-dimensions-1.md","Order":5},{"Id":"5aeba892-d884-4e12-8de1-0fc6e03ec698","Path":"grid-and-guides-2.md","Order":1},{"Id":"8f5bbbf5-7906-4cd4-ba66-6859f6d43e50","Path":"preferences-grid-guides1.md","Order":7},{"Id":"b8bc19b0-1571-4b75-b5fb-da8324fbe195","Path":"preferences-grid.md","Order":9},{"Id":"da673787-2818-4f8c-9575-65e44a61abb3","Path":"preferences-grid-guides.md","Order":8},{"Id":"6ca48edd-e055-4b6e-ba16-c654d420f044","Path":"slanted-grid-1.md","Order":10},{"Id":"72c45df8-1e48-49af-9864-e609d45524af","Path":"grid-1.md","Order":4},{"Id":"24f7e16a-b349-4ec0-8c2d-120ebdc112a8","Path":"slanted-sidebearings-glyph-metrics.md","Order":11},{"Id":"064a1417-2862-45b1-b7b0-a1d109ae7ee5","Path":"opening-fonts-with-fractional-coordinates.md","Order":6}],"Id":"cab79732-7b2e-48fe-8aac-faa0f15debf5","Path":null,"Order":11,"CategoryType":0,"Icon":null,"Title":"Grid and Guides","Languages":[{"Code":"en","Title":"Grid and Guides","Slug":"grid-and-guides","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"ca558f38-a668-4c4f-8679-0d6e13a45953","Path":"cousins-3.md","Order":1},{"Id":"c27d1f17-7cd7-4e49-8317-f58fd540b368","Path":"preferences-cousins.md","Order":3},{"Id":"9b92333c-8a02-41cd-8f37-59519fa6c100","Path":"glyph-list.md","Order":2}],"Id":"ec23814c-7606-4812-9b6a-1460d86dc561","Path":null,"Order":7,"CategoryType":0,"Icon":null,"Title":"Cousins","Languages":[{"Code":"en","Title":"Cousins","Slug":"cousins-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"70bfa680-fdff-4f9d-a1b2-ee3b484d9c79","Path":"editing-1.md","Order":1},{"Id":"77cb0c4c-a408-4f9b-b1e0-f9e1d830c9be","Path":"mnmnm.md","Order":2}],"Id":"d7d0eb93-e3a9-4144-a659-9f9849692eb4","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Editing","Languages":[{"Code":"en","Title":"Editing","Slug":"editing","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"53459ee7-4048-4690-ad69-7efee3ec7a12","Path":"new-glyphs.md","Order":3},{"Id":"68d5c1c6-2115-419d-97b4-050537e5700e","Path":"unicodename-mapping.md","Order":8},{"Id":"5bb820b8-9509-4715-a1db-ec0b4183113a","Path":"operations-2.md","Order":4},{"Id":"8a0957f8-4047-439f-b211-0e57671772cf","Path":"autotrace-2.md","Order":1},{"Id":"cee7e68f-56a5-4d0e-b58f-b42ff82e75a6","Path":"preferences-operations.md","Order":7},{"Id":"93ba4e2e-c6b0-4359-bc10-e9cbc94815d3","Path":"element-references-2.md","Order":2},{"Id":"23bcc67a-f324-42f8-a784-cb1624cd242a","Path":"power-guides-4.md","Order":6},{"Id":"5cfc8e59-a6e4-42be-9069-de1d06dd6989","Path":"optical-separation.md","Order":5}],"Id":"7b1f6ad7-0592-45ea-98b6-9bce3ffb1e2f","Path":null,"Order":13,"CategoryType":0,"Icon":null,"Title":"Operations","Languages":[{"Code":"en","Title":"Operations","Slug":"operations","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"ff803eb8-b1da-4a5f-ac3d-cb9a7a63366a","Path":"option-description.md","Order":3},{"Id":"c0cc3b80-b878-4711-80f8-11b541f67306","Path":"preferences-spacing.md","Order":1},{"Id":"cdbd957e-4606-480a-91f8-4f544a531529","Path":"spacing-3.md","Order":2}],"Id":"48c17be7-be2a-4bbc-a158-fd85de45c788","Path":null,"Order":9,"CategoryType":0,"Icon":null,"Title":"Spacing","Languages":[{"Code":"en","Title":"Spacing","Slug":"spacing-2","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"8ffe231d-9a65-4423-984a-57b3fd21e88b","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Preferences","Languages":[{"Code":"en","Title":"Preferences","Slug":"preferences-4","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"100311c9-c017-4bb8-96f2-9fcdb250c496","Path":"metrics-tool-2.md","Order":1}],"Id":"e42c6c5a-dcfe-4841-b2c8-647837ac2633","Path":null,"Order":13,"CategoryType":0,"Icon":null,"Title":"Metrics Tool","Languages":[{"Code":"en","Title":"Metrics Tool","Slug":"metrics-tool","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"1ca7ffe7-d194-4c81-ad03-fa7d8ca88b65","Path":"knife-tool1.md","Order":4},{"Id":"b27b10f4-9501-4d46-b5d6-0e84f2f59b04","Path":"break-nodes.md","Order":1},{"Id":"43124f87-7d82-4ba0-87d2-fcc041f4d74b","Path":"duplicate-nodes-2.md","Order":2},{"Id":"d9edef9c-e525-4ac2-bd4b-9b955668748b","Path":"insert-nodes.md","Order":3}],"Id":"2ce4587c-efb5-43a5-812c-9bf7cdfe7c41","Path":null,"Order":10,"CategoryType":0,"Icon":null,"Title":"Knife tool","Languages":[{"Code":"en","Title":"Knife tool","Slug":"knife-tool-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"efdea4ab-6bc8-47fe-97a4-eab2e231dade","Path":"pen-tool-4.md","Order":1},{"Id":"d5267e47-3085-4cb9-af98-22c7862a880f","Path":"drawing-a-new-countour.md","Order":2},{"Id":"8b9c00fa-f63a-4a25-9772-b2187a4f8d3e","Path":"editing-an-existing-contour-with-pen.md","Order":3},{"Id":"373cae85-8872-42ae-af9b-234b0be97d6f","Path":"pen-tool1.md","Order":4}],"Id":"8f092a28-f0ad-4316-931c-56b18cf42390","Path":null,"Order":14,"CategoryType":0,"Icon":null,"Title":"Pen Tool","Languages":[{"Code":"en","Title":"Pen Tool","Slug":"pen-tool-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"e9060ce1-5791-4ca8-87af-aaa1dbb9871d","Path":"code-panel.md","Order":5},{"Id":"9b341933-2b0c-454f-b48e-7c36808c49eb","Path":"waterfall-preview.md","Order":6},{"Id":"152ea4e1-0884-49c8-af9e-fb1417208c51","Path":"aligntop-and-alignbottom-instructions.md","Order":17},{"Id":"910e672a-f1f0-4706-9651-c7a4e20d64c7","Path":"truetype-hinting-panel.md","Order":7},{"Id":"cc5ce1a8-d84d-4f98-bd00-b3bff2765428","Path":"raw-data-to-be-edited-igor.md","Order":24},{"Id":"1765ca6e-5ef6-4176-9d33-fcf0555cd596","Path":"active-and-inactive-delta-instructions.md","Order":16},{"Id":"3198e953-619c-440f-b8b6-c67ed0bfdecd","Path":"preview-3.md","Order":4},{"Id":"f000d23a-99ca-4e3d-ba61-4cf3837e7175","Path":"single-links.md","Order":12},{"Id":"532e8dbd-36b1-45f1-bef0-941b1054dedd","Path":"standard-stems-1.md","Order":13},{"Id":"bc7f5fb5-fe5e-4249-b57a-dd461927fc53","Path":"editing-truetype-alignment-zones.md","Order":14},{"Id":"9273eab4-2c69-40c4-8959-e5b6cc6d52bb","Path":"alignment-instructions.md","Order":1},{"Id":"34828f13-0115-4580-9be7-21700750c9b2","Path":"toolbar-3.md","Order":3},{"Id":"ab146111-158a-472a-88e4-bdbd13430703","Path":"hinting-property-bar.md","Order":8},{"Id":"58d615c2-0ce0-4775-aa69-5a2acb902f4a","Path":"alignment-zones-1.md","Order":20},{"Id":"ea41b652-3ba0-4202-861c-17f15b31c4be","Path":"align-instruction.md","Order":21},{"Id":"1001eee6-0dc6-43bc-862b-1ea6c8be2c1c","Path":"hinting-alignment-zones.md","Order":9},{"Id":"ce8bf5cf-17d8-4a6a-860d-5d020afafc1c","Path":"the-truetype-hinting-tool-cmdshiftf7-is-used-to-create-and-modify-visual.md","Order":2},{"Id":"80f3f0cd-84f1-4623-af71-b436994ea8e7","Path":"double-link.md","Order":15},{"Id":"a708a22c-a05b-4f52-aadb-1726275b98b9","Path":"links-1.md","Order":22},{"Id":"37c19c35-dded-49a5-8dc4-7db1a248f50e","Path":"customizing-the-double-link-command.md","Order":18},{"Id":"90cb2f4a-6b55-48d5-8cbe-aa1b55bace98","Path":"customizing-the-single-link-command.md","Order":19},{"Id":"c139c2b1-3ec5-474c-9813-b71622f0d4d2","Path":"delta-instructions.md","Order":23},{"Id":"0547bcf2-5bb3-486d-89af-f05e4fe9424f","Path":"middle-delta-instructions.md","Order":11},{"Id":"9c8e66b2-48f8-4a58-bfff-f744ead1cf1c","Path":"final-delta-instructions.md","Order":10}],"Id":"64d8567e-8e4a-4c94-a485-4849c78969c0","Path":null,"Order":23,"CategoryType":0,"Icon":null,"Title":"TrueType Hinting tool","Languages":[{"Code":"en","Title":"TrueType Hinting tool","Slug":"truetype-hinting-tool","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"12a450e2-39e1-4c0e-8d42-1f77d5ede110","Path":"quick-scale-tool.md","Order":2},{"Id":"ece58482-087a-4810-90b2-85d2ecb9bdae","Path":"quick-rotate-tool.md","Order":1},{"Id":"e321a2a6-989b-4f3e-af90-1c0ceb65a7d5","Path":"quick-slant-tool.md","Order":3}],"Id":"49a7534c-e1f9-40cc-b10d-89e68fcc114e","Path":null,"Order":24,"CategoryType":0,"Icon":null,"Title":"Quick Tools","Languages":[{"Code":"en","Title":"Quick Tools","Slug":"quick-tools","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"72446096-c435-4aeb-905f-fa497dcafdb1","Path":"fill-tool2.md","Order":2},{"Id":"7d00af33-826f-40d2-9ee1-3f9a8360998c","Path":"fill-tool1.md","Order":1}],"Id":"90fb6556-dcce-4a5f-b0c2-c2621211dbda","Path":null,"Order":7,"CategoryType":0,"Icon":null,"Title":"Fill tool","Languages":[{"Code":"en","Title":"Fill tool","Slug":"fill-tool","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"c40c127a-a4b7-40b7-a5f3-ad3a04bf190a","Path":"toolbar-items.md","Order":3},{"Id":"83f4d31e-79a4-4f1b-b74c-80ac423d39ac","Path":"toolbar-2.md","Order":4},{"Id":"eccea9d7-8f52-45b2-bef9-9e7618cf07d8","Path":"compact-toolbar.md","Order":1},{"Id":"09af3d27-c4c1-42f3-9b0e-d8bef83e6fba","Path":"keyboard-shortcuts-6.md","Order":2}],"Id":"9902f228-bc71-4ea4-a9df-65590bcf0344","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Accessing the Tools","Languages":[{"Code":"en","Title":"Accessing the Tools","Slug":"accessing-the-tools","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"57776cc5-eda8-4044-8ba4-4395b6f392d2","Path":"ellipse-tool1.md","Order":1},{"Id":"b32baef1-70fd-453a-a1c6-82b9caaa0a4b","Path":"the-ellipse-tool-o-key-draws-ellipses-and-circles.md","Order":2}],"Id":"b832046f-ebba-417f-8104-bf8f4c0655d3","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Ellipse tool","Languages":[{"Code":"en","Title":"Ellipse tool","Slug":"ellipse-tool-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"d8267157-bb2c-4e18-b04f-c53297d2fc5e","Path":"eraser-tool1.md","Order":1}],"Id":"c3e14ee8-7651-479f-a495-88ee7d74ee76","Path":null,"Order":6,"CategoryType":0,"Icon":null,"Title":"Eraser Tool","Languages":[{"Code":"en","Title":"Eraser Tool","Slug":"eraser-tool-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"3d8dd6a2-5319-4bbf-b9e9-67027d777f46","Path":"adding-links.md","Order":1},{"Id":"3def2466-c872-4c97-bb1f-266545155965","Path":"removing-links-1.md","Order":2},{"Id":"7f7faf04-eb1e-4158-abe8-ae470407522f","Path":"magnet-tool2.md","Order":6},{"Id":"7328b4a9-98c6-4dd3-bf03-061b21bbcf2e","Path":"magnet-tool1.md","Order":5},{"Id":"e78b0a2f-08cc-482e-b8d1-2cf294eabf15","Path":"editing-with-mouse.md","Order":4},{"Id":"6f7e146c-09f6-4a3a-b60d-a3e22064b431","Path":"editing-with-keyboard.md","Order":3}],"Id":"dff6a591-1eab-4e8a-ab75-d319f58a2fff","Path":null,"Order":11,"CategoryType":0,"Icon":null,"Title":"Magnet Tool","Languages":[{"Code":"en","Title":"Magnet Tool","Slug":"magnet-tool","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"ae663634-662b-4341-8950-8e2fa0426534","Path":"the-element-tool-v-is-used-to-deal-with-elements.md","Order":1}],"Id":"40429825-8af2-4f5c-8151-6393e07a557b","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"Element tool","Languages":[{"Code":"en","Title":"Element tool","Slug":"element-tool","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"403f1b84-0ec2-40af-86d2-f5b981347d59","Path":"single-corner.md","Order":4},{"Id":"f26216e9-9572-4b37-8683-bdd54857c61e","Path":"marquee-select.md","Order":5},{"Id":"164705ea-a0b8-44c3-a03e-656c7ea7054f","Path":"the-scissors-tool-k-key-allows-you-to-cut-complex-outlines-into-basic-components.md","Order":6},{"Id":"c274f749-455b-41c6-a9a4-76c82821935e","Path":"node-to-node.md","Order":1},{"Id":"3d06ce68-029c-400d-80fc-809f16f50866","Path":"scissors-tool-unlink-nodes-add-ink-traps.md","Order":2},{"Id":"9777192e-9367-435c-9e06-60b205e31bbe","Path":"single-corner1.md","Order":3}],"Id":"767a27dc-8580-45fd-9655-c46c18b7db06","Path":null,"Order":20,"CategoryType":0,"Icon":null,"Title":"Scissors tool","Languages":[{"Code":"en","Title":"Scissors tool","Slug":"scissors-tool-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"cbba767b-b6d8-42f0-b3d6-f4c9f15be98d","Path":"zoom-tool1.md","Order":1}],"Id":"8fb40965-2763-4c6a-a10e-3083a67d02e6","Path":null,"Order":26,"CategoryType":0,"Icon":null,"Title":"Zoom Tool","Languages":[{"Code":"en","Title":"Zoom Tool","Slug":"zoom-tool","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"61e2e245-7386-4d74-bb74-d8a76a6c1779","Path":"brush-tool1.md","Order":1},{"Id":"89949589-6af5-4fd0-8fe0-c7bd5c948cdb","Path":"summary.md","Order":2},{"Id":"7b78b4c8-d220-4322-b252-13d23c2d9452","Path":"the-brush-tool-b-in-fontlab-works-somewhat-like-the-brush-tool-in-any-bitmap.md","Order":3}],"Id":"e2ba680d-bc4e-4174-b3a5-9ea286746556","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Brush tool","Languages":[{"Code":"en","Title":"Brush tool","Slug":"brush-tool-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"d75cb896-e868-4f60-b361-f77b2dbbe889","Path":"tba-7.md","Order":1}],"Id":"dcba2c93-f921-42bb-ace8-62714986da3d","Path":null,"Order":18,"CategoryType":0,"Icon":null,"Title":"Rotate Tool","Languages":[{"Code":"en","Title":"Rotate Tool","Slug":"rotate-tool","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"b6068201-6a8a-4869-bbc3-4232f005181b","Path":"erasing-with-the-rectangle-tool.md","Order":2},{"Id":"1f79b7da-cade-40e2-a68c-1590ba0d807d","Path":"rectangle-tool1.md","Order":3},{"Id":"5e5699a3-4f3e-40e6-8f62-5abe40dd740a","Path":"drawing-with-the-rectangle-tool.md","Order":1}],"Id":"8f12ae1a-a3bd-474f-99e5-11153583e376","Path":null,"Order":17,"CategoryType":0,"Icon":null,"Title":"Rectangle Tool","Languages":[{"Code":"en","Title":"Rectangle Tool","Slug":"rectangle-tool-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"dff823c5-cc9c-457b-af9a-0d29dfe91312","Path":"free-transform-1.md","Order":1}],"Id":"9f9717da-9486-4d81-bdd4-e78723431ace","Path":null,"Order":25,"CategoryType":0,"Icon":null,"Title":"Transform Tools","Languages":[{"Code":"en","Title":"Transform Tools","Slug":"transform-tools","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"3b26fdd7-fae7-47cb-8431-4922d5380209","Path":"handle.md","Order":7},{"Id":"6dacd02a-c611-45be-9711-ea26f7f8e679","Path":"the-summary.md","Order":18},{"Id":"93c217b5-50ee-4561-86d0-bd0f66afaa2c","Path":"modifying-segments.md","Order":9},{"Id":"17fc64d2-2a35-4999-be6f-d344f6720f21","Path":"converting-segments.md","Order":4},{"Id":"39bda5aa-9c97-469e-8f07-1f4957c58345","Path":"contour-tool1.md","Order":3},{"Id":"ee15101a-aae3-40ef-8626-f3a7e645d67d","Path":"canvas.md","Order":1},{"Id":"70ac848e-570b-4fa1-8129-f49046441139","Path":"deleting-segments.md","Order":6},{"Id":"3bde1529-25c3-4403-918b-81fccfd236bc","Path":"inserting-nodes.md","Order":8},{"Id":"ddcd6ac7-feee-4e9d-8fa5-6fdddffd30da","Path":"options.md","Order":12},{"Id":"f92ae7e3-3ece-4df2-891a-b60acf81a4a8","Path":"special-features.md","Order":15},{"Id":"c1c8f800-4b85-4c4c-b849-e04a8cf33c44","Path":"node.md","Order":11},{"Id":"0c4a70e1-f646-41e5-add3-690d7fe1fbd6","Path":"selecting-nodes-and-contours.md","Order":14},{"Id":"7a227cac-8718-4406-aa26-a738ddfcc3d5","Path":"the-contour-tool-is-used-for-normal-editing-of-the-contours.md","Order":17},{"Id":"59d20411-9ed0-42a2-bb58-73801f5e7e0d","Path":"moving-nodes.md","Order":10},{"Id":"bcb7bc3e-5d86-4045-88d7-16c2e40e4164","Path":"table-summary.md","Order":16},{"Id":"2a0c129b-40fc-414c-9c3a-1862b67fd2cb","Path":"deleting-nodes-and-handles.md","Order":5},{"Id":"80b74e97-e883-404a-81f9-5d9b4160d3d8","Path":"changing-node-types-2.md","Order":2},{"Id":"865c8c76-a9ee-47bc-ae28-2fe45f412696","Path":"segment.md","Order":13}],"Id":"a65b9151-5ca1-470f-84f1-0aa63f88d829","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"Contour tool","Languages":[{"Code":"en","Title":"Contour tool","Slug":"contour-tool-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"a5bb7921-06b5-49c7-95fb-7d0e8bbea89e","Path":"tba-9.md","Order":1}],"Id":"984734f6-9f71-44d0-a19a-19b43c162c72","Path":null,"Order":21,"CategoryType":0,"Icon":null,"Title":"Slant Tool","Languages":[{"Code":"en","Title":"Slant Tool","Slug":"slant-tool","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"44e9cb2d-407f-4820-95d1-c835f2d80b88","Path":"the-guides-tool-g-key-is-used-for-creating-pins-anchorsanchorsandpins.md","Order":2},{"Id":"c3be00c0-c884-4256-bd98-ea1c0ee0cebc","Path":"guides-tool1.md","Order":1}],"Id":"e785d8e5-3446-49df-8fc0-a02bd572d311","Path":null,"Order":8,"CategoryType":0,"Icon":null,"Title":"Guides tool","Languages":[{"Code":"en","Title":"Guides tool","Slug":"guides-tool-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"828ada1b-efda-428e-aaf0-978b853ffe12","Path":"rapid-tool1.md","Order":5},{"Id":"e714b04e-e25d-465d-970a-3ba302150faf","Path":"working-with-the-rapid-tool.md","Order":1},{"Id":"3313b0a3-20c7-4cad-8eb4-aaf418169c6a","Path":"laying-out-nodes.md","Order":4},{"Id":"71b6149d-ecd7-4990-b058-5dc56114fff9","Path":"adjustments.md","Order":2},{"Id":"42b6d177-b546-42ce-9541-eaa23698d776","Path":"rapid-tool2.md","Order":6},{"Id":"aa0ac746-9495-4cfa-b27a-bc6e40b322d4","Path":"laying-out-control-points.md","Order":3}],"Id":"121d6824-9deb-434d-a1ce-affffa37b409","Path":null,"Order":16,"CategoryType":0,"Icon":null,"Title":"Rapid Tool","Languages":[{"Code":"en","Title":"Rapid Tool","Slug":"rapid-tool-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"3d70305b-d3c7-41cb-b6c4-a75555750f30","Path":"tba-8.md","Order":1}],"Id":"d5f3c9c8-7a44-4b54-8d2f-c0658b3944e1","Path":null,"Order":19,"CategoryType":0,"Icon":null,"Title":"Scale Tool","Languages":[{"Code":"en","Title":"Scale Tool","Slug":"scale-tool","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"25de3a71-8f40-4b7b-8be3-85a59d3912ce","Path":"previewing-opentype-features-1.md","Order":7},{"Id":"7eab8d9d-af87-42e4-82ff-53965e771141","Path":"auto-preview-in-text-mode.md","Order":5},{"Id":"d2dad3fb-f98a-4b13-a54a-df335353e8d1","Path":"adding-context-to-text-in-the-glyph-window-1.md","Order":4},{"Id":"7b043c6f-21a8-43bb-8642-94b21f4c9b9a","Path":"text-tool-3.md","Order":1},{"Id":"83d8a625-d5bc-4fad-9393-7d22d6b04458","Path":"using-the-text-library.md","Order":8},{"Id":"8fc5cbdc-f604-4b9d-9a79-c5fb1077d18a","Path":"modifying-formatting-in-the-glyph-window-1.md","Order":6},{"Id":"d35f1202-ba0c-4e37-b7c2-d9ed3cd09d1b","Path":"content-sidebar-1.md","Order":2},{"Id":"a6f63500-a401-4bb7-8137-0e61990b38e2","Path":"text-tool-property-bar.md","Order":3}],"Id":"d7bacb6e-8f98-46ab-99e4-a5fd9754d75b","Path":null,"Order":22,"CategoryType":0,"Icon":null,"Title":"Text Tool","Languages":[{"Code":"en","Title":"Text Tool","Slug":"text-tool-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"0d849e80-579e-48ca-986d-07ee2e2124bf","Path":"to-make-a-contour-segment-compatible-across-all-masters.md","Order":2},{"Id":"970a034e-b2eb-410f-9d30-b553ff84b7ef","Path":"the-matchmaker-tool-helps-prepare-masters-for-better-interpolation.md","Order":1}],"Id":"f4af7736-dd50-4ac2-9cc9-9bf2c567f410","Path":null,"Order":12,"CategoryType":0,"Icon":null,"Title":"Matchmaker tool","Languages":[{"Code":"en","Title":"Matchmaker tool","Slug":"matchmaker-tool-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"7fc6d015-2a4d-4e96-a6ca-928478d25099","Path":"the-kerning-tool-k-is-present-in-the-toolbar.md","Order":1}],"Id":"b55f7491-c0da-4022-9839-79d250cb6b68","Path":null,"Order":9,"CategoryType":0,"Icon":null,"Title":"Kerning tool","Languages":[{"Code":"en","Title":"Kerning tool","Slug":"kerning-tool","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"7feae289-8673-49c2-bd92-51d45f79934b","Path":"editing-an-existing-contour.md","Order":1},{"Id":"03f2aa5a-a629-41c0-9d1e-2349ee2f5e7e","Path":"pencil-tool1.md","Order":2}],"Id":"07f16a5e-7d05-4c4f-b85d-29dcdc259bd9","Path":null,"Order":15,"CategoryType":0,"Icon":null,"Title":"Pencil Tool","Languages":[{"Code":"en","Title":"Pencil Tool","Slug":"pencil-tool-1","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"f4582565-677f-4ed6-bf2d-02b7f97e0071","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"Application Tools","Languages":[{"Code":"en","Title":"Application Tools","Slug":"application-tools","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"29a19411-3e5c-4fe9-be72-f09b2ceb9169","Path":"editing-layer-properties.md","Order":3},{"Id":"92150e19-909f-4336-928b-bba3edb924e0","Path":"copying-contents-as-texts.md","Order":1},{"Id":"f44c72ca-4ccd-48ae-b733-8192fe3af372","Path":"additional-options-1.md","Order":2},{"Id":"7a754a33-4b18-4d66-b268-ea0185b9bd61","Path":"embedding-2.md","Order":4},{"Id":"f7d281a7-413f-4430-a011-c86cf0136232","Path":"finishing.md","Order":5},{"Id":"75b42a3a-4fda-4203-b2fa-ddb4475c0c90","Path":"overlay-preview.md","Order":6},{"Id":"ee937515-0e31-4ec8-8feb-bbcd364e3afd","Path":"overlaying-fonts-2.md","Order":7}],"Id":"f2200884-a666-4ac8-9ed2-0c5c60f6333e","Path":null,"Order":8,"CategoryType":0,"Icon":null,"Title":"Additional features","Languages":[{"Code":"en","Title":"Additional features","Slug":"additional-features-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"0eb1f54a-1eab-4ded-8402-07c54f2e93a8","Path":"move-to-trash-recycle-bin.md","Order":1},{"Id":"0a259655-38be-4ae0-b2c7-d4aa837b3b37","Path":"export-profiles1.md","Order":2},{"Id":"ff3b1ecb-8a3d-4ca9-891c-bc4c367e8e99","Path":"cff2based-variable-ps-fonts.md","Order":7},{"Id":"e6e94d84-0cf7-406a-881d-307430e0da4c","Path":"exporting-variable-fonts.md","Order":5},{"Id":"b416549a-6bd3-4d39-be49-330d3b6448a2","Path":"opening-and-exporting.md","Order":8},{"Id":"7f351ec1-1e73-44ca-a17f-b15a4158eb36","Path":"lastused-export-profile.md","Order":3},{"Id":"c288e37d-954f-467a-93c6-8c70679a0b92","Path":"family-name-visible-when-exporting-instances.md","Order":4},{"Id":"ecdd0a5a-f995-4799-8276-16dd6a003c4b","Path":"exporting-looped-corners.md","Order":6}],"Id":"044ac2a8-c62d-4866-89e2-da2b57586733","Path":null,"Order":14,"CategoryType":0,"Icon":null,"Title":"Export Profiles","Languages":[{"Code":"en","Title":"Export Profiles","Slug":"export-profiles-1","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"f1f56bf5-840a-474f-839f-6fec2b475a3e","Path":"masters-1.md","Order":2},{"Id":"8c547304-9fb5-4215-8852-f5b15c25fa3d","Path":"export-notification.md","Order":21},{"Id":"07066ee9-68e9-41ad-b3d6-560c6dd91249","Path":"creating-new-profiles.md","Order":5},{"Id":"167b5147-1374-4cd1-be3e-ac9780324842","Path":"choosing-new-export-options.md","Order":3},{"Id":"593cab1d-aaa3-472d-b24b-b01e84735d2d","Path":"instances-1.md","Order":4},{"Id":"b62bdff5-15f8-4318-90d2-dd520e648d48","Path":"exporting-opentype-variations-tt.md","Order":19},{"Id":"a9a770bd-a4b0-497d-b447-0e1ad488f40d","Path":"font-formats-1.md","Order":7},{"Id":"bc6fa350-5be6-43d1-a1a1-fe03f420b642","Path":"exporting-options-1.md","Order":12},{"Id":"fc817d17-6ae4-4c15-94ca-52e13e397dc9","Path":"exporting-masters-designspaceufo-opentype-variations.md","Order":16},{"Id":"11c117ff-a36c-461b-90f2-43fe08710183","Path":"exporting-mark-attachment.md","Order":15},{"Id":"63a11e97-4d57-4fc0-9478-114299e3622a","Path":"activatingdeactivating-profiles.md","Order":1},{"Id":"5392df6c-2270-4405-ab22-c2c92f4bbcb8","Path":"exporting-fonts-4.md","Order":13},{"Id":"db76e37d-4611-4c1a-80fc-b2e6f75602e2","Path":"exporting-opentype-ps.md","Order":18},{"Id":"11420e4f-5fe1-4fd2-8d77-ddb08e7bd932","Path":"font-content.md","Order":9},{"Id":"fed23142-fa99-43ab-b2ab-c111afd8643a","Path":"variable-tt.md","Order":31},{"Id":"5ed907f4-0eef-485d-bb81-7fa429aa2baf","Path":"designspace-ufo3.md","Order":24},{"Id":"2c2ea984-2c6e-406c-a7e6-010f4389c93e","Path":"exporting-open-contours-as-singlestroke-fonts-for-engravers-and-plotters.md","Order":17},{"Id":"f67da7b1-9a37-4888-91bf-e7913a556e25","Path":"gallery.md","Order":25},{"Id":"f24a7e69-0b4a-49ab-ab4e-f985e5e80c15","Path":"metrics-4.md","Order":29},{"Id":"1df1c186-6efc-4c2e-8684-da89961cceeb","Path":"easier-handling-of-export-profiles.md","Order":23},{"Id":"d20bf3ae-6fe2-4e0b-b0ff-e240a362c019","Path":"current-layer.md","Order":6},{"Id":"a7b84747-39fa-49ee-b39f-694301349688","Path":"additional-export-features-1.md","Order":28},{"Id":"2896d33c-7b90-4592-bc37-ded9dbd1aac3","Path":"color-web-fonts.md","Order":27},{"Id":"35ddb204-a803-4d70-805f-8147565d7c83","Path":"destination.md","Order":8},{"Id":"cea7e0d2-21af-4404-8281-f332501129a9","Path":"editing-profiles.md","Order":10},{"Id":"5b47c1b8-4ed9-4dbb-827e-41a52e0be9cf","Path":"opening-and-exporting-ufo.md","Order":30},{"Id":"2d2162c7-4b04-4530-9e86-0c3791bc21f5","Path":"features-4.md","Order":22},{"Id":"11614b66-e007-40ff-888f-9d7b053f3f44","Path":"example.md","Order":11},{"Id":"b73f3d5b-ff41-4531-b537-1f2f0930fa04","Path":"exporting-opentypecbdt-color-fonts.md","Order":20},{"Id":"7bafec37-fc30-4796-b27c-d5be21bda501","Path":"window-contents.md","Order":32},{"Id":"76f4641d-bd9c-4605-a5c8-a2921a083239","Path":"hyphens-in-glyph-names.md","Order":26}],"Id":"57ca5cf5-468a-426f-9a04-1f1b644e7e8f","Path":"export-profiles.md","Order":5,"CategoryType":1,"Icon":null,"Title":"Export Profiles","Languages":[{"Code":"en","Title":"Export Profiles","Slug":"export-profiles","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"c72f505f-1b41-4408-a723-474d0566afdb","Path":"new-syntax-for-axis-instances.md","Order":4},{"Id":"4be28c13-535f-4867-98c4-a8d5bf167e61","Path":"no-style-linking.md","Order":5},{"Id":"ad668b41-3f78-4407-b824-0bd74284904c","Path":"change-the-axis-range-and-define-nonlinear-mapping-between-design-and-user.md","Order":1},{"Id":"3f585aeb-4d43-435b-9cab-c4f1e5db4ecc","Path":"variations-in-font-info.md","Order":6},{"Id":"cef4c57c-7c04-48ec-9283-0b84f4a35c35","Path":"font-info-overview-copypaste-and-edit-info-in-a-multimaster-table.md","Order":3},{"Id":"c3ded9fc-6600-4071-a172-6994ce667f80","Path":"copypaste-font-info-between-fonts-and-masters.md","Order":2}],"Id":"30ef7a4c-1433-4ff7-998c-fa543fb291f5","Path":"font-info-1.md","Order":1,"CategoryType":1,"Icon":null,"Title":"Font Info","Languages":[{"Code":"en","Title":"Font Info","Slug":"font-info-1","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"e5eb01c0-e038-42e1-bddb-c7f5abb60c6c","Path":"font-info-italic-angle.md","Order":2}],"Id":"be761c02-7413-4ccd-8138-5c50fc71aa88","Path":null,"Order":7,"CategoryType":0,"Icon":null,"Title":"Font Info","Languages":[{"Code":"en","Title":"Font Info","Slug":"font-info","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"b921168f-9008-42c6-ae06-745e4c8839d9","Path":"family-dimensions.md","Order":14},{"Id":"fc8b0bc8-9480-49ef-99fb-3fcbd49659e4","Path":"embedding-1.md","Order":13},{"Id":"afd1498d-cc08-40fb-bf3d-eebecbd14db6","Path":"font-dimensions.md","Order":16},{"Id":"16c171e1-8309-41c6-a2bc-4cbdcb15a0d8","Path":"caps-height.md","Order":29},{"Id":"97dc25ac-368a-4e6d-850d-8dc25a3b8926","Path":"attributes.md","Order":2},{"Id":"f9389051-1c57-406a-8b63-f13ca7218b51","Path":"example-1.md","Order":12},{"Id":"5cbf44d7-3092-42a7-8c05-31d17e87a7c6","Path":"legal.md","Order":22},{"Id":"01b09f00-d6d9-4616-bfcb-54aee867a930","Path":"safe-top-and-safe-bottom.md","Order":32},{"Id":"81859b1d-a4ba-4681-aa20-dbce97f29fd9","Path":"slope.md","Order":33},{"Id":"3098ab5d-103f-49c5-a3fd-c96070732485","Path":"axes-1.md","Order":36},{"Id":"15a21656-5e0c-47ea-a7b2-16b08b856826","Path":"curve-tension.md","Order":17},{"Id":"ec2fb053-e205-4d32-bee7-29fe6db6c1f9","Path":"font-info-dialog-box-1.md","Order":10},{"Id":"1420a894-e6cb-415f-b012-1505000c1912","Path":"creator.md","Order":18},{"Id":"ea401e86-0350-4b63-b062-c3365c462b12","Path":"unicode-ranges.md","Order":40},{"Id":"e1add242-38de-45ce-93ef-aac7332c4322","Path":"stems-2.md","Order":34},{"Id":"302e3d9c-5de0-4916-915e-59fb07aeabbf","Path":"master-properties.md","Order":7},{"Id":"5beacc29-a2db-4207-a368-f00da0541b6c","Path":"master-name.md","Order":8},{"Id":"d15202e1-b5ce-4afd-91fc-baa8fcc43aa2","Path":"units-per-em.md","Order":41},{"Id":"a5164150-61b9-427f-ab55-a98b5daff7ec","Path":"zones-1.md","Order":44},{"Id":"05df5871-819b-4796-98ef-a1915131250c","Path":"corner-tension.md","Order":19},{"Id":"9b6a3bff-7dea-41b4-8c1b-b3406815d3ff","Path":"uposition-and-uthickness.md","Order":39},{"Id":"914bfdfe-1852-433c-8e3c-6b4b3866d5e1","Path":"instances-2.md","Order":20},{"Id":"723eee9b-5efc-413d-89a0-3b9a03a1284e","Path":"italic-angle.md","Order":21},{"Id":"b167a4bb-f680-4aae-b973-84c6f9f8b56e","Path":"renaming-by-adding-a-suffix.md","Order":30},{"Id":"efa8b5fb-fa27-4cde-a922-e3e20fdccb9a","Path":"caret-offset-1.md","Order":25},{"Id":"7825b5f0-7007-4726-a536-efb5325bcd8a","Path":"style-link.md","Order":3},{"Id":"09ba36c7-22bf-41f3-a809-092acda85c2a","Path":"other-values.md","Order":27},{"Id":"8ceeb368-0065-4188-b02f-21d214a4af6b","Path":"postscript.md","Order":6},{"Id":"a2ea91ea-0e3b-4f1c-a47b-5f64ea6d0966","Path":"family-name.md","Order":11},{"Id":"74fdd5ae-3bba-4a67-a207-b5729d7f6fe6","Path":"codepages-1.md","Order":24},{"Id":"22a93602-fb96-4bf2-b198-bf13cea385cf","Path":"vendor-code-and-name.md","Order":42},{"Id":"45f495eb-5850-4f67-9013-0532cb1f96dc","Path":"xheight.md","Order":43},{"Id":"20456a21-4ffb-44c0-bc70-6b5716e8e3cb","Path":"descender.md","Order":15},{"Id":"9847677e-bd06-4ac7-99cb-0637b2316370","Path":"style-name.md","Order":1},{"Id":"6c69ffc1-d230-482f-a8c1-7d99ef3e6cb1","Path":"parameters-1.md","Order":28},{"Id":"87f7461c-c61e-44c7-a760-239dfa883e94","Path":"truetype-hinting-and-smoothing.md","Order":38},{"Id":"97f71933-782c-4f39-9688-d02ad4d2e02f","Path":"renaming-glyphs-3.md","Order":31},{"Id":"cf5116ea-be21-4a29-b2ec-af877f2795c6","Path":"line-gap.md","Order":23},{"Id":"b2debaca-c406-42fb-85de-fdb0284c1379","Path":"bbox-top-and-bbox-bottom.md","Order":35},{"Id":"f32090b3-da3a-4f06-91f6-2acd527dbcbd","Path":"build-names-button.md","Order":5},{"Id":"ccfeb1c5-fb3b-4d5b-8376-8c50c2488f3b","Path":"masters-2.md","Order":26},{"Id":"2d2db137-9308-4ee7-bdc4-5fdcf5f0a791","Path":"ascender.md","Order":37},{"Id":"e9984daf-e881-41f4-982f-6c2ffd844896","Path":"style-group.md","Order":4},{"Id":"f5a5394f-9c20-4148-b808-56aece81dd37","Path":"full-name.md","Order":9}],"Id":"9aa75c6a-7c56-4a23-a2cc-a1ea3e3302e6","Path":"font-naming.md","Order":6,"CategoryType":1,"Icon":null,"Title":"Font Naming","Languages":[{"Code":"en","Title":"Font Naming","Slug":"font-naming","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"a89c2e26-00af-4038-8dbe-89e41329c8b6","Path":"export-font-as-enable-and-disable-instances.md","Order":1},{"Id":"0c88b67d-fbcf-4cc4-8a26-84d46c4b35f4","Path":"special-glyphs-null-and-cr.md","Order":5},{"Id":"eb57e83e-6a43-40cb-86c5-b18708d47167","Path":"tables-panel-define-custom-opentype-tables.md","Order":6},{"Id":"b8cde158-3dd3-457a-90e9-de742db90f47","Path":"opentype-symbol-fonts.md","Order":4},{"Id":"3ececd9d-963f-44cd-8c6f-b6a949010bc5","Path":"export-font-as-export-single-masters-or-instances-as-vfcvfj.md","Order":2},{"Id":"7edfca02-c031-4cd4-88e4-fd80738585a6","Path":"glyph-names-3.md","Order":3}],"Id":"74719037-fb7a-45aa-bc6d-aa98440912cb","Path":null,"Order":9,"CategoryType":0,"Icon":null,"Title":"Support and exporting of OpenType fonts","Languages":[{"Code":"en","Title":"Support and exporting of OpenType fonts","Slug":"support-and-exporting-of-opentype-fonts","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"9c130286-efc9-43e9-a16c-f63f6454671b","Path":"tracking-slant-stretch.md","Order":11},{"Id":"30fd8bdc-e99d-497a-b2d7-3630adad328c","Path":"preview-panel-sidebar-1.md","Order":8},{"Id":"bc342bed-97da-49e5-9c85-57ff3fe20d8c","Path":"preview-panel1-1.md","Order":9},{"Id":"befe0fc6-9569-445f-8b90-c7f9135ea87f","Path":"color-3.md","Order":4},{"Id":"8ea97c26-e971-477a-8f33-9aec38f2d74b","Path":"fill-outline-nodes.md","Order":7},{"Id":"7ecb318d-e6cf-4f43-a112-eaa2a747f04e","Path":"content-settings.md","Order":5},{"Id":"e70a3dcd-aee1-49e0-a8a3-29c6b07e2f49","Path":"current-glyph-placeholder.md","Order":1},{"Id":"d8a0d85f-ab28-4fac-8427-c05a6a1eface","Path":"align-and-flip-settings.md","Order":2},{"Id":"05707b40-4914-4b41-89a5-ed366fd7c6f1","Path":"export-preview-panel-content-to-pdf.md","Order":6},{"Id":"e29c5d95-984c-408e-922f-e3f14eb9be5c","Path":"show-names.md","Order":10},{"Id":"0efb529e-03be-4876-af46-f54d29957023","Path":"xray-view-blur.md","Order":12},{"Id":"b55fb3c6-6010-4455-9a3e-579f3e700bd7","Path":"apply-features.md","Order":3}],"Id":"5a184c2d-432b-4611-bc59-b1baacf523ba","Path":"preview-panel-2.md","Order":10,"CategoryType":1,"Icon":null,"Title":"Preview panel","Languages":[{"Code":"en","Title":"Preview panel","Slug":"preview-panel-2","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"a03f2f60-60ee-4140-a4c1-8cb1503fe837","Path":"hinting-in-otf-1.md","Order":1},{"Id":"3bb134b6-c8ba-45b0-8113-931a1a9b88f8","Path":"color-fonts-1.md","Order":2},{"Id":"940b6f9c-db97-490f-bda8-19d009307af3","Path":"export1.md","Order":3},{"Id":"beb1a5f0-9e44-4600-8dba-ae1e2c0c63a9","Path":"font-info-slope-and-sorting-of-styles-in-font-menus.md","Order":4},{"Id":"780d0b7c-bdfc-47c1-8894-c6b633c9b2ed","Path":"bitmap-fonts-1.md","Order":5}],"Id":"0d74d8cb-afd4-4558-b42c-978542797b0a","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Export","Languages":[{"Code":"en","Title":"Export","Slug":"export-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"2cd64149-2ade-4c64-a130-fe920d37c90e","Path":"metrics-linking-in-set-width-action.md","Order":2},{"Id":"4a65b9de-7e21-456e-af69-91be229ceabd","Path":"open-and-export.md","Order":3},{"Id":"2e17e383-481a-4fca-9f42-a21df9dde705","Path":"stat-table-in-variable-opentype-fonts.md","Order":4},{"Id":"c1a8652a-d59d-4a4a-85df-ebf8c0ab7e82","Path":"implicit-weight-andor-width-axis-location.md","Order":1}],"Id":"54b25384-cd36-44dd-8116-22fdf27d3b98","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"Exporting Fonts","Languages":[{"Code":"en","Title":"Exporting Fonts","Slug":"exporting-fonts-1","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"6fa08b25-2c50-4d26-a005-51d5eecc39af","Path":"export-rr.md","Order":3},{"Id":"49c3a14d-ac6e-4fe6-9ac0-8231544e2f77","Path":"glyphs-1.md","Order":6},{"Id":"674bd430-3425-479e-a2d9-8c9aaa16955e","Path":"hints-3.md","Order":7},{"Id":"517fe3ab-c4c8-4825-820c-791168d33cbc","Path":"kerning-and-opentype-layout-features.md","Order":8},{"Id":"6d7cadc4-23a7-4dbc-b900-71b69906579e","Path":"font-info-8.md","Order":5},{"Id":"0ef70ff8-374b-42dc-bd50-ade9f447ba2a","Path":"character-set.md","Order":1}],"Id":"3eed6a48-9160-4680-8b92-895cf3f5fcb0","Path":"before-you-export.md","Order":3,"CategoryType":1,"Icon":null,"Title":"Before You Export","Languages":[{"Code":"en","Title":"Before You Export","Slug":"before-you-export","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"24fd803c-4a6d-4dba-b63c-2d8c9a232e9a","Path":"exporting-fonts1.md","Order":2},{"Id":"507c497a-3bf5-475e-84ff-bf17219da05d","Path":"saving-as-vfb.md","Order":1},{"Id":"b7609184-fff2-498c-bf3b-e3c9dc5adfcb","Path":"glyph-ordering-in-ufo.md","Order":4}],"Id":"9b6ebd74-0888-4eed-b0d8-a3e4e08a5db7","Path":"exporting-fonts.md","Order":12,"CategoryType":1,"Icon":null,"Title":"Exporting Fonts","Languages":[{"Code":"en","Title":"Exporting Fonts","Slug":"exporting-fonts","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"b8ea0b39-9f4d-4154-8d74-470c21a48b97","Path":"build-style-names.md","Order":1},{"Id":"5922c783-dc40-4532-9a7d-2b8d93722949","Path":"families-from-postscript-name.md","Order":3},{"Id":"57655b40-fe9c-4d53-8c60-93d791bb1afd","Path":"build-styling-group-names.md","Order":2},{"Id":"3ffdad22-a1ad-48ba-99c6-282d7b4e2bc8","Path":"merge-families.md","Order":6},{"Id":"d1eacef6-4e11-45f3-96c6-1dcf0dfb22b3","Path":"families-from-styling-group.md","Order":4},{"Id":"f0665839-6a03-4146-9599-30a80c7a77dc","Path":"separate-families.md","Order":8},{"Id":"4b72bfd1-e9fd-4c2b-8e36-cb5809aa0f9e","Path":"optimal-styling.md","Order":7},{"Id":"29daf763-493b-473f-90f8-973ad4d9b238","Path":"separate-styling.md","Order":9},{"Id":"fb9f22a7-edae-4a56-8ff7-29c4b3e5123b","Path":"italic-styling.md","Order":5}],"Id":"0d05c921-2899-4429-bf83-5446e62e0f17","Path":"organizing-font-families.md","Order":1,"CategoryType":1,"Icon":null,"Title":"Organizing Font Families","Languages":[{"Code":"en","Title":"Organizing Font Families","Slug":"organizing-font-families","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"82ce087f-ec96-48f5-af5d-6e8341af885b","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Font families","Languages":[{"Code":"en","Title":"Font families","Slug":"font-families","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"10a2915c-79fa-41af-9c9a-3c01b1e790c1","Path":"defining-axis-instances.md","Order":2},{"Id":"74d36b05-595a-40bf-878e-8d9f15323b73","Path":"adding-a-predefined-instance.md","Order":1},{"Id":"2fd2e2d4-7849-4022-aadd-2c2badae14d4","Path":"removing-a-predefined-instance.md","Order":4},{"Id":"eae43f27-0601-4cf7-a75f-bf992d8c6868","Path":"working-with-instances.md","Order":5},{"Id":"9c9f9fa7-651d-4193-8e2e-b0924cd95173","Path":"editing-predefined-instance-properties.md","Order":3}],"Id":"d7e5b649-5906-4bf1-9921-bae9dff5716c","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"Instances","Languages":[{"Code":"en","Title":"Instances","Slug":"instances","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"14a594c3-1ab7-4adb-90f6-9ec81b4c7e87","Path":"add-layers-and-masters1.md","Order":10},{"Id":"9940948b-bc39-452f-aab2-9e92227a5d77","Path":"adding-layers-and-masters.md","Order":2},{"Id":"314a3f16-f8bd-470a-8b3e-d7dbc22ec6f3","Path":"add-layers-and-masters.md","Order":1},{"Id":"869a1b6c-87d9-4ace-8db5-3ef9ec30966c","Path":"current-master-or-instance.md","Order":5},{"Id":"1dc2ed40-1c9e-4268-a594-93feb796bbe0","Path":"layers-masters-panel-1.md","Order":8},{"Id":"46a06009-0e49-43d1-9a49-90ce3a0f1406","Path":"removing-a-font-master.md","Order":15},{"Id":"11c65732-cfe0-4784-b90c-6ac9d63b2d3f","Path":"master-switching-on-empty-glyph-cells.md","Order":9},{"Id":"7af44d56-2629-405f-9242-815ccd8d9eca","Path":"switching-masters.md","Order":19},{"Id":"25dc239e-ff53-4cfb-b321-9619b45f20ab","Path":"rename-masters.md","Order":16},{"Id":"b4c1a2f9-6e68-467e-8b72-2869c0f10b31","Path":"working-with-masters.md","Order":20},{"Id":"d1c37ddf-d3ee-41f0-966c-c0f8ebf3e468","Path":"sparse-masters-intermediate-masters.md","Order":18},{"Id":"99b5ccce-eea9-430a-9e6a-db0a91d9b357","Path":"matchmaker1.md","Order":12},{"Id":"80d5b03c-61d0-4d67-bafb-1a018ae665ee","Path":"editing-font-master-properties.md","Order":6},{"Id":"661e8048-83c1-4f07-9757-3c66009825f4","Path":"renaming-font-masters-and-their-layers.md","Order":17},{"Id":"83512631-884f-4ce5-bcd3-f4889b7f2be1","Path":"matchmaker.md","Order":13},{"Id":"2c781efe-0c59-4755-b3c9-88880241249f","Path":"match-masters.md","Order":11},{"Id":"9270dc39-d0b5-4760-b993-fb052714c447","Path":"copy-to-masters.md","Order":4},{"Id":"dccbf07b-e410-461a-95f3-078d63b454fd","Path":"multiple-masters.md","Order":14},{"Id":"80d9ccc4-96d0-484e-844a-5eb35ae3c2a9","Path":"adding-a-font-master.md","Order":3},{"Id":"9e40ac09-67c8-41de-bf82-6ab9d50de777","Path":"font-info-adding-font-masters-improved.md","Order":7}],"Id":"1e4c3fb7-424f-448a-ae6f-aa1cfa73ca7e","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"Masters","Languages":[{"Code":"en","Title":"Masters","Slug":"masters","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"2b5ea6fa-5a7c-42e3-abd8-dda40eaa512e","Path":"notes-about-conditional-glyph-substitution.md","Order":2},{"Id":"6e91254d-9573-4915-a157-2e3169daef0a","Path":"conditional-glyphs-rvrn-rules.md","Order":1},{"Id":"4ef6a6d7-1995-4b3c-bc61-23c3491e44e0","Path":"tilde-tags.md","Order":3}],"Id":"5205904d-cbc5-4c75-8ea2-e2c68b03efdf","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Conditional Glyphs","Languages":[{"Code":"en","Title":"Conditional Glyphs","Slug":"conditional-glyphs","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"e7ca0f9a-97ca-489f-9864-b8eddb63da61","Path":"variation1.md","Order":14},{"Id":"a4baa4c4-d6d6-4d74-b743-d8561f05c5e3","Path":"interpolation-of-named-elements.md","Order":6},{"Id":"4b236e71-06a9-4fc7-9f3b-50804578faa4","Path":"style-phrase.md","Order":12},{"Id":"8ad42b26-f2ac-4bb0-b855-8434733eadf6","Path":"match-when-editing-1.md","Order":8},{"Id":"ce0509fb-c7da-40bb-9086-99be209b3557","Path":"adding-dynamic-variation-as-font-master.md","Order":2},{"Id":"00b9a713-a9a0-47e3-a5e2-e952d145476e","Path":"variations-panel-4.md","Order":15},{"Id":"1cdef23b-61ed-4bcd-8450-7528df769b2e","Path":"nonmatching-glyphs-in-font-window-sidebar.md","Order":9},{"Id":"124aca1e-c62a-4622-9e32-928f71d0853a","Path":"add-variation.md","Order":1},{"Id":"885ad672-47dc-4fc9-b50f-3b0b25484a4c","Path":"interpolation-steps.md","Order":7},{"Id":"5d15beb3-3296-48f1-814b-9abf60afb01d","Path":"notes.md","Order":10},{"Id":"ec0370de-e563-4d14-92c8-cf8de7063b32","Path":"variation-panel.md","Order":13},{"Id":"6ad0188a-22c2-4a23-9c2b-31b7ecfe9ba5","Path":"working-with-font-variations-1.md","Order":16},{"Id":"0230e111-af83-405f-8a7b-6594e8adacf6","Path":"importing-fonts.md","Order":5},{"Id":"ec7a86c1-d679-46f8-93a5-8dcaeec7bc4e","Path":"reinterpolate.md","Order":11},{"Id":"e301aaa2-2f65-40cd-a274-e7f8b31176a4","Path":"creating-a-variable-font-example-1.md","Order":4},{"Id":"a70cee2d-55a7-4173-bd8a-57459e47b5f4","Path":"automatic-master-location-on-the-width-and-weight-axes.md","Order":3}],"Id":"f98a682c-5fe1-45bf-a4f8-18c04c40253d","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Variation","Languages":[{"Code":"en","Title":"Variation","Slug":"variation-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"8fda3293-cb20-410f-aa27-021e2902fcd5","Path":"userlocation.md","Order":13},{"Id":"0def4a51-505a-453d-9456-eb96df30a38f","Path":"designlocation.md","Order":9},{"Id":"2a89cad8-18da-44bb-9e55-c8ca119ad446","Path":"axis-graph2.md","Order":4},{"Id":"71ca4569-1b63-429e-b436-0f7677636149","Path":"implicit-weight-and-width-axes.md","Order":11},{"Id":"79c83d54-cf5d-4690-9796-1ef42e0d3ab1","Path":"axis-graph.md","Order":6},{"Id":"c60ed6a5-d20b-43a0-80d9-4251a8a86207","Path":"axis-instances-from-masters.md","Order":1},{"Id":"4ade9c17-dd93-4eec-9e5f-f40d95a17798","Path":"adding-an-axis.md","Order":7},{"Id":"80f41fdb-d582-46e1-be7e-29497b43a90b","Path":"removing-an-axis.md","Order":12},{"Id":"964192f8-8a8b-4616-8411-c351ccf11b34","Path":"axis-graph3.md","Order":5},{"Id":"88e9b42c-8e27-4321-a05b-341600748a32","Path":"axis-graph1.md","Order":3},{"Id":"938dda21-897f-4739-833e-445b24dfb225","Path":"axis-instances-from-masters1.md","Order":8},{"Id":"67dcd31f-f329-41db-a262-9d114ef5dd7a","Path":"editing-axis-properties.md","Order":10},{"Id":"dd14c397-dd86-4a70-8d53-f1e037facf1d","Path":"anisotropic-interpolation-separate-axis-locations-for-xy-coordinates.md","Order":2}],"Id":"0485ac34-7a73-4679-a98d-b6c95225d85b","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Axes","Languages":[{"Code":"en","Title":"Axes","Slug":"axes","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"86edc48c-132c-4842-80d2-975845e0d45c","Path":"preview-variations.md","Order":1},{"Id":"db927689-abf8-4e0a-a608-4f44191a0fc9","Path":"preview-of-multiple-masters.md","Order":2},{"Id":"85ccc388-8697-4338-bd9b-d65dea81a0af","Path":"previewing-instances-and-interpolation-results.md","Order":3},{"Id":"2f5d41dd-78af-4728-aa2c-78472a8bb235","Path":"preview-panel-content-masters.md","Order":5},{"Id":"ae26387d-b22c-4fb1-b6f7-7b91b4db4d84","Path":"crossmaster-components.md","Order":6},{"Id":"89562e32-176d-4fd2-b666-0c3cdf0060ba","Path":"preview-panel-content-masters1.md","Order":7},{"Id":"5d26ad01-e4a8-4488-bc5d-b7189a3b7f08","Path":"preview-variations1.md","Order":4}],"Id":"59d3cd54-61dd-43ad-a679-6811c5f88f90","Path":null,"Order":6,"CategoryType":0,"Icon":null,"Title":"Preview","Languages":[{"Code":"en","Title":"Preview","Slug":"preview-2","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"77491e20-111b-42e0-a0ff-1399c9d931cc","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Editing VF","Languages":[{"Code":"en","Title":"Editing VF","Slug":"editing-vf","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"da23dc0b-2d6b-4ed1-8968-6e7dcb3538d3","Path":"using-the-layer-preview-color.md","Order":4},{"Id":"13c65c53-91db-42f4-b7ea-97727e85818d","Path":"faster-interpolation.md","Order":3},{"Id":"d4cd7962-6943-42d6-92a8-60b373197a5c","Path":"axis-user-range.md","Order":5},{"Id":"ec5133ab-7805-4070-a119-8ff53962d1b5","Path":"variations-panel-3.md","Order":6},{"Id":"43db86ea-4106-44c5-b9d5-abc417002278","Path":"viewing-the-dynamic-instance.md","Order":7}],"Id":"b4647ded-1872-45d9-8360-84930ab13c62","Path":null,"Order":11,"CategoryType":0,"Icon":null,"Title":"Variable Fonts","Languages":[{"Code":"en","Title":"Variable Fonts","Slug":"variable-fonts","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"b7055a90-6a96-4d8d-b0ca-9427bd0f75de","Path":"welcome-to-fontlab.md","Order":1}],"Id":"f40b666a-4b20-4c1d-adc0-8d27381facb0","Path":"welcome-dialog-1.md","Order":1,"CategoryType":1,"Icon":null,"Title":"Welcome dialog","Languages":[{"Code":"en","Title":"Welcome dialog","Slug":"welcome-dialog-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"0cf2c046-4622-4ae8-b1bb-97ba5107b9ca","Path":"generate-glyphs-custom.md","Order":2},{"Id":"8c836c6b-1ef6-4054-a53c-f05a9d157ac8","Path":"generate-glyphs-characters.md","Order":1},{"Id":"4c849506-5270-41d6-b085-390b2a4933b5","Path":"generate-glyphs-variants.md","Order":5},{"Id":"17f95cfe-ad0d-40fd-bacf-4b901e183fb9","Path":"generate-glyphs-precomposed.md","Order":4},{"Id":"19e44908-515d-4811-b9dd-a8170e41b5d8","Path":"generate-glyphs-ligature.md","Order":3}],"Id":"7c2d6dc9-7730-4b50-98be-c7b3b48abc18","Path":"generate-glyphs.md","Order":3,"CategoryType":1,"Icon":null,"Title":"Generate Glyphs","Languages":[{"Code":"en","Title":"Generate Glyphs","Slug":"generate-glyphs","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"1db5e063-4a60-4650-ad7e-a32b18bbee25","Path":"add-layer.md","Order":3},{"Id":"4618e284-eb76-481b-8b01-ff41112d017b","Path":"add-suffix-to-name.md","Order":4},{"Id":"874fd495-61d0-48a3-96ed-27c8e9bc56d5","Path":"find-glyphs-1.md","Order":7},{"Id":"f81d7d3f-4c95-4813-bbe8-141f5f5067b7","Path":"generate-instance.md","Order":9},{"Id":"738ce222-e371-4678-92fc-abfa32f3298a","Path":"workspaces-4.md","Order":13},{"Id":"5c8512ed-5800-4cb9-a484-ece7dbca4647","Path":"rename-glyph.md","Order":12},{"Id":"afadef43-2da7-4138-9c31-305ad8181994","Path":"export-fonts.md","Order":6},{"Id":"7a3fc5ab-f08c-4688-ac2f-bfd5936fb166","Path":"find-outline.md","Order":8},{"Id":"b68490a3-bf0e-4e37-bfc9-ccb97ab9cef2","Path":"overlay-fonts-1.md","Order":10},{"Id":"63239b5d-66e1-440d-8049-d18c62b87274","Path":"commands-1.md","Order":5},{"Id":"1ca3650d-f0a6-41e1-bd5f-7b9436d59e5c","Path":"profiles-2.md","Order":11},{"Id":"93803dea-8369-41f2-bd02-8688f278a9fa","Path":"add-glyphs-1.md","Order":2},{"Id":"91938f17-71d7-4174-9f30-bbb15a7c61c1","Path":"add-element-reference.md","Order":1}],"Id":"19d3a5d8-7397-40ef-85f4-aff4d78f30b2","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Other dialogs","Languages":[{"Code":"en","Title":"Other dialogs","Slug":"other-dialogs","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"d89a6d08-fed3-4cb7-8ee1-0cb432804516","Path":"font-info1.md","Order":14},{"Id":"70e58e9b-4bcf-454c-9d70-3d4680413971","Path":"font-info-parameters-1.md","Order":10},{"Id":"04730fd6-59e0-4040-88e5-16dc469428d0","Path":"font-info-other-values.md","Order":9},{"Id":"fbe0729d-50c2-4bd8-92a5-94d7dbb48589","Path":"other-values-page.md","Order":15},{"Id":"4318ff24-4a01-4154-aed4-2f68fb00aff1","Path":"font-info-names.md","Order":7},{"Id":"9456fa09-ab3a-4f10-a2d7-0993d1bd041c","Path":"font-info-note.md","Order":8},{"Id":"3adadd3a-d65c-4f0d-86b1-33f4f2dfc3f8","Path":"font-info-zones.md","Order":13},{"Id":"fc153b50-7c57-4f22-ac62-7c9887bcd507","Path":"font-info-family-dimensions.md","Order":3},{"Id":"ab1f65c8-12e8-446b-9f76-1dbf6169144b","Path":"font-info-legal.md","Order":6},{"Id":"8a712527-b579-4183-8d7b-9f93bdd6b423","Path":"font-info-stems.md","Order":11},{"Id":"fcae58c1-8c05-430a-aaea-0eb056399870","Path":"font-info-creator.md","Order":2},{"Id":"23990ba1-a9af-4a86-bd64-3b83f83841e7","Path":"font-info-codepages.md","Order":1},{"Id":"1b4b376e-35ba-41ff-a740-efabfda045ad","Path":"font-info-guides.md","Order":5},{"Id":"1516fd0e-06c6-4951-8ae2-5701b5be2cb1","Path":"font-info-font-dimensions.md","Order":4},{"Id":"848ed129-2069-42bd-8ece-c7f19cad66fe","Path":"font-info-unicode-ranges.md","Order":12}],"Id":"6c6f084d-3405-428d-96c9-e3b8cb62bf3c","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Font Info","Languages":[{"Code":"en","Title":"Font Info","Slug":"font-info-2","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"0a51ad18-06db-4401-8973-2b1f717074a7","Path":"font-info-masters.md","Order":3},{"Id":"0a1d1aa4-ab4f-4967-bccc-fd3372e2316a","Path":"font-info-instances.md","Order":2},{"Id":"07da5ea9-b18f-4be8-ba1c-f99004698d0c","Path":"font-info-axes.md","Order":1}],"Id":"13fed40a-54a3-41e4-97b5-e5af2556f887","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"Font Info for Masters","Languages":[{"Code":"en","Title":"Font Info for Masters","Slug":"font-info-for-masters","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"63fc59f9-fd0c-4716-8a33-f96c0139726c","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"Dialogs","Languages":[{"Code":"en","Title":"Dialogs","Slug":"dialogs","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"feb19ce5-7637-4c90-b263-2794fbdd7468","Path":"preview-panel1-2.md","Order":1}],"Id":"48c3616e-e2cb-422e-b7a0-4708e1c864f3","Path":"preview-panel-3.md","Order":26,"CategoryType":1,"Icon":null,"Title":"Preview Panel","Languages":[{"Code":"en","Title":"Preview Panel","Slug":"preview-panel-3","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"a2efc53c-b8c9-4236-8818-98a9a2031187","Path":"history-panel1.md","Order":1}],"Id":"0976ddbc-6534-4e06-b067-3b901d64a55e","Path":"history-panel.md","Order":23,"CategoryType":1,"Icon":null,"Title":"History Panel","Languages":[{"Code":"en","Title":"History Panel","Slug":"history-panel","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"59c550f5-b96e-4bf0-8b85-c861f3ca7bdf","Path":"tables-panel1.md","Order":1}],"Id":"c8e4d6a7-44cc-47a5-813e-dc81948e38c3","Path":"tables-panel.md","Order":31,"CategoryType":1,"Icon":null,"Title":"Tables Panel","Languages":[{"Code":"en","Title":"Tables Panel","Slug":"tables-panel","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"3de1c36d-ca73-4185-ba8b-ddf3542590eb","Path":"swatches-panel1.md","Order":1}],"Id":"c547c677-423c-4ebb-a43d-2e9d871faffa","Path":"swatches-panel.md","Order":30,"CategoryType":1,"Icon":null,"Title":"Swatches Panel","Languages":[{"Code":"en","Title":"Swatches Panel","Slug":"swatches-panel","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"797e50ed-6f93-4c1c-8957-419ca7ff21c6","Path":"features-panel1.md","Order":1}],"Id":"4e977bcc-1345-4d49-9d82-75ca9722e505","Path":"features-panel-1.md","Order":12,"CategoryType":1,"Icon":null,"Title":"Features Panel","Languages":[{"Code":"en","Title":"Features Panel","Slug":"features-panel-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"67b2f6d9-a578-4b51-9ef2-d8957739a469","Path":"lookups-panel1.md","Order":1}],"Id":"2c6f7b41-0db0-46d1-adb7-ad07a3450995","Path":null,"Order":17,"CategoryType":0,"Icon":null,"Title":"Lookups Panel","Languages":[{"Code":"en","Title":"Lookups Panel","Slug":"lookups-panel","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"db85e30d-ddaf-4932-9158-26276617a576","Path":"font-map-panel1.md","Order":1}],"Id":"5f3400a9-a264-4a20-9bf4-d4c48a0fc2bc","Path":"font-map-panel.md","Order":13,"CategoryType":1,"Icon":null,"Title":"Font Map Panel","Languages":[{"Code":"en","Title":"Font Map Panel","Slug":"font-map-panel","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"635876c6-6bf4-46a3-b401-aeae56e6312a","Path":"anchors-and-pins-panel2.md","Order":2},{"Id":"9d8e15a3-34f5-4ae0-bf36-c16b334426b4","Path":"anchors-and-pins-panel1.md","Order":1}],"Id":"7c0a09fb-27e5-4c54-a81f-712f990eee81","Path":null,"Order":6,"CategoryType":0,"Icon":null,"Title":"Anchors and Pins panel","Languages":[{"Code":"en","Title":"Anchors and Pins panel","Slug":"anchors-and-pins-panel","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"d4efb150-7be3-4902-a32b-41374edda9a7","Path":"font-info-panel1.md","Order":1},{"Id":"01bf3064-6845-4a51-9ba0-a2a4d37019ad","Path":"font-info-panel2.md","Order":2}],"Id":"f7d114bf-1e2c-4623-85ef-dfc04360a232","Path":"font-info-panel.md","Order":11,"CategoryType":1,"Icon":null,"Title":"Font Info Panel","Languages":[{"Code":"en","Title":"Font Info Panel","Slug":"font-info-panel","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"ccfafca2-5439-41d1-b56b-d736f555f624","Path":"custom-glyph-recipes.md","Order":1},{"Id":"6cff3b42-faf4-483c-aeaa-2b5ba7a73309","Path":"layers-and-masters-panel1.md","Order":2}],"Id":"d8be397e-c79d-4ad5-9d51-16a24703b674","Path":"layers-and-masters-panel.md","Order":16,"CategoryType":1,"Icon":null,"Title":"Layers and Masters Panel","Languages":[{"Code":"en","Title":"Layers and Masters Panel","Slug":"layers-and-masters-panel","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"c5885a38-a895-4893-9078-0b0e8ef18c8d","Path":"variations-panel1.md","Order":1}],"Id":"4806e684-968f-461f-960e-f7bce866209b","Path":"variations-panel-1.md","Order":33,"CategoryType":1,"Icon":null,"Title":"Variations Panel","Languages":[{"Code":"en","Title":"Variations Panel","Slug":"variations-panel-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"2c650ba8-a464-4542-8342-b25660b8d2ca","Path":"image-panel1.md","Order":1}],"Id":"3b405bb2-c280-4649-b198-335ca93d7006","Path":"image-panel.md","Order":14,"CategoryType":1,"Icon":null,"Title":"Image Panel","Languages":[{"Code":"en","Title":"Image Panel","Slug":"image-panel","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"3a56dd8c-6168-46ed-a3ca-f39b3d59698e","Path":"element-properties.md","Order":1},{"Id":"db1980c0-916d-4323-a8f9-3d8e9aff2157","Path":"element-name.md","Order":2},{"Id":"f743bea5-6ab1-411a-b533-1fac87527692","Path":"elements-panel1.md","Order":3}],"Id":"31b5f494-ea1a-4bc2-989e-6e7f711d6e4d","Path":"elements-panel-1.md","Order":3,"CategoryType":1,"Icon":null,"Title":"Elements Panel","Languages":[{"Code":"en","Title":"Elements Panel","Slug":"elements-panel-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"c2cd7033-76ed-458b-8d6e-955de4471a05","Path":"output-panel1.md","Order":1}],"Id":"1182d48a-0480-470a-bf98-8f995a791c14","Path":"output-panel-1.md","Order":34,"CategoryType":1,"Icon":null,"Title":"Output Panel","Languages":[{"Code":"en","Title":"Output Panel","Slug":"output-panel-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"60f3fa04-c2aa-464a-9cff-67109d24d50d","Path":"stroke-panel1.md","Order":1}],"Id":"2240ea99-6120-444e-906b-707a85f54346","Path":"stroke-panel-1.md","Order":29,"CategoryType":1,"Icon":null,"Title":"Stroke Panel","Languages":[{"Code":"en","Title":"Stroke Panel","Slug":"stroke-panel-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"886b75da-f42a-4ef9-97e5-c282e8dc38e5","Path":"scripting-panel1.md","Order":1}],"Id":"2d8975db-2e90-4de1-ba3c-99661da456ad","Path":"scripting-panel-1.md","Order":27,"CategoryType":1,"Icon":null,"Title":"Scripting Panel","Languages":[{"Code":"en","Title":"Scripting Panel","Slug":"scripting-panel-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"e45674cf-908b-4d90-8960-a8b58eff8786","Path":"metrics-and-kerning-3.md","Order":1}],"Id":"1426e826-91b8-4b86-8bc8-3b4a7e2cee06","Path":"view-panel.md","Order":21,"CategoryType":1,"Icon":null,"Title":"View Panel","Languages":[{"Code":"en","Title":"View Panel","Slug":"view-panel","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"d7e34e16-68e3-43e5-9b34-5b4a1bc6d905","Path":"gallery-panel1-1.md","Order":1}],"Id":"2b1cddf5-67f2-4ab8-8673-e5aa33a36865","Path":"gallery-panel-1.md","Order":9,"CategoryType":1,"Icon":null,"Title":"Gallery Panel","Languages":[{"Code":"en","Title":"Gallery Panel","Slug":"gallery-panel-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"5b6de0bc-cf42-46a8-98ea-d6807df6b793","Path":"transform-panel1.md","Order":1}],"Id":"dbee509e-1c83-4764-bf63-d26622c8d285","Path":"transform-panel-2.md","Order":32,"CategoryType":1,"Icon":null,"Title":"Transform Panel","Languages":[{"Code":"en","Title":"Transform Panel","Slug":"transform-panel-2","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"6e178f76-432a-40f6-bc5d-42436846b939","Path":"brush-panel1.md","Order":1}],"Id":"fe4e7e88-684e-4b2a-9131-1577ffcc137e","Path":"brush-panel-1.md","Order":4,"CategoryType":1,"Icon":null,"Title":"Brush Panel","Languages":[{"Code":"en","Title":"Brush Panel","Slug":"brush-panel-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"57b593c4-31f2-4912-a017-5e1e5c059721","Path":"pairs-and-phrases-panel1.md","Order":1}],"Id":"26604fac-a2ee-4f30-8345-0a1e7f2018d6","Path":"pairs-and-phrases-panel.md","Order":25,"CategoryType":1,"Icon":null,"Title":"Pairs and Phrases Panel","Languages":[{"Code":"en","Title":"Pairs and Phrases Panel","Slug":"pairs-and-phrases-panel","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"5066bd8d-9783-4a69-b1b7-0708e1ef8851","Path":"measurements-panel1.md","Order":1}],"Id":"e7b773dc-3a87-424f-8b31-b789b6aaf09a","Path":"measurements-panel-1.md","Order":18,"CategoryType":1,"Icon":null,"Title":"Measurements Panel","Languages":[{"Code":"en","Title":"Measurements Panel","Slug":"measurements-panel-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"abdc1118-f6a5-4e45-af42-3a6a944c20b8","Path":"some51.md","Order":1}],"Id":"14ffaecc-d365-4b6b-84b6-0aff1bb8f9f4","Path":"fonts-panel-1.md","Order":8,"CategoryType":1,"Icon":null,"Title":"Fonts Panel","Languages":[{"Code":"en","Title":"Fonts Panel","Slug":"fonts-panel-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"f9bc011f-4b64-48a0-84a5-793aee34d697","Path":"hidden-panels.md","Order":1},{"Id":"1ee2229f-05e3-4a3a-9560-573cf8a52e55","Path":"list-of-panels.md","Order":2},{"Id":"dee050c5-b44f-4c33-ae5a-34ccaaab0d7c","Path":"panel-groups.md","Order":3}],"Id":"fc31300b-856a-4091-b0c8-169c428a13cd","Path":"general-information.md","Order":2,"CategoryType":1,"Icon":null,"Title":"General information","Languages":[{"Code":"en","Title":"General information","Slug":"general-information","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"a6743c4c-20d6-4bff-a58b-53fc1a8bb958","Path":"guide-panel.md","Order":1}],"Id":"db799f41-7a71-4a06-906a-aea4d196421a","Path":"guideline-panel.md","Order":24,"CategoryType":1,"Icon":null,"Title":"Guideline Panel","Languages":[{"Code":"en","Title":"Guideline Panel","Slug":"guideline-panel","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"b8a53f26-171f-4542-85b1-cf81842e114d","Path":"color-panel1.md","Order":1}],"Id":"9f008c9a-cd66-424c-a1c2-6ba4fa4d2f21","Path":"color-panel.md","Order":7,"CategoryType":1,"Icon":null,"Title":"Color Panel","Languages":[{"Code":"en","Title":"Color Panel","Slug":"color-panel","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"113719b9-5b46-42cb-bc7b-f9a778d90bd3","Path":"source-panel1.md","Order":1}],"Id":"4dde645d-cd16-4734-a178-875304dd6995","Path":"source-panel.md","Order":28,"CategoryType":1,"Icon":null,"Title":"Source Panel","Languages":[{"Code":"en","Title":"Source Panel","Slug":"source-panel","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"76ff710f-ea02-49dc-978d-95d0785b6506","Path":"panels-list1.md","Order":1}],"Id":"b52f8f40-0260-4753-b32a-d52ea4b1748a","Path":"panels-list.md","Order":1,"CategoryType":1,"Icon":null,"Title":"Panels List","Languages":[{"Code":"en","Title":"Panels List","Slug":"panels-list","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"43d799a6-74f2-4d7c-8c43-65a5657fd13f","Path":"glyph-panel1.md","Order":1}],"Id":"ebc7f7ea-dc69-4a05-a8cd-bcfcdf2abc73","Path":"glyph-panel.md","Order":22,"CategoryType":1,"Icon":null,"Title":"Glyph Panel","Languages":[{"Code":"en","Title":"Glyph Panel","Slug":"glyph-panel","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"66bb3896-f19b-450b-893e-6f24b4fcee03","Path":"fontaudit-panel1.md","Order":1}],"Id":"f1353223-99d5-4db2-8f16-95beeadbcaec","Path":"fontaudit-panel.md","Order":10,"CategoryType":1,"Icon":null,"Title":"FontAudit Panel","Languages":[{"Code":"en","Title":"FontAudit Panel","Slug":"fontaudit-panel","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"c25fa797-ddb5-431f-b361-faa2d29dd1cc","Path":"kerning-panel1.md","Order":1}],"Id":"01433eaf-87c8-4d02-9c21-31e1a4c0168c","Path":"kerning-panel.md","Order":15,"CategoryType":1,"Icon":null,"Title":"Kerning Panel","Languages":[{"Code":"en","Title":"Kerning Panel","Slug":"kerning-panel","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"cc0acc3e-164f-45ba-b253-a45cfe316cc0","Path":"metrics-panel1.md","Order":1}],"Id":"09246d1c-ab82-4304-b05e-d958648dff12","Path":"metrics-panel.md","Order":19,"CategoryType":1,"Icon":null,"Title":"Metrics Panel","Languages":[{"Code":"en","Title":"Metrics Panel","Slug":"metrics-panel","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"01fae3a9-d270-4523-a4f7-d32d646cbb66","Path":"clean-up-selected-classes.md","Order":2},{"Id":"6fa76cf4-cd10-4774-9326-32e1dbc607bb","Path":"view-modes-1.md","Order":17},{"Id":"d7242d4f-9d52-4bbc-be6c-458c2bf7c453","Path":"table-area-1.md","Order":16},{"Id":"aae69e09-08b9-46e3-884f-76687cdbda2f","Path":"marking-classes.md","Order":9},{"Id":"44d57a99-fbe8-447e-b10f-169a094c2560","Path":"importing-classes.md","Order":6},{"Id":"d91d7977-95f1-47f6-9b2c-ef58a4546f95","Path":"modifying-classes-or-tags.md","Order":11},{"Id":"41950063-2a08-4c62-9653-94ab71f8b1b0","Path":"preview-area.md","Order":12},{"Id":"ee6f801e-f3a3-4377-9d08-726b2d2f66eb","Path":"status-bar-2.md","Order":15},{"Id":"0b6a64aa-4564-4d3a-b197-6e9e79e2c0bc","Path":"sorting-classes.md","Order":14},{"Id":"e162acc4-250a-42de-9470-f1bf7280b942","Path":"removing-classes-and-tag-groups.md","Order":13},{"Id":"fade5b9c-43c6-4b2e-8ccf-221813bd116d","Path":"generating-kerning-classes-automatically.md","Order":5},{"Id":"60dc4c07-8574-46a1-91c2-bb7fe6390bd3","Path":"defining-a-new-class-or-tag.md","Order":4},{"Id":"93295e49-cfbc-4cd1-afae-29249b139e15","Path":"list-sidebar.md","Order":7},{"Id":"4aad5066-797a-4d6b-872a-90d5f14ae160","Path":"local-toolbar.md","Order":8},{"Id":"f9b0d94c-09b6-4bf1-b2f0-41d8daff76d0","Path":"classes-panel1.md","Order":1},{"Id":"56b60d09-638a-4f6c-a72d-d91afad6397f","Path":"merging-classes.md","Order":10},{"Id":"f0035098-fb31-4fea-9c1a-7f334d9d6529","Path":"copying-classes.md","Order":3}],"Id":"00965c8f-a752-48a9-9d52-106ceb36e8ea","Path":"classes-panel-1.md","Order":5,"CategoryType":1,"Icon":null,"Title":"Classes Panel","Languages":[{"Code":"en","Title":"Classes Panel","Slug":"classes-panel-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"9989dda5-97c6-4baf-bdff-dd337eada5a2","Path":"node-panel1.md","Order":1}],"Id":"b7f09de7-4167-43ae-af8f-85ba7a8d39c3","Path":"node-panel.md","Order":20,"CategoryType":1,"Icon":null,"Title":"Node Panel","Languages":[{"Code":"en","Title":"Node Panel","Slug":"node-panel","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"7290dcc0-ed59-4794-bfd4-ad29df9c8b34","Path":"view-panel1-1.md","Order":1},{"Id":"cfdfe35b-0e0f-4406-b778-80aaa4e84b6f","Path":"view-panel-4.md","Order":2}],"Id":"fd8b4108-1650-40c2-97b5-3bb1d0b367c6","Path":null,"Order":35,"CategoryType":0,"Icon":null,"Title":"View Panel-1","Languages":[{"Code":"en","Title":"View Panel-1","Slug":"view-panel-1","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"769c748a-46ee-4d77-9907-0dd18e2bd9db","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"Panels","Languages":[{"Code":"en","Title":"Panels","Slug":"panels-3","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"7188d601-e3d3-43d7-89db-0300bbc0ad6e","Path":"indicators.md","Order":9},{"Id":"a53f4be7-ad2a-493f-b649-203e27a692ff","Path":"property-bar-6.md","Order":11},{"Id":"0ca0b6d9-9054-4034-974a-17f9e5139942","Path":"sortering.md","Order":14},{"Id":"3cfa46f3-77d4-4b2e-b85a-46bf5923622c","Path":"captions.md","Order":1},{"Id":"5525e817-7777-430f-834e-a39375478ab0","Path":"filters.md","Order":5},{"Id":"8e5ea931-ce10-4166-94a7-7236c13dc6e5","Path":"sidebar-filters.md","Order":12},{"Id":"bd17a2b5-2932-4475-94e5-18c98869ca66","Path":"sidebar-tools.md","Order":13},{"Id":"f20753f2-b6b7-4c49-b81c-fd022a4afa02","Path":"color-filter-1.md","Order":3},{"Id":"d0babd7e-2b96-4b03-8017-c6457c356c0d","Path":"encodings-1.md","Order":4},{"Id":"6fedf92f-ebb8-43d6-b402-456e6c60826d","Path":"clean-recent-fonts-list.md","Order":2},{"Id":"c1ee4c7d-4c07-49df-83e6-900838309e28","Path":"font-window1.md","Order":6},{"Id":"f3abb832-b464-4a4c-b15c-bc70f61e8d06","Path":"glyph-table-1.md","Order":8},{"Id":"9676aca2-4e61-41d0-af7c-ca9aefcdfb67","Path":"list-view-2.md","Order":10},{"Id":"50209742-d8dc-4ad3-8fea-75d1af357ca5","Path":"footer.md","Order":7}],"Id":"d6d9d865-7f5c-4c0e-a6f5-4dca8d412731","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Font Window","Languages":[{"Code":"en","Title":"Font Window","Slug":"font-window-3","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"4c2a2565-18b4-4490-a7fe-1963f1666b0c","Path":"ellipse-or-rectangle-tool.md","Order":3},{"Id":"6a819e7d-1b38-4739-b44b-a0badfd72a32","Path":"free-transform-tool.md","Order":4},{"Id":"2b9728ec-9b3a-4d2a-a9b2-ef987c0a964c","Path":"kerning-tool-2.md","Order":7},{"Id":"28dd0d5a-70b4-42db-ab08-9cc4eb40efe6","Path":"brush-tool-5.md","Order":1},{"Id":"170de5e4-7549-42b0-b2b9-e95b8591a38a","Path":"guides-tool-3.md","Order":6},{"Id":"aae9479c-4abe-4430-a63d-75b8319103cc","Path":"metric-tool.md","Order":8},{"Id":"a5a971a6-0b8e-45dc-89d1-73f1b8904a8e","Path":"one-or-more-points-selected.md","Order":9},{"Id":"55c0e101-8776-4b02-9218-a725e081e00f","Path":"when-the-matchmaker-tool-is-active-1.md","Order":11},{"Id":"c59156b5-fe9a-4ea4-a520-d8435f720450","Path":"default-state.md","Order":2},{"Id":"8b119b6d-8b97-4aa9-a602-e29acaca9eb8","Path":"guideline-or-hint.md","Order":5},{"Id":"0e0acef6-a743-4677-bead-fcd773129776","Path":"text-tool-4.md","Order":10}],"Id":"de58e045-290b-43ae-8e4d-856a96b8cc3b","Path":"property-bar-1.md","Order":4,"CategoryType":1,"Icon":null,"Title":"Property bar","Languages":[{"Code":"en","Title":"Property bar","Slug":"property-bar-1","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"d4cc903c-ad94-4aa6-9930-a5b74da06c10","Path":"scoreboard-3.md","Order":6},{"Id":"4da550ab-4521-4cb9-875a-54a28e7c3498","Path":"zoom-controls.md","Order":7},{"Id":"e815816f-96f9-4d54-8dcf-9812621b7eb5","Path":"rulers-1.md","Order":5},{"Id":"982ef195-e216-4d18-b5b5-0822d89c0e71","Path":"glyph-window1.md","Order":2},{"Id":"7ed87219-1f69-4037-b193-eda5d479a4f9","Path":"font-dimension-lines.md","Order":1},{"Id":"bf951e64-c795-4def-ad08-ee21518cc37f","Path":"grid-2.md","Order":3}],"Id":"7afa28ca-21d3-4f0f-a33a-0a411c78ad99","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Glyph Window","Languages":[{"Code":"en","Title":"Glyph Window","Slug":"glyph-window-3","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"0ddef1a8-37c2-4a3e-9b9b-06ae96568214","Path":"workspaces-on-windows-1.md","Order":5},{"Id":"d01cc10c-721e-4e96-a91d-af310ac7f132","Path":"creating-workspaces-1.md","Order":1},{"Id":"553a67ab-37f1-46d2-b4af-e99f9f78e6be","Path":"managing-workspaces-1.md","Order":2},{"Id":"c79901ed-a814-4028-950d-d5ba6b9db64a","Path":"switching-workspaces-1.md","Order":4},{"Id":"6a2b00dc-af7f-494a-a8c2-149c649e22e3","Path":"shortcuts-for-workspaces-1.md","Order":3}],"Id":"456dc62f-a8e9-4308-bc68-faa80b69a47f","Path":"workspaces-1.md","Order":2,"CategoryType":1,"Icon":null,"Title":"Workspaces","Languages":[{"Code":"en","Title":"Workspaces","Slug":"workspaces-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"181eda3b-c845-49d4-8e37-231f07b40a15","Path":"curvature.md","Order":3},{"Id":"9160dd2d-e6fd-43e1-9072-04bf46c62fc9","Path":"grid-3.md","Order":7},{"Id":"66d1aef7-01e6-43aa-8b73-2bac4368a100","Path":"all-nodes.md","Order":1},{"Id":"97b276ee-52f9-4c9e-81c4-f26296f12526","Path":"font-guides.md","Order":4},{"Id":"9aea79a4-d699-46cf-9a5a-47c836e40fde","Path":"hints-4.md","Order":8},{"Id":"c7431c0e-f155-4cc3-88d4-6ce959cd9884","Path":"glyph-guides.md","Order":6},{"Id":"09bb98e7-288d-4643-a496-6542a2c3253c","Path":"fontaudit-7.md","Order":5},{"Id":"48015351-5e31-45c4-9879-5207b9e61558","Path":"coordinates-3.md","Order":2}],"Id":"40ca8603-14b2-4d1e-bbeb-ed7a8873b739","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"View Options","Languages":[{"Code":"en","Title":"View Options","Slug":"view-options-1","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"3f18e272-840c-4336-aeb5-69443d746e1f","Path":"alignment-zones-2.md","Order":1},{"Id":"2973599c-9ae9-44fa-a582-c875bfcc8909","Path":"toolbar-4.md","Order":4},{"Id":"86caf691-ff2e-4705-ba8e-e6e58ff50235","Path":"paste-special-1.md","Order":7},{"Id":"8f0139f4-dd4a-4481-bf8f-f03e2a9b707e","Path":"sketchboard-2.md","Order":5},{"Id":"f15e3d14-3b4b-4df0-b931-eed38ce4ed55","Path":"sketchboard-3.md","Order":8},{"Id":"cd6a877d-b4c2-4593-b228-b98240c7d8e6","Path":"dropdown-list.md","Order":12},{"Id":"279ad6c3-2855-4a35-917e-591e0648337c","Path":"history-panel-2.md","Order":10},{"Id":"57db00d3-3bbc-4396-b031-7a9edd48bbb0","Path":"quick-help-2.md","Order":9},{"Id":"213221d0-ea09-400f-831d-89a7024f83ca","Path":"user-interface-5.md","Order":11},{"Id":"96c8452e-d17b-42f1-a385-16d6cd877934","Path":"metrics-window-2.md","Order":6}],"Id":"47581be6-7c10-44b5-96fd-cb850690316e","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Other Interface Items","Languages":[{"Code":"en","Title":"Other Interface Items","Slug":"other-interface-items","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"82518599-6e79-44e7-9146-f31ac6d3c101","Path":null,"Order":15,"CategoryType":0,"Icon":null,"Title":"Interface Reference","Languages":[{"Code":"en","Title":"Interface Reference","Slug":"interface-reference","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"23141c52-20f9-4a70-b8f1-99e1f6be17cf","Path":"viewing-the-dynamic-instance-1.md","Order":5},{"Id":"8da131f4-5f9e-4760-8114-f7feebab80ea","Path":"variations-panel-5.md","Order":3},{"Id":"0c440184-a66f-498f-9803-714c10cac01b","Path":"using-the-layer-preview-color-1.md","Order":2},{"Id":"31296ca9-466a-47bc-a140-6aa5e2c45428","Path":"faster-interpolation-1.md","Order":1},{"Id":"a4919b8f-4d41-4dc0-8fba-d7281237ef21","Path":"axis-user-range-1.md","Order":4}],"Id":"cf07cf0e-3c73-4634-b67e-423624293ae4","Path":null,"Order":7,"CategoryType":0,"Icon":null,"Title":"Variations","Languages":[{"Code":"en","Title":"Variations","Slug":"variations-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"bc4315f7-73c8-47f7-ae12-d5f87b7a52aa","Path":"preview-panel-7.md","Order":3},{"Id":"00ab099b-42ef-41f4-9276-07746d49a0c4","Path":"details-across-glyphs-1.md","Order":5},{"Id":"8102eb99-0b8a-44b5-97ef-c6b0134c3093","Path":"glyph-metrics-6.md","Order":1},{"Id":"777c3490-ea33-40e8-8fdc-62be9890f54c","Path":"glyph-window-modes-1.md","Order":8},{"Id":"98ab8bb8-7d19-4216-8a56-fb6103d125a0","Path":"glyph-window-text-1.md","Order":9},{"Id":"22c44387-7ca8-4d4d-a18e-20596f5c13fb","Path":"glyph-window-views.md","Order":11},{"Id":"7a1ee9cc-45d1-44c4-b624-ee1073dec4a5","Path":"glyph-window-view-sets-basic-view-and-alternative-view.md","Order":10},{"Id":"f6a0e0b8-73ee-44c2-b958-cea238fc8ef9","Path":"noncurrent-glyph-details-1.md","Order":13},{"Id":"5eff77a4-0acc-490d-94b2-6546e2e4fa9e","Path":"glyph-window-11.md","Order":12},{"Id":"c5d7f9bd-a340-4ff0-9610-352537dd7437","Path":"current-glyph-details-1.md","Order":4},{"Id":"31d5fbe7-3dc8-4d16-9f42-3388669c239b","Path":"edit-across-glyphs-1.md","Order":6},{"Id":"a3f2f8c2-d050-4882-b7bb-6fa4eb2080d8","Path":"outline-color-in-glyph-window-1.md","Order":2},{"Id":"3cd2470a-b022-4f54-b49c-ed731a715c72","Path":"edit-across-layers.md","Order":7}],"Id":"07c52eea-3fe6-44fb-b47f-9d23430bd73e","Path":null,"Order":8,"CategoryType":0,"Icon":null,"Title":"Glyph window","Languages":[{"Code":"en","Title":"Glyph window","Slug":"glyph-window-4","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"396fd160-0c8b-4384-b279-d13b050089ad","Path":"action-sections-2.md","Order":4},{"Id":"2b198d8f-c054-4a81-bc4a-36e7ae398da9","Path":"change-height-2.md","Order":5},{"Id":"5b572890-a03e-4aa6-81b5-f46c79065c9f","Path":"change-width-and-change-weight-1.md","Order":6},{"Id":"f5f18718-66f3-4d48-a250-63b62d9f9cb6","Path":"close-actions-dialog-with-esc-1.md","Order":1},{"Id":"473dd5df-a419-4137-8b8b-ca9518dfa918","Path":"glyph-scope-1.md","Order":8},{"Id":"3b4d4c87-f8ae-4aa6-87c7-0682fb053540","Path":"keyboard-shortcut-1.md","Order":9},{"Id":"040ff5a1-6d50-4e85-b47d-5fdb0601d8e8","Path":"manually-improve-the-results-1.md","Order":11},{"Id":"3171c5a8-3024-463b-8398-e8d969c763f5","Path":"change-width-3.md","Order":7},{"Id":"8ba2f6cc-56d5-4c99-a7ae-db36b10b53e8","Path":"remarks-2.md","Order":12},{"Id":"20ceeb54-38d4-4bfa-9e22-d80838a7c88f","Path":"scope-of-actions-1.md","Order":13},{"Id":"dae89274-f1f7-4a15-b8f3-77e12b41bcce","Path":"perspective-action-1.md","Order":2},{"Id":"8417f4f8-2c59-4ebd-aa17-f1c218e4545a","Path":"layer-scope-1.md","Order":10},{"Id":"8d2eee45-f760-41ff-b972-6c7683f46983","Path":"slant-action-1.md","Order":3}],"Id":"f75dfc27-dcc4-44d6-93ed-d7a40fc23bcf","Path":null,"Order":11,"CategoryType":0,"Icon":null,"Title":"Actions","Languages":[{"Code":"en","Title":"Actions","Slug":"actions-5","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"985d67c1-09b9-4b9f-9c99-e7b64e79b811","Path":"import-kerning-from-kern-feature-1.md","Order":1}],"Id":"79129fe1-cc28-4441-9c30-53f2030b1909","Path":null,"Order":14,"CategoryType":0,"Icon":null,"Title":"Kerning","Languages":[{"Code":"en","Title":"Kerning","Slug":"kerning-3","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"3b98ce68-f986-4eee-99b5-a221c4864b72","Path":"add-nodes-at-inflections-with-knife-1.md","Order":1},{"Id":"b6ba3ff8-ef95-4a38-bbeb-8f41c5288eff","Path":"duplicate-nodes-3.md","Order":3},{"Id":"52f3a8f1-3f99-407f-ae54-e723d620fe9a","Path":"simple-calculations-1.md","Order":7},{"Id":"4531465b-93b8-48b1-877a-2b5a0d6e3582","Path":"copy-and-paste-from-adobe-illustrator-1.md","Order":9},{"Id":"ff8d156b-f45c-4937-ad08-a9d12321e784","Path":"pen-tool-5.md","Order":6},{"Id":"a4ac9b42-51de-407a-87c6-a568a919a31a","Path":"copy-and-paste-from-fontlab-studio-5-1.md","Order":10},{"Id":"9cb6e5b3-5c57-42be-9269-17d7cc8c8700","Path":"element-references-3.md","Order":11},{"Id":"a952b3ce-d2bf-41df-976b-c67954dac96b","Path":"fontaudit-8.md","Order":12},{"Id":"d6609615-9238-46fe-9858-fb67a1f4b626","Path":"slide-node-1.md","Order":14},{"Id":"7b8e92b3-b27c-495a-8395-4ac4fd5b081d","Path":"doubleclick-a-node-has-precedence-over-activating-another-glyph-1.md","Order":4},{"Id":"085868b9-591a-426e-91be-b0f7be482458","Path":"copypaste-1.md","Order":5},{"Id":"751f5c0c-e408-4179-bfdc-c94cf8c26f37","Path":"components-2.md","Order":8},{"Id":"1284397f-eced-4b86-aa15-13ef73598f62","Path":"mask-layer-1.md","Order":13},{"Id":"7374324a-1515-45ef-8217-2a64f9123fab","Path":"adding-a-node-selects-it-1.md","Order":2}],"Id":"2057eb55-da71-4c88-bff8-7d417833faae","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"Contour editing","Languages":[{"Code":"en","Title":"Contour editing","Slug":"contour-editing-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"ad1d3c9a-d65f-4135-90df-08cb9b30711a","Path":"named-bookmarks-in-font-window.md","Order":5},{"Id":"d3c13d2a-f2e9-4109-95ac-66b47710c7cd","Path":"saving-selections-and-filters-1.md","Order":14},{"Id":"66fb9573-0385-405f-8b4e-0db0387f5e0e","Path":"font-window-unicodename-mismatch-fontlab-uses-a-mapping-table-that-maps-unicode.md","Order":1},{"Id":"8973060c-096f-47c9-b86a-7f3240da77c8","Path":"componentrelated-selection-1.md","Order":12},{"Id":"50f96cf5-f06c-4642-910c-c54f33824de9","Path":"rendering-of-selected-and-current-glyph-cells.md","Order":8},{"Id":"e76a207d-fda9-4f49-aa29-7a1e9efe9bd5","Path":"layers-masters-in-font-window-sidebar.md","Order":7},{"Id":"d73c8292-3063-4881-9bfe-2f056873d812","Path":"paste-in-font-window-replace-or-append-1.md","Order":19},{"Id":"61be51ae-e79a-4f5e-8f54-8cdc6761b4dd","Path":"filter-font-window-by-glyph-name-suffix-1.md","Order":4},{"Id":"0eca4e8e-3e6d-42f9-9b39-5137d950636e","Path":"same-as-current-glyph-selection-1.md","Order":13},{"Id":"2daad303-a05c-4f1f-864c-a417f8306b3b","Path":"current-instance-in-font-window.md","Order":2},{"Id":"d3e91377-dbc6-48f8-bb46-96db3071df11","Path":"add-a-new-glyph-to-the-font-2.md","Order":15},{"Id":"1af1bd3c-b77e-4a5f-8937-f0762d829091","Path":"more-selections-1.md","Order":10},{"Id":"310a622a-fd79-4914-8729-2398ae97fb51","Path":"font-window-select-in-context-menu.md","Order":11},{"Id":"aab9c4c4-ffcf-4a46-943d-7040f1973e3c","Path":"sort-font-window-by-glyph-name-suffix.md","Order":6},{"Id":"191c6733-ece5-4175-a53c-ab8caf51cf94","Path":"font-window-filters-2.md","Order":17},{"Id":"de18ee83-9ec8-49bd-93ce-5d2b346ccb62","Path":"create-new-glyphs-in-empty-font-window-cells.md","Order":16},{"Id":"eb8049eb-a66b-4d72-afd9-bc992cc74f36","Path":"font-window-status-bar-1.md","Order":18},{"Id":"ac6034e9-47af-4af5-bf2c-fb8a47f4663e","Path":"general-selection-1.md","Order":9},{"Id":"6f399863-0e2a-4fce-96c2-01598ec4387b","Path":"filter-font-window-by-color-flag-1.md","Order":3}],"Id":"5ece62b6-87d3-477b-bc0a-099484304fcd","Path":null,"Order":17,"CategoryType":0,"Icon":null,"Title":"Font window","Languages":[{"Code":"en","Title":"Font window","Slug":"font-window-4","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"3a7e7050-9ee5-4e60-8d3f-223a3b727690","Path":"flatten-glyph-and-flatten-layer-1.md","Order":1},{"Id":"6e27b181-710b-4256-aaa6-5d4a022d5fe4","Path":"lastused-export-profile-1.md","Order":6},{"Id":"130b66e7-67a4-4808-aa9f-0f2d14b5d357","Path":"opening-and-exporting-fonts.md","Order":7},{"Id":"f8566dc0-1b1f-4954-b179-ab182bd02613","Path":"sketchboard-4.md","Order":9},{"Id":"77483347-795c-4bcb-bd27-19f6f3607223","Path":"ufo-packages-1.md","Order":10},{"Id":"e6361d15-47af-456a-be88-0d1168d1c5b1","Path":"glyph-names-6.md","Order":11},{"Id":"fe7a910e-60f4-4561-a33e-4c67fd4a253f","Path":"keyboard-shortcuts-7.md","Order":4},{"Id":"4df37218-3d0a-42c0-8e65-833231f2f38a","Path":"numeric-text-fields.md","Order":5},{"Id":"5adcc3bd-b378-4564-aa79-966ca69fda2f","Path":"keyboard-shortcuts-on-windows.md","Order":3},{"Id":"ec4f7c50-4823-4130-9f13-c7fb693b7ec7","Path":"panels-4.md","Order":2},{"Id":"d9faaad1-d280-426f-8957-60d645fdee8a","Path":"opentype-tables-1.md","Order":8}],"Id":"94eee343-aa50-4f67-800c-71b155a2e103","Path":null,"Order":18,"CategoryType":0,"Icon":null,"Title":"User interface","Languages":[{"Code":"en","Title":"User interface","Slug":"user-interface-3","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"ef3d914a-a413-4502-a878-3131b28f025b","Path":"lib-font-master-glyph-layer-1.md","Order":5},{"Id":"91fd7a40-d8a2-4a7e-a446-972147a0bb24","Path":"vfcvfj-format.md","Order":9},{"Id":"a127e357-f312-41f2-bb4a-88cebf787cc4","Path":"designspace-ufo-and-glif-lib-1.md","Order":1},{"Id":"d8ae9c73-96b4-42e0-9ab4-588c3b590586","Path":"save-as.md","Order":16},{"Id":"3b8649d1-8e8f-4fdb-8124-1629493f5b8f","Path":"truetype-hinting-in-ufo-1.md","Order":8},{"Id":"58d7c529-479e-4a86-9273-a66f8aabc74a","Path":"color-web-fonts-1.md","Order":10},{"Id":"0bff4956-a15e-4451-9319-8a2aa436c452","Path":"export-notification-1.md","Order":12},{"Id":"b1085328-5452-45b2-ab5b-29c9e43a7c55","Path":"glyph-ordering-in-ufo-1.md","Order":4},{"Id":"ef778f24-bebd-4880-9834-cbc75a6ba7c6","Path":"designspace-ufo3-1.md","Order":11},{"Id":"b1623557-7099-4337-bedb-5c1caefcc1c1","Path":"fontlab-json-vfj.md","Order":14},{"Id":"076276a3-2a75-4d1d-b89c-92b2b452e1ca","Path":"postscript-hinting-in-ufo-1.md","Order":7},{"Id":"cd3f009a-ee5d-4e1e-887a-026dcf64fc9b","Path":"metrics-expressions-in-glif-1.md","Order":6},{"Id":"bb52bdff-571d-4ab4-bcb8-af241a89ce8c","Path":"exporting-mark-attachment-1.md","Order":13},{"Id":"a03a0fb6-fa95-469b-bbff-5307ab0c4771","Path":"open-and-export-cff2based-variable-ps.md","Order":15},{"Id":"ed33c8c2-fa6f-4be4-848d-b711a186640d","Path":"variable-tt-1.md","Order":17},{"Id":"37aa9913-bfb6-4faa-92e4-8b22f3ed90f7","Path":"auto-layers-in-glif-1.md","Order":3},{"Id":"701a6873-bcc1-43cf-90f7-f7ca8ee40592","Path":"exporting-fonts-5.md","Order":2}],"Id":"fdd974cd-c73d-4e4d-8e01-6f0769fdffb4","Path":null,"Order":19,"CategoryType":0,"Icon":null,"Title":"Files and Formats","Languages":[{"Code":"en","Title":"Files and Formats","Slug":"files-and-formats","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"4ee0a482-9d51-42a6-bbbe-5ac7f2472f4c","Path":"glyph-window-wrapping-1.md","Order":3},{"Id":"b03cd4df-bc0b-4dd2-8c49-c58f5d90dc0c","Path":"text-in-glyph-window-1.md","Order":4},{"Id":"cec26631-eabb-4772-9c3f-1f266e6f4c5e","Path":"apply-glyph-window-wrapping-1.md","Order":1},{"Id":"64e5fe5d-2515-4e3a-8a6f-0fc1f42ae2f9","Path":"glyph-size-in-glyph-window-1.md","Order":2}],"Id":"501996e5-0361-4242-b2d0-773d6ad2c58c","Path":null,"Order":10,"CategoryType":0,"Icon":null,"Title":"Glyph window text, font size and wrapping","Languages":[{"Code":"en","Title":"Glyph window text, font size and wrapping","Slug":"glyph-window-text-font-size-and-wrapping","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"61ec73c5-b0f1-43fd-b43b-018984a1105b","Path":"more-volt-resources-1.md","Order":8},{"Id":"0bc077a1-055c-4bae-9e06-d357c4b845ed","Path":"testing-mark-attachment-1.md","Order":14},{"Id":"29edffea-06bd-494a-8ae6-609b9dbd5eca","Path":"the-opentype-layout-process-1.md","Order":1},{"Id":"281f9ee6-22d7-495a-ba5f-38d1d31ba46d","Path":"lookups-area-1.md","Order":6},{"Id":"0e8d8e9d-ccb8-4ba5-a52b-467721c6dc05","Path":"testing-features-in-text-1.md","Order":12},{"Id":"bd561579-8684-4c4b-980d-c0ed443f608c","Path":"rules-area-1.md","Order":10},{"Id":"91325923-b16f-42ea-8a28-344edfb86fa8","Path":"testing-kerning-1.md","Order":13},{"Id":"0410bf45-3b99-41ac-86d3-a2ce3e28636c","Path":"features-area-1.md","Order":3},{"Id":"6ad92c4b-a39d-4050-a74f-c1a9e4c23bf9","Path":"lookups-panel-2.md","Order":7},{"Id":"de8866ee-4a85-4e85-898c-428273cd9ed2","Path":"using-microsoft-volt-3.md","Order":16},{"Id":"013cef58-c8e1-47be-b23b-1e7b9c0c49c7","Path":"visual-proofing-in-the-lookups-panel-1.md","Order":17},{"Id":"c1ae2792-b2b4-4efd-9ab6-b8bca73ab221","Path":"sample-volt-fonts-3.md","Order":11},{"Id":"ff91d3f0-ac4b-4b7d-9da0-eb94fadd3bf7","Path":"exporting-feature-definitions-to-volt-1.md","Order":15},{"Id":"becd6454-7f94-4d90-bb82-f9a615941ad1","Path":"features-panel-5.md","Order":4},{"Id":"00b3fbe9-30ab-483c-98c6-41c004b74165","Path":"proofing-opentype-features-1.md","Order":9},{"Id":"827c8e3f-ea53-4a81-9897-df5e6a86e797","Path":"interchange-with-microsoft-volt-1.md","Order":5},{"Id":"794c6d19-77a2-4f60-8734-60cb4454085c","Path":"featurecentric-vs-1.md","Order":2}],"Id":"70ec9170-0af5-4367-9e51-02a61dbd5f09","Path":null,"Order":12,"CategoryType":0,"Icon":null,"Title":"Features","Languages":[{"Code":"en","Title":"Features","Slug":"features-2","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"93af7b59-cca2-4ddd-b021-2dc2f8edd3b1","Path":"typerig-delta-machine-3.md","Order":4},{"Id":"75a2db7c-dcb8-40a3-a24c-f867def464a2","Path":"installupdate-typerig-1.md","Order":1},{"Id":"7e3ea460-7368-464b-916a-5737687287a5","Path":"typerig-panel-1.md","Order":2},{"Id":"0444f6a1-7c32-471d-b6a7-6359ad5fb0f2","Path":"other-typerig-plugins-1.md","Order":5},{"Id":"a4b15a88-e90a-4114-b579-d91f1bb443e2","Path":"typerig-is-a-powerful-set-of-extensions-for-fontlab-7-1.md","Order":3}],"Id":"9a02935b-078d-4128-8cd8-673207b41ebc","Path":null,"Order":20,"CategoryType":0,"Icon":null,"Title":"TypeRig & Delta Machine","Languages":[{"Code":"en","Title":"TypeRig & Delta Machine","Slug":"typerig-delta-machine-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"a21bb541-bc2c-4868-80b1-99b4d9cef865","Path":"postscript-hints-1.md","Order":2},{"Id":"238fd3e0-2ff4-4844-9b45-ee2836b498b2","Path":"stdw-vs-2.md","Order":3},{"Id":"20567345-ca72-4930-99b2-63015afb2d9d","Path":"truetype-hinting-4.md","Order":4},{"Id":"1dfc5d30-acaf-4421-9c08-d1d609f5d3d9","Path":"autohint-3.md","Order":1}],"Id":"a69387d4-b1d7-460b-986f-8c035760d9d4","Path":null,"Order":13,"CategoryType":0,"Icon":null,"Title":"Hints","Languages":[{"Code":"en","Title":"Hints","Slug":"hints-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"a3887fc7-a906-460e-85b4-ef1c616fe5ae","Path":"new-fontaudit-test-nearly-flat-curve-1.md","Order":3},{"Id":"3d02727e-8347-4b63-9370-65a77afccc73","Path":"enabling-and-disabling-fontaudit-tests-1.md","Order":2},{"Id":"49b6cab0-7e04-4f3b-ba7a-5d516e10d3b7","Path":"when-you-open-the-fontaudit-panel-fontlab-runs-some-tests-and-shows-a-list-1.md","Order":1},{"Id":"fbcc9558-069a-46d9-8bdc-779486947894","Path":"new-fontaudit-tests-irregular-stem-and-uncommon-stem-1.md","Order":4},{"Id":"517c62b2-9752-4298-a553-c9718eeee63a","Path":"other-fontaudit-improvements-1.md","Order":5}],"Id":"f9eb25e9-bfc4-4c4e-92d4-b9af0c582bd6","Path":"fontaudit-4.md","Order":6,"CategoryType":1,"Icon":null,"Title":"FontAudit","Languages":[{"Code":"en","Title":"FontAudit","Slug":"fontaudit-4","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"a0c9fad0-6cfa-4d6c-a490-f9e49c9cefcd","Path":"power-guides-6.md","Order":1},{"Id":"ffd8d830-b7d5-475a-83aa-97a063c042b2","Path":"snap-to-baseline-1.md","Order":3},{"Id":"5c827486-4a82-4a85-a2a2-61996ae94f3c","Path":"suggest-distance-1.md","Order":4},{"Id":"fc3385c1-8e7f-4aa5-837f-ebf5795c32fe","Path":"slanted-guides-1.md","Order":2}],"Id":"03caedfb-e62f-43a1-ac3d-b5f5fe1f0af5","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"Guides and snapping","Languages":[{"Code":"en","Title":"Guides and snapping","Slug":"guides-and-snapping-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"7067d9f5-0585-4160-baba-96f668e1b85f","Path":"working-in-fractional-coordinates-1.md","Order":4},{"Id":"1317d1e9-f12f-4a66-bbf8-04d7ff7f5019","Path":"increasing-the-precision-of-coordinates-1.md","Order":2},{"Id":"81f1ba47-4eea-4cc9-9aff-7ea1c17d0d9b","Path":"sketchboard-coordinates-1.md","Order":3},{"Id":"35bfeae9-af6e-4a4c-b496-c44711abb567","Path":"fractional-vs-1.md","Order":1},{"Id":"2b6c5df8-abc2-4529-9351-f7502423ad44","Path":"working-in-rounded-coordinates-1.md","Order":5}],"Id":"e004d968-1f01-46c0-910d-26dbb53b028a","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Coordinates","Languages":[{"Code":"en","Title":"Coordinates","Slug":"coordinates-2","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"1fed11fa-619e-4cbc-b9af-7417a811a2a5","Path":"bidirectional-support-in-glyph-window-and-preview-panel-1.md","Order":1},{"Id":"db8fd3f2-d732-4845-8e70-a85339d2d00c","Path":"font-names-1.md","Order":3},{"Id":"7f21492b-d130-428b-963d-ea5df3f8d2cd","Path":"positional-features-1.md","Order":4},{"Id":"a15a08e4-010f-46fe-a7d2-19cf45414535","Path":"bidirectional-text-arabic-and-other-righttoleft-scripts.md","Order":2},{"Id":"b7acaf8a-0cd2-47df-9a8f-33c25fce7d7d","Path":"righttoleft-mark-attachment-1.md","Order":5},{"Id":"baf0098d-8527-4c81-813d-f55b62b2ad07","Path":"virtual-tags-3.md","Order":6}],"Id":"6c4a5c9d-2606-4159-b396-f2ed9777daa3","Path":null,"Order":16,"CategoryType":0,"Icon":null,"Title":"Script support","Languages":[{"Code":"en","Title":"Script support","Slug":"script-support-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"91c2e2e4-ffa8-4ef1-8aa1-a9c62bc95b6f","Path":"builtin-glyph-names-1.md","Order":1},{"Id":"0eeba475-04a5-4857-8599-c77de0204670","Path":"missing-glyph-placeholders-1.md","Order":3},{"Id":"2f58f993-fcac-47e3-8bcb-dea22b57de7e","Path":"flexible-glyph-renaming.md","Order":6},{"Id":"3120aef0-273e-4ea1-9934-28be164a6372","Path":"glyph-names-5.md","Order":8},{"Id":"7c91801a-e579-4685-b71f-0ddfe7d0d31c","Path":"unixxxx-and-production-names-1.md","Order":12},{"Id":"a89ef42a-ec84-45d5-a0f5-8b5e7a39c5c2","Path":"renaming-glyphs-5.md","Order":10},{"Id":"905e1f31-0ead-466e-b5e1-96a66c1a36c3","Path":"synonyms-1.md","Order":11},{"Id":"8315fb2e-2a50-4de3-b67b-abdcbd0fac63","Path":"other-glyph-naming-improvements.md","Order":9},{"Id":"34246b4c-eff5-442f-9c10-b2aced219597","Path":"renaming-glyphs-4.md","Order":2},{"Id":"68768cbc-757a-4494-8a9f-441bcd2f4712","Path":"friendly-and-alternative-names-1.md","Order":7},{"Id":"22bbff18-8278-458a-bfed-f640af1146b2","Path":"custom-glyph-renaming.md","Order":5},{"Id":"9660a4f2-8378-47d6-a945-65459bd98597","Path":"builtin-glyph-naming-schemes-and-synonyms.md","Order":4}],"Id":"51438741-dc70-4089-b5b8-4be39f9a49ca","Path":null,"Order":15,"CategoryType":0,"Icon":null,"Title":"Glyph names","Languages":[{"Code":"en","Title":"Glyph names","Slug":"glyph-names-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"36307f98-17aa-47ca-9d0e-8eb63acb5efb","Path":"scale-tool-2.md","Order":3},{"Id":"ffa35b96-192b-4c3d-a673-7b3a0a2373f7","Path":"slant-tool-2.md","Order":4},{"Id":"3637fed7-c1f7-485a-a5e0-7abfb3d90524","Path":"in-fontlab-7.md","Order":1},{"Id":"27d508f4-db80-48da-9c75-a3cb6229cb10","Path":"rotate-tool-2.md","Order":2}],"Id":"16914898-57ad-406e-9e9d-040f00328dca","Path":"quick-transform-tools-rotate-scale-and-slant-1.md","Order":1,"CategoryType":1,"Icon":null,"Title":"Quick transform tools Rotate, Scale and Slant","Languages":[{"Code":"en","Title":"Quick transform tools Rotate, Scale and Slant","Slug":"quick-transform-tools-rotate-scale-and-slant-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"2c734db5-2e39-45e7-b0a6-162ce3ba4b52","Path":"anchors-pins-panel-1.md","Order":2},{"Id":"c7fbdda8-80ad-49d8-927f-04d0cbcaf658","Path":"attached-components-1.md","Order":3},{"Id":"c5ff648b-692c-4f4b-bcde-f4fe62ac449c","Path":"anchor-expressions-1.md","Order":1},{"Id":"d255c7ee-982a-4435-ac85-6669b211663c","Path":"manual-composite-layers-1.md","Order":5},{"Id":"66146a21-6729-4f00-b58c-02682a2b468c","Path":"quicker-selection-of-anchors-1.md","Order":6},{"Id":"e38b1368-2cdd-4eb6-93d3-5f1a27b6dafa","Path":"auto-layers-3.md","Order":4},{"Id":"3a3324b2-fd56-4778-b1be-17b9ea0f5ba5","Path":"variable-components-1.md","Order":7}],"Id":"908ef3fc-ff21-461e-9e97-9e5d76700892","Path":null,"Order":9,"CategoryType":0,"Icon":null,"Title":"Components and anchors","Languages":[{"Code":"en","Title":"Components and anchors","Slug":"components-and-anchors-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"028a7e2b-de55-4151-95be-029fba6765c5","Path":"gallery-panel-3.md","Order":2},{"Id":"cfe582a6-5018-4870-8eea-e3f6a22d1d02","Path":"pressuresensitive-brush-1.md","Order":6},{"Id":"2e9553e5-31ee-423b-95e2-617edcd929d2","Path":"remove-overlap-3.md","Order":7},{"Id":"8ee4b1e9-ed85-401a-b013-255df35ca356","Path":"editing-contours-2.md","Order":1},{"Id":"6b1af52f-d051-4ade-9d27-49088adb2f7c","Path":"knife-tool-5.md","Order":4},{"Id":"e966c67c-7f88-4fac-b5d8-2c811f7bb072","Path":"add-guide.md","Order":3},{"Id":"735d3e40-cb6a-4412-91bf-3aba8bdd215b","Path":"opacity-of-guides-zones-hints-font-dimensions-2.md","Order":5}],"Id":"a1d88cf0-31a8-4ab0-8062-46a1aac7858a","Path":null,"Order":23,"CategoryType":0,"Icon":null,"Title":"General improvements","Languages":[{"Code":"en","Title":"General improvements","Slug":"general-improvements","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"58c115d6-30e3-4cf6-b645-e1057ff9bae4","Path":"generate-glyphs-3.md","Order":2},{"Id":"c4fe831b-69f8-4884-a4b1-cc5c23461915","Path":"create-parallel-contour-2.md","Order":1},{"Id":"b7494acc-a439-465f-9304-49d7bceff16d","Path":"metrics-5.md","Order":4},{"Id":"982cf8a7-1ba9-44d6-9a37-96178f0c8b52","Path":"quick-measurement-3.md","Order":5},{"Id":"47a3b659-503f-49ef-9f03-93283c33e5fe","Path":"make-svg-editable-1.md","Order":3}],"Id":"2ed6e402-1b8f-4c7c-ae79-9874d00705c7","Path":null,"Order":36,"CategoryType":0,"Icon":null,"Title":"New features","Languages":[{"Code":"en","Title":"New features","Slug":"new-features","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"de65ea6a-257d-4a52-b687-b5c7e7d3f589","Path":"copied-elements-2.md","Order":4},{"Id":"732a0c40-03ed-4b62-ba56-a8b7f98bf473","Path":"copied-contours-2.md","Order":3},{"Id":"2e2ff4ad-f0b8-4faa-8522-cec17b1e304b","Path":"add-element-reference-add-contours-2.md","Order":13},{"Id":"f87b132c-bdf8-4ca8-9650-02e12c5dc707","Path":"element-references-4.md","Order":10},{"Id":"0d519905-b61f-48aa-bf57-1f613c365234","Path":"turn-dynamic-auto-layers-into-custom-auto-layers-1.md","Order":14},{"Id":"a16c7e5f-7400-4873-8607-445c78b4e490","Path":"work-with-auto-layers-1.md","Order":15},{"Id":"98352075-f5a9-427c-8154-8dc1acc9871a","Path":"dynamic-auto-layers-1.md","Order":9},{"Id":"f20411b2-cd99-43ed-817c-a335b6532171","Path":"create-new-glyphs-as-auto-layers-1.md","Order":7},{"Id":"27ab5821-a002-4d16-8ac2-8ca24a07748d","Path":"create-auto-layers-in-existing-glyphs-1.md","Order":5},{"Id":"ab4c746e-020d-4e07-beaf-f70e992deb9a","Path":"custom-auto-layers-1.md","Order":8},{"Id":"4776db81-2e88-41d0-b636-8d65bb74ae44","Path":"heres-a-summary-of-how-you-can-reuse-portions-of-glyphs-in-fontlab-7.md","Order":1},{"Id":"b4c21be0-1ef8-4279-86cf-c88ccff7d293","Path":"live-auto-layers-1.md","Order":12},{"Id":"9f089196-25cc-4fda-8962-e6d4ccc36334","Path":"auto-layers-4.md","Order":11},{"Id":"ab0af43e-94e8-42e4-b891-d50af0b2abcc","Path":"create-custom-auto-layers-in-multiple-existing-glyphs-1.md","Order":6},{"Id":"918f8d60-79bd-4507-880c-0c934f866b59","Path":"components-3.md","Order":2}],"Id":"f7cd186e-9411-4e35-9843-87e9adf7b9ba","Path":null,"Order":24,"CategoryType":0,"Icon":null,"Title":"Re-use portions of glyphs","Languages":[{"Code":"en","Title":"Re-use portions of glyphs","Slug":"re-use-portions-of-glyphs","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"575709df-f160-47f2-8ed0-71c86a705baa","Path":"include-in-vfc.md","Order":4},{"Id":"00d173f2-b79a-4d34-8c4f-e5e3e40c7df1","Path":"include-in-vfj-1.md","Order":5},{"Id":"8e605205-cd6d-449c-ac02-0264b0f0d1cc","Path":"autosave-2.md","Order":1},{"Id":"79735019-41c4-42c1-905a-7b47168f3f55","Path":"existing-files-1.md","Order":2},{"Id":"29c4e843-c63a-4b60-b66a-cbca065155fb","Path":"first-save.md","Order":3}],"Id":"5e23d4c0-ac2d-4171-ba00-4561cb3fdfd0","Path":"save.md","Order":44,"CategoryType":1,"Icon":null,"Title":"Save","Languages":[{"Code":"en","Title":"Save","Slug":"save","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"97ae81db-88d4-47ab-a086-1f506bce8a12","Path":"implicit-weight-andor-width-axis-location-1.md","Order":1},{"Id":"95ef155a-ba0b-4986-ae7d-77d7a8eb9743","Path":"metrics-linking-in-set-width-action-1.md","Order":2},{"Id":"cc7d283e-cc84-4610-b3fb-c3de77fcd1da","Path":"stat-table-in-variable-opentype-fonts-1.md","Order":3}],"Id":"74162d84-5574-4129-ad58-1b397ebe3244","Path":null,"Order":51,"CategoryType":0,"Icon":null,"Title":"Exporting Fonts","Languages":[{"Code":"en","Title":"Exporting Fonts","Slug":"exporting-fonts-2","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"325c754c-f9bc-4fc8-9617-8b015d3285d5","Path":"font-info-overview-copypaste-and-edit-info-in-a-multimaster-table-1.md","Order":3},{"Id":"4f5fd6d2-9116-49c5-b376-e7aa084860ac","Path":"new-syntax-for-axis-instances-1.md","Order":4},{"Id":"0751825d-43fa-4f4d-b7bf-e223b1812238","Path":"variations-in-font-info-1.md","Order":5},{"Id":"bada3fe8-7d19-4e4e-977c-24c735f70a9a","Path":"change-the-axis-range-and-define-nonlinear-mapping-between-design-and-user-1.md","Order":1},{"Id":"df9ec599-1152-415b-b4eb-12ad2ec6e74a","Path":"copypaste-font-info-between-fonts-and-masters-1.md","Order":2}],"Id":"724ced55-5912-4752-9789-7485afe5d174","Path":"font-info-3.md","Order":58,"CategoryType":1,"Icon":null,"Title":"Font Info","Languages":[{"Code":"en","Title":"Font Info","Slug":"font-info-3","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"0fd8f5f8-d99b-41a3-947c-3760ea4d7eb3","Path":"microsoft-volt-and-features-for-complex-scripts-2.md","Order":3},{"Id":"4ade0f6b-a8be-47ec-acdd-4cf7481bfbcb","Path":"sample-volt-fonts-4.md","Order":5},{"Id":"560e1e6f-7579-4411-83fa-a759f03e21e2","Path":"volt-tutorials-and-info-1.md","Order":7},{"Id":"a18d195c-efd6-4f40-a972-182548bcb0a4","Path":"using-microsoft-volt-4.md","Order":6},{"Id":"2bd46f45-c2e9-4146-af40-76dafc060417","Path":"exporting-fea-features-to-volt-2.md","Order":1},{"Id":"03ddca82-52ee-4f06-aac5-cb87adc3f097","Path":"more-voltrelated-tools-2.md","Order":4},{"Id":"1659e55c-6a7f-4988-89ac-16536f2e9126","Path":"fontlab-7-3.md","Order":2}],"Id":"8115b2ba-4b75-4033-bd42-c2fe10cd0321","Path":null,"Order":30,"CategoryType":0,"Icon":null,"Title":"OpenTye Features","Languages":[{"Code":"en","Title":"OpenTye Features","Slug":"opentye-features-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"6edcb274-7230-40ac-8c32-dfeb9dfbe470","Path":"simple-stickers-1.md","Order":1},{"Id":"21e112ba-43d3-40c8-826d-df77dda43be0","Path":"text-stickers-1.md","Order":3},{"Id":"25cddc21-b878-4152-b437-e9ff09f000c8","Path":"stickers-3.md","Order":2}],"Id":"c4847884-df2a-4732-bea2-3359c90670f3","Path":null,"Order":26,"CategoryType":0,"Icon":null,"Title":"Annotate glyphs visually with stickers","Languages":[{"Code":"en","Title":"Annotate glyphs visually with stickers","Slug":"annotate-glyphs-visually-with-stickers","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"ce960ce3-6635-4f1f-8c8e-62c5e677bbdd","Path":"showing-handles-in-mask-and-inactive-layers-1.md","Order":7},{"Id":"3e07bccb-350a-4894-97f7-eae822d9fd75","Path":"clicking-near-a-node-handle-or-segment-1.md","Order":1},{"Id":"da33d75c-a599-4e5e-a056-1ada4f42615c","Path":"precision-cmdctrldragging-of-nodes-and-handles-1.md","Order":4},{"Id":"c9693773-97cd-42dc-be00-5cbd5a860106","Path":"smart-corners-1.md","Order":8},{"Id":"ba3a70c2-bb89-4149-b4e0-7ef4264796e2","Path":"quick-measurement-5.md","Order":5},{"Id":"d3cf9e68-8498-4b4e-93cd-316dc3dc9dcc","Path":"more-flexible-shiftdragging-of-points-1.md","Order":3},{"Id":"269d5106-aa9e-4a18-82b2-61619df0ca5d","Path":"end-lines-center-line-rainbow-1.md","Order":2},{"Id":"e2c05dae-2a0d-42a2-b89d-a2fb1ee5a8a6","Path":"refined-arrow-key-shortcuts-for-moving-nodes-and-selections-1.md","Order":6},{"Id":"40972967-62b8-4bc6-ac00-eae92f16aa80","Path":"stickers-4.md","Order":9},{"Id":"c3ff1e8a-2ff8-4660-a6ac-22f8ba8c77df","Path":"tangent-start-points-1.md","Order":10}],"Id":"5e5d85a5-0350-427c-9d26-f590b24532c0","Path":null,"Order":57,"CategoryType":0,"Icon":null,"Title":"Editing glyphs","Languages":[{"Code":"en","Title":"Editing glyphs","Slug":"editing-glyphs-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"a61b48b0-df22-4e93-bef3-c6ce6b6c0928","Path":"classes-improvements.md","Order":1}],"Id":"ad5cc571-9f47-442c-bc8f-c2efe05275f6","Path":null,"Order":60,"CategoryType":0,"Icon":null,"Title":"Classes","Languages":[{"Code":"en","Title":"Classes","Slug":"classes-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"e28339cc-0707-454f-9b5b-be01cdc24dbb","Path":"guides-3.md","Order":2},{"Id":"b61ea937-2f54-4283-a032-6c33df06173d","Path":"quick-measurement-4.md","Order":3},{"Id":"a5d76172-1035-4f9b-8699-05121051d520","Path":"autostems-and-suggest-stems-1.md","Order":1}],"Id":"0d491acc-e42b-4c22-9bde-4ef4e446aac4","Path":null,"Order":47,"CategoryType":0,"Icon":null,"Title":"Guides, Measurement, Stems","Languages":[{"Code":"en","Title":"Guides, Measurement, Stems","Slug":"guides-measurement-stems","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"144a6831-2ab8-4604-8176-800fe773ec8b","Path":"add-layers-and-masters-1.md","Order":4},{"Id":"4f4f8cdb-5ca6-4c0d-9bad-c05dd19c6763","Path":"reinterpolate-1.md","Order":10},{"Id":"fe910078-3b28-4d93-b9cd-dc45497ebabc","Path":"add-variation-1.md","Order":1},{"Id":"b6119621-a891-45db-8f85-2b8a257c4edf","Path":"layers-visibility-1.md","Order":6},{"Id":"90b5f3cf-263b-4391-92fe-4594774f02c0","Path":"match-masters-1.md","Order":7},{"Id":"f1a40fd0-3c5a-4372-9c62-227a769da5ff","Path":"matchmaker-1.md","Order":8},{"Id":"39770f9e-77ef-4e7f-9595-68952a494af4","Path":"preview-variations-1.md","Order":9},{"Id":"5e8793e8-4135-4395-b394-5680bd7b49a9","Path":"axis-graph-1.md","Order":2},{"Id":"80f9fd30-c80d-4478-b020-827112841ee2","Path":"rename-masters-1.md","Order":11},{"Id":"22976fc0-7ab2-4795-b7ae-9c061b483ad9","Path":"axis-instances-from-masters-1.md","Order":3},{"Id":"379f8451-7057-49d3-be5b-53a5a93df2c2","Path":"layers-in-new-glyphs-1.md","Order":5}],"Id":"da6d6eac-c3c0-4928-9c74-b1940130f20b","Path":null,"Order":25,"CategoryType":0,"Icon":null,"Title":"Layers and Variations","Languages":[{"Code":"en","Title":"Layers and Variations","Slug":"layers-and-variations","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"d8ef22d8-56ab-406c-8c82-71f6e825e6f5","Path":"more-improvements-to-autotrace-and-bitmap-images-1.md","Order":2},{"Id":"57886b0e-4cfa-4829-963b-ead6c247a0be","Path":"build-the-initial-contours-1.md","Order":1},{"Id":"3f868386-978d-449c-986a-46c3234f3e92","Path":"postprocess-the-initial-contours-1.md","Order":4},{"Id":"070c9e96-a0e2-4d72-b5f0-e826e391c04a","Path":"postprocess-the-image-1.md","Order":3},{"Id":"bae6da22-b8ce-4eb6-b64e-84e85b0509e4","Path":"prepare-the-image-1.md","Order":5}],"Id":"8c295448-9500-41cc-b2ec-6bf82af31698","Path":"bitmaps-and-autotrace.md","Order":63,"CategoryType":1,"Icon":null,"Title":"Bitmaps and Autotrace","Languages":[{"Code":"en","Title":"Bitmaps and Autotrace","Slug":"bitmaps-and-autotrace","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"d099787b-6b14-4c5b-a3fb-ceb7d38ba6da","Path":"quick-help-4.md","Order":2},{"Id":"778ac0c3-994d-4fe2-af39-1ba02c542875","Path":"app-start-and-macos-10-1.md","Order":1}],"Id":"8aa44b97-b722-4d99-9ba9-80c98ee0a7b4","Path":null,"Order":55,"CategoryType":0,"Icon":null,"Title":"General","Languages":[{"Code":"en","Title":"General","Slug":"general-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"d25ba37a-08bd-4c90-816f-7ded98b7dad4","Path":"new-jsonbased-copypaste-system.md","Order":1}],"Id":"a70bae16-4732-47e1-abff-432640a62871","Path":"copy-paste.md","Order":56,"CategoryType":1,"Icon":null,"Title":"Copy-paste","Languages":[{"Code":"en","Title":"Copy-paste","Slug":"copy-paste","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"0c3ac3cf-139e-48e0-9b40-1c048da20de7","Path":"looped-corners-1.md","Order":3},{"Id":"eaf24578-0619-4b1c-99f7-054a47ee1755","Path":"genius-nodes-and-power-nudge.md","Order":2},{"Id":"ead91340-c630-4a81-b917-f3d4f1470919","Path":"contour-tool-cheat-sheet-1.md","Order":1},{"Id":"658185bb-d859-4170-a940-1e351c04267d","Path":"measurement.md","Order":4},{"Id":"4541b8af-ffdf-45ab-8ade-0e0a484c0aa5","Path":"rectangle-and-ellipse-tools-1.md","Order":5},{"Id":"efddb51f-d1a4-443f-a24c-0e759dba0e8f","Path":"transform-panel-5.md","Order":6}],"Id":"0793f828-eeb7-4cc3-bba1-7ef9e09fc71b","Path":null,"Order":41,"CategoryType":0,"Icon":null,"Title":"Glyph design","Languages":[{"Code":"en","Title":"Glyph design","Slug":"glyph-design-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"4f6ead7f-b044-4bd8-8266-9daacb6a157f","Path":"auto-layers-for-all-masters-and-multiple-glyphs-1.md","Order":1},{"Id":"5ff0d5ba-3371-4a5e-afb6-3142b44959df","Path":"crossmaster-components-1.md","Order":3},{"Id":"805d45c8-9219-48d5-8898-f56a4651eaaf","Path":"decomposing-composite-glyphs-1.md","Order":4},{"Id":"7c322551-0a34-448e-a35c-751d6288bf5b","Path":"copy-recipes-1.md","Order":2},{"Id":"000e6c15-15ea-4daa-8ad1-5a07813910fe","Path":"elements-6.md","Order":5},{"Id":"71caf60a-fc4e-4b78-b5b8-e3a858c4eea5","Path":"flatten-layer-and-flatten-glyph-1.md","Order":6}],"Id":"e0370c52-1ab5-4a59-a826-295fd164e1e1","Path":null,"Order":62,"CategoryType":0,"Icon":null,"Title":"Components and Auto Layers","Languages":[{"Code":"en","Title":"Components and Auto Layers","Slug":"components-and-auto-layers","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"8e89e1a9-75b8-4174-9c95-9a7aed969a57","Path":"opentypesvg-fonts-1.md","Order":1},{"Id":"3b0be707-3ce3-4330-b46f-879f1da0bf4a","Path":"pasting-vector-artwork-1.md","Order":2}],"Id":"e0368cae-881f-4dd2-8b47-285319163168","Path":null,"Order":53,"CategoryType":0,"Icon":null,"Title":"Importing Contents","Languages":[{"Code":"en","Title":"Importing Contents","Slug":"importing-contents","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"297e8708-a99b-4b4e-9503-b1354424206d","Path":"bitmap-fonts-4.md","Order":1},{"Id":"f319e569-ac8c-4adb-857e-22772341e8e4","Path":"glyph-names-and-unicode-2.md","Order":3},{"Id":"8fdf3672-04a8-4f88-aaf3-a5b42a2d8d29","Path":"python-scripting-2.md","Order":5},{"Id":"ae032671-d041-4078-80b6-66747fe85917","Path":"open-and-export-1.md","Order":4},{"Id":"1a4c63ff-a626-4c8e-b43e-7b2bb9d8596e","Path":"user-interface-6.md","Order":6},{"Id":"9c7478c9-e06d-4045-94ae-8049e32b5fd2","Path":"varia.md","Order":7},{"Id":"f361ff21-4d8f-4173-8347-d559a17cd25b","Path":"fonts-panel-3.md","Order":2}],"Id":"e92b1c1d-c5e7-4643-9eda-0b48810bf344","Path":null,"Order":42,"CategoryType":0,"Icon":null,"Title":"Other","Languages":[{"Code":"en","Title":"Other","Slug":"other-2","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"a0255998-b7ab-4f08-9f87-4b17d4a07468","Path":"conditional-glyphs-rvrn-rules-1.md","Order":6},{"Id":"1443bedd-c077-44ec-affe-6ae79d42e743","Path":"sparse-masters-intermediate-masters-1.md","Order":16},{"Id":"945e8ae4-ae1f-4094-9201-69d63bea55e3","Path":"matchmaker-2.md","Order":17},{"Id":"964065cc-ccf2-48d7-8bf0-8c930855dfa5","Path":"anisotropic-interpolation-separate-axis-locations-for-xy-coordinates-1.md","Order":5},{"Id":"f94d4bcf-408f-41a1-ac38-863fae2eef1b","Path":"match-when-editing-2.md","Order":9},{"Id":"e2886567-d873-45b5-a5af-83fc6c3b6c2d","Path":"copy-to-masters-1.md","Order":7},{"Id":"5a116ae0-e1f0-4639-a470-f840003eb086","Path":"variations-panel-6.md","Order":10},{"Id":"bd479ded-efed-448f-9e35-20f9512601e6","Path":"notes-about-conditional-glyph-substitution-1.md","Order":12},{"Id":"50a53dfb-9dfc-4aca-ac8d-91cf72844545","Path":"show-inactive-layers-as-wireframes-1.md","Order":13},{"Id":"ed639beb-2a3d-4728-89df-f0116ed948e3","Path":"tilde-tags-1.md","Order":14},{"Id":"138a4b1e-4af6-49fd-bce2-ffa11f0ea745","Path":"preview-panel-content-masters-1.md","Order":1},{"Id":"a27a583b-13b7-4582-9429-3937efdf885e","Path":"layers-masters-panel-2.md","Order":8},{"Id":"c15c968f-8b75-4b69-91f5-d0abf757bb14","Path":"variation-panel-1.md","Order":3},{"Id":"bc33e5f8-a278-4b8a-bd66-630ae4a3a5bc","Path":"spacing-4.md","Order":4},{"Id":"f16ba813-0a93-4403-b34f-84abdb96884f","Path":"axis-graph-2.md","Order":2},{"Id":"d51f2829-4ad7-40c4-9ee3-6345d81d4298","Path":"nonmatching-glyphs-in-font-window-sidebar-1.md","Order":11},{"Id":"998e2737-1821-47ac-8b87-3e3cfa9238a3","Path":"variation1-1.md","Order":15}],"Id":"fceaeae9-6654-4880-b26c-77c94f715d2f","Path":null,"Order":40,"CategoryType":0,"Icon":null,"Title":"Variation","Languages":[{"Code":"en","Title":"Variation","Slug":"variation-2","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"757569ac-d423-4644-b0bc-054cf6892f3e","Path":"glyphs-and-opentype.md","Order":6},{"Id":"15c96410-59e7-421c-937f-cbee4b61d09b","Path":"fonts-and-variations.md","Order":4},{"Id":"c3436e48-c694-469d-a914-69c7fdf8d8f1","Path":"editing-glyph-drawings.md","Order":3},{"Id":"e9026d54-bbd5-4280-b1b6-f225f5f085c4","Path":"highlights1-1.md","Order":2},{"Id":"89f218ea-f35c-47a9-b5db-2b89b899679d","Path":"highlights1.md","Order":1},{"Id":"0920948f-8c89-4ef0-9100-749b313f9f3d","Path":"glyph-design-3.md","Order":5},{"Id":"ace137e7-8180-4776-9ce3-22eb35cbe84b","Path":"other-4.md","Order":8},{"Id":"3746a336-436a-4896-ae12-552cb14eeb04","Path":"metrics-and-kerning-5.md","Order":7}],"Id":"5144869b-8ee1-4d6b-b61e-198d0d86da58","Path":null,"Order":39,"CategoryType":0,"Icon":null,"Title":"Highlights","Languages":[{"Code":"en","Title":"Highlights","Slug":"highlights","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"45002fdb-5864-4fca-9885-00b2dcf8af38","Path":"fit-artwork-section-1.md","Order":1},{"Id":"e41f8ba2-1bbc-4653-a115-53e6177259bd","Path":"placing-artwork-2.md","Order":3},{"Id":"2ff90f0d-2268-41d9-9894-b0ea009ed60c","Path":"vector-artwork-section-1.md","Order":4},{"Id":"875d0d74-ca8f-4110-8a4a-da9367f28387","Path":"keep-artwork-size-section-1.md","Order":2}],"Id":"35802a65-8617-4814-9647-dda2748d6c7a","Path":null,"Order":43,"CategoryType":0,"Icon":null,"Title":"Placing artwork","Languages":[{"Code":"en","Title":"Placing artwork","Slug":"placing-artwork","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"9deeee0c-de16-4686-aae3-3b6704458099","Path":"glyph-names-8.md","Order":1},{"Id":"50a2d4b3-5759-4b17-b98b-eca92b1356ff","Path":"spaces-in-tag-names.md","Order":2},{"Id":"08a17d16-0eaf-42fd-b333-257475b846d2","Path":"unicode-in-cjk-fonts-1.md","Order":3}],"Id":"c52541a8-54dc-46ae-90a0-e4480e483295","Path":null,"Order":49,"CategoryType":0,"Icon":null,"Title":"Glyphs & tags","Languages":[{"Code":"en","Title":"Glyphs & tags","Slug":"glyphs-tags","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"bdf2bf80-92f6-45be-957f-7c399eec3490","Path":"make-existing-glyphs-blank-2.md","Order":2},{"Id":"566bc59c-fcb7-4038-abf2-a263443d7e31","Path":"create-a-new-blank-glyph.md","Order":1}],"Id":"982bab19-acdc-4c7c-ab8e-360a7e2ad3de","Path":null,"Order":28,"CategoryType":0,"Icon":null,"Title":"Make Blank Glyphs","Languages":[{"Code":"en","Title":"Make Blank Glyphs","Slug":"make-blank-glyphs","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"adfa8088-3870-4717-8b1b-860e983c9d95","Path":"color-fonts-3.md","Order":1},{"Id":"f2fccd15-e65a-4ef1-8ccd-1ef8e1c7f800","Path":"font-info-slope-and-sorting-of-styles-in-font-menus-1.md","Order":2},{"Id":"de79996f-519d-4f28-bde0-cab59755ba3d","Path":"hinting-in-otf-2.md","Order":3}],"Id":"68bedbe5-906c-4c1d-949f-9ebe9cc4dde4","Path":null,"Order":32,"CategoryType":0,"Icon":null,"Title":"Export","Languages":[{"Code":"en","Title":"Export","Slug":"export-3","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"a04b332d-bda1-492f-8840-fd2f86d369d4","Path":"autohinting-3.md","Order":1},{"Id":"74822e14-2c24-4c97-937d-bc7c6966d183","Path":"updated-friendly-glyph-names.md","Order":5},{"Id":"2f129d21-0b74-411c-b484-c54b8da6ecaf","Path":"replace-component-1.md","Order":4},{"Id":"abd05745-6091-4429-8dde-3739f0e02235","Path":"font-window-filters-3.md","Order":2},{"Id":"7af42cdb-8d4d-4862-9b62-4ee4e3596331","Path":"preview-panel-8.md","Order":3}],"Id":"580f72f6-df42-4788-94ff-7753a722647f","Path":null,"Order":50,"CategoryType":0,"Icon":null,"Title":"Additional Improvements","Languages":[{"Code":"en","Title":"Additional Improvements","Slug":"additional-improvements","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"602162d4-ad48-43b1-83ee-480db7e5c98a","Path":"nodes-at-extremes-3.md","Order":1},{"Id":"057dbf46-1fe4-4fa7-93f0-4dd8c89c17f0","Path":"precision-drag.md","Order":2}],"Id":"ae492e20-88bc-4f01-bdcc-4e38846755d1","Path":null,"Order":52,"CategoryType":0,"Icon":null,"Title":"Glyph Drawing","Languages":[{"Code":"en","Title":"Glyph Drawing","Slug":"glyph-drawing","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"4567b2f2-1ebb-42d0-9a53-8a04192fef2b","Path":"find-characters-and-categories-1.md","Order":8},{"Id":"e2a23b98-4f88-462f-a634-1958a9fc6654","Path":"exporting-looped-corners-1.md","Order":5},{"Id":"90a92a34-c34d-4793-bab7-fe4ff745dd7a","Path":"move-to-trash-recycle-bin-1.md","Order":10},{"Id":"47cea5b8-3985-4ca4-9881-27d91ca44fa4","Path":"export-profiles-3.md","Order":4},{"Id":"10e43348-f971-4fbc-b28e-d5ef572c0ece","Path":"exporting-variable-fonts-1.md","Order":6},{"Id":"df1145b1-6eee-4436-9c94-81e775230ce9","Path":"font-dimensions-3.md","Order":9},{"Id":"a8b5b800-5c44-4eb4-9797-079412c1bd7b","Path":"family-name-visible-when-exporting-instances-1.md","Order":7},{"Id":"8d1f757a-c9f2-4b84-a329-1ca316de9113","Path":"quick-help-3.md","Order":12},{"Id":"e2c5ea7e-cf9f-4b0f-887b-34634db3854c","Path":"bundled-adobe-fdk-for-opentype-afdko.md","Order":1},{"Id":"8a03f04b-c6ac-4dd8-a5db-f88f999ae765","Path":"tips-1.md","Order":13},{"Id":"5972d428-b9f2-4a06-bf50-ef788e04567d","Path":"color-fonts-4.md","Order":2},{"Id":"98362564-59c5-492c-a9bd-d8e5e873126e","Path":"panels-list-3.md","Order":11},{"Id":"8ca0bb8d-0572-4292-b1af-804b66907ccf","Path":"user-interface-7.md","Order":14},{"Id":"4bbcfdb8-56ed-4b9b-966f-6a11d72c02a0","Path":"export-and-import-encoding-1.md","Order":3}],"Id":"60f01cf6-2c97-44a2-ab19-92bb71701ce5","Path":null,"Order":48,"CategoryType":0,"Icon":null,"Title":"Encodings & font filters","Languages":[{"Code":"en","Title":"Encodings & font filters","Slug":"encodings-font-filters","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"12629802-2849-4e00-8409-361435370f85","Path":"scrolling-1.md","Order":4},{"Id":"7b3e386c-3265-452f-89f6-b5e56320b7f1","Path":"composite-glyphs-and-auto-layers-1.md","Order":7},{"Id":"a60b1030-53ea-45bb-8a2e-b5f7b93db2cb","Path":"cell-size-1.md","Order":1},{"Id":"1e67763d-0a55-48a7-903b-ca60c0195ac5","Path":"elements-5.md","Order":9},{"Id":"1e8767fb-2852-456c-b9be-e02c48e26c91","Path":"variation-3.md","Order":15},{"Id":"ca953cdd-2943-4819-be77-57c5a20249a8","Path":"elements-panel-4.md","Order":8},{"Id":"3e401c62-5d80-43cc-8e0f-7bdeefc8eef7","Path":"other-improvements-2.md","Order":12},{"Id":"09ebf214-8fa4-441e-80b3-50589e233449","Path":"brush-tool-6.md","Order":6},{"Id":"de90a20f-4fe8-48c6-8c1c-126c8e627fc0","Path":"glyph-tags-2.md","Order":3},{"Id":"73bc05f5-4937-499e-84cf-726382cfd543","Path":"text-in-preview-panel-1.md","Order":14},{"Id":"496167cf-ce2d-459a-ad77-8ffa3bf6e309","Path":"paste-special-2.md","Order":13},{"Id":"1d68d7e9-b217-43b9-9985-2ef05a890072","Path":"hints-5.md","Order":11},{"Id":"9a999f8f-f68f-4748-ad20-f40ca7930ba1","Path":"windows-with-multiple-monitors-1.md","Order":5},{"Id":"ae254d09-a4f4-46ed-8fba-e192e822c759","Path":"glyph-names-7.md","Order":2},{"Id":"f10a1b66-b4ff-462f-9793-0e0e81185055","Path":"gallery-panel-4.md","Order":10}],"Id":"1e1da29a-4d9c-446a-af67-83e96bf52326","Path":null,"Order":31,"CategoryType":0,"Icon":null,"Title":"Other Improvements","Languages":[{"Code":"en","Title":"Other Improvements","Slug":"other-improvements","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"9c4c5150-020a-46fe-ae14-66ae14ce31bf","Path":"slanting-anchors-1.md","Order":7},{"Id":"c4633863-ce53-4abb-a048-99c360a7ed4f","Path":"copying-anchors-and-pins-1.md","Order":1},{"Id":"cb23394f-6081-4fec-82ae-636084e134c1","Path":"moving-anchors-and-contour-selections-1.md","Order":3},{"Id":"d9fc51d2-2e33-4feb-8481-b1ee8aaf56a1","Path":"removing-anchors-1.md","Order":4},{"Id":"2ac42d2c-9689-4ccf-b2b6-151f6075bee9","Path":"exporting-mark-attachment-features-1.md","Order":2},{"Id":"30b7c56b-2224-4c4e-b316-db9b26e52563","Path":"selecting-anchors-and-pins-1.md","Order":5},{"Id":"04babf93-a96f-40e1-a5ca-35d439e3544e","Path":"show-mark-attachment-no-longer-normalizes-text-1.md","Order":6}],"Id":"a91b2123-1768-4767-a9a9-ccad5a097715","Path":null,"Order":54,"CategoryType":0,"Icon":null,"Title":"Anchors, Pins and Mark Attachment","Languages":[{"Code":"en","Title":"Anchors, Pins and Mark Attachment","Slug":"anchors-pins-and-mark-attachment-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"963dccfc-4743-4dbe-9f90-d88e20952274","Path":"linked-nodes-and-power-guides-1.md","Order":2},{"Id":"f696c055-132b-43d5-95fb-f3c235dd78eb","Path":"manually-adding-hints-with-the-magnet-tool-1.md","Order":3},{"Id":"7c04550a-19fc-436c-b8d4-fa9773b19ae8","Path":"autohinting-4.md","Order":1}],"Id":"d3e5d526-8a4f-4d1c-b9e9-fb5e04b769e0","Path":"hints-and-power-guides.md","Order":59,"CategoryType":1,"Icon":null,"Title":"Hints and Power guides","Languages":[{"Code":"en","Title":"Hints and Power guides","Slug":"hints-and-power-guides","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"10e989e0-0745-4234-8e27-ccad9eb1d353","Path":"copypaste-and-import-artwork-in-pdf-format-1.md","Order":1},{"Id":"4da3d2d6-996c-4700-a188-e201bebe63b8","Path":"improved-conversion-from-svg-to-editable-contours-1.md","Order":2},{"Id":"17ff7920-7ff3-49a6-8b8e-86ccc71c88f3","Path":"pasteimport-of-vector-artwork-coordinate-rounding-1.md","Order":3},{"Id":"27ce4403-8d07-4837-9e52-1c547ad814e3","Path":"pasteimport-of-vector-artwork-monochrome-artwork-1.md","Order":4}],"Id":"7b1ed4e2-aafd-43ae-98f8-8ee7013082ca","Path":null,"Order":61,"CategoryType":0,"Icon":null,"Title":"Vector artwork","Languages":[{"Code":"en","Title":"Vector artwork","Slug":"vector-artwork","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"ab4133ee-486d-4b8f-980a-60ea7c5f6695","Path":"fontlab-7-4.md","Order":1},{"Id":"b6213dc7-2137-4222-aba1-453a090539bd","Path":"bug-fixes-5.md","Order":2}],"Id":"a0d0a76e-5aa9-4a5d-bd9a-e5b9285f7ded","Path":"bug-fixes.md","Order":45,"CategoryType":1,"Icon":null,"Title":"Bug fixes","Languages":[{"Code":"en","Title":"Bug fixes","Slug":"bug-fixes","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"7eaf9171-fd9e-4e84-b8a0-4272d7eddb2f","Path":"use-classes-panel-classes-tags-and-virtual-tags-in-feature-code-1.md","Order":14},{"Id":"30db11ea-e72b-4c0d-89e1-b6d32e4be1d2","Path":"naming-glyphs-for-auto-feature-generation-1.md","Order":11},{"Id":"3761d6a6-4488-4173-9693-fe2755ecf839","Path":"interpolable-positioning-features-cpsp-etc-1.md","Order":9},{"Id":"52efef5b-334c-41b7-bfce-fce0fcf7014d","Path":"adding-custom-code-to-autogenerated-feature-definitions-1.md","Order":3},{"Id":"7187b497-1788-4fbf-825f-1154c53f9875","Path":"gdef-glyph-definition-classes-1.md","Order":8},{"Id":"670d5857-1701-46d0-bd12-89539e8e05d7","Path":"auto-opentype-features-and-the-features-panel-1.md","Order":5},{"Id":"9f15dcc4-dee0-4dae-8b9e-bcc8a4fc1bf1","Path":"adding-custom-kerning-lookups-kern-1.md","Order":4},{"Id":"f58385cb-4a4a-4a97-9b20-e651dcfe8822","Path":"updating-auto-features-1.md","Order":13},{"Id":"dfe770e6-31f7-4d55-af9a-24ea276db788","Path":"adding-autogenerated-code-to-existing-feature-definitions-1.md","Order":2},{"Id":"d71f983f-955d-42af-a2df-dcd673759b07","Path":"automatically-generate-code-for-common-opentype-features-1.md","Order":7},{"Id":"2f96abf6-e1a7-4548-bcd9-8342749906b6","Path":"adding-auto-features-1.md","Order":1},{"Id":"bfaa0021-c997-47e8-a09e-ef2beba6be6a","Path":"autogenerated-portion-of-a-feature-definition-1.md","Order":6},{"Id":"1a202912-820f-4cf6-bcf9-7c293ff1fa36","Path":"using-tags-and-classes-in-feature-code-1.md","Order":15},{"Id":"4e168373-d2e8-4e39-a1a3-0cf90fb13f61","Path":"modifying-auto-feature-definitions-1.md","Order":10},{"Id":"89204c4f-e856-440a-a217-718628f8e2a9","Path":"update-current-auto-feature-or-all-auto-features-1.md","Order":12},{"Id":"ced01710-b06d-4433-872f-3e1f8b2c5780","Path":"view-features-that-are-or-can-be-aurogenerated-1.md","Order":16}],"Id":"c278e018-0cdb-418d-9928-c42b418cdf4b","Path":null,"Order":64,"CategoryType":0,"Icon":null,"Title":"OpenType Features","Languages":[{"Code":"en","Title":"OpenType Features","Slug":"opentype-features-5","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"f279238d-e943-41b7-8471-3e450d577da5","Path":"fill-outline-nodes-1.md","Order":6},{"Id":"311b33b5-eb82-4fb6-ad39-066496b36548","Path":"current-glyph-placeholder-1.md","Order":1},{"Id":"54c794cf-dd19-48cc-89d1-11fb418a1f11","Path":"color-4.md","Order":7},{"Id":"aff166fd-0dba-4743-bf0d-06276b62d347","Path":"content-settings-1.md","Order":4},{"Id":"2f2ff7df-fbd1-484b-80c7-f5f7b4c0680b","Path":"show-names-1.md","Order":9},{"Id":"e45acbc4-d1b4-48a2-8ac1-2d7bde1006c1","Path":"tracking-slant-stretch-1.md","Order":10},{"Id":"f406fb6e-a2b5-4aea-853f-c2ed94ef88b2","Path":"xray-view-blur-1.md","Order":11},{"Id":"b8fb7f7a-c230-468c-883e-8fa93ede2536","Path":"preview-panel-sidebar-2.md","Order":3},{"Id":"255f9997-24b1-46fa-941e-79e66c17fd40","Path":"apply-features-1.md","Order":8},{"Id":"ad1e1a4b-0031-4a51-9dc8-21f3a73f0f9f","Path":"export-preview-panel-content-to-pdf-1.md","Order":5},{"Id":"22ecfdfa-96d2-4287-86f0-b57a9be79331","Path":"align-and-flip-settings-1.md","Order":2}],"Id":"7086ffa0-0d36-4a30-b007-0541558e3d70","Path":"preview-panel-4.md","Order":27,"CategoryType":1,"Icon":null,"Title":"Preview panel","Languages":[{"Code":"en","Title":"Preview panel","Slug":"preview-panel-4","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"9fc21e6d-c850-4fd6-9c1a-da017c4f68ea","Path":"lib-in-python-1.md","Order":5},{"Id":"eeb13fbc-bb51-4920-9acd-95b262ab80f6","Path":"fontlab-and-fontgate-1.md","Order":4},{"Id":"864e9fb8-d304-494a-b232-4a88008c2880","Path":"fl-1.md","Order":3},{"Id":"c5ccc99c-fef3-4069-b048-bc7f968de37b","Path":"python-api-1.md","Order":7},{"Id":"6233ad8a-7c5a-4310-b82b-43c9c7e6e94b","Path":"typerig-3.md","Order":9},{"Id":"2b9ded6c-f741-4c83-b8f8-044a698497e6","Path":"preferences-in-python-2.md","Order":6},{"Id":"59afef56-f6fb-4deb-93bd-80f55b11b854","Path":"anchors-in-python-1.md","Order":1},{"Id":"dd7b6baa-2d53-4f97-a690-03418504bb3d","Path":"autokerning-in-python-1.md","Order":2},{"Id":"1868ed5f-69e1-4556-aca4-98aa5bf7d976","Path":"pythonqt-2.md","Order":8}],"Id":"36d1c3c4-3580-4ace-bd6c-5d1937e22a6a","Path":null,"Order":22,"CategoryType":0,"Icon":null,"Title":"Improvements","Languages":[{"Code":"en","Title":"Improvements","Slug":"improvements-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"f88d7345-c57d-48dc-b0e5-f433a3771971","Path":"metric-expressions-in-glyph-panel-1.md","Order":9},{"Id":"391597b1-ede3-40aa-85ce-4316b1fa4dd0","Path":"glyph-names-and-unicode-1.md","Order":6},{"Id":"63d3781c-1634-4e28-b740-621762953a4d","Path":"import-metrics-1.md","Order":7},{"Id":"a26da742-4773-46c5-97d3-c58fad272a81","Path":"copy-expressions-to-masters-in-glyph-panel-1.md","Order":3},{"Id":"0b44fa9a-2c95-4d31-bb71-2db704ef4a9e","Path":"variations-5.md","Order":15},{"Id":"010077c9-0f93-42a3-ac83-b4d4bf08919d","Path":"shift-anchors-with-contours-1.md","Order":12},{"Id":"dfbc5ca2-a8a7-49bf-bbea-f16bac770b56","Path":"opposite-sidebearing-1.md","Order":11},{"Id":"4bc04976-ba9b-4910-b44b-eb81ba73f2ca","Path":"combine-contours-to-element-1.md","Order":2},{"Id":"7c6bb19b-78c5-44a0-9c0e-f394edde82f8","Path":"custom-appearance-or-anchors-and-pins-1.md","Order":4},{"Id":"7d56619c-de29-4156-bcae-07e924caf2fc","Path":"unfill-element-references-in-element-groups-1.md","Order":14},{"Id":"e341c228-4af3-44b6-9caf-23a2602fe75a","Path":"negative-widths-1.md","Order":10},{"Id":"c6076104-8d06-4f56-9241-f750fcda0950","Path":"font-info-italic-angle-1.md","Order":5},{"Id":"91b8e74b-04ce-450f-99ac-9d2f257e959b","Path":"stroke-2.md","Order":13},{"Id":"0d92a24c-1ae8-4253-9fc3-98b2b0bdf904","Path":"join-open-contours-across-elements-1.md","Order":8},{"Id":"000c78ba-fed9-463a-be46-333427fffcbe","Path":"appearance-of-automaticallynamed-anchors-1.md","Order":1}],"Id":"31fd26e4-e029-417f-b7d8-4ae9a67e119a","Path":null,"Order":35,"CategoryType":0,"Icon":null,"Title":"Elements","Languages":[{"Code":"en","Title":"Elements","Slug":"elements-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"1b0d4dac-9b87-48db-807f-79375699489b","Path":"additions-to-the-fontlab-7-python-api-1.md","Order":1},{"Id":"e530dde5-1b68-4b44-ae5f-6ce6b78d849b","Path":"typerig-with-delta-machine-1.md","Order":5},{"Id":"02c984b5-0e67-49e1-9c08-d643246f7c77","Path":"execute-1.md","Order":2},{"Id":"98212d0a-6d80-4b31-8ca2-8b4156d32bfc","Path":"scripting-panel-4.md","Order":4},{"Id":"5084ecdc-18ef-4790-9cc7-ecf646af50e3","Path":"exporting-fonts-via-python-1.md","Order":3}],"Id":"ea4f7496-2e1f-41e1-a28b-da4d1d567ea8","Path":null,"Order":37,"CategoryType":0,"Icon":null,"Title":"Python scripting","Languages":[{"Code":"en","Title":"Python scripting","Slug":"python-scripting-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"8a2c7039-e295-4200-a811-e6a3ca0e5b94","Path":"paste-or-import-vector-artwork-1.md","Order":14},{"Id":"31201253-941f-4b1f-999b-e1cb70b6f533","Path":"anchors-3.md","Order":19},{"Id":"e2883797-6506-4be5-8388-d307086e6ba6","Path":"curvature-and-smoothness-1.md","Order":3},{"Id":"1556ef63-c30d-494f-a6a4-de035a8faea2","Path":"fontaudit-9.md","Order":17},{"Id":"ab3917c2-21d7-459a-b1bb-18ac8ebff732","Path":"autodetection-of-smooth-nodes-g1-1.md","Order":18},{"Id":"7e0173b1-137f-42dd-b057-95cff7f2d0f6","Path":"knife-tool-duplicate-nodes.md","Order":8},{"Id":"7bccb869-0f8e-40d3-ab76-2a9439ec560e","Path":"handle-selection.md","Order":9},{"Id":"68698a77-2e34-4903-b661-acf045ebc878","Path":"g0-continuity.md","Order":16},{"Id":"2e9a2199-73a6-4824-8db1-80886ac566ea","Path":"genius-nodes-power-nudge-servant-1.md","Order":20},{"Id":"cd9ddb77-63a4-4077-9b90-4f32bcdf44fe","Path":"scissors-tool-simple-ink-traps-and-blunt-corners-1.md","Order":5},{"Id":"6a2ff995-49b5-45da-b70a-53ad204ba0ab","Path":"looped-corners-2.md","Order":7},{"Id":"8ad22a75-06ba-40bb-a478-a561e5f5d2c9","Path":"g3-curve-continuity-smooth-nodes-with-harmonized-handles-1.md","Order":10},{"Id":"3b07df7e-19eb-44db-b5aa-36f9dd01b74f","Path":"harmonizing-nodes-g2-and-handles-g3-1.md","Order":11},{"Id":"640883cd-734b-41f1-9f80-cee1a5291378","Path":"g0-g1-g2-g3-curve-continuity-1.md","Order":15},{"Id":"90a8a611-4d22-42ab-8ca4-4ba3d1be24f2","Path":"working-with-fractional-coordinates-1.md","Order":1},{"Id":"676e1b32-111c-424d-b0cd-a439bf603d5d","Path":"relative-handle-positions-2.md","Order":6},{"Id":"3ef1a8e0-4aa1-4c60-a9e9-92e72ba624c3","Path":"g1-curve-continuity-smooth-nodes.md","Order":13},{"Id":"26beaee4-e66f-42d1-9936-c438b5bd7ce9","Path":"unfill-looped-corners-1.md","Order":4},{"Id":"c0beba84-0c02-453d-9724-bd1d3b7f519a","Path":"g2-curve-continuity-harmonized-smooth-nodes.md","Order":12},{"Id":"d2d0c12f-3b04-4a80-b695-d0df37d4416a","Path":"unlink-node-1.md","Order":2}],"Id":"4231a573-7a69-4b6d-af97-6d4f1273828f","Path":null,"Order":46,"CategoryType":0,"Icon":null,"Title":"Editing contours","Languages":[{"Code":"en","Title":"Editing contours","Slug":"editing-contours-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"bd11c620-8210-4a45-bfdc-dda37214d54b","Path":"testing-languagedependent-opentype-features-locl-1.md","Order":5},{"Id":"49ad7634-65b0-47e9-9b8d-20d4ea5c8df5","Path":"printing-3.md","Order":3},{"Id":"2140eb06-2fa3-42a3-a901-88a9998f974d","Path":"typing-glyphs-in-glyph-window-1.md","Order":8},{"Id":"269d2bc7-ee0c-49fa-8f52-1483b43af309","Path":"copy-unicode-text-glyph-names-or-auto-layer-recipes-1.md","Order":1},{"Id":"1e44c470-2c99-48c5-bd8a-0c18c5c84eea","Path":"layers-and-color.md","Order":2},{"Id":"2ff8777f-30ad-4619-ab24-323efa1c9715","Path":"text-copy-text-as-1.md","Order":6},{"Id":"81207cc6-1065-4067-b262-49068c9834e2","Path":"text-features-selector-1.md","Order":7},{"Id":"70a44a74-33fb-4608-8506-2712bc573f98","Path":"test-script-and-languagespecific-opentype-features-1.md","Order":4}],"Id":"5ef0ace7-d9d3-49a9-bbcc-3687e90948b0","Path":null,"Order":65,"CategoryType":0,"Icon":null,"Title":"Text","Languages":[{"Code":"en","Title":"Text","Slug":"text-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"82861575-c1ba-47a8-9ba0-b04f5f5fc554","Path":"set-kerning-class-1.md","Order":13},{"Id":"55ae4e19-f1e1-455b-ac86-73528fac6696","Path":"linked-metrics-1.md","Order":6},{"Id":"813d5eb2-e03c-4d96-b11e-e23d77337600","Path":"metrics-and-kerning-4.md","Order":9},{"Id":"41c7ceec-afce-4d61-afcc-22a1069c9199","Path":"measurement-line-4.md","Order":3},{"Id":"d98cc60f-4dd6-4fd2-87cd-74d5b7abe570","Path":"quick-autospacingautokerning-the-key-1.md","Order":8},{"Id":"1325f6b2-f95d-47a2-84e6-26f729ee1c78","Path":"linking-metrics-1.md","Order":10},{"Id":"8554ef1b-0156-425d-ae19-2ad3892808c5","Path":"bothsided-kerning-class-1.md","Order":12},{"Id":"728c8e50-b081-4525-9867-bfac229223d3","Path":"warnings-about-problematic-linked-metrics-1.md","Order":14},{"Id":"cbd2e7ac-6a01-4d3b-9780-a07cab7c14e3","Path":"pairs-phrases-panel-2.md","Order":11},{"Id":"b85a0c4b-dac1-4dd2-85b2-b643295ddad1","Path":"linked-metrics-and-live-metrics-1.md","Order":2},{"Id":"a2bded88-859b-492d-8653-7811a08ca1a8","Path":"metrics-table-3.md","Order":4},{"Id":"45f8e8a1-91c3-448b-96bc-e93496056044","Path":"copypaste-sidebearings-1.md","Order":5},{"Id":"ce0a4ed3-ac06-477a-a90a-f89635bfc4f2","Path":"kerning-10.md","Order":7},{"Id":"2eaa7982-b1b3-4f44-992f-c8c13ff109c5","Path":"classes-and-kerning-1.md","Order":1}],"Id":"e2a4c991-1ce7-4479-8130-01ca4a2c78b9","Path":null,"Order":29,"CategoryType":0,"Icon":null,"Title":"Metrics","Languages":[{"Code":"en","Title":"Metrics","Slug":"metrics-1","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"39881071-bea5-4123-a129-3ed42a40b419","Path":"note.md","Order":34},{"Id":"68312e25-40ea-4f36-9999-60a0b640ad49","Path":"bug-fixes-3.md","Order":33},{"Id":"1c5fb2aa-ac46-4465-92e5-6c4fc36224e5","Path":"bug-fixes-4.md","Order":38},{"Id":"6660593d-0973-4431-9669-e456cec8d30c","Path":"bug-fixes-2.md","Order":21},{"Id":"7642b4b3-d249-4a86-b3e4-b26e1181fca8","Path":"highlights-3.md","Order":2}],"Id":"c8d0273d-0c3c-456e-820e-ed8886d12eaf","Path":"fontlab-7.md","Order":1,"CategoryType":1,"Icon":null,"Title":"FontLab 7","Languages":[{"Code":"en","Title":"FontLab 7","Slug":"fontlab-7","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"34a92999-cf04-41a2-8849-5fff430e2270","Path":"snapping-knife-1.md","Order":8},{"Id":"e3547da0-1577-447b-ae36-c90f4e4ac01a","Path":"selection-frame-1.md","Order":7},{"Id":"661ec75e-deae-462d-a83b-2a57816bc09f","Path":"glyph-window-oncanvas-text-fields-1.md","Order":2},{"Id":"952a25ab-217c-425d-8fe9-d35fe2cae946","Path":"highprecision-nonnode-editing-1.md","Order":4},{"Id":"af06e103-3088-494d-86bf-fbbb96c847c9","Path":"remove-overlap-4.md","Order":6},{"Id":"9c70f030-6305-407a-8c2d-41ea17b804d7","Path":"contour-operations-in-the-node-panel-1.md","Order":1},{"Id":"e3dfeace-dced-495b-869d-cf4b541d3c1c","Path":"italic-contours-follow-italic-angle-1.md","Order":5},{"Id":"34c3fe58-d466-4ff4-b761-8949639a2a1b","Path":"glyph-window-zooming.md","Order":3}],"Id":"35688f3c-e83b-4500-8202-5c3f3c1c498b","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Drawing and glyph editing","Languages":[{"Code":"en","Title":"Drawing and glyph editing","Slug":"drawing-and-glyph-editing","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"45f8424c-3507-4398-80ab-49a9613cfb66","Path":"better-optical-separation-1.md","Order":1}],"Id":"677d7593-237d-4d59-a062-99bf95dc92ee","Path":null,"Order":7,"CategoryType":0,"Icon":null,"Title":"Importing Artwork","Languages":[{"Code":"en","Title":"Importing Artwork","Slug":"importing-artwork-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"850a8cde-e705-4758-90b3-b204706ffcae","Path":"sketchboard-and-text.md","Order":9},{"Id":"1a42dfde-d960-4926-9d26-dc325218c951","Path":"additional-bug-fixes-build-7016.md","Order":13},{"Id":"b3b48330-cbe9-43ab-8c1c-884c4e01d21c","Path":"glyphs-and-auto-layers.md","Order":4},{"Id":"1369c63d-cca4-44d1-acc4-ba503273047f","Path":"hints-and-zones.md","Order":6},{"Id":"11604c7e-9492-448a-82e4-142ef3493727","Path":"elements-and-components-2.md","Order":3},{"Id":"f70c65d3-b743-45c7-a597-d14484bd9bea","Path":"user-interface-8.md","Order":12},{"Id":"b635b4a7-cfef-4a6a-8eb1-dcc70ea54f1b","Path":"classes-and-tags-1.md","Order":1},{"Id":"17cda332-83e3-40a7-abda-109d8084b3ab","Path":"glyph-drawing-and-editing.md","Order":15},{"Id":"792f8e1c-6d18-4537-ade9-6554dd738c2d","Path":"opening-saving-and-exporting.md","Order":16},{"Id":"1cd9c93f-b5d2-469f-9f2b-23bb0647c0c9","Path":"bug-fixes-7.md","Order":17},{"Id":"01230165-9a5a-4e0d-b6d7-da5102096873","Path":"bug-fixes-6.md","Order":14},{"Id":"dede8f51-7700-4d76-90c8-b0d31c6d96d8","Path":"metrics-and-kerning-6.md","Order":7},{"Id":"b29fc7c1-c111-41f4-b5db-2bda38022528","Path":"drawing-and-glyph-editing-2.md","Order":2},{"Id":"7923a1bd-c6b2-42b3-9d80-56e1aba34161","Path":"guides-and-grid.md","Order":5},{"Id":"875023ca-2a86-4a01-99e1-60968563dcd3","Path":"truetype-hinting-5.md","Order":10},{"Id":"314e2081-f9ac-41d9-90a3-3d149b8d2de0","Path":"undo.md","Order":11},{"Id":"5d44be70-88a0-4244-98b7-f95efaf0d1c8","Path":"opening-and-exporting-fonts-1.md","Order":8}],"Id":"00e7a0a7-fdbd-4cc9-99e4-267a4ce421cf","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Bug fixes","Languages":[{"Code":"en","Title":"Bug fixes","Slug":"bug-fixes-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"fbee3cb8-7eb9-4c18-a3ce-621fa5e17610","Path":"from-glyph-window-to-font-window-1.md","Order":2},{"Id":"f82f590b-1b96-47c8-ada6-7feda581940b","Path":"sidebar-virtual-tags-and-expressions.md","Order":4},{"Id":"660daf94-7db6-4932-8c74-4080032845c2","Path":"keyboard-zooming-1.md","Order":3},{"Id":"425dce60-8c8d-4c8a-b460-3db7da9a3f8b","Path":"font-window-deleting-glyphs.md","Order":1}],"Id":"3ffec0a9-0c91-4ab7-9a20-0b3a75990c51","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Font window","Languages":[{"Code":"en","Title":"Font window","Slug":"font-window-5","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"62668bb4-2a4a-4429-b288-93f5387ec1bf","Path":"autohinting-glyphs-with-overlaps-1.md","Order":2},{"Id":"793b9f21-9b98-4057-9499-c9db200521de","Path":"problematic-zones-1.md","Order":6},{"Id":"0366c178-c7f8-4cba-a4e5-68efd5e4f381","Path":"anchors-anchor-cloud-only-for-selected.md","Order":1},{"Id":"8e185bb5-05f5-419f-a03d-0edb177abd70","Path":"guides-anchors-pins-snapping-1.md","Order":4},{"Id":"2a79c87d-f783-4c36-b311-c9e346c958d5","Path":"converting-thick-guides-to-zones-or-hints.md","Order":3},{"Id":"074d2d77-cfc3-4ea8-bafa-7c762c10acc1","Path":"measurement-markers-1.md","Order":5}],"Id":"d9520687-0b55-45ee-b056-65518a93913a","Path":"guides-hints-anchors-and-zones.md","Order":6,"CategoryType":1,"Icon":null,"Title":"Guides, hints, anchors and zones","Languages":[{"Code":"en","Title":"Guides, hints, anchors and zones","Slug":"guides-hints-anchors-and-zones","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"24e16915-56c6-45fc-8506-150da807a8ef","Path":"glyph-window-12.md","Order":6},{"Id":"53a233a9-faed-4f13-abb5-838c8cd568a5","Path":"metrics-and-kerning-walking-in-the-glyph-window-1.md","Order":10},{"Id":"97cbefb8-6ca5-4c7e-8fb5-d63fb7a948e2","Path":"switching-masters-1.md","Order":11},{"Id":"deef0ace-0896-4e97-877a-2fb63b384a82","Path":"metrics-and-kerning-clean-view-1.md","Order":8},{"Id":"31b616e3-71b8-49e7-8fbf-27493845979c","Path":"gallery-panel-5.md","Order":3},{"Id":"46f7619e-696d-4ac1-aafd-f66e731622be","Path":"glyph-window-get-glyph-by-name-1.md","Order":4},{"Id":"33381488-c396-4dc6-869f-2feb606f5f0a","Path":"metrics-and-kerning-smart-navigation-with-the-updown-keys-1.md","Order":9},{"Id":"9a313b50-9925-45d5-8484-c80c3c89f8b9","Path":"glyph-window-pairs-and-phrases-1.md","Order":5},{"Id":"169813cf-f604-4044-abe6-7303b41c6663","Path":"anchors-in-auto-layers-and-composites-1.md","Order":2},{"Id":"a4738944-d5fb-4fe1-a583-2aa13d7f40ac","Path":"images.md","Order":7},{"Id":"96795e98-0df3-4968-92e9-b932a95c30f4","Path":"activating-components-in-glyph-window-1.md","Order":1}],"Id":"8ad12513-dc63-4fee-a490-1976ed4cc641","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"Elements, components and auto layers","Languages":[{"Code":"en","Title":"Elements, components and auto layers","Slug":"elements-components-and-auto-layers","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"a3bc1314-71c0-4df4-8398-b802598c1c25","Path":"no-style-linking-1.md","Order":1}],"Id":"d0700c4b-cce0-4319-a221-cb0b6beb57be","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"Font info","Languages":[{"Code":"en","Title":"Font info","Slug":"font-info-4","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"6b60fe63-0889-436f-bf8e-5d4a957ba25f","Path":"kerning-class-cloud-no-longer-shown-behind-exceptions-1.md","Order":1},{"Id":"803c8293-525d-4509-b5a6-00d3f12334b2","Path":"kerning-get-existing-pairs-1.md","Order":4},{"Id":"4ea70a31-bbf1-4fee-af92-664d3ffd8f97","Path":"kerning-get-glyphs-1.md","Order":5},{"Id":"c3211447-4e06-4a65-8520-44738d601a74","Path":"kerning-get-class-pairs-or-exceptions-1.md","Order":3},{"Id":"894dda7c-843f-4738-9682-189984dd1d22","Path":"kerning-show-all-combinations-1.md","Order":6},{"Id":"9f2e6265-3ff9-4b90-aea4-c58a13da3c43","Path":"kerning-editing-kerning-1.md","Order":2}],"Id":"87c73c97-0bd0-488d-a9d3-b5ebec366606","Path":null,"Order":8,"CategoryType":0,"Icon":null,"Title":"Kerning","Languages":[{"Code":"en","Title":"Kerning","Slug":"kerning-4","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"4317bcf9-1d12-410d-8c71-2a62d8323067","Path":"tags-in-classes-panel-1.md","Order":6},{"Id":"15c17019-7600-4aec-811b-181bf0131b8f","Path":"virtual-tags-4.md","Order":7},{"Id":"1219b316-e931-4787-84b6-9fdc1413ae16","Path":"adding-glyphs-into-a-kerning-class-1.md","Order":1},{"Id":"f2981396-9648-4b15-80ba-9095817cd548","Path":"stdw-vs-3.md","Order":5},{"Id":"5ed0a75d-4a38-4c13-ac2f-5be6376023b7","Path":"classes-and-tags-2.md","Order":2},{"Id":"176a777a-ab2e-4a3d-a4a5-bd39be4faaeb","Path":"ghost-hints-2.md","Order":3},{"Id":"ca679f71-6dca-450c-a4f1-2039a17ed707","Path":"import-and-export-classes-1.md","Order":4},{"Id":"3f592acf-7f3f-42e4-a9d4-136c52187a14","Path":"wildcards-in-tags-search-1.md","Order":8}],"Id":"dc702bea-d47f-4126-a5bb-0e7bc16d1b83","Path":null,"Order":19,"CategoryType":0,"Icon":null,"Title":"Hinting","Languages":[{"Code":"en","Title":"Hinting","Slug":"hinting-2","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"ca55ce6d-0400-4b9a-b400-ce353fc8ffb7","Path":"decompose-1.md","Order":3},{"Id":"619e890a-6356-4c6c-82f3-3eb487ac47d7","Path":"italic-metrics-1.md","Order":4},{"Id":"fa949ff5-e453-4a2e-a86f-c7a7a157506d","Path":"linked-metrics-2.md","Order":6},{"Id":"a51e998a-90b3-4d15-bb60-8c52917bf898","Path":"auto-layers-5.md","Order":2},{"Id":"4ba4c3c3-cabe-4859-a30a-68d163b6a016","Path":"auto-layer-and-composite-glyph-cell-icons-1.md","Order":1},{"Id":"ab6bfac8-9d0f-4db7-bd50-cc1bec8c9df6","Path":"to-references-1.md","Order":7},{"Id":"aea9d2a7-ad5a-4782-bc86-8111805a57d5","Path":"keep-source-glyphs-1.md","Order":5}],"Id":"3eae0ce1-861a-4ac5-b24d-3f0b7496564c","Path":null,"Order":9,"CategoryType":0,"Icon":null,"Title":"Metrics","Languages":[{"Code":"en","Title":"Metrics","Slug":"metrics-2","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"e0984e29-31c0-4b5f-a28b-0b722dc202ee","Path":"exporting-masters-designspaceufo-opentype-variations-1.md","Order":1},{"Id":"c21cdf9d-65da-4ff5-8edd-398efe612a1c","Path":"quick-help-5.md","Order":5},{"Id":"bd56a68d-cd0b-4329-8e4f-9ced29d2fbdd","Path":"opening-and-exporting-1.md","Order":4},{"Id":"46a874ce-a321-40a2-91f8-e92ebe7a6c92","Path":"exporting-opentype-ps-1.md","Order":2},{"Id":"717e90ec-9f3d-46e6-b3dc-221d79c688ad","Path":"exporting-opentype-variations-tt-1.md","Order":3}],"Id":"56b28953-f85d-4fe1-94c8-720128e42520","Path":null,"Order":11,"CategoryType":0,"Icon":null,"Title":"Opening, saving and exporting fonts","Languages":[{"Code":"en","Title":"Opening, saving and exporting fonts","Slug":"opening-saving-and-exporting-fonts","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"3d07685a-0b2e-428f-8375-d21fde779960","Path":"automatic-master-location-on-the-width-and-weight-axes-1.md","Order":1},{"Id":"b7c8652c-2ed3-48c2-8950-e36faebe1216","Path":"font-info-adding-font-masters-improved-1.md","Order":2},{"Id":"1ec04629-e91a-4b35-9f0e-b28100115b6a","Path":"font-info-parameters-2.md","Order":4},{"Id":"68c4490e-1a77-488e-a3f8-d5fba6fc15f8","Path":"hinting-6.md","Order":5},{"Id":"a6837908-6689-427e-aab7-200d48e07f61","Path":"font-info-guide-expressions-1.md","Order":3},{"Id":"562b4025-1f10-437f-9049-79f2c839b429","Path":"user-interface-enhancements.md","Order":6}],"Id":"86a16045-c03b-49b3-84a8-c1d9781664e4","Path":null,"Order":25,"CategoryType":0,"Icon":null,"Title":"Font Info and Variation","Languages":[{"Code":"en","Title":"Font Info and Variation","Slug":"font-info-and-variation","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"f0ea6bf9-6b77-40c8-bb26-bdf536e4b608","Path":"new-action-add-nodes.md","Order":9},{"Id":"7aa5dd3f-d421-40b9-8a09-49b1888a2ffa","Path":"esc-key-in-the-glyph-window-1.md","Order":4},{"Id":"9c6cbb01-4a64-4339-94af-a696dc1db976","Path":"move-nodes-or-handles-with-cursor-keys-after-dragging-1.md","Order":8},{"Id":"4ebe1002-1b56-4019-b8a0-5f44eba9294f","Path":"deselecting-nodes-and-handles-1.md","Order":1},{"Id":"75b89f37-dba7-4011-8eb9-82b1ae7aa68e","Path":"scale-and-flip-selections-with-selection-frame-1.md","Order":11},{"Id":"1938ff88-9922-4568-bef8-2ea7a4be6acb","Path":"tunni-lines-4.md","Order":13},{"Id":"9d729ac9-21ec-43ea-b83c-5cd6f517b89a","Path":"make-slanted-glyph-guides-1.md","Order":7},{"Id":"7978e56b-70bc-4ca9-8ede-7b3277cafce1","Path":"improved-set-start-point.md","Order":6},{"Id":"b95bcfb7-3259-45ac-aa95-adb5553deafc","Path":"performance.md","Order":10},{"Id":"3fa5fe29-bb3f-4950-833d-951cac9e6b88","Path":"pantograph-nonnode-editing-1.md","Order":14},{"Id":"2c9b48d9-9d5b-48b6-9a3d-acb94b2065ee","Path":"improved-action-set-contour-direction-1.md","Order":5},{"Id":"407c3523-b647-4465-8594-469e114bf6aa","Path":"drawing-and-glyph-editing-4.md","Order":2},{"Id":"d113221a-f2fd-49c1-a659-5bcdd1f42e50","Path":"drawing-ellipses-and-rectangles-1.md","Order":3},{"Id":"b79a3c02-b3dd-4a8f-a271-75e8d751bb4c","Path":"smart-corners-2.md","Order":12}],"Id":"109cfe6f-0678-42ee-9175-91a6a8b97df8","Path":"new-featuresenhancements.md","Order":21,"CategoryType":1,"Icon":null,"Title":"New featuresEnhancements","Languages":[{"Code":"en","Title":"New featuresEnhancements","Slug":"new-featuresenhancements","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"238ccebe-b5ec-4224-872f-41ca8c3d33e6","Path":"classes-and-tags-in-feature-definitions-1.md","Order":2},{"Id":"267ae198-6716-48e3-90b0-0c827a5b184d","Path":"opening-glyph-tabswindows-from-a-font-window.md","Order":8},{"Id":"7935aed7-23f2-410d-a0a3-79844b323a26","Path":"font-window-filters-4.md","Order":5},{"Id":"fdc9323d-d951-40d0-b740-4fb749c63639","Path":"import-features-1.md","Order":7},{"Id":"c29cc57f-fcc5-4ae8-bb24-4a4ce1a39208","Path":"font-window-cells-1.md","Order":4},{"Id":"fd332fc6-20f7-4886-8b58-9ef3a562a5ae","Path":"features-panel-6.md","Order":3},{"Id":"fa5ae30c-b2d5-4b9d-b3db-eb4cd135f010","Path":"applying-features-in-glyph-window-and-preview-panel-1.md","Order":1},{"Id":"83cc882b-e942-4b05-892c-deafd249f56e","Path":"font-window-10.md","Order":6}],"Id":"e6c934ad-3307-47b4-b6f5-4156cd15f471","Path":null,"Order":15,"CategoryType":0,"Icon":null,"Title":"Features","Languages":[{"Code":"en","Title":"Features","Slug":"features-3","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"9ae71849-0b66-46f2-986b-be7d8ef203e7","Path":"measurements-panel-3.md","Order":5},{"Id":"d985be6e-40d1-4b9c-b531-98ccc0548ea7","Path":"anchors-and-pins-panel-3.md","Order":2},{"Id":"f9843b30-678f-4fbb-a367-0307e71f6a27","Path":"windows-and-tabs-configuration-1.md","Order":9},{"Id":"a632c98a-814b-4f3b-8ac1-6acf9fca2c9a","Path":"output-panel-3.md","Order":6},{"Id":"45f30491-3b22-4d78-a044-f9c130705d00","Path":"toolbar-and-dropdown-text-buttons-are-easier-to-click.md","Order":8},{"Id":"e5e8fab9-ffd2-4d2b-9de6-a07eee3ecbd8","Path":"sketchboard-text-boxes.md","Order":7},{"Id":"21cc2c22-7e4e-4a77-a349-9bd3f56e5bea","Path":"cell-sizes-in-add-glyphs-dialog.md","Order":3},{"Id":"de658350-5826-4841-aa5d-7131c23ca049","Path":"keyboard-shortcuts-8.md","Order":4},{"Id":"c0c10a67-b340-4580-abeb-d21650194a59","Path":"easier-to-click-buttons.md","Order":1}],"Id":"e8f9ae89-bd8f-4f60-8e70-bdd7118a4e22","Path":null,"Order":12,"CategoryType":0,"Icon":null,"Title":"User interface","Languages":[{"Code":"en","Title":"User interface","Slug":"user-interface-4","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"85a9872d-f75d-4cc7-8cc5-9c23f3b4dc93","Path":"export-font-as-enable-and-disable-instances-1.md","Order":1},{"Id":"f114fd9c-35cd-4f90-a6ea-4349fc823155","Path":"opentype-symbol-fonts-1.md","Order":4},{"Id":"65d84c98-c95e-4215-9679-4eea82778067","Path":"tables-panel-define-custom-opentype-tables-1.md","Order":6},{"Id":"9df9a355-785e-4d15-ae3e-87e558ca7e10","Path":"glyph-names-9.md","Order":3},{"Id":"1b76ffc3-3f34-40bf-b9ab-558d88ff23ab","Path":"export-font-as-export-single-masters-or-instances-as-vfcvfj-1.md","Order":2},{"Id":"fffd9c8f-0253-4bb6-abd5-1c9a93040c83","Path":"special-glyphs-null-and-cr-1.md","Order":5}],"Id":"d19ee4d8-c448-4d1d-8155-4e46014eb0b1","Path":null,"Order":30,"CategoryType":0,"Icon":null,"Title":"Support and exporting of OpenType fonts","Languages":[{"Code":"en","Title":"Support and exporting of OpenType fonts","Slug":"support-and-exporting-of-opentype-fonts-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"26f46c19-e33f-4398-97a9-7b08ce403b8d","Path":"classes-panel-4.md","Order":1},{"Id":"11bc3bc6-7f8d-4381-adab-4d7b22ec10cb","Path":"glyph-metrics-without-and-with-measurement-line-1.md","Order":2},{"Id":"4411953e-7e5a-4785-9720-ea8d2e9172b4","Path":"metrics-panel-3.md","Order":3}],"Id":"363d38d1-ded8-416d-b9a9-db3ce88aa91b","Path":null,"Order":28,"CategoryType":0,"Icon":null,"Title":"Metrics and Classes","Languages":[{"Code":"en","Title":"Metrics and Classes","Slug":"metrics-and-classes","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"b29feb91-4b9e-4aa3-aa10-377a8a9ca3f0","Path":"demo-mode-3.md","Order":1},{"Id":"5b107058-25bf-439a-9311-2aef4cd4b5e9","Path":"updated-fontlab-eula.md","Order":2}],"Id":"eea534f7-43f1-40d8-9b5c-51b0ae05e80e","Path":null,"Order":10,"CategoryType":0,"Icon":null,"Title":"New features and enhancements","Languages":[{"Code":"en","Title":"New features and enhancements","Slug":"new-features-and-enhancements","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"5dde7b7c-d037-42a9-8079-d79d4c328d54","Path":"print-from-a-font-window-1.md","Order":1},{"Id":"49ec7160-51d7-44cf-9878-9071c09dc8ea","Path":"print-from-the-font-window-or-the-glyph-window.md","Order":3},{"Id":"6bb1924c-a179-4cce-838e-a1fff44f0e4c","Path":"print-from-a-glyph-window-1.md","Order":2}],"Id":"d7925bb8-353b-4b70-a7d0-e7e11822c59b","Path":"new-features-enhancements.md","Order":29,"CategoryType":1,"Icon":null,"Title":"New Features Enhancements","Languages":[{"Code":"en","Title":"New Features Enhancements","Slug":"new-features-enhancements","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"2428ea98-06db-46e0-8ece-7dfb6dc891ff","Path":"loop-corners-with-scissors-tool-1.md","Order":5},{"Id":"c86ef6b1-601f-4da1-a0e6-6ef52588536a","Path":"aligning-of-nodes-handles-and-contours-1.md","Order":1},{"Id":"29564c6f-d34e-4309-ae0e-a652c24ad16d","Path":"altdragging-a-node-1.md","Order":2},{"Id":"c9a6babb-c62c-4c27-990a-7230f771fc1d","Path":"coordinates-and-measurements-1.md","Order":3},{"Id":"7373bdf5-944a-4fb2-a15d-66f26f5067bc","Path":"free-transform-2.md","Order":4},{"Id":"1930eb26-db5f-4b5f-a8c5-f2863cfa9df0","Path":"marquee-selection-of-nodes-vs.md","Order":6},{"Id":"ea3f4297-ae6e-495f-af86-50b44f7955aa","Path":"paste-mask-1.md","Order":7},{"Id":"8b612aab-4126-4403-83ef-5e6e9655d3db","Path":"paste-special-element-references-linked-metrics-tags-1.md","Order":8},{"Id":"24184f39-a14d-426c-8c6c-9065241f49fd","Path":"stroke-and-power-brush-1.md","Order":9}],"Id":"5c8145a3-5dd0-46c5-a4ed-b751c1926f6e","Path":"glyph-design-2.md","Order":27,"CategoryType":1,"Icon":null,"Title":"Glyph Design","Languages":[{"Code":"en","Title":"Glyph Design","Slug":"glyph-design-2","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"5833afba-5909-455e-b6a4-5bf5558800df","Path":"navigate-in-glyph-window-with-missing-glyph-placeholders.md","Order":2},{"Id":"ca2f27a7-6f58-4a99-91f6-d6b069313751","Path":"pairs-phrases-panel-3.md","Order":3},{"Id":"afa46dfc-5ee3-405e-a703-a6239679293d","Path":"unicode-glyph-specifiers-1.md","Order":4},{"Id":"3eaf0287-fb1d-459c-b5f4-1100c90ea9cf","Path":"echo-text-synchronize-text-between-glyph-windows.md","Order":1}],"Id":"ded9522b-2996-411a-8d7d-5bd90ccdadad","Path":"text-improvements.md","Order":31,"CategoryType":1,"Icon":null,"Title":"Text Improvements","Languages":[{"Code":"en","Title":"Text Improvements","Slug":"text-improvements","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"e9d24c11-ef33-4f8d-ad16-b5172b8e7aa3","Path":"classes-tags-and-features.md","Order":2},{"Id":"135cb988-64f0-440c-957e-037242877d5d","Path":"drawing-and-editing-glyphs-1.md","Order":3},{"Id":"82122a7c-84b2-458f-a45e-1de020be7646","Path":"elements-7.md","Order":4},{"Id":"998bb299-182d-4467-bf13-654cf905ff71","Path":"metrics-auto-layers-and-expressions.md","Order":6},{"Id":"278946d7-3cd9-47f0-9f01-58a08b81e79f","Path":"bug-fixes-8.md","Order":1},{"Id":"5512e311-6b5d-4905-9bcc-64961ad02ddb","Path":"performance-and-updates.md","Order":7},{"Id":"19b3ecae-2af1-431d-ba16-34c64c98349f","Path":"font-formats-2.md","Order":5}],"Id":"4a2f1c29-72f4-4011-b984-bed831cb9f5a","Path":"highlights-1.md","Order":18,"CategoryType":1,"Icon":null,"Title":"Highlights","Languages":[{"Code":"en","Title":"Highlights","Slug":"highlights-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"864a8726-c59b-4d30-a2f2-0a2ae31266e1","Path":"control-bars-view-settings-1.md","Order":1},{"Id":"b63bc700-fcf5-4bac-9b7a-a90fadc74492","Path":"windows-and-window-tabs-1.md","Order":3},{"Id":"5dcd98fd-788e-494e-9caa-e62c52d92feb","Path":"save-and-restore-windows-tabs-panels-and-font-filters-1.md","Order":2}],"Id":"6e99fbff-aa5d-418f-94d4-8a7c22d2ad21","Path":"windows-and-panels-management.md","Order":32,"CategoryType":1,"Icon":null,"Title":"Windows and Panels management","Languages":[{"Code":"en","Title":"Windows and Panels management","Slug":"windows-and-panels-management","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"b638cb5c-1c12-4810-994c-9e4c47aaf912","Path":"class-glyphs-behind-exception-glyphs-1.md","Order":1},{"Id":"ffe64ed9-599e-40a2-884b-b97b3c88cc9b","Path":"editing-kerning-exceptions-1.md","Order":3},{"Id":"089d18ff-ef59-471d-9d48-6d6e5026fd93","Path":"class-kerning-with-exceptions-1.md","Order":2}],"Id":"b71d658e-97fe-4c10-83be-6cbf0ca3e4a3","Path":null,"Order":22,"CategoryType":0,"Icon":null,"Title":"Metrics and Kerning","Languages":[{"Code":"en","Title":"Metrics and Kerning","Slug":"metrics-and-kerning","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"06e5b67a-d6b1-41c6-855c-195692d72227","Path":"strong-ligature-attachment-in-legacy-recipe-syntax-1.md","Order":8},{"Id":"9e18db29-09a6-4728-9600-d6a3b781fa49","Path":"location-expressions-2.md","Order":7},{"Id":"d36a3d20-a1e6-45cf-a3b3-aa85bedbc82e","Path":"live-update-of-metrics-and-auto-layers-1.md","Order":6},{"Id":"1f99b7c3-4ab9-4bb0-b50e-7062925f89b6","Path":"anchors-when-decomposing-composite-glyphs-1.md","Order":1},{"Id":"2f9bcc35-31b8-4932-a2f1-ce131c0a1339","Path":"calculation-of-zones-hints-and-guides-thickness-1.md","Order":4},{"Id":"f7cd0790-c766-46ff-a7ac-cb908b2062b8","Path":"auto-layer-contents-1.md","Order":2},{"Id":"b2dc4050-9773-428e-a196-d74e0b129205","Path":"auto-layer-for-all-layers-1.md","Order":3},{"Id":"42d03c91-ad14-49d6-b309-cfea19d0840e","Path":"calculations-in-numeric-text-fields-1.md","Order":5}],"Id":"2a9323e4-43f5-4830-98db-ddcb4b89fcd8","Path":null,"Order":20,"CategoryType":0,"Icon":null,"Title":"Linked metrics and auto layers","Languages":[{"Code":"en","Title":"Linked metrics and auto layers","Slug":"linked-metrics-and-auto-layers","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"b489d6ee-ab90-413a-9ce1-ae0e87909811","Path":"other-improvements-3.md","Order":5},{"Id":"67e1bf6a-7361-4cd5-9650-be179d9d2312","Path":"custom-glyph-metrics-in-auto-layers-1.md","Order":3},{"Id":"724491e9-5a50-4020-8fec-eb8cbc49e1ff","Path":"auto-layers-showing-builtin-recipes-1.md","Order":2},{"Id":"9165dedd-8c10-44df-9483-056d2963689c","Path":"auto-layer-column-in-font-window-list-view-1.md","Order":1},{"Id":"9f92ce62-21e6-4c18-a2ff-fa3b14a94252","Path":"generate-glyphs-4.md","Order":4}],"Id":"9c0a9a50-019f-42fc-9c54-5331c6e1a86b","Path":null,"Order":24,"CategoryType":0,"Icon":null,"Title":"Components, Generate Glyphs and auto layers","Languages":[{"Code":"en","Title":"Components, Generate Glyphs and auto layers","Slug":"components-generate-glyphs-and-auto-layers","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"2f65be3d-a8df-4fa0-a760-f0d2e34cae84","Path":"editing-across-exportable-and-service-layers-1.md","Order":3},{"Id":"c8f692a2-3732-4c2a-906d-08bb60c45697","Path":"locked-metrics-1.md","Order":6},{"Id":"e944c78c-3f6e-4894-8fbc-1e475ddcc1e9","Path":"metrics-and-kerning-7.md","Order":7},{"Id":"73e40ea8-1eea-4388-8ce2-fb4f5f4f9189","Path":"adding-glyphs-1.md","Order":1},{"Id":"7b190bee-2ea2-400f-90f2-195ad3410b07","Path":"append-glyphs-now-uses-references-1.md","Order":2},{"Id":"e7ec5764-e54d-413e-b548-6156732990b5","Path":"interpolation-of-named-elements-1.md","Order":5},{"Id":"0e710dfd-f2ce-4634-95b1-05c5bf2fe196","Path":"metrics-table-4.md","Order":8},{"Id":"582962e3-5f22-43de-85e2-9128f8dcf9c4","Path":"filling-layers-with-the-content-of-other-fonts-or-masters-1.md","Order":4},{"Id":"de28eda7-52e4-4f1b-8e81-a1068b0b92de","Path":"open-glyphs-for-editing-more-easily-1.md","Order":9},{"Id":"fe7af098-e171-4835-ad58-562b5322ed4c","Path":"rightclick-to-remove-kerning-pair-1.md","Order":10}],"Id":"38738b79-8f43-4e09-bf7f-ffe1fceb15e0","Path":null,"Order":13,"CategoryType":0,"Icon":null,"Title":"Glyphs, layers, and masters","Languages":[{"Code":"en","Title":"Glyphs, layers, and masters","Slug":"glyphs-layers-and-masters","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"ed438b10-f015-43f9-8fd7-36e8077b765f","Path":"drawing-and-glyph-editing-3.md","Order":1},{"Id":"2526887d-a42a-45ed-bfeb-06ceac3dec21","Path":"move-nodes-and-handles-along-the-vertical-italic-axis-1.md","Order":2}],"Id":"ce46da82-479a-4d8e-adcb-7de6a2feacc2","Path":null,"Order":16,"CategoryType":0,"Icon":null,"Title":"Glyph Drawing","Languages":[{"Code":"en","Title":"Glyph Drawing","Slug":"glyph-drawing-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"a4c287cd-a6e4-4934-a22c-85b4d22be173","Path":"exporting-opentypecbdt-color-fonts-1.md","Order":3},{"Id":"a7862d35-f56c-4538-a8ae-9739011616eb","Path":"easier-handling-of-export-profiles-1.md","Order":1},{"Id":"5af2ad70-ea44-4910-bd02-5ee00f061433","Path":"improved-backups-when-saving-files.md","Order":5},{"Id":"3a4f5ae8-66c2-494e-960d-26427b981f0e","Path":"opening-and-exporting-ufo-1.md","Order":7},{"Id":"de111ab4-0574-4f08-b7cb-b07eff03fd5e","Path":"exporting-open-contours-as-singlestroke-fonts-for-engravers-and-plotters-1.md","Order":2},{"Id":"fe574ec0-b7a9-40c8-9834-a9c491aeabd0","Path":"install-stable-or-beta-versions-of-fontlab-1.md","Order":6},{"Id":"42cf32d5-e2f4-4334-9679-dc94c39817ec","Path":"hyphens-in-glyph-names-1.md","Order":4}],"Id":"fea305a9-33cd-430c-9df2-be85ec1db3b3","Path":null,"Order":17,"CategoryType":0,"Icon":null,"Title":"Opening, saving, and exporting fonts","Languages":[{"Code":"en","Title":"Opening, saving, and exporting fonts","Slug":"opening-saving-and-exporting-fonts-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"1631bd24-63fd-42c1-94d9-6342e1b92a77","Path":"index-filter-in-font-window.md","Order":3},{"Id":"ef0deea5-f2f6-4f04-a2c7-6cea13867922","Path":"glyph-name-synonyms-in-font-window-quick-preview-1.md","Order":1},{"Id":"3348c428-b025-4ea0-8c28-21d4bfa5769f","Path":"glyph-panel-with-multiple-selected-glyphs-1.md","Order":2},{"Id":"2d6fb177-f6ae-46cb-b90c-7528d69fa74f","Path":"master-switching-on-empty-glyph-cells-1.md","Order":4}],"Id":"3bae5b63-3f37-4580-89ed-18033c763a2d","Path":null,"Order":26,"CategoryType":0,"Icon":null,"Title":"Font window and Glyph panel","Languages":[{"Code":"en","Title":"Font window and Glyph panel","Slug":"font-window-and-glyph-panel-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"4d9dad89-202a-4dad-8680-1e0d2b506c14","Path":"active-elements-when-you-open-a-glyph-1.md","Order":1},{"Id":"4561c862-018e-42a6-9c36-4341e503f8f2","Path":"free-transform-across-elements-and-layers-1.md","Order":3},{"Id":"55eae481-4085-4b89-ad20-cb200a4f5461","Path":"context-menu-1.md","Order":2},{"Id":"018b1532-0c46-411d-9e3c-d3aadf54ef81","Path":"selection-remembered-when-changing-glyphs-or-layers.md","Order":4}],"Id":"4b803ca7-c6fe-4e63-ae81-6952a68d6657","Path":null,"Order":23,"CategoryType":0,"Icon":null,"Title":"Glyph window","Languages":[{"Code":"en","Title":"Glyph window","Slug":"glyph-window-5","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"b63b6ec2-fc0c-4b0a-87bb-92b04c91a832","Path":"metrics-when-inserting-a-component-or-reference-1.md","Order":6},{"Id":"692d2a1f-deda-47c3-809d-3c3e9128c55a","Path":"remove-or-reorder-elementscomponents-while-in-font-window-1.md","Order":7},{"Id":"95d44476-a350-42ce-b67e-a5e8e7c053dc","Path":"components-coordinates-and-index-1.md","Order":3},{"Id":"f5025bad-3a8b-47fd-a084-a946ff59b6e8","Path":"better-rendering-of-selected-elements.md","Order":2},{"Id":"4471e1f7-d700-43d1-b7a6-f3d3336b722c","Path":"elementscomponents-in-scoreboard-1.md","Order":4},{"Id":"b3ab0b7f-41e5-47a2-8114-2adb5fb46a80","Path":"gallery-panel-filter-and-remove-elements-1.md","Order":5},{"Id":"d590838d-b4fc-4466-85ed-2ad311392514","Path":"add-new-elementscomponents-to-a-group-1.md","Order":1}],"Id":"dc9028c1-a6df-46d6-b4f7-c58bc85fc6d6","Path":null,"Order":14,"CategoryType":0,"Icon":null,"Title":"Elements and components","Languages":[{"Code":"en","Title":"Elements and components","Slug":"elements-and-components-1","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"10c716ff-9954-4591-9377-a741f87f2358","Path":null,"Order":17,"CategoryType":0,"Icon":null,"Title":"Release Notes","Languages":[{"Code":"en","Title":"Release Notes","Slug":"release-notes-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"1d269028-1e8d-45d2-ad28-1363961d2a6a","Path":"web-fonts-1.md","Order":1},{"Id":"85b06e59-aa0c-4eab-a291-c1c296d71caa","Path":"web-fonts1.md","Order":2},{"Id":"55a1f9ed-a2a1-436d-8686-a096132bf9b3","Path":"web-open-font-format-woff-and-woff2.md","Order":3}],"Id":"b83124ee-b6dd-4d50-a998-37659fa08bbf","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Web Fonts","Languages":[{"Code":"en","Title":"Web Fonts","Slug":"web-fonts","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"8178096e-665a-48f5-8ad3-acf35c63fe8b","Path":"color-font-formats-1.md","Order":3},{"Id":"d4f4cb3a-d8c4-4758-8cac-1e8897ab3112","Path":"color-font-formats1.md","Order":2},{"Id":"629dcc3d-56fc-4b49-848f-d8d5379f56a8","Path":"bitmap-fonts-3.md","Order":1},{"Id":"dc375666-770b-4c76-88ed-b6c373aa7da9","Path":"eot.md","Order":4},{"Id":"f3f8e6c4-1c20-4d47-80d1-168e817e1217","Path":"opentype-svg.md","Order":5},{"Id":"1f6044aa-ee9c-4557-ae6f-f195b8ae0e6a","Path":"photofont-phf.md","Order":6},{"Id":"6a49c579-0640-460d-ac9b-53d3f066d99b","Path":"woff-and-woff2.md","Order":7}],"Id":"d2475691-04d1-488c-b25c-7431545f7948","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"Color Fonts","Languages":[{"Code":"en","Title":"Color Fonts","Slug":"color-fonts","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"9e1d506b-f695-43f1-982c-f2115db98f6c","Path":"truetype.md","Order":2},{"Id":"7db798a1-9f7c-4c72-af0a-7ebcbbe24ad8","Path":"pfapfb.md","Order":1}],"Id":"2696838e-247a-432a-883d-9b5650e640cc","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"TrueType and Type1","Languages":[{"Code":"en","Title":"TrueType and Type1","Slug":"truetype-and-type1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"ad1290ba-57ff-49e0-8137-e3c05f7b28bb","Path":"table-of-formats.md","Order":2},{"Id":"534911d6-ec6c-4bb4-ab09-fe0a1299cef3","Path":"final-font-formats1.md","Order":1}],"Id":"d28ed75b-c0e1-4b08-8d68-037d05f7ea82","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Final Font Formats","Languages":[{"Code":"en","Title":"Final Font Formats","Slug":"final-font-formats-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"9f7fdcc6-3408-4912-b7f4-f16ad0495aaf","Path":"opentype-overview.md","Order":3},{"Id":"403fd036-462b-4876-9bc9-2e86ed083a70","Path":"opentype-cbdt-format.md","Order":2},{"Id":"a114e47a-6c89-415c-84a6-1444410d2f86","Path":"opentype-tt-ttf.md","Order":4},{"Id":"d64c7fe2-1ae4-4ad0-92cb-d6e7da159d95","Path":"opentype-cff-otf.md","Order":1}],"Id":"9ca7ee44-2543-4519-b5c8-9e398b721f83","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"OpenType","Languages":[{"Code":"en","Title":"OpenType","Slug":"opentype-1","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"2f2d8552-1a52-4318-9f92-888236e4498f","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Final Font Formats","Languages":[{"Code":"en","Title":"Final Font Formats","Slug":"final-font-formats","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"c42a8734-df2c-4ab0-ad48-7a564c00d8d5","Path":"cjk-fonts.md","Order":1},{"Id":"2b172655-d2a2-42cf-b499-e7cbb4053900","Path":"font-dimensions-1.md","Order":2},{"Id":"efe856bb-7c7a-4f5b-99e4-3149bf777941","Path":"obligatory-glyphs.md","Order":3}],"Id":"40bebb91-7d36-4283-be58-b58beef1e562","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"Font","Languages":[{"Code":"en","Title":"Font","Slug":"font","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"f862f840-73ec-4736-9e00-299aa29b601e","Path":"advance-width-2.md","Order":1},{"Id":"274c51d2-dccb-44f2-a004-e041f22d38ca","Path":"sidebearings-4.md","Order":7},{"Id":"2343493f-7b75-4dfd-a683-ab60d0fc550f","Path":"glyph-metrics-5.md","Order":4},{"Id":"927c78e9-5f8c-49ce-8b2c-024989373627","Path":"vertical-metrics.md","Order":8},{"Id":"9be40bde-9f08-48de-964b-a60c34be3c42","Path":"kerning-9.md","Order":5},{"Id":"f746ed31-2774-416b-9520-1acb111410a6","Path":"font-dimensions-2.md","Order":3},{"Id":"7110a771-e6a0-411f-aeb3-43b6e3ce1b43","Path":"nonspacing-lgyph.md","Order":6},{"Id":"4b4d8fa0-1ca5-4a92-bc99-0edba365dce8","Path":"family-dimensions-1.md","Order":2}],"Id":"aaad605e-60ce-429d-b179-959f4c1855a0","Path":null,"Order":10,"CategoryType":0,"Icon":null,"Title":"Metrics","Languages":[{"Code":"en","Title":"Metrics","Slug":"metrics","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"89c60e2d-bacb-44b2-b6d6-b5f912367d4b","Path":"reset-font-info-page-data.md","Order":6},{"Id":"aa63e77c-ed1e-4737-82ab-7914fadd240e","Path":"panose-identifier.md","Order":5},{"Id":"8f0147bf-bf86-4f47-b441-f928cca3af8e","Path":"font-info-panel-2.md","Order":1},{"Id":"ffa449c0-1209-4932-922d-b2689374e74e","Path":"other-values-page-1.md","Order":2},{"Id":"ad9a96bd-81bf-4b23-81ee-4f4118c31ca3","Path":"panose-and-monospaced-fonts.md","Order":3},{"Id":"26b42af8-3f87-485f-be32-4d8051cc915b","Path":"panose-identifier1.md","Order":4}],"Id":"160a6ff2-2865-45fa-b2eb-2d88cc36fd92","Path":null,"Order":12,"CategoryType":0,"Icon":null,"Title":"PANOSE","Languages":[{"Code":"en","Title":"PANOSE","Slug":"panose","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"a403fdf9-fb55-45a9-912c-46ea1baed3fe","Path":"em-square.md","Order":1}],"Id":"b0ab76f2-b8c1-4ee4-a28b-e62a9e542b19","Path":"upm.md","Order":9,"CategoryType":1,"Icon":null,"Title":"UPM","Languages":[{"Code":"en","Title":"UPM","Slug":"upm","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"acfdfc5b-4308-4d5a-86e5-ab4312910cb6","Path":"glyphs-are-identified-in-several-different-ways.md","Order":1}],"Id":"9682edf1-3e62-429d-9c63-b320d50b1acc","Path":null,"Order":6,"CategoryType":0,"Icon":null,"Title":"Glyph","Languages":[{"Code":"en","Title":"Glyph","Slug":"glyph","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"764f6073-fd55-4f58-9a2d-29fc754365ce","Path":"rule.md","Order":14},{"Id":"a0f3931b-f9ef-452c-b068-8b6fc74a3135","Path":"feature-2.md","Order":17},{"Id":"745e50ef-50ea-4a92-bc95-ae1949bf1226","Path":"lookup-2.md","Order":11},{"Id":"55385592-665d-43c1-a500-1f3bed5e472d","Path":"overshoot.md","Order":18},{"Id":"0282034c-8c02-48f0-9918-0d4822eae59a","Path":"positioning-2.md","Order":13},{"Id":"c5ce8182-a86e-46db-b3cb-4655524784e8","Path":"font-licenses.md","Order":16},{"Id":"753b42f7-cb5a-4f36-8d85-cfc8c5ba87f6","Path":"serifs.md","Order":15},{"Id":"57d73f87-b5a8-4f9f-a2d9-645e7d82f828","Path":"unicode-1.md","Order":3},{"Id":"8e220366-26bc-4989-9955-80c4ce0dbec7","Path":"codepage.md","Order":1},{"Id":"9d86c947-80bf-4cd0-9a9e-d6d5afacb1fa","Path":"encoding.md","Order":2},{"Id":"70f16508-2e36-4da4-b953-db889311a5ca","Path":"script-2.md","Order":8},{"Id":"f731cc4f-06ed-4a5b-9c96-d0645cb844f5","Path":"hinting-5.md","Order":7},{"Id":"50dce260-562d-4bcf-b853-11ff9c20a22b","Path":"small-caps.md","Order":5}],"Id":"e297593e-f3ad-4e20-bc0f-acbffd627a89","Path":"type-design-definitions.md","Order":5,"CategoryType":1,"Icon":null,"Title":"Type Design definitions","Languages":[{"Code":"en","Title":"Type Design definitions","Slug":"type-design-definitions","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"238fe6f5-d3c3-4449-a8f5-1dd2ccf2212a","Path":"code-structure.md","Order":2},{"Id":"8b9cbd55-5d1f-4216-80bf-2616a89f7103","Path":"gdef-mark.md","Order":3},{"Id":"774d4f4b-2561-4bdc-9ae2-6a62da44fb56","Path":"gsub-tables.md","Order":5},{"Id":"f10fa3b0-0641-4e69-9ec1-1d96a5f1fccb","Path":"sfnt.md","Order":9},{"Id":"3a6c5ac7-02db-472e-bfb9-465087060709","Path":"scope.md","Order":1},{"Id":"b6aaa15a-82c4-4363-afe8-7abdaa7b97a9","Path":"fea-files.md","Order":7},{"Id":"c52d55d0-faf4-4859-9db4-e23a0eff2f13","Path":"ss01.md","Order":10},{"Id":"379e4559-2bbb-4a25-b36e-18f5aaa6ba09","Path":"modifier-symbol.md","Order":6},{"Id":"2e7cd09c-60c9-45de-81fb-17de744bcdfd","Path":"aalt.md","Order":8},{"Id":"05b70cb3-497c-4855-8dda-df73d2b7f895","Path":"gpos-tables.md","Order":4}],"Id":"f7783798-1f31-4d1a-9042-3af37a459891","Path":null,"Order":6,"CategoryType":0,"Icon":null,"Title":"OpenType Features","Languages":[{"Code":"en","Title":"OpenType Features","Slug":"opentype-features-4","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"41417381-77cd-4237-9d9b-3fa7d402c0be","Path":"other-file-formats-1.md","Order":2},{"Id":"2cc10da0-8ed6-418e-96a6-f561a462b919","Path":"font-metadata-formats.md","Order":4},{"Id":"f6188fd3-cc47-44d7-bdbd-08778586126b","Path":"fea.md","Order":3},{"Id":"ba4fb7f2-fc9a-41fc-b767-15178ab1bb41","Path":"artwork-file-formats.md","Order":1},{"Id":"7ec343f6-ad43-4ae7-911f-dd1bbc02c83a","Path":"fontlab-metrics-json-vfm.md","Order":5},{"Id":"32a1023a-8c8c-491b-bafb-bf81de171e37","Path":"encodings-2.md","Order":6},{"Id":"a1b1b611-8be5-4f14-8a58-540becfbeb98","Path":"pdf.md","Order":7}],"Id":"f275f327-2a20-4d76-8e36-d517172c5297","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Auxiliary file formats","Languages":[{"Code":"en","Title":"Auxiliary file formats","Slug":"auxiliary-file-formats","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"d2cc8107-104d-4a39-a71c-d6e094be81ec","Path":"ufo-packages.md","Order":1},{"Id":"924fa05b-4570-416f-aa1b-d1ea58a96089","Path":"unified-font-object-ufo.md","Order":2},{"Id":"2107e1d6-5a5a-463a-904f-865391c52417","Path":"xfo-format.md","Order":3}],"Id":"d70562f4-400e-4b8d-adb4-970de40a3a5c","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"UFO","Languages":[{"Code":"en","Title":"UFO","Slug":"ufo","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"cc29c077-0477-40e8-809e-800ab06abbd7","Path":"source-font-formats.md","Order":2},{"Id":"8e795e9d-8d1d-474a-8c1d-9e8c19f8c071","Path":"fontlab-format-vfc.md","Order":3},{"Id":"fe2bedd3-d286-420d-95eb-04157f232de2","Path":"fontlab-json-format-vfj.md","Order":1}],"Id":"9af924f2-a69a-4d83-9c6f-04114e811bd4","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"VFC and VFJ","Languages":[{"Code":"en","Title":"VFC and VFJ","Slug":"vfc-and-vfj","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"5828d74d-adf1-4573-b8e3-93747f40fa38","Path":"fontlab-studio-5-vfb.md","Order":1}],"Id":"256712d7-dcda-4b68-b2f8-d66c56f0efb0","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"VFB","Languages":[{"Code":"en","Title":"VFB","Slug":"vfb","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"9d359859-611e-48cb-b15a-3ddece293ae2","Path":"fog-format.md","Order":1},{"Id":"31c9c5d4-b5f5-48e6-87eb-aecc54c11f48","Path":"interchange-font-formats.md","Order":4},{"Id":"9dd472ec-8f37-444a-bc99-fe06942198d7","Path":"ik-ikarus-format.md","Order":3},{"Id":"ce436414-4803-4fc5-9ec5-a4a8c4223fef","Path":"glyphs-format.md","Order":2},{"Id":"3dc69b4b-fdb2-49b3-8b8d-1fbb00b7b132","Path":"phc-format.md","Order":5},{"Id":"5d394a95-9b26-4bda-8bf6-24e9de76a29d","Path":"phf-format.md","Order":6}],"Id":"f442bdcc-1a3b-4a7b-a0bd-499af412eac0","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Interchange File Formats","Languages":[{"Code":"en","Title":"Interchange File Formats","Slug":"interchange-file-formats","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"97b5a006-5ae2-4fab-b96a-c5dba6add6c8","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"Source Formats","Languages":[{"Code":"en","Title":"Source Formats","Slug":"source-formats","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"367edc7b-5ce7-49a5-b7fc-6ab31b30ef12","Path":"towards-opentype.md","Order":3},{"Id":"08329a63-48fd-4d4d-83d6-a5928cd3a003","Path":"from-opentype-to-fontlab-studio-5.md","Order":1},{"Id":"bc473dff-9380-4190-b888-9475945e2b2a","Path":"python-robofab-ufo-robofont.md","Order":2}],"Id":"e41af297-fc39-4a18-ada3-134b352d1c91","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"The Screen Reader","Languages":[{"Code":"en","Title":"The Screen Reader","Slug":"the-screen-reader","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"bc67c880-a6bf-462f-9aff-17004c9cd91f","Path":"variable-opentype-fonts.md","Order":4},{"Id":"de2cbea5-ca92-4feb-86bb-1949d822e24e","Path":"color-fonts-2.md","Order":1},{"Id":"1d3916dd-d154-4010-ad1b-a1c2c656c978","Path":"fontlab-7-1.md","Order":2},{"Id":"99ceb458-2023-410c-bfc6-fb69372aa7b1","Path":"fontlab-vi.md","Order":3}],"Id":"0c26ba90-afa8-4c6a-92f0-90ff60df766e","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"The Mobile Reader","Languages":[{"Code":"en","Title":"The Mobile Reader","Slug":"the-mobile-reader","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"2e0f85e5-d719-4c51-afb2-61d1c141f6ca","Path":"fontlab-2.md","Order":1},{"Id":"4587aaa5-0e7e-4065-8554-eac5c0eb2687","Path":"ikarus-tex-postscript.md","Order":3},{"Id":"29ebb2ff-f101-430e-8674-e19babc584e1","Path":"unicode-multiple-master.md","Order":5},{"Id":"5e1de858-983f-4d46-9be6-435da32a6e2d","Path":"fontographer-truetype.md","Order":2},{"Id":"db973f27-5609-4ebb-8f3f-98a747c8d273","Path":"type-1-macintosh.md","Order":4}],"Id":"7ae47286-4cd6-4d68-a9de-9e820f968f47","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"The Print Reader","Languages":[{"Code":"en","Title":"The Print Reader","Slug":"the-print-reader","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"42f43603-24e5-4166-a27a-82ed00eceb1b","Path":"axes-2.md","Order":1},{"Id":"e2f267a6-989b-4601-b229-9e2f28ce3a2c","Path":"axis-coordinate-systems.md","Order":2},{"Id":"8bd4071b-e0e0-44b6-bae1-740864d2686f","Path":"instances-3.md","Order":10},{"Id":"f32b8db0-907e-4bb0-bd88-e265e629bbb2","Path":"interpolation.md","Order":11},{"Id":"7d0e4782-928e-4411-abb4-2004654e2089","Path":"normalized-coordinates-in-variable-opentype.md","Order":12},{"Id":"a9858d42-aacd-49a7-9086-e87dfac58f4b","Path":"user-coordinates.md","Order":13},{"Id":"1f1b802b-7c26-44b7-b94f-3bc02196aac7","Path":"design-coordinates.md","Order":5},{"Id":"48cf5b2b-3878-4453-a96e-22b9a7fd4a9b","Path":"design-space.md","Order":6},{"Id":"5f4268ac-b481-48e5-95f9-278b1c64b8dc","Path":"extrapolation.md","Order":7},{"Id":"7be8aa09-d879-41e8-984b-4eb7a41a1360","Path":"axis-instances.md","Order":3},{"Id":"f777e242-71c6-4fad-8dd7-36d418ab8124","Path":"variations-4.md","Order":14},{"Id":"db08e434-e0ca-4480-b51a-5d60316e4363","Path":"axis-ranges.md","Order":4},{"Id":"42ee6fb4-8ac1-4289-bf05-ed13ba32c5fa","Path":"font-masters.md","Order":8},{"Id":"77c53a2a-0b95-48e2-8c4c-a22b1451e62a","Path":"fontless-masters.md","Order":9}],"Id":"f61935a6-3ce7-49c2-ab55-c97fc19e16de","Path":null,"Order":4,"CategoryType":0,"Icon":null,"Title":"Variable Fonts","Languages":[{"Code":"en","Title":"Variable Fonts","Slug":"variable-fonts-1","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"40859d0b-5e53-4510-9468-66c874d5cd92","Path":null,"Order":16,"CategoryType":0,"Icon":null,"Title":"Type Reference","Languages":[{"Code":"en","Title":"Type Reference","Slug":"type-reference","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"60d46e35-be70-4ab2-adca-5c9149583f19","Path":"tba-15.md","Order":1}],"Id":"7b3e78e2-d131-402e-b4e3-0373432f8662","Path":null,"Order":6,"CategoryType":0,"Icon":null,"Title":"Fervor","Languages":[{"Code":"en","Title":"Fervor","Slug":"fervor","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"89471c0e-7922-4724-a19a-a0849e0d6d7c","Path":"tba-22.md","Order":1}],"Id":"b8bbb1bb-39d6-4398-b618-0803a464fd93","Path":null,"Order":13,"CategoryType":0,"Icon":null,"Title":"GlyphsInfo","Languages":[{"Code":"en","Title":"GlyphsInfo","Slug":"glyphsinfo","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"712a3d33-5d49-4e1b-af57-1454964f865a","Path":"tba-31.md","Order":1}],"Id":"eb31c1ff-fcf9-47db-a2a0-6af11d600954","Path":"microsoft-software.md","Order":22,"CategoryType":1,"Icon":null,"Title":"Microsoft software","Languages":[{"Code":"en","Title":"Microsoft software","Slug":"microsoft-software","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"8ccbd73b-3944-47f6-9fc8-a1689c87245f","Path":"tba-24.md","Order":1}],"Id":"6e68f4c4-0297-4b19-8b7b-562940ef9c3a","Path":null,"Order":15,"CategoryType":0,"Icon":null,"Title":"ICU","Languages":[{"Code":"en","Title":"ICU","Slug":"icu","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"c33ece13-0771-4267-8a7b-90f31180f7f0","Path":"tba-25.md","Order":1}],"Id":"e01db24e-2f9b-41ec-8157-349535598b69","Path":null,"Order":16,"CategoryType":0,"Icon":null,"Title":"Iex","Languages":[{"Code":"en","Title":"Iex","Slug":"iex","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"6b62419c-5a4f-48fb-8323-144367d42d75","Path":"tba-14.md","Order":1}],"Id":"5bea9996-b311-4482-ae7b-f24ae87ebf26","Path":null,"Order":5,"CategoryType":0,"Icon":null,"Title":"Expat","Languages":[{"Code":"en","Title":"Expat","Slug":"expat","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"43df4101-fc62-4383-9ab5-ea4fca1e852c","Path":"tba-30.md","Order":1}],"Id":"e97c53e5-2236-4704-a709-b606a23168e5","Path":null,"Order":21,"CategoryType":0,"Icon":null,"Title":"libzip","Languages":[{"Code":"en","Title":"libzip","Slug":"libzip","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"e2db70c6-400f-4fb4-9b18-529990ade364","Path":"tba-18.md","Order":1}],"Id":"fe68de43-30a4-4495-9bf9-fe2cf554ef6a","Path":null,"Order":9,"CategoryType":0,"Icon":null,"Title":"fontTools","Languages":[{"Code":"en","Title":"fontTools","Slug":"fonttools-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"be0519e4-45aa-48d6-af38-258b4542032b","Path":"tba-17.md","Order":1}],"Id":"eef320df-18ca-4978-b2db-39d5c2152909","Path":null,"Order":8,"CategoryType":0,"Icon":null,"Title":"Brotli","Languages":[{"Code":"en","Title":"Brotli","Slug":"brotli","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"130939d9-26bc-4276-87b6-611dd97f621e","Path":"tba-23.md","Order":1}],"Id":"14f7c4a9-b92e-4388-8ba1-69f1d1e2b5d2","Path":null,"Order":14,"CategoryType":0,"Icon":null,"Title":"HarfBuzz","Languages":[{"Code":"en","Title":"HarfBuzz","Slug":"harfbuzz","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"8d2d3268-41ee-4902-8e70-8ac9d62cfc50","Path":"tba-27.md","Order":1}],"Id":"a6da28ff-69fb-4b35-9791-6f180b6eee8f","Path":null,"Order":18,"CategoryType":0,"Icon":null,"Title":"libpng","Languages":[{"Code":"en","Title":"libpng","Slug":"libpng","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"bb6cf5f4-b7f2-429d-a546-f98dc993b785","Path":"tba-28.md","Order":1}],"Id":"40e3b648-de3e-499a-b31e-e3cae8b40439","Path":null,"Order":19,"CategoryType":0,"Icon":null,"Title":"libqpsd","Languages":[{"Code":"en","Title":"libqpsd","Slug":"libqpsd","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"1dac5837-09b8-4526-aedc-79a8dba6c53f","Path":"tba-10.md","Order":1}],"Id":"92227fbf-4ced-49e4-8ce5-926826011886","Path":"adobe-agl-aglfn.md","Order":1,"CategoryType":1,"Icon":null,"Title":"Adobe AGL & AGLFN","Languages":[{"Code":"en","Title":"Adobe AGL & AGLFN","Slug":"adobe-agl-aglfn","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"1e0515c9-bbe0-48ec-9ba0-6e4d710644d8","Path":"tba-12.md","Order":1}],"Id":"15568cc7-9572-424f-afe2-6dc0e715edb4","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"Discount","Languages":[{"Code":"en","Title":"Discount","Slug":"discount","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"777f128b-50dc-471e-9570-c03a572dfd77","Path":"tba-13.md","Order":1}],"Id":"2957c24e-2743-4de1-8482-de3191cd53ea","Path":"eot-utilities.md","Order":4,"CategoryType":1,"Icon":null,"Title":"EOT Utilities","Languages":[{"Code":"en","Title":"EOT Utilities","Slug":"eot-utilities","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"6467aa9c-ccf0-4add-afd2-818045b08b0a","Path":"tba-20.md","Order":1}],"Id":"3534233f-4762-4b87-aee5-d0ed7e7141fc","Path":"glyph-nanny.md","Order":11,"CategoryType":1,"Icon":null,"Title":"Glyph Nanny","Languages":[{"Code":"en","Title":"Glyph Nanny","Slug":"glyph-nanny","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"d4f0fa55-73f6-46c7-87c3-af98c471b735","Path":"tba-11.md","Order":1}],"Id":"9742ada5-f221-43d3-805c-7c1e963b471f","Path":"adobe-fdk-for-opentype.md","Order":2,"CategoryType":1,"Icon":null,"Title":"Adobe FDK for OpenType","Languages":[{"Code":"en","Title":"Adobe FDK for OpenType","Slug":"adobe-fdk-for-opentype","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"2ebdf1c6-2271-4ae6-bf3a-94c515a241a1","Path":"tba-26.md","Order":1}],"Id":"ebe392a9-c91e-4aa7-b49f-803f9978490a","Path":null,"Order":17,"CategoryType":0,"Icon":null,"Title":"Leptonica","Languages":[{"Code":"en","Title":"Leptonica","Slug":"leptonica","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"d9162b4f-2621-4f3b-9ae1-a4f840ae2d0e","Path":"tba-19.md","Order":1}],"Id":"93ad5bf7-dfc7-42f7-affe-be10c4288815","Path":"freetype-ttfautohint.md","Order":10,"CategoryType":1,"Icon":null,"Title":"FreeType, ttfautohint","Languages":[{"Code":"en","Title":"FreeType, ttfautohint","Slug":"freetype-ttfautohint","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"effe4904-89e0-47ef-88fd-dc52ec38e325","Path":"tba-16.md","Order":1}],"Id":"cdbe4039-ab87-434b-89ec-cd53c08c68ff","Path":null,"Order":7,"CategoryType":0,"Icon":null,"Title":"cmark-gfm","Languages":[{"Code":"en","Title":"cmark-gfm","Slug":"cmark-gfm","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"a8025dd0-fbb9-4a01-8547-90092e0e59cd","Path":"tba-21.md","Order":1}],"Id":"b6131493-78c5-44cd-9861-f9e2ab11cfb5","Path":null,"Order":12,"CategoryType":0,"Icon":null,"Title":"glyphNameFormatter","Languages":[{"Code":"en","Title":"glyphNameFormatter","Slug":"glyphnameformatter","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"15f6d88b-c464-4ac0-8ba8-5ee52c8d4ea4","Path":"tba-29.md","Order":1}],"Id":"538723e6-fefa-4f25-8efa-01c144e5857f","Path":null,"Order":20,"CategoryType":0,"Icon":null,"Title":"libuuid","Languages":[{"Code":"en","Title":"libuuid","Slug":"libuuid","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"1d04d8a0-6b14-4ad4-8f0d-c7cf3e41cd2b","Path":"tba-53.md","Order":1}],"Id":"4e322917-677b-444c-a87a-18a54cbd93c6","Path":"work-sans.md","Order":44,"CategoryType":1,"Icon":null,"Title":"Work Sans","Languages":[{"Code":"en","Title":"Work Sans","Slug":"work-sans","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"9d4a73c3-f2f8-4131-9180-c634789ac54d","Path":"tba-54.md","Order":1}],"Id":"e7be6b38-605a-49fa-baa0-e7bf6d4b462d","Path":"xetex-portions.md","Order":45,"CategoryType":1,"Icon":null,"Title":"XeTeX portions","Languages":[{"Code":"en","Title":"XeTeX portions","Slug":"xetex-portions","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"c49a5369-4e2d-4ab2-a6e1-21a415f2a33c","Path":"tba-39.md","Order":1}],"Id":"736c5555-f83e-4366-9dd7-6bbdc737bf0f","Path":null,"Order":30,"CategoryType":0,"Icon":null,"Title":"PoDoFo","Languages":[{"Code":"en","Title":"PoDoFo","Slug":"podofo","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"f8f48132-e76f-44f6-9c22-f8a36c05d59e","Path":"tba-33.md","Order":1}],"Id":"983512f3-96e0-4782-915f-230506f05948","Path":null,"Order":24,"CategoryType":0,"Icon":null,"Title":"MutatorMath","Languages":[{"Code":"en","Title":"MutatorMath","Slug":"mutatormath","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"227244b8-0c30-4b36-85d7-836a569d6b13","Path":"tba-38.md","Order":1}],"Id":"8f0879d0-417f-4f6b-9bbe-0130bb8a955f","Path":"plist-parser-for-qt.md","Order":29,"CategoryType":1,"Icon":null,"Title":"PList parser for Qt","Languages":[{"Code":"en","Title":"PList parser for Qt","Slug":"plist-parser-for-qt","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"33db4600-1578-4fb4-9508-c285fa98a888","Path":"tba-40.md","Order":1}],"Id":"fbb556dd-d1fb-4162-8bd9-6c8f90b0236c","Path":null,"Order":31,"CategoryType":0,"Icon":null,"Title":"PyClipper","Languages":[{"Code":"en","Title":"PyClipper","Slug":"pyclipper","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"a1d4aa50-fe82-4c0e-8965-502e51c5a422","Path":"tba-35.md","Order":1}],"Id":"c8af4928-f4cb-421c-9328-3636afbe8103","Path":null,"Order":26,"CategoryType":0,"Icon":null,"Title":"OpenSSL","Languages":[{"Code":"en","Title":"OpenSSL","Slug":"openssl","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"320597c0-535e-48ae-9a2e-945c292daecb","Path":"tba-41.md","Order":1}],"Id":"adc84a1b-8623-400a-98cb-abcfb858e33a","Path":null,"Order":32,"CategoryType":0,"Icon":null,"Title":"PythonQt","Languages":[{"Code":"en","Title":"PythonQt","Slug":"pythonqt","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"5a787b4f-b1b9-4e86-b44e-f5ff60e55dbd","Path":"tba-36.md","Order":1}],"Id":"9f27ba8e-871d-4112-9cbb-3610bbbe9e69","Path":null,"Order":27,"CategoryType":0,"Icon":null,"Title":"OptiPNG","Languages":[{"Code":"en","Title":"OptiPNG","Slug":"optipng","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"6edf0689-eb24-43ac-8711-4b3423f83c3d","Path":"tba-49.md","Order":1}],"Id":"7b279a64-be26-433e-8771-5e6d5f371c69","Path":null,"Order":40,"CategoryType":0,"Icon":null,"Title":"Sparkle","Languages":[{"Code":"en","Title":"Sparkle","Slug":"sparkle","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"b9a12103-ab70-4cc7-b0fe-250cb6084c1c","Path":"tba-44.md","Order":1}],"Id":"0ad81034-b2c7-4f17-8b44-86de1b5fba7c","Path":null,"Order":35,"CategoryType":0,"Icon":null,"Title":"QtnProperty","Languages":[{"Code":"en","Title":"QtnProperty","Slug":"qtnproperty","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"4f75044a-4020-4968-ba9a-edd7991c6592","Path":"tba-47.md","Order":1}],"Id":"15b7980c-5ef9-4ca1-9c31-34d84a7aa959","Path":null,"Order":38,"CategoryType":0,"Icon":null,"Title":"Roboto","Languages":[{"Code":"en","Title":"Roboto","Slug":"roboto","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"2c1b2562-38b9-435c-aee9-bb70c4b10ee9","Path":"tba-46.md","Order":1}],"Id":"c456b576-e85d-4a15-9a0b-39724d3dc6b7","Path":null,"Order":37,"CategoryType":0,"Icon":null,"Title":"RoboFab","Languages":[{"Code":"en","Title":"RoboFab","Slug":"robofab","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"f4a7b93b-674e-4f87-bf82-17c8f83e10fd","Path":"tba-51.md","Order":1}],"Id":"4d63faf5-62ff-4999-9d4e-2a04f25da86b","Path":null,"Order":42,"CategoryType":0,"Icon":null,"Title":"Tesseract","Languages":[{"Code":"en","Title":"Tesseract","Slug":"tesseract","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"05f3a42d-30a4-460e-bfad-47d2272c932f","Path":"tba-34.md","Order":1}],"Id":"469eb85d-b54f-42d8-bbee-cd302c2be90d","Path":null,"Order":25,"CategoryType":0,"Icon":null,"Title":"Noto","Languages":[{"Code":"en","Title":"Noto","Slug":"noto","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"94b2e22c-a665-45ee-985c-54bb46cf100e","Path":"tba-37.md","Order":1}],"Id":"4e3125c7-0fde-4cac-af7e-4cc61319b406","Path":"other-software-portions.md","Order":28,"CategoryType":1,"Icon":null,"Title":"Other software portions","Languages":[{"Code":"en","Title":"Other software portions","Slug":"other-software-portions","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"907ce444-73ef-4a09-8cb2-d41f44ba6a9c","Path":"tba-32.md","Order":1}],"Id":"4b6de2be-2070-45d6-b935-408055353bd4","Path":null,"Order":23,"CategoryType":0,"Icon":null,"Title":"muParser","Languages":[{"Code":"en","Title":"muParser","Slug":"muparser","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"74eed466-512c-4434-ae4e-1d83746abb6b","Path":"tba-48.md","Order":1}],"Id":"9ac3476d-37a0-4943-8434-89a442772cb9","Path":null,"Order":39,"CategoryType":0,"Icon":null,"Title":"sfntly","Languages":[{"Code":"en","Title":"sfntly","Slug":"sfntly","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"df90625c-71fb-4b93-b42f-8d48614c5262","Path":"tba-55.md","Order":1}],"Id":"8eb83457-3a9b-4f71-9a90-1629b1dd60db","Path":null,"Order":46,"CategoryType":0,"Icon":null,"Title":"Zlib","Languages":[{"Code":"en","Title":"Zlib","Slug":"zlib","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"6470deb8-3831-47a8-9839-05f359fda4fc","Path":"tba-52.md","Order":1}],"Id":"7dcfe7af-1806-444b-b15f-144e01300b0d","Path":null,"Order":43,"CategoryType":0,"Icon":null,"Title":"WOFF2","Languages":[{"Code":"en","Title":"WOFF2","Slug":"woff2","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"5d5c68f0-17ea-40ac-9650-cd901487794a","Path":"tba-43.md","Order":1}],"Id":"d361e690-85d7-41fc-923a-f94ae330f811","Path":null,"Order":34,"CategoryType":0,"Icon":null,"Title":"Qt","Languages":[{"Code":"en","Title":"Qt","Slug":"qt","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"0f63f64d-a744-437c-a877-e6554c649b49","Path":"tba-45.md","Order":1}],"Id":"580a5077-8779-4619-977a-1ac581040b82","Path":null,"Order":36,"CategoryType":0,"Icon":null,"Title":"RapidXml","Languages":[{"Code":"en","Title":"RapidXml","Slug":"rapidxml","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"8f85156c-8e1a-492b-b065-74173ae40f08","Path":"tba-42.md","Order":1}],"Id":"47c0bcf1-08e9-4222-9a30-aea824607188","Path":"qscintilla-scintilla.md","Order":33,"CategoryType":1,"Icon":null,"Title":"QScintilla, Scintilla","Languages":[{"Code":"en","Title":"QScintilla, Scintilla","Slug":"qscintilla-scintilla","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"f62ac182-c023-4ac5-98de-87b8b6fed5ab","Path":"tba-50.md","Order":1}],"Id":"21da440a-8d03-4edb-95ff-8c530a4c077d","Path":null,"Order":41,"CategoryType":0,"Icon":null,"Title":"SVGMin","Languages":[{"Code":"en","Title":"SVGMin","Slug":"svgmin","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"8d3df757-c20c-42c2-be03-5afdf0a62fad","Path":"license.md","Order":6},{"Id":"2f323c25-663a-4291-aea7-1da9b86a9178","Path":"complete-agreement.md","Order":3},{"Id":"6423c9d8-71f2-42bf-8c3b-af756689a916","Path":"export-law-assurances.md","Order":5},{"Id":"0f50cac6-913f-4155-908e-bbea7717d03a","Path":"copyright.md","Order":4},{"Id":"9f62de60-288f-4b1d-8f50-36919d370eb6","Path":"warranty.md","Order":9},{"Id":"860bdc0d-6645-4719-a6fb-62831f95e32e","Path":"applicable-laws.md","Order":1},{"Id":"77382a70-a221-425b-a0c6-16348c898d7d","Path":"sample-code.md","Order":7},{"Id":"33ca8462-4ed2-462d-8c37-c83d36212744","Path":"audit.md","Order":2},{"Id":"90337b5e-7edc-41d0-824e-ebb19d5a945d","Path":"termination-of-this-license.md","Order":8}],"Id":"37f50662-95d7-4e81-a294-964c5ac804ae","Path":"fontlab-eula.md","Order":1,"CategoryType":1,"Icon":null,"Title":"FontLab EULA","Languages":[{"Code":"en","Title":"FontLab EULA","Slug":"fontlab-eula","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"cfb1882e-89f5-49c0-a379-553aa513920c","Path":"fontlab-ugla.md","Order":2}],"Id":"c84922c6-d2d6-475e-b77f-d0286065632e","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"FontLab","Languages":[{"Code":"en","Title":"FontLab","Slug":"fontlab-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"b12e7ff3-0e94-4f8d-8314-c5a5f1451ccd","Path":"tba-57.md","Order":1}],"Id":"1e6f0de0-214c-4de1-9272-942796df53be","Path":"gnu-lesser-general-public-license-version-2.md","Order":2,"CategoryType":1,"Icon":null,"Title":"GNU Lesser General Public License, Version 2","Languages":[{"Code":"en","Title":"GNU Lesser General Public License, Version 2","Slug":"gnu-lesser-general-public-license-version-2","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"20f8799d-63f8-4f38-a384-f101c887986d","Path":"tba-58.md","Order":1}],"Id":"5afae421-f12b-4562-b72a-d2ac2dfb16e1","Path":"sil-open-font-license-version-1.md","Order":3,"CategoryType":1,"Icon":null,"Title":"SIL Open Font License, Version 1","Languages":[{"Code":"en","Title":"SIL Open Font License, Version 1","Slug":"sil-open-font-license-version-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"a849a36b-93a6-4b82-b794-0490d6bbfe21","Path":"tba-56.md","Order":1}],"Id":"0284fe68-8126-4c15-95c8-d9300bed4a7a","Path":"apache-license-version-2.md","Order":1,"CategoryType":1,"Icon":null,"Title":"Apache License, Version 2","Languages":[{"Code":"en","Title":"Apache License, Version 2","Slug":"apache-license-version-2","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"c6f36fe5-c00c-410b-82a8-eec7074a9f30","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"Standard License Texts","Languages":[{"Code":"en","Title":"Standard License Texts","Slug":"standard-license-texts","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"84f16904-fece-4841-8b34-1ec01b972b51","Path":"special-thanks.md","Order":4},{"Id":"40150bc1-aac2-4299-bf4b-4fa6e99cdbe4","Path":"fontographer-and-fontlab-codeveloped-by.md","Order":3},{"Id":"8913ccb4-8ee3-4d3d-a3b4-cf91f7760f5f","Path":"creators-and-developers.md","Order":2},{"Id":"c5e25b16-4fa9-44de-99c2-f6710bb258ec","Path":"additional-acknowledgments.md","Order":1}],"Id":"b9e175d9-3b4c-4709-a39c-6d332faa05c0","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"Credits","Languages":[{"Code":"en","Title":"Credits","Slug":"credits-1","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[],"Articles":[{"Id":"7bd44d4d-6108-414a-8b51-a5b47d267c1d","Path":"this-product-uses-or-is-based-on-portions-of-licensed-software-including.md","Order":1},{"Id":"1e9e6ec0-d0dd-44ec-b477-1a951b9ba7c3","Path":"trademarks.md","Order":2}],"Id":"771a4172-0ceb-4aff-a8cb-626f271e86fa","Path":"legal-notices.md","Order":2,"CategoryType":1,"Icon":null,"Title":"Legal Notices","Languages":[{"Code":"en","Title":"Legal Notices","Slug":"legal-notices","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"ac90ccf7-4c5d-4966-b72a-91c38c89e173","Path":null,"Order":1,"CategoryType":0,"Icon":null,"Title":"FontLab Credits","Languages":[{"Code":"en","Title":"FontLab Credits","Slug":"fontlab-credits","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"28c0f094-9018-47eb-add1-9fc10c3af4c1","Path":"reviews.md","Order":2}],"Id":"fd747368-532a-46a7-b265-c1fd61ac9758","Path":"credits.md","Order":19,"CategoryType":1,"Icon":null,"Title":"Credits","Languages":[{"Code":"en","Title":"Credits","Slug":"credits","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"f87147ac-e179-478b-b143-1e9456d912a0","Path":"r-15.md","Order":1},{"Id":"766c2760-6227-40cc-ad48-18a879429f29","Path":"r-16.md","Order":2}],"Id":"8dc4ea63-ddf9-4081-ae19-c9de7bc3d8b3","Path":"r.md","Order":15,"CategoryType":1,"Icon":null,"Title":"<$R>","Languages":[{"Code":"en","Title":"<$R>","Slug":"r","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[{"Id":"ab41b525-a194-4703-b047-5ba7d93b1029","Path":"r-10.md","Order":10},{"Id":"a3e13d57-630b-4360-bdea-cddd6a376004","Path":"r-3.md","Order":3},{"Id":"3c4d892f-c102-4b6d-80d8-e734db9d1334","Path":"r-14.md","Order":14},{"Id":"ffb18756-ff0f-456a-b32d-f13d4f746c66","Path":"r-2.md","Order":2},{"Id":"e5ef12e7-687b-40e8-8e75-65568b1a093d","Path":"r-1.md","Order":1},{"Id":"fd6b05b1-8c5a-4b30-8d53-1cc1b5192d0f","Path":"r-4.md","Order":4},{"Id":"e1908025-5521-4af5-b0a3-fbe11a6eef48","Path":"r-9.md","Order":9},{"Id":"29ff4c63-6bd8-44d0-a833-979d8155ffcd","Path":"r-8.md","Order":8},{"Id":"235596c7-9ee7-46f2-a8b9-2fe9fe2e630c","Path":"r-11.md","Order":11},{"Id":"fc08e65d-3f6d-464d-b6cf-67b345658263","Path":"r-7.md","Order":7},{"Id":"fe161aff-dbae-46b1-9e49-ce0d50c2d243","Path":"r-5.md","Order":5},{"Id":"d0faa405-3142-4ea3-bf8f-f7cabb077d88","Path":"r-6.md","Order":6},{"Id":"1279f931-3f87-4271-8e6b-928db2e14b53","Path":"r-12.md","Order":12},{"Id":"dc7efa72-c509-46d7-8ee2-6558e64d457a","Path":"r-13.md","Order":13}],"Id":"8e0a8853-0e68-4262-aa57-78da93fcd784","Path":null,"Order":20,"CategoryType":0,"Icon":null,"Title":"Tutorials","Languages":[{"Code":"en","Title":"Tutorials","Slug":"tutorials","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"77f70af2-0063-47cb-9b51-adb7e989fd74","Path":null,"Order":16,"CategoryType":0,"Icon":null,"Title":"SCRIVENER","Languages":[{"Code":"en","Title":"SCRIVENER","Slug":"scrivener","ContentType":0,"SeoTitle":null,"Description":null}]}],"Articles":[],"Id":"23b6d274-6c1a-4342-88d4-a7efd740a415","Path":null,"Order":3,"CategoryType":0,"Icon":null,"Title":"FontLab","Languages":[{"Code":"en","Title":"FontLab","Slug":"fontlab","ContentType":0,"SeoTitle":null,"Description":null}]},{"SubCategories":[{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"402d624c-e7c2-4617-8dfc-b3c3202e857c","Path":"creating-a-group-with-an-image.md","Order":5},{"Id":"5c62c592-8985-44f0-8d18-0e00677d813d","Path":"adding-source-image.md","Order":2},{"Id":"c1b9cfe7-ae73-42ef-a7c1-dea6899a3252","Path":"source-image-overview.md","Order":3},{"Id":"22871093-42fc-40e9-9b56-a6bc7c7a8d54","Path":"update-the-source-image.md","Order":4}],"Id":"58dfd7e2-e23d-4296-8694-169a4a8ee71f","Path":"source-image.md","Order":4,"CategoryType":1,"Icon":null,"Title":"Source Image","Languages":[{"Code":"en","Title":"Source Image","Slug":"source-image","ContentType":0,"SeoTitle":"Source Image","Description":null}]}],"Articles":[{"Id":"19bf58db-92d2-4902-a661-877d9e6e6281","Path":"create-group.md","Order":1},{"Id":"fdc18149-7aa2-47e3-aea9-035630456da0","Path":"ungrouping-objects.md","Order":2},{"Id":"aac85fcb-1f75-43a5-ab16-72ec2a9674d1","Path":"moving-objects-between-groups.md","Order":3},{"Id":"69a9645f-80e5-4a7e-af1e-f0733f01da50","Path":"group-overlay.md","Order":6},{"Id":"ea61a82d-a013-410b-8738-b2f9fd120d44","Path":"importing-the-document-as-group.md","Order":5}],"Id":"76f4294a-0265-484a-b662-72916501c96a","Path":"groups.md","Order":12,"CategoryType":1,"Icon":null,"Title":"Groups","Languages":[{"Code":"en","Title":"Groups and Sources","Slug":"groups","ContentType":0,"SeoTitle":"Groups and Sources","Description":null}]},{"SubCategories":[{"SubCategories":[],"Articles":[{"Id":"0860c1d5-33d7-460c-b50e-fbd657f10607","Path":"propagated-fills.md","Order":5},{"Id":"14d2dfc6-75f5-4f17-9226-5e5092024fef","Path":"mask-fill.md","Order":6},{"Id":"38637f3e-4c96-4bb1-805f-3c213a96d962","Path":"adding-the-handmade-fill.md","Order":1},{"Id":"c0ef19ff-04d6-4d1a-a3d2-9154fbc80b2f","Path":"balanced-fill.md","Order":4},{"Id":"f4b6e162-26d2-4cba-9cb9-985e2527d384","Path":"solid-fill.md","Order":7},{"Id":"a77280f4-b572-47fe-942b-fdf18d926f49","Path":"blend-fill.md","Order":3},{"Id":"b7055786-5757-4600-bc58-402b359dc19e","Path":"manual-fill.md","Order":2}],"Id":"99076ccc-4f2a-45e5-b240-7fdb331d2f99","Path":"handmade-fills-1.md","Order":13,"CategoryType":1,"Icon":null,"Title":"Handmade","Languages":[{"Code":"en","Title":"Handmade","Slug":"handmade-fills-1","ContentType":0,"SeoTitle":"Handmade","Description":null}]}],"Articles":[{"Id":"87dee2f7-5cf1-419c-a316-35f46a15c773","Path":"trace-fill.md","Order":8},{"Id":"549aa48a-5b1c-4dfb-9746-4c37c5157d87","Path":"scribble-fill.md","Order":10},{"Id":"f2460d15-aa4e-46b8-9838-8df67f8e7e3c","Path":"radial-fill.md","Order":4},{"Id":"c74e0468-f727-4333-81f2-c354544cab5f","Path":"text-fill.md","Order":11},{"Id":"6bab0a6b-c138-42f1-a352-3e2dd833d67f","Path":"circular-fill.md","Order":5},{"Id":"87f064bb-a995-4c96-ba3c-66a0866044de","Path":"wireframe-fill.md","Order":9},{"Id":"8d8607b9-0364-40a5-83ce-5f8ed5f518e3","Path":"fractals-fill.md","Order":12},{"Id":"c5c6d8d7-ba70-426f-873e-d02713f98284","Path":"wave-fill.md","Order":3},{"Id":"cb4cce72-7b5e-4a4b-a24a-8252f9a84948","Path":"linear-fill.md","Order":2},{"Id":"6f70fa79-b8dc-4d27-94cb-3c5b94469415","Path":"fill-clone.md","Order":14},{"Id":"bb41c442-3d1e-4eb3-aeb0-bf784aba1bb9","Path":"adding-a-fill-1.md","Order":1},{"Id":"0a4213b5-15de-4676-bc9e-440c66feb38c","Path":"spiral-fill.md","Order":6},{"Id":"b7c00a2c-afae-4b87-9860-24157d2df7c5","Path":"halftone-fills.md","Order":7}],"Id":"b7b6cd2b-0569-4442-968d-cea577615430","Path":"fills-3.md","Order":6,"CategoryType":1,"Icon":null,"Title":"Fills","Languages":[{"Code":"en","Title":"Fills","Slug":"fills-3","ContentType":0,"SeoTitle":"Fills","Description":null}]},{"SubCategories":[],"Articles":[{"Id":"f939cbc4-426f-4990-979f-31984b375e4d","Path":"create-new-document-1.md","Order":1},{"Id":"4857ce0e-7cd0-44b0-83d0-8f0acf246bc5","Path":"mask-properties.md","Order":8},{"Id":"38e9c189-3cf9-4244-bd09-77f1b01e6994","Path":"opening-an-existing-document-1.md","Order":2},{"Id":"62cb731b-8a80-48ee-821d-9782762ed4b9","Path":"fill-properties-1.md","Order":4},{"Id":"c34895e9-037e-40d3-953c-26c67969077a","Path":"exporting-the-artwork.md","Order":14},{"Id":"ecc29ec3-2a6b-4695-a72f-cec637e50c14","Path":"adding-a-layer.md","Order":10},{"Id":"32c09b5f-3353-4018-820b-d6159962b3ba","Path":"saving-your-work-1.md","Order":13},{"Id":"b02a0784-a6d7-4235-90ce-8f3266abccf4","Path":"document-view-options.md","Order":12},{"Id":"2c1ebac1-10dc-4292-a5db-e4888a1937f1","Path":"units-of-measurement.md","Order":9},{"Id":"cf8ad8ec-0199-4760-844d-42394b54d13e","Path":"adding-a-mask.md","Order":5},{"Id":"65aeb303-cf8b-46f2-aca0-953bb407c39e","Path":"adding-a-fill.md","Order":3},{"Id":"29443121-be9b-4d3c-ae18-8ad1e3924218","Path":"mask-editing.md","Order":7},{"Id":"4c29879d-5281-4cb8-95eb-81504d2301e2","Path":"sources-and-groups.md","Order":11}],"Id":"366d0353-5e21-46b7-89a5-8a7dd04527b4","Path":"working-with-documents-1.md","Order":5,"CategoryType":1,"Icon":null,"Title":"Your First Artwork","Languages":[{"Code":"en","Title":"Your First Artwork","Slug":"working-with-documents-1","ContentType":0,"SeoTitle":"Your First Artwork","Description":null}]},{"SubCategories":[],"Articles":[{"Id":"72d14e46-15e0-4f57-9886-8460b131b9ed","Path":"editor-tool.md","Order":2},{"Id":"9b780b24-1d9c-47b6-a735-4c3ff3e056de","Path":"transform-4.md","Order":6},{"Id":"ddb80496-81b3-4456-94c1-d3b902a26154","Path":"freeform-1.md","Order":10},{"Id":"d7ecaeab-03bf-42f4-bcab-b91a2edba7fd","Path":"brush-1.md","Order":7},{"Id":"de19d479-21cb-4ec7-bc6f-911aaaabc0ee","Path":"meter-tool.md","Order":3},{"Id":"712b3868-5009-4030-9327-204504c9b402","Path":"rectangle-1.md","Order":8},{"Id":"c90f7b49-f6b4-4a87-b5e9-24b2fec9fed3","Path":"ellipse-1.md","Order":9},{"Id":"fffbd56a-a6c3-4873-9eea-16118c56a44e","Path":"knife-2.md","Order":5},{"Id":"e054bbc3-b617-4b54-ab79-f6847e7df7df","Path":"pencil-2.md","Order":4},{"Id":"68f77e98-dbbe-4ec6-80f8-0a98018cdd42","Path":"toolbar-5.md","Order":1}],"Id":"c58b31f0-d5f5-498b-b9f9-31cb487fd93c","Path":"tools-4.md","Order":8,"CategoryType":1,"Icon":"","Title":"Tools","Languages":[{"Code":"en","Title":"Tools","Slug":"tools-4","ContentType":0,"SeoTitle":"Tools","Description":null}]},{"SubCategories":[],"Articles":[{"Id":"a7f99dac-1276-42d9-9daa-2136e7d75028","Path":"mask-overlay.md","Order":4},{"Id":"e5686d9d-cc4c-43fc-a3c8-677e56f9c527","Path":"importing-mask.md","Order":2},{"Id":"41a2b88f-5ba4-4e8b-862d-8f5ac5af121a","Path":"adding-mask.md","Order":1},{"Id":"76c95666-5a9c-442d-b34e-6151445f8668","Path":"mask-and-mesh.md","Order":6},{"Id":"f756a542-fe2a-46b3-b1a0-830ead607190","Path":"mask-editing-1.md","Order":3},{"Id":"09735a0f-e1ad-41dd-ac1d-5764be00d6a4","Path":"mask-properties-1.md","Order":5}],"Id":"c64462e7-eaab-4395-81d0-0db2d59eeb20","Path":"mask-category.md","Order":10,"CategoryType":1,"Icon":null,"Title":"Mask","Languages":[{"Code":"en","Title":"Mask","Slug":"mask-category","ContentType":0,"SeoTitle":"Mask","Description":null}]},{"SubCategories":[],"Articles":[{"Id":"eb63522e-3237-4574-b432-2f13f5460b63","Path":"adding-mesh.md","Order":1},{"Id":"7262df0f-efd7-43b3-8826-3c516ee3a297","Path":"mesh-properties.md","Order":5},{"Id":"25fb4c70-9943-4cf7-ac5f-9019178ca3c3","Path":"mesh-editing.md","Order":3},{"Id":"644317fb-9a19-4c76-9386-4b442188fd89","Path":"mesh-and-mask.md","Order":6}],"Id":"b530ce48-f2f3-4cc1-94e2-40ea36731a0b","Path":"mesh-5.md","Order":11,"CategoryType":1,"Icon":null,"Title":"Mesh","Languages":[{"Code":"en","Title":"Mesh","Slug":"mesh-5","ContentType":0,"SeoTitle":"Mesh","Description":null}]},{"SubCategories":[],"Articles":[{"Id":"c70208be-4294-48e6-938e-5346c9590b0e","Path":"layers-panel.md","Order":2},{"Id":"9cd28191-6440-4f7b-a974-003b1d1c5b24","Path":"removing-the-layer.md","Order":4},{"Id":"6028138a-1e8c-42b3-abc8-d030db10ef7a","Path":"mask-3.md","Order":5},{"Id":"98c41f83-c090-41fd-a92c-e816845b37f5","Path":"groups-1.md","Order":6},{"Id":"003d1859-94ec-4221-b2d9-4793379cbbe5","Path":"mesh-6.md","Order":7},{"Id":"ec74b01e-875b-4f36-9c06-d9a7a3d33217","Path":"adding-a-layer-1.md","Order":3}],"Id":"233c5045-7caa-4f96-8389-14c3a861935d","Path":"layers-4.md","Order":9,"CategoryType":1,"Icon":"","Title":"Layers","Languages":[{"Code":"en","Title":"Layers","Slug":"layers-4","ContentType":0,"SeoTitle":"Layers","Description":null}]},{"SubCategories":[],"Articles":[{"Id":"f110d8c4-7e40-49b7-ac35-f10225afa235","Path":"transform-3.md","Order":8},{"Id":"9705f3f3-5179-4a8f-b366-a86d6420e70b","Path":"align-and-arrange-1.md","Order":7},{"Id":"90cd419d-067a-41b5-8c9c-579d6e02a60e","Path":"stroke-caps-1.md","Order":5},{"Id":"79dd9dfb-368b-4f79-9b83-95b392e63a81","Path":"view-2.md","Order":10},{"Id":"cf3b10bf-f96e-497f-b7d3-5b24fca80956","Path":"emboss-1.md","Order":6},{"Id":"f7af74c0-65c7-4175-8186-10dea44ccf75","Path":"stroke-thickness-2.md","Order":3},{"Id":"78cdf821-74ce-4c33-8f7b-8c812358c22a","Path":"image-threshold-2.md","Order":2},{"Id":"34292c91-754c-467d-ab45-9fdd6f0f22a0","Path":"dashed-line-1.md","Order":4},{"Id":"462d80ab-de54-4a02-95ba-cc4ef5cf30e0","Path":"document-properties-1.md","Order":11},{"Id":"867df7f5-71e6-44c2-a615-25db2fb433be","Path":"overlap.md","Order":9},{"Id":"7fec2c0e-2982-4d01-a0b8-4354506f00a1","Path":"color-5.md","Order":1}],"Id":"6e10c31b-7226-44ef-aa40-d2efe6d8f622","Path":"properties-2.md","Order":7,"CategoryType":1,"Icon":null,"Title":"Properties","Languages":[{"Code":"en","Title":"Properties","Slug":"properties-2","ContentType":0,"SeoTitle":"Properties","Description":null}]},{"SubCategories":[],"Articles":[{"Id":"ac2979d7-a934-437e-aca6-93edf1b7e0ea","Path":"export-4.md","Order":1},{"Id":"ec430bb4-daba-4a0f-9d40-83f33d3264f5","Path":"ranges.md","Order":3},{"Id":"e982a341-61b5-471c-bb00-5e4e1e397eba","Path":"rendering.md","Order":5},{"Id":"00c24c51-22e6-45c3-b129-6c7f58420525","Path":"save-2.md","Order":8},{"Id":"641d7fde-a58a-4f4f-ae98-dafd48216094","Path":"backup.md","Order":7},{"Id":"d3abd366-7807-4782-a539-b9baf9d77757","Path":"preview-shortcut.md","Order":6},{"Id":"e6499f01-796b-4645-a8b3-1f46e3248730","Path":"update.md","Order":9},{"Id":"1c16b88d-5656-4087-9238-f500976ac4c1","Path":"source-opacity.md","Order":2},{"Id":"fdd33f48-a402-4b59-8589-be37f4c42a9e","Path":"colors.md","Order":4}],"Id":"76c58306-7804-4739-be01-63c7af34a933","Path":"preferences-8.md","Order":13,"CategoryType":1,"Icon":null,"Title":"Preferences","Languages":[{"Code":"en","Title":"Preferences","Slug":"preferences-8","ContentType":0,"SeoTitle":"Preferences","Description":null}]}],"Articles":[{"Id":"b08fc8b7-7363-4be4-b75a-90ee33953484","Path":"document-structure-overview.md","Order":4},{"Id":"6a67e362-d604-46a3-93b0-0332fb98b84f","Path":"introduction-5.md","Order":1},{"Id":"270a92c7-0ca8-4f23-b25c-859e93175a73","Path":"interface-overview.md","Order":3},{"Id":"19fa1811-088e-41dc-8d52-59f391376a97","Path":"getting-started-4.md","Order":2}],"Id":"91ea5865-80b3-41d7-865e-0bca18e4bdf6","Path":null,"Order":2,"CategoryType":0,"Icon":null,"Title":"Vexy Lines","Languages":[{"Code":"en","Title":"Vexy Lines","Slug":"vexy-lines-ai","ContentType":0,"SeoTitle":"Vexy Lines AI","Description":null}]}]}

... (Data file content truncated to first 5 lines)
</document_content>
</document>

<document index="49">
<source>tests/fixtures/README.md</source>
<document_content>
# Test Fixtures

This directory contains test data migrated from legacy Document360 implementations during Phase 9 consolidation (2025-08-08).

## Directory Structure

### `vexy-lines-archive/`
Full Document360 archive from Vexy Lines documentation:
- **`Vexy-Lines-2025-Mar-12-04-42-07.zip`**: Production archive with 1000+ files
- Use for integration testing, archive parsing, and performance benchmarking

### `markdown_samples/`
Markdown articles from the Vexy Lines archive:
- **`about-this-guide.md`**: Introduction/guide article
- **`adding-a-fill.md`**: How-to tutorial  
- **`actions-6.md`**: Feature documentation
- Use for markdown parsing and content conversion testing

## Data Directory

### `../data/`
- **`v1_categories_articles.json`**: 532KB JSON metadata from Vexy Lines export
- Includes categories hierarchy and article metadata
- Use for performance testing and parser benchmarking

## Schemas Directory

### `../schemas/`
- **`d361.schema.json`**: JSON schema for d361 configuration
- Use for configuration validation

## Templates Directory

### `../templates/`
Configuration templates from legacy implementations:
- **`d361.toml.example`**: Project configuration template
- **`d361api.toml.example`**: API client configuration
- Use for setup documentation

## Usage Notes

This test data includes:
- **Production content** from FontLab's Vexy Lines documentation
- **Complete Document360 structure** with metadata
- **Multiple content types**: guides, tutorials, API docs, feature docs
- **Large-scale dataset** for performance testing

## Migration Source

Migrated from:
- `external/int_folders/d362c/example/` (archive and samples)
- `external/int_folders/d362c/` (configuration templates)

Moved during Phase 9 consolidation to preserve test data before cleanup.
</document_content>
</document>

<document index="50">
<source>tests/fixtures/markdown_samples/about-this-guide.md</source>
<document_content>
## Metadata_Start 
## code: en
## title: About this Guide 
## slug: about-this-guide 
## seoTitle: About this Guide 
## description:  
## contentType: Markdown 
## Metadata_End

This user guide is updated continuously. Everyone should read the interface overview article, especially to learn how to manipulate FontLab's panels and dialogs, and understand the difference between tapping and holding keys for tool shortcuts.

The first chapters demonstrate FontLab 7 usage. They're organized in logical learning order, though you can navigate using the links in any sequence. The final chapters serve as references describing all tools and commands, interface controls, and typographic terms and technologies.

The manual concludes with a collection of tutorials. While the core manual explains FontLab 7 functionality, the tutorials show practical applications and techniques you might not discover on your own. We plan to expand this section with additional tutorials.

See the complete list of Keyboard Shortcuts and instructions for Customizing Shortcuts.
</document_content>
</document>

<document index="51">
<source>tests/fixtures/markdown_samples/actions-6.md</source>
<document_content>
## Metadata_Start 
## code: en
## title: Actions 
## slug: actions-6 
## seoTitle: Actions 
## description:  
## contentType: Markdown 
## Metadata_End
</document_content>
</document>

<document index="52">
<source>tests/fixtures/markdown_samples/adding-a-fill.md</source>
<document_content>
## Metadata_Start 
## code: en
## title: Add a First Fill 
## slug: adding-a-fill 
## seoTitle: Add a First Fill 
## description: Learn how to add and customize your first fill in Vexy Lines to transform images into vector art.
## contentType: Markdown 
## Metadata_End

In Vexy Lines, a "fill" turns your reference image into vector art. Fills are line patterns that follow the contours and details of your image. Each type creates a distinct style, giving you plenty of creative options.

## Ways to Add Your First Fill

There are three ways to add your first fill:

### Using the Menu

![image.png](https://cdn.document360.io/f64a08c7-43f3-48cf-ac56-a1facdb8f0ec/Images/Documentation/image-43JGZFBH.png){height="" width="316"}

1. Click **Fills > New** in the top menu  
2. Choose a fill type from the dropdown (see below for descriptions)  
3. The new fill appears in the Layers panel  

### Using the Layers Panel
![image.png](https://cdn.document360.io/f64a08c7-43f3-48cf-ac56-a1facdb8f0ec/Images/Documentation/image-5XG87IRT.png){height="" width="218"}

1. Find the Layers panel (usually on the left)  
2. Click the **"Add new fill"** button at the bottom (+ symbol)  
3. Pick a fill type from the menu  

### In a New Project
![image.png](https://cdn.document360.io/f64a08c7-43f3-48cf-ac56-a1facdb8f0ec/Images/Documentation/image-BM9NYOV7.png){height="" width="218"}

1. In an empty document, click the **"Click to add your first fill"** message in the center of the Layers panel  
2. Select a fill type to start  

## Understanding Fill Types

Here are the available fill types:

### Basic Fills
![Linear fill](https://cdn.document360.io/f64a08c7-43f3-48cf-ac56-a1facdb8f0ec/Images/Documentation/fill-linear.svg) **Linear**: Straight, parallel lines. Good for clean, simple looks.  
![Wave fill](https://cdn.document360.io/f64a08c7-43f3-48cf-ac56-a1facdb8f0ec/Images/Documentation/fill-wave.svg) **Wave**: Curved lines that follow image contours. Adds motion.  
![Radial fill](https://cdn.document360.io/f64a08c7-43f3-48cf-ac56-a1facdb8f0ec/Images/Documentation/fill-radial.svg) **Radial**: Lines radiate outward from a central point. Draws attention inward.  
![Circular fill](https://cdn.document360.io/f64a08c7-43f3-48cf-ac56-a1facdb8f0ec/Images/Documentation/fill-circle.svg) **Circular**: Repeating circles. Works well for round shapes or texture effects.

### Artistic Fills
![Spiral fill](https://cdn.document360.io/f64a08c7-43f3-48cf-ac56-a1facdb8f0ec/Images/Documentation/fill-spiral.svg) **Spiral**: Tightening or expanding spirals. Creates depth.  
![Halftone fill](https://cdn.document360.io/f64a08c7-43f3-48cf-ac56-a1facdb8f0ec/Images/Documentation/fill-halftone.svg) **Halftone**: Dots of varying size, like old newspaper prints.  
![Trace fill](https://cdn.document360.io/f64a08c7-43f3-48cf-ac56-a1facdb8f0ec/Images/Documentation/fill-trace.svg) **Trace**: Follows edges in your image. Best for outline-style results.  
![Wireframe fill](https://cdn.document360.io/f64a08c7-43f3-48cf-ac56-a1facdb8f0ec/Images/Documentation/fill-wireframe.svg) **Wireframe**: Interconnected lines. Looks modern and technical.

### Expressive Fills
![Scribble fill](https://cdn.document360.io/f64a08c7-43f3-48cf-ac56-a1facdb8f0ec/Images/Documentation/fill-scribble%282%29.svg) **Scribble**: Random sketch-like lines. Feels handmade.  
![Fractals fill](https://cdn.document360.io/f64a08c7-43f3-48cf-ac56-a1facdb8f0ec/Images/Documentation/fill-fractals.svg) **Fractals**: Repeating geometric patterns. For complex visuals.  
![Text fill](https://cdn.document360.io/f64a08c7-43f3-48cf-ac56-a1facdb8f0ec/Images/Documentation/fill-text.svg) **Text**: Uses characters to build the image. Words become art.  
![Handmade fill](https://cdn.document360.io/f64a08c7-43f3-48cf-ac56-a1facdb8f0ec/Images/Documentation/fill-handmade%281%29.svg) **Handmade**: Draw custom line paths manually. Maximum control.

> **Beginner Tip**: Start with Linear or Wave fills—they're straightforward and easy to adjust.

## Customizing Your Fill

Once added, select your fill in the Layers panel. Then open the Properties panel (typically on the right) to tweak settings:

![image.png](https://cdn.document360.io/f64a08c7-43f3-48cf-ac56-a1facdb8f0ec/Images/Documentation/image-79ZFZMEK.png){height="" width="285"}

- **Interval**: Controls spacing between lines  
- **Angle**: Rotates the direction of lines  
- **Thickness**: Adjusts line weight  

Other options vary by fill type. Changes update live, so you can see results immediately.

## Tips for Success

- Use one fill type at a time until you know how it behaves  
- Small adjustments to interval or thickness can drastically change the output  
- Layer multiple fills once you’re ready for complexity  
- Reset individual settings if you go too far  
- Save versions frequently to avoid losing good setups

## Common Questions

**"Why doesn't my fill look right?"**  
Your reference image may be too detailed. Simplify the image or increase the interval/thickness values.

**"How do I make my artwork more detailed?"**  
Lower the interval value to add more lines. Try the Trace fill for sharper edge definition.

**"Can I combine different fill types?"**  
Yes. Many users stack multiple fills to create richer visuals.

Ready to build on this? The next section covers working with multiple fills to produce advanced vector designs.
</document_content>
</document>

# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/tests/mkdocs_test_fixtures.py
# Language: python

import pytest
from pathlib import Path
from typing import Dict, Any, List
import tempfile
import json
import yaml
from unittest.mock import Mock, AsyncMock
from d361.core.models import Article, Category, ProjectVersion
from d361.mkdocs.exporters.mkdocs_exporter import MkDocsExporter
from d361.mkdocs.exporters.config_generator import ConfigGenerator
from d361.providers.mock_provider import MockProvider
import zipfile
import json

class MkDocsTestHelpers:

def sample_mkdocs_articles(()) -> List[Article]:

def sample_mkdocs_categories(()) -> List[Category]:

def sample_mkdocs_config_context(()) -> Dict[str, Any]:

def mock_mkdocs_provider((
    sample_mkdocs_articles: List[Article],
    sample_mkdocs_categories: List[Category]
)) -> MockProvider:

def mkdocs_config_templates_context(()) -> Dict[str, Dict[str, Any]]:

def expected_mkdocs_config_structure(()) -> Dict[str, Any]:

def mkdocs_test_exporter((
    test_data_dir: Path,
    mock_mkdocs_provider: MockProvider
)) -> MkDocsExporter:

def validate_mkdocs_config((config_yaml: str)) -> Dict[str, Any]:

def create_test_mkdocs_structure((base_dir: Path)) -> Path:

def count_markdown_files((docs_dir: Path)) -> int:

def extract_navigation_items((config: Dict[str, Any])) -> List[str]:

def extract_items((items)):

def mkdocs_test_helpers(()) -> MkDocsTestHelpers:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/tests/offline/test_content.py
# Language: python

import pytest
from unittest.mock import AsyncMock, MagicMock, patch
from pathlib import Path
from d361.offline.content import extract_page_content
from d361.offline.config import Config

def mock_config((tmp_path: Path)) -> Config:

def mock_page(()) -> MagicMock:

def sample_page_content(()) -> dict[str, str]:

def test_extract_page_content_success((
    mock_config: Config, 
    mock_page: MagicMock, 
    sample_page_content: dict[str, str]
)) -> None:

def test_extract_page_content_no_title((
    mock_config: Config, 
    mock_page: MagicMock
)) -> None:

def test_extract_page_content_no_content((
    mock_config: Config, 
    mock_page: MagicMock
)) -> None:

def test_extract_page_content_with_retries((
    mock_config: Config, 
    mock_page: MagicMock
)) -> None:

def test_extract_page_content_navigation_error((
    mock_config: Config, 
    mock_page: MagicMock
)) -> None:

def test_extract_page_content_cookie_dismissal((
    mock_config: Config, 
    mock_page: MagicMock
)) -> None:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/tests/offline/test_integration.py
# Language: python

import pytest
from unittest.mock import AsyncMock, MagicMock, patch
from pathlib import Path
import json
from d361.offline.config import Config
from d361.offline.d361_offline import D361Offline

def mock_config((tmp_path: Path)) -> Config:

def sample_sitemap_urls(()) -> list[str]:

def sample_navigation(()) -> list[dict]:

def sample_content(()) -> dict[str, dict]:

def test_full_workflow_prep_fetch_build((
    mock_config: Config,
    sample_sitemap_urls: list[str],
    sample_navigation: list[dict],
    sample_content: dict[str, dict]
)) -> None:

def test_prep_phase_only((
    mock_config: Config,
    sample_sitemap_urls: list[str],
    sample_navigation: list[dict]
)) -> None:

def test_fetch_phase_only((
    mock_config: Config,
    sample_sitemap_urls: list[str],
    sample_navigation: list[dict],
    sample_content: dict[str, dict]
)) -> None:

def test_build_phase_only((
    mock_config: Config,
    sample_navigation: list[dict],
    sample_content: dict[str, dict]
)) -> None:

def test_error_handling_in_fetch((
    mock_config: Config,
    sample_sitemap_urls: list[str],
    sample_navigation: list[dict]
)) -> None:

def test_concurrent_processing((
    mock_config: Config,
    sample_sitemap_urls: list[str],
    sample_navigation: list[dict],
    sample_content: dict[str, dict]
)) -> None:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/tests/offline/test_navigation.py
# Language: python

import pytest
from unittest.mock import AsyncMock, MagicMock, patch
from pathlib import Path
from d361.offline.navigation import extract_navigation, extract_tree_structure
from d361.offline.config import Config

def mock_config((tmp_path: Path)) -> Config:

def mock_page(()) -> MagicMock:

def sample_navigation_data(()) -> list[dict]:

def test_extract_navigation_success((
    mock_config: Config, 
    mock_page: MagicMock, 
    sample_navigation_data: list[dict]
)) -> None:

def test_extract_navigation_no_tree_found((
    mock_config: Config, 
    mock_page: MagicMock
)) -> None:

def test_extract_navigation_with_cookie_dismissal((
    mock_config: Config, 
    mock_page: MagicMock
)) -> None:

def test_extract_tree_structure_simple(()) -> None:

def test_extract_tree_structure_nested(()) -> None:

def test_extract_tree_structure_empty(()) -> None:

def test_extract_tree_structure_malformed(()) -> None:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/tests/offline/test_offline_core.py
# Language: python

import pytest
from pathlib import Path
from d361.offline.config import Config
from d361.offline.d361_offline import D361Offline
from typing import Any
import pytest
from pydantic import BaseModel, AnyHttpUrl, computed_field

class MinimalConfig(B, a, s, e, M, o, d, e, l):

def default_config_dict(()) -> dict[str, str]:

def default_config((default_config_dict: dict[str, str], tmp_path: Path)) -> Config:

def d361_offline_instance((default_config: Config)) -> D361Offline:

def test_config_creation((default_config_dict: dict[str, str], tmp_path: Path)) -> None:

def test_d361_offline_initialization((d361_offline_instance: D361Offline, default_config: Config)) -> None:

def test_config_root_domain_extraction_and_paths((tmp_path: Path)) -> None:

def test_config_output_dir_explicit_settings((tmp_path: Path)) -> None:

def test_minimal_config_root_domain(()) -> None:

def domain((self)) -> str:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/tests/offline/test_parser.py
# Language: python

import pytest
from unittest.mock import AsyncMock, MagicMock, patch
from pathlib import Path
from d361.offline.parser import parse_sitemap
from d361.offline.config import Config

def mock_config((tmp_path: Path)) -> Config:

def sample_sitemap_xml(()) -> str:

def test_parse_sitemap_success((mock_config: Config, sample_sitemap_xml: str)) -> None:

def test_parse_sitemap_fallback_methods((mock_config: Config, sample_sitemap_xml: str)) -> None:

def test_parse_sitemap_empty_result((mock_config: Config)) -> None:

def test_parse_sitemap_duplicate_urls((mock_config: Config)) -> None:

def test_parse_sitemap_all_methods_fail((mock_config: Config)) -> None:

def test_parse_sitemap_malformed_xml((mock_config: Config)) -> None:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/tests/test_integration_api.py
# Language: python

import asyncio
import json
import pytest
from unittest.mock import patch, AsyncMock, Mock
from typing import Dict, List, Any
from datetime import datetime, timedelta
import httpx
from d361.api import (
    Document360ApiClient,
    TokenManager,
    TokenStats,
    RateLimiter,
    BulkOperationManager,
    SmartBulkProcessor,
    ChunkedDownloader,
    CircuitBreaker,
    DataSyncManager,
    ApiMetrics
)
from d361.api.errors import (
    Document360Error,
    AuthenticationError,
    RateLimitError,
    NotFoundError
)
from d361.core.models import Article, Category
from d361.config import ApiConfig
from d361.config import ApiConfig
from d361.config import ApiConfig
from d361.config import ApiConfig
from d361.config import ApiConfig
from d361.config import ApiConfig
from d361.api.circuit_breaker import CircuitBreakerConfig
from d361.config import ApiConfig
from d361.api.circuit_breaker import CircuitBreakerConfig
from d361.api.data_sync import SyncConfig
from d361.api.data_sync import SyncConfig
from d361.api.metrics import MetricsConfig
from d361.config import ApiConfig
from d361.api.metrics import MetricsConfig
from d361.config import ApiConfig
from d361.config import ApiConfig
from d361.config import ApiConfig

class MockHttpServer:
    def __init__((self)):
    def add_response((self, method: str, path: str, response: Dict[str, Any], status_code: int = 200)):
    def get_response((self, method: str, path: str)) -> tuple:

class TestDocument360ApiClientIntegration:

class TestTokenManagerIntegration:

class TestCircuitBreakerIntegration:

class TestDataSyncManagerIntegration:

class TestApiMetricsIntegration:

class TestIntegrationEndToEnd:

def __init__((self)):

def add_response((self, method: str, path: str, response: Dict[str, Any], status_code: int = 200)):

def get_response((self, method: str, path: str)) -> tuple:

def mock_server(()):

def test_api_client_initialization((self)):

def test_api_client_with_mock_server((self, mock_server)):

def test_api_client_error_handling((self, mock_server)):

def test_api_client_authentication_flow((self)):

def test_api_client_rate_limiting((self)):

def test_api_client_bulk_operations((self, mock_server)):

def test_token_manager_with_multiple_tokens((self)):

def test_token_manager_load_balancing((self)):

def test_token_manager_health_monitoring((self)):

def test_token_manager_stats_tracking((self)):

def test_circuit_breaker_state_transitions((self)):

def test_circuit_breaker_with_api_client((self, mock_server)):

def test_data_sync_manager_deduplication((self)):

def test_data_sync_manager_incremental_sync((self)):

def test_api_metrics_collection((self)):

def test_api_metrics_with_client((self, mock_server)):

def test_complete_api_workflow((self, mock_server)):

def test_high_load_integration((self)):

def test_error_recovery_integration((self)):

def mock_request((*args, **kwargs)):


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/tests/test_mkdocs_integration.py
# Language: python

import asyncio
import tempfile
from pathlib import Path
from typing import Dict, Any, List
from unittest.mock import Mock, patch, AsyncMock
import yaml
import pytest
from d361.core.models import Article, Category
from d361.mkdocs.exporters.mkdocs_exporter import MkDocsExporter
from d361.mkdocs.exporters.config_generator import ConfigGenerator
from d361.mkdocs.exporters.navigation_builder import NavigationBuilder
from d361.mkdocs.processors.content_enhancer import ContentEnhancer
from d361.mkdocs.processors.asset_manager import AssetManager
from d361.mkdocs.processors.cross_reference_resolver import CrossReferenceResolver
from d361.providers.mock_provider import MockProvider
from d361.api.errors import Document360Error

class TestConfigGenerator:
    def test_validate_final_config((self, config_generator: ConfigGenerator)):
    def test_validate_invalid_config((self, config_generator: ConfigGenerator)):

class TestContentEnhancer:

class TestAssetManager:

class TestCrossReferenceResolver:
    def test_initialization((self, cross_reference_resolver: CrossReferenceResolver, sample_articles: List[Article])):

class TestNavigationBuilder:

class TestMkDocsExporter:

class TestIntegrationWorkflow:

def mkdocs_output_dir((test_data_dir: Path)) -> Path:

def config_generator(()) -> ConfigGenerator:

def navigation_builder(()) -> NavigationBuilder:

def content_enhancer(()) -> ContentEnhancer:

def asset_manager((mkdocs_output_dir: Path)) -> AssetManager:

def cross_reference_resolver((sample_articles: List[Article])) -> CrossReferenceResolver:

def mkdocs_exporter((mkdocs_output_dir: Path, mock_archive_file: Path)) -> MkDocsExporter:

def test_generate_basic_config((self, config_generator: ConfigGenerator)):

def test_generate_config_from_template((self, config_generator: ConfigGenerator)):

def test_validate_final_config((self, config_generator: ConfigGenerator)):

def test_validate_invalid_config((self, config_generator: ConfigGenerator)):

def test_template_validation_missing_template((self, config_generator: ConfigGenerator)):

def test_template_validation_missing_context((self, config_generator: ConfigGenerator)):

def test_enhance_article_basic((self, content_enhancer: ContentEnhancer, sample_article: Article)):

def test_content_processing_headings((self, content_enhancer: ContentEnhancer)):

def test_link_processing((self, content_enhancer: ContentEnhancer)):

def test_quality_assessment((self, content_enhancer: ContentEnhancer)):

def test_process_assets_basic((self, asset_manager: AssetManager)):

def test_copy_assets((self, asset_manager: AssetManager, test_data_dir: Path)):

def test_initialization((self, cross_reference_resolver: CrossReferenceResolver, sample_articles: List[Article])):

def test_resolve_internal_links((self, cross_reference_resolver: CrossReferenceResolver)):

def test_build_navigation_basic((
        self, 
        navigation_builder: NavigationBuilder, 
        sample_articles: List[Article], 
        sample_category: Category
    )):

def test_build_hierarchical_navigation((self, navigation_builder: NavigationBuilder)):

def test_initialization((self, mkdocs_exporter: MkDocsExporter)):

def test_export_basic_flow((self, mkdocs_exporter: MkDocsExporter)):

def test_export_validation((self, mkdocs_exporter: MkDocsExporter, mkdocs_output_dir: Path)):

def test_export_error_handling((self, mkdocs_output_dir: Path)):

def test_parallel_processing_disabled((self, mkdocs_exporter: MkDocsExporter)):

def test_complete_export_workflow((
        self,
        mock_archive_file: Path,
        mkdocs_output_dir: Path
    )):

def test_template_integration((self, mkdocs_output_dir: Path)):

def test_error_propagation((self, mkdocs_output_dir: Path)):


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/tests/test_mkdocs_units.py
# Language: python

import pytest
from unittest.mock import Mock, patch, MagicMock
from pathlib import Path
from typing import Dict, Any, List
import yaml
from d361.core.models import Article, Category
from d361.mkdocs.exporters.config_generator import ConfigGenerator
from d361.mkdocs.exporters.navigation_builder import NavigationBuilder
from d361.mkdocs.exporters.theme_optimizer import ThemeOptimizer
from d361.mkdocs.processors.content_enhancer import ContentEnhancer
from d361.mkdocs.processors.markdown_processor import MarkdownProcessor
from d361.mkdocs.processors.asset_manager import AssetManager
from d361.mkdocs.processors.cross_reference_resolver import (
    CrossReferenceResolver, 
    LinkReference, 
    AnchorReference
)
from d361.api.errors import Document360Error
from datetime import datetime
from datetime import datetime
from datetime import datetime
import tempfile
from datetime import datetime
from datetime import datetime

class TestConfigGeneratorUnit:
    def test_init_default_theme((self)):
    def test_init_custom_theme((self)):
    def test_yaml_filter((self)):
    def test_build_base_config_minimal((self)):
    def test_build_base_config_complete((self)):
    def test_build_material_theme_config((self)):
    def test_build_readthedocs_theme_config((self)):
    def test_build_plugins_config_disabled((self)):
    def test_build_plugins_config_enabled((self)):
    def test_build_markdown_extensions((self)):
    def test_merge_configs((self)):

class TestNavigationBuilderUnit:
    def test_init((self)):

class TestContentEnhancerUnit:
    def test_init_default((self)):
    def test_init_custom((self)):
    def test_extract_description_basic((self)):
    def test_extract_description_long((self)):
    def test_extract_description_with_markdown((self)):
    def test_normalize_headings((self)):
    def test_process_links_internal((self)):
    def test_process_links_external((self)):
    def test_process_images((self)):
    def test_enhance_code_blocks((self)):
    def test_assess_quality_high((self)):
    def test_assess_quality_low((self)):
    def test_generate_file_path((self)):

class TestAssetManagerUnit:
    def test_init_default((self)):
    def test_init_custom((self)):
    def test_extract_assets_from_content((self)):

class TestCrossReferenceResolverUnit:
    def test_init_basic((self)):
    def test_init_with_options((self)):
    def test_link_reference_creation((self)):
    def test_anchor_reference_creation((self)):

class TestThemeOptimizerUnit:
    def test_init_default((self)):
    def test_init_material_theme((self)):

class TestMarkdownProcessorUnit:
    def test_init((self)):

def test_init_default_theme((self)):

def test_init_custom_theme((self)):

def test_yaml_filter((self)):

def test_build_base_config_minimal((self)):

def test_build_base_config_complete((self)):

def test_build_material_theme_config((self)):

def test_build_readthedocs_theme_config((self)):

def test_build_plugins_config_disabled((self)):

def test_build_plugins_config_enabled((self)):

def test_build_markdown_extensions((self)):

def test_merge_configs((self)):

def test_init((self)):

def test_build_navigation_empty((self)):

def test_build_navigation_articles_only((self)):

def test_build_navigation_with_categories((self)):

def test_init_default((self)):

def test_init_custom((self)):

def test_extract_description_basic((self)):

def test_extract_description_long((self)):

def test_extract_description_with_markdown((self)):

def test_normalize_headings((self)):

def test_process_links_internal((self)):

def test_process_links_external((self)):

def test_process_images((self)):

def test_enhance_code_blocks((self)):

def test_assess_quality_high((self)):

def test_assess_quality_low((self)):

def test_generate_file_path((self)):

def test_init_default((self)):

def test_init_custom((self)):

def test_extract_assets_from_content((self)):

def test_process_assets_empty_content((self)):

def test_process_assets_no_images((self)):

def test_init_basic((self)):

def test_init_with_options((self)):

def test_link_reference_creation((self)):

def test_anchor_reference_creation((self)):

def test_init_default((self)):

def test_init_material_theme((self)):

def test_optimize_empty_content((self)):

def test_init((self)):

def test_convert_empty((self)):

def test_convert_basic_markdown((self)):


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/tests/test_package.py
# Language: python

import d361

def test_version(()) -> None:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/tests/test_performance.py
# Language: python

import asyncio
import gc
import time
import psutil
import pytest
from pathlib import Path
from typing import List, Dict, Any, Callable
from unittest.mock import AsyncMock, Mock
from datetime import datetime
from statistics import mean, median
from d361.core.models import Article, Category, ProjectVersion
from d361.providers import MockProvider
from d361.archive import SqliteCache, ArchiveParser
from d361.api import Document360ApiClient, TokenManager, BulkOperationManager
from d361.config import AppConfig, Environment
from d361.utils import PerformanceOptimizer
from datetime import datetime
from d361.archive.cache import CacheConfig
from d361.archive.schema import create_archive_schema
import aiosqlite
from d361.archive.cache import CacheConfig
from d361.api.token_manager import RateLimiter
from d361.archive.cache import CacheConfig
from d361.config import ApiConfig
from d361.mkdocs.exporters.mkdocs_exporter import MkDocsExporter
from unittest.mock import AsyncMock, patch
from d361.mkdocs.exporters.mkdocs_exporter import MkDocsExporter
from d361.mkdocs.exporters.mkdocs_exporter import MkDocsExporter
from d361.core.models import Article
from unittest.mock import patch
from datetime import datetime
from d361.mkdocs.exporters.config_generator import ConfigGenerator
import yaml
from d361.mkdocs.exporters.config_generator import ConfigGenerator
import yaml
from d361.mkdocs.exporters.config_generator import ConfigGenerator
import yaml
from d361.mkdocs.exporters.config_generator import ConfigGenerator
import yaml
from d361.mkdocs.exporters.config_generator import ConfigGenerator
import yaml
from d361.mkdocs.exporters.config_generator import ConfigGenerator
import yaml
from d361.mkdocs.exporters.config_generator import ConfigGenerator
import yaml

class PerformanceBenchmark:
    def __init__((self)):
    def measure_time((self, func_name: str)):
    def get_stats((self, func_name: str)) -> Dict[str, Any]:
    def reset((self)):

class TestDatabasePerformance:

class TestApiPerformance:

class TestMemoryPerformance:

class TestPerformanceOptimization:

class TestLoadTesting:

class TestMkDocsExportPerformance:

class TestMkDocsTemplateSystem:

def __init__((self)):

def measure_time((self, func_name: str)):

def decorator((func)):

def async_wrapper((*args, **kwargs)):

def get_stats((self, func_name: str)) -> Dict[str, Any]:

def reset((self)):

def performance_benchmark(()):

def large_dataset(()):

def test_sqlite_cache_insert_performance((self, test_database, performance_benchmark, large_dataset)):

def bulk_insert(()):

def query_test(()):

def test_full_text_search_performance((self, test_database, performance_benchmark, large_dataset)):

def search_test(()):

def test_concurrent_database_access((self, test_database, performance_benchmark)):

def concurrent_operations(()):

def write_task((index)):

def read_task((index)):

def test_token_manager_performance((self, performance_benchmark)):

def token_operations(()):

def test_rate_limiting_performance((self, performance_benchmark)):

def rate_limit_test(()):

def make_request((request_id)):

def test_bulk_operations_performance((self, performance_benchmark, large_dataset)):

def bulk_test(()):

def test_model_memory_usage((self, performance_benchmark, large_dataset)):

def create_models(()):

def serialize_models(()):

def test_cache_memory_efficiency((self, performance_benchmark, test_database)):

def cache_operations(()):

def test_provider_memory_scaling((self, performance_benchmark)):

def provider_operations(()):

def test_performance_optimizer_efficiency((self, performance_benchmark, test_data_dir)):

def expensive_operation((data_id: str)):

def test_caching_efficiency(()):

def test_concurrent_api_load((self, performance_benchmark)):

def simulate_load(()):

def api_call((call_id)):

def performance_report((request)):

def generate_report(()):

def test_mkdocs_export_large_project_timing((self, performance_benchmark, large_dataset, tmp_path)):

def export_large_project(()):

def test_mkdocs_export_memory_efficiency((self, performance_benchmark, tmp_path)):

def create_and_configure_exporter(()):

def test_mkdocs_export_scalability_benchmark((self, performance_benchmark, tmp_path)):

def export_dataset(()):

def test_mkdocs_base_template_rendering((self)):

def test_mkdocs_base_template_full_context((self)):

def test_material_theme_template_rendering((self)):

def test_plugin_configs_template_rendering((self)):

def test_template_edge_cases_and_validation((self)):

def test_template_filter_applications((self)):

def test_template_conditional_rendering((self)):


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/tests/test_plugin_manager_enhanced.py
# Language: python

import pytest
from typing import Dict, Any, List
from unittest.mock import Mock, patch, AsyncMock
from d361.mkdocs.processors.plugin_manager import (
    PluginManager,
    MarkdownExtensionManager,
    PluginConfig,
    PluginSet
)
from d361.api.errors import Document360Error

class TestPluginConfig:
    def test_plugin_config_creation((self)):
    def test_plugin_config_to_dict_with_config((self)):
    def test_plugin_config_to_dict_without_config((self)):
    def test_plugin_config_defaults((self)):

class TestPluginSet:
    def test_plugin_set_creation((self)):
    def test_plugin_set_defaults((self)):

class TestPluginManagerInitialization:
    def test_init_default_settings((self)):
    def test_init_material_theme((self)):
    def test_init_readthedocs_theme((self)):
    def test_init_custom_theme((self)):

class TestCorePluginSets:
    def test_core_plugins_initialization((self)):
    def test_seo_plugins_initialization_material((self)):
    def test_seo_plugins_initialization_readthedocs((self)):
    def test_performance_plugins_initialization((self)):
    def test_performance_plugins_with_offline((self)):
    def test_accessibility_plugins_initialization((self)):
    def test_advanced_plugins_initialization((self)):
    def test_advanced_plugins_with_github_url((self)):

class TestOptimalPluginSelection:

class TestPluginDependencies:
    def test_get_installation_guide((self)):

class TestPluginValidation:
    def test_validate_plugin_configuration_valid((self)):
    def test_validate_plugin_configuration_missing_search((self)):
    def test_validate_plugin_configuration_suggestions((self)):
    def test_validate_plugin_configuration_theme_specific((self)):

class TestMarkdownExtensionManager:
    def test_markdown_extension_manager_init((self)):
    def test_get_core_extensions((self)):
    def test_get_enhanced_extensions((self)):
    def test_get_advanced_extensions((self)):
    def test_get_advanced_extensions_material_theme((self)):
    def test_get_optimal_extensions_default((self)):
    def test_get_optimal_extensions_minimal((self)):
    def test_extension_configuration_details((self)):

class TestIntegrationScenarios:
    def test_extension_manager_workflow((self)):

def test_plugin_config_creation((self)):

def test_plugin_config_to_dict_with_config((self)):

def test_plugin_config_to_dict_without_config((self)):

def test_plugin_config_defaults((self)):

def test_plugin_set_creation((self)):

def test_plugin_set_defaults((self)):

def test_init_default_settings((self)):

def test_init_material_theme((self)):

def test_init_readthedocs_theme((self)):

def test_init_custom_theme((self)):

def test_core_plugins_initialization((self)):

def test_seo_plugins_initialization_material((self)):

def test_seo_plugins_initialization_readthedocs((self)):

def test_performance_plugins_initialization((self)):

def test_performance_plugins_with_offline((self)):

def test_accessibility_plugins_initialization((self)):

def test_advanced_plugins_initialization((self)):

def test_advanced_plugins_with_github_url((self)):

def test_get_optimal_plugins_default((self)):

def test_get_optimal_plugins_minimal((self)):

def test_get_optimal_plugins_full_features((self)):

def test_get_optimal_plugins_with_custom((self)):

def test_theme_compatibility_filtering((self)):

def test_get_plugin_dependencies_basic((self)):

def test_get_plugin_dependencies_minimal((self)):

def test_get_installation_guide((self)):

def test_validate_plugin_configuration_valid((self)):

def test_validate_plugin_configuration_missing_search((self)):

def test_validate_plugin_configuration_suggestions((self)):

def test_validate_plugin_configuration_theme_specific((self)):

def test_markdown_extension_manager_init((self)):

def test_get_core_extensions((self)):

def test_get_enhanced_extensions((self)):

def test_get_advanced_extensions((self)):

def test_get_advanced_extensions_material_theme((self)):

def test_get_optimal_extensions_default((self)):

def test_get_optimal_extensions_minimal((self)):

def test_extension_configuration_details((self)):

def test_complete_plugin_workflow((self)):

def test_extension_manager_workflow((self)):


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/tests/test_seo_optimizer_enhanced.py
# Language: python

import pytest
import json
from datetime import datetime, timezone
from typing import Dict, Any, List
from unittest.mock import Mock, patch, AsyncMock
from d361.mkdocs.processors.seo_optimizer import (
    SEOOptimizer,
    SEOMetadata,
    StructuredData
)
from d361.api.errors import Document360Error

class TestSEOMetadata:
    def test_seo_metadata_creation((self)):
    def test_seo_metadata_to_frontmatter((self)):
    def test_seo_metadata_defaults((self)):

class TestStructuredData:
    def test_structured_data_creation((self)):
    def test_structured_data_to_json_ld((self)):
    def test_structured_data_minimal((self)):

class TestSEOOptimizerInitialization:
    def test_init_minimal((self)):
    def test_init_complete((self, sample_seo_optimizer)):
    def test_url_parsing((self)):

class TestMetadataGeneration:
    def test_generate_description_from_content((self, sample_seo_optimizer, sample_content)):
    def test_generate_description_truncation((self, sample_seo_optimizer)):
    def test_generate_description_markdown_cleaning((self, sample_seo_optimizer)):

class TestStructuredDataGeneration:

class TestConfigurationGeneration:
    def test_generate_social_media_config((self, sample_seo_optimizer)):
    def test_generate_analytics_config_basic((self, sample_seo_optimizer)):
    def test_generate_analytics_config_with_google((self, sample_seo_optimizer)):
    def test_generate_analytics_config_no_feedback((self, sample_seo_optimizer)):
    def test_generate_performance_config((self, sample_seo_optimizer)):
    def test_generate_accessibility_config((self, sample_seo_optimizer)):

class TestSEOValidation:
    def test_validate_seo_config_valid((self, sample_seo_optimizer)):
    def test_validate_seo_config_missing_required((self, sample_seo_optimizer)):
    def test_validate_seo_config_warnings((self, sample_seo_optimizer)):
    def test_validate_seo_config_suggestions((self, sample_seo_optimizer)):

class TestSitemapGeneration:

class TestIntegrationScenarios:
    def test_edge_case_empty_inputs((self, sample_seo_optimizer)):
    def test_url_handling_edge_cases((self)):

def sample_seo_optimizer(()):

def sample_content(()):

def test_seo_metadata_creation((self)):

def test_seo_metadata_to_frontmatter((self)):

def test_seo_metadata_defaults((self)):

def test_structured_data_creation((self)):

def test_structured_data_to_json_ld((self)):

def test_structured_data_minimal((self)):

def test_init_minimal((self)):

def test_init_complete((self, sample_seo_optimizer)):

def test_url_parsing((self)):

def test_generate_page_metadata_basic((self, sample_seo_optimizer, sample_content)):

def test_generate_page_metadata_with_overrides((self, sample_seo_optimizer, sample_content)):

def test_generate_page_metadata_empty_content((self, sample_seo_optimizer)):

def test_generate_description_from_content((self, sample_seo_optimizer, sample_content)):

def test_generate_description_truncation((self, sample_seo_optimizer)):

def test_generate_description_markdown_cleaning((self, sample_seo_optimizer)):

def test_generate_structured_data_complete((self, sample_seo_optimizer, sample_content)):

def test_generate_structured_data_minimal((self, sample_seo_optimizer)):

def test_generate_structured_data_with_dates((self, sample_seo_optimizer)):

def test_structured_data_json_ld_output((self, sample_seo_optimizer)):

def test_generate_social_media_config((self, sample_seo_optimizer)):

def test_generate_analytics_config_basic((self, sample_seo_optimizer)):

def test_generate_analytics_config_with_google((self, sample_seo_optimizer)):

def test_generate_analytics_config_no_feedback((self, sample_seo_optimizer)):

def test_generate_performance_config((self, sample_seo_optimizer)):

def test_generate_accessibility_config((self, sample_seo_optimizer)):

def test_validate_seo_config_valid((self, sample_seo_optimizer)):

def test_validate_seo_config_missing_required((self, sample_seo_optimizer)):

def test_validate_seo_config_warnings((self, sample_seo_optimizer)):

def test_validate_seo_config_suggestions((self, sample_seo_optimizer)):

def test_generate_sitemap_urls_basic((self, sample_seo_optimizer)):

def test_generate_sitemap_urls_with_custom_maps((self, sample_seo_optimizer)):

def test_generate_sitemap_urls_date_handling((self, sample_seo_optimizer)):

def test_complete_seo_workflow((self, sample_seo_optimizer, sample_content)):

def test_multilingual_support((self)):

def test_edge_case_empty_inputs((self, sample_seo_optimizer)):

def test_url_handling_edge_cases((self)):


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/tests/test_theme_optimizer_enhanced.py
# Language: python

import pytest
import tempfile
import yaml
from pathlib import Path
from typing import Dict, Any, List
from unittest.mock import Mock, patch, AsyncMock
from d361.core.models import Article, Category
from d361.mkdocs.exporters.theme_optimizer import ThemeOptimizer
from d361.api.errors import Document360Error
from datetime import datetime
from datetime import datetime
from datetime import datetime

class TestThemeOptimizerInitialization:
    def test_init_default_settings((self)):
    def test_init_material_theme((self)):
    def test_init_readthedocs_theme((self)):
    def test_init_custom_theme((self)):
    def test_init_with_custom_assets((self)):

class TestMaterialThemeOptimization:
    def test_material_config_updates((self)):

class TestReadTheDocsThemeOptimization:
    def test_readthedocs_config_updates((self)):

class TestGenericThemeOptimization:
    def test_generic_config_updates((self)):

class TestCustomAssetsHandling:

class TestOptimizationControl:
    def test_theme_settings_retrieval((self)):

class TestIntegrationScenarios:
    def test_config_updates_merging((self)):

def sample_articles(()) -> List[Article]:

def sample_categories(()) -> List[Category]:

def temp_output_dir(()):

def test_init_default_settings((self)):

def test_init_material_theme((self)):

def test_init_readthedocs_theme((self)):

def test_init_custom_theme((self)):

def test_init_with_custom_assets((self)):

def test_material_theme_optimization((
        self, 
        sample_articles: List[Article],
        sample_categories: List[Category],
        temp_output_dir: Path
    )):

def test_material_css_generation((self, temp_output_dir: Path)):

def test_material_js_generation((self, temp_output_dir: Path)):

def test_material_social_cards_setup((self, temp_output_dir: Path)):

def test_material_config_updates((self)):

def test_readthedocs_theme_optimization((
        self,
        sample_articles: List[Article],
        sample_categories: List[Category], 
        temp_output_dir: Path
    )):

def test_readthedocs_config_updates((self)):

def test_generic_theme_optimization((
        self,
        sample_articles: List[Article],
        sample_categories: List[Category],
        temp_output_dir: Path
    )):

def test_generic_config_updates((self)):

def test_custom_css_handling((self, temp_output_dir: Path)):

def test_custom_js_handling((self, temp_output_dir: Path)):

def test_missing_custom_files_warning((self, temp_output_dir: Path)):

def test_optimizations_disabled((
        self,
        sample_articles: List[Article],
        sample_categories: List[Category],
        temp_output_dir: Path
    )):

def test_theme_settings_retrieval((self)):

def test_empty_content_optimization((self, temp_output_dir: Path)):

def test_large_content_optimization((self, temp_output_dir: Path)):

def test_directory_creation_edge_cases((self, temp_output_dir: Path)):

def test_config_updates_merging((self)):


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/tests/test_unit_config.py
# Language: python

import os
import json
import tempfile
from pathlib import Path
from typing import Dict, Any
from unittest.mock import Mock, patch, AsyncMock
import pytest
from pydantic import ValidationError
from d361.config import (
    AppConfig,
    Environment,
    SecretProvider,
    SecretType,
    EnvironmentLoader,
    SecretsManager,
    ConfigLoader,
    ConfigValidator,
    SecretMetadata,
    SecretValue,
    EnvironmentSecretsProvider,
    LocalFileSecretsProvider
)
from d361.api.errors import Document360Error
from d361.config import SecurityConfig
from d361.config import SecurityConfig
from d361.config import SecurityConfig
from d361.config import SecurityConfig
from d361.config import SecurityConfig

class TestAppConfig:
    def test_app_config_creation_defaults((self)):
    def test_app_config_environment_override((self)):
    def test_app_config_nested_models((self)):
    def test_app_config_validation((self)):
    def test_app_config_production_validation((self)):
    def test_app_config_feature_flags((self)):
    def test_app_config_serialization((self)):
    def test_app_config_from_dict((self)):
    def test_app_config_environment_variables((self)):

class TestEnvironmentLoader:
    def test_environment_detection((self, test_data_dir)):
    def test_environment_detection_with_override((self, test_data_dir)):
    def test_environment_detection_from_env_var((self, test_data_dir)):
    def test_dotenv_file_loading((self, test_data_dir, test_helpers)):
    def test_config_file_paths((self, test_data_dir, test_helpers)):
    def test_env_file_paths((self, test_data_dir, test_helpers)):
    def test_hot_reload_setup((self, test_data_dir)):
    def test_config_summary((self, test_data_dir)):

class TestSecretsProviders:

class TestSecretsManager:

class TestConfigLoader:
    def test_config_loader_summary((self, test_data_dir)):

class TestConfigValidator:
    def test_config_validator_creation((self)):
    def test_config_validator_production_rules((self)):
    def test_config_validator_development_rules((self)):
    def test_config_validator_custom_rule((self)):
    def test_config_validator_resource_limits((self)):
    def test_config_validator_network_settings((self)):

class TestConfigurationEdgeCases:
    def test_invalid_environment_values((self)):
    def test_missing_required_fields((self)):
    def test_config_with_invalid_nested_values((self)):
    def test_config_serialization_edge_cases((self)):

def test_app_config_creation_defaults((self)):

def test_app_config_environment_override((self)):

def test_app_config_nested_models((self)):

def test_app_config_validation((self)):

def test_app_config_production_validation((self)):

def test_app_config_feature_flags((self)):

def test_app_config_serialization((self)):

def test_app_config_from_dict((self)):

def test_app_config_environment_variables((self)):

def test_environment_detection((self, test_data_dir)):

def test_environment_detection_with_override((self, test_data_dir)):

def test_environment_detection_from_env_var((self, test_data_dir)):

def test_dotenv_file_loading((self, test_data_dir, test_helpers)):

def test_config_file_paths((self, test_data_dir, test_helpers)):

def test_env_file_paths((self, test_data_dir, test_helpers)):

def test_configuration_loading((self, test_data_dir, test_helpers)):

def test_hot_reload_setup((self, test_data_dir)):

def test_config_summary((self, test_data_dir)):

def test_environment_secrets_provider((self)):

def test_environment_secrets_provider_missing_secret((self)):

def test_local_file_secrets_provider((self, test_data_dir)):

def test_local_file_secrets_provider_list((self, test_data_dir)):

def test_secrets_provider_health_check((self, test_data_dir)):

def test_secrets_manager_initialization((self, test_data_dir)):

def test_secrets_manager_auto_detection((self)):

def test_secrets_manager_fallback((self, test_data_dir)):

def test_secrets_manager_secret_operations((self, test_data_dir)):

def test_secrets_manager_health_check((self, test_data_dir)):

def test_secrets_manager_provider_info((self, test_data_dir)):

def test_config_loader_initialization((self, test_data_dir)):

def test_config_loader_load_configuration((self, test_data_dir, test_helpers)):

def test_config_loader_validation((self, test_data_dir)):

def test_config_loader_with_secrets((self, test_data_dir)):

def test_config_loader_summary((self, test_data_dir)):

def test_config_validator_creation((self)):

def test_config_validator_production_rules((self)):

def test_config_validator_development_rules((self)):

def test_config_validator_custom_rule((self)):

def custom_rule((config: AppConfig)) -> list[str]:

def test_config_validator_resource_limits((self)):

def test_config_validator_network_settings((self)):

def test_invalid_environment_values((self)):

def test_missing_required_fields((self)):

def test_config_with_invalid_nested_values((self)):

def test_config_loading_with_corrupted_files((self, test_data_dir, test_helpers)):

def test_secrets_with_provider_failures((self)):

def test_config_serialization_edge_cases((self)):

def sample_config_data(()) -> Dict[str, Any]:

def production_config_data(()) -> Dict[str, Any]:


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/tests/test_unit_models.py
# Language: python

import pytest
from datetime import datetime, timezone
from typing import Any, Dict, List
from pydantic import ValidationError
from d361.core.models import (
    Article, 
    Category, 
    ProjectVersion, 
    PublishStatus, 
    ContentType
)
import time
import time

class TestArticleModel:
    def test_article_creation_valid((self)):
    def test_article_slug_auto_generation((self)):
    def test_article_title_validation((self)):
    def test_article_content_validation((self)):
    def test_article_status_validation((self)):
    def test_article_dates_validation((self)):
    def test_article_tags_validation((self)):
    def test_article_serialization((self)):
    def test_article_deserialization((self)):
    def test_article_equality((self)):
    def test_article_hash((self)):
    def test_article_word_count((self)):

class TestCategoryModel:
    def test_category_creation_valid((self)):
    def test_category_slug_generation((self)):
    def test_category_hierarchical_structure((self)):
    def test_category_ordering((self)):
    def test_category_validation_errors((self)):
    def test_category_serialization((self)):

class TestProjectVersionModel:
    def test_project_version_creation((self)):
    def test_project_version_semantic_versioning((self)):
    def test_project_version_comparison((self)):
    def test_project_version_default_flag((self)):
    def test_project_version_dates((self)):
    def test_project_version_serialization((self)):

class TestEnumModels:
    def test_publish_status_enum((self)):
    def test_content_type_enum((self)):
    def test_enum_validation_errors((self)):

class TestModelEdgeCases:
    def test_model_with_none_values((self)):
    def test_model_with_extra_fields((self)):
    def test_model_field_aliases((self)):
    def test_model_validation_order((self)):
    def test_model_immutability((self)):
    def test_model_copy_and_update((self)):
    def test_model_json_schema((self)):

class TestModelPerformance:

def test_article_creation_valid((self)):

def test_article_slug_auto_generation((self)):

def test_article_title_validation((self)):

def test_article_content_validation((self)):

def test_article_status_validation((self)):

def test_article_dates_validation((self)):

def test_article_tags_validation((self)):

def test_article_serialization((self)):

def test_article_deserialization((self)):

def test_article_equality((self)):

def test_article_hash((self)):

def test_article_word_count((self)):

def test_category_creation_valid((self)):

def test_category_slug_generation((self)):

def test_category_hierarchical_structure((self)):

def test_category_ordering((self)):

def test_category_validation_errors((self)):

def test_category_serialization((self)):

def test_project_version_creation((self)):

def test_project_version_semantic_versioning((self)):

def test_project_version_comparison((self)):

def test_project_version_default_flag((self)):

def test_project_version_dates((self)):

def test_project_version_serialization((self)):

def test_publish_status_enum((self)):

def test_content_type_enum((self)):

def test_enum_validation_errors((self)):

def test_model_with_none_values((self)):

def test_model_with_extra_fields((self)):

def test_model_field_aliases((self)):

def test_model_validation_order((self)):

def test_model_immutability((self)):

def test_invalid_id_values((self, invalid_id)):

def test_all_publish_statuses((self, valid_status)):

def test_model_copy_and_update((self)):

def test_model_json_schema((self)):

def test_article_creation_performance((self)):

def test_model_serialization_performance((self)):


# File: /Users/adam/Developer/vcs/github.twardoch/pub/d361-pkgs/d361/tests/test_unit_providers.py
# Language: python

import pytest
from unittest.mock import Mock, AsyncMock, patch, MagicMock
from typing import List, Dict, Any, Optional
from datetime import datetime
from d361.core.models import Article, Category, ProjectVersion
from d361.core.interfaces import DataProvider
from d361.providers import (
    MockProvider, 
    ApiProvider, 
    ArchiveProvider, 
    HybridProvider
)
from d361.api.errors import Document360Error
import time
from datetime import datetime, timedelta
import time

class TestMockProvider:
    def test_mock_provider_creation((self)):
    def test_mock_provider_custom_parameters((self)):
    def test_mock_provider_consistency((self)):

class TestApiProvider:
    def test_api_provider_creation((self)):

class TestArchiveProvider:

class TestHybridProvider:

class TestProviderIntegration:

def test_mock_provider_creation((self)):

def test_mock_provider_custom_parameters((self)):

def test_mock_provider_list_articles((self)):

def test_mock_provider_get_article((self)):

def test_mock_provider_get_nonexistent_article((self)):

def test_mock_provider_list_categories((self)):

def test_mock_provider_get_category((self)):

def test_mock_provider_list_project_versions((self)):

def test_mock_provider_content_generation((self)):

def test_mock_provider_pagination((self)):

def test_mock_provider_search((self)):

def test_mock_provider_consistency((self)):

def test_api_provider_creation((self)):

def test_api_provider_list_articles((self)):

def test_api_provider_get_article((self)):

def test_api_provider_error_handling((self)):

def test_api_provider_data_transformation((self)):

def test_api_provider_caching((self)):

def test_archive_provider_creation((self, test_database)):

def test_archive_provider_initialization((self, test_database)):

def test_archive_provider_load_archive((self, mock_archive_file)):

def test_archive_provider_list_articles((self, test_database)):

def test_archive_provider_search((self, test_database)):

def test_archive_provider_incremental_updates((self, test_database)):

def test_archive_provider_performance((self, test_database)):

def test_hybrid_provider_creation((self)):

def test_hybrid_provider_source_selection((self)):

def test_hybrid_provider_fallback((self)):

def test_hybrid_provider_data_freshness((self)):

def test_hybrid_provider_caching_strategy((self)):

def test_hybrid_provider_conflict_resolution((self)):

def test_hybrid_provider_performance_metrics((self)):

def test_provider_interface_compliance((self)):

def test_provider_error_consistency((self)):

def test_provider_data_consistency((self)):

def test_provider_performance_characteristics((self)):

def mock_api_client(()):

def configured_providers((test_database, mock_api_client)):


</documents>