A professional desktop application for managing Firebase Cloud Messaging (FCM) push notifications, built with Flutter for Windows and macOS platforms.
Download the pre-built application for your platform and start using it immediately. No installation or build process required!
| Platform | Download | Requirements |
|---|---|---|
| Windows | Windows 10+ (64-bit) | |
| macOS | macOS 10.15+ |
- Download the ZIP file
- Extract the contents to your desired location
- Run
FirebaseConsole.exe - If you see a SmartScreen warning, click "More info" β "Run anyway"
- Download the ZIP file
- Extract the contents
- Right-click on
FirebaseConsole.appand select "Open" - Click "Open" in the security dialog (Gatekeeper)
- The app is now trusted and can be opened normally
- Overview
- Features
- Technology Stack
- Prerequisites
- Installation
- Building and Running
- Project Structure
- User Guide
- Development Guidelines
- License
FCM Console App is a powerful admin tool designed to simplify the process of sending Firebase push notifications. Unlike client-side applications that receive notifications, this desktop application acts as an administrative console for sending messages to specific devices, topics, or user groups.
The application supports multiple Firebase projects through profile management, integrates with Supabase for device token management, and provides a comprehensive history of all sent notifications. It uses Firebase Cloud Messaging HTTP v1 API for secure and reliable message delivery.
- Support for multiple Firebase projects via Service Account profiles
- Easy switching between different project contexts
- Secure local storage of Service Account credentials
- Automatic context reset when switching profiles
- Dynamic configuration for each profile
- Fetch device tokens from remote Supabase tables
- Secure credential storage using
flutter_secure_storage - Real-time token synchronization
- Single Device Mode: Send notifications to specific device tokens
- Multi-Device Mode: Send to multiple selected devices at once
- Topic Mode: Broadcast to topic-based subscriber groups
- Rich notification payload including:
- Title and body text
- Image URL support
- Custom key-value data pairs
- Complete local history of all sent notifications
- Persistent storage using SQLite database
- Search and filter capabilities
- Detailed tracking including timestamp, targets, and status
- Clean, responsive Material Design 3 interface
- Adaptive layouts for various screen sizes
- Real-time status indicators
- Intuitive workflow navigation
- Flutter 3.10.7+: Cross-platform UI framework
- Dart 3.10.7+: Programming language
- Riverpod 2.4.9: Reactive state management and dependency injection
- googleapis_auth 1.6.0: Google API authentication using Service Accounts
- http 1.2.0: HTTP client for API communication
- sqflite_common_ffi 2.3.2: SQLite database for local data persistence
- flutter_secure_storage 9.0.0: Secure storage for sensitive credentials
- path_provider 2.1.2: File system path access
- supabase_flutter 2.3.4: Supabase client for token management
- file_selector 1.0.3: Native file picker for Service Account JSON files
- logger 2.0.2+1: Advanced logging capabilities
- json_annotation 4.8.1: JSON serialization annotations
- build_runner 2.4.8: Code generation
- json_serializable 6.7.1: JSON serialization code generation
- flutter_lints 6.0.0: Static analysis and linting
Before you begin, ensure you have the following installed:
- Windows 10 or later (64-bit)
- Flutter SDK 3.10.7 or higher: Download here
- Visual Studio 2022 (with "Desktop development with C++" workload)
- Git: Download here
- macOS 10.15 (Catalina) or later
- Xcode 14.0 or higher: Install from Mac App Store
- Flutter SDK 3.10.7 or higher: Download here
- CocoaPods: Install via
sudo gem install cocoapods - Git: Included with Xcode Command Line Tools
- Firebase project with Service Account JSON file
- Supabase project (optional, for token management)
- Internet connection for API calls
git clone https://github.com/az-coder-123/fcm-console-app.git
cd fcm-console-appflutter pub getflutter pub run build_runner build --delete-conflicting-outputsflutter doctorEnsure all required dependencies are installed and marked with β.
Run directly from VS Code or terminal:
flutter run -d windowsOr run in debug mode with hot reload:
flutter run -d windows --debugBuild the release executable:
flutter build windows --releaseThe executable will be located at:
build/windows/x64/runner/Release/fcmapp.exe
Run the release build:
./build/windows/x64/runner/Release/fcmapp.exeRun directly from VS Code or terminal:
flutter run -d macosOr run in debug mode with hot reload:
flutter run -d macos --debugBuild the release application:
flutter build macos --releaseThe application bundle will be located at:
build/macos/Build/Products/Release/fcmapp.app
Run the release build:
open build/macos/Build/Products/Release/fcmapp.appProfile mode for performance analysis:
flutter build windows --profile
# or
flutter build macos --profileSplit debug info for release builds (reduces app size):
flutter build windows --release --split-debug-info=./build/windows/x64/runner/Release/symbolsfcm-console-app/
βββ android/ # Android platform files
βββ ios/ # iOS platform files
βββ linux/ # Linux platform files
βββ macos/ # macOS platform files
βββ windows/ # Windows platform files
βββ web/ # Web platform files
βββ lib/ # Main application source code
β βββ main.dart # Application entry point
β βββ components/ # Reusable UI components
β β βββ data_pairs_editor.dart # Key-value data editor
β β βββ display_utils.dart # UI display utilities
β β βββ notification_composer.dart # Notification composition UI
β β βββ notification_form_fields.dart # Form field components
β β βββ notification_history.dart # History list component
β β βββ notification_send_helper.dart # Send button helpers
β β βββ page_header.dart # Page header widget
β β βββ profile_required_banner.dart # Profile requirement indicator
β β βββ profile_selector.dart # Profile dropdown
β β βββ supabase_config.dart # Supabase configuration UI
β β βββ token_list.dart # Device token list
β β βββ token_selection_section.dart # Token selection UI
β β βββ notification_history/ # History sub-components
β β βββ supabase_config/ # Supabase config sub-components
β βββ core/ # Core utilities and constants
β β βββ constants.dart # Application-wide constants
β βββ features/ # Feature modules
β β βββ auth/ # Authentication logic
β β βββ dashboard/ # Dashboard feature
β β βββ settings/ # Settings feature
β βββ models/ # Data models
β β βββ device_token.dart # Device token model
β β βββ notification_history.dart # Notification history model
β β βββ service_account.dart # Service account model
β βββ providers/ # Riverpod state providers
β β βββ notification_form_state.dart # Notification form state
β β βββ providers.dart # Provider declarations
β βββ repositories/ # Data repository layer
β βββ screens/ # Screen widgets
β β βββ dashboard_screen.dart # Main dashboard screen
β βββ services/ # Business logic services
β βββ database_service.dart # Database operations
β βββ fcm_service.dart # FCM API integration
β βββ storage_service.dart # Secure storage operations
β βββ supabase_service.dart # Supabase integration
βββ docs/ # Documentation
β βββ APP_SPEC.md # Application specifications
β βββ ... # Other documentation files
βββ screenshots/ # Application screenshots
βββ test/ # Test files
βββ analysis_options.yaml # Dart analyzer configuration
βββ pubspec.yaml # Dependencies and metadata
βββ README.md # This file
βββ AGENTS.md # AI agent development guidelines
This section provides step-by-step instructions for using the FCM Console App, illustrated with screenshots.
When you first launch the application, you'll need to add a Firebase Service Account profile.
Steps:
- Click the "Add Profile" button on the dashboard
- Select your Firebase Service Account JSON file using the file picker
- The application will parse and validate the Service Account
- Your new profile will be saved locally and displayed in the profile selector
After adding profiles, you can view and manage them from the profiles screen.
Features:
- View all configured Service Account profiles
- Switch between different profiles
- Delete unused profiles
- Each profile maintains its own Supabase configuration and notification history
For each profile, you can configure a Supabase connection to fetch device tokens.
Initial State (Empty Configuration):
Configured State:
Steps:
- Select your profile from the dropdown
- Enter your Supabase URL (e.g.,
https://your-project.supabase.co) - Enter your Supabase Anon Key or Service Role Key
- Click "Save Configuration" to store credentials securely
- The status indicator will show "Connected" when configuration is successful
Note: Credentials are stored using flutter_secure_storage for maximum security.
Once you have configured a profile and Supabase connection, you can send notifications.
Steps:
-
Select Target Mode:
- Device Tokens: Fetch and select specific device tokens from Supabase
- Topic: Enter a topic name (e.g., "news", "updates")
-
Compose Notification:
- Enter the notification title
- Enter the notification body text
- Optionally add an image URL
- Add custom key-value data pairs if needed
-
Send Notification:
- Click the "Send Notification" button
- The application will authenticate with Firebase using the Service Account
- The notification will be sent via FCM HTTP v1 API
- Status updates will be displayed in real-time
Features:
- Multi-select device tokens
- Real-time validation
- Error handling and user feedback
- Automatic history logging
All sent notifications are automatically logged for future reference.
Features:
- View complete history of sent notifications
- Each entry includes:
- Timestamp
- Notification title and body
- Target (device tokens or topic)
- Delivery status
- Search and filter functionality
- Delete individual history entries
This project follows strict development guidelines to maintain code quality and consistency. Please refer to the AGENTS.md file for detailed guidelines:
- Clean Code: Write clear, maintainable code following SOLID principles
- Single Responsibility: Each file, class, and function should have one clear purpose
- State Management: Use Riverpod for all state management needs
- No Deprecated Code: Avoid deprecated libraries and methods
- Responsive Design: Build adaptive UIs for various screen sizes
- Run
flutter analyzeafter completing any task - Ensure no compilation or analysis errors
- Write tests for critical functionality
- Document complex logic with clear comments
- All documentation must be in English
- Follow professional documentation standards
- Keep README and documentation files up to date
Contributions are welcome! Please follow these steps:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
Please ensure your code adheres to the project's coding standards and passes all lint checks.
This project is licensed under the MIT License - see the LICENSE file for details.
- Firebase Team for the excellent FCM service
- Supabase Team for the powerful backend-as-a-service platform
- Flutter Team for the amazing cross-platform framework
- Riverpod community for the reactive state management solution
For issues, questions, or suggestions, please open an issue on the GitHub repository.
Built with β€οΈ using Flutter





