Cloud2Disk – What you can do on-premises, I can do in the cloud with Busines Central

Celebrating two years of YouTubing by presenting a new project I’ve been working on, Cloud2Disk enables access to on-premises resources such as files, printers and more, check it out:

https://youtu.be/eviajiFIT8Q

In this video, Erik introduces Cloud2Disk — a prototype solution that bridges one of the biggest gaps in cloud-based Business Central: access to local hardware, files, and on-premises resources. He also celebrates two years of creating YouTube content and announces a giveaway for Toolbox licenses.

The Problem: Cloud vs. On-Premises Hardware Access

One of the primary reasons organizations hesitate to move to cloud-based Business Central is the difficulty — sometimes near impossibility — of accessing local hardware resources. Many business processes depend on:

  • Files stored on local disks or network shares
  • Local and network printers (including receipt printers)
  • USB devices
  • Webcams and other peripherals
  • Custom .NET integrations running on local machines

Erik has been prototyping solutions to this problem for a while, and Cloud2Disk represents his latest and most promising approach.

Cloud2Disk in Action

The demo starts with a cloud-hosted Business Central environment running a custom “File Explorer” page. This page displays the contents of a local C: drive — specifically a C:\Demo folder — even though Business Central itself is running in the cloud.

File Operations Demo

Erik demonstrates the full round-trip of file operations:

  1. Reading files: The File Explorer page lists files from the local machine’s C:\Demo directory.
  2. Detecting changes: He creates a folder called youtube from a local command prompt. After refreshing the cloud page, the new folder appears immediately.
  3. Uploading files: Using an upload action in Business Central, he uploads an image file (a lamp) into the youtube folder. Switching to the local machine confirms the file is there with the correct timestamp.
  4. Executing commands: He runs mspaint.exe on the uploaded file directly from Business Central. MS Paint opens locally with the image loaded. He draws “hello” on the image and saves it.
  5. Downloading files: He downloads the modified file from the local machine back through Business Central to his browser.

Cross-Platform Support

Cloud2Disk isn’t limited to Windows. Erik switches the host from his Surface Book to a Linux machine and browses the /var directory, demonstrating that the solution works across operating systems. He mentions that a Mac version also exists, though it wasn’t running during the demo.

The API: How Developers Use Cloud2Disk

From an AL developer’s perspective, Cloud2Disk exposes a simple codeunit-based API. Erik walks through the available functions:

  • Register: Establishes a connection from your BC tenant to a specific host through a proxy, secured with a secret.
  • Get Files: Returns files at a given path into a temporary table.
  • Put File: Uploads a file (given a full path filename and a stream) to the host machine.
  • Get File: Downloads a file from the host (marked internal at the time of the demo).
  • Get Printers: Retrieves the list of printers available on the local machine.
  • Print: Sends print jobs to local printers (to be demonstrated in a future video with a receipt printer).
  • Shell Command: Executes commands on the host PC, as demonstrated with MS Paint.

To use Cloud2Disk in your own extension, you add it as a dependency in your app.json and then reference the codeunit:

var
    CloudDisk: Codeunit "Cloud to Disk";
begin
    // Register a connection to a host through the proxy
    CloudDisk.Register(TenantId, HostName, ProxyUrl, Secret);

    // Get files from a path on the host
    CloudDisk.GetFiles(Path, TempFileTable);

    // Upload a file
    CloudDisk.PutFile(FullPathFileName, InStream);

    // Execute a shell command on a file
    CloudDisk.ShellCommand('mspaint.exe', FileName, WaitForCompletion);

    // Get available printers
    CloudDisk.GetPrinters(TempPrinterTable);
end;

Architecture: The Three Components

Cloud2Disk consists of three components that work together:

1. The Host Agent

A small program that runs on the local machine (Windows, Linux, or Mac). It connects outbound to the proxy and then waits for incoming tasks. The key insight here is that because the host initiates the connection outward, there is no firewall configuration, port forwarding, or routing setup required. It works the same way Skype, Teams, or Spotify connect — the networking just figures itself out.

