The Ultimate Flutter Development Workbench with Built-in Developer Cockpit
HyperFrame is a blazing-fast Flutter development environment that runs mobile apps as native desktop apps with device frame simulation. Say goodbye to slow emulators and hello to instant hot reloads plus a powerful runtime debugging suite!
Traditional mobile development requires running heavy emulators that consume massive CPU resources and drain your battery. HyperFrame changes everything - and includes HyperConsole, your built-in developer cockpit for runtime debugging.
| Feature | Traditional Emulator | HyperFrame + HyperConsole |
|---|---|---|
| Speed | Slow startup (30s+) | Instant (< 5s) β‘οΈ |
| CPU Usage | 40-60% constant load | < 10% π |
| Hot Reload | 2-5 seconds | < 1 second π₯ |
| API Testing | Need Postman | Built-in Network Tab π |
| Cache Debug | Manual logging | Live Cache Inspector πΎ |
| Navigation Debug | Manual tracking | Browser-like History π§ |
| Battery Impact | Drains rapidly | Minimal usage π± |
| Multi-Device | One at a time | Switch instantly π± |
- β‘οΈ Native Performance - 10x faster than Android Emulator
- π± Multi-Device Simulation - iPhone, Pixel, iPad in one click
- π Battery Saver - No heavy virtualization
- π¨ Instant Theme Testing - Toggle dark/light mode instantly
- π Responsive Layout Validation - Test different screen sizes live
- π Developer Experience - Hot reload in milliseconds
One tap. Five powerful tools. Zero external dependencies.
- π Network Tester - Full REST client with mock data generation
- πΎ Cache Inspector - View, search, and clear app cache in real-time
- π¨ Theme & Device Tab - Instant theme preview + device information
- π§ Router Manager - Browser-like navigation with history & favorites β
- π Live Logger - Real-time filtered logs with search
π Full HyperConsole Documentation β
- π Clean Architecture - Feature-first structure
- π Riverpod State Management - Type-safe, reactive state
- π§ GoRouter Navigation - Declarative routing with deep linking
- π Cross-Platform Desktop - Works on macOS, Windows, Linux
- π― Zero Configuration - Just clone and run
- Flutter 3.10+ installed
- macOS 10.14+ (or Windows 10+ / Linux Ubuntu 20.04+)
- Xcode Command Line Tools (macOS only)
# 1. Clone the repository
git clone https://github.com/aeTunga/HyperFrame.git
cd HyperFrame
# 2. Get dependencies
flutter pub get
# 3. Generate Riverpod code (REQUIRED - run after every git pull!)
dart run build_runner build --delete-conflicting-outputs
# 4. Run on macOS (or your desktop platform)
flutter run -d macosAfter the app launches, look for the blue floating button in the bottom-left corner.
- Tap β Opens HyperConsole with 5 debug tabs
- Long Press + Drag β Repositions the button
Test APIs without leaving your app. Full REST client with request history.
// Test your backend instantly
GET https://api.example.com/users/123
POST https://api.example.com/auth/loginFeatures: Live API testing, request history, mock user generation, custom headers, formatted JSON responses.
View and manipulate local storage in real-time. Debug persistence issues instantly.
// See all cached data
theme_mode β "dark"
user_token β "eyJhbGc..."
onboarding_complete β trueFeatures: View all cache, search filter, individual/bulk clear, type display, live updates.
Switch between light/dark/system themes without rebuilding. View device specs.
Features: Live theme switching, device information, safe area display, brightness control, real-time updates.
Browser-like navigation debugging with history, favorites, and manual route testing.
// Navigate to any route
/user/123?edit=true
/admin/dashboard
// Features: Back/Forward, History (last 20), Favorites (persistent)Features: Current route display, manual navigation, back/forward buttons, history (last 20), favorites, quick access chips.
Real-time application logs with filtering. Copy logs for bug reports.
Features: Live log stream, log levels (Info/Warning/Error), search filter, auto-scroll, copy logs, clear logs.
π Full HyperConsole Documentation β
Want to test on a different device? It's incredibly simple:
- Use the Toolbar - Click the device selector in the top toolbar (when app is running)
- Or Edit Code - Open
lib/main.dartand uncomment your desired device:
// Line ~45 in lib/main.dart
defaultDevice: Devices.ios.iPhone16ProMax, // Current (iPhone)
// defaultDevice: Devices.android.pixel6, // Uncomment for Pixel 6
// defaultDevice: Devices.ios.iPad12InchGen4, // Uncomment for iPad
// defaultDevice: Devices.android.samsungGalaxyS20, // Uncomment for SamsungAvailable Devices:
- iOS: iPhone SE, 13 Mini, 13, 13 Pro Max, 16 Pro Max, iPad Pro 11", iPad 12.9"
- Android: Pixel 4/5/6, Samsung Galaxy S20/Note20/A50, OnePlus 8 Pro
import 'package:hyperframe/core/network/network_manager.dart';
import 'package:hyperframe/core/network/http_method.dart';
final networkManager = NetworkManager();
// Type-safe GET request
final response = await networkManager.request<User>(
'/users/123',
method: HttpMethod.get,
parser: (json) => User.fromJson(json),
);
// Handle result
response.when(
success: (user) => print('Welcome ${user.name}!'),
failure: (error) => print('Error: ${error.message}'),
);
// POST with body
final createResponse = await networkManager.request<User>(
'/users',
method: HttpMethod.post,
data: {'name': 'John', 'email': 'john@example.com'},
parser: (json) => User.fromJson(json),
);import 'package:hyperframe/core/caching/cache_manager.dart';
import 'package:hyperframe/core/constants/cache_keys.dart';
final cacheManager = CacheManager();
// Store primitives
await cacheManager.setString(CacheKeys.userToken, 'abc123');
await cacheManager.setInt('user_id', 42);
await cacheManager.setBool('onboarding_complete', true);
// Store JSON objects
await cacheManager.setJson('user_profile', user.toJson());
// Retrieve data
final token = await cacheManager.getString(CacheKeys.userToken);
final profile = await cacheManager.getJson('user_profile');
// Check & remove
if (await cacheManager.containsKey(CacheKeys.userToken)) {
await cacheManager.remove(CacheKeys.userToken);
}
// Clear all (use with caution!)
await cacheManager.clear();import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'my_controller.g.dart';
// Auto-generated provider with code generation
@riverpod
class Counter extends _$Counter {
@override
int build() => 0;
void increment() => state++;
void decrement() => state--;
}
// In your widget
class MyWidget extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final count = ref.watch(counterProvider);
return Text('Count: $count');
}
}import 'package:hyperframe/core/init/log_helper.dart';
class MyService {
Future<void> fetchData() async {
LogHelper.info('Starting data fetch...');
try {
final data = await api.getData();
LogHelper.info('Fetched ${data.length} items');
} catch (e, stackTrace) {
LogHelper.error('Fetch failed', error: e, stackTrace: stackTrace);
}
}
}hyperframe/
βββ lib/
β βββ main.dart # Smart runner with platform detection
β βββ app.dart # MaterialApp with routing
β βββ core/
β β βββ console/ # π HyperConsole Developer Cockpit
β β β βββ widgets/
β β β β βββ tabs/
β β β β β βββ network_tester_tab.dart
β β β β β βββ cache_viewer_tab.dart
β β β β β βββ device_theme_tab.dart
β β β β β βββ router_tab.dart # β Browser-like navigation
β β β β β βββ logger_tab.dart
β β β β βββ hyper_console_button.dart # Floating access button
β β β β βββ hyper_console_sheet.dart # Bottom sheet container
β β β βββ models/
β β βββ router/ # π GoRouter navigation
β β β βββ app_router.dart # Declarative routing
β β βββ network/ # π NetworkManager + Dio
β β β βββ interceptors/ # Error & logging interceptors
β β β βββ exceptions/ # Network exceptions
β β β βββ network_manager.dart # Type-safe HTTP client
β β βββ caching/ # π CacheManager
β β β βββ cache_manager.dart # Persistent local storage
β β βββ theme/
β β β βββ app_theme.dart # Material 3 themes
β β β βββ theme_provider.dart # Theme state management
β β βββ init/ # π App initialization
β β β βββ app_initializer.dart # Service bootstrapping
β β β βββ log_helper.dart # Logging utilities
β β βββ constants/ # π App constants
β β βββ extensions/ # π Dart extensions
β β βββ utils/ # π Platform utilities
β βββ features/ # π Feature-first structure
β β βββ home/
β β β βββ presentation/
β β β βββ home_controller.dart # Riverpod controller
β β β βββ home_view.dart # UI
β β β βββ widgets/ # Feature widgets
β β βββ splash/
β β βββ presentation/
β βββ shared/ # π Shared widgets
β βββ widgets/
β βββ device_info_card.dart
β βββ responsive_grid.dart
βββ docs/ # π Documentation
β βββ HYPERCONSOLE.md # Full console docs
βββ test/ # π Unit tests
β βββ core/caching/
β βββ cache_manager_test.dart
βββ macos/ # Desktop configurations
βββ ios/
βββ android/
βββ pubspec.yaml
import 'package:hyperframe/core/utils/platform_utils.dart';
final bool enableSimulator = PlatformUtils.shouldEnableSimulation;
if (enableSimulator) {
// Desktop debug: DevicePreview + Riverpod + HyperConsole
runApp(ProviderScope(
child: DevicePreview(
enabled: true,
builder: (context) => const MyApp(),
),
));
} else {
// Mobile/Release: Standard Flutter app
runApp(const ProviderScope(child: MyApp()));
}HyperConsole's floating button is injected through GoRouter's ShellRoute, ensuring it has Navigator access:
// lib/core/router/app_router.dart
GoRouter(
navigatorKey: rootNavigatorKey,
routes: [
ShellRoute(
builder: (context, state, child) {
if (kDebugMode) {
return Stack(
children: [
child,
const HyperConsoleButton(), // Injected on all pages
],
);
}
return child;
},
routes: [/* all app routes */],
),
],
)Uses Riverpod with code generation for type-safe, reactive state:
@riverpod
class Counter extends _$Counter {
@override
int build() => 0;
void increment() => state++;
}
// Auto-generates: counterProviderdependencies:
flutter_riverpod: ^3.0.3 # State management
riverpod_annotation: ^3.0.3 # Code generation
go_router: ^17.0.0 # Declarative navigation
dio: ^5.9.0 # HTTP client
shared_preferences: ^2.5.3 # Persistent storage
logger: ^2.6.2 # Logging
google_fonts: ^6.1.0 # Typography
device_preview: ^1.3.1 # Device simulation
equatable: ^2.0.7 # Value equality
dev_dependencies:
riverpod_generator: ^3.0.3 # Provider code generation
build_runner: ^2.10.4 # Code generation runner
mockito: ^5.4.4 # Testing mocks
http_mock_adapter: ^0.6.1 # Network testingRun the included tests to verify HyperFrame functionality:
# Run all tests
flutter test
# Run specific test suite
flutter test test/core/caching/cache_manager_test.dart
# Run tests with coverage
flutter test --coverage
# Run tests in watch mode (re-run on changes)
flutter test --watchIncluded Tests:
- β CacheManager persistence tests
- β NetworkManager mock tests
- β Widget tests for key components
- β Theme switching tests
| Platform | Status | Notes |
|---|---|---|
| macOS | β Fully Supported | Primary development platform |
| Windows | β Supported | Requires Flutter desktop enabled |
| Linux | β Supported | Requires Flutter desktop enabled |
| iOS | No simulation (use real device/simulator) | |
| Android | No simulation (use real device/emulator) | |
| Web | π§ Experimental | DevicePreview works, some features limited |
Solution: Ensure you're running in debug mode on a desktop platform:
flutter run -d macos --debugSolution: The button only appears in debug mode on desktop:
- Verify you're running
flutter run -d macos(not release mode) - The button is at the bottom-left corner
- Hot restart with
Rif needed
Solution: Clean and rebuild generated files:
flutter clean
flutter pub get
dart run build_runner build --delete-conflicting-outputsSolution: This should be fixed with ShellRoute architecture. If you still see errors:
- Ensure you've run build_runner (step above)
- Hot restart the app with
R - Check that you're on the latest code
Solution: Clear Flutter cache and rebuild:
flutter clean
flutter pub get
flutter run -d macosSolution: This shouldn't happen with HyperFrame! If it does:
- Verify you're running on desktop (not mobile emulator)
- Check Activity Monitor for other resource-heavy processes
- Restart the app with
R(hot restart)
Contributions are welcome! Here's how you can help:
- 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
- Follow Flutter best practices and linting rules
- Maintain Material 3 design consistency
- Add tests for new features
- Update documentation (especially HYPERCONSOLE.md)
- Run
flutter analyzebefore committing - Use Riverpod with code generation for new state
- π New HyperConsole tabs (GraphQL tester, performance monitor, etc.)
- π¨ Theme customization options
- π Internationalization support
- π± More device presets
- π§ͺ Additional tests and coverage
- π Documentation improvements
environment:
sdk: ^3.10.3- macOS: 10.14+ (Mojave or later)
- Windows: 10+ (with Flutter desktop enabled)
- Linux: Ubuntu 20.04+ (with Flutter desktop enabled)
- Memory: 4GB RAM minimum, 8GB recommended
- Storage: 2GB free space for Flutter + dependencies
- Use HyperConsole for everything - Stop switching to external tools
- Favorite your routes - Star frequently used routes in Router tab
- Test APIs in-app - Use Network tab instead of Postman
- Monitor cache - Check Cache tab when debugging persistence
- Live logging - Keep Logger tab open during development
rin terminal β Hot reload (< 1 second)Rin terminal β Hot restart (resets state)qin terminal β Quit apphin terminal β Show all shortcuts
- Network Tab: Generate mock users for quick API testing
- Cache Tab: Search feature is your friend for large datasets
- Router Tab: Use back/forward like a browser to debug navigation
- Logger Tab: Filter by error level to focus on issues
- Button: Drag it anywhere - position persists during session
HyperConsole is completely stripped from release builds:
# HyperConsole will NOT be included
flutter build apk --release
flutter build ios --release
flutter build macos --releaseZero overhead. Zero bloat. Just your production app.
MIT License
Copyright (c) 2025 HyperFrame
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
If HyperFrame + HyperConsole saves you time and battery life, give it a star! It helps others discover this tool.
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- HyperConsole Docs: docs/HYPERCONSOLE.md
Built with β€οΈ for the Flutter community
Stop burning your CPU. Start building with HyperConsole.
π HyperFrame: Where performance meets productivity.





