Skip to content

AI-powered Blazor-based .NET web-application with skills tracking and learning recommendation.

License

Notifications You must be signed in to change notification settings

bykeny/SkillSync

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

19 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

SkillSync πŸš€

AI-Powered Skills Tracking and Learning Recommendation Platform

SkillSync is a modern full-stack web application that helps developers and professionals track their learning journey, get AI-powered recommendations, and automatically sync their GitHub activity to discover new skills.

License .NET Blazor

🌟 Features

Core Features

  • πŸ“Š Skills Management - Track and manage your technical skills with proficiency levels
  • πŸ“ Activity Tracking - Log learning activities (courses, projects, practice sessions)
  • 🎯 Milestone Planning - Set and track learning goals with deadlines
  • πŸ“ˆ Analytics Dashboard - Visualize progress with interactive charts
  • πŸ€– AI Recommendations - Get personalized learning paths powered by Google Gemini
  • πŸ”— GitHub Integration - Automatically sync repositories and detect programming languages
  • πŸ“§ Email Notifications - Weekly summaries and milestone reminders
  • ⏰ Background Jobs - Automated data synchronization with Hangfire

Technical Highlights

  • Modern Architecture - Clean, maintainable codebase following best practices
  • Responsive Design - Beautiful UI built with TailwindCSS and MudBlazor
  • Real-time Updates - Dynamic charts and live data visualization with ApexCharts
  • Secure Authentication - JWT-based auth with refresh tokens
  • Comprehensive Testing - Unit and integration tests with automated CI/CD
  • API Documentation - Interactive documentation with Scalar

πŸ—οΈ Architecture

Technology Stack

Backend:

  • ASP.NET Core 10 Web API
  • Entity Framework Core 10
  • SQL Server
  • Hangfire (Background Jobs)
  • Google Gemini AI (gemini-2.5-flash-lite)
  • JWT Authentication
  • Serilog (Logging)
  • FluentValidation

Frontend:

  • Blazor WebAssembly
  • TailwindCSS
  • MudBlazor
  • Blazor-ApexCharts
  • Blazored LocalStorage
  • Markdig (Markdown rendering)

Infrastructure:

  • GitHub Actions (CI/CD)
  • xUnit (Testing)
  • Moq & FluentAssertions
  • Octokit (GitHub API)

Project Structure

SkillSync/
β”œβ”€β”€ SkillSync.Api/              # Backend Web API
β”‚   β”œβ”€β”€ Controllers/            # API endpoints
β”‚   β”œβ”€β”€ Services/              # Business logic
β”‚   β”‚   β”œβ”€β”€ Activities/        # Activity management
β”‚   β”‚   β”œβ”€β”€ AI/                # AI recommendation service
β”‚   β”‚   β”œβ”€β”€ Analytics/         # Analytics & reporting
β”‚   β”‚   β”œβ”€β”€ Auth/              # Authentication & authorization
β”‚   β”‚   β”œβ”€β”€ BackgroundJobs/    # Hangfire background jobs
β”‚   β”‚   β”œβ”€β”€ GitHub/            # GitHub integration
β”‚   β”‚   β”œβ”€β”€ Milestones/        # Milestone management
β”‚   β”‚   β”œβ”€β”€ Notifications/     # Email notifications
β”‚   β”‚   └── Skills/            # Skills management
β”‚   β”œβ”€β”€ Data/                  # Database entities & DbContext
β”‚   β”œβ”€β”€ DTOs/                  # Data transfer objects
β”‚   β”œβ”€β”€ Validators/            # FluentValidation rules
β”‚   └── Migrations/            # EF Core migrations
β”œβ”€β”€ SkillSync.Web/             # Blazor WebAssembly Frontend
β”‚   β”œβ”€β”€ Pages/                 # Razor pages
β”‚   β”œβ”€β”€ Services/              # API client services
β”‚   β”œβ”€β”€ Models/                # Frontend models
β”‚   β”œβ”€β”€ Auth/                  # Authentication providers
β”‚   β”œβ”€β”€ Layout/                # Layout components
β”‚   └── wwwroot/               # Static assets
β”œβ”€β”€ Tests/
β”‚   β”œβ”€β”€ SkillSync.Tests.Unit/          # Unit tests
β”‚   └── SkillSync.Tests.Integration/   # Integration tests
└── .github/
    └── workflows/             # CI/CD pipelines

πŸš€ Getting Started

Prerequisites

