Altien makes Mike right at home on Microsoft's cloud

Storage is no longer hard-wired to one vendor - Mike can now keep documents in Azure, with the door open for others.

infrastructureintegration

Maintained by Allen Morgan · verified on MikeWatch

Until now, this fork kept its files in a single cloud storage service (Cloudflare's). Altien has rebuilt that layer so the storage backend is swappable, then added support for Microsoft Azure - and when an Azure setup is present, it wins by default. The Azure path can authenticate the way enterprise Microsoft shops expect, using a managed identity rather than copied-around keys, which tends to matter to anyone whose procurement and security teams already live in the Microsoft world.

The rework also tightened up a quiet failure: the old setup couldn't tell "storage isn't configured yet" from "storage just broke," which could leave database records pointing at documents that were never actually saved. Now a misconfiguration surfaces as a clear error instead of a silent orphan, and routine sign-in and health checks keep working even when storage isn't ready.

So what Worth a look for legal teams standardised on Microsoft Azure who want Mike to fit their existing cloud and security setup rather than the other way around.

View this fork on GitHub →

Spotted something wrong? Or know the PR text has fresher detail than the writeup above?

Commits in this thread

2 commits from Altien/mikeOssAzure, oldest first. Source extracted verbatim from the harvested git log.

SHA Subject Author Date
45310480 refactor(storage): extract StorageProvider interface and R2Provider Allen Morgan 2026-05-08 ↗ GitHub
commit body
Introduces a StorageProvider interface, an R2Provider class wrapping the
existing R2/S3 logic, and a createProvider() factory that selects based
on env vars. The four public functions (uploadFile, downloadFile,
deleteFile, getSignedUrl) delegate to a singleton.

Zero behaviour change for existing R2 deployments. Makes it
straightforward for self-hosters to add other providers (GCS, S3,
local filesystem, Azure Blob) without touching call sites.
c3daf8fa feat(storage): Azure Blob Storage provider Allen Morgan 2026-05-08 ↗ GitHub
commit body
Adds AzureBlobProvider implementing the StorageProvider interface, with
auth via either AZURE_STORAGE_CONNECTION_STRING (local dev / Azurite)
or AZURE_STORAGE_ACCOUNT_NAME + DefaultAzureCredential (Managed Identity
in Container Apps). Container defaults to "documents".

signedUrl() returns null - Azure deployments use the backend download
proxy at GET /download/:token rather than direct storage URLs. The /url
route already falls back to buildDownloadUrl() when this returns null.

The factory now picks Azure when AZURE_STORAGE_* is set, falling back to
R2 when R2_* is set. With neither, the server still starts and the first
storage operation fails with a clear error.

Adds @azure/storage-blob; @azure/identity is shared with lib/config.ts.

Capture this thread into my fork

Download a single Markdown prompt that tells Claude how to port every commit above into your working tree — adapting paths and structure to match your repo. Run it via claude -p < capture-thread-191.md from inside the repo you want the changes in.

⬇ Download capture-thread-191.md