The host agent automatically reconnects if the connection is lost, and logs all incoming tasks for visibility.

2. The Proxy

The proxy runs as an Azure website and serves as the intermediary between Business Central and the host agents. It handles two different communication protocols:

  • From Business Central to the Proxy: Standard stateless web service calls (the only type of outbound communication BC cloud supports).
  • From the Proxy to the Host: WebSockets for real-time bidirectional communication, with fallbacks to other protocols if WebSockets aren’t available.

3. The BC Extension

The AL codeunit that provides the developer-facing API within Business Central. It handles serialization, communication with the proxy, and exposing a clean interface for file operations, printing, and command execution.

Source Code: Azure Blob Storage Example

While not directly part of Cloud2Disk, the video’s source code includes an example of working with Azure Blob Storage from AL, which demonstrates the kind of cloud storage integration patterns that complement Cloud2Disk’s local file access:

pageextension 50100 CustomerListExt extends "Customer List"
{
    trigger OnOpenPage();
    var
        response: Codeunit "ABS Operation Response";
        containers: Record "ABS Container";
        content: Record "ABS Container Content";
        Txt: Text;
    begin
        Authorization := StorageServiceAuthorization.CreateSharedKey(
            'uKox8/1MnfUXZgjIBggIe9DCVK4zmTXawt4O2vvwFYdJ+19+TDUmvopnA+70x8M0JhLl/8rFk/w3+AStpCrPag==');
        ContainerClient.Initialize('erikyoutube', Authorization);
        response := ContainerClient.CreateContainer('youtube');
        response := ContainerClient.ListContainers(containers);
        if response.IsSuccessful() then begin
            if containers.findset() then
                repeat
                    message('%1', containers.Name);
                until containers.next() = 0;
        end else
            message('ABS Error: %1', response.GetError());

        BlobClient.Initialize('erikyoutube', 'youtube', Authorization);
        response := BlobClient.PutBlobBlockBlobText(
            'BCBlob2', 'This is the content of our blobloblob');
        if not Response.IsSuccessful() then
            message('PutBlobBlobBlob %1', response.GetError());

        response := BlobClient.ListBlobs(content);
        if response.IsSuccessful() then
            if content.findset() then
                repeat
                    message('%1', content.Name);
                    BlobClient.GetBlobAsText(content.Name, Txt);
                    Message('%1', Txt);
                until content.next() = 0;
    end;

    var
        ContainerClient: Codeunit "ABS Container Client";
        BlobClient: Codeunit "ABS Blob Client";
        StorageServiceAuthorization: Codeunit "Storage Service Authorization";
        Authorization: Interface "Storage Service Authorization";
}

This example shows how to create containers, upload blobs, list contents, and read blob data using the built-in Azure Blob Storage modules in Business Central — useful for cloud-native file storage scenarios alongside Cloud2Disk’s local file access capabilities.

Future Possibilities and Plugin Architecture

Erik outlines several directions Cloud2Disk could evolve:

  • Printing: Full printer support, including receipt printers, functioning similarly to universal printers or classic NAV printing.
  • USB devices: Direct communication with USB peripherals from the cloud.
  • Webcams: Access to camera devices on local machines.
  • Plugin system: A concept where developers compile their own .NET DLLs implementing a specific interface. These plugins would plug into the host agent and expose their functions to the AL codeunit in Business Central — essentially allowing custom .NET code to be called from cloud BC through the Cloud2Disk pipeline.

Summary

Cloud2Disk is a compelling prototype that addresses one of the most significant barriers to Business Central cloud adoption: the inability to interact with local hardware and file systems. By using a three-tier architecture (BC Extension → Azure Proxy → Local Host Agent) with WebSockets for real-time communication and no firewall configuration required, it provides a clean path for file operations, command execution, printing, and potentially custom .NET integrations — all from cloud Business Central. While still in the prototype stage, the approach is sound and could evolve into a powerful product for organizations that need to bridge the cloud-to-local divide.