Installation

  1. Clone the repository

    git clone https://github.com/bykeny/SkillSync.git
    cd SkillSync
  2. Configure Database

    Update connection string in SkillSync.Api/appsettings.json:

    {
      "ConnectionStrings": {
        "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=SkillSyncDb;Trusted_Connection=true;MultipleActiveResultSets=true;TrustServerCertificate=true"
      }
    }
  3. Configure API Keys

    Add your API keys to SkillSync.Api/appsettings.json:

    {
      "Gemini": {
        "ApiKey": "your-gemini-api-key",
        "Model": "gemini-2.5-flash-lite"
      },
      "GitHub": {
        "ClientId": "your-github-client-id",
        "ClientSecret": "your-github-client-secret",
        "RedirectUri": "https://localhost:7065/api/github/callback"
      },
      "Email": {
        "SmtpHost": "smtp.gmail.com",
        "SmtpPort": 587,
        "SmtpUsername": "your-email@gmail.com",
        "SmtpPassword": "your-app-password",
        "FromEmail": "skillsync@gmail.com",
        "FromName": "SkillSync"
      },
      "JwtSettings": {
        "Secret": "your-jwt-secret-key-min-32-chars",
        "Issuer": "SkillSyncAPI",
        "Audience": "SkillSyncWeb"
      }
    }

    πŸ’‘ Tip: Use User Secrets for development: dotnet user-secrets set "Gemini:ApiKey" "your-key"

  4. Apply Database Migrations

    cd SkillSync.Api
    dotnet ef database update
  5. Build TailwindCSS

    cd ../SkillSync.Web
    npm install
    npm run css:build
  6. Run the Application

    In Visual Studio:

    • Set multiple startup projects (SkillSync.Api + SkillSync.Web)
    • Press F5

    Or via command line:

    # Terminal 1 - API
    cd SkillSync.Api
    dotnet run
    
    # Terminal 2 - Web
    cd SkillSync.Web
    dotnet run
  7. Access the Application


πŸ“– Usage Guide

Getting Started

  1. Register an Account

  2. Add Your First Skill

    • Go to Skills page
    • Click "Add Skill"
    • Enter skill details (name, proficiency level, target level)
    • Select a category
  3. Track Activities

    • Navigate to Activities
    • Log learning activities (courses, projects, practice)
    • Link activities to skills
  4. Get AI Recommendations

    • Go to Recommendations
    • Click "Learning Path" and select a skill
    • Get personalized step-by-step guidance powered by Google Gemini
    • Generate weekly schedules and gap analysis
  5. Connect GitHub

    • Navigate to GitHub page
    • Click "Connect with GitHub"
    • Authorize the app
    • View your repositories and language stats
    • Skills are auto-created from detected languages
  6. View Analytics

    • Check the Analytics dashboard
    • View progress charts, skill radar, and activity timeline
    • Filter by date range (7, 14, 30, or 90 days)

πŸ§ͺ Testing

Run All Tests

dotnet test

Run Unit Tests Only

dotnet test Tests/SkillSync.Tests.Unit

Run Integration Tests Only

dotnet test Tests/SkillSync.Tests.Integration

Generate Code Coverage

dotnet test --collect:"XPlat Code Coverage"

πŸ”§ Configuration

Environment Variables

For production deployment, use environment variables instead of appsettings.json:

ConnectionStrings__DefaultConnection="your-connection-string"
JwtSettings__Secret="your-jwt-secret"
JwtSettings__Issuer="SkillSyncAPI"
JwtSettings__Audience="SkillSyncWeb"
Gemini__ApiKey="your-gemini-key"
Gemini__Model="gemini-2.5-flash-lite"
GitHub__ClientId="your-github-client-id"
GitHub__ClientSecret="your-github-client-secret"
Email__SmtpHost="smtp.gmail.com"
Email__SmtpPort="587"
Email__SmtpUsername="your-email@gmail.com"
Email__SmtpPassword="your-app-password"

JWT Configuration

The application uses JWT with refresh tokens:

  • Access Token: 15 minutes
  • Refresh Token: 7 days
  • Tokens are stored in LocalStorage (frontend)
  • Refresh tokens are stored in database with rotation

Background Jobs

Scheduled jobs run automatically via Hangfire:

  • Weekly Summary: Every Monday at 9 AM
  • Milestone Reminders: Daily at 8 AM
  • GitHub Sync: Daily at 2 AM

You can monitor and manage jobs at https://localhost:7065/hangfire


πŸ“Š API Documentation

Authentication Endpoints

Register

POST /api/auth/register
Content-Type: application/json

{
  "email": "user@example.com",
  "password": "SecurePassword123!",
  "confirmPassword": "SecurePassword123!",
  "firstName": "John",
  "lastName": "Doe"
}

Login

POST /api/auth/login
Content-Type: application/json

{
  "email": "user@example.com",
  "password": "SecurePassword123!"
}

Response:

{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "refreshToken": "refresh-token-here",
  "expiresIn": 900
}

Refresh Token

POST /api/auth/refresh
Content-Type: application/json

{
  "refreshToken": "your-refresh-token"
}

Skills Endpoints

All skills endpoints require authentication (Bearer token).

