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:

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:
- Reading files: The File Explorer page lists files from the local machine’s
C:\Demodirectory. - Detecting changes: He creates a folder called
youtubefrom a local command prompt. After refreshing the cloud page, the new folder appears immediately. - Uploading files: Using an upload action in Business Central, he uploads an image file (a lamp) into the
youtubefolder. Switching to the local machine confirms the file is there with the correct timestamp. - Executing commands: He runs
mspaint.exeon the uploaded file directly from Business Central. MS Paint opens locally with the image loaded. He draws “hello” on the image and saves it. - 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.