FeedbackFlow is a comprehensive feedback collection and analysis platform that helps teams gather, consolidate, and analyze feedback from multiple sources including GitHub, YouTube, Reddit, Hacker News, and social media platforms. The platform consists of a modern Blazor web application, Azure Functions backend, and command-line tools for data collection.
π Production: https://feedbackflow.app
π§ͺ Staging: https://staging.feedbackflow.app
FeedbackFlow follows a modern .NET architecture with the following components:
- Blazor Server application built with .NET 9
- Modern, responsive UI with light/dark theme support
- Real-time feedback collection and analysis
- Interactive dashboards and reporting
- User authentication and session management
- Serverless backend for data processing
- RESTful APIs for the web application
- Background processing for large data collections
- Integration with AI services for sentiment analysis
- Scheduled tasks for automated data updates
- Common models and utilities
- Data transfer objects (DTOs)
- Business logic shared between components
- Serialization and validation helpers
Collection tools for different platforms:
Retrieves data from GitHub issues, discussions, and pull requests with associated comments.
Gathers comments from YouTube videos and playlists, supporting bulk operations.
Extracts posts and comments from Reddit discussions and threads.
Collects stories and comments from Hacker News discussions.
Comprehensive test suite using MSTest for:
- URL parsing and validation
- Data transformation logic
- Service integrations
- Business rule validation
Work in progress - MCP server for AI integration and automated analysis.
- GitHub: Issues, discussions, pull requests, and comments
- YouTube: Video comments and playlist discussions
- Reddit: Posts, comments, and thread discussions
- Hacker News: Stories and comment threads
- Social Media: Twitter/X and BlueSky integration
- Sentiment analysis using Azure OpenAI
- Automated categorization and tagging
- Trend identification and insights
- Content summarization
- Responsive design for all devices
- Light and dark theme support
- Accessible interface with keyboard navigation
To use FeedbackFlow, ensure you have the following:
- .NET 9.0 SDK installed
- A valid GitHub API Key
- A valid YouTube API Key
-
Clone the repository:
git clone https://github.com/jamesmontemagno/feedbackflow.git cd feedbackflow -
Restore dependencies:
dotnet restore
-
Build the project:
dotnet build
-
Navigate to the web app directory:
cd feedbackwebapp -
Run the application:
dotnet run
-
Open your browser to
https://localhost:7154(or the URL shown in the terminal)
For the full development experience with orchestration:
-
Navigate to the AppHost directory:
cd FeedbackFlow.AppHost -
Run the orchestrated application:
dotnet run
This will start both the web application and Azure Functions locally with proper service discovery.
cd ghdump
dotnet run -- -r <owner/repository>Example:
dotnet run -- -r microsoft/dotnetcd ytdump
dotnet run -- -v <video-id> -o <output-file.json>Example:
dotnet run -- -v dQw4w9WgXcQ -o youtube-comments.jsoncd rddump
dotnet run -- -u <reddit-url>cd hndump
dotnet run -- -i <story-id>FeedbackFlow/
βββ feedbackwebapp/ # Blazor Server web application
βββ feedbackfunctions/ # Azure Functions backend
βββ shareddump/ # Shared library and models
βββ FeedbackFlow.AppHost/ # .NET Aspire orchestration
βββ feedbackflow.tests/ # Unit and integration tests
βββ ghdump/ # GitHub collection tool
βββ ytdump/ # YouTube collection tool
βββ rddump/ # Reddit collection tool
βββ hndump/ # Hacker News collection tool
βββ feedbackmcp/ # MCP server (WIP)
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Make your changes following the coding guidelines in the instructions
- Write tests for new functionality
- Run tests:
dotnet test - Commit your changes:
git commit -m 'Add amazing feature' - Push to the branch:
git push origin feature/amazing-feature - Open a Pull Request
- Follow C# naming conventions (PascalCase for public, camelCase for private)
- Use file-scoped namespaces
- Implement proper async/await patterns
- Add component-specific CSS in
.razor.cssfiles for Blazor components - Support both light and dark themes
- Write meaningful commit messages
The application is configured for deployment to Azure with:
- Azure App Service for the web application
- Azure Functions for the serverless backend
- GitHub Actions for CI/CD with staging and production environments
Set up the following environments:
- Production:
https://feedbackflow.app - Staging:
https://staging.feedbackflow.app(deployed on PR creation)
To run the Azure Functions project locally, you'll need to configure the local.settings.json file in the feedbackfunctions directory. Create the file with the following structure:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated",
"GitHub:AccessToken": "your_github_pat_here",
"YouTube:ApiKey": "your_youtube_api_key_here",
"Azure:OpenAI:Endpoint": "your_azure_openai_endpoint",
"Azure:OpenAI:ApiKey": "your_azure_openai_key",
"Azure:OpenAI:Deployment": "your_model_deployment_name"
}
}-
GitHub Personal Access Token (PAT)
- Create a GitHub PAT with
reposcope - Set it in
GitHub:AccessToken
- Create a GitHub PAT with
-
YouTube API Key
- Create a project in Google Cloud Console
- Enable YouTube Data API v3
- Create API credentials
- Set the key in
YouTube:ApiKey
-
Azure OpenAI Configuration
- Create an Azure OpenAI resource
- Set the endpoint URL in
Azure:OpenAI:Endpoint - Set the API key in
Azure:OpenAI:ApiKey - Deploy a model and set its name in
Azure:OpenAI:Deployment
-
Azure Storage Emulator
- Install Azure Storage Emulator for local development
- The default connection string is already set in
AzureWebJobsStorage
After configuring the settings:
cd feedbackfunctions
func startNote: Keep your API keys and tokens secure and never commit them to source control.
You will need the following:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated"
},
"YouTube:ApiKey": "YOUR_API_KEY_HERE",
"Reddit:ClientId": "YOUR_REDDIT_CLIENT_ID",
"Reddit:ClientSecret": "YOUR_REDDIT_CLIENT_SECRET",
"GitHub:AccessToken": "YOUR_ACCESS_TOKEN_HERE",
"Azure:OpenAI:Endpoint": "YOUR_AZURE_OPENAI_ENDPOINT",
"Azure:OpenAI:ApiKey": "YOUR_AZURE_OPENAI_API_KEY",
"Azure:OpenAI:Deployment": "YOUR_DEPLOYMENT_NAME",
"Twitter:BearerToken": "YOUR_TWITTER_BEARER_TOKEN",
"BlueSky:Username": "YOUR_BLUESKY_USERNAME",
"BlueSky:AppPassword": "YOUR_BLUESKY_APP_PASSWORD"
}This project is licensed under the MIT License. See the LICENSE file for details.