Altien teaches Mike to live on Azure

The fork swaps a single-vendor file store for a pluggable one - and ships the Azure version alongside it.

infrastructureintegration

Mike originally assumed your files live in Cloudflare's object storage (a service called R2, similar to Amazon S3). Altien's fork splits that assumption out into a clean seam: storage is now a slot you fill, not a hard-wired choice. Existing deployments running on Cloudflare behave exactly as before.

The second move plugs Azure Blob Storage into that slot, with two ways to authenticate - a connection string for local development, or Azure's Managed Identity for production, which lets the app prove who it is without anyone handling a password. Because Azure handles file downloads a little differently, the fork routes them back through Mike's own server rather than handing out direct links.

Worth noting: the configuration is forgiving enough that a misconfigured server will start up happily and only complain the first time someone tries to open a file.

So what Matters for any firm or legal-tech buyer whose IT policy mandates Microsoft Azure - Mike is now a realistic option without leaving the Microsoft estate.

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