I did a significant architectural overhaul today, introducing the MediatR library to implement the command/handler pattern. This separates the application into distinct commands like ScrapeCommand, GenerateImages, and GenerateContent, each with their own handlers. The main program is now much cleaner with proper dependency injection for services.

The biggest new feature is S3 image storage. Instead of keeping processed images locally, they’re now uploaded to S3 with a date-based folder structure. This makes the images accessible for other uses and reduces local disk requirements.

I also migrated the database to use snake_case column naming conventions, added Dapper alongside Entity Framework for raw SQL queries in the content generation command, and split out brand information from product names to resolve an open issue. Finally, I added a backfill command to retroactively process images for existing products that were scraped before the S3 integration.