# Quick Start Guide | Logmanager

{"<?php $__contextArgs = [];\nif (context()->has($__contextArgs[0])) :\nif (isset($value)) { $__contextPrevious[] = $value; }\n$value = context()->get($__contextArgs[0]); ?>":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://logmanager.com/"},{"@type":"ListItem","position":2,"name":"Documentation","item":"https://logmanager.com/docs/"},{"@type":"ListItem","position":3,"name":"Getting Started"}]} [Documentation](https://logmanager.com/docs/) › **Getting Started** 

# Virtual Logmanager Deployment Guide

Version 4.0.4 and newer · November 2025

  


 

  ### On this page

- [Introduction](#introduction)
- [Overview](#overview)
- [Requirements](#requirements)
- [Deploy the VM](#deployment)
- [Configure CLI networking](#configure-vm)
- [Login to Web UI](#web-ui)
 
 

### Need more help?

Full documentation is available in the Logmanager docs portal.

 [ Open product documentation ](https://doc.logmanager.com)

 Prefer a guided session? You can [ schedule a call with an expert. ](https://meetings-eu1.hubspot.com/jiri-moninec)

 

 

 This quick start guide helps you deploy the Virtual Logmanager appliance on **VMware ESXi / vSphere**, **Microsoft Hyper-V**, or **Proxmox VE**, configure networking, and log in to the web interface for the first time.

    ## Introduction

 Logmanager is available both as a hardware appliance and as a virtual machine. The currently supported virtual platforms are **VMware ESXi**, **Microsoft Hyper-V**, and **Proxmox VE**. Virtual Logmanager is designed to run on-premises in your datacenter.

  ## Overview

Two different virtual images are available:

- **OVA** — can be imported directly into VMware ESXi / vSphere and used on other KVM-based platforms such as Proxmox VE. Most configuration options such as memory and vCPUs are pre-set.
- **VHDX** — a virtual hard disk for Microsoft Hyper-V. When working with the VHDX file, you must configure virtual hardware (RAM, vCPUs) on the Hyper-V side.
 
  ## Requirements

### OS Requirements

- **VMware:** ESXi 7.0 or higher
- **Microsoft Hyper-V:** Windows Server 2012 R2 or higher
- **Proxmox VE:** Proxmox VE 8.3 or higher with KVM virtualization enabled
 
### Hardware Requirements

    EPS CPU specifications RAM Minimum storage     1000 4 vCPU with at least 1600 points single core in PassMark 16 GB 100 GB SSD (at least 300 IOPS)   5000 16 vCPU with at least 1900 points single core in PassMark 64 GB 100 GB SSD (at least 700 IOPS)   Forwarder 2 vCPU 6 GB 100 GB (at least 200 IOPS)    

### Additional disks

 It is necessary to add an extra disk both for Virtual Logmanager and for Virtual Logmanager Forwarder. The additional disk is used for **data storage / cache**.

 Additional disks can be added later to increase storage or cache size. Removing or shrinking an already initialized drive is not supported, so do not start with an unnecessarily large disk.

   ## Deploy the Virtual Appliance

 Choose your virtualization platform below. For detailed video walkthroughs, see: [ VMware deployment video ](https://youtu.be/bfzFO0vWO9U?si=flbyx3WNIfM9XOIT) and [ Hyper-V deployment video. ](https://youtu.be/zOZTWmoLOqU?si=x6Y8446u4OdNxZGK)

  VMware ESXi / vSphere   Microsoft Hyper-V   Proxmox VE  

 Step-by-step wizard

Click a step to see details and screenshots.

 

 1. Use Deploy OVF Template 2. Select the downloaded OVA file 3. Name the VM and choose a folder 4. Select a compute resource 5. Review template details 6. Accept the license agreement 7. Select storage 8. Select the target network 9. Review and finish the deployment 10. Adjust vCPU and RAM 11. Add an extra data disk 12. Power on the virtual machine 

### 1. Use Deploy OVF Template

 In the vSphere / ESXi client, right-click your cluster, host, or datastore and select **Deploy OVF Template**.

 ![vSphere menu with Deploy OVF Template action](https://logmanager.com/wp-content/uploads/2025/11/image10.png) 

### 2. Select the downloaded OVA file

 Browse to the Virtual Logmanager **.ova** file you downloaded and click **Next**.

 ![Selecting the Virtual Logmanager OVA file](https://logmanager.com/wp-content/uploads/2025/11/image3.png) 

### 3. Name the VM and choose a folder

 Enter a meaningful **virtual machine name** and choose the target folder or inventory location. Click **Next**.

 ![VM name and folder dialog in VMware](https://logmanager.com/wp-content/uploads/2025/11/image14.png) 

### 4. Select a compute resource

 Choose the host or cluster that will run the Virtual Logmanager VM and click **Next**.

 ![Selecting compute resource for the VM](https://logmanager.com/wp-content/uploads/2025/11/image24.png) 

### 5. Review template details

 Review the OVF template details and confirm that the configuration matches your expectations. Then click **Next**.

 ![Reviewing OVF template details](https://logmanager.com/wp-content/uploads/2025/11/image26.png) 

### 6. Accept the license agreement

Read and accept the license agreement, then click **Next**.

 ![License agreement screen](https://logmanager.com/wp-content/uploads/2025/11/image6.png) 

### 7. Select storage

Choose the datastore where the virtual machine files will be stored and click **Next**.

 ![Selecting datastore for VM files](https://logmanager.com/wp-content/uploads/2025/11/image1.png) 

### 8. Select the target network

Select the virtual network / port group that the VM will use and click **Next**.

 ![Selecting target network for the VM](https://logmanager.com/wp-content/uploads/2025/11/image13.png) 

### 9. Review and finish the deployment

Review the final summary and click **Finish** to deploy the VM.

 ![Final summary before deploying the VM](https://logmanager.com/wp-content/uploads/2025/11/image27.png) 

### 10. Adjust vCPU and RAM

 After the VM is created, open its hardware settings and adjust **vCPUs** and **RAM** according to your desired EPS and the [Hardware Requirements](#hardware-requirements) table.

 ![Editing virtual machine hardware (CPU and RAM)](https://logmanager.com/wp-content/uploads/2025/11/image11.png) 

### 11. Add an extra data disk

 Add an additional virtual hard disk for data storage/cache. Choose the disk size according to your license and your expected log volume.

 ![Adding an extra virtual disk for data](https://logmanager.com/wp-content/uploads/2025/11/image7.png) 

### 12. Power on the virtual machine

 Power on the Virtual Logmanager VM. When it boots, proceed with CLI networking configuration and the web UI login.

 ![Running the Virtual Logmanager VM](https://logmanager.com/wp-content/uploads/2025/11/image5.png) 

 

 

 

 Step-by-step wizard

Click a step to follow the setup.

 

 1. Copy the VHDX file 2. Open Hyper-V Manager 3. Create a new virtual machine 4. Choose storage location 5. Select Generation 2 6. Assign memory 7. Configure networking 8. Attach the existing VHDX disk 9. Confirm the summary 10. Add a new data disk 11. Choose the path for the secondary disk 12. Set disk size according to your license 13. Disable Secure Boot 14. Start the virtual machine 

### 1. Copy the VHDX file

Copy the **Logmanager.vhdx** file to the desired storage location on your Hyper-V server.

 

### 2. Open Hyper-V Manager

Connect to the Hyper-V server and open the **Hyper-V Manager** console.

 

### 3. Create a new virtual machine

In the left pane, right-click the server name and choose **New &gt; Virtual Machine**.

 ![New virtual machine wizard in Hyper-V Manager](https://logmanager.com/wp-content/uploads/2025/11/image20.png) 

### 4. Choose storage location

 Name your server, then optionally select **Store the virtual machine in a different location** and specify where the VM configuration will be stored. By default it is saved under `C:\ProgramData\Microsoft\Windows\Hyper-V\`.

 ![Selecting virtual machine storage location](https://logmanager.com/wp-content/uploads/2025/11/image9.png) 

### 5. Select Generation 2

On the **Specify Generation** screen, choose **Generation 2** and continue.

 ![Selecting Generation 2 in the Hyper-V wizard](https://logmanager.com/wp-content/uploads/2025/11/image12.png) 

### 6. Assign memory

 In **Assign Memory**, configure the VM memory. Follow the [Hardware Requirements](#hardware-requirements) and allocate at least **16 GB** RAM.

 ![Assigning memory to the virtual machine](https://logmanager.com/wp-content/uploads/2025/11/image18.png) 

### 7. Configure networking

On **Configure Networking**, select the virtual switch through which the VM will communicate.

 ![Selecting virtual switch for the VM](https://logmanager.com/wp-content/uploads/2025/11/image15.png) 

### 8. Attach the existing VHDX disk

 In **Connect Virtual Hard Disk**, select **Use an existing virtual hard disk** and specify the path to the Logmanager **.vhdx** file. Click **Next**.

 ![Connecting an existing VHDX disk](https://logmanager.com/wp-content/uploads/2025/11/image21.png) 

### 9. Confirm the summary

Check the summary of VM parameters and confirm with **Finish**.

 ![Hyper-V new VM summary screen](https://logmanager.com/wp-content/uploads/2025/11/image25.png) 

### 10. Add a new data disk

 In Hyper-V Manager, right-click the newly created VM and select **Settings**. Select **IDE Controller 0** and click **Add** to add a new hard drive. For best performance, choose **Fixed size** for the new data disk and continue.

 ![Adding new disk under IDE Controller 0](https://logmanager.com/wp-content/uploads/2025/11/image16.png) 

### 11. Choose the path for the secondary disk

Specify the path for the secondary virtual disk file and click **Next**.

 ![Selecting the path for the secondary data disk](https://logmanager.com/wp-content/uploads/2025/11/image17.png) 

### 12. Set disk size according to your license

Choose the disk size according to your license and expected log volume. Review and click **Finish**.

 ![Disk size selection](https://logmanager.com/wp-content/uploads/2025/11/image4.png) 

### 13. Disable Secure Boot

In **Security** settings for the VM, uncheck **Enable Secure Boot**.

 ![Disabling Secure Boot for the VM](https://logmanager.com/wp-content/uploads/2025/11/image23.png) 

### 14. Start the virtual machine

Start the virtual machine. When it boots, continue with CLI networking configuration and the web UI login.

 ![Starting the Virtual Logmanager VM in Hyper-V](https://logmanager.com/wp-content/uploads/2025/11/image19.png) 

 

 

 

 Step-by-step wizard

Click a step to see details and screenshots.

 

 1. Add Directory storage (Disk image + Import) 2. Upload OVA into Import storage 3. Select OVA and start Import 4. Set import options (VirtIO, disable efidisk0) 5. Watch import task progress 6. Add EFI disk 7. Add SCSI data disk (cache/storage) 8. Set CPU type to Host 9. Verify VM hardware parameters 10. Enter UEFI boot menu / Boot Maintenance Manager 11. Open Boot Options 12. Choose Add Boot Option 13. Select SCSI disk in File Explorer 14. Browse disk directories 15. Open EFI → GRUB folder 16. Select EFI/GRUB/grub64.efi 17. Name the boot option and commit 18. Open Change Boot Order 19. Move Logmanager to first position 20. Return to UEFI main menu 21. Open Device Manager 22. Disable Secure Boot attempt 23. Reset/Reboot VM 24. Logmanager boots successfully 

### 1. Add Directory storage (Disk image + Import)

Create a new storage (e.g. `vm-import`) with content types **Disk image** and **Import**.

 ![Proxmox VE Storage view showing “Add: Directory” dialog for vm-import storage](https://logmanager.com/wp-content/uploads/2026/01/proxmox-1.png) 

### 2. Upload OVA into Import storage

Upload the downloaded OVA file into the Import-enabled storage.

 ![Proxmox VE storage “vm-import” Import tab with Upload dialog for OVA file](https://logmanager.com/wp-content/uploads/2026/01/proxmox-2.png) 

### 3. Select OVA and start Import

Select the uploaded OVA in the storage content list and click **Import**.

 ![Proxmox VE storage content list showing imported OVA selected and “Import” action available](https://logmanager.com/wp-content/uploads/2026/01/proxmox-3.png) 

### 4. Set import options (VirtIO, disable efidisk0)

Before importing: uncheck **efidisk0**, set **SCSI Controller** to **VirtIO SCSI**, and **Network interface** to **VirtIO**.

 ![Proxmox VE “Import OVF/OVA” dialog with hardware options (EFI disk, SCSI controller, network model)](https://logmanager.com/wp-content/uploads/2026/01/proxmox-4.png) 

### 5. Watch import task progress

Wait for the import job to finish in the task viewer.

 ![Proxmox VE task log window showing OVA import progress output](https://logmanager.com/wp-content/uploads/2026/01/proxmox-5.png) 

### 6. Add EFI disk

After import, open VM → **Hardware** and add a new **EFI Disk**.

 ![Proxmox VE VM Hardware tab with “Add: EFI Disk” dialog](https://logmanager.com/wp-content/uploads/2026/01/proxmox-6.png) 

### 7. Add SCSI data disk (cache/storage)

Add an extra **SCSI** disk for Logmanager data/cache (size according to your use case).

 ![Proxmox VE “Add: Hard Disk” dialog for adding a new SCSI data disk](https://logmanager.com/wp-content/uploads/2026/01/proxmox-7.png) 

### 8. Set CPU type to Host

Set **CPU type** to **Host** in VM CPU settings.

 ![Proxmox VE CPU configuration dialog with CPU type set to Host](https://logmanager.com/wp-content/uploads/2026/01/proxmox-8.png) 

### 9. Verify VM hardware parameters

Review disks, NIC, CPU and memory to confirm everything matches your sizing.

 ![Proxmox VE VM Hardware list showing disks, network device, and system components](https://logmanager.com/wp-content/uploads/2026/01/proxmox-9.png) 

### 10. Enter UEFI boot menu / Boot Maintenance Manager

Start the VM, press **ESC** during boot and open **Boot Maintenance Manager**.

 ![VM console showing UEFI boot menu with Boot Maintenance Manager option](https://logmanager.com/wp-content/uploads/2026/01/proxmox-10.png) 

### 11. Open Boot Options

In Boot Maintenance Manager, select **Boot Options**.

 ![Boot Maintenance Manager screen showing Boot Options menu](https://logmanager.com/wp-content/uploads/2026/01/proxmox-11.png) 

### 12. Choose Add Boot Option

Select **Add Boot Option** to add a new firmware boot entry.

 ![Boot Options screen showing “Add Boot Option” selected](https://logmanager.com/wp-content/uploads/2026/01/proxmox-12.png) 

### 13. Select SCSI disk in File Explorer

In the File Explorer, choose the **SCSI** disk that contains the bootloader.

 ![UEFI File Explorer listing devices with SCSI disk entry highlighted](https://logmanager.com/wp-content/uploads/2026/01/proxmox-13.png) 

### 14. Browse disk directories

Browse the disk and locate the `EFI` directory.

 ![UEFI File Explorer showing top-level directories on the selected disk](https://logmanager.com/wp-content/uploads/2026/01/proxmox-14.png) 

### 15. Open EFI → GRUB folder

Open `EFI` and then navigate to the `GRUB` folder.

 ![UEFI File Explorer showing EFI directory with GRUB folder](https://logmanager.com/wp-content/uploads/2026/01/proxmox-15.png) 

### 16. Select EFI/GRUB/grub64.efi

Select `EFI/GRUB/grub64.efi` as the bootloader file.

 ![UEFI File Explorer with grub64.efi file visible in EFI/GRUB](https://logmanager.com/wp-content/uploads/2026/01/proxmox-16.png) 

### 17. Name the boot option and commit

Enter a description (e.g. **Logmanager**) and confirm with **Commit Changes and Exit**.

 ![Add Boot Option screen with description field and Commit Changes and Exit action](https://logmanager.com/wp-content/uploads/2026/01/proxmox-17.png) 

### 18. Open Change Boot Order

Open **Change Boot Order** to prioritize the new entry.

 ![Change Boot Order screen showing a list of boot entries](https://logmanager.com/wp-content/uploads/2026/01/proxmox-18.png) 

### 19. Move Logmanager to first position

Move **Logmanager** to the first position and commit changes.

 ![Boot order list with Logmanager entry positioned first](https://logmanager.com/wp-content/uploads/2026/01/proxmox-19.png) 

### 20. Return to UEFI main menu

Return to the main menu after saving the new boot option and order.

 ![UEFI main menu after boot order changes](https://logmanager.com/wp-content/uploads/2026/01/proxmox-20.png) 

### 21. Open Device Manager

Open **Device Manager** to access Secure Boot settings.

 ![UEFI Device Manager menu option highlighted](https://logmanager.com/wp-content/uploads/2026/01/proxmox-21.png) 

### 22. Disable Secure Boot attempt

Open **Secure Boot Configuration** and uncheck **Attempt Secure Boot**. Save (usually **F10**).

 ![Secure Boot Configuration screen showing Attempt Secure Boot setting](https://logmanager.com/wp-content/uploads/2026/01/proxmox-22.png) 

### 23. Reset/Reboot VM

Return to the main menu and select **Reset** to reboot the VM.

 ![UEFI main menu with Reset option used to reboot after configuration changes](https://logmanager.com/wp-content/uploads/2026/01/proxmox-23.png) 

### 24. Logmanager boots successfully

After reboot, the VM should boot into Logmanager successfully. Continue with CLI networking below.

 ![Logmanager VM booting in Proxmox console after successful EFI boot configuration](https://logmanager.com/wp-content/uploads/2026/01/proxmox-24.png) 

 

 

 

 

   ## Configure Virtual Logmanager

 Once the VM is running, open the virtual console from your hypervisor and log in to the text console with the default credentials:

- **Username:** admin
- **Password:** admin
 
 You will perform initial network configuration from the limited Logmanager CLI. For more commands, see the official [ CLI documentation. ](https://doc.logmanager.com/4.0.5/cli/cli/)

### Configuring an IP address

 Virtual Logmanager uses static IP addresses. Before you start, decide on the network information you want to use, for example:

- IP address: `192.168.1.29`
- Netmask: `255.255.255.0`
- Gateway: `192.168.1.1`
 
Then follow the steps below on the VM text console.

 

 ![Logmanager CLI showing IP and routing configuration](https://logmanager.com/wp-content/uploads/2025/11/image8.png) 

#### Step 1: Add the new static IP

Command syntax:

 ```
set ip ip_address network vlan
```

Example:

 ```
set ip 192.168.1.29 255.255.255.0 default_vlan
```

#### Step 2: Delete the default route

Command syntax:

 ```
delete route target netmask gw
```

Example:

 ```
delete route 0.0.0.0 0.0.0.0 192.168.0.1
```

#### Step 3: Add the new route

Command syntax:

 ```
set route target netmask gw
```

Example:

 ```
set route 0.0.0.0 0.0.0.0 192.168.1.1
```

#### Step 4: Delete the default IP

Command syntax:

 ```
delete ip ip_address network vlan
```

Example (removing the old default address):

 ```
delete ip 192.168.0.20 255.255.255.0 default_vlan
```

   ## Login to the Web UI

 After you configure the static IP address and default route, you can access the Logmanager web interface from your browser:

 ```
https://YOUR-IP-ADDRESS/
```

 Log in with your administrative credentials and continue with the standard product configuration.

 

 ![Logmanager web interface login page in a browser](https://logmanager.com/wp-content/uploads/2025/11/image2.png) 

  

 

 

 × ![]() 

 


  (function () {
    // Tabs
    var tabButtons = document.querySelectorAll(".lm-tab-button");
    var tabPanels = {
      vmware: document.getElementById("lm-tab-vmware"),
      hyperv: document.getElementById("lm-tab-hyperv"),
      proxmox: document.getElementById("lm-tab-proxmox")
    };

    tabButtons.forEach(function (btn) {
      btn.addEventListener("click", function () {
        var target = btn.getAttribute("data-tab-target");
        if (!target) return;

        tabButtons.forEach(function (b) {
          b.classList.toggle("lm-tab-button--active", b === btn);
        });

        Object.keys(tabPanels).forEach(function (key) {
          if (!tabPanels[key]) return;
          tabPanels[key].classList.toggle("lm-tab-panel--active", key === target);
        });
      });
    });

    // Step carousels + floating panels
    function initStepSystem(root) {
      var steps = root.querySelectorAll(".lm-step");
      var panels = root.querySelectorAll(".lm-step-panel");
      var stepsList = root.querySelector(".lm-steps-list");
      var panelsWrapper = root.querySelector(".lm-step-panels");

      if (!steps.length || !panels.length || !stepsList || !panelsWrapper) return;

      function positionPanels(activeStep) {
        // Disable floating on mobile
        if (window.innerWidth < 780) {
          panelsWrapper.style.transform = "";
          return;
        }

        var listRect = stepsList.getBoundingClientRect();
        var stepRect = activeStep.getBoundingClientRect();
        var wrapperRect = panelsWrapper.getBoundingClientRect();

        var offset = stepRect.top - listRect.top;
        if (offset < 0) offset = 0;

        var maxOffset = listRect.height - wrapperRect.height;
        if (maxOffset < 0) maxOffset = 0;

        if (offset > maxOffset) offset = maxOffset;

        panelsWrapper.style.transform = "translateY(" + offset + "px)";
      }

      steps.forEach(function (stepBtn) {
        stepBtn.addEventListener("click", function () {
          var targetId = stepBtn.getAttribute("data-step-target");
          if (!targetId) return;

          steps.forEach(function (b) {
            b.classList.toggle("lm-step--active", b === stepBtn);
          });

          panels.forEach(function (panel) {
            var panelId = panel.getAttribute("data-step-id");
            panel.classList.toggle("lm-step-panel--active", panelId === targetId);
          });

          positionPanels(stepBtn);
        });
      });

      var initialActive = root.querySelector(".lm-step.lm-step--active") || steps[0];
      if (initialActive) positionPanels(initialActive);

      window.addEventListener("resize", function () {
        var currentActive = root.querySelector(".lm-step.lm-step--active") || steps[0];
        if (currentActive) positionPanels(currentActive);
      });
    }

    var vmwarePanel = document.getElementById("lm-tab-vmware");
    var hypervPanel = document.getElementById("lm-tab-hyperv");
    var proxmoxPanel = document.getElementById("lm-tab-proxmox");
    if (vmwarePanel) initStepSystem(vmwarePanel);
    if (hypervPanel) initStepSystem(hypervPanel);
    if (proxmoxPanel) initStepSystem(proxmoxPanel);

    // Lightbox
    var lightbox = document.querySelector(".lm-lightbox");
    var lightboxImg = lightbox.querySelector(".lm-lightbox-img");
    var lightboxCaption = lightbox.querySelector(".lm-lightbox-caption");
    var lightboxClose = lightbox.querySelector(".lm-lightbox-close");
    var lightboxBackdrop = lightbox.querySelector(".lm-lightbox-backdrop");

    function openLightbox(src, alt) {
      lightboxImg.src = src;
      lightboxImg.alt = alt || "";
      lightboxCaption.textContent = alt || "";
      lightbox.classList.add("lm-lightbox--open");
      document.body.style.overflow = "hidden";
    }

    function closeLightbox() {
      lightbox.classList.remove("lm-lightbox--open");
      document.body.style.overflow = "";
      lightboxImg.src = "";
      lightboxImg.alt = "";
      lightboxCaption.textContent = "";
    }

    document.querySelectorAll(".lm-step-panel img, .lm-lightbox-trigger").forEach(function (img) {
      img.addEventListener("click", function () {
        var full = img.getAttribute("data-full") || img.src;
        openLightbox(full, img.alt);
      });
    });

    lightboxClose.addEventListener("click", closeLightbox);
    lightboxBackdrop.addEventListener("click", closeLightbox);
    document.addEventListener("keydown", function (e) {
      if (e.key === "Escape" && lightbox.classList.contains("lm-lightbox--open")) {
        closeLightbox();
      }
    });

    // Code block copy buttons
    var preBlocks = document.querySelectorAll(".lm-vm-guide pre");
    preBlocks.forEach(function (pre) {
      var wrapper = document.createElement("div");
      wrapper.className = "lm-code-wrap";
      pre.parentNode.insertBefore(wrapper, pre);
      wrapper.appendChild(pre);

      var btn = document.createElement("button");
      btn.type = "button";
      btn.className = "lm-code-copy";
      btn.textContent = "Copy";
      wrapper.appendChild(btn);

      btn.addEventListener("click", function () {
        var text = pre.textContent;
        if (navigator.clipboard && navigator.clipboard.writeText) {
          navigator.clipboard.writeText(text).then(function () {
            var old = btn.textContent;
            btn.textContent = "Copied";
            setTimeout(function () {
              btn.textContent = old;
            }, 1500);
          });
        }
      });
    });
  })();

  .lm-vm-guide {
    max-width: 1120px;
    margin: 0 auto 4rem auto;
    padding: 2rem 1.5rem 3rem;
  }

  .lm-vm-guide a {
    color: #2563eb;
    text-decoration: underline;
  }

  .lm-vm-hero {
    margin-bottom: 2.5rem;
  }

  .lm-vm-hero h1 {
    font-size: 2.1rem;
    margin: 0 0 0.5rem;
  }

  .lm-vm-subtitle {
    margin: 0;
    opacity: 0.7;
  }

  .lm-vm-intro {
    margin-top: 1rem;
    max-width: 48rem;
  }

/* REMOVE the old .lm-vm-layout grid entirely */
/* REMOVE .lm-vm-aside and its sticky behavior */

/* NEW SINGLE-COLUMN PAGE */
.lm-vm-layout {
  display: block;
}

/* Inline TOC + help cards directly under subtitle */
.lm-inline-cards {
  display: flex;
  gap: 1.25rem;
  margin: 1.75rem 0 2.5rem;
  flex-wrap: wrap;
}

.lm-inline-cards .lm-vm-card {
  flex: 1 1 260px;
  max-width: 340px;
}

/* Cards keep their default style */
.lm-vm-card {
  padding: 1rem 1rem 1.1rem;
  border-radius: 1rem;
  border: 1px solid rgba(0,0,0,0.06);
  background: #ffffff;
  box-shadow: 0 10px 30px rgba(0,0,0,0.03);
  font-size: 0.9rem;
}

.lm-vm-card h3 {
  margin-top: 0;
  margin-bottom: 0.6rem;
  font-size: 1rem;
}

/* On mobile: stack them full-width */
@media (max-width: 780px) {
  .lm-inline-cards {
    flex-direction: column;
  }
  .lm-inline-cards .lm-vm-card {
    max-width: 100%;
  }
}

  /* ─────────────────────────────────────────────
     SECTION HEADINGS
     ───────────────────────────────────────────── */

  .lm-vm-section {
    margin-bottom: 2.5rem;
  }

  .lm-vm-section h2 {
    font-size: 1.5rem;
    margin-bottom: 0.75rem;
  }

  .lm-vm-section h3 {
    font-size: 1.1rem;
    margin-top: 1.5rem;
    margin-bottom: 0.4rem;
  }

  .lm-vm-section h4 {
    font-size: 1rem;
    margin-top: 1.25rem;
    margin-bottom: 0.4rem;
  }

  /* ─────────────────────────────────────────────
     TABLES
     ───────────────────────────────────────────── */

  .lm-vm-table-wrapper {
    overflow-x: auto;
  }

  .lm-vm-table {
    width: 100%;
    border-collapse: collapse;
    font-size: 0.9rem;
  }

  .lm-vm-table th,
  .lm-vm-table td {
    border: 1px solid rgba(0,0,0,0.08);
    padding: 0.5rem 0.75rem;
    text-align: left;
    vertical-align: top;
  }

  .lm-vm-table th {
    font-weight: 600;
    white-space: nowrap;
  }

  .lm-vm-note {
    font-size: 0.95rem;
    background: rgba(0,0,0,0.02);
    border-radius: 0.75rem;
    padding: 0.75rem 1rem;
    border: 1px solid rgba(0,0,0,0.04);
  }

  .lm-vm-credentials {
    list-style: none;
    padding-left: 0;
  }

  /* ─────────────────────────────────────────────
     CODE BLOCKS + COPY BUTTON
     ───────────────────────────────────────────── */

  .lm-vm-guide pre {
    background: rgba(0,0,0,0.04);
    border-radius: 0.5rem;
    padding: 0.5rem 0.75rem;
    font-size: 0.9rem;
    overflow-x: auto;
    margin: 0; /* small space */
  }

  code {
    font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",
                 "Courier New", monospace;
    font-size: 0.9em;
  }

  .lm-code-wrap {
    position: relative;
    margin: 0.25rem 0 0.4rem;
  }

  .lm-code-copy {
    position: absolute;
    top: 0.35rem;
    right: 0.5rem;
    font-size: 0.75rem;
    padding: 0.15rem 0.5rem;
    border-radius: 0.4rem;
    border: 1px solid rgba(0,0,0,0.2);
    background: #ffffff;
    cursor: pointer;
  }

  .lm-code-copy:hover {
    background: #e5efff;
  }

  /* ─────────────────────────────────────────────
     TABS (VMware / Hyper-V)
     ───────────────────────────────────────────── */

  .lm-tabs {
    margin-top: 1.5rem;
  }

  .lm-tabs-nav {
    display: inline-flex;
    border-radius: 999px;
    background: rgba(0,0,0,0.04);
    padding: 0.2rem;
    margin-bottom: 1.25rem;
  }

  .lm-tab-button {
    border: none;
    background: transparent;
    padding: 0.5rem 1.25rem;
    border-radius: 999px;
    font-size: 0.95rem;
    cursor: pointer;
    white-space: nowrap;
  }

  .lm-tab-button--active {
    background: #ffffff;
    box-shadow: 0 0 0 1px rgba(0,0,0,0.06), 0 4px 10px rgba(0,0,0,0.03);
  }

  .lm-tab-panel {
    display: none;
  }

  .lm-tab-panel--active {
    display: block;
  }

  /* ─────────────────────────────────────────────
     STEP LIST + FLOATING PANEL ALIGNMENT
     ───────────────────────────────────────────── */

  .lm-steps-layout {
    display: grid;
    grid-template-columns: minmax(0, 0.9fr) minmax(0, 2.1fr);
    gap: 1.5rem;
    align-items: flex-start;
  }

  .lm-steps-list {
    display: flex;
    flex-direction: column;
    gap: 0.25rem;
  }

  .lm-step {
    text-align: left;
    border-radius: 0.5rem;
    padding: 0.45rem 0.7rem;
    font-size: 0.9rem;
    border: 1px solid transparent;
    background: transparent;
    cursor: pointer;
  }

/* Header above the step list */
.lm-steps-list-header {
  padding: 0.4rem 0.2rem 0.6rem;
  margin-bottom: 0.35rem;
  border-bottom: 1px dashed rgba(0,0,0,0.08);
}

.lm-steps-label {
  margin: 0;
  font-size: 0.7rem;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  font-weight: 600;
  opacity: 0.7;
}

.lm-steps-hint {
  margin: 0.15rem 0 0;
  font-size: 0.8rem;
  opacity: 0.85;
}

/* FAQ-like clickable step items */
.lm-step {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.5rem;
  background: #f9fafb;
  border-radius: 0.6rem;
  padding: 0.5rem 0.7rem;
  font-size: 0.9rem;
  border: 1px solid rgba(0,0,0,0.04);
  cursor: pointer;
  transition:
    background 0.15s ease,
    border-color 0.15s ease,
    box-shadow 0.15s ease,
    transform 0.1s ease;
}

/* Right-hand arrow similar to FAQ chevron */
.lm-step::after {
  content: "›";
  font-size: 1rem;
  line-height: 1;
  border-radius: 999px;
  min-width: 1.4rem;
  height: 1.4rem;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: #e5e7eb;
  color: #111827;
  opacity: 0.7;
  transform: translateX(0);
  transition:
    background 0.15s ease,
    opacity 0.15s ease,
    transform 0.15s ease;
}

/* Hover state – looks clearly interactive */
.lm-step:hover {
  background: #eef2ff;
  border-color: #c7d2fe;
  box-shadow: 0 4px 10px rgba(0,0,0,0.04);
  transform: translateY(-1px);
}

.lm-step:hover::after {
  background: #d4d4ff;
  opacity: 1;
  transform: translateX(2px);
}

/* Active step – stronger highlight, like an open FAQ item */
.lm-step--active {
  background: #eff6ff;
  border-color: #93c5fd;
  box-shadow: 0 6px 18px rgba(37, 99, 235, 0.12);
}

.lm-step--active::after {
  background: #2563eb;
  color: #ffffff;
  opacity: 1;
  transform: translateX(2px);
}


  .lm-step--active {
    background: rgba(0,0,0,0.03);
    border-color: rgba(0,0,0,0.12);
  }

  .lm-step-panels {
    position: relative;
    transition: transform 0.18s ease-out;
  }

  /* INDIVIDUAL STEP PANEL */

  .lm-step-panel {
    display: none;
    border-radius: 1rem;
    border: 1px solid rgba(0,0,0,0.06);
    padding: 1rem 1rem 1.25rem;
    background: #ffffff;
    box-shadow: 0 10px 30px rgba(0,0,0,0.03);
    font-size: 0.95rem;
  }

  .lm-step-panel--active {
    display: block;
  }

  .lm-step-panel img {
    display: block;
    width: 100%;               /* full column width */
    max-width: 100%;
    height: auto;
    margin-top: 0.5rem;
    border-radius: 0.75rem;
    border: 1px solid rgba(0,0,0,0.06);
    cursor: zoom-in;
  }

  /* ─────────────────────────────────────────────
     RIGHT ASIDE: TOC + HELP BOXES
     ───────────────────────────────────────────── */

  .lm-vm-aside {
    position: relative;
  }

  .lm-vm-card {
    position: sticky;
    top: 5.5rem;
    padding: 1rem 1rem 1.1rem;
    border-radius: 1rem;
    border: 1px solid rgba(0,0,0,0.06);
    background: #ffffff;
    box-shadow: 0 10px 30px rgba(0,0,0,0.03);
    margin-bottom: 1.5rem;
    font-size: 0.9rem;
  }

  .lm-vm-card--secondary {
    top: auto;
  }

  .lm-vm-card h3 {
    margin-top: 0;
    margin-bottom: 0.5rem;
    font-size: 1rem;
  }

  .lm-vm-toc {
    list-style: none;
    padding-left: 0;
    margin: 0;
  }

  .lm-vm-toc li {
    margin: 0.15rem 0;
  }

  /* ─────────────────────────────────────────────
     LIGHTBOX
     ───────────────────────────────────────────── */

  .lm-lightbox {
    position: fixed;
    inset: 0;
    display: none;
    align-items: center;
    justify-content: center;
    z-index: 9999;
  }

  .lm-lightbox.lm-lightbox--open {
    display: flex;
  }

  .lm-lightbox-backdrop {
    position: absolute;
    inset: 0;
    background: rgba(15, 23, 42, 0.7);
  }

  .lm-lightbox-content {
    position: relative;
    max-width: 90vw;
    max-height: 90vh;
    z-index: 1;
    display: flex;
    flex-direction: column;
    align-items: center;
  }

  .lm-lightbox-img {
    max-width: 100%;
    max-height: 80vh;
    border-radius: 0.75rem;
    background: #0f172a;
  }

  .lm-lightbox-caption {
    margin-top: 0.5rem;
    font-size: 0.9rem;
    color: #e2e8f0;
    text-align: center;
  }

  .lm-lightbox-close {
    position: absolute;
    top: -2rem;
    right: 0;
    font-size: 1.6rem;
    line-height: 1;
    border: none;
    background: transparent;
    color: #e2e8f0;
    cursor: pointer;
  }

  /* ─────────────────────────────────────────────
     RESPONSIVE
     ───────────────────────────────────────────── */

  @media (max-width: 960px) {
    .lm-vm-layout {
      grid-template-columns: minmax(0, 1fr);
    }
    .lm-vm-aside {
      order: -1; /* puts TOC above content on mobile */
    }
    .lm-vm-card {
      position: static;
    }
  }

  @media (max-width: 780px) {
    .lm-steps-layout {
      grid-template-columns: minmax(0, 1fr);
    }
    .lm-tabs-nav {
      width: 100%;
      justify-content: space-between;
      overflow-x: auto;
    }
    .lm-step-panels {
      transform: none !important;
    }
  }

.lm-inline-figure {
  display: flex;
  gap: 1.5rem;
  align-items: flex-start;
  margin-bottom: 1.5rem;
}

/* Text takes the remaining space */
.lm-inline-figure-text {
  flex: 1 1 0;
  min-width: 0;
}

/* Thumbnail: ~1/3 of the column, never full width */
.lm-inline-thumb {
  flex: 0 0 30%;
  max-width: 30%;
  min-width: 180px;      /* keeps it from becoming tiny on big screens */
  height: auto;
  border-radius: 0.75rem;
  border: 1px solid rgba(0,0,0,0.08);
  cursor: zoom-in;
}

/* Stack on mobile */
@media (max-width: 780px) {
  .lm-inline-figure {
    flex-direction: column;
  }

  .lm-inline-thumb {
    flex: 0 0 auto;
    max-width: 260px;
  }
}




  (function () {
    // Tabs
    var tabButtons = document.querySelectorAll(".lm-tab-button");
    var tabPanels = {
      vmware: document.getElementById("lm-tab-vmware"),
      hyperv: document.getElementById("lm-tab-hyperv")
    };

    tabButtons.forEach(function (btn) {
      btn.addEventListener("click", function () {
        var target = btn.getAttribute("data-tab-target");
        if (!target) return;

        tabButtons.forEach(function (b) {
          b.classList.toggle("lm-tab-button--active", b === btn);
        });

        Object.keys(tabPanels).forEach(function (key) {
          tabPanels[key].classList.toggle(
            "lm-tab-panel--active",
            key === target
          );
        });
      });
    });

    // Step carousels (both VMware + Hyper-V) + floating panels
    function initStepSystem(root) {
      var steps = root.querySelectorAll(".lm-step");
      var panels = root.querySelectorAll(".lm-step-panel");
      var stepsList = root.querySelector(".lm-steps-list");
      var panelsWrapper = root.querySelector(".lm-step-panels");

      if (!steps.length || !panels.length || !stepsList || !panelsWrapper) return;

     function positionPanels(activeStep) {
  // Disable floating on mobile
  if (window.innerWidth < 780) {
    panelsWrapper.style.transform = "";
    return;
  }

  var listRect = stepsList.getBoundingClientRect();
  var stepRect = activeStep.getBoundingClientRect();
  var wrapperRect = panelsWrapper.getBoundingClientRect();

  // Basic offset: align top of panel wrapper with active step
  var offset = stepRect.top - listRect.top;
  if (offset < 0) offset = 0;

  // Do not let the bottom of the panel go below the last bullet
  var maxOffset = listRect.height - wrapperRect.height;
  if (maxOffset < 0) maxOffset = 0; // if panel is taller than list

  if (offset > maxOffset) offset = maxOffset;

  panelsWrapper.style.transform = "translateY(" + offset + "px)";
}


      steps.forEach(function (stepBtn) {
        stepBtn.addEventListener("click", function () {
          var targetId = stepBtn.getAttribute("data-step-target");
          if (!targetId) return;

          steps.forEach(function (b) {
            b.classList.toggle("lm-step--active", b === stepBtn);
          });

          panels.forEach(function (panel) {
            var panelId = panel.getAttribute("data-step-id");
            panel.classList.toggle(
              "lm-step-panel--active",
              panelId === targetId
            );
          });

          positionPanels(stepBtn);
        });
      });

      // Initial positioning based on first active step
      var initialActive = root.querySelector(".lm-step.lm-step--active") || steps[0];
      if (initialActive) positionPanels(initialActive);

      window.addEventListener("resize", function () {
        var currentActive = root.querySelector(".lm-step.lm-step--active") || steps[0];
        if (currentActive) positionPanels(currentActive);
      });
    }

    var vmwarePanel = document.getElementById("lm-tab-vmware");
    var hypervPanel = document.getElementById("lm-tab-hyperv");
    if (vmwarePanel) initStepSystem(vmwarePanel);
    if (hypervPanel) initStepSystem(hypervPanel);

    // Lightbox
    var lightbox = document.querySelector(".lm-lightbox");
    var lightboxImg = lightbox.querySelector(".lm-lightbox-img");
    var lightboxCaption = lightbox.querySelector(".lm-lightbox-caption");
    var lightboxClose = lightbox.querySelector(".lm-lightbox-close");
    var lightboxBackdrop = lightbox.querySelector(".lm-lightbox-backdrop");

    function openLightbox(src, alt) {
      lightboxImg.src = src;
      lightboxImg.alt = alt || "";
      lightboxCaption.textContent = alt || "";
      lightbox.classList.add("lm-lightbox--open");
      document.body.style.overflow = "hidden";
    }

    function closeLightbox() {
      lightbox.classList.remove("lm-lightbox--open");
      document.body.style.overflow = "";
      lightboxImg.src = "";
      lightboxImg.alt = "";
      lightboxCaption.textContent = "";
    }

// Any image that should open in the lightbox
document.querySelectorAll(".lm-step-panel img, .lm-lightbox-trigger").forEach(function (img) {
  img.addEventListener("click", function () {
    var full = img.getAttribute("data-full") || img.src;
    openLightbox(full, img.alt);
  });
});


    lightboxClose.addEventListener("click", closeLightbox);
    lightboxBackdrop.addEventListener("click", closeLightbox);
    document.addEventListener("keydown", function (e) {
      if (e.key === "Escape" && lightbox.classList.contains("lm-lightbox--open")) {
        closeLightbox();
      }
    });

    // Code block copy buttons
    var preBlocks = document.querySelectorAll(".lm-vm-guide pre");
    preBlocks.forEach(function (pre) {
      var wrapper = document.createElement("div");
      wrapper.className = "lm-code-wrap";
      pre.parentNode.insertBefore(wrapper, pre);
      wrapper.appendChild(pre);

      var btn = document.createElement("button");
      btn.type = "button";
      btn.className = "lm-code-copy";
      btn.textContent = "Copy";
      wrapper.appendChild(btn);

      btn.addEventListener("click", function () {
        var text = pre.textContent;
        if (navigator.clipboard && navigator.clipboard.writeText) {
          navigator.clipboard.writeText(text).then(function () {
            var old = btn.textContent;
            btn.textContent = "Copied";
            setTimeout(function () {
              btn.textContent = old;
            }, 1500);
          });
        }
      });
    });
  })();
