Skip to content

Latest commit

Β 

History

461 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

My Album logo

My Album

MyAlbum is a modern web application for sharing photo albums and individual photos, enriched with location context via Google Maps and AI-powered assistance.

Users can:
  • Create and share albums
  • Upload and browse photos
  • View photo locations on Google Maps
  • Use an AI assistant to:
    1. Auto-generate image titles and descriptions
    2. Suggest friendly comments based on user-provided hints

The system is built using a microservices architecture, designed to be scalable, extensible, and production-ready.

🚦Status

Codecov AppVeyor

  • Core album and photo features are functional
  • AI service is live and evolving
  • Architecture is stable, but APIs and UI may continue to change

βœ… Next focus

  • Improving AI-assisted features
  • Strengthening CI/CD and deployment reliability
  • Enhancing user experience and performance

🧠 Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚        Web Browser          β”‚
β”‚         (React UI)          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
               β”‚ HTTPS
               β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚    WebSPA.React.Identity    β”‚
β”‚ - Serves frontend UI        β”‚
β”‚ - Authentication            β”‚
β”‚ - Issues JWT tokens         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
               β”‚ JWT
               β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                                   Microservices                                       β”‚
β”‚                                                                                       β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ Albums Service β”‚ β”‚ Photos Service β”‚ β”‚ Comments Service | |       AI Service       | |
| |(C#, .NET Core) | |(C#, .NET Core) | |  (C#, .NET Core) | | (Python, FastAPI + LLM)| |
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ |
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ” Identity & Authentication

WebSPA.React.Identity acts as both:

  • The frontend entry point
  • The authentication authority

Responsibilities:

  • Serves React frontend requests
  • Handles user authentication
  • Issues JWT tokens
  • Acts as a gateway for downstream API calls

All downstream services validate JWT tokens issued by WebSPA.React.Identity.


🧩 Backend Microservices

Each backend service is:

  • Independently deployable
  • Stateless
  • Protected by JWT
  • Documented with Swagger / OpenAPI
Service Responsibility
Albums Album management
Photos Photo upload, metadata, and location
Comments User comments on photos
AI Service Image description & comment suggestion

πŸ€– AI Service Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ React Frontend           β”‚
β”‚ (Generate / Suggest UI)  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
             β”‚ HTTPS + JWT
             β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚     AI Service API       β”‚
β”‚        (FastAPI)         β”‚
β”‚                          β”‚
β”‚ /image/describe          β”‚
β”‚ /comment/suggest         β”‚
β”‚                          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
             β”‚
             β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ LLM Provider Layer       β”‚
β”‚ (Pluggable Design)       β”‚
β”‚                          β”‚
β”‚ - OpenAI (current)       β”‚
β”‚ - Future providers       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Key design goals

  • Provider-agnostic LLM layer
  • Easy model switching
  • Clean separation between API, prompts, and providers

The AI service enhances user experience by automating repetitive and creative tasks:

  • Image description
    • Auto-generate title and description from image content
  • Comment suggestion
    • Generate friendly comments based on user hints (positive or negative)
  • Extensible architecture
    • Designed to support multiple LLM providers in the future

🌐 Website

πŸ› οΈ Technology Stack

Frontend

  • React
  • TypeScript

Backend

  • .NET Core + SignalR + Entity Framework (Albums, Photos, Comments)
  • FastAPI (AI Service)

AI

  • OpenAI (current provider)
  • Pluggable provider design

Infrastructure

  • Azure App Service
  • GitHub Actions (CI/CD)

πŸš€ Scheduled Photo Ingestion

πŸ“Œ Description

MyAlbum now supports a Scheduled Photo Ingestion feature that automatically retrieves photos from external photo providers (like Pexels) based on configured categories and criteria. A scheduler enqueues ingestion tasks daily, a message queue buffers tasks, and a background worker retrieves and stores photos into the MyAlbum database without duplication. This enables automated enrichment of MyAlbum content and decouples scraping logic from the core API.

🧠 Architecture

 +------------------+       +----------------------+       +------------------+
 |   Dagster        |       | Azure Service Bus    |       |  C# Worker       |
 | (Scheduler/      |  -->  | (Task Queue / DLQ)   |  -->  | (.NET, Queue     |
 |  Orchestrator)   |       |                      |       |  Processing)     |
 +------------------+       +----------------------+       +------------------+
                                                              β”‚         β”‚
                                                              β–Ό         β”‚
                                           β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
                                           β”‚ WebSPA.React.Identity |    β”‚
                                           β”‚ (Generate JWT Token)  |    β”‚
                                           β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
                                                                        β”‚ JWT
                                                                        β–Ό
                                                         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                                                         β”‚    Microservices     β”‚
                                                         β”‚                      β”‚
                                                         β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
                                                         β”‚ β”‚ Photos Service   | |
                                                         | |  (C#, .NET Core) | |
                                                         β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ |
                                                         β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ› οΈ Tech Stack

Component Technology
Scheduling & Orchestration Python, Dagster
Task Queue Azure Service Bus
Worker / Processing C# (.NET 10) Worker
Photo Provider APIs Pexels (extendable to Flickr, etc.)
Photo API MyAlbum Photo API (ASP.NET Core)
Storage MyAlbum Database
Deployment (Dev) Docker / Docker Compose
Deployment (Cloud) Azure Container Apps / Azure Services

πŸŽ₯ Screenshots

  1. Explore photos and albums (Click on the thumbnail to view the video) My Album - Explore
  2. AI features
    1. Auto-generate image title (after Login and select Edit Photo pencil icon) Edit Photo
    2. Suggest friendly comments (after Login and add hint to New Comment textbox) New Comment

Supporters πŸ‘

Thanks to everyone who has supported this project through ideas, feedback, and testing ❀️ Stargazers repo roster for @NhatTanVu/myalbum

About

Share photos/albums, support auto-tag by object detection, developed on .NET Core 5 and FastAPI, with Angular 8.0/React 16.12, deployed on Azure/Docker

Topics

Resources

Stars

8 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages