A .NET 10 Blazor Web App for browsing and managing Sessionize Call for Papers (CFP) submissions. This application fetches open CFPs from the Sessionize API and provides a user-friendly interface to search, filter, and view conference details.
- π Search & Filter: Search by name, location, topics, tags, and more
- π Date Sorting: Sort by CFP end date, CFP start date, event date, name, or country
- π Location Filtering: Filter by country
- π° Expense Filters: Filter conferences that cover travel and/or accommodation
- π± Responsive Design: Works on desktop and mobile devices
- π Real-time Updates: Refresh data from Sessionize API on demand
- π Pagination: Browse through results with pagination controls
- π CFP Status: Quickly identify open vs closed CFPs
- .NET 10 SDK or later
- A Sessionize API token (get one from Sessionize)
- Windows, macOS, or Linux operating system
-
Clone the repository:
git clone https://github.com/yourusername/SessionizeCfpViewer.git cd SessionizeCfpViewer -
Navigate to the project directory:
cd src/SessionizeCfpViewer -
Configure the API token:
Edit
appsettings.jsonand add your Sessionize API token:{ "API_TOKEN": "your-sessionize-api-token-here" }Alternatively, for development, use User Secrets:
dotnet user-secrets init dotnet user-secrets set "API_TOKEN" "your-sessionize-api-token-here"
-
Restore dependencies:
dotnet restore
-
Build the project:
dotnet build
-
Start the application:
dotnet run
-
Open your browser and navigate to:
- HTTPS:
https://localhost:5001 - HTTP:
http://localhost:5000
The exact port numbers will be displayed in the terminal when the application starts.
- HTTPS:
The main page displays all available CFP sessions with the following features:
-
Refresh Data: Click "Refresh from API" to fetch the latest CFPs from Sessionize
-
Search: Type in the search box to filter by:
- Conference name
- Location (city, country)
- Topics
- Tags
- Categories
-
Sort Options:
- CFP End Date (default)
- CFP Start Date
- Event Start Date
- Name (alphabetical)
- Country
-
Filter Options:
- Open CFPs Only: Show only conferences with open CFPs (checked by default)
- Ascending: Change sort order from descending to ascending
- Travel Covered: Show only conferences that cover travel expenses
- Accommodation Covered: Show only conferences that cover accommodation
-
Country Filter: Use the dropdown to filter by specific country
-
Pagination: Navigate through results using Previous/Next buttons
Each conference card displays:
- Conference name
- Location (for in-person/hybrid events)
- CFP closing date
- Event dates
- Badges indicating:
- π Online/In-Person/Hybrid
- π° Free (if no conference fee)
βοΈ Travel Covered- π¨ Accommodation Covered
- π Open / π Closed (CFP status)
- Brief description
- Action buttons:
- View Details: See full conference information
- Visit Site: Go to conference website
- View CFP: Direct link to submit your proposal
Click on any conference card or "View Details" to see:
- Full description
- Complete location details with timezone
- All important dates (CFP open/close, event dates, last updated)
- Topics and session formats accepted
- Tags and categories
- Social media links
- Direct links to submit proposals
Edit appsettings.json to configure:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"API_TOKEN": "your-api-token-here"
}The application is configured in Properties/launchSettings.json with the following profiles:
- http: Runs on http://localhost:5000
- https: Runs on https://localhost:5001
- IIS Express: For Visual Studio users
SessionizeCfpViewer/
βββ Components/
β βββ Pages/
β β βββ Home.razor # Main listing page
β β βββ SessionDetail.razor # Detailed conference view
β β βββ Error.razor # Error handling page
β βββ Layout/
β β βββ MainLayout.razor # Application layout
β β βββ NavMenu.razor # Navigation menu
β βββ App.razor # Root component
βββ Models/
β βββ CfpSession.cs # API response model
β βββ CfpSessionFlat.cs # Flattened data model
βββ Services/
β βββ SessionizeApiService.cs # API integration
β βββ CfpDataService.cs # Data management & caching
β βββ AppState.cs # Application state
βββ wwwroot/ # Static assets
βββ appsettings.json # Configuration
βββ Program.cs # Application entry point
The application uses an AppState service to cache API responses, reducing unnecessary API calls. Data is refreshed:
- On first load
- When clicking "Refresh from API"
- The cache persists during the application session
The search functionality uses a 300ms debounce to avoid excessive filtering while typing. It searches across:
- Conference names
- Location (city, state, country)
- Topics
- Tags
- Categories
- Session formats
The application uses Bootstrap 5 and is fully responsive:
- Cards adjust from 1 column (mobile) to 2 (tablet) to 3 (desktop)
- Navigation collapses on mobile
- Forms stack vertically on small screens
Error: API_TOKEN is not configured
Solution: Ensure your API token is set in appsettings.json or user secrets:
dotnet user-secrets set "API_TOKEN" "your-token"- Check that your API token is valid
- Click "Refresh from API" to fetch data
- Check browser console for errors (F12)
- Verify internet connectivity
-
Ensure you have .NET 10 SDK or later installed:
dotnet --version
-
Clean and rebuild:
dotnet clean dotnet restore dotnet build
- New Pages: Add
.razorfiles toComponents/Pages/ - New Services: Add classes to
Services/and register inProgram.cs - New Models: Add classes to
Models/
dotnet run --environment DevelopmentThis enables:
- Detailed error pages
- Hot reload for code changes
- Enhanced logging
-
Publish the application:
dotnet publish -c Release -o ./publish
-
Deploy to a web server (IIS, Azure, etc.)
- An Azure account with an active subscription
- An Azure App Service (Web App) created in the Azure Portal
- Your Sessionize API token
This project includes a GitHub Action workflow that automatically deploys to Azure App Service when you push to the main branch.
Setup Steps:
-
Create an Azure App Service:
- Go to Azure Portal
- Create a new Web App
- Choose ".NET 10" as the runtime stack
- Select your preferred region and pricing tier
- Ensure SCM Basic Auth Publishing is enabled in Setting β Configuration
-
Get the Publish Profile:
- In Azure Portal, go to your App Service
- Click "Download publish profile" from the Overview page
- Save the
.PublishSettingsfile
-
Configure GitHub Secrets:
- Go to your GitHub repository
- Navigate to Settings β Secrets and variables β Actions
- Click "New repository secret" and add:
AZURE_WEBAPP_NAME: Your Azure App Service name (e.g.,sessionize-cfp-viewer)AZURE_WEBAPP_PUBLISH_PROFILE: Paste the entire contents of the.PublishSettingsfile
-
Configure App Service Settings:
- In Azure Portal, go to your App Service
- Navigate to Configuration β Application settings
- Add a new application setting:
- Name:
API_TOKEN - Value: Your Sessionize API token
- Name:
- Click "Save"
-
Deploy:
- Push your code to the
mainbranch - The GitHub Action will automatically build and deploy
- Monitor the deployment in the "Actions" tab of your GitHub repository
- Push your code to the
Manual Trigger:
You can also manually trigger the deployment:
- Go to Actions tab in GitHub
- Select "Deploy to Azure App Service"
- Click "Run workflow"
-
Install Azure CLI:
# Windows (using winget) winget install Microsoft.AzureCLI # macOS brew install azure-cli # Linux curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
-
Login to Azure:
az login
-
Create a Resource Group (if needed):
az group create --name SessionizeCfpViewerRG --location eastus
-
Create an App Service Plan:
az appservice plan create --name SessionizeCfpViewerPlan --resource-group SessionizeCfpViewerRG --sku B1 --is-linux
-
Create the Web App:
az webapp create --resource-group SessionizeCfpViewerRG --plan SessionizeCfpViewerPlan --name your-unique-app-name --runtime "DOTNETCORE:10.0" -
Configure the API Token:
az webapp config appsettings set --resource-group SessionizeCfpViewerRG --name your-unique-app-name --settings API_TOKEN="your-sessionize-api-token"
-
Publish and Deploy:
cd src/SessionizeCfpViewer dotnet publish -c Release -o ./publish cd publish zip -r ../deploy.zip . az webapp deployment source config-zip --resource-group SessionizeCfpViewerRG --name your-unique-app-name --src ../deploy.zip
- Right-click on the
SessionizeCfpViewerproject in Solution Explorer - Select "Publish"
- Choose "Azure" as the target
- Select "Azure App Service (Windows)" or "Azure App Service (Linux)"
- Sign in to your Azure account
- Select or create your App Service
- Click "Publish"
Note: Don't forget to configure the API_TOKEN application setting in Azure Portal after publishing.
After deployment:
- Navigate to your Azure App Service URL (e.g.,
https://your-app-name.azurewebsites.net) - The app should load and display the CFP viewer
- Click "Refresh from API" to verify the API token is configured correctly
- Check Azure Portal β App Service β Log stream for any errors
App won't start:
- Check Application Insights or Log stream in Azure Portal
- Verify the
API_TOKENis set in Application Settings - Ensure the correct .NET runtime is selected
API errors:
- Verify your Sessionize API token is valid
- Check that the
API_TOKENapplication setting matches your token exactly
GitHub Action fails:
- Verify all secrets are set correctly in GitHub
- Check that the publish profile hasn't expired
- Review the Action logs for specific error messages
## Technologies Used
- **.NET 10: Core framework
- **Blazor Server**: Interactive web UI
- **Bootstrap 5**: Responsive styling
- **Bootstrap Icons**: Icon set
- **Sessionize API**: CFP data source
## Contributing
1. Fork the repository
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
3. Commit your changes (`git commit -m 'Add amazing feature'`)
4. Push to the branch (`git push origin feature/amazing-feature`)
5. Open a Pull Request
## License
This project is licensed under the terms specified in the LICENSE.txt file.
## Support
For issues, questions, or contributions, please open an issue on GitHub.
## Acknowledgments
- [Sessionize](https://sessionize.com) for providing the CFP API
- The .NET and Blazor communities
---
**Happy CFP hunting! π€β¨**
