Distributed image processing backend built with .NET Aspire, plus a TanStack Start frontend.
This project lets users upload images, process them asynchronously, and view both technical image outputs and AI analysis.
- .NET Aspire (service orchestration)
- ASP.NET Core Web API + JWT auth
- Entity Framework Core + PostgreSQL
- RabbitMQ (async queueing)
- S3/Cloudflare R2 (private object storage with presigned URLs)
- ImageSharp (image transforms and metadata)
- OpenAI API (image AI enrichment)
- Hangfire (scheduled cleanup jobs)
- TanStack Start (frontend)
- Backend: VPS on Hetzner (https://dotnetapi.hla.dev)
- Frontend: Cloudflare (https://dotnetdemo.hla.dev)
- Storage: AWS S3 (primary), Cloudflare R2
- User registers/logs in and uploads an image.
- API stores the original image in S3/R2 and creates a job record in PostgreSQL.
- API publishes an image processing message to RabbitMQ.
- Worker generates thumbnails, optimized output, and metadata.
- Worker publishes an AI analysis message.
- Worker runs AI analysis (summary, tags, OCR text, safety flags, model/cost metadata).
- API returns job details to the UI, including presigned read URLs for private storage objects.
ImageProcessor.AppHost: .NET Aspire orchestration for local development.ImageProcessor.ApiService: REST API, auth, job APIs, presigned URL generation, caching, rate limiting.ImageProcessor.Worker: background consumers for image processing + AI analysis.ImageProcessor.Data: EF Core data model and migrations.ImageProcessor.Contracts: queue message contracts.web: TanStack Start frontend (Cloudflare deploy target).
Each job tracks two stages:
Status: image processing stage (Pending,Processing,Completed,Error, ...)AiStatus: AI stage (Pending,Processing,Completed,Error,Skipped)
The frontend shows an overall status derived from both.
POST /api/auth/registerPOST /api/auth/loginPOST /api/images/upload(JWT required)GET /api/images(JWT required, paged list)GET /api/images/{jobId}(JWT required, full detail)
Objects are kept private in S3/R2. API returns presigned read URLs so the browser can fetch images securely without making buckets public.
web/README.md contains TanStack Start-specific notes.