A web-based developer console for Azurite, the Azure Storage emulator. Azurite UI provides an intuitive interface to manage containers and blobs in your local Azurite development environment, eliminating the need for command-line tools or third-party storage explorers.
Azurite is a free, open-source emulator that provides a local environment simulating Azure Blob, Queue, and Table storage services for development and testing purposes. Azurite UI complements Azurite by providing a modern web interface for:
- Container Management: List, create, delete, and view properties for containers
- Blob Operations: Browse, upload, download, delete, preview (images), and view properties for blobs
- Infinite Scroll: Seamless browsing of large container lists with offset-based pagination
- Data Tables: Paginated blob lists with configurable page sizes and navigation
- Rich Details: View metadata, tags, dates, and other properties in slide-out panels
- Image Preview: Preview image blobs up to 4MB directly in the browser
Since this is a developer console designed for local development, no authentication is required and denial-of-service protections like rate limiting are not implemented.
- All C# code within the AzuriteUI.Web project was written "by hand" with no AI involvement.
- CSS and HTML code within the AzuriteUI.Web project was written with the assistance of AI (specifically; Claude Code).
- Unit and integration test helpers were written "by hand" with no AI involvement.
- The actual tests were written by an AI agent (specifically; Claude Code).
- .NET SDK (version specified in global.json or project files)
- Cake build tool
- ReportGenerator code coverage reporting tool.
- Azurite (for runtime - can be run via Docker)
To install Cake as a .NET tool:
dotnet tool install --global Cake.ToolTo install ReportGenerator as a .NET tool:
dotnet tool install --global dotnet-reportgenerator-globaltool --version 5.4.18This project uses Cake for build automation. The build script provides several tasks for different scenarios.
To run the default build (which performs a deep clean, build, and test):
dotnet cake-
Build - Builds the solution
dotnet cake --target=Build
-
Rebuild - Performs a deep clean followed by a full build
dotnet cake --target=Rebuild
-
Clean - Cleans the solution output directories and artifacts
dotnet cake --target=Clean
-
DeepClean - Removes all bin, obj, artifacts, test results, and test database files
dotnet cake --target=DeepClean
-
Test - Runs all tests with code coverage and generates reports (includes rebuild)
dotnet cake --target=Test
Test results are output to
./artifacts/test-results/and coverage reports are generated in./artifacts/coverage/. The coverage summary is displayed in the console after test execution.
-
CI - Runs the full CI pipeline (deep clean, build, test, and Docker build)
dotnet cake --target=CI
-
Docker - Builds the Docker container
dotnet cake --target=Docker
By default, builds use the Release configuration. To build in Debug mode:
dotnet cake --configuration=DebugBuild artifacts are organized in the ./artifacts/ directory:
./artifacts/test-results/- Test execution results and raw coverage data./artifacts/coverage/- Generated coverage reports (Markdown, Text Summary, and LCOV formats)
The project includes comprehensive integration and unit tests. Tests are automatically run with code coverage collection when using the Test, CI, or Default tasks.
dotnet cake --target=TestAfter running tests, coverage reports are available in multiple formats:
- Summary.txt - Text-based coverage summary displayed in console
- SummaryGithub.md - GitHub-flavored markdown summary
- lcov.info - LCOV format for integration with coverage tools
- src/ - Source code for the Azurite UI web application
- tests/ - Integration and unit tests
- docs/ - Additional documentation
- artifacts/ - Build outputs, test results, and coverage reports (generated)
The project includes Docker support for containerized deployment. Use Docker Compose to run Azurite UI alongside Azurite:
The Docker Compose setup supports environment variable configuration through a .env file. Copy .env.example to .env and modify as needed:
cp .env.example .envAvailable environment variables:
AZURITE_ACCOUNT_NAME- Storage account name (default: devstoreaccount1)AZURITE_ACCOUNT_KEY- Storage account key (default: well-known Azurite key)AZURITE_BLOB_PORT- Blob service port (default: 10000)AZURITEUI_PORT- AzuriteUI external port (default: 8080)
Run Azurite UI with the published container image:
docker compose -f docker-compose.example.yml up -dAccess the UI at http://localhost:8080
services:
# Azurite - Azure Storage emulator (not exposed externally)
azurite:
image: mcr.microsoft.com/azure-storage/azurite:latest
container_name: azurite
hostname: azurite
restart: unless-stopped
command: "azurite --blobHost 0.0.0.0 --queueHost 0.0.0.0 --tableHost 0.0.0.0 --loose --skipApiVersionCheck"
volumes:
- azurite-data:/data
networks:
- azurite-network
healthcheck:
test: nc 127.0.0.1 10000 -z
interval: 2s
retries: 15
expose:
- "10000" # Blob service
- "10001" # Queue service
- "10002" # Table service
environment:
- AZURITE_ACCOUNTS=devstoreaccount1:Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==
# AzuriteUI - Web interface (exposed externally)
azuriteui:
image: ghcr.io/adrianhall/azurite-ui:1.0.0
container_name: azurite-ui
hostname: azurite-ui
restart: unless-stopped
ports:
- "8080:8080" # Only expose UI
depends_on:
azurite:
condition: service_healthy
networks:
- azurite-network
volumes:
- azurite-ui-data:/app/data # Persist SQLite cache database
environment:
# Connection string pointing to internal Azurite service
- ConnectionStrings__Azurite=DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://azurite:10000/devstoreaccount1;
- ConnectionStrings__CacheDatabase=Data Source=/app/data/cache.db;Mode=ReadWriteCreate;Cache=Shared;Foreign Keys=True;
- ASPNETCORE_ENVIRONMENT=Production
- ASPNETCORE_URLS=http://+:8080
healthcheck:
test: ["CMD", "curl", "--fail", "http://localhost:8080/api/health"]
interval: 30s
timeout: 5s
retries: 3
start_period: 15s
networks:
azurite-network:
driver: bridge
name: azurite-network
volumes:
azurite-data:
name: azurite-data
driver: local
azurite-ui-data:
name: azurite-ui-data
driver: localThis configuration is available as docker-compose.example.yml in the repository.
Container images are automatically published to GitHub Container Registry with each release:
# Pull specific version
docker pull ghcr.io/adrianhall/azurite-ui:1.0.0
# Pull latest stable release
docker pull ghcr.io/adrianhall/azurite-ui:latestFor development builds from source, use docker-compose.yml which builds the image locally.
Supported: Blob storage container and blob operations
Not Supported: Azure Queue and Table storage (available in Azurite but not targeted by this UI)
This is a developer tool designed for local development and testing scenarios. Contributions that enhance the developer experience for working with Azurite are welcome.
This project is licensed under the MIT License - see the LICENSE.md file for details.
Copyright (c) 2025 Adrian Hall photoadrian@outlook.com