Get All Skills

GET /api/skills
Authorization: Bearer {access_token}

Create Skill

POST /api/skills
Authorization: Bearer {access_token}
Content-Type: application/json

{
  "name": "C# Programming",
  "description": "Learning C# and .NET",
  "proficiencyLevel": 3,
  "targetLevel": 5,
  "categoryId": 1
}

Update Skill

PUT /api/skills/{id}
Authorization: Bearer {access_token}
Content-Type: application/json

{
  "name": "C# Programming",
  "proficiencyLevel": 4,
  "targetLevel": 5,
  "isActive": true
}

AI Recommendations

Get Learning Path

POST /api/recommendations/learning-path/{skillId}
Authorization: Bearer {access_token}

Returns a personalized learning path with steps, resources, and timeline.

For complete API documentation, visit https://localhost:7065/scalar/v1 when running the application.


πŸš€ Deployment

Azure App Service

  1. Create Azure Resources

    az group create --name SkillSyncRG --location eastus
    az appservice plan create --name SkillSyncPlan --resource-group SkillSyncRG --sku B1
    az webapp create --name skillsync-api --resource-group SkillSyncRG --plan SkillSyncPlan --runtime "DOTNET|10.0"
  2. Deploy API

    cd SkillSync.Api
    dotnet publish -c Release
    az webapp deploy --resource-group SkillSyncRG --name skillsync-api --src-path bin/Release/net10.0/publish
  3. Configure Environment Variables

    az webapp config appsettings set --resource-group SkillSyncRG --name skillsync-api --settings \
      ConnectionStrings__DefaultConnection="your-connection-string" \
      JwtSettings__Secret="your-jwt-secret" \
      Gemini__ApiKey="your-gemini-key"

Docker (Optional)

# Dockerfile for API
FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
WORKDIR /src
COPY ["SkillSync.Api/SkillSync.Api.csproj", "SkillSync.Api/"]
RUN dotnet restore "SkillSync.Api/SkillSync.Api.csproj"
COPY . .
WORKDIR "/src/SkillSync.Api"
RUN dotnet build "SkillSync.Api.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "SkillSync.Api.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "SkillSync.Api.dll"]

πŸ”’ Security

Implemented Security Measures

  • βœ… JWT authentication with refresh tokens
  • βœ… Password hashing with ASP.NET Identity
  • βœ… HTTPS enforcement
  • βœ… CORS configuration
  • βœ… SQL injection prevention (EF Core parameterized queries)
  • βœ… XSS protection (Blazor auto-escaping)
  • βœ… Input validation with FluentValidation
  • βœ… User Secrets support for local development
  • βœ… Rate limiting on authentication endpoints

Security Best Practices

  • Never commit API keys or secrets to version control
  • Use User Secrets during development: dotnet user-secrets
  • Use environment variables in production
  • Rotate JWT secrets regularly
  • Enable 2FA for GitHub OAuth
  • Keep dependencies updated
  • Review security advisories regularly

🀝 Contributing

Contributions are welcome! Please follow these steps:

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/AmazingFeature)
  3. Commit your changes (git commit -m 'Add some AmazingFeature')
  4. Push to the branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

Coding Standards

  • Follow C# coding conventions
  • Write unit tests for new features (aim for 70%+ coverage)
  • Use FluentValidation for input validation
  • Update documentation
  • Keep commits atomic and descriptive
  • Ensure all tests pass before submitting PR

πŸ“ License

This project is licensed under the MIT License - see the LICENSE file for details.

Copyright (c) 2026 Kanan Ramazanov


πŸ™ Acknowledgments

  • Google Gemini - AI-powered recommendations using gemini-2.5-flash-lite
  • GitHub - OAuth and API integration via Octokit
  • TailwindCSS - Beautiful, responsive styling
  • MudBlazor - Comprehensive Blazor component library
  • ApexCharts - Interactive data visualization
  • Hangfire - Reliable background job processing
  • Scalar - Modern API documentation

πŸ“§ Contact

Kanan Ramazanov

Project Link: https://github.com/bykeny/SkillSync


πŸ—ΊοΈ Roadmap

  • Core skills and activity tracking
  • AI-powered recommendations with Google Gemini
  • GitHub integration with Octokit
  • Analytics dashboard with ApexCharts
  • Background jobs and email notifications
  • CI/CD pipeline with GitHub Actions
  • Mobile app (React Native or .NET MAUI)
  • Social features (share progress, follow others)
  • Gamification (badges, achievements, streaks)
  • Team collaboration features
  • Learning resource marketplace
  • Browser extension for quick activity logging
  • Export/import functionality
  • Dark mode theme support

Built with ❀️ using .NET 10 and Blazor WebAssembly

About

AI-powered Blazor-based .NET web-application with skills tracking and learning recommendation.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published