Skip to content

Vyuh Framework

Modular Flutter Applications

The core framework for building modular Flutter applications with Features and Plugins as the primary building blocks. Seamless, optional CMS integration for content-driven experiences.

Why Vyuh Framework?

Feature Modules

Compose your app from independent feature modules. Each feature encapsulates routes, content types, and business logic.

Plugin Architecture

Extend functionality with plugins for analytics, authentication, networking, storage, and more.

Optional CMS Integration

First-class support for headless CMS platforms like Sanity. Opt-in for content-driven experiences.

Modular Architecture

Build scalable apps with a clean separation of concerns. Features and Plugins are the core building blocks.

Getting Started

Core Concepts

Building Blocks

ComponentPurpose
FeaturesModular app composition
PluginsExtend with capabilities
Content TypesCMS content rendering
ActionsHandle user interactions
ConditionsDynamic content visibility

Patterns & Examples

Quick Example

dart
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:vyuh_core/vyuh_core.dart' as vc;
import 'package:vyuh_extension_content/vyuh_extension_content.dart';
import 'package:vyuh_feature_system/vyuh_feature_system.dart' as system;
import 'package:vyuh_plugin_content_provider_sanity/vyuh_plugin_content_provider_sanity.dart';

// Define a feature module
final feature = FeatureDescriptor(
  name: 'blog',
  title: 'Blog Feature',
  description: 'A blog feature with posts and categories',
  icon: Icons.article,
  init: () async {
    // Register feature dependencies
    vyuh.di.register(BlogApi(vyuh.content.provider));
  },
  extensions: [
    ContentExtensionDescriptor(
      contentBuilders: [
        BlogPost.contentBuilder,
        BlogCategory.contentBuilder,
      ],
    ),
  ],
  routes: () => [
    GoRoute(path: '/blog', pageBuilder: defaultRoutePageBuilder),
    GoRoute(path: '/blog/:slug', pageBuilder: defaultRoutePageBuilder),
  ],
);

// Bootstrap the app with features and plugins
void main() async {
  vc.runApp(
    initialLocation: '/blog',
    features: () => [
      system.feature,
      feature,
    ],
    plugins: PluginDescriptor(
      content: DefaultContentPlugin(
        provider: SanityContentProvider.withConfig(
          config: SanityConfig(
            projectId: 'your-project-id',
            dataset: 'production',
          ),
        ),
      ),
      env: vc.DefaultEnvPlugin(),
    ),
  );
}