π Inside the Architecture of SnappShare: Building a Reliable File-Sharing System with Nuxt 3 & .NET


SnappShare isnβt just another file upload app β itβs a secure, chunked, resumable, and production-ready file-sharing platform. In this post, Iβll walk you through how I structured the architecture, the challenges I solved, and why I made certain decisions β from the Nuxt 3 frontend to the robust .NET API.
π What is SnappShare?
SnappShare is a secure file-sharing system that supports:
π Resumable uploads (ideal for poor network conditions)
π§± Chunk-based file transfers with retry logic
π SAS-secured download links
π¦ Azure Blob Storage & Service Bus integration
π Access tracking, progress, and expiration handling
Live frontend: https://snappshare-web.vercel.app
GitHub: Frontend | Backend
π₯οΈ Frontend Architecture (Nuxt 3 + Pinia + IndexedDB)
π§ Core Responsibilities
Chunked uploads with retry
Persistent resumable jobs via IndexedDB
File previews, status-based UI, and progress tracking
Offline resilience
State management with Pinia
π Folder Structure
SnappShareWeb/
βββ components/ # UI components (buttons, skeletons, toasts)
βββ composables/ # Logic (upload runner, hash worker, toasts)
βββ layouts/ # Nuxt layouts (optional use)
βββ pages/ # Route-based views
βββ public/ # Static assets
βββ server/ # (Unused for now)
βββ stores/ # Pinia stores (e.g., file-uploads.ts)
βββ tests/ # Placeholder for tests
βββ types/ # Global types (e.g., UploadJob)
βββ workers/ # Web workers (e.g., hash.worker.ts)
βββ services/ # API abstraction layer
βββ nuxt.config.ts # Project config
π§© Key Layers
π useUploadJobRunner.ts
Encapsulates:
Chunk slicing
Retry logic (3 attempts max)
Progress tracking
Upload finalization
π§ file-uploads.ts
Store
Handles upload state:
Start, resume, remove uploads
List reactive jobs
Status filtering & sorting
πΎ IndexedDB Layer
Persists jobs locally
Resumes uploads by file hash
Uses
idb-keyval
for simplicity
βοΈ Workers
SHA hashing offloaded to
hash.worker.ts
Improves performance before upload begins
πΌοΈ UI Layer
Lottie animations + skeleton loaders
Custom components for progress, status, and feedback
π§° Backend Architecture (.NET 8 + EF Core + Azure)
π§ Core Project Layers
api/
βββ Controllers/ # FileEntry endpoints
βββ DTOs/ # Input/output contracts
βββ Models/ # EF Core entities + Enums
βββ Services/ # Core logic
βββ Repositories/ # EF Core data layer
βββ Configs/ # Azure config bindings
βββ Middlewares/ # Global error handling
βββ Extensions/ # Service registration
βββ Program.cs # App bootstrap
π§ Logic Breakdown
Feature | Flow |
Create File | Controller β Service β Repo |
Upload Chunk | Controller β Service β Blob Storage |
Finalize Upload | Commit block blob, mark file complete, expose SAS URL |
Retry/Lock Check | Re-evaluate lock expiration and resume incomplete uploads |
Expiry Handling | Computed via model: UpdatedAt + ExpiryDuration |
βοΈ Azure Integrations
Blob Storage for chunked file uploads (Block Blobs)
Azure Service Bus to delay deletion messages (post-upload expiry)
App Service hosting for API
SAS tokens for secure, temporary file access
π CORS & Security
Whitelisted frontend origins only
Supports secure credentials via
.AllowCredentials()
Global error handling via
GlobalExceptionHandler
for clean ProblemDetails responses
π Testing & Future-Proofing
β Frontend Plans
Background upload queue (with concurrency control)
Drag-and-drop support
Pause/resume upload logic
Error logs per chunk
β Backend Improvements
Unit & integration tests using mock interfaces
File lifecycle monitoring
WebSocket integration for real-time status updates
π¦ Why This Stack?
Nuxt 3: SSR-ready, modular, and built for Vue 3 with Vite speed.
Pinia: Modern, type-safe state management.
IndexedDB: Offline-friendly resumable uploads.
.NET + EF Core: Scalable and fast backend with built-in DI, validation, and clean layering.
Azure Services: Production-grade blob storage and message scheduling out of the box.
π Explore the Code
π Frontend GitHub: SnappShareWeb
βοΈ Backend GitHub: SnappShare
βοΈ Final Thoughts
SnappShare has been a personal dive into solving real-world file upload problems β poor connections, huge files, and secure access β with a clean, maintainable architecture.
Itβs not just a side project β itβs a showcase of practical software engineering with real-world Azure integration and frontend resilience.
Have feedback? Try the live version or check out the code and open an issue. Letβs build better uploads β together.
π’ Letβs Connect
Follow my journey building tools like SnappShare, diving deep into .NET, Azure, and full-stack development:
π LinkedIn: Freeman
π¦ X (Twitter): @Freemancodz
πΊ YouTube: Freemancodz
Subscribe to my newsletter
Read articles from Freeman Madudili directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by

Freeman Madudili
Freeman Madudili
Hi, Iβm Freeman, a Software Developer specializing in C#, .NET, and Azure. With a passion for creating seamless web and cloud solutions, Iβve built and deployed apps that solve real-world problems. Follow along as I share insights, projects, and tips from my journey in